172 lines
5.2 KiB
Go
172 lines
5.2 KiB
Go
package reward
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"server/internal/consts"
|
|
"server/internal/dao"
|
|
"server/internal/model"
|
|
"server/internal/model/do"
|
|
"server/internal/service"
|
|
"server/utility/ecode"
|
|
|
|
"github.com/gogf/gf/v2/database/gdb"
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
)
|
|
|
|
type sReward struct{}
|
|
|
|
func New() service.IReward {
|
|
return &sReward{}
|
|
}
|
|
|
|
func init() {
|
|
service.RegisterReward(New())
|
|
}
|
|
|
|
// CreateSystemReward 创建系统奖励
|
|
func (s *sReward) CreateSystemReward(ctx context.Context, in *model.RewardCreateIn) (out *model.CreateOut, err error) {
|
|
if in.Name == "" {
|
|
return nil, gerror.New("奖励名称不能为空")
|
|
}
|
|
exist, err := dao.RewardTypes.Ctx(ctx).WherePri(in.RewardTypeID).Exist()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("奖励类型不存在")
|
|
}
|
|
if !exist {
|
|
return nil, ecode.Params.Sub("奖励类型不存在")
|
|
}
|
|
|
|
// TODO 生成奖励唯一 code
|
|
|
|
// 插入数据
|
|
id, err := dao.Rewards.Ctx(ctx).Data(do.Rewards{
|
|
RewardTypeId: in.RewardTypeID,
|
|
RewardScope: consts.SystemReward, // 系统奖励
|
|
Name: in.Name,
|
|
Code: "",
|
|
Description: in.Description,
|
|
Status: in.Status,
|
|
Stock: in.Stock,
|
|
StartAt: in.StartAt,
|
|
ExpireAt: in.ExpireAt,
|
|
}).OmitEmptyData().InsertAndGetId()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("创建奖励失败")
|
|
}
|
|
return &model.CreateOut{
|
|
Id: id,
|
|
}, nil
|
|
}
|
|
|
|
// CreateStoreReward 创建门店奖励
|
|
func (s *sReward) CreateStoreReward(ctx context.Context, in *model.RewardCreateIn) (out *model.CreateOut, err error) {
|
|
if in.OperatorRole != consts.MerchantRoleCode && in.OperatorRole != consts.AdminRoleCode {
|
|
return nil, ecode.Params.Sub("只有管理员和商户才能创建门店奖励")
|
|
}
|
|
// 验证 OperatorId 对 门店 id 是否存在权限
|
|
if in.OperatorRole == consts.MerchantRoleCode {
|
|
count, err := dao.MerchantAdmins.Ctx(ctx).LeftJoin(
|
|
dao.Stores.Table(),
|
|
fmt.Sprintf("%s.%s=%s.%s", dao.Stores.Table(), dao.Stores.Columns().MerchantId, dao.MerchantAdmins.Table(), dao.MerchantAdmins.Columns().MerchantId),
|
|
).Where(dao.Stores.Columns().Id, in.StoreIDs).WherePri(in.OperatorId).Count()
|
|
if err != nil {
|
|
return nil, gerror.Wrap(err, "检查商户权限失败")
|
|
}
|
|
if count != len(in.StoreIDs) {
|
|
return nil, ecode.Params.Sub("商户权限不足")
|
|
}
|
|
} else {
|
|
count, err := dao.StoreAdmins.Ctx(ctx).
|
|
LeftJoin(
|
|
dao.Stores.Table(),
|
|
fmt.Sprintf("%s.%s=%s.%s", dao.Stores.Table(), dao.Stores.Columns().Id, dao.StoreAdmins.Table(), dao.StoreAdmins.Columns().StoreId),
|
|
).WherePri(in.OperatorId).WhereIn(dao.Stores.Columns().Id, in.StoreIDs).Count()
|
|
if err != nil {
|
|
return nil, gerror.Wrap(err, "检查门店权限失败")
|
|
}
|
|
if count != len(in.StoreIDs) {
|
|
return nil, ecode.Params.Sub("门店权限不足")
|
|
}
|
|
|
|
}
|
|
if in.Name == "" {
|
|
return nil, gerror.New("奖励名称不能为空")
|
|
}
|
|
exist, err := dao.RewardTypes.Ctx(ctx).WherePri(in.RewardTypeID).Exist()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("奖励类型不存在")
|
|
}
|
|
if !exist {
|
|
return nil, ecode.Params.Sub("奖励类型不存在")
|
|
}
|
|
if err = dao.Rewards.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
|
// TODO 生成奖励唯一 code
|
|
|
|
// 首先插入奖励
|
|
id, err := dao.Rewards.Ctx(ctx).Data(do.Rewards{
|
|
RewardTypeId: in.RewardTypeID,
|
|
RewardScope: consts.StoreReward, // 门店奖励
|
|
Name: in.Name,
|
|
Code: "",
|
|
Description: in.Description,
|
|
Status: in.Status,
|
|
Stock: in.Stock,
|
|
StartAt: in.StartAt,
|
|
ExpireAt: in.ExpireAt,
|
|
}).OmitEmptyData().InsertAndGetId() // 忽略空值插入
|
|
if err != nil {
|
|
return ecode.Fail.Sub("创建门店奖励失败")
|
|
}
|
|
insertDatas := make([]do.StoreRewards, 0, len(in.StoreIDs))
|
|
// 插入门店奖励关系表
|
|
for _, d := range in.StoreIDs {
|
|
insertDatas = append(insertDatas, do.StoreRewards{
|
|
RewardId: id,
|
|
StoreId: d,
|
|
})
|
|
}
|
|
if _, err := dao.StoreRewards.Ctx(ctx).Data(insertDatas).Insert(); err != nil {
|
|
return ecode.Fail.Sub("创建门店奖励关联失败")
|
|
}
|
|
return nil
|
|
}); err != nil {
|
|
return nil, err
|
|
}
|
|
return
|
|
}
|
|
|
|
// ListSystemReward 查询系统奖励列表
|
|
func (s *sReward) ListSystemReward(ctx context.Context, in *model.RewardListIn) (out *model.RewardListOut, err error) {
|
|
return
|
|
}
|
|
|
|
// ListStoreReward 查询门店奖励列表
|
|
func (s *sReward) ListStoreReward(ctx context.Context, in *model.RewardListIn) (out *model.RewardListOut, err error) {
|
|
return
|
|
}
|
|
|
|
// UpdateSystemReward 更新系统奖励
|
|
func (s *sReward) UpdateSystemReward(ctx context.Context, in *model.RewardUpdateIn) (out *model.UpdateOut, err error) {
|
|
return
|
|
}
|
|
|
|
// UpdateStoreReward 更新门店奖励
|
|
func (s *sReward) UpdateStoreReward(ctx context.Context, in *model.RewardUpdateIn) (out *model.UpdateOut, err error) {
|
|
return
|
|
}
|
|
|
|
// DeleteSystemReward 删除系统奖励
|
|
func (s *sReward) DeleteSystemReward(ctx context.Context, in *model.RewardDeleteIn) (out *model.DeleteOut, err error) {
|
|
return
|
|
}
|
|
|
|
// DeleteStoreReward 删除门店奖励
|
|
func (s *sReward) DeleteStoreReward(ctx context.Context, in *model.RewardDeleteIn) (out *model.DeleteOut, err error) {
|
|
return
|
|
}
|
|
|
|
func (s *sReward) Detail(ctx context.Context, in *model.RewardDetailIn) (out *model.RewardDetailOut, err error) {
|
|
return
|
|
}
|