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.
528 lines
12 KiB
Go
528 lines
12 KiB
Go
package campaignuser
|
|
|
|
import (
|
|
"joybuywork/internal/app"
|
|
"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"
|
|
|
|
pb "joybuywork/proto/go_proto/w_campaign_user"
|
|
)
|
|
|
|
type LotteryLog struct {
|
|
logic.Logic
|
|
Req *pb.LotteryLogReq
|
|
Res *pb.LotteryLogRes
|
|
}
|
|
|
|
func (s *LotteryLog) Run() error {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *LotteryLog) Exec() (err error) {
|
|
cpn, err := s.cpn()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.list(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) cpn() (cpn *model.FissionCampaign, err error) {
|
|
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignHashId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) list(cpn *model.FissionCampaign) (err error) {
|
|
switch cpn.FissionID {
|
|
case consts.IdPrizeWheel:
|
|
return s.wheel(cpn)
|
|
case consts.IdFlip:
|
|
return s.flip(cpn)
|
|
case consts.IdBlindBox:
|
|
return s.blind(cpn)
|
|
case consts.IdLuckyGrid:
|
|
return s.grid(cpn)
|
|
case consts.IdSlotMachine:
|
|
return s.slot(cpn)
|
|
case consts.IdGashapon:
|
|
return s.gashapon(cpn)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) gashapon(cpn *model.FissionCampaign) (err error) {
|
|
m := s.GetDao().FissionGashaponLog
|
|
var list []*model.FissionGashaponLog
|
|
total, err := s._find(m.TableName(), cpn.ID, &list)
|
|
if err != nil || total == 0 {
|
|
return
|
|
}
|
|
|
|
s.Res.Total = total
|
|
|
|
var taskIds, rewardIds []int64
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
|
|
taskTitle, err := s._taskTitle(taskIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
rewardTitle, err := s._rewardTitle(rewardIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
s.Res.List = append(s.Res.List, &pb.LotteryLogRes_One{
|
|
Id: v.ID,
|
|
CreatedAt: v.CreatedAt,
|
|
Type: int32(v.Type),
|
|
Source: v.Source,
|
|
TaskTitle: taskTitle[val.TaskId],
|
|
RewardTitle: rewardTitle[val.RewardId],
|
|
Chance: val.Chance,
|
|
PointsUseNum: val.PointsNum,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) slot(cpn *model.FissionCampaign) (err error) {
|
|
m := s.GetDao().FissionSlotLog
|
|
var list []*model.FissionSlotLog
|
|
total, err := s._find(m.TableName(), cpn.ID, &list)
|
|
if err != nil || total == 0 {
|
|
return
|
|
}
|
|
|
|
s.Res.Total = total
|
|
|
|
var taskIds, rewardIds []int64
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
|
|
taskTitle, err := s._taskTitle(taskIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
rewardTitle, err := s._rewardTitle(rewardIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
s.Res.List = append(s.Res.List, &pb.LotteryLogRes_One{
|
|
Id: v.ID,
|
|
CreatedAt: v.CreatedAt,
|
|
Type: int32(v.Type),
|
|
Source: v.Source,
|
|
TaskTitle: taskTitle[val.TaskId],
|
|
RewardTitle: rewardTitle[val.RewardId],
|
|
Chance: val.Chance,
|
|
PointsUseNum: val.PointsNum,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) grid(cpn *model.FissionCampaign) (err error) {
|
|
m := s.GetDao().FissionGridLog
|
|
var list []*model.FissionGridLog
|
|
total, err := s._find(m.TableName(), cpn.ID, &list)
|
|
if err != nil || total == 0 {
|
|
return
|
|
}
|
|
|
|
s.Res.Total = total
|
|
|
|
var taskIds, rewardIds []int64
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
|
|
taskTitle, err := s._taskTitle(taskIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
rewardTitle, err := s._rewardTitle(rewardIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
s.Res.List = append(s.Res.List, &pb.LotteryLogRes_One{
|
|
Id: v.ID,
|
|
CreatedAt: v.CreatedAt,
|
|
Type: int32(v.Type),
|
|
Source: v.Source,
|
|
TaskTitle: taskTitle[val.TaskId],
|
|
RewardTitle: rewardTitle[val.RewardId],
|
|
Chance: val.Chance,
|
|
PointsUseNum: val.PointsNum,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) blind(cpn *model.FissionCampaign) (err error) {
|
|
m := s.GetDao().FissionBlindLog
|
|
var list []*model.FissionBlindLog
|
|
total, err := s._find(m.TableName(), cpn.ID, &list)
|
|
if err != nil || total == 0 {
|
|
return
|
|
}
|
|
|
|
s.Res.Total = total
|
|
|
|
var taskIds, rewardIds []int64
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
|
|
taskTitle, err := s._taskTitle(taskIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
rewardTitle, err := s._rewardTitle(rewardIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
s.Res.List = append(s.Res.List, &pb.LotteryLogRes_One{
|
|
Id: v.ID,
|
|
CreatedAt: v.CreatedAt,
|
|
Type: int32(v.Type),
|
|
Source: v.Source,
|
|
TaskTitle: taskTitle[val.TaskId],
|
|
RewardTitle: rewardTitle[val.RewardId],
|
|
Chance: val.Chance,
|
|
PointsUseNum: val.PointsNum,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) flip(cpn *model.FissionCampaign) (err error) {
|
|
m := s.GetDao().FissionFlipLog
|
|
var list []*model.FissionFlipLog
|
|
total, err := s._find(m.TableName(), cpn.ID, &list)
|
|
if err != nil || total == 0 {
|
|
return
|
|
}
|
|
|
|
s.Res.Total = total
|
|
|
|
var taskIds, rewardIds []int64
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
|
|
taskTitle, err := s._taskTitle(taskIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
rewardTitle, err := s._rewardTitle(rewardIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
s.Res.List = append(s.Res.List, &pb.LotteryLogRes_One{
|
|
Id: v.ID,
|
|
CreatedAt: v.CreatedAt,
|
|
Type: int32(v.Type),
|
|
Source: v.Source,
|
|
TaskTitle: taskTitle[val.TaskId],
|
|
RewardTitle: rewardTitle[val.RewardId],
|
|
Chance: val.Chance,
|
|
PointsUseNum: val.PointsNum,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) wheel(cpn *model.FissionCampaign) (err error) {
|
|
m := s.GetDao().FissionPrizeWheelLog
|
|
var list []*model.FissionPrizeWheelLog
|
|
total, err := s._find(m.TableName(), cpn.ID, &list)
|
|
if err != nil || total == 0 {
|
|
return
|
|
}
|
|
|
|
s.Res.Total = total
|
|
|
|
var taskIds, rewardIds []int64
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
switch v.Source {
|
|
case mtype.FissionLogSourceLottery:
|
|
rewardIds = append(rewardIds, val.RewardId)
|
|
case mtype.FissionLogSourceCondOne, mtype.FissionLogSourceManualCondOne:
|
|
taskIds = append(taskIds, val.TaskId)
|
|
}
|
|
}
|
|
|
|
taskTitle, err := s._taskTitle(taskIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
rewardTitle, err := s._rewardTitle(rewardIds)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
val := v.GetVal()
|
|
s.Res.List = append(s.Res.List, &pb.LotteryLogRes_One{
|
|
Id: v.ID,
|
|
CreatedAt: v.CreatedAt,
|
|
Type: int32(v.Type),
|
|
Source: v.Source,
|
|
TaskTitle: taskTitle[val.TaskId],
|
|
RewardTitle: rewardTitle[val.RewardId],
|
|
Chance: val.Chance,
|
|
PointsUseNum: val.PointsNum,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) _find(tableName string, cpnId int64, list any) (total int64, err error) {
|
|
offset, limit := utils.PpDbLo(s.Req.GetPage(), s.Req.GetPerPage())
|
|
|
|
query := app.DB.Client.Table(tableName).WithContext(s.Ctx)
|
|
|
|
if s.Req.GetUserHashId() != "" || s.Req.GetSubUserId() != "" {
|
|
var user *model.FissionUser
|
|
if s.Req.GetUserHashId() != "" {
|
|
user, err = cache.NewFissionUser(s.Ctx, cpnId).FindByHashId(s.Req.GetUserHashId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
} else {
|
|
user, err = cache.NewFissionUser(s.Ctx, cpnId).FindBySubUserId(s.Req.GetSubUserId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
}
|
|
|
|
var userId int64
|
|
if user != nil {
|
|
userId = user.ID
|
|
}
|
|
|
|
query = query.Where("user_id = ?", userId)
|
|
}
|
|
|
|
if len(s.Req.GetSource()) != 0 {
|
|
query = query.Where("source in ?", s.Req.GetSource())
|
|
}
|
|
|
|
err = query.Count(&total).Error
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
err = query.Order("id desc").Offset(offset).Limit(limit).Find(list).Error
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) _taskTitle(ids []int64) (data map[int64]string, err error) {
|
|
data = make(map[int64]string, len(ids))
|
|
if len(ids) == 0 {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().FissionCampaignTask
|
|
list, err := m.WithContext(s.Ctx).Where(m.ID.In(ids...)).Find()
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
var condIds []int64
|
|
var taskMap = make(map[int64]int64)
|
|
for _, v := range list {
|
|
id := utils.FissionCampaignTaskMarkCondOneCondId(v.TaskMark)
|
|
condIds = append(condIds, id)
|
|
taskMap[v.ID] = id
|
|
}
|
|
|
|
condM := s.GetDao().FissionCampaignCond
|
|
conds, err := condM.WithContext(s.Ctx).Where(condM.ID.In(condIds...)).Find()
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
var condMap = make(map[int64]string, len(conds))
|
|
for _, v := range conds {
|
|
condMap[v.ID] = v.Desc
|
|
}
|
|
|
|
for _, v := range list {
|
|
data[v.ID] = condMap[taskMap[v.ID]]
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *LotteryLog) _rewardTitle(ids []int64) (data map[int64]string, err error) {
|
|
data = make(map[int64]string, len(ids))
|
|
if len(ids) == 0 {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().FissionCampaignReward
|
|
list, err := m.WithContext(s.Ctx).Where(m.ID.In(ids...)).Find()
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
var bids []int64
|
|
var titleMap = make(map[int64]string)
|
|
for _, v := range list {
|
|
if _, ok := titleMap[v.RewardID]; !ok {
|
|
bids = append(bids, v.RewardID)
|
|
titleMap[v.RewardID] = ""
|
|
}
|
|
}
|
|
|
|
rewardM := s.GetDao().Reward
|
|
rewards, err := rewardM.WithContext(s.Ctx).Where(rewardM.ID.In(bids...)).Find()
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
for _, v := range rewards {
|
|
titleMap[v.ID] = v.RewardTitle
|
|
}
|
|
|
|
for _, v := range list {
|
|
data[v.ID] = titleMap[v.RewardID]
|
|
}
|
|
|
|
return
|
|
}
|