package campaignnotice import ( "joybuywork/internal/consts" "joybuywork/internal/consts/ckey" "joybuywork/internal/repository/cache" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/repository/withdefault" "joybuywork/internal/service/provider/award" "joybuywork/internal/service/provider/cachecurd" "joybuywork/internal/service/provider/players" "joybuywork/internal/service/queue/types" "joybuywork/internal/utils" "joybuywork/internal/utils/logic" "time" ) type ChildInvite struct { logic.Logic Req *types.CampaignChildInvite } func (s *ChildInvite) Exec() (err error) { cpn, err := cache.NewCampaign(s.Ctx).FindById(s.Req.CampaignId) if err != nil { err = s.BE().CacheError(err) return } if cpn.Status != mtype.FissionCampaignStatusCancel { return } m := s.GetDao().FissionCampaignReward list, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID), m.IsDel.Eq(mtype.No)).Order(m.Step).Find() if err != nil { err = s.BE().MysqlError(err) return } l := len(list) var rankNum int64 switch l { case 7: rankNum = 10000 case 6: rankNum = 100 case 5: rankNum = 10 default: rankNum = int64(l) } ranker, err := cachecurd.NewRanker(s.Ctx, ckey.FissionChildRank(cpn.ID), cachecurd.SetChildBuild(cpn.ID, cpn.ChildType)) if err != nil { err = s.BE().CacheError(err) return } ranks, err := ranker.GetRank(rankNum) if err != nil { err = s.BE().CacheError(err) return } if len(ranks) == 0 { return } pcpn, err := cache.NewCampaign(s.Ctx).FindById(cpn.Pid) if err != nil { err = s.BE().CacheError(err) return } childUserCache := cache.NewFissionChildUser(s.Ctx) childUserM := s.GetDao().FissionChildUser for i, rank := range ranks { var idx = -1 user, _ := cache.NewFissionUser(s.Ctx, cpn.Pid).FindById(utils.StrToInt64(rank.UserId)) if i < 4 { idx = i } else if i < 10 { idx = 4 } else if i < 100 { idx = 5 } else if i < 10000 { idx = 6 } if idx == -1 { return } player, _ := childUserCache.FindByUniqIdx(user.ID, cpn.ID) if player == nil || player.RecordID > 0 { continue } reward := list[idx] var record *model.FissionRewardRecord record, _, _, err = award.NewAwardReward(s.Ctx, s.GetDao(), cpn.ProjectID, user).One(reward, true, award.RewardRecordChildId(player.CampaignID)) if err != nil { return } _, err = childUserM.WithContext(s.Ctx). Where(childUserM.ID.Eq(player.ID)). UpdateSimple( childUserM.LastDone.Value(time.Now().Unix()), childUserM.RewardID.Value(record.RewardID), childUserM.RecordID.Value(record.ID), ) if err != nil { err = s.BE().MysqlError(err) return } err = s.GetDao().FissionChildUserRecord.WithContext(s.Ctx).Create(withdefault.FissionChildUserRecord(&model.FissionChildUserRecord{ PCpnID: player.PCpnID, CampaignID: player.CampaignID, UserID: player.UserID, PlayerID: player.ID, ChildType: player.ChildType, Mark: mtype.FissionChildUserRecordSourceInvite, RecordID: record.ID, })) if err != nil { err = s.BE().MysqlError(err) return } _ = childUserCache.Clear(player) if reward.PropMark == mtype.FissionCampaignRewardPropMarkReward { continue } switch pcpn.FissionID { case consts.IdKeep: keepDog, _ := players.NewKeepDog(s.Ctx, user) _ = keepDog.ChildActive(reward.RewardNum, mtype.FissionCampaignChildTypeInvite) } } return }