修改奖励类型

This commit is contained in:
2025-06-24 19:53:39 +08:00
parent e28c44ecbb
commit 1c0b9a2d93
42 changed files with 666 additions and 1060 deletions

View File

@ -10,6 +10,8 @@ import (
"server/internal/model/do"
"server/internal/service"
"server/utility/ecode"
"github.com/gogf/gf/v2/os/gtime"
)
type sRewardType struct {
@ -25,328 +27,192 @@ func New() service.IRewardType {
// 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 的奖励类型")
if err = checkRewardTypePermission(ctx, in.OperatorRole, in.OperatorId, in.Source, in.StoreId); err != nil {
return nil, err
}
// 根据角色和权限检查
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("无门店权限")
}
data := do.RewardTypes{
Name: in.Name,
Source: in.Source,
StoreId: in.StoreId,
TencentTypeId: in.TencentTypeId,
}
id, err := dao.RewardTypes.Ctx(ctx).Data(do.RewardTypes{
Name: in.Name,
Description: in.Description,
Source: in.Source,
StoreId: in.StoreId,
}).OmitEmptyData().InsertAndGetId()
id, err := dao.RewardTypes.Ctx(ctx).OmitEmptyData().Data(data).InsertAndGetId()
if err != nil {
return nil, err
}
return &model.RewardTypeCreateOut{
Id: id,
}, nil
return &model.RewardTypeCreateOut{Id: id}, nil
}
// 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()
info, err := dao.RewardTypes.Ctx(ctx).WherePri(in.Id).One()
if err != nil {
return nil, ecode.Fail.Sub("查询奖励类型失败")
return nil, err
}
if value.IsEmpty() {
if info == nil {
return nil, ecode.Params.Sub("奖励类型不存在")
}
// source=1 的奖励类型只能由管理员修改
source := info["source"].Int()
storeId := info["store_id"].Int64()
if value[dao.RewardTypes.Columns().Source].Int() == 1 && in.OperatorRole != consts.AdminRoleCode {
return nil, ecode.Params.Sub("只有管理员可以修改的系统奖励类型")
if err = checkRewardTypePermission(ctx, in.OperatorRole, in.OperatorId, source, storeId); err != nil {
return nil, err
}
// 权限校验(管理员跳过)
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("无门店权限")
}
updateData := g.Map{}
if in.Name != "" {
updateData["name"] = in.Name
}
// 执行更新(不允许更新 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 len(updateData) == 0 {
return nil, ecode.Params.Sub("无可更新字段")
}
_, err = dao.RewardTypes.Ctx(ctx).WherePri(in.Id).Data(updateData).Update()
if err != nil {
return nil, ecode.Fail.Sub("更新奖励类型失败")
return nil, err
}
return &model.RewardTypeUpdateOut{
Success: true,
}, nil
return &model.RewardTypeUpdateOut{Success: true}, nil
}
// Delete 删除奖励类型
// 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()
info, err := dao.RewardTypes.Ctx(ctx).WherePri(in.Id).One()
if err != nil {
return nil, ecode.Fail.Sub("查询奖励类型失败")
return nil, err
}
if value.IsEmpty() {
if info.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("只有管理员可以删除的系统奖励类型")
source := info["source"].Int()
storeId := info["store_id"].Int64()
if err = checkRewardTypePermission(ctx, in.OperatorRole, in.OperatorId, source, storeId); err != nil {
return nil, err
}
// 权限校验(管理员跳过)
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()
_, err = dao.RewardTypes.Ctx(ctx).WherePri(in.Id).Data(g.Map{
"deleted_at": gtime.Now(),
}).Update()
if err != nil {
return nil, ecode.Fail.Sub("删除奖励类型失败")
return nil, err
}
return &model.RewardTypeDeleteOut{
Success: true,
}, nil
return &model.RewardTypeDeleteOut{Success: true}, nil
}
// List 获取奖励类型列表
// 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)
mod := dao.RewardTypes.Ctx(ctx).Where("deleted_at IS NULL")
// 根据角色和权限构建查询条件
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.AdminRoleCode:
// 系统管理员只能看系统奖励类型
mod = mod.Where("source", 1)
// 追加限制source = 1 或 store_id = 当前门店
orm = orm.Where(
fmt.Sprintf("%s.%s = ?", dao.RewardTypes.Table(), dao.RewardTypes.Columns().Source),
1,
).WhereOr(
fmt.Sprintf("%s.%s IN (?)", dao.RewardTypes.Table(), dao.RewardTypes.Columns().StoreId),
g.Slice{in.StoreId},
)
case consts.MerchantRoleCode:
// 校验商户是否对该门店有权限
if err = checkRewardTypePermission(ctx, in.OperatorRole, in.OperatorId, 2, in.StoreId); err != nil {
return nil, err
}
// 只查询该门店的奖励类型source=2且store_id=指定门店)
mod = mod.Where("source", 2).WhereIn("store_id", in.StoreId)
case consts.StoreRoleCode:
// 检查门店是否有权限
exist, err := dao.StoreAdmins.Ctx(ctx).
Where(do.StoreAdmins{Id: in.OperatorId}).
// 校验门店权限
if err = checkRewardTypePermission(ctx, in.OperatorRole, in.OperatorId, 2, in.StoreId); err != nil {
return nil, err
}
mod = mod.Where("source", 2).Where("store_id", in.StoreId)
default:
return nil, ecode.Params.Sub("无效的操作角色")
}
// 其余过滤条件
if in.Name != "" {
mod = mod.WhereLike("name", "%"+in.Name+"%")
}
if in.Source > 0 {
mod = mod.Where("source", in.Source)
}
count, err := mod.Count()
if err != nil {
return nil, err
}
records, err := mod.Page(in.Page, in.Size).Order("id DESC").All()
if err != nil {
return nil, err
}
var list []model.RewardType
if err = records.Structs(&list); err != nil {
return nil, err
}
out = &model.RewardTypeListOut{
Total: count,
List: list,
}
return
}
func checkRewardTypePermission(ctx context.Context, role string, operatorId int64, source int, storeId int64) error {
switch role {
case consts.AdminRoleCode:
if source != 1 {
return ecode.Params.Sub("系统管理员只能操作系统奖励类型")
}
case consts.MerchantRoleCode:
exist, err := dao.MerchantAdmins.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,
),
fmt.Sprintf("%s.%s = %s.%s",
dao.Stores.Table(), dao.Stores.Columns().MerchantId,
dao.MerchantAdmins.Table(), dao.MerchantAdmins.Columns().MerchantId),
).
Where(fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id), in.StoreId).
Where(fmt.Sprintf("%s.%s = ?", dao.MerchantAdmins.Table(), dao.MerchantAdmins.Columns().Id), operatorId).
Where(fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id), storeId).
Exist()
if err != nil {
return nil, ecode.Fail.Sub("检查操作者权限出现异常")
return ecode.Fail.Sub("检查商户权限异常")
}
if !exist {
return nil, ecode.Params.Sub("无门店权限")
return ecode.Params.Sub("无门店权限")
}
// 追加限制source = 1 或 store_id = 当前门店
orm = orm.Where(
fmt.Sprintf("%s.%s = ?", dao.RewardTypes.Table(), dao.RewardTypes.Columns().Source),
1,
).WhereOr(
fmt.Sprintf("%s.%s IN (?)", dao.RewardTypes.Table(), dao.RewardTypes.Columns().StoreId),
g.Slice{in.StoreId},
)
if source != 2 {
return ecode.Params.Sub("商户只能操作本系统奖励类型")
}
case consts.StoreRoleCode:
exist, 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),
).
Where(fmt.Sprintf("%s.%s = ?", dao.StoreAdmins.Table(), dao.StoreAdmins.Columns().Id), operatorId).
Where(fmt.Sprintf("%s.%s = ?", dao.Stores.Table(), dao.Stores.Columns().Id), storeId).
Exist()
if err != nil {
return ecode.Fail.Sub("检查门店权限异常")
}
if !exist {
return ecode.Params.Sub("无门店权限")
}
if source != 2 {
return ecode.Params.Sub("门店只能操作本系统奖励类型")
}
default:
return ecode.Params.Sub("无效的操作角色")
}
// 其他筛选
if in.Status != 0 {
orm = orm.Where(
fmt.Sprintf("%s.%s = ?", dao.RewardTypes.Table(), dao.RewardTypes.Columns().Status),
in.Status,
)
}
if in.Name != "" {
orm = orm.WhereLike(
fmt.Sprintf("%s.%s", dao.RewardTypes.Table(), dao.RewardTypes.Columns().Name),
"%"+in.Name+"%",
)
}
// 查询总数
count, err := orm.Count()
if err != nil {
return nil, err
}
if in.OperatorRole == consts.AdminRoleCode {
orm = orm.LeftJoin(dao.Stores.Table(), fmt.Sprintf(
"%s.%s = %s.%s",
dao.RewardTypes.Table(), dao.RewardTypes.Columns().StoreId,
dao.Stores.Table(), dao.Stores.Columns().Id),
).Fields(fmt.Sprintf("%s.*, %s.%s %s",
dao.RewardTypes.Table(), dao.Stores.Table(), dao.Stores.Columns().Name, "storeName"))
}
// 查询分页数据
err = orm.Page(in.Page, in.Size).
OrderAsc(fmt.Sprintf("%s.%s", dao.RewardTypes.Table(), dao.RewardTypes.Columns().Source)).
Scan(&list)
if err != nil {
return nil, err
}
return &model.RewardTypeListOut{
List: list,
Total: count,
}, nil
return nil
}