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.

116 lines
2.9 KiB
Go

package campaignnotice
import (
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/service/provider/fissionaction"
"joybuywork/internal/service/queue/producer"
"joybuywork/internal/service/queue/types"
"joybuywork/internal/utils/logic"
"time"
"gorm.io/gen"
)
type VsSettlement struct {
logic.Logic
Req *types.CampaignVsSettlement
}
func (s *VsSettlement) Exec() (err error) {
m := s.GetDao().FissionCampaignVsSchedule
schedule, err := m.WithContext(s.Ctx).Where(m.ID.Eq(s.Req.ScheduleId)).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if schedule == nil || schedule.IsSettlement == mtype.No {
return
}
mp := fissionaction.NewMarkPoint(s.Ctx)
t := time.Now().Unix()
slt := schedule.GetSettlement()
var settlements = make([]*model.FissionVsVoteSettlement, 0, 200)
voteM := s.GetDao().FissionVsVote
var votes []*model.FissionVsVote
err = voteM.WithContext(s.Ctx).Where(
voteM.ScheduleID.Eq(schedule.ID),
voteM.WinType.Eq(int8(slt.WinType)),
voteM.WinTeamID.Eq(slt.WinTeamId),
).FindInBatches(&votes, 200, func(tx gen.Dao, batch int) error {
var userIds []int64
for _, v := range votes {
userIds = append(userIds, v.UserID)
}
userM := s.GetDao().FissionUser.SubTable(schedule.CampaignID)
users, err1 := userM.WithContext(s.Ctx).Where(userM.ID.In(userIds...)).Find()
if err1 != nil {
return s.BE().MysqlError(err1)
}
var userMap = make(map[int64]*model.FissionUser)
for _, p := range users {
userMap[p.ID] = p
}
var ids []int64
for _, vote := range votes {
ids = append(ids, vote.ID)
settlements = append(settlements, withdefault.FissionVsVoteSettlement(&model.FissionVsVoteSettlement{
CampaignID: vote.CampaignID,
UserID: vote.UserID,
ScheduleID: vote.ScheduleID,
VsID: vote.VsID,
VoteID: vote.ID,
AcceptAt: 0,
RecordIds: "[]",
Odds: schedule.GetOdds(),
}))
mp.InApp(userMap[vote.UserID]).VsWin(t, vote.ScheduleID, vote.FreeVote+vote.PointVote)
}
_, err = voteM.WithContext(s.Ctx).Where(voteM.ID.In(ids...)).UpdateColumnSimple(voteM.IsWin.Value(mtype.Yes))
if err != nil {
return s.BE().MysqlError(err)
}
return nil
})
err = s.GetDao().FissionVsVoteSettlement.WithContext(s.Ctx).CreateInBatches(settlements, 200)
if err != nil {
return s.BE().MysqlError(err)
}
conf, err := cache.NewCampaignVs(s.Ctx).FindByCampaignId(schedule.CampaignID)
if err != nil {
err = s.BE().CacheError(err)
return
}
if conf.ClaimType == mtype.FissionCampaignVsClaimTypePage {
return
}
p := producer.NewCampaignNotice(s.Ctx)
for _, v := range settlements {
p.CampaignSettlementReward(types.CampaignSettlementReward{
SettlementId: v.ID,
})
}
return
}