diff --git a/internal/controller/reward/reward_v1_list.go b/internal/controller/reward/reward_v1_list.go index 974cd93..e8b3532 100644 --- a/internal/controller/reward/reward_v1_list.go +++ b/internal/controller/reward/reward_v1_list.go @@ -20,6 +20,7 @@ func (c *ControllerV1) List(ctx context.Context, req *v1.ListReq) (res *v1.ListR StoreId: req.StoreId, Name: req.Name, Status: req.Status, + RewardTypeId: req.RewardTypeId, }) if err != nil { return nil, err diff --git a/internal/logic/reward/reward.go b/internal/logic/reward/reward.go index 53f7201..a9dffc0 100644 --- a/internal/logic/reward/reward.go +++ b/internal/logic/reward/reward.go @@ -243,100 +243,105 @@ func (s *sReward) Delete(ctx context.Context, in *model.RewardDeleteIn) (out *mo } // 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) - // 根据角色和权限构建查询条件 + rewardCols := dao.Rewards.Columns() + rewardTypeCols := dao.RewardTypes.Columns() + + // ==== 权限校验 ==== 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() + case consts.AdminRoleCode: + // 系统管理员只能查询 source = 1 的奖励 + orm = orm.Where(fmt.Sprintf("%s.%s = ?", dao.Rewards.Table(), rewardCols.Source), 1) + case consts.MerchantRoleCode, consts.StoreRoleCode: + // 合并商户和门店角色权限校验 + var exist bool + if in.OperatorRole == 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() + } else { + 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("检查操作者权限出现异常") + return nil, ecode.Fail.Sub("检查操作者权限异常") } if !exist { return nil, ecode.Params.Sub("无门店权限") } + // 商户和门店角色查询 source = 1 或 (source = 2 且 store_id = in.StoreId) 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, + fmt.Sprintf( + "(%s.%s = ? OR (%s.%s = ? AND %s.%s = ?))", + dao.Rewards.Table(), rewardCols.Source, + dao.Rewards.Table(), rewardCols.Source, + dao.Rewards.Table(), rewardCols.StoreId, + ), + 1, 2, in.StoreId, ) + default: + return nil, ecode.Params.Sub("无效的角色") } + // ==== 其他查询条件 ==== if in.Status != 0 { - orm = orm.Where(do.Rewards{Status: in.Status}) - } - if in.StoreId != 0 { - orm = orm.Where(do.Rewards{StoreId: in.StoreId}) + orm = orm.Where(fmt.Sprintf("%s.%s = ?", dao.Rewards.Table(), rewardCols.Status), in.Status) } if in.RewardTypeId != 0 { - orm = orm.Where(do.Rewards{RewardTypeId: in.RewardTypeId}) + // 确保 reward_type_id 过滤独立应用 + orm = orm.Where(fmt.Sprintf("%s.%s = ?", dao.Rewards.Table(), rewardCols.RewardTypeId), in.RewardTypeId) } if in.Name != "" { - orm = orm.WhereLike(dao.Rewards.Columns().Name, "%"+in.Name+"%") - } - if in.RewardTypeId != 0 { - orm = orm.Where(do.Rewards{RewardTypeId: in.RewardTypeId}) + orm = orm.WhereLike(rewardCols.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")).OrderDesc(dao.Rewards.Columns().CreatedAt).Scan(&list) + + // ==== 分页查询 + 联表字段 ==== + err = orm.Page(in.Page, in.Size). + LeftJoin( + dao.RewardTypes.Table(), + fmt.Sprintf("%s.%s = %s.%s", + dao.Rewards.Table(), rewardCols.RewardTypeId, + dao.RewardTypes.Table(), rewardTypeCols.Id, + ), + ). + Fields(fmt.Sprintf( + "%s.*, %s.%s AS reward_type_name", + dao.Rewards.Table(), + dao.RewardTypes.Table(), rewardTypeCols.Name, + )). + OrderDesc(rewardCols.CreatedAt). + Scan(&list) if err != nil { return nil, err } + return &model.RewardListOut{ List: list, Total: total,