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.

227 lines
5.3 KiB
Go

package campaign
import (
"joybuywork/internal/plugins/hashid"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_campaign"
"joybuywork/proto/go_proto/workerr"
)
type ChildStore struct {
logic.Logic
Req *pb.ChildStoreReq
Res *pb.ChildStoreRes
project *model.Project
otherReward []*model.FissionCampaignReward
otherRelateIds []int64
otherRelateMap map[int64]struct{}
}
func (s *ChildStore) Run() error {
return logic.Run(s)
}
func (s *ChildStore) Exec() (err error) {
err = s.depend()
if err != nil {
return
}
cpn, err := s.create()
if err != nil {
return
}
err = s.createConfig(cpn)
if err != nil {
return
}
err = s.createTask(cpn)
if err != nil {
return
}
err = s.createReward(cpn)
if err != nil {
return
}
return
}
func (s *ChildStore) depend() (err error) {
project, err := finder.Project(s.Ctx, s.Req.GetProjectId())
if err != nil {
return s.BE().CacheError(err)
}
if project == nil || project.IsDel == mtype.Yes {
return workerr.NotFound("project not found")
}
s.otherRelateMap = make(map[int64]struct{})
s.project = project
s.AddAfterRun(func() (err error) {
s.OL().User(s.Req.GetUserId(), s.Req.GetIp()).CampaignSave(s.Res.GetId(), s.Req)
return
})
return
}
// 创建活动
func (s *ChildStore) create() (cpn *model.FissionCampaign, err error) {
cpn = withdefault.FissionCampaign(&model.FissionCampaign{
FissionID: s.Req.GetFissionId(),
ProjectID: s.project.ID,
CreatorID: s.Req.GetUserId(),
Title: s.Req.GetTitle(),
Status: mtype.FissionCampaignStatusWait,
TStart: s.Req.GetStartTime(),
TEnd: s.Req.GetEndTime(),
Target: mtype.FissionCampaignConfigTargetChild,
ChildType: int8(s.Req.GetChildType()),
})
if s.Req.GetStartTime() == 0 {
cpn.Status = mtype.FissionCampaignStatusPub
}
m := s.GetDao().FissionCampaign
if err = m.WithContext(s.Ctx).Create(cpn); err != nil {
return nil, s.BE().MysqlError(err)
}
s.AddAfterRun(func() (err error) {
s.Res.Id = cpn.ID
s.Res.HashId = cpn.HashID
return
})
return
}
func (s *ChildStore) createConfig(cpn *model.FissionCampaign) (err error) {
conf := withdefault.FissionCampaignConfig(&model.FissionCampaignConfig{
CampaignID: cpn.ID,
PlayType: int8(s.Req.GetPlayType()),
RewardGroup: mtype.FissionRewardGroupNormal,
Target: mtype.FissionCampaignConfigTargetChild,
})
err = s.GetDao().FissionCampaignConfig.WithContext(s.Ctx).Create(conf)
if err != nil {
return s.BE().MysqlError(err)
}
return
}
func (s *ChildStore) createTask(cpn *model.FissionCampaign) (err error) {
// todo 创建超级任务
return
}
func (s *ChildStore) createReward(cpn *model.FissionCampaign) (err error) {
var add = s.otherReward
var addRules []*model.FissionCampaignRewardRule
var relateMap = s.otherRelateMap
var relateIds = s.otherRelateIds
for i, one := range s.Req.GetRewards() {
var step = int32(i) + 1
var id = hashid.IdBigint()
add = append(add, withdefault.FissionCampaignReward(&model.FissionCampaignReward{
ID: id,
CampaignID: cpn.ID,
Stock: one.GetStock(),
Sort: int32(i),
RewardType: mtype.FissionCampaignRewardTypeChild,
Step: step,
InviteNum: one.GetInviteNum(),
RewardNum: one.GetRewardNum(),
IsThank: int8(one.GetIsThank()),
Score: one.GetScore(),
SignDay: step,
CollectNum: one.GetCollectNum(),
IsSuper: int8(one.GetIsSuper()),
RewardID: one.GetRewardId(),
Odds: one.GetOdds(),
JumpURL: one.GetJumpUrl(),
HasRule: utils.Ternary[int8](one.GetCampaignLimit() > 0, mtype.Yes, mtype.No),
InitPercent: one.GetInitPercent(),
PropMark: one.GetPropMark(),
}))
if one.GetCampaignLimit() > 0 {
addRules = append(addRules, withdefault.FissionCampaignRewardRule(&model.FissionCampaignRewardRule{
CampaignID: cpn.ID,
RewardID: id,
CampaignLimit: one.GetCampaignLimit(),
}))
}
if _, ok := relateMap[one.GetRewardId()]; !ok && one.GetRewardId() > 0 {
relateMap[one.GetRewardId()] = struct{}{}
relateIds = append(relateIds, one.GetRewardId())
}
}
if len(add) == 0 {
return
}
m := s.GetDao().FissionCampaignReward
if err = m.WithContext(s.Ctx).Create(add...); err != nil {
err = s.BE().MysqlError(err)
return
}
var relates []*model.RewardRelated
for _, v := range relateIds {
relates = append(relates, withdefault.RewardRelated(&model.RewardRelated{
RewardID: v,
RelateID: cpn.ID,
RelateTable: s.GetDao().FissionCampaign.TableName(),
}))
}
relateM := s.GetDao().RewardRelated
if err = relateM.WithContext(s.Ctx).Create(relates...); err != nil {
err = s.BE().MysqlError(err)
return
}
if len(addRules) > 0 {
ruleM := s.GetDao().FissionCampaignRewardRule
err = ruleM.WithContext(s.Ctx).Create(addRules...)
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
return
}
// 其他形式的奖品追加
func (s *ChildStore) _otherAppendReward(reward *model.FissionCampaignReward) {
if _, ok := s.otherRelateMap[reward.RewardID]; !ok && reward.RewardID > 0 {
s.otherRelateMap[reward.RewardID] = struct{}{}
s.otherRelateIds = append(s.otherRelateIds, reward.RewardID)
}
s.otherReward = append(s.otherReward, reward)
}