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.
248 lines
5.6 KiB
Go
248 lines
5.6 KiB
Go
package campaignuser
|
|
|
|
import (
|
|
"joybuywork/internal/consts"
|
|
"joybuywork/internal/repository/cache"
|
|
"joybuywork/internal/repository/finder"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/utils"
|
|
"joybuywork/internal/utils/logic"
|
|
"joybuywork/internal/utils/timez"
|
|
"joybuywork/internal/utils/verify"
|
|
pb "joybuywork/proto/go_proto/w_campaign_user"
|
|
|
|
"gorm.io/gen"
|
|
)
|
|
|
|
type ChildList struct {
|
|
logic.Logic
|
|
Req *pb.ChildListReq
|
|
Res *pb.ChildListRes
|
|
}
|
|
|
|
func (s *ChildList) Run() error {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *ChildList) Exec() (err error) {
|
|
cpn, err := s.campaign()
|
|
if err != nil || cpn == nil {
|
|
return
|
|
}
|
|
|
|
return s.list(cpn)
|
|
}
|
|
|
|
func (s *ChildList) campaign() (cpn *model.FissionCampaign, err error) {
|
|
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignHashId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if cpn == nil || cpn.IsDel == mtype.Yes {
|
|
return
|
|
}
|
|
|
|
tz := utils.STernary[int32](s.Req.GetTOffset(), consts.DefaultTz, cpn.TOffset)
|
|
|
|
s.Req.Start = timez.GMT(s.Req.Start, tz)
|
|
s.Req.End = timez.GMT(s.Req.End, tz)
|
|
|
|
s.Res.ChildType = int32(cpn.ChildType)
|
|
s.Res.TOffset = tz
|
|
|
|
return
|
|
}
|
|
|
|
// 用户信息
|
|
func (s *ChildList) list(cpn *model.FissionCampaign) (err error) {
|
|
list, total, err := s._find(cpn)
|
|
|
|
if err != nil || total == 0 {
|
|
return
|
|
}
|
|
|
|
s.Res.List = make([]*pb.ChildListRes_One, 0, len(list))
|
|
s.Res.Total = total
|
|
|
|
var playerIds, userIds []int64
|
|
var userMap = make(map[int64]string)
|
|
for _, v := range list {
|
|
|
|
playerIds = append(playerIds, v.ID)
|
|
|
|
if _, ok := userMap[v.UserID]; !ok && v.UserID > 0 {
|
|
userIds = append(userIds, v.UserID)
|
|
userMap[v.UserID] = ""
|
|
}
|
|
|
|
if _, ok := userMap[v.ParentID]; !ok && v.ParentID > 0 {
|
|
userIds = append(userIds, v.UserID)
|
|
userMap[v.ParentID] = ""
|
|
}
|
|
|
|
}
|
|
|
|
err = s._userMap(cpn.Pid, userIds, userMap)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
childData, err := s._child(cpn.ID, cpn.ChildType, playerIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
one := &pb.ChildListRes_One{
|
|
Id: v.ID,
|
|
JoinAt: v.JoinTime,
|
|
SubUserId: userMap[v.UserID],
|
|
Parent: userMap[v.ParentID],
|
|
}
|
|
|
|
switch cpn.ChildType {
|
|
case mtype.FissionCampaignChildTypeBlind:
|
|
one.Blind = &pb.ChildListRes_Num{Num: childData[v.ID]}
|
|
case mtype.FissionCampaignChildTypeInvite:
|
|
one.Invite = &pb.ChildListRes_Num{Num: childData[v.ID]}
|
|
case mtype.FissionCampaignChildTypeSign:
|
|
one.Sign = &pb.ChildListRes_Num{Num: childData[v.ID]}
|
|
case mtype.FissionCampaignChildTypeLucky:
|
|
one.Lottery = &pb.ChildListRes_Num{Num: childData[v.ID]}
|
|
case mtype.FissionCampaignChildTypeTask:
|
|
|
|
}
|
|
|
|
s.Res.List = append(s.Res.List, one)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 找数据
|
|
func (s *ChildList) _find(cpn *model.FissionCampaign) (list []*model.FissionChildUser, total int64, err error) {
|
|
m := s.GetDao().FissionChildUser
|
|
var cond = []gen.Condition{
|
|
m.CampaignID.Eq(cpn.ID),
|
|
m.JoinTime.Gt(0),
|
|
}
|
|
|
|
if !verify.EmptyString(s.Req.GetUserMark()) {
|
|
|
|
var user *model.FissionUser
|
|
user, err = cache.NewFissionUser(s.Ctx, cpn.ID).FindBySubUserId(s.Req.GetUserMark())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if user == nil {
|
|
cond = append(cond, m.ID.Eq(-1))
|
|
} else {
|
|
cond = append(cond, m.UserID.Eq(user.ID))
|
|
}
|
|
|
|
}
|
|
|
|
if s.Req.GetStart() > 0 {
|
|
cond = append(cond, m.JoinTime.Gte(s.Req.GetStart()))
|
|
}
|
|
|
|
if s.Req.GetEnd() > 0 {
|
|
cond = append(cond, m.JoinTime.Lte(s.Req.GetEnd()))
|
|
}
|
|
|
|
if s.Req.GetPidType() == 0 && s.Req.GetParentUserMark() != "" {
|
|
var puser *model.FissionUser
|
|
puser, err = cache.NewFissionUser(s.Ctx, cpn.ID).FindBySubUserId(s.Req.GetParentUserMark())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if puser == nil {
|
|
cond = append(cond, m.ID.Eq(-1))
|
|
} else {
|
|
cond = append(cond, m.ParentID.Eq(puser.ID))
|
|
}
|
|
}
|
|
|
|
if s.Req.GetPidType() != 0 {
|
|
switch s.Req.GetPidType() {
|
|
case 1:
|
|
cond = append(cond, m.ParentID.Gt(0))
|
|
case 2:
|
|
cond = append(cond, m.ParentID.Eq(0))
|
|
}
|
|
}
|
|
|
|
offset, limit := utils.PpDbLo(s.Req.GetPage(), s.Req.GetPerPage())
|
|
list, total, err = m.WithContext(s.Ctx).Where(cond...).Order(m.JoinTime.Desc()).FindByPage(offset, limit)
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
type childListNum struct {
|
|
PlayerId int64
|
|
Num int64
|
|
}
|
|
|
|
// 用户数据
|
|
func (s *ChildList) _child(cpnId int64, childType int8, ids []int64) (childData map[int64]int64, err error) {
|
|
childData = make(map[int64]int64, len(ids))
|
|
|
|
var mark string
|
|
switch childType {
|
|
case mtype.FissionCampaignChildTypeBlind:
|
|
mark = mtype.FissionChildUserRecordSourceBlind
|
|
case mtype.FissionCampaignChildTypeInvite:
|
|
mark = mtype.FissionChildUserRecordSourceInviteOne
|
|
case mtype.FissionCampaignChildTypeSign:
|
|
mark = mtype.FissionChildUserRecordSourceSign
|
|
case mtype.FissionCampaignChildTypeLucky:
|
|
mark = mtype.FissionChildUserRecordSourceLucky
|
|
case mtype.FissionCampaignChildTypeTask:
|
|
|
|
}
|
|
|
|
m := s.GetDao().FissionChildUserRecord
|
|
var nums []*childListNum
|
|
err = m.WithContext(s.Ctx).Select(m.PlayerID, m.ID.Count().As("num")).
|
|
Where(m.CampaignID.Eq(cpnId), m.PlayerID.In(ids...), m.Mark.Eq(mark)).
|
|
Group(m.PlayerID).
|
|
Scan(&nums)
|
|
|
|
for _, num := range nums {
|
|
childData[num.PlayerId] = num.Num
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 用户数据
|
|
func (s *ChildList) _userMap(cpnId int64, ids []int64, userMap map[int64]string) (err error) {
|
|
if len(ids) == 0 {
|
|
return
|
|
}
|
|
m := s.GetDao().FissionUser.SubTable(cpnId)
|
|
|
|
//找上级数据
|
|
userList, err := m.WithContext(s.Ctx).Where(m.ID.In(ids...)).Find()
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
for _, v := range userList {
|
|
userMap[v.ID] = v.UserMark
|
|
}
|
|
|
|
return
|
|
}
|