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.

176 lines
3.9 KiB
Go

package malls
import (
"context"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/service/provider"
stos "joybuywork/internal/service/provider/s2s"
"joybuywork/internal/utils/logic"
"joybuywork/internal/utils/merr"
"joybuywork/internal/utils/verify"
"joybuywork/proto/go_proto/workerr"
"fmt"
)
type Mall struct {
logic.Context
mall *model.RedeemMall
}
func NewMall(ctx context.Context, mallId int64, opts ...logic.CtxOption) (item *Mall, err error) {
item = new(Mall)
{
item.BaseInit(ctx, merr.NewBE(ctx), opts...)
}
item.mall, err = cache.NewRedeemMall(ctx).FindById(mallId)
if err != nil {
return nil, err
}
if item.mall == nil {
return nil, workerr.NotFound("not found mall")
}
return
}
func (s *Mall) GetMall() *model.RedeemMall {
return s.mall
}
func (s *Mall) UpItems() (list []*model.RedeemMallItem, err error) {
m := s.GetDao().RedeemMallItem
dbList, err := m.WithContext(s.Ctx).Where(
m.MallID.Eq(s.mall.ID),
m.DownAt.Eq(mtype.No),
m.IsDel.Eq(mtype.No),
).Order(m.Sort.Desc(), m.ID.Desc()).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
for _, item := range dbList {
if verify.InArray[int32](item.GetStatus(), mtype.RedeemMallItemStatusUp, mtype.RedeemMallItemStatusWait) {
list = append(list, item)
}
}
return
}
func (s *Mall) DownItems() (list []*model.RedeemMallItem, err error) {
m := s.GetDao().RedeemMallItem
list, err = m.WithContext(s.Ctx).Where(
m.MallID.Eq(s.mall.ID),
m.DownAt.Gt(mtype.No),
m.IsDel.Eq(mtype.No),
).Order(m.DownAt.Desc(), m.ID.Desc()).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
return
}
func (s *Mall) Exchange(item *model.RedeemMallItem, source string, firstId, secondId, relateId int64, pushParam mtype.RewardPushParam) (record *model.RedeemMallRecord, info provider.RewardAutoLang, err error) {
reward, record, info, err := s.ExchangeRecord(item, pushParam.Lang)
if err != nil {
return
}
if record.Status == mtype.RedeemMallRecordStatusOk {
return
}
rp, err := stos.NewReward(s.Ctx, reward)
if err != nil {
return
}
pushParam.RelateHashId = fmt.Sprintf("%d", record.ID)
pushParam.RewardId = fmt.Sprintf("%d", record.ID)
push, err := rp.CreatePush(
source,
firstId,
secondId,
relateId,
mtype.Yes,
pushParam,
)
if err != nil || push == nil {
return
}
push, err = rp.Send(push, true)
if err != nil || push == nil {
return
}
if push.Status == mtype.RewardPushStatusFail {
record.Status = mtype.RedeemMallRecordStatusFail
record.FailType = push.FailType
record.FailMsg = push.FailMsg
} else {
record.Status = mtype.RedeemMallRecordStatusOk
record.CustomRewardVal = push.RespData
}
if err = s.GetDao().RedeemMallRecord.WithContext(s.Ctx).Save(record); err != nil {
err = s.BE().MysqlError(err)
return
}
return
}
func (s *Mall) ExchangeRecord(item *model.RedeemMallItem, langMark string) (reward *model.Reward, record *model.RedeemMallRecord, info provider.RewardAutoLang, err error) {
reward, err = cache.NewReward(s.Ctx).FindById(item.RewardID)
if err != nil {
err = s.BE().CacheError(err)
return
}
pewards, err := provider.NewRewards(s.Ctx, s.mall.ProjectID, item.RewardID)
if err != nil {
return
}
info, err = pewards.InfoAutoLang(item.RewardID, langMark)
if err != nil {
return
}
record = withdefault.RedeemMallRecord(&model.RedeemMallRecord{
MallID: item.MallID,
MallItemID: item.ID,
CoinNum: int64(item.CoinNum),
Status: mtype.RedeemMallRecordStatusWait,
FailType: "",
FailMsg: "",
RewardID: item.RewardID,
CustomRewardVal: "",
})
if reward.ReceiveType != mtype.RewardReceiveTypeNotify {
record.Status = mtype.RedeemMallRecordStatusOk
}
if err = s.GetDao().RedeemMallRecord.WithContext(s.Ctx).Create(record); err != nil {
err = s.BE().MysqlError(err)
return
}
return
}