123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 |
- package service
- // Cdk 订单
- var Cdk = new(sCdk)
- type sCdk struct{}
- /*func (s *sCdk) List(ctx *gin.Context, req forms.CdkListReq) serializer.Response {
- type RedeemCode struct {
- model.RedeemCode
- Used int64 `json:"used"`
- }
- type RedeemReceived struct {
- Cid int64 `json:"cid"`
- Total int64 `json:"total"`
- }
- var (
- r = query.Use(config.DB).RedeemReceived
- count int64 = 0
- offset int64 = 0
- models forms.UserAccountListRes
- lists []*RedeemCode
- received []*RedeemReceived
- )
- models.Page = req.Page
- models.PerPage = req.PerPage
- redeemCodeQuery := config.DB.Table("redeem_code AS subquery").
- 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").
- 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").
- Order("subquery.created_at desc")
- if len(req.CreatedAt) == 2 {
- redeemCodeQuery.Where("subquery.created_at BETWEEN ? AND ?", req.CreatedAt[0], req.CreatedAt[1])
- }
- if req.Cdk != "" {
- redeemCodeQuery.Where("subquery.cdk = ?", req.Cdk)
- }
- if req.Sn != "" {
- redeemCodeQuery.Where("subquery.sn = ?", req.Sn)
- }
- if req.Name != "" {
- redeemCodeQuery.Where("subquery.name = ?", req.Name)
- }
- err := redeemCodeQuery.Count(&count).Error
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
- }
- if count == 0 {
- return serializer.Suc(models)
- }
- req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
- err = redeemCodeQuery.Limit(int(req.PerPage)).Offset(int(offset)).Find(&lists).Error
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
- }
- // code id slice
- codeIds := make([]int64, len(lists))
- for i, v := range lists {
- codeIds[i] = v.ID
- }
- err = r.WithContext(ctx).Select(r.Cid, r.ID.Count().As("total")).Where(r.Cid.In(codeIds...)).Group(r.Cid).Scan(&received)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- if len(received) != 0 {
- receivedMap := make(map[int64]int64, len(received))
- for _, item := range received {
- receivedMap[item.Cid] = item.Total
- }
- for _, v := range lists {
- v.Used = receivedMap[v.ID]
- }
- }
- models.List = lists
- models.PageCount = (count + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- func (s *sCdk) Del(ctx *gin.Context, req forms.CdkDelReq) serializer.Response {
- var (
- q = query.Use(config.DB).RedeemCode
- err error
- )
- // 编辑
- if req.ID <= 0 {
- return serializer.ParamErr("ID不能空,删除失败!", nil)
- }
- _, err = query.Use(config.DB).RedeemCode.WithContext(ctx).Where(q.ID.Eq(req.ID)).Delete()
- if err != nil {
- return serializer.DBErr(err.Error(), err)
- }
- return serializer.Suc(nil)
- }
- func (s *sCdk) Add(ctx *gin.Context, req forms.CdkAddReq) serializer.Response {
- var (
- q = query.Use(config.DB).RedeemCode
- m = q.WithContext(ctx).Where(q.Cdk.Eq(req.Cdk))
- models model.RedeemCode
- err error
- codes []*model.RedeemCode
- sn = time.Now().Format("2006010215") + "T" + cast.ToString(req.TypeId) + "R" + character.RandStringRunes(5)
- )
- serverIds, _ := json.Marshal(req.ServerIds)
- award, err := json.Marshal(req.CdkAward)
- if err != nil {
- return serializer.ParamErr("解析奖励材料失败", err)
- }
- if req.Cdk != "" {
- // 生成自定义兑换码
- if err := m.Scan(&models); err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错",
- err,
- )
- }
- if models.ID > 0 {
- return serializer.Err(
- consts.CodeParamErr,
- "兑换已存在",
- err,
- )
- }
- codes = append(codes, &model.RedeemCode{
- ServerIds: string(serverIds),
- Sn: sn,
- Name: req.Name,
- Cdk: req.Cdk,
- TypeID: req.TypeId,
- Openid: req.Openid,
- Times: req.Times,
- ExpiredAt: int32(req.ExpiredAt),
- Award: string(award),
- Date: time.Now().Format("2006-01-02"),
- Operator: req.Operator,
- CreatedAt: time.Now().Unix(),
- })
- } else {
- // 批量生成
- for i := 1; i <= req.Num; i++ {
- codes = append(codes, &model.RedeemCode{
- ServerIds: string(serverIds),
- Sn: sn,
- Name: req.Name,
- Cdk: character.RandStringRunes(16),
- TypeID: req.TypeId,
- Openid: req.Openid,
- Times: req.Times,
- ExpiredAt: int32(req.ExpiredAt),
- Award: string(award),
- Date: time.Now().Format("2006-01-02"),
- Operator: req.Operator,
- CreatedAt: time.Now().Unix(),
- })
- }
- }
- if err = query.Use(config.DB).RedeemCode.WithContext(ctx).CreateInBatches(codes, req.Num); err != nil {
- return serializer.DBErr(err.Error(), err)
- }
- return serializer.Suc(nil)
- }
- func (s *sCdk) Received(ctx *gin.Context, req forms.CdkReceivedReq) serializer.Response {
- type RedeemReceived struct {
- model.RedeemReceived
- Server string `json:"server"`
- }
- var (
- q = query.Use(config.DB).RedeemReceived
- m = q.WithContext(ctx)
- offset int64 = 0
- models forms.UserAccountListRes
- lists []RedeemReceived
- )
- m = m.Where(q.Cid.Eq(req.Cid)).Order(q.ID.Desc())
- req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
- count, err := m.Count()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
- }
- if count > 0 {
- if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- }
- if len(lists) > 0 {
- for k, v := range lists {
- serverId, err := player.GetDBByUserId(v.Playerid)
- if err != nil {
- logrus.Warnf("CDK Received lists err:%+v", err)
- continue
- }
- name, err := ServerOption.GetName(ctx, int32(serverId))
- if err != nil {
- logrus.Warnf("CDK Received lists GetName err:%+v", err)
- continue
- }
- lists[k].Server = fmt.Sprintf("%v(%v)", name, serverId)
- }
- }
- models.List = lists
- models.Page = req.Page
- models.PerPage = req.PerPage
- models.PageCount = (count + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- func (s *sCdk) Invalid(ctx *gin.Context, req forms.CdkInvalidReq) serializer.Response {
- var (
- q = query.Use(config.DB).RedeemCode
- m = query.Use(config.DB).RedeemCode.WithContext(ctx)
- err error
- )
- // 编辑
- if req.Sn == "" {
- return serializer.ParamErr("sn不能空,删除失败!", nil)
- }
- one, err := m.Where(q.Sn.Eq(req.Sn)).First()
- if err != nil {
- return serializer.DBErr(err.Error(), err)
- }
- if one.Status == req.Status {
- return serializer.Suc(nil)
- }
- _, err = query.Use(config.DB).RedeemCode.WithContext(ctx).Where(q.Sn.Eq(req.Sn)).Update(q.Status, req.Status)
- if err != nil {
- return serializer.DBErr(err.Error(), err)
- }
- return serializer.Suc(nil)
- }
- func (s *sCdk) RedeemCodeList(ctx *gin.Context, req forms.CdkRedeemCodeListReq) serializer.Response {
- type RedeemCode struct {
- model.RedeemCode
- Used int64 `json:"used"`
- }
- type RedeemReceived struct {
- Cid int64 `json:"cid"`
- Total int64 `json:"total"`
- }
- var (
- q = query.Use(config.DB).RedeemCode
- r = query.Use(config.DB).RedeemReceived
- m = q.WithContext(ctx)
- offset int64 = 0
- models forms.UserAccountListRes
- lists []*RedeemCode
- received []*RedeemReceived
- )
- if req.Sn != "" {
- m = m.Where(q.Sn.Eq(req.Sn))
- }
- if req.Cdk != "" {
- m = m.Where(q.Cdk.Eq(req.Cdk))
- }
- if len(req.CreatedAt) == 2 {
- m = m.Where(q.CreatedAt.Between(req.CreatedAt[0], req.CreatedAt[1]))
- }
- m = m.Order(q.ID.Desc(), q.Sn.Desc())
- req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
- count, err := m.Count()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
- }
- if count > 0 {
- if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- }
- // code id slice
- codeIds := make([]int64, len(lists))
- for i, v := range lists {
- codeIds[i] = v.ID
- }
- err = r.WithContext(ctx).Select(r.Cid, r.ID.Count().As("total")).Where(r.Cid.In(codeIds...)).Group(r.Cid).Scan(&received)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- if len(received) != 0 {
- receivedMap := make(map[int64]int64, len(received))
- for _, item := range received {
- receivedMap[item.Cid] = item.Total
- }
- for _, v := range lists {
- v.Used = receivedMap[v.ID]
- }
- }
- models.List = lists
- models.Page = req.Page
- models.PerPage = req.PerPage
- models.PageCount = (count + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- // Exchange 兑换物品
- // ErrCode
- // 0 兑换成功
- // 501001 当前兑换人数过多,请稍后重试
- // 501002 请输入正确地兑换码
- // 501003 兑换码已过期
- // 501004 该兑换码暂不支持当前账户领取
- // 501005 查询异常,请稍后重试
- // 501006 已经领取过啦
- // 501007 查询异常,请稍后重试
- // 501008 已被领完
- // 501009 获取奖励物品失败
- // 501010 兑换失败
- // 501011 兑换失败,请稍后重试
- func (s *sCdk) Exchange(ctx context.Context, req *msg.RedeemGoodsIs) (res msg.ResponseRedeemGoodsIs, err error) {
- if req.Code == "" || !character.IsLetterNumber(req.Code) {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 5010022, // 兑换码不存在
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- var (
- q = query.Use(config.DB).RedeemCode
- r = query.Use(config.DB).RedeemReceived
- models *model.RedeemCode
- reModels *model.RedeemReceived
- )
- if err = q.WithContext(ctx).Where(q.Cdk.Eq(req.Code)).Scan(&models); err != nil {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501001, // 查询异常,请稍后重试
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- if models == nil {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501002, // 兑换码不存在
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- if int64(models.ExpiredAt) < time.Now().Unix() {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501003, // 兑换码已过期
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- if models.Openid != "" && models.Openid != req.OpenId {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501004, // 该兑换码暂不支持当前账户领取
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- if models.Status != 1 {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501003, // 兑换码已过期
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- if err = s.checkServerOwner(models, req.PlayerId); err != nil {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501004, // 该兑换码暂不支持当前账户领取
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- if err = r.WithContext(ctx).Where(r.Cid.Eq(models.ID), r.Playerid.Eq(req.PlayerId)).Scan(&reModels); err != nil {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501005, // 查询异常,请稍后重试
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- if reModels != nil {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501006, // 已经领取过啦
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- count, err := r.WithContext(ctx).Where(r.Cid.Eq(models.ID)).Count()
- if err != nil {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501007, // 查询异常,请稍后重试
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- if count >= models.Times {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501008, // 已领完
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- var award forms.CdkAward
- if err = json.Unmarshal([]byte(models.Award), &award); err != nil {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501009, // 获取奖励物品失败
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- var data model.RedeemReceived
- data.Cid = models.ID
- data.Playerid = req.PlayerId
- data.Openid = req.OpenId
- data.CreatedAt = time.Now().Unix()
- if err = query.Use(config.DB).RedeemReceived.WithContext(ctx).Create(&data); err != nil {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501010, // 兑换失败
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- if data.ID <= 0 {
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 501011, // 兑换失败-2
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- }, err
- }
- return msg.ResponseRedeemGoodsIs{
- ErrCode: 0, // 兑换成功
- PlayerId: req.PlayerId,
- GateId: req.GateId,
- Materials: award.Materials,
- Equipments: award.Equipment,
- }, nil
- }
- func (s *sCdk) checkServerOwner(models *model.RedeemCode, playerId int64) (err error) {
- logrus.Warnf("checkServerOwner..")
- if models.ServerIds == "" { // 不限制服务器
- return
- }
- var ids []int
- if err = json.Unmarshal([]byte(models.ServerIds), &ids); err != nil {
- return err
- }
- if len(ids) == 0 {
- return
- }
- for _, id := range ids {
- // 所有服务器,不效验
- if id == 0 {
- return
- }
- }
- // 检查玩家所在服务器
- serverId, err := player.GetDBByUserId(playerId)
- if err != nil {
- return err
- }
- for _, id := range ids {
- // 包含玩家所在服务器
- if id == serverId {
- return
- }
- }
- err = errors.New("玩家所在服务器不支持兑换")
- return
- }
- */
|