318 lines
9.2 KiB
Go
318 lines
9.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"
|
||
)
|
||
|
||
type sReward struct{}
|
||
|
||
func init() {
|
||
service.RegisterReward(New())
|
||
}
|
||
|
||
func New() service.IReward {
|
||
return &sReward{}
|
||
}
|
||
|
||
// Create 创建奖励
|
||
func (s *sReward) Create(ctx context.Context, in *model.RewardCreateIn) (out *model.RewardCreateOut, err error) {
|
||
// 仅管理员能创建系统奖励(source=1)
|
||
if in.Source == 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), 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.Rewards.Ctx(ctx).Data(do.Rewards{
|
||
RewardTypeId: in.RewardTypeId,
|
||
Name: in.Name,
|
||
Description: in.Description,
|
||
Source: in.Source,
|
||
StoreId: in.StoreId,
|
||
Value: in.Value,
|
||
Status: in.Status,
|
||
}).InsertAndGetId()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &model.RewardCreateOut{Id: id}, nil
|
||
}
|
||
|
||
// Update 更新奖励
|
||
// Update 更新奖励
|
||
func (s *sReward) Update(ctx context.Context, in *model.RewardUpdateIn) (out *model.RewardUpdateOut, err error) {
|
||
// 查询原始记录,确保存在,并获取 source 与 store_id 用于权限校验
|
||
data, err := dao.Rewards.Ctx(ctx).
|
||
Fields(dao.Rewards.Columns().Id, dao.Rewards.Columns().Source, dao.Rewards.Columns().StoreId).
|
||
Where(do.Rewards{Id: in.Id}).One()
|
||
if err != nil {
|
||
return nil, ecode.Fail.Sub("查询奖励失败")
|
||
}
|
||
if data.IsEmpty() {
|
||
return nil, ecode.Params.Sub("奖励不存在")
|
||
}
|
||
|
||
// 系统奖励(source=1)只能由管理员修改
|
||
if data[dao.Rewards.Columns().Source].Int() == 1 && in.OperatorRole != consts.AdminRoleCode {
|
||
return nil, ecode.Params.Sub("只有管理员可以修改系统奖励")
|
||
}
|
||
|
||
storeId := data[dao.Rewards.Columns().StoreId].Int64()
|
||
|
||
// 权限校验(管理员跳过)
|
||
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), 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), storeId,
|
||
).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.Rewards.Ctx(ctx).
|
||
Where(do.Rewards{Id: in.Id}).
|
||
Data(do.Rewards{
|
||
Name: in.Name,
|
||
Description: in.Description,
|
||
Value: in.Value,
|
||
Status: in.Status,
|
||
}).OmitEmptyData().Update()
|
||
if err != nil {
|
||
return nil, ecode.Fail.Sub("更新奖励失败")
|
||
}
|
||
|
||
return &model.RewardUpdateOut{Success: true}, nil
|
||
}
|
||
|
||
// Delete 删除奖励
|
||
func (s *sReward) Delete(ctx context.Context, in *model.RewardDeleteIn) (out *model.RewardDeleteOut, err error) {
|
||
data, err := dao.Rewards.Ctx(ctx).
|
||
Fields("id", "source", "store_id").
|
||
Where(do.Rewards{Id: in.Id}).One()
|
||
if err != nil {
|
||
return nil, ecode.Fail.Sub("查询奖励失败")
|
||
}
|
||
if data.IsEmpty() {
|
||
return nil, ecode.Params.Sub("奖励不存在")
|
||
}
|
||
|
||
if data["source"].Int() == 1 && in.OperatorRole != consts.AdminRoleCode {
|
||
return nil, ecode.Params.Sub("只有管理员可以删除系统奖励")
|
||
}
|
||
|
||
storeId := data["store_id"].Int64()
|
||
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), 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).Where(do.StoreAdmins{Id: in.OperatorId, StoreId: storeId}).Exist()
|
||
if err != nil {
|
||
return nil, ecode.Fail.Sub("权限校验失败")
|
||
}
|
||
if !exist {
|
||
return nil, ecode.Params.Sub("无门店权限")
|
||
}
|
||
}
|
||
|
||
_, err = dao.Rewards.Ctx(ctx).Where(do.Rewards{Id: in.Id}).Delete()
|
||
if err != nil {
|
||
return nil, ecode.Fail.Sub("删除失败")
|
||
}
|
||
|
||
return &model.RewardDeleteOut{Success: true}, nil
|
||
}
|
||
|
||
// List 奖励列表
|
||
func (s *sReward) List(ctx context.Context, in *model.RewardListIn) (out *model.RewardListOut, err error) {
|
||
var list []model.Reward
|
||
orm := dao.Rewards.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("无门店权限")
|
||
}
|
||
orm = orm.Where(
|
||
fmt.Sprintf("%s.%s = ?", dao.Rewards.Table(), dao.Rewards.Columns().Source),
|
||
1,
|
||
).WhereOr(
|
||
fmt.Sprintf("%s.%s = ?", dao.Rewards.Table(), dao.Rewards.Columns().StoreId),
|
||
in.StoreId,
|
||
)
|
||
|
||
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("无门店权限")
|
||
}
|
||
orm = orm.Where(
|
||
fmt.Sprintf("%s.%s = ?", dao.Rewards.Table(), dao.Rewards.Columns().Source),
|
||
1,
|
||
).WhereOr(
|
||
fmt.Sprintf("%s.%s = ?", dao.Rewards.Table(), dao.Rewards.Columns().StoreId),
|
||
in.StoreId,
|
||
)
|
||
}
|
||
|
||
if in.Status != 0 {
|
||
orm = orm.Where(do.Rewards{Status: in.Status})
|
||
}
|
||
if in.StoreId != 0 {
|
||
orm = orm.Where(do.Rewards{StoreId: in.StoreId})
|
||
}
|
||
if in.RewardTypeId != 0 {
|
||
orm = orm.Where(do.Rewards{RewardTypeId: in.RewardTypeId})
|
||
}
|
||
if in.Name != "" {
|
||
orm = orm.WhereLike(dao.Rewards.Columns().Name, "%"+in.Name+"%")
|
||
}
|
||
|
||
total, err := orm.Count()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
err = orm.Page(in.Page, in.Size).LeftJoin(
|
||
dao.RewardTypes.Table(),
|
||
fmt.Sprintf(
|
||
"%s.%s = %s.%s",
|
||
dao.Rewards.Table(), dao.Rewards.Columns().RewardTypeId,
|
||
dao.RewardTypes.Table(), dao.RewardTypes.Columns().Id,
|
||
),
|
||
).Fields(fmt.Sprintf("%s.*, %s.%s %s", dao.Rewards.Table(), dao.RewardTypes.Table(), dao.RewardTypes.Columns().Name, "reward_type_name")).Scan(&list)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &model.RewardListOut{
|
||
List: list,
|
||
Total: total,
|
||
}, nil
|
||
}
|