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
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)
|
|
}
|