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.
223 lines
5.2 KiB
Go
223 lines
5.2 KiB
Go
package campaignuser
|
|
|
|
import (
|
|
"joybuywork/internal/repository/dbcheck"
|
|
"joybuywork/internal/repository/finder"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/repository/withdefault"
|
|
"joybuywork/internal/service/provider"
|
|
"joybuywork/internal/utils/logic"
|
|
pb "joybuywork/proto/go_proto/w_campaign_user"
|
|
"joybuywork/proto/go_proto/workerr"
|
|
)
|
|
|
|
type MixReward struct {
|
|
logic.Logic
|
|
Req *pb.MixRewardReq
|
|
Res *pb.MixRewardRes
|
|
|
|
taskChance int32
|
|
}
|
|
|
|
func (s *MixReward) Run() error {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *MixReward) Exec() (err error) {
|
|
user, err := s.user()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
if user.IsView == mtype.Yes {
|
|
return s.viewMix(user)
|
|
}
|
|
|
|
err = s.mix(user)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *MixReward) user() (user *model.FissionUser, err error) {
|
|
cpn, err := finder.Campaign(s.Ctx, s.Req.GetCampaignId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if cpn == nil || cpn.IsDel == mtype.Yes {
|
|
err = workerr.NotFound("not found cpn")
|
|
return
|
|
}
|
|
|
|
user, err = finder.FissionUser(s.Ctx, cpn.ID, s.Req.GetUserId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if user == nil {
|
|
err = workerr.NotFound("not found user")
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 普通用户的合成
|
|
func (s *MixReward) mix(user *model.FissionUser) (err error) {
|
|
m := s.GetDao().FissionDiceCollect
|
|
collect, err := m.WithContext(s.Ctx).Where(m.UserID.Eq(user.ID), m.RewardID.Eq(s.Req.GetRewardId())).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if collect == nil || collect.RecordID == 0 {
|
|
return
|
|
}
|
|
|
|
rewardM := s.GetDao().FissionCampaignReward
|
|
reward, err := rewardM.WithContext(s.Ctx).Where(rewardM.ID.Eq(collect.RewardID)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
// 完整度+1
|
|
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(collect.ID)).UpdateSimple(m.IntactNum.Add(1), m.Num.Sub(reward.CollectNum), m.RecordID.Value(0))
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
recordM := s.GetDao().FissionRewardRecord.SubTable(user.CampaignID)
|
|
record, err := recordM.WithContext(s.Ctx).Where(recordM.ID.Eq(collect.RecordID)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
var lack bool
|
|
if record.FailType == mtype.FissionRewardRecordFailTypeCli && record.FailMsg == mtype.FissionRewardRecordFailTypeCliLackMsg {
|
|
lack = true
|
|
}
|
|
|
|
// 骰子记录
|
|
var diceRecord = withdefault.FissionDiceRecord(&model.FissionDiceRecord{
|
|
CreatedAt: record.CreatedAt,
|
|
CampaignID: user.CampaignID,
|
|
UserID: user.ID,
|
|
Mark: mtype.FissionDiceRecordMarkReward,
|
|
Data: "",
|
|
})
|
|
|
|
diceRecord.SetData(&mtype.DiceRecord{
|
|
RewardId: record.RewardID,
|
|
RecordId: record.ID,
|
|
})
|
|
|
|
err = s.GetDao().FissionDiceRecord.WithContext(s.Ctx).Create(diceRecord)
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
cpn, err := finder.Campaign(s.Ctx, user.CampaignID)
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, record.BaseRewardID)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
info, _ := preward.InfoAutoLang(record.BaseRewardID, user.LangMark)
|
|
|
|
s.AddAfterRun(func() (err error) {
|
|
s.Res.Lack = lack
|
|
s.Res.RewardId = record.RewardID
|
|
s.Res.RewardTitle = info.Title
|
|
s.Res.ImgUrl = info.ImgUrl
|
|
s.Res.ReceiveType = info.ReceiveType
|
|
s.Res.Contact = info.Contact
|
|
s.Res.KvData = make([]*pb.MixRewardRes_KV, 0, len(info.KvData))
|
|
s.Res.RewardHashId = record.HashID
|
|
s.Res.OpenToUse = info.OpenToUse
|
|
s.Res.WebUrl = info.WebUrl
|
|
s.Res.AppParam = info.AppParam
|
|
s.Res.PcParam = info.PcParam
|
|
|
|
for _, v := range info.KvData {
|
|
s.Res.KvData = append(s.Res.KvData, &pb.MixRewardRes_KV{
|
|
Key: v.Key,
|
|
Value: v.Value,
|
|
})
|
|
}
|
|
|
|
return
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
// 预览用户的合成
|
|
func (s *MixReward) viewMix(user *model.FissionUser) (err error) {
|
|
m := s.GetDao().FissionDiceCollect
|
|
collect, err := m.WithContext(s.Ctx).Where(m.UserID.Eq(user.ID), m.RewardID.Eq(s.Req.GetRewardId())).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
rewardM := s.GetDao().FissionCampaignReward
|
|
reward, err := rewardM.WithContext(s.Ctx).Where(rewardM.ID.Eq(collect.RewardID)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
cpn, err := finder.Campaign(s.Ctx, user.CampaignID)
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, reward.RewardID)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
info, _ := preward.InfoAutoLang(reward.RewardID, user.LangMark)
|
|
|
|
s.AddAfterRun(func() (err error) {
|
|
s.Res.RewardId = reward.RewardID
|
|
s.Res.RewardTitle = info.Title
|
|
s.Res.ImgUrl = info.ImgUrl
|
|
s.Res.ReceiveType = info.ReceiveType
|
|
s.Res.Contact = info.Contact
|
|
s.Res.KvData = make([]*pb.MixRewardRes_KV, 0, len(info.KvData))
|
|
s.Res.OpenToUse = info.OpenToUse
|
|
s.Res.WebUrl = info.WebUrl
|
|
s.Res.AppParam = info.AppParam
|
|
s.Res.PcParam = info.PcParam
|
|
|
|
for _, v := range info.KvData {
|
|
s.Res.KvData = append(s.Res.KvData, &pb.MixRewardRes_KV{
|
|
Key: v.Key,
|
|
Value: v.Value,
|
|
})
|
|
}
|
|
|
|
return
|
|
})
|
|
|
|
return
|
|
}
|