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

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
}