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.

219 lines
5.3 KiB
Go

package cachecurd
import (
"joybuywork/internal/consts"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/dao"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/utils"
"joybuywork/internal/utils/lockdo"
"joybuywork/proto/go_proto/workerr"
"fmt"
)
const (
StockFieldStock = "stock" // 总库存
StockFieldUseStock = "use_stock" // 已使用
StockFieldPoolNum = "pool_num" // 奖品池使用
)
const (
tRewardSelectStock = "rewardSelectStock" // 奖品被选择的库存
tCampaignRewardStock = "campaignRewardStock" // 活动奖品库存
tCampaignStock = "campaignStock" // 活动库存
tMallItemStock = "mallItemStock" // 商城库存
)
// 奖品总预算情况
func (s *HMap) campaignStock(cond *HMapBuild) (err error) {
err = lockdo.ExistDo(s.ctx, s.key, func(exist bool) (err error) {
if exist {
return
}
var cpn *model.FissionCampaign
cpn, err = cache.NewCampaign(s.ctx).FindById(cond.CpnId)
if err != nil {
return
}
var rewardLimit int64
switch cpn.FissionID {
case consts.IdReferral:
var conf *model.FissionCampaignReferral
conf, err = cache.NewCampaignReferral(s.ctx).FindByCampaignId(cpn.ID)
if err != nil {
return
}
rewardLimit = int64(conf.RewardLimit)
case consts.IdWinTogether:
var conf *model.FissionCampaignWin
conf, err = cache.NewCampaignWin(s.ctx).FindByCampaignId(cpn.ID)
if err != nil {
return
}
rewardLimit = int64(conf.RewardLimit)
case consts.IdGold:
var conf *model.FissionCampaignGold
conf, err = cache.NewCampaignGold(s.ctx).FindByCampaignId(cpn.ID)
if err != nil {
return
}
rewardLimit = int64(conf.PriceNum)
case consts.IdCash:
var conf *model.FissionCampaignCash
conf, err = cache.NewCampaignCash(s.ctx).FindByCampaignId(cpn.ID)
if err != nil {
return
}
rewardLimit = int64(conf.PriceNum)
default:
return workerr.VerifyError("The fission is not be support")
}
var num int64
switch cpn.FissionID {
case consts.IdGold:
m := dao.FissionGoldLog
num, err = m.WithContext(s.ctx).
Where(m.CampaignID.Eq(cpn.ID), m.Type.Eq(mtype.FissionGoldLogTypeReward)).
Count()
if err != nil {
return
}
case consts.IdCash:
m := dao.FissionCashRecord
num, err = m.WithContext(s.ctx).
Where(m.CampaignID.Eq(cpn.ID), m.Type.Eq(mtype.FissionCashRecordTypeReward)).
Count()
if err != nil {
return
}
default:
var rewardNum struct {
Num int64 `json:"num"`
}
m := dao.FissionRewardRecord.SubTable(cond.CpnId)
err = m.WithContext(s.ctx).
Select(m.RewardNum.Sum().As("num")).
Where(m.CampaignID.Eq(cond.CpnId), m.RewardType.Eq(mtype.FissionCampaignRewardTypeApp)).
Scan(&rewardNum)
if err != nil {
return
}
num = rewardNum.Num
}
return s._setStock(rewardLimit, num, rewardLimit-num)
})
return
}
// 奖品发放库存情况
func (s *HMap) campaignRewardStock(cond *HMapBuild) (err error) {
err = lockdo.ExistDo(s.ctx, s.key, func(exist bool) (err error) {
if exist {
return
}
rewardId := cond.RewardId
rewardM := dao.FissionCampaignReward
reward, err := rewardM.WithContext(s.ctx).Where(rewardM.ID.Eq(rewardId)).Take()
if err != nil {
return
}
m := dao.FissionRewardRecord.SubTable(reward.CampaignID)
count, err := m.WithContext(s.ctx).Where(
m.RewardID.Eq(rewardId),
m.Status.Neq(mtype.FissionRewardRecordStatusFail),
).Count()
if err != nil {
return
}
return s._setStock(int64(reward.Stock), count, utils.Ternary[int64](reward.IsThank == mtype.Yes, -1, int64(reward.Stock)-count))
})
return
}
// 奖品选择库存情况
func (s *HMap) rewardSelectStock(cond *HMapBuild) (err error) {
err = lockdo.ExistDo(s.ctx, s.key, func(exist bool) (err error) {
if exist {
return
}
rewardId := cond.RewardId
rewardM := dao.FissionCampaignReward
reward, err := rewardM.WithContext(s.ctx).Where(rewardM.ID.Eq(rewardId)).Take()
if err != nil {
return
}
cpn, err := cache.NewCampaign(s.ctx).FindById(reward.CampaignID)
if err != nil {
return
}
var count int64
switch cpn.FissionID {
case consts.IdKeep:
m := dao.FissionKeep
count, err = m.WithContext(s.ctx).Where(
m.RewardID.Eq(rewardId),
m.CancelReward.Eq(mtype.No),
).Count()
if err != nil {
return
}
default:
return workerr.VerifyError("The fission is not be support")
}
return s._setStock(int64(reward.Stock), count, utils.Ternary[int64](reward.IsThank == mtype.Yes, -1, int64(reward.Stock)-count))
})
return
}
func (s *HMap) mallItemStock(cond *HMapBuild) (err error) {
err = lockdo.ExistDo(s.ctx, s.key, func(exist bool) (err error) {
if exist {
return
}
rewardId := cond.RewardId
rewardM := dao.RedeemMallItem
reward, err := rewardM.WithContext(s.ctx).Where(rewardM.ID.Eq(rewardId)).Take()
if err != nil {
return
}
m := dao.RedeemMallRecord
count, err := m.WithContext(s.ctx).Where(m.MallItemID.Eq(reward.ID)).Count()
if err != nil {
return
}
return s._setStock(reward.Stock, count, reward.Stock-count)
})
return
}
func (s *HMap) _setStock(stock, useStock, poolNum int64) (err error) {
s.data = make(map[string]string, 3)
return s.Set(StockFieldStock, fmt.Sprint(stock), StockFieldUseStock, fmt.Sprint(useStock), StockFieldPoolNum, fmt.Sprint(poolNum))
}