实现奖励类型的增删改查
This commit is contained in:
311
internal/logic/rewardType/rewardType.go
Normal file
311
internal/logic/rewardType/rewardType.go
Normal file
@ -0,0 +1,311 @@
|
||||
package reward
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"server/internal/consts"
|
||||
"server/internal/dao"
|
||||
"server/internal/model"
|
||||
"server/internal/model/do"
|
||||
"server/internal/service"
|
||||
"server/utility/ecode"
|
||||
)
|
||||
|
||||
type sRewardType struct {
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterRewardType(New())
|
||||
}
|
||||
|
||||
func New() service.IRewardType {
|
||||
return &sRewardType{}
|
||||
}
|
||||
|
||||
// Create 创建奖励类型
|
||||
func (s *sRewardType) Create(ctx context.Context, in *model.RewardTypeCreateIn) (out *model.RewardTypeCreateOut, err error) {
|
||||
// 创建时,source为1的奖励类型只能由管理员创建
|
||||
// 商户和门店管理员创建奖励时需要判断是有拥有 storeId 的权限
|
||||
|
||||
// 检查 source=1 的奖励类型只能由管理员创建
|
||||
if in.Source == 1 && in.OperatorRole != consts.AdminRoleCode {
|
||||
return nil, ecode.Params.Sub("只有管理员可以创建 source=1 的奖励类型")
|
||||
}
|
||||
|
||||
// 根据角色和权限检查
|
||||
switch in.OperatorRole {
|
||||
case consts.MerchantRoleCode:
|
||||
// 检查商户是否有该门店权限
|
||||
exist, err := dao.MerchantAdmins.Ctx(ctx).LeftJoin(
|
||||
dao.Stores.Table(),
|
||||
fmt.Sprintf("%s.%s = %s.%s",
|
||||
dao.MerchantAdmins.Table(), dao.MerchantAdmins.Columns().MerchantId,
|
||||
dao.Stores.Table(), dao.Stores.Columns().MerchantId,
|
||||
),
|
||||
).Where(
|
||||
fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id), in.StoreId,
|
||||
).Where(
|
||||
do.MerchantAdmins{Id: in.OperatorId},
|
||||
).Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("检查操作者权限出现异常")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.Params.Sub("无门店权限")
|
||||
}
|
||||
|
||||
case consts.StoreRoleCode:
|
||||
// 检查门店是否有权限
|
||||
exist, err := dao.StoreAdmins.Ctx(ctx).LeftJoin(
|
||||
dao.Stores.Table(),
|
||||
fmt.Sprintf("%s.%s = %s.%s",
|
||||
dao.StoreAdmins.Table(), dao.StoreAdmins.Columns().StoreId,
|
||||
dao.Stores.Table(), dao.Stores.Columns().Id,
|
||||
),
|
||||
).Where(
|
||||
fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id), in.StoreId,
|
||||
).Where(
|
||||
do.StoreAdmins{Id: in.OperatorId},
|
||||
).Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("检查操作者权限出现异常")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.Params.Sub("无门店权限")
|
||||
}
|
||||
}
|
||||
|
||||
id, err := dao.RewardTypes.Ctx(ctx).Data(do.RewardTypes{
|
||||
Name: in.Name,
|
||||
Description: in.Description,
|
||||
Source: in.Source,
|
||||
StoreId: in.StoreId,
|
||||
}).OmitEmptyData().InsertAndGetId()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &model.RewardTypeCreateOut{
|
||||
Id: id,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Update 更新奖励类型
|
||||
// Update 更新奖励类型
|
||||
func (s *sRewardType) Update(ctx context.Context, in *model.RewardTypeUpdateIn) (out *model.RewardTypeUpdateOut, err error) {
|
||||
// 查询原始记录,确保存在,并获取 store_id 和 source 字段用于权限判断
|
||||
value, err := dao.RewardTypes.Ctx(ctx).
|
||||
Fields(dao.RewardTypes.Columns().Id, dao.RewardTypes.Columns().Source, dao.RewardTypes.Columns().StoreId).
|
||||
Where(do.RewardTypes{Id: in.Id}).One()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("查询奖励类型失败")
|
||||
}
|
||||
if value.IsEmpty() {
|
||||
return nil, ecode.Params.Sub("奖励类型不存在")
|
||||
}
|
||||
|
||||
// source=1 的奖励类型只能由管理员修改
|
||||
|
||||
if value[dao.RewardTypes.Columns().Source].Int() == 1 && in.OperatorRole != consts.AdminRoleCode {
|
||||
return nil, ecode.Params.Sub("只有管理员可以修改的系统奖励类型")
|
||||
}
|
||||
|
||||
// 权限校验(管理员跳过)
|
||||
switch in.OperatorRole {
|
||||
case consts.MerchantRoleCode:
|
||||
exist, err := dao.MerchantAdmins.Ctx(ctx).LeftJoin(
|
||||
dao.Stores.Table(),
|
||||
fmt.Sprintf("%s.%s = %s.%s",
|
||||
dao.MerchantAdmins.Table(), dao.MerchantAdmins.Columns().MerchantId,
|
||||
dao.Stores.Table(), dao.Stores.Columns().MerchantId,
|
||||
),
|
||||
).Where(
|
||||
fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id), value[dao.RewardTypes.Columns().StoreId].Int(),
|
||||
).Where(
|
||||
do.MerchantAdmins{Id: in.OperatorId},
|
||||
).Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("检查操作者权限出现异常")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.Params.Sub("无门店权限")
|
||||
}
|
||||
|
||||
case consts.StoreRoleCode:
|
||||
exist, err := dao.StoreAdmins.Ctx(ctx).LeftJoin(
|
||||
dao.Stores.Table(),
|
||||
fmt.Sprintf("%s.%s = %s.%s",
|
||||
dao.StoreAdmins.Table(), dao.StoreAdmins.Columns().StoreId,
|
||||
dao.Stores.Table(), dao.Stores.Columns().Id,
|
||||
),
|
||||
).Where(
|
||||
fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id), value[dao.RewardTypes.Columns().StoreId].Int(),
|
||||
).Where(
|
||||
do.StoreAdmins{Id: in.OperatorId},
|
||||
).Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("检查操作者权限出现异常")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.Params.Sub("无门店权限")
|
||||
}
|
||||
}
|
||||
|
||||
// 执行更新(不允许更新 store_id 和 source)
|
||||
_, err = dao.RewardTypes.Ctx(ctx).
|
||||
Where(do.RewardTypes{Id: in.Id}).
|
||||
Data(do.RewardTypes{
|
||||
Name: in.Name,
|
||||
Description: in.Description,
|
||||
Status: in.Status,
|
||||
}).OmitEmptyData().
|
||||
Update()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("更新奖励类型失败")
|
||||
}
|
||||
|
||||
return &model.RewardTypeUpdateOut{
|
||||
Success: true,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Delete 删除奖励类型
|
||||
func (s *sRewardType) Delete(ctx context.Context, in *model.RewardTypeDeleteIn) (out *model.RewardTypeDeleteOut, err error) {
|
||||
// 查询原始记录,确保存在,并获取 store_id 和 source 字段用于权限判断
|
||||
value, err := dao.RewardTypes.Ctx(ctx).
|
||||
Fields(dao.RewardTypes.Columns().Id, dao.RewardTypes.Columns().Source, dao.RewardTypes.Columns().StoreId).
|
||||
Where(do.RewardTypes{Id: in.Id}).
|
||||
One()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("查询奖励类型失败")
|
||||
}
|
||||
if value.IsEmpty() {
|
||||
return nil, ecode.Params.Sub("奖励类型不存在")
|
||||
}
|
||||
|
||||
// source=1 的奖励类型只能由管理员删除
|
||||
if value[dao.RewardTypes.Columns().Source].Int() == 1 && in.OperatorRole != consts.AdminRoleCode {
|
||||
return nil, ecode.Params.Sub("只有管理员可以删除的系统奖励类型")
|
||||
}
|
||||
|
||||
// 权限校验(管理员跳过)
|
||||
switch in.OperatorRole {
|
||||
case consts.MerchantRoleCode:
|
||||
exist, err := dao.MerchantAdmins.Ctx(ctx).LeftJoin(
|
||||
dao.Stores.Table(),
|
||||
fmt.Sprintf("%s.%s = %s.%s",
|
||||
dao.MerchantAdmins.Table(), dao.MerchantAdmins.Columns().MerchantId,
|
||||
dao.Stores.Table(), dao.Stores.Columns().MerchantId,
|
||||
),
|
||||
).Where(
|
||||
fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id),
|
||||
value[dao.RewardTypes.Columns().StoreId].Int(),
|
||||
).Where(
|
||||
do.MerchantAdmins{Id: in.OperatorId},
|
||||
).Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("检查操作者权限出现异常")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.Params.Sub("无门店权限")
|
||||
}
|
||||
|
||||
case consts.StoreRoleCode:
|
||||
exist, err := dao.StoreAdmins.Ctx(ctx).LeftJoin(
|
||||
dao.Stores.Table(),
|
||||
fmt.Sprintf("%s.%s = %s.%s",
|
||||
dao.StoreAdmins.Table(), dao.StoreAdmins.Columns().StoreId,
|
||||
dao.Stores.Table(), dao.Stores.Columns().Id,
|
||||
),
|
||||
).Where(
|
||||
fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id),
|
||||
value[dao.RewardTypes.Columns().StoreId].Int(),
|
||||
).Where(
|
||||
do.StoreAdmins{Id: in.OperatorId},
|
||||
).Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("检查操作者权限出现异常")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.Params.Sub("无门店权限")
|
||||
}
|
||||
}
|
||||
|
||||
// 执行删除(软删除)
|
||||
_, err = dao.RewardTypes.Ctx(ctx).Where(do.RewardTypes{Id: in.Id}).Delete()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("删除奖励类型失败")
|
||||
}
|
||||
|
||||
return &model.RewardTypeDeleteOut{
|
||||
Success: true,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// List 获取奖励类型列表
|
||||
func (s *sRewardType) List(ctx context.Context, in *model.RewardTypeListIn) (out *model.RewardTypeListOut, err error) {
|
||||
list := make([]model.RewardType, 0)
|
||||
orm := dao.RewardTypes.Ctx(ctx)
|
||||
|
||||
// 根据角色和权限构建查询条件
|
||||
switch in.OperatorRole {
|
||||
case consts.MerchantRoleCode:
|
||||
// 检查商户是否有该门店权限
|
||||
exist, err := dao.MerchantAdmins.Ctx(ctx).Where(do.MerchantAdmins{Id: in.OperatorId}).LeftJoin(
|
||||
dao.Stores.Table(),
|
||||
fmt.Sprintf(
|
||||
"%s.%s = %s.%s",
|
||||
dao.MerchantAdmins.Table(), dao.MerchantAdmins.Columns().MerchantId,
|
||||
dao.Stores.Table(), dao.Stores.Columns().MerchantId,
|
||||
),
|
||||
).Where(fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id), in.StoreId).Exist()
|
||||
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("检查操作者权限出现异常")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.Params.Sub("无门店权限")
|
||||
}
|
||||
case consts.StoreRoleCode: // 门店
|
||||
// 检查门店是否有权限
|
||||
exist, err := dao.StoreAdmins.Ctx(ctx).
|
||||
Where(do.StoreAdmins{Id: in.OperatorId}).
|
||||
LeftJoin(
|
||||
dao.Stores.Table(),
|
||||
fmt.Sprintf(
|
||||
"%s.%s = %s.%s",
|
||||
dao.StoreAdmins.Table(), dao.StoreAdmins.Columns().StoreId,
|
||||
dao.Stores.Table(), dao.Stores.Columns().Id,
|
||||
),
|
||||
).
|
||||
Where(fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id), in.StoreId).
|
||||
Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("检查操作者权限出现异常")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.Params.Sub("无门店权限")
|
||||
}
|
||||
}
|
||||
if in.Status != 0 {
|
||||
orm = orm.Where(do.RewardTypes{Status: in.Status})
|
||||
}
|
||||
if in.Name != "" {
|
||||
orm = orm.WhereLike(dao.RewardTypes.Columns().Name, "%"+in.Name+"%")
|
||||
}
|
||||
// 查询总数
|
||||
count, err := orm.Count()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 查询结果
|
||||
err = orm.Page(in.Page, in.Size).OrderAsc(dao.RewardTypes.Columns().Source).Scan(&list)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &model.RewardTypeListOut{
|
||||
List: list,
|
||||
Total: count,
|
||||
}, nil
|
||||
}
|
||||
Reference in New Issue
Block a user