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 }