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.

150 lines
3.5 KiB
Go

package campaignuser
import (
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_campaign_user"
"joybuywork/proto/go_proto/workerr"
)
type RewardUser struct {
logic.Logic
Req *pb.RewardUserReq
Res *pb.RewardUserRes
}
func (s *RewardUser) Run() error {
return logic.Run(s)
}
func (s *RewardUser) Exec() (err error) {
cpn, err := s.campaign()
if err != nil {
return
}
return s.rewardUser(cpn)
}
// 活动数据
func (s *RewardUser) campaign() (cpn *model.FissionCampaign, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignId(), s.Req.GetCampaignHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil || cpn.IsDel == mtype.Yes {
return nil, workerr.NotFound("campaign not found")
}
return
}
// 获取到奖品的用户
func (s *RewardUser) rewardUser(cpn *model.FissionCampaign) (err error) {
offset, limit := utils.PpDbLo(s.Req.GetPage(), s.Req.GetPerPage())
m, rewardM := s.GetDao().FissionUser.SubTable(cpn.ID), s.GetDao().FissionRewardRecord.SubTable(cpn.ID)
userList, total, err := m.WithContext(s.Ctx).
Join(rewardM, rewardM.UserID.EqCol(m.ID)).
Where(m.CampaignID.Eq(cpn.ID), rewardM.ID.IsNotNull(), rewardM.PropMark.Eq(mtype.FissionCampaignRewardPropMarkReward)).
FindByPage(offset, limit)
if err != nil {
return s.BE().MysqlError(err)
}
if total == 0 {
return
}
s.Res.Total = total
s.Res.List = make([]*pb.RewardUserRes_One, 0, len(userList))
var ids []int64
var parentIds []int64
var parentMap = make(map[int64]string)
for _, v := range userList {
ids = append(ids, v.ID)
parentMap[v.ID] = v.SubUserID
if _, ok := parentMap[v.ParentID]; !ok {
parentIds = append(parentIds, v.ParentID)
}
}
var rewardList []*model.FissionRewardRecord
rewardList, err = rewardM.WithContext(s.Ctx).Where(rewardM.UserID.In(ids...)).Find()
if err != nil {
return s.BE().MysqlError(err)
}
var rewardMap = make(map[int64][]*model.FissionRewardRecord)
for _, v := range rewardList {
rewardMap[v.UserID] = append(rewardMap[v.UserID], v)
}
statMap := s._statMap(ids)
if len(parentIds) > 0 {
s._parentMap(cpn.ID, parentIds, parentMap)
}
for _, v := range userList {
one := &pb.RewardUserRes_One{
SubUserId: v.SubUserID,
PsuId: "",
DirectNum: 0,
IndirectNum: 0,
Rewards: nil,
}
if psuId, ok := parentMap[v.ID]; ok {
one.PsuId = psuId
}
if stat, ok := statMap[v.ID]; ok && stat != nil {
one.DirectNum = stat.DirectNum
one.IndirectNum = stat.IndirectNum
}
if reward, ok := rewardMap[v.ID]; ok {
one.Rewards = make([]*pb.RewardUserRes_Reward, 0, len(reward))
for _, v1 := range reward {
one.Rewards = append(one.Rewards, &pb.RewardUserRes_Reward{
CreatedTime: v1.CreatedAt,
Title: v1.Title,
})
}
}
s.Res.List = append(s.Res.List, one)
}
return
}
// 统计数据
func (s *RewardUser) _statMap(userIds []int64) map[int64]*model.FissionUserStat {
m := s.GetDao().FissionUserStat
list, _ := m.WithContext(s.Ctx).Where(m.UserID.In(userIds...)).Find()
var data = make(map[int64]*model.FissionUserStat)
for _, v := range list {
data[v.UserID] = v
}
return data
}
// 上级数据
func (s *RewardUser) _parentMap(cpnId int64, userIds []int64, data map[int64]string) {
m := s.GetDao().FissionUser.SubTable(cpnId)
list, _ := m.WithContext(s.Ctx).Where(m.ID.In(userIds...)).Find()
for _, v := range list {
data[v.ID] = v.SubUserID
}
return
}