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