userDoc.go 8.5 KB

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