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.

200 lines
4.2 KiB
Go

package campaign
import (
"joybuywork/internal/consts"
"joybuywork/internal/plugins/jsonm"
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/queue/producer"
"joybuywork/internal/service/queue/types"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_campaign"
"joybuywork/proto/go_proto/workerr"
)
type VsSettlement struct {
logic.Logic
Req *pb.VsSettlementReq
Res *pb.VsSettlementRes
}
func (s *VsSettlement) Run() (err error) {
return logic.Run(s)
}
func (s *VsSettlement) Data() (data jsonm.JsonM) {
data, _ = jsonm.Marshal(s.Req)
return
}
func (s *VsSettlement) Exec() (err error) {
err = s.cpn()
if err != nil {
return
}
schedule, err := s.settlement()
if err != nil {
return
}
return s.autoNext(schedule)
}
func (s *VsSettlement) cpn() (err error) {
cpn, err := finder.Campaign(s.Ctx, s.Req.GetCampaignHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil || cpn.FissionID != consts.IdVs {
err = workerr.NotFound("not found cpn")
return
}
return
}
func (s *VsSettlement) settlement() (schedule *model.FissionCampaignVsSchedule, err error) {
m := s.GetDao().FissionCampaignVsSchedule
schedule, err = m.WithContext(s.Ctx).Where(m.ID.Eq(s.Req.GetScheduleId())).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if schedule == nil {
err = workerr.NotFound("not found schedule")
return
}
if schedule.RewardID == 0 {
err = s.BE().VerifyError("not set reward")
return
}
var scores []*mtype.FissionCampaignVsScheduleSettlementScore
for _, score := range s.Req.GetScores() {
scores = append(scores, &mtype.FissionCampaignVsScheduleSettlementScore{
TeamId: score.GetTeamId(),
Score: score.GetScore(),
})
}
var winType int32 = mtype.FissionCampaignVsScheduleWinTypeDraw
if s.Req.GetWinTeamId() != 0 {
winType = mtype.FissionCampaignVsScheduleWinTypeWin
}
schedule.IsSettlement = mtype.Yes
schedule.SetSettlement(&mtype.FissionCampaignVsScheduleSettlement{
WinType: winType,
WinTeamId: s.Req.GetWinTeamId(),
Scores: scores,
})
err = m.WithContext(s.Ctx).Save(schedule)
if err != nil {
err = s.BE().MysqlError(err)
return
}
s.AddAfterRun(func() (err error) {
producer.NewCampaignNotice(s.Ctx).CampaignVsSettlement(types.CampaignVsSettlement{
ScheduleId: schedule.ID,
})
return
})
return
}
func (s *VsSettlement) autoNext(schedule *model.FissionCampaignVsSchedule) (err error) {
if s.Req.GetWinTeamId() == 0 {
return
}
m := s.GetDao().FissionCampaignVsSchedule
nextSchedules, err := m.WithContext(s.Ctx).Where(
m.CampaignID.Eq(schedule.CampaignID),
m.VsIdx.Eq(schedule.VsIdx+1),
).Order(m.VsAt, m.ID).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(nextSchedules) == 0 {
return
}
var nextSchedule *model.FissionCampaignVsSchedule
for _, next := range nextSchedules {
for _, v := range next.GetVsTeamIds() {
if v <= -1 {
nextSchedule = next
}
}
}
if nextSchedule == nil {
return
}
var vsTeamIds = nextSchedule.GetVsTeamIds()
for i, teamId := range vsTeamIds {
if teamId < 0 {
vsTeamIds[i] = s.Req.GetWinTeamId()
break
}
}
nextSchedule.SetVsTeamIds(vsTeamIds)
err = m.WithContext(s.Ctx).Save(nextSchedule)
if err != nil {
err = s.BE().MysqlError(err)
return
}
teamM := s.GetDao().FissionCampaignVsTeam
teams, err := teamM.WithContext(s.Ctx).Where(teamM.ID.In(vsTeamIds...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var teamMap = make(map[int64]*model.FissionCampaignVsTeam, len(teams))
for _, team := range teams {
teamMap[team.ID] = team
}
s.Res.ScheduleId = nextSchedule.VsIdx
s.Res.PkTeam = &pb.VsSettlementRes_PkTeam{
Id: nextSchedule.ID,
Teams: make([]*pb.VsSettlementRes_Team, 0, len(vsTeamIds)),
}
for _, id := range vsTeamIds {
team, ok := teamMap[id]
if ok {
s.Res.PkTeam.Teams = append(s.Res.PkTeam.Teams, &pb.VsSettlementRes_Team{
Id: id,
Name: team.Name,
LogoImg: team.LogoImg,
})
} else {
s.Res.PkTeam.Teams = append(s.Res.PkTeam.Teams, &pb.VsSettlementRes_Team{
Id: id,
})
}
}
return
}