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
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
|
|
}
|