userDoc.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package servers
  2. import (
  3. . "app.yhyue.com/moapp/jybase/api"
  4. "app.yhyue.com/moapp/jybase/common"
  5. "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
  6. "app.yhyue.com/moapp/jybase/go-xweb/xweb"
  7. "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
  8. "encoding/json"
  9. "errors"
  10. "fmt"
  11. "jy-docs/config"
  12. "jy-docs/public"
  13. "jy-docs/rpc"
  14. "log"
  15. "time"
  16. )
  17. type UserDoc struct {
  18. *xweb.Action
  19. userList xweb.Mapper `xweb:"/user/list"` //用户列表
  20. collectAdd xweb.Mapper `xweb:"/user/collect/add"` //收藏文库
  21. collectRemove xweb.Mapper `xweb:"/user/collect/remove"` //取消收藏
  22. docBuy xweb.Mapper `xweb:"/user/buy"` //文库购买
  23. }
  24. // 用户文库列表
  25. func (userDoc *UserDoc) UserList() {
  26. userId := common.ObjToString(userDoc.GetSession("userId"))
  27. rData, errMsg := func() (interface{}, error) {
  28. pageNumReq, _ := userDoc.GetInt("num")
  29. pageSizeReq, _ := userDoc.GetInt("size")
  30. sign, _ := userDoc.GetInt("sign") // 0兑换的 1收藏的 2回收站的
  31. pageNum, pageSize, _ := public.PageNumParse(pageNumReq, pageSizeReq, -1)
  32. if sign < 0 || sign > 2 {
  33. return nil, fmt.Errorf("请求参数异常")
  34. }
  35. collectList, total, err := rpc.GetUserDocs(userId, pageNum, pageSize, sign)
  36. if err != nil {
  37. return nil, err
  38. }
  39. return map[string]interface{}{
  40. "total": total,
  41. "list": collectList,
  42. }, nil
  43. }()
  44. if errMsg != nil {
  45. log.Printf("%s UserDoc collectList err:%s\n", userId, errMsg.Error())
  46. }
  47. userDoc.ServeJson(NewResult(rData, errMsg))
  48. }
  49. func (userDoc *UserDoc) CollectAdd() {
  50. userId := common.ObjToString(userDoc.GetSession("userId"))
  51. rData, errMsg := func() (interface{}, error) {
  52. docId := userDoc.GetString("docId")
  53. if docId == "" {
  54. return nil, fmt.Errorf("参数异常")
  55. }
  56. err := rpc.SetUserCollect(userId, docId)
  57. if err != nil {
  58. return nil, err
  59. }
  60. return "success", nil
  61. }()
  62. if errMsg != nil {
  63. log.Printf("%s UserDoc collectAdd err:%s\n", userId, errMsg.Error())
  64. }
  65. userDoc.ServeJson(NewResult(rData, errMsg))
  66. }
  67. func (userDoc *UserDoc) CollectRemove() {
  68. userId := common.ObjToString(userDoc.GetSession("userId"))
  69. rData, errMsg := func() (interface{}, error) {
  70. docId := userDoc.GetString("docId")
  71. if docId == "" {
  72. return nil, fmt.Errorf("参数异常")
  73. }
  74. err := rpc.DelUserCollect(userId, docId)
  75. if err != nil {
  76. return nil, err
  77. }
  78. return "success", nil
  79. }()
  80. if errMsg != nil {
  81. log.Printf("%s UserDoc collectRemove err:%s\n", userId, errMsg.Error())
  82. }
  83. userDoc.ServeJson(NewResult(rData, errMsg))
  84. }
  85. func (userDoc *UserDoc) DocBuy() {
  86. // 加用户锁
  87. userInfo := public.GetUserBaseInfo(userDoc.Session())
  88. userId := userInfo.UserId
  89. pLock := public.GetNewDocBuyLock(fmt.Sprintf("%s", userId))
  90. pLock.Lock()
  91. defer pLock.Unlock()
  92. rData, errMsg := func() (interface{}, error) {
  93. docId := userDoc.GetString("docId")
  94. phone := userDoc.GetString("phone")
  95. payType, _ := userDoc.GetInt("payType") // 0-正常下载 1-原价下载 2-使用一次免费下载机会(会员免费文档 留资)
  96. if docId == "" {
  97. return nil, fmt.Errorf("参数异常")
  98. }
  99. var userPoint, docPoint int64 = 0, 0
  100. var err error
  101. usePoint := true // 是否消耗剑鱼币 会员免费文档且当天100篇以内的或者使用免费下载机会的 不用扣积分
  102. useSLTimes := false // 使用留资机会的下载次数
  103. //查询文档所需积分及文档类型
  104. docInfo, isBuy, _, err := rpc.GetDocDetail(userId, docId, true)
  105. if err != nil {
  106. return nil, err
  107. }
  108. if isBuy {
  109. return nil, fmt.Errorf("已兑换,请勿重复操作")
  110. }
  111. // 获取用户身份
  112. docMember, err := getDocMemberStatus(userDoc.Session())
  113. if err != nil {
  114. return nil, err
  115. }
  116. docMemberStatus := docMember["docMemberStatus"].(bool)
  117. freeDownload := common.IntAll(docMember["free_download"])
  118. surplus, use := 0, 0 // 今日下载剩余次数,今日消耗次数
  119. payWay := "剑鱼币"
  120. if docMemberStatus {
  121. // 会员
  122. switch payType {
  123. case public.PayTypeNormal:
  124. if docInfo.ProductType == public.ProductTypeMemberFree {
  125. // 如果是会员免费 判断是否超出进入下载次数
  126. // 获取今日下载次数
  127. count, err2 := rpc.TodayCount(userId)
  128. if err2 != nil {
  129. return nil, err2
  130. }
  131. use = int(count)
  132. surplus = config.JyDocsAppConfig.DocMember.Times - use
  133. if surplus <= 0 {
  134. surplus = 0
  135. use = config.JyDocsAppConfig.DocMember.Times
  136. return map[string]interface{}{
  137. "status": public.StatusMemberFreeExhaust,
  138. "surplus": surplus,
  139. "use": use,
  140. }, nil
  141. }
  142. // 没有超过下载次数 下一步应该到转存 不用扣剑鱼币
  143. usePoint = false
  144. docPoint = docInfo.DocMemberPrice
  145. payWay = "会员免费特权"
  146. } else {
  147. // 精品文档
  148. docPoint = docInfo.DocMemberPrice // 会员价
  149. }
  150. case public.PayTypeFullPrice:
  151. docPoint = docInfo.Price
  152. default:
  153. return nil, errors.New("payType类型不匹配")
  154. }
  155. } else {
  156. switch payType {
  157. case public.PayTypeFreeSL:
  158. if freeDownload != public.FreeDownloadHasFreeTimes || docInfo.ProductType != public.ProductTypeMemberFree {
  159. return nil, fmt.Errorf("没有免费下载机会")
  160. }
  161. usePoint = false // 免费下载的不扣剑鱼币
  162. useSLTimes = true // 后边要处理该字段
  163. docPoint = 0
  164. payWay = "免费下载特权"
  165. case public.PayTypeFullPrice:
  166. docPoint = docInfo.Price // 原价下的
  167. default:
  168. return nil, errors.New("payType类型不匹配")
  169. }
  170. }
  171. var serialNumber string
  172. if usePoint { // 扣积分
  173. //查询用户剩余积分
  174. userPoint, err = rpc.GetUserPointValue(userId)
  175. if err != nil {
  176. return nil, err
  177. }
  178. //积分够调扣积分
  179. if userPoint < docPoint {
  180. return nil, fmt.Errorf("剩余积分不足")
  181. }
  182. bytes, err := json.Marshal(map[string]interface{}{
  183. "name": docInfo.DocName,
  184. "summary": docInfo.DocSummary,
  185. "img": docInfo.PreviewImgId,
  186. "fType": docInfo.DocFileType,
  187. })
  188. if err != nil {
  189. return nil, fmt.Errorf("文库异常")
  190. }
  191. serialNumber, err = rpc.SpendUserPoint(userId, docInfo.DocId, string(bytes), docPoint)
  192. if err != nil {
  193. return nil, err
  194. }
  195. }
  196. // 没有ossdocId 说明是还没有下过的 需要先获得地址
  197. if docInfo.OssDocId == "" && docInfo.Source == public.SourceDd {
  198. // 如果是精品 则需要先调购买接口
  199. if docInfo.ProductType == public.ProductTypePremium {
  200. _, err2 := rpc.PartUserBuy(docId, userInfo.MgoUserId, userInfo.Phone, userInfo.PositionId)
  201. if err2 != nil {
  202. return nil, fmt.Errorf("获取失败")
  203. }
  204. }
  205. // 如果是免费则直接调
  206. _, err := rpc.PartDocDownload(docId, userInfo.MgoUserId, userInfo.Phone, userInfo.PositionId)
  207. if err != nil {
  208. return nil, fmt.Errorf("获取失败")
  209. }
  210. }
  211. //转存文库
  212. err = rpc.PayDoc(userId, docId)
  213. if err != nil {
  214. return nil, err
  215. }
  216. if useSLTimes {
  217. public.Compatible.Update(userId, map[string]interface{}{
  218. "$set": M{
  219. "i_doc_free_download": 1,
  220. },
  221. })
  222. jy.ClearBigVipUserPower(fmt.Sprint(userInfo.PositionId))
  223. }
  224. //手机号采集
  225. go func() {
  226. if phone != "" {
  227. public.MQFW.Save("user_msg", map[string]interface{}{
  228. "s_userId": userId,
  229. "s_phone": phone,
  230. "i_phoneCheck": -1, //未验证
  231. "i_time": time.Now().Unix(),
  232. "s_source": "jydoc",
  233. })
  234. }
  235. rpc.DocStatistics(userId, docId, rpc.Down)
  236. }()
  237. return map[string]interface{}{
  238. "status": 0,
  239. "surplus": surplus,
  240. "use": use,
  241. "code": serialNumber,
  242. "balance": userPoint - docPoint,
  243. "payTime": time.Now().Unix(),
  244. "payWay": payWay,
  245. }, nil
  246. }()
  247. if errMsg != nil {
  248. log.Printf("%s UserDoc docBuy err:%s\n", userId, errMsg.Error())
  249. }
  250. userDoc.ServeJson(NewResult(rData, errMsg))
  251. }
  252. func getDocMemberStatus(session *httpsession.Session) (map[string]interface{}, error) {
  253. mData := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
  254. if mData != nil {
  255. vipStatus := mData.Data.Docs.Status
  256. return map[string]interface{}{
  257. "docMemberStatus": vipStatus > 0,
  258. "startTime": mData.Data.Docs.StartDate,
  259. "endTime": mData.Data.Docs.EndDate,
  260. "free_download": mData.Data.Docs.FreeDownload,
  261. }, nil
  262. }
  263. return nil, errors.New("获取文库会员状态失败")
  264. }