package campaignuser import ( "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/service/provider/players" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_campaign_user" "joybuywork/proto/go_proto/workerr" "time" ) type Answer struct { logic.Logic Req *pb.AnswerReq Res *pb.AnswerRes } func (s *Answer) Run() error { return logic.Run(s) } func (s *Answer) Exec() (err error) { user, cpn, err := s.user() if err != nil { return } err = s.answer(user, cpn) if err != nil { return } return } // 用户信息 func (s *Answer) user() (user *model.FissionUser, cpn *model.FissionCampaign, 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 } if cpn.EndTime < time.Now().Unix() { err = workerr.CEndError 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 } //如果活动没开始,还不是预览用户,不允许玩 if cpn.StartTime > time.Now().Unix() && user.IsView == mtype.No { err = workerr.CStartError return } return } func (s *Answer) answer(user *model.FissionUser, cpn *model.FissionCampaign) (err error) { player, err := players.NewQa(s.Ctx, user, cpn.FissionID, players.SetCpn(cpn)) if err != nil { return } var submits = make([]*players.QaAnswer, 0, len(s.Req.GetSubmits())) for _, submit := range s.Req.GetSubmits() { submits = append(submits, &players.QaAnswer{ QID: submit.GetQid(), AID: submit.GetAid(), }) } score, qaRightNum, win, reward, record, info, err := player.Answer(submits) if err != nil { return } s.Res.Id = reward.ID s.Res.Win = win s.Res.Title = info.Title s.Res.Img = info.ImgUrl s.Res.ReceiveType = info.ReceiveType s.Res.Score = score s.Res.Contact = info.Contact s.Res.OpenToUse = info.OpenToUse s.Res.WebUrl = info.WebUrl s.Res.AppParam = info.AppParam s.Res.PcParam = info.PcParam s.Res.QaNum = player.GetConf().QaNum s.Res.QaRightNum = qaRightNum if record != nil { s.Res.RewardHashId = record.HashID } s.Res.KvData = make([]*pb.AnswerRes_KV, 0, len(info.KvData)) for _, v := range info.KvData { s.Res.KvData = append(s.Res.KvData, &pb.AnswerRes_KV{ Key: v.Key, Value: v.Value, IsShow: v.IsShow, }) } return }