userBuy.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package service
  2. import (
  3. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/entity"
  4. IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
  5. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
  6. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/util"
  7. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/warn"
  8. "app.yhyue.com/moapp/jy_docs/services/model"
  9. "app.yhyue.com/moapp/jy_docs/services/partner"
  10. "app.yhyue.com/moapp/jybase/common"
  11. "app.yhyue.com/moapp/jybase/date"
  12. "encoding/json"
  13. "fmt"
  14. "net/url"
  15. "strings"
  16. "time"
  17. )
  18. type BRes struct {
  19. Msg string
  20. Code int64
  21. OrderNo string
  22. }
  23. //
  24. //func UBHandle(in *partnerlib.UserBuyVipRequest) (res *partnerlib.UBVRes, err error) {
  25. // res = new(partnerlib.UBVRes)
  26. // var (
  27. // b []byte
  28. // docInfo = partner.DocsFindOne(in.DocId)
  29. // userId = in.PositionId
  30. // id = strings.ReplaceAll(in.DocId, fmt.Sprintf("%s-", entity.PartnerName), "")
  31. // )
  32. // //测试账号
  33. // if IC.I.Docin.TestAccount > 0 {
  34. // userId = IC.I.Docin.TestAccount
  35. // }
  36. // if docInfo.Id != "" {
  37. // orderCode := util.GetOrderCode()
  38. // h := NewHH(IC.I.Docin.Name, IC.I.Docin.Host, IC.I.Docin.BuyRecord.Name, IC.I.Docin.BuyRecord.Pathname, IC.I.Docin.BuyRecord.Method, map[string]interface{}{
  39. // "orderNo": orderCode,
  40. // "productId": id,
  41. // "userId": userId,
  42. // "price": docInfo.Price,
  43. // "priceVip": docInfo.PriceVip,
  44. // "type": in.Type,
  45. // "orderTime": date.NowFormat(entity.DateFullLayout),
  46. // })
  47. // b, err, _ = h.HttpFunc()
  48. // go h.SaveDocinLogger(b, err, "req")
  49. // if err == nil {
  50. // //豆丁同步数据到mongo
  51. // go h.SaveDocinLogger(b, err, "res")
  52. // bRes := &BRes{}
  53. // if err = json.Unmarshal(b, &bRes); err == nil {
  54. // if bRes.Code == 0 {
  55. // //更新文档购买记录
  56. // if err = partner.InsertBuyDocOrder(&model.DocinUserOrder{
  57. // PositionId: in.PositionId,
  58. // MgoUserId: in.MgoUserId,
  59. // Phone: in.Phone,
  60. // DocId: docInfo.Id,
  61. // OrderCode: orderCode,
  62. // Price: docInfo.Price,
  63. // PriceVip: docInfo.PriceVip,
  64. // PurchaseType: int(in.Type), //购买类型:1 币买文档,2 券买文档,3 月大会员,4 季大会员,5 年大会员
  65. // State: 1, //合作商:1:豆丁
  66. // CreateDate: date.NowFormat(date.Date_Full_Layout),
  67. // }); err == nil {
  68. // warn.SendMsgByWXURL(fmt.Sprintf("%s文档名称: %s,文档id:%s,购买订单编号:%s,请求信息:%v", entity.PartnerName, docInfo.DocName, docInfo.Id, orderCode, in))
  69. // }
  70. // res.OrderNo = bRes.OrderNo
  71. // res.Msg = bRes.Msg
  72. // res.Code = bRes.Code
  73. // return
  74. // }
  75. // err = fmt.Errorf(entity.Res[res.Msg])
  76. // }
  77. // }
  78. // } else {
  79. // err = fmt.Errorf("参数异常")
  80. // }
  81. // res.Msg = err.Error()
  82. // res.Code = -1
  83. // return
  84. //}
  85. // 开通会员 + 购买精品文档
  86. func UBHandle(in *partnerlib.UserBuyVipRequest) (res *partnerlib.UBVRes, err error) {
  87. //in.Type 0:开通豆丁会员并购买文档,1 币买文档,2 券买文档,3 月大会员,4 季大会员,5 年大会员
  88. //in.Type ==0 判断文档是否是精品,如果文档是精品需要购买文档
  89. res = new(partnerlib.UBVRes)
  90. var (
  91. b []byte
  92. docInfo = partner.DocsFindOne(in.DocId)
  93. id = strings.ReplaceAll(in.DocId, fmt.Sprintf("%s-", entity.PartnerName), "")
  94. price = float64(docInfo.Price) / 10
  95. userId = common.If(IC.I.Docin.TestAccount > 0, IC.I.Docin.TestAccount, in.PositionId).(int64) //测试账号
  96. docType = in.Type
  97. params = &url.Values{
  98. "userId": []string{common.InterfaceToStr(userId)},
  99. "orderTime": []string{date.NowFormat(entity.DateFullLayout)},
  100. "type": []string{common.InterfaceToStr(docType)},
  101. }
  102. now = time.Now()
  103. cacheKey = fmt.Sprintf("docin_user_member_%d_%d", now.Day(), in.PositionId)
  104. nextStep bool
  105. resFunc = func(params url.Values, duo *model.DocinUserOrder) (msg string, err error) {
  106. h := NewHH(IC.I.Docin.Name, IC.I.Docin.Host, IC.I.Docin.BuyRecord.Name, IC.I.Docin.BuyRecord.Pathname, IC.I.Docin.BuyRecord.Method, params)
  107. b, err, _ = h.HttpFunc()
  108. go h.SaveDocinLogger(b, err, "req")
  109. if err == nil && len(b) > 0 {
  110. //豆丁同步数据到mongo
  111. go h.SaveDocinLogger(b, err, "res")
  112. bRes := &BRes{}
  113. err = json.Unmarshal(b, &bRes)
  114. if err == nil {
  115. if bRes.Code == 0 {
  116. //更新文档购买记录
  117. if err = partner.InsertBuyDocOrder(duo); err != nil {
  118. warn.SendMsgByWXURL(fmt.Sprintf("%s文档名称: %s,文档id:%s,购买订单编号:%s,请求信息:%v,异常信息:%s", entity.PartnerName, docInfo.DocName, docInfo.Id, params.Encode(), in, err.Error()))
  119. }
  120. msg = bRes.Msg
  121. return
  122. }
  123. err = fmt.Errorf(entity.Res[res.Msg])
  124. }
  125. }
  126. err = fmt.Errorf("接口请求异常")
  127. warn.SendMsgByWXURL(fmt.Sprintf("%s文档名称: %s,文档id:%s,购买会员编号:%s,请求信息:%v,异常信息:%s", entity.PartnerName, docInfo.DocName, docInfo.Id, params.Encode(), in, err.Error()))
  128. return
  129. }
  130. )
  131. switch in.Type {
  132. case 1: //1 币买文档
  133. params.Set("price", common.InterfaceToStr(price))
  134. params.Set("productId", in.DocId)
  135. nextStep = true
  136. case 2: //2 券买文档
  137. params.Set("price", common.InterfaceToStr(docInfo.PriceVip))
  138. params.Set("productId", in.DocId)
  139. nextStep = true
  140. case 0: //0:开通豆丁会员并购买文档
  141. //缓存获取 豆丁会员信息
  142. if dStr := partner.GetUserOrderInfo(entity.RedisCode, cacheKey); dStr == "" {
  143. //查库豆丁会员信息
  144. doi, err := partner.GetDocOrderInfo(in.PositionId, in.MgoUserId, 2)
  145. if err != nil { //查询异常
  146. res.Code = -1
  147. res.Msg = err.Error()
  148. return res, err
  149. }
  150. switch doi.State { //会员状态:-1:不可用;1:正常
  151. case 1: //不用再购买会员 并更新缓存
  152. docType = int64(doi.PurchaseType) //3 月大会员,4 季大会员,5 年大会员
  153. nextStep = true
  154. default: //查看剑鱼订单,如果剑鱼订单有购买文库会员记录,购买信息保存到doc_user_order表 并更新缓存
  155. jyDoi := partner.GetJYDocsOrderInfo(in.PositionId, in.MgoUserId)
  156. if jyDoi == nil || jyDoi.OrderCode == "" {
  157. res.Code = -1
  158. res.Msg = fmt.Sprintf("当前用户未购买文库会员")
  159. return res, fmt.Errorf(res.Msg)
  160. }
  161. var orderCode = util.GetOrderCode()
  162. //文库会员周期单位 同超级订阅单位:cycleunit(1:年 2:月 3:天 4:季)
  163. switch jyDoi.Filter.CycleUnit {
  164. case 1:
  165. docType = 5
  166. case 2:
  167. docType = 3
  168. case 4:
  169. docType = 4
  170. }
  171. //购买信息保存到doc_user_order表
  172. duo := &model.DocinUserOrder{
  173. PositionId: in.PositionId,
  174. MgoUserId: in.MgoUserId,
  175. Phone: in.Phone,
  176. DocId: docInfo.Id,
  177. JyOrderCode: jyDoi.OrderCode,
  178. OrderCode: orderCode,
  179. StartDate: jyDoi.StartDate,
  180. EndDate: jyDoi.EndDate,
  181. Price: docInfo.Price,
  182. PriceVip: docInfo.PriceVip,
  183. PurchaseType: int(docType), //购买类型:1 币买文档,2 券买文档,3 月大会员,4 季大会员,5 年大会员
  184. State: int(in.State), //合作商:1:豆丁
  185. CreateDate: date.NowFormat(date.Date_Full_Layout),
  186. UpdateDate: date.NowFormat(date.Date_Full_Layout),
  187. }
  188. params.Set("type", common.InterfaceToStr(docType))
  189. params.Set("orderNo", orderCode)
  190. if msg, err := resFunc(*params, duo); err == nil {
  191. res.Msg = msg
  192. nextStep = true
  193. } else {
  194. warn.SendMsgByWXURL(fmt.Sprintf("%s文档名称: %s,文档id:%s,购买会员编号:%s,请求信息:%v", entity.PartnerName, docInfo.DocName, docInfo.Id, params.Encode(), in))
  195. }
  196. }
  197. } else {
  198. nextStep = true
  199. }
  200. }
  201. if nextStep {
  202. //更新用户会员信息缓存
  203. partner.SetUserOrderInfo(entity.RedisCode, cacheKey, 24*60*60)
  204. //是否需要购买文档--精品
  205. if docInfo.ProductType == 2 {
  206. var orderCode = util.GetOrderCode()
  207. //购买信息保存到doc_user_order表
  208. duo := &model.DocinUserOrder{
  209. PositionId: in.PositionId,
  210. MgoUserId: in.MgoUserId,
  211. Phone: in.Phone,
  212. DocId: docInfo.Id,
  213. OrderCode: orderCode,
  214. StartDate: date.NowFormat(date.Date_Full_Layout),
  215. EndDate: date.NowFormat(date.Date_Full_Layout),
  216. Price: docInfo.Price,
  217. PriceVip: docInfo.PriceVip,
  218. PurchaseType: int(docType), //购买类型:1 币买文档,2 券买文档,3 月大会员,4 季大会员,5 年大会员
  219. State: int(in.State), //合作商:1:豆丁
  220. CreateDate: date.NowFormat(date.Date_Full_Layout),
  221. UpdateDate: date.NowFormat(date.Date_Full_Layout),
  222. }
  223. params.Set("type", "1")
  224. params.Set("orderNo", orderCode)
  225. params.Set("productId", id)
  226. if msg, err := resFunc(*params, duo); err == nil {
  227. res.OrderNo = orderCode
  228. res.Msg = msg
  229. return res, nil
  230. }
  231. }
  232. return
  233. }
  234. res.Msg = fmt.Sprintf("参数异常")
  235. res.Code = -1
  236. return
  237. }