userDoc.go 8.8 KB

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