You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
2.5 KiB
Go

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
}