package campaignuser import ( "joybuywork/internal/repository/dbcheck" "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/repository/withdefault" "joybuywork/internal/service/provider" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_campaign_user" "joybuywork/proto/go_proto/workerr" ) type MixReward struct { logic.Logic Req *pb.MixRewardReq Res *pb.MixRewardRes taskChance int32 } func (s *MixReward) Run() error { return logic.Run(s) } func (s *MixReward) Exec() (err error) { user, err := s.user() if err != nil { return } if user.IsView == mtype.Yes { return s.viewMix(user) } err = s.mix(user) if err != nil { return } return } func (s *MixReward) user() (user *model.FissionUser, err error) { cpn, err := finder.Campaign(s.Ctx, s.Req.GetCampaignId()) if err != nil { err = s.BE().CacheError(err) return } if cpn == nil || cpn.IsDel == mtype.Yes { err = workerr.NotFound("not found cpn") return } user, err = finder.FissionUser(s.Ctx, cpn.ID, s.Req.GetUserId()) if err != nil { err = s.BE().CacheError(err) return } if user == nil { err = workerr.NotFound("not found user") return } return } // 普通用户的合成 func (s *MixReward) mix(user *model.FissionUser) (err error) { m := s.GetDao().FissionDiceCollect collect, err := m.WithContext(s.Ctx).Where(m.UserID.Eq(user.ID), m.RewardID.Eq(s.Req.GetRewardId())).Take() if err = dbcheck.DbError(err); err != nil { err = s.BE().MysqlError(err) return } if collect == nil || collect.RecordID == 0 { return } rewardM := s.GetDao().FissionCampaignReward reward, err := rewardM.WithContext(s.Ctx).Where(rewardM.ID.Eq(collect.RewardID)).Take() if err = dbcheck.DbError(err); err != nil { err = s.BE().MysqlError(err) return } // 完整度+1 _, err = m.WithContext(s.Ctx).Where(m.ID.Eq(collect.ID)).UpdateSimple(m.IntactNum.Add(1), m.Num.Sub(reward.CollectNum), m.RecordID.Value(0)) if err != nil { err = s.BE().MysqlError(err) return } recordM := s.GetDao().FissionRewardRecord.SubTable(user.CampaignID) record, err := recordM.WithContext(s.Ctx).Where(recordM.ID.Eq(collect.RecordID)).Take() if err = dbcheck.DbError(err); err != nil { err = s.BE().MysqlError(err) return } var lack bool if record.FailType == mtype.FissionRewardRecordFailTypeCli && record.FailMsg == mtype.FissionRewardRecordFailTypeCliLackMsg { lack = true } // 骰子记录 var diceRecord = withdefault.FissionDiceRecord(&model.FissionDiceRecord{ CreatedAt: record.CreatedAt, CampaignID: user.CampaignID, UserID: user.ID, Mark: mtype.FissionDiceRecordMarkReward, Data: "", }) diceRecord.SetData(&mtype.DiceRecord{ RewardId: record.RewardID, RecordId: record.ID, }) err = s.GetDao().FissionDiceRecord.WithContext(s.Ctx).Create(diceRecord) if err != nil { err = s.BE().MysqlError(err) return } cpn, err := finder.Campaign(s.Ctx, user.CampaignID) if err != nil { err = s.BE().CacheError(err) return } preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, record.BaseRewardID) if err != nil { return } info, _ := preward.InfoAutoLang(record.BaseRewardID, user.LangMark) s.AddAfterRun(func() (err error) { s.Res.Lack = lack s.Res.RewardId = record.RewardID s.Res.RewardTitle = info.Title s.Res.ImgUrl = info.ImgUrl s.Res.ReceiveType = info.ReceiveType s.Res.Contact = info.Contact s.Res.KvData = make([]*pb.MixRewardRes_KV, 0, len(info.KvData)) s.Res.RewardHashId = record.HashID s.Res.OpenToUse = info.OpenToUse s.Res.WebUrl = info.WebUrl s.Res.AppParam = info.AppParam s.Res.PcParam = info.PcParam for _, v := range info.KvData { s.Res.KvData = append(s.Res.KvData, &pb.MixRewardRes_KV{ Key: v.Key, Value: v.Value, }) } return }) return } // 预览用户的合成 func (s *MixReward) viewMix(user *model.FissionUser) (err error) { m := s.GetDao().FissionDiceCollect collect, err := m.WithContext(s.Ctx).Where(m.UserID.Eq(user.ID), m.RewardID.Eq(s.Req.GetRewardId())).Take() if err = dbcheck.DbError(err); err != nil { err = s.BE().MysqlError(err) return } rewardM := s.GetDao().FissionCampaignReward reward, err := rewardM.WithContext(s.Ctx).Where(rewardM.ID.Eq(collect.RewardID)).Take() if err = dbcheck.DbError(err); err != nil { err = s.BE().MysqlError(err) return } cpn, err := finder.Campaign(s.Ctx, user.CampaignID) if err != nil { err = s.BE().CacheError(err) return } preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, reward.RewardID) if err != nil { return } info, _ := preward.InfoAutoLang(reward.RewardID, user.LangMark) s.AddAfterRun(func() (err error) { s.Res.RewardId = reward.RewardID s.Res.RewardTitle = info.Title s.Res.ImgUrl = info.ImgUrl s.Res.ReceiveType = info.ReceiveType s.Res.Contact = info.Contact s.Res.KvData = make([]*pb.MixRewardRes_KV, 0, len(info.KvData)) s.Res.OpenToUse = info.OpenToUse s.Res.WebUrl = info.WebUrl s.Res.AppParam = info.AppParam s.Res.PcParam = info.PcParam for _, v := range info.KvData { s.Res.KvData = append(s.Res.KvData, &pb.MixRewardRes_KV{ Key: v.Key, Value: v.Value, }) } return }) return }