userBuy.go 8.8 KB

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