cdk.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. package service
  2. // Cdk 订单
  3. var Cdk = new(sCdk)
  4. type sCdk struct{}
  5. /*func (s *sCdk) List(ctx *gin.Context, req forms.CdkListReq) serializer.Response {
  6. type RedeemCode struct {
  7. model.RedeemCode
  8. Used int64 `json:"used"`
  9. }
  10. type RedeemReceived struct {
  11. Cid int64 `json:"cid"`
  12. Total int64 `json:"total"`
  13. }
  14. var (
  15. r = query.Use(config.DB).RedeemReceived
  16. count int64 = 0
  17. offset int64 = 0
  18. models forms.UserAccountListRes
  19. lists []*RedeemCode
  20. received []*RedeemReceived
  21. )
  22. models.Page = req.Page
  23. models.PerPage = req.PerPage
  24. redeemCodeQuery := config.DB.Table("redeem_code AS subquery").
  25. Select("subquery.id, subquery.sn, subquery.name, subquery.cdk, subquery.server_ids, subquery.type_id, subquery.openid, subquery.times, subquery.expired_at, subquery.award, subquery.date, subquery.operator, subquery.created_at, subquery.status").
  26. Joins("JOIN (SELECT sn, MIN(id) AS min_id FROM redeem_code GROUP BY sn) AS subquery_min ON subquery.sn = subquery_min.sn AND subquery.id = subquery_min.min_id").
  27. Order("subquery.created_at desc")
  28. if len(req.CreatedAt) == 2 {
  29. redeemCodeQuery.Where("subquery.created_at BETWEEN ? AND ?", req.CreatedAt[0], req.CreatedAt[1])
  30. }
  31. if req.Cdk != "" {
  32. redeemCodeQuery.Where("subquery.cdk = ?", req.Cdk)
  33. }
  34. if req.Sn != "" {
  35. redeemCodeQuery.Where("subquery.sn = ?", req.Sn)
  36. }
  37. if req.Name != "" {
  38. redeemCodeQuery.Where("subquery.name = ?", req.Name)
  39. }
  40. err := redeemCodeQuery.Count(&count).Error
  41. if err != nil {
  42. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  43. }
  44. if count == 0 {
  45. return serializer.Suc(models)
  46. }
  47. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  48. err = redeemCodeQuery.Limit(int(req.PerPage)).Offset(int(offset)).Find(&lists).Error
  49. if err != nil {
  50. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  51. }
  52. // code id slice
  53. codeIds := make([]int64, len(lists))
  54. for i, v := range lists {
  55. codeIds[i] = v.ID
  56. }
  57. err = r.WithContext(ctx).Select(r.Cid, r.ID.Count().As("total")).Where(r.Cid.In(codeIds...)).Group(r.Cid).Scan(&received)
  58. if err != nil {
  59. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  60. }
  61. if len(received) != 0 {
  62. receivedMap := make(map[int64]int64, len(received))
  63. for _, item := range received {
  64. receivedMap[item.Cid] = item.Total
  65. }
  66. for _, v := range lists {
  67. v.Used = receivedMap[v.ID]
  68. }
  69. }
  70. models.List = lists
  71. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  72. return serializer.Suc(models)
  73. }
  74. func (s *sCdk) Del(ctx *gin.Context, req forms.CdkDelReq) serializer.Response {
  75. var (
  76. q = query.Use(config.DB).RedeemCode
  77. err error
  78. )
  79. // 编辑
  80. if req.ID <= 0 {
  81. return serializer.ParamErr("ID不能空,删除失败!", nil)
  82. }
  83. _, err = query.Use(config.DB).RedeemCode.WithContext(ctx).Where(q.ID.Eq(req.ID)).Delete()
  84. if err != nil {
  85. return serializer.DBErr(err.Error(), err)
  86. }
  87. return serializer.Suc(nil)
  88. }
  89. func (s *sCdk) Add(ctx *gin.Context, req forms.CdkAddReq) serializer.Response {
  90. var (
  91. q = query.Use(config.DB).RedeemCode
  92. m = q.WithContext(ctx).Where(q.Cdk.Eq(req.Cdk))
  93. models model.RedeemCode
  94. err error
  95. codes []*model.RedeemCode
  96. sn = time.Now().Format("2006010215") + "T" + cast.ToString(req.TypeId) + "R" + character.RandStringRunes(5)
  97. )
  98. serverIds, _ := json.Marshal(req.ServerIds)
  99. award, err := json.Marshal(req.CdkAward)
  100. if err != nil {
  101. return serializer.ParamErr("解析奖励材料失败", err)
  102. }
  103. if req.Cdk != "" {
  104. // 生成自定义兑换码
  105. if err := m.Scan(&models); err != nil {
  106. return serializer.Err(
  107. consts.CodeParamErr,
  108. "查询出错",
  109. err,
  110. )
  111. }
  112. if models.ID > 0 {
  113. return serializer.Err(
  114. consts.CodeParamErr,
  115. "兑换已存在",
  116. err,
  117. )
  118. }
  119. codes = append(codes, &model.RedeemCode{
  120. ServerIds: string(serverIds),
  121. Sn: sn,
  122. Name: req.Name,
  123. Cdk: req.Cdk,
  124. TypeID: req.TypeId,
  125. Openid: req.Openid,
  126. Times: req.Times,
  127. ExpiredAt: int32(req.ExpiredAt),
  128. Award: string(award),
  129. Date: time.Now().Format("2006-01-02"),
  130. Operator: req.Operator,
  131. CreatedAt: time.Now().Unix(),
  132. })
  133. } else {
  134. // 批量生成
  135. for i := 1; i <= req.Num; i++ {
  136. codes = append(codes, &model.RedeemCode{
  137. ServerIds: string(serverIds),
  138. Sn: sn,
  139. Name: req.Name,
  140. Cdk: character.RandStringRunes(16),
  141. TypeID: req.TypeId,
  142. Openid: req.Openid,
  143. Times: req.Times,
  144. ExpiredAt: int32(req.ExpiredAt),
  145. Award: string(award),
  146. Date: time.Now().Format("2006-01-02"),
  147. Operator: req.Operator,
  148. CreatedAt: time.Now().Unix(),
  149. })
  150. }
  151. }
  152. if err = query.Use(config.DB).RedeemCode.WithContext(ctx).CreateInBatches(codes, req.Num); err != nil {
  153. return serializer.DBErr(err.Error(), err)
  154. }
  155. return serializer.Suc(nil)
  156. }
  157. func (s *sCdk) Received(ctx *gin.Context, req forms.CdkReceivedReq) serializer.Response {
  158. type RedeemReceived struct {
  159. model.RedeemReceived
  160. Server string `json:"server"`
  161. }
  162. var (
  163. q = query.Use(config.DB).RedeemReceived
  164. m = q.WithContext(ctx)
  165. offset int64 = 0
  166. models forms.UserAccountListRes
  167. lists []RedeemReceived
  168. )
  169. m = m.Where(q.Cid.Eq(req.Cid)).Order(q.ID.Desc())
  170. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  171. count, err := m.Count()
  172. if err != nil {
  173. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  174. }
  175. if count > 0 {
  176. if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
  177. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  178. }
  179. }
  180. if len(lists) > 0 {
  181. for k, v := range lists {
  182. serverId, err := player.GetDBByUserId(v.Playerid)
  183. if err != nil {
  184. logrus.Warnf("CDK Received lists err:%+v", err)
  185. continue
  186. }
  187. name, err := ServerOption.GetName(ctx, int32(serverId))
  188. if err != nil {
  189. logrus.Warnf("CDK Received lists GetName err:%+v", err)
  190. continue
  191. }
  192. lists[k].Server = fmt.Sprintf("%v(%v)", name, serverId)
  193. }
  194. }
  195. models.List = lists
  196. models.Page = req.Page
  197. models.PerPage = req.PerPage
  198. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  199. return serializer.Suc(models)
  200. }
  201. func (s *sCdk) Invalid(ctx *gin.Context, req forms.CdkInvalidReq) serializer.Response {
  202. var (
  203. q = query.Use(config.DB).RedeemCode
  204. m = query.Use(config.DB).RedeemCode.WithContext(ctx)
  205. err error
  206. )
  207. // 编辑
  208. if req.Sn == "" {
  209. return serializer.ParamErr("sn不能空,删除失败!", nil)
  210. }
  211. one, err := m.Where(q.Sn.Eq(req.Sn)).First()
  212. if err != nil {
  213. return serializer.DBErr(err.Error(), err)
  214. }
  215. if one.Status == req.Status {
  216. return serializer.Suc(nil)
  217. }
  218. _, err = query.Use(config.DB).RedeemCode.WithContext(ctx).Where(q.Sn.Eq(req.Sn)).Update(q.Status, req.Status)
  219. if err != nil {
  220. return serializer.DBErr(err.Error(), err)
  221. }
  222. return serializer.Suc(nil)
  223. }
  224. func (s *sCdk) RedeemCodeList(ctx *gin.Context, req forms.CdkRedeemCodeListReq) serializer.Response {
  225. type RedeemCode struct {
  226. model.RedeemCode
  227. Used int64 `json:"used"`
  228. }
  229. type RedeemReceived struct {
  230. Cid int64 `json:"cid"`
  231. Total int64 `json:"total"`
  232. }
  233. var (
  234. q = query.Use(config.DB).RedeemCode
  235. r = query.Use(config.DB).RedeemReceived
  236. m = q.WithContext(ctx)
  237. offset int64 = 0
  238. models forms.UserAccountListRes
  239. lists []*RedeemCode
  240. received []*RedeemReceived
  241. )
  242. if req.Sn != "" {
  243. m = m.Where(q.Sn.Eq(req.Sn))
  244. }
  245. if req.Cdk != "" {
  246. m = m.Where(q.Cdk.Eq(req.Cdk))
  247. }
  248. if len(req.CreatedAt) == 2 {
  249. m = m.Where(q.CreatedAt.Between(req.CreatedAt[0], req.CreatedAt[1]))
  250. }
  251. m = m.Order(q.ID.Desc(), q.Sn.Desc())
  252. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  253. count, err := m.Count()
  254. if err != nil {
  255. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  256. }
  257. if count > 0 {
  258. if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
  259. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  260. }
  261. }
  262. // code id slice
  263. codeIds := make([]int64, len(lists))
  264. for i, v := range lists {
  265. codeIds[i] = v.ID
  266. }
  267. err = r.WithContext(ctx).Select(r.Cid, r.ID.Count().As("total")).Where(r.Cid.In(codeIds...)).Group(r.Cid).Scan(&received)
  268. if err != nil {
  269. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  270. }
  271. if len(received) != 0 {
  272. receivedMap := make(map[int64]int64, len(received))
  273. for _, item := range received {
  274. receivedMap[item.Cid] = item.Total
  275. }
  276. for _, v := range lists {
  277. v.Used = receivedMap[v.ID]
  278. }
  279. }
  280. models.List = lists
  281. models.Page = req.Page
  282. models.PerPage = req.PerPage
  283. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  284. return serializer.Suc(models)
  285. }
  286. // Exchange 兑换物品
  287. // ErrCode
  288. // 0 兑换成功
  289. // 501001 当前兑换人数过多,请稍后重试
  290. // 501002 请输入正确地兑换码
  291. // 501003 兑换码已过期
  292. // 501004 该兑换码暂不支持当前账户领取
  293. // 501005 查询异常,请稍后重试
  294. // 501006 已经领取过啦
  295. // 501007 查询异常,请稍后重试
  296. // 501008 已被领完
  297. // 501009 获取奖励物品失败
  298. // 501010 兑换失败
  299. // 501011 兑换失败,请稍后重试
  300. func (s *sCdk) Exchange(ctx context.Context, req *msg.RedeemGoodsIs) (res msg.ResponseRedeemGoodsIs, err error) {
  301. if req.Code == "" || !character.IsLetterNumber(req.Code) {
  302. return msg.ResponseRedeemGoodsIs{
  303. ErrCode: 5010022, // 兑换码不存在
  304. PlayerId: req.PlayerId,
  305. GateId: req.GateId,
  306. }, err
  307. }
  308. var (
  309. q = query.Use(config.DB).RedeemCode
  310. r = query.Use(config.DB).RedeemReceived
  311. models *model.RedeemCode
  312. reModels *model.RedeemReceived
  313. )
  314. if err = q.WithContext(ctx).Where(q.Cdk.Eq(req.Code)).Scan(&models); err != nil {
  315. return msg.ResponseRedeemGoodsIs{
  316. ErrCode: 501001, // 查询异常,请稍后重试
  317. PlayerId: req.PlayerId,
  318. GateId: req.GateId,
  319. }, err
  320. }
  321. if models == nil {
  322. return msg.ResponseRedeemGoodsIs{
  323. ErrCode: 501002, // 兑换码不存在
  324. PlayerId: req.PlayerId,
  325. GateId: req.GateId,
  326. }, err
  327. }
  328. if int64(models.ExpiredAt) < time.Now().Unix() {
  329. return msg.ResponseRedeemGoodsIs{
  330. ErrCode: 501003, // 兑换码已过期
  331. PlayerId: req.PlayerId,
  332. GateId: req.GateId,
  333. }, err
  334. }
  335. if models.Openid != "" && models.Openid != req.OpenId {
  336. return msg.ResponseRedeemGoodsIs{
  337. ErrCode: 501004, // 该兑换码暂不支持当前账户领取
  338. PlayerId: req.PlayerId,
  339. GateId: req.GateId,
  340. }, err
  341. }
  342. if models.Status != 1 {
  343. return msg.ResponseRedeemGoodsIs{
  344. ErrCode: 501003, // 兑换码已过期
  345. PlayerId: req.PlayerId,
  346. GateId: req.GateId,
  347. }, err
  348. }
  349. if err = s.checkServerOwner(models, req.PlayerId); err != nil {
  350. return msg.ResponseRedeemGoodsIs{
  351. ErrCode: 501004, // 该兑换码暂不支持当前账户领取
  352. PlayerId: req.PlayerId,
  353. GateId: req.GateId,
  354. }, err
  355. }
  356. if err = r.WithContext(ctx).Where(r.Cid.Eq(models.ID), r.Playerid.Eq(req.PlayerId)).Scan(&reModels); err != nil {
  357. return msg.ResponseRedeemGoodsIs{
  358. ErrCode: 501005, // 查询异常,请稍后重试
  359. PlayerId: req.PlayerId,
  360. GateId: req.GateId,
  361. }, err
  362. }
  363. if reModels != nil {
  364. return msg.ResponseRedeemGoodsIs{
  365. ErrCode: 501006, // 已经领取过啦
  366. PlayerId: req.PlayerId,
  367. GateId: req.GateId,
  368. }, err
  369. }
  370. count, err := r.WithContext(ctx).Where(r.Cid.Eq(models.ID)).Count()
  371. if err != nil {
  372. return msg.ResponseRedeemGoodsIs{
  373. ErrCode: 501007, // 查询异常,请稍后重试
  374. PlayerId: req.PlayerId,
  375. GateId: req.GateId,
  376. }, err
  377. }
  378. if count >= models.Times {
  379. return msg.ResponseRedeemGoodsIs{
  380. ErrCode: 501008, // 已领完
  381. PlayerId: req.PlayerId,
  382. GateId: req.GateId,
  383. }, err
  384. }
  385. var award forms.CdkAward
  386. if err = json.Unmarshal([]byte(models.Award), &award); err != nil {
  387. return msg.ResponseRedeemGoodsIs{
  388. ErrCode: 501009, // 获取奖励物品失败
  389. PlayerId: req.PlayerId,
  390. GateId: req.GateId,
  391. }, err
  392. }
  393. var data model.RedeemReceived
  394. data.Cid = models.ID
  395. data.Playerid = req.PlayerId
  396. data.Openid = req.OpenId
  397. data.CreatedAt = time.Now().Unix()
  398. if err = query.Use(config.DB).RedeemReceived.WithContext(ctx).Create(&data); err != nil {
  399. return msg.ResponseRedeemGoodsIs{
  400. ErrCode: 501010, // 兑换失败
  401. PlayerId: req.PlayerId,
  402. GateId: req.GateId,
  403. }, err
  404. }
  405. if data.ID <= 0 {
  406. return msg.ResponseRedeemGoodsIs{
  407. ErrCode: 501011, // 兑换失败-2
  408. PlayerId: req.PlayerId,
  409. GateId: req.GateId,
  410. }, err
  411. }
  412. return msg.ResponseRedeemGoodsIs{
  413. ErrCode: 0, // 兑换成功
  414. PlayerId: req.PlayerId,
  415. GateId: req.GateId,
  416. Materials: award.Materials,
  417. Equipments: award.Equipment,
  418. }, nil
  419. }
  420. func (s *sCdk) checkServerOwner(models *model.RedeemCode, playerId int64) (err error) {
  421. logrus.Warnf("checkServerOwner..")
  422. if models.ServerIds == "" { // 不限制服务器
  423. return
  424. }
  425. var ids []int
  426. if err = json.Unmarshal([]byte(models.ServerIds), &ids); err != nil {
  427. return err
  428. }
  429. if len(ids) == 0 {
  430. return
  431. }
  432. for _, id := range ids {
  433. // 所有服务器,不效验
  434. if id == 0 {
  435. return
  436. }
  437. }
  438. // 检查玩家所在服务器
  439. serverId, err := player.GetDBByUserId(playerId)
  440. if err != nil {
  441. return err
  442. }
  443. for _, id := range ids {
  444. // 包含玩家所在服务器
  445. if id == serverId {
  446. return
  447. }
  448. }
  449. err = errors.New("玩家所在服务器不支持兑换")
  450. return
  451. }
  452. */