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.

193 lines
4.2 KiB
Go

package campaignnotice
import (
"joybuywork/internal/consts"
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/service/queue/types"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
"fmt"
)
type DiceMap struct {
logic.Logic
Req *types.CampaignDiceMap
}
func (s *DiceMap) Exec() (err error) {
cpn, can, err := s.check()
if err != nil || !can {
return
}
err = s.buildMap(cpn)
if err != nil {
return
}
return
}
func (s *DiceMap) check() (cpn *model.FissionCampaign, can bool, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.CampaignId)
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil || cpn.FissionID != consts.IdDice || !cpn.IsPub() {
return
}
can = true
return
}
func (s *DiceMap) buildMap(cpn *model.FissionCampaign) (err error) {
rewardM := s.GetDao().FissionCampaignReward
rewards, err := rewardM.WithContext(s.Ctx).Where(
rewardM.CampaignID.Eq(cpn.ID),
rewardM.RewardType.Eq(mtype.FissionCampaignRewardTypeApp),
rewardM.IsDel.Eq(mtype.No),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var groupMap = make(map[string]int64)
var groups []*model.FissionDiceMapGroup
var rewardGroup = make(map[int64][]*model.FissionCampaignReward)
for _, reward := range rewards {
key := fmt.Sprintf("%s_%d_%s", reward.LangMark, reward.LevelID, reward.CountryMark)
id, ok := groupMap[key]
if !ok {
group := withdefault.FissionDiceMapGroup(&model.FissionDiceMapGroup{
CampaignID: cpn.ID,
LevelID: reward.LevelID,
LangMark: reward.LangMark,
CountryMark: reward.CountryMark,
})
groups = append(groups, group)
id = group.ID
groupMap[key] = id
}
rewardGroup[id] = append(rewardGroup[id], reward)
}
m := s.GetDao().FissionDiceMapGroup
err = m.WithContext(s.Ctx).Create(groups...)
if err != nil {
err = s.BE().MysqlError(err)
return
}
confM := s.GetDao().FissionCampaignDice
conf, err := confM.WithContext(s.Ctx).Where(confM.CampaignID.Eq(cpn.ID)).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
for dmgId, v := range rewardGroup {
err = s._buildMap(conf, dmgId, v)
if err != nil {
return
}
}
return
}
// 生成地图
func (s *DiceMap) _buildMap(conf *model.FissionCampaignDice, dmgId int64, rewards []*model.FissionCampaignReward) (err error) {
nl := len(rewards)
nm := utils.Ternary[int](nl%4 == 0, 1, 4)
var rewardIds = make([]int64, 0, nl)
for i := 0; i < nm; i++ {
for _, reward := range rewards {
rewardIds = append(rewardIds, reward.ID)
}
}
groupMap := s._group(rewardIds, conf)
var list = make([]*model.FissionDiceMap, 0, 30)
for {
if len(list) >= 120 {
break
}
for _, m := range groupMap {
var maps = make([]*model.FissionDiceMap, 0, 6)
maps = append(maps, withdefault.FissionDiceMap(&model.FissionDiceMap{
CampaignID: conf.CampaignID,
MarkType: mtype.FissionDiceMapMarkTypeNone,
DmgID: dmgId,
}))
for _, v := range m {
maps = append(maps, withdefault.FissionDiceMap(&model.FissionDiceMap{
CampaignID: conf.CampaignID,
MarkType: v.markType,
RewardID: v.rewardId,
DmgID: dmgId,
}))
}
if len(maps) == 6 {
list = append(list, maps...)
}
}
}
dmm := s.GetDao().FissionDiceMap
if err = dmm.WithContext(s.Ctx).Create(list...); err != nil {
err = s.BE().MysqlError(err)
return
}
return
}
type gm struct {
markType int8
rewardId int64
}
// 把奖品分成一组一组的
func (s *DiceMap) _group(rewardIds []int64, conf *model.FissionCampaignDice) []map[int]gm {
var idx int
var groupMap = make([]map[int]gm, len(rewardIds)/4)
var done = func() {
var one = map[int]gm{}
for i := 1; i <= 4; i++ {
one[i] = gm{markType: mtype.FissionDiceMapMarkTypeNormal, rewardId: rewardIds[idx]}
idx++
}
one[5] = gm{markType: utils.Ternary[int8](conf.RollAgain == mtype.Yes, mtype.FissionDiceMapMarkTypeChance, mtype.FissionDiceMapMarkTypeNone)}
groupMap = append(groupMap, one)
}
for {
if len(rewardIds) <= idx {
break
}
done()
}
return groupMap
}