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
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
|
|
}
|