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.
369 lines
8.5 KiB
Go
369 lines
8.5 KiB
Go
package campaignuser
|
|
|
|
import (
|
|
"joybuywork/internal/consts"
|
|
"joybuywork/internal/repository/dbcheck"
|
|
"joybuywork/internal/repository/finder"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/service/provider"
|
|
"joybuywork/internal/utils"
|
|
"joybuywork/internal/utils/logic"
|
|
"joybuywork/internal/utils/timez"
|
|
"joybuywork/internal/utils/verify"
|
|
pb "joybuywork/proto/go_proto/w_campaign_user"
|
|
"joybuywork/proto/go_proto/workerr"
|
|
"fmt"
|
|
"time"
|
|
|
|
"gorm.io/gen"
|
|
)
|
|
|
|
type Reward struct {
|
|
logic.Logic
|
|
Req *pb.RewardReq
|
|
Res *pb.RewardRes
|
|
|
|
langMark string
|
|
}
|
|
|
|
func (s *Reward) Run() error {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *Reward) Exec() (err error) {
|
|
cpn, err := s.campaign()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return s.reward(cpn)
|
|
}
|
|
|
|
// 活动数据
|
|
func (s *Reward) 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")
|
|
}
|
|
|
|
tz := utils.STernary(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.TOffset = tz
|
|
|
|
return
|
|
}
|
|
|
|
// 奖品处理
|
|
func (s *Reward) reward(cpn *model.FissionCampaign) (err error) {
|
|
|
|
subCpnId, cond, err := s._findCond(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
m := s.GetDao().FissionRewardRecord.SubTable(subCpnId)
|
|
offset, limit := utils.PpDbLo(s.Req.GetPage(), s.Req.GetPerPage())
|
|
list, total, err := m.WithContext(s.Ctx).Where(cond...).Order(m.ID.Desc()).FindByPage(offset, limit)
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
s.Res.Total = total
|
|
s.Res.List = make([]*pb.RewardRes_One, 0, len(list))
|
|
|
|
if total == 0 {
|
|
return
|
|
}
|
|
|
|
var rewardIds []int64
|
|
var rewardKvMap = make(map[int64][]*mtype.KV)
|
|
var userIds []int64
|
|
var userMap = make(map[int64]string)
|
|
var brewardIds []int64
|
|
var brewardMap = make(map[int64]*provider.RewardInfo)
|
|
var childIds []int64
|
|
var childMap = make(map[int64]string)
|
|
for _, v := range list {
|
|
if _, ok := userMap[v.UserID]; !ok {
|
|
userIds = append(userIds, v.UserID)
|
|
userMap[v.UserID] = ""
|
|
}
|
|
|
|
if v.BaseRewardID == 0 {
|
|
if _, ok := rewardKvMap[v.RewardID]; !ok {
|
|
rewardKvMap[v.RewardID] = nil
|
|
rewardIds = append(rewardIds, v.RewardID)
|
|
}
|
|
} else {
|
|
if _, ok := brewardMap[v.BaseRewardID]; !ok {
|
|
brewardMap[v.BaseRewardID] = nil
|
|
brewardIds = append(brewardIds, v.BaseRewardID)
|
|
}
|
|
}
|
|
|
|
if _, ok := childMap[v.ChildID]; !ok && v.ChildID > 0 {
|
|
childIds = append(childIds, v.ChildID)
|
|
childMap[v.ChildID] = ""
|
|
}
|
|
}
|
|
|
|
err = s._fillChildMap(childIds, childMap)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s._fillUserMap(subCpnId, userIds, userMap)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
if len(rewardIds) > 0 {
|
|
err = s._rewardKv(rewardIds, rewardKvMap)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
var preward *provider.Rewards
|
|
if len(brewardIds) > 0 {
|
|
preward, err = provider.NewRewards(s.Ctx, cpn.ID, brewardIds...)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
brList, err1 := preward.InfoList()
|
|
if err1 != nil {
|
|
err = err1
|
|
return
|
|
}
|
|
|
|
for _, info := range brList {
|
|
brewardMap[info.Id] = info
|
|
}
|
|
|
|
}
|
|
|
|
for _, v := range list {
|
|
|
|
var title = v.Title
|
|
|
|
if verify.InArray(cpn.FissionID, consts.IdWinTogether, consts.IdReferral) {
|
|
title = fmt.Sprintf("%d %s", v.RewardNum, v.Title)
|
|
}
|
|
|
|
one := &pb.RewardRes_One{
|
|
SubUserId: userMap[v.UserID],
|
|
CreatedTime: v.CreatedAt,
|
|
Title: title,
|
|
KvData: nil,
|
|
Img: v.ImgURL,
|
|
IsPush: utils.Ternary[bool](v.Status == mtype.FissionRewardRecordStatusSuccess, true, false),
|
|
Id: v.ID,
|
|
HashId: v.HashID,
|
|
Status: int32(v.Status),
|
|
FailType: v.FailType,
|
|
FailMsg: v.FailMsg,
|
|
RewardTitle: title,
|
|
RewardId: v.RewardID,
|
|
CustomRewardVal: v.CustomRewardVal,
|
|
RewardType: int32(v.RewardType),
|
|
ChildTitle: childMap[v.ChildID],
|
|
PropMark: v.PropMark,
|
|
ChanceMark: consts.FissionPropMark[cpn.FissionID],
|
|
RewardNum: v.RewardNum,
|
|
}
|
|
|
|
if v.Status == mtype.FissionRewardRecordStatusWait && v.CreatedAt+consts.DaySec <= time.Now().Unix() {
|
|
one.Status = mtype.FissionRewardRecordStatusFail
|
|
one.FailType = mtype.FissionRewardRecordFailTypeSys
|
|
one.FailMsg = mtype.FissionRewardRecordFailTypeLongTime
|
|
}
|
|
|
|
if kvs, ok := rewardKvMap[v.RewardID]; ok && kvs != nil {
|
|
one.KvData = make([]*pb.RewardRes_KV, 0, len(kvs))
|
|
for _, v1 := range kvs {
|
|
one.KvData = append(one.KvData, &pb.RewardRes_KV{
|
|
Key: v1.Key,
|
|
Value: v1.Value,
|
|
})
|
|
}
|
|
}
|
|
|
|
if info, ok := brewardMap[v.BaseRewardID]; ok && info != nil {
|
|
one.RewardTitle = info.RewardTitle
|
|
one.ReceiveType = info.ReceiveType
|
|
one.Contact = info.Contact
|
|
one.KvData = make([]*pb.RewardRes_KV, 0, len(info.KvData))
|
|
one.DyRewardType = info.DyRewardType
|
|
for _, v1 := range info.KvData {
|
|
one.KvData = append(one.KvData, &pb.RewardRes_KV{
|
|
Key: v1.Key,
|
|
Value: v1.Value,
|
|
IsShow: v1.IsShow,
|
|
})
|
|
}
|
|
|
|
if s.langMark != "" && preward != nil {
|
|
lang := preward.AutoLang(info.Id, s.langMark)
|
|
one.Title = lang.Title
|
|
one.Img = lang.ImgUrl
|
|
one.OpenToUse = lang.OpenToUse
|
|
one.WebUrl = lang.WebUrl
|
|
one.AppParam = lang.AppParam
|
|
one.PcParam = lang.PcParam
|
|
}
|
|
}
|
|
|
|
s.Res.List = append(s.Res.List, one)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *Reward) _findCond(cpn *model.FissionCampaign) (subCpnId int64, cond []gen.Condition, err error) {
|
|
|
|
subCpnId = cpn.ID
|
|
if s.Req.GetIsChild() == mtype.Yes {
|
|
subCpnId = cpn.Pid
|
|
}
|
|
|
|
m := s.GetDao().FissionRewardRecord.SubTable(subCpnId)
|
|
|
|
if s.Req.GetIsChild() == mtype.Yes {
|
|
cond = append(cond, m.CampaignID.Eq(subCpnId), m.ChildID.Eq(cpn.ID))
|
|
} else {
|
|
cond = append(
|
|
cond,
|
|
m.CampaignID.Eq(subCpnId),
|
|
m.PropMark.Eq(mtype.FissionCampaignRewardPropMarkReward),
|
|
)
|
|
}
|
|
|
|
if s.Req.GetFuserId() > 0 {
|
|
cond = append(cond, m.UserID.Eq(s.Req.GetFuserId()))
|
|
|
|
var user *model.FissionUser
|
|
user, err = finder.FissionUser(s.Ctx, subCpnId, s.Req.GetFuserId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
if user != nil {
|
|
s.langMark = user.LangMark
|
|
}
|
|
}
|
|
|
|
if len(s.Req.GetStatus()) > 0 {
|
|
var status = make([]int8, 0, len(s.Req.GetStatus()))
|
|
for _, v := range s.Req.GetStatus() {
|
|
status = append(status, int8(v))
|
|
}
|
|
|
|
cond = append(cond, m.Status.In(status...))
|
|
}
|
|
|
|
if s.Req.GetStart() > 0 {
|
|
cond = append(cond, m.CreatedAt.Gte(s.Req.GetStart()))
|
|
}
|
|
|
|
if s.Req.GetEnd() > 0 {
|
|
cond = append(cond, m.CreatedAt.Lte(s.Req.GetEnd()))
|
|
}
|
|
|
|
if !verify.EmptyString(s.Req.GetUserMark()) {
|
|
var userId int64
|
|
var user *model.FissionUser
|
|
userM := s.GetDao().FissionUser.SubTable(subCpnId)
|
|
user, err = userM.WithContext(s.Ctx).Where(userM.CampaignID.Eq(subCpnId), userM.UserMark.Eq(s.Req.GetUserMark())).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if user != nil {
|
|
userId = user.ID
|
|
}
|
|
|
|
cond = append(cond, m.UserID.Eq(userId))
|
|
}
|
|
|
|
if !verify.EmptyString(s.Req.GetRewardTitle()) {
|
|
rewardM := s.GetDao().Reward
|
|
var ids []int64
|
|
err = rewardM.WithContext(s.Ctx).Where(
|
|
rewardM.ProjectID.Eq(cpn.ProjectID),
|
|
rewardM.RewardTitle.Like(utils.DbAllLike(s.Req.GetRewardTitle())),
|
|
rewardM.IsDel.Eq(mtype.No),
|
|
).Pluck(rewardM.ID, &ids)
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
cond = append(cond, m.BaseRewardID.In(ids...))
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 填充活动用户信息
|
|
func (s *Reward) _fillUserMap(cpnId int64, userIds []int64, userMap map[int64]string) (err error) {
|
|
if len(userIds) == 0 {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().FissionUser.SubTable(cpnId)
|
|
|
|
list, err := m.WithContext(s.Ctx).Where(m.ID.In(userIds...)).Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
for _, v := range list {
|
|
userMap[v.ID] = v.UserMark
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 填充子活动信息
|
|
func (s *Reward) _fillChildMap(childIds []int64, childMap map[int64]string) (err error) {
|
|
if len(childIds) == 0 {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().FissionCampaign
|
|
|
|
list, err := m.WithContext(s.Ctx).Where(m.ID.In(childIds...)).Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
for _, v := range list {
|
|
childMap[v.ID] = v.Title
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *Reward) _rewardKv(rewardIds []int64, data map[int64][]*mtype.KV) (err error) {
|
|
m := s.GetDao().FissionCampaignReward
|
|
rewards, err := m.WithContext(s.Ctx).Where(m.ID.In(rewardIds...)).Find()
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
for _, v := range rewards {
|
|
data[v.ID] = v.GetKvData()
|
|
}
|
|
|
|
return
|
|
}
|