Commit 7f569f32998b7a8f036c8ede96389ff18de8b0e2
1 parent
3e9eb59d
crm-数据权限:完善数据权限
Showing
5 changed files
with
66 additions
and
110 deletions
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java
| 1 | package cn.iocoder.yudao.module.crm.controller.admin.permission; | 1 | package cn.iocoder.yudao.module.crm.controller.admin.permission; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | -import cn.hutool.core.util.ObjUtil; | ||
| 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 6 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 7 | import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionCreateReqVO; | 6 | import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionCreateReqVO; |
| @@ -30,11 +29,9 @@ import javax.annotation.Resource; | @@ -30,11 +29,9 @@ import javax.annotation.Resource; | ||
| 30 | import javax.validation.Valid; | 29 | import javax.validation.Valid; |
| 31 | import java.util.*; | 30 | import java.util.*; |
| 32 | 31 | ||
| 33 | -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 34 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 32 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 35 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 33 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 36 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | 34 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 37 | -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; | ||
| 38 | 35 | ||
| 39 | @Tag(name = "管理后台 - CRM 数据权限") | 36 | @Tag(name = "管理后台 - CRM 数据权限") |
| 40 | @RestController | 37 | @RestController |
| @@ -71,59 +68,21 @@ public class CrmPermissionController { | @@ -71,59 +68,21 @@ public class CrmPermissionController { | ||
| 71 | return success(true); | 68 | return success(true); |
| 72 | } | 69 | } |
| 73 | 70 | ||
| 74 | - // TODO @puhui999:这个要不要放到 Service 实现,让 Controller 还轻一点; | ||
| 75 | @DeleteMapping("/delete") | 71 | @DeleteMapping("/delete") |
| 76 | @Operation(summary = "删除数据权限") | 72 | @Operation(summary = "删除数据权限") |
| 77 | @Parameter(name = "ids", description = "数据权限编号", required = true, example = "1024") | 73 | @Parameter(name = "ids", description = "数据权限编号", required = true, example = "1024") |
| 78 | @PreAuthorize("@ss.hasPermission('crm:permission:delete')") | 74 | @PreAuthorize("@ss.hasPermission('crm:permission:delete')") |
| 79 | public CommonResult<Boolean> deletePermission(@RequestParam("ids") Collection<Long> ids) { | 75 | public CommonResult<Boolean> deletePermission(@RequestParam("ids") Collection<Long> ids) { |
| 80 | - List<CrmPermissionDO> permissions = permissionService.getPermissionList(ids); | ||
| 81 | - if (CollUtil.isEmpty(permissions)) { | ||
| 82 | - throw exception(CRM_PERMISSION_NOT_EXISTS); | ||
| 83 | - } | ||
| 84 | - Set<Long> bizIds = convertSet(permissions, CrmPermissionDO::getBizId); | ||
| 85 | - if (bizIds.size() > 1) { // 情况一:数据权限的模块数据编号是一致的不可能存在两个 TODO @puhui999:这里可以额外说明下原因,就是批量删除权限的时候,只能属于同一个 bizId 下; | ||
| 86 | - throw exception(CRM_PERMISSION_DELETE_FAIL); | ||
| 87 | - } | ||
| 88 | - // TODO @puhui999:下面 2 个,可以忽略。简单点哈; | ||
| 89 | - if (permissions.size() != ids.size()) { // 情况二:期望数量和实际结果不一致 | ||
| 90 | - throw exception(CRM_PERMISSION_NOT_EXISTS); | ||
| 91 | - } | ||
| 92 | - // 情况三:不能包含负责人 | ||
| 93 | - // TODO @puhui999:isOwner 可以直接放到判断里,不用单独取个变量名 | ||
| 94 | - boolean isOwner = CollectionUtils.anyMatch(permissions, item -> ObjUtil.equal(item.getLevel(), CrmPermissionLevelEnum.OWNER.getLevel())); | ||
| 95 | - if (isOwner) { | ||
| 96 | - throw exception(CRM_PERMISSION_DELETE_FAIL_EXIST_OWNER); | ||
| 97 | - } | ||
| 98 | - // 校验操作人是否为负责人 | ||
| 99 | - CrmPermissionDO permission = permissionService.getPermission(permissions.get(0).getBizId(), getLoginUserId()); | ||
| 100 | - if (!CrmPermissionLevelEnum.isOwner(permission.getLevel())) { | ||
| 101 | - throw exception(CRM_PERMISSION_DELETE_DENIED); | ||
| 102 | - } | ||
| 103 | - // 删除数据权限 | ||
| 104 | - permissionService.deletePermission(ids); | 76 | + permissionService.deletePermissionBatch(ids, getLoginUserId()); |
| 105 | return success(true); | 77 | return success(true); |
| 106 | } | 78 | } |
| 107 | 79 | ||
| 108 | - // TODO @puhui999:这个要不要放到 Service 实现,让 Controller 还轻一点; | ||
| 109 | - // TODO @puhui999:delete-self 就可以啦。方法名叫 deleteSelfPermission | ||
| 110 | - @DeleteMapping("/deleteSelfPermission") | 80 | + @DeleteMapping("/delete-self") |
| 111 | @Operation(summary = "删除自己的数据权限") | 81 | @Operation(summary = "删除自己的数据权限") |
| 112 | @Parameter(name = "id", description = "数据权限编号", required = true, example = "1024") | 82 | @Parameter(name = "id", description = "数据权限编号", required = true, example = "1024") |
| 113 | - @PreAuthorize("@ss.hasPermission('crm:permission:delete')") | ||
| 114 | - public CommonResult<Boolean> deletePermission(@RequestParam("id") Long id) { | ||
| 115 | - // 校验数据存在且是自己 | ||
| 116 | - CrmPermissionDO permission = permissionService.getPermission(id, getLoginUserId()); | ||
| 117 | - if (permission == null) { | ||
| 118 | - throw exception(CRM_PERMISSION_NOT_EXISTS); | ||
| 119 | - } | ||
| 120 | - // 校验是否是负责人 | ||
| 121 | - if (CrmPermissionLevelEnum.isOwner(permission.getLevel())) { | ||
| 122 | - throw exception(CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER); | ||
| 123 | - } | ||
| 124 | - | ||
| 125 | - // 删除 | ||
| 126 | - permissionService.deletePermission(Collections.singletonList(id)); | 83 | + @PreAuthorize("@ss.hasPermission('crm:permission:delete')") // TODO puhui999: 数据权限在页面上只是已团队成员组件的形式出现,那么这个权限怎么分配? |
| 84 | + public CommonResult<Boolean> deleteSelfPermission(@RequestParam("id") Long id) { | ||
| 85 | + permissionService.deleteSelfPermission(id, getLoginUserId()); | ||
| 127 | return success(true); | 86 | return success(true); |
| 128 | } | 87 | } |
| 129 | 88 |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java
| @@ -61,4 +61,6 @@ public interface CrmPermissionConvert { | @@ -61,4 +61,6 @@ public interface CrmPermissionConvert { | ||
| 61 | id -> new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel())); | 61 | id -> new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel())); |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | + List<CrmPermissionDO> convertList(List<CrmPermissionCreateReqBO> createBOs); | ||
| 65 | + | ||
| 64 | } | 66 | } |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java
| @@ -28,6 +28,13 @@ public interface CrmPermissionService { | @@ -28,6 +28,13 @@ public interface CrmPermissionService { | ||
| 28 | Long createPermission(@Valid CrmPermissionCreateReqBO createBO); | 28 | Long createPermission(@Valid CrmPermissionCreateReqBO createBO); |
| 29 | 29 | ||
| 30 | /** | 30 | /** |
| 31 | + * 创建数据权限 | ||
| 32 | + * | ||
| 33 | + * @param createBOs 创建信息 | ||
| 34 | + */ | ||
| 35 | + void createPermissionBatch(@Valid List<CrmPermissionCreateReqBO> createBOs); | ||
| 36 | + | ||
| 37 | + /** | ||
| 31 | * 更新数据权限 | 38 | * 更新数据权限 |
| 32 | * | 39 | * |
| 33 | * @param updateReqVO 更新信息 | 40 | * @param updateReqVO 更新信息 |
| @@ -44,13 +51,6 @@ public interface CrmPermissionService { | @@ -44,13 +51,6 @@ public interface CrmPermissionService { | ||
| 44 | /** | 51 | /** |
| 45 | * 删除数据权限 | 52 | * 删除数据权限 |
| 46 | * | 53 | * |
| 47 | - * @param ids 编号 | ||
| 48 | - */ | ||
| 49 | - void deletePermission(Collection<Long> ids); | ||
| 50 | - | ||
| 51 | - /** | ||
| 52 | - * 删除数据权限 | ||
| 53 | - * | ||
| 54 | * @param bizType 数据类型,关联 {@link CrmBizTypeEnum} | 54 | * @param bizType 数据类型,关联 {@link CrmBizTypeEnum} |
| 55 | * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId() | 55 | * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId() |
| 56 | * @param level 数据权限级别,关联 {@link CrmPermissionLevelEnum} | 56 | * @param level 数据权限级别,关联 {@link CrmPermissionLevelEnum} |
| @@ -58,13 +58,19 @@ public interface CrmPermissionService { | @@ -58,13 +58,19 @@ public interface CrmPermissionService { | ||
| 58 | void deletePermission(Integer bizType, Long bizId, Integer level); | 58 | void deletePermission(Integer bizType, Long bizId, Integer level); |
| 59 | 59 | ||
| 60 | /** | 60 | /** |
| 61 | - * 获取用户数据权限通过 权限编号 x 用户编号 | 61 | + * 批量删除数据权限 |
| 62 | + * | ||
| 63 | + * @param ids 权限编号 | ||
| 64 | + */ | ||
| 65 | + void deletePermissionBatch(Collection<Long> ids, Long userId); | ||
| 66 | + | ||
| 67 | + /** | ||
| 68 | + * 删除指定用户数据权限 | ||
| 62 | * | 69 | * |
| 63 | * @param id 权限编号 | 70 | * @param id 权限编号 |
| 64 | * @param userId 用户编号 | 71 | * @param userId 用户编号 |
| 65 | - * @return 数据权限 | ||
| 66 | */ | 72 | */ |
| 67 | - CrmPermissionDO getPermission(Long id, Long userId); | 73 | + void deleteSelfPermission(Long id, Long userId); |
| 68 | 74 | ||
| 69 | /** | 75 | /** |
| 70 | * 获取数据权限列表,通过 数据类型 x 某个数据 | 76 | * 获取数据权限列表,通过 数据类型 x 某个数据 |
| @@ -76,14 +82,6 @@ public interface CrmPermissionService { | @@ -76,14 +82,6 @@ public interface CrmPermissionService { | ||
| 76 | List<CrmPermissionDO> getPermissionListByBiz(Integer bizType, Long bizId); | 82 | List<CrmPermissionDO> getPermissionListByBiz(Integer bizType, Long bizId); |
| 77 | 83 | ||
| 78 | /** | 84 | /** |
| 79 | - * 获得数据权限列表 | ||
| 80 | - * | ||
| 81 | - * @param ids 数据权限编号列表 | ||
| 82 | - * @return 数据权限列表 | ||
| 83 | - */ | ||
| 84 | - List<CrmPermissionDO> getPermissionList(Collection<Long> ids); | ||
| 85 | - | ||
| 86 | - /** | ||
| 87 | * 获取用户参与的模块数据列表 | 85 | * 获取用户参与的模块数据列表 |
| 88 | * | 86 | * |
| 89 | * @param bizType 模块类型 | 87 | * @param bizType 模块类型 |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
| @@ -19,6 +19,7 @@ import javax.annotation.Resource; | @@ -19,6 +19,7 @@ import javax.annotation.Resource; | ||
| 19 | import java.util.Collection; | 19 | import java.util.Collection; |
| 20 | import java.util.Collections; | 20 | import java.util.Collections; |
| 21 | import java.util.List; | 21 | import java.util.List; |
| 22 | +import java.util.Set; | ||
| 22 | 23 | ||
| 23 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 24 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 24 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 25 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| @@ -53,6 +54,16 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { | @@ -53,6 +54,16 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { | ||
| 53 | } | 54 | } |
| 54 | 55 | ||
| 55 | @Override | 56 | @Override |
| 57 | + public void createPermissionBatch(List<CrmPermissionCreateReqBO> createBOs) { | ||
| 58 | + // 1. 校验用户是否存在 | ||
| 59 | + adminUserApi.validateUserList(convertSet(createBOs, CrmPermissionCreateReqBO::getUserId)); | ||
| 60 | + | ||
| 61 | + // 2. 创建 | ||
| 62 | + List<CrmPermissionDO> permissions = CrmPermissionConvert.INSTANCE.convertList(createBOs); | ||
| 63 | + crmPermissionMapper.insertBatch(permissions); | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + @Override | ||
| 56 | @Transactional(rollbackFor = Exception.class) | 67 | @Transactional(rollbackFor = Exception.class) |
| 57 | public void updatePermission(CrmPermissionUpdateReqVO updateReqVO) { | 68 | public void updatePermission(CrmPermissionUpdateReqVO updateReqVO) { |
| 58 | // 1. 校验存在 | 69 | // 1. 校验存在 |
| @@ -112,16 +123,6 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { | @@ -112,16 +123,6 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { | ||
| 112 | 123 | ||
| 113 | @Override | 124 | @Override |
| 114 | @Transactional(rollbackFor = Exception.class) | 125 | @Transactional(rollbackFor = Exception.class) |
| 115 | - public void deletePermission(Collection<Long> ids) { | ||
| 116 | - // 校验存在 | ||
| 117 | - validateCrmPermissionExists(ids); | ||
| 118 | - | ||
| 119 | - // 删除 | ||
| 120 | - crmPermissionMapper.deleteBatchIds(ids); | ||
| 121 | - } | ||
| 122 | - | ||
| 123 | - @Override | ||
| 124 | - @Transactional(rollbackFor = Exception.class) | ||
| 125 | public void deletePermission(Integer bizType, Long bizId, Integer level) { | 126 | public void deletePermission(Integer bizType, Long bizId, Integer level) { |
| 126 | List<CrmPermissionDO> permissions = crmPermissionMapper.selectListByBizTypeAndBizIdAndLevel( | 127 | List<CrmPermissionDO> permissions = crmPermissionMapper.selectListByBizTypeAndBizIdAndLevel( |
| 127 | bizType, bizId, level); | 128 | bizType, bizId, level); |
| @@ -135,21 +136,44 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { | @@ -135,21 +136,44 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { | ||
| 135 | } | 136 | } |
| 136 | 137 | ||
| 137 | @Override | 138 | @Override |
| 138 | - public CrmPermissionDO getPermission(Long id, Long userId) { | ||
| 139 | - return crmPermissionMapper.selectByIdAndUserId(id, userId); | 139 | + public void deletePermissionBatch(Collection<Long> ids, Long userId) { |
| 140 | + List<CrmPermissionDO> permissions = crmPermissionMapper.selectBatchIds(ids); | ||
| 141 | + if (CollUtil.isEmpty(permissions)) { | ||
| 142 | + throw exception(CRM_PERMISSION_NOT_EXISTS); | ||
| 143 | + } | ||
| 144 | + Set<Long> bizIds = convertSet(permissions, CrmPermissionDO::getBizId); | ||
| 145 | + if (bizIds.size() > 1) { // 情况一:数据权限的模块数据编号是一致的不可能存在两个 | ||
| 146 | + throw exception(CRM_PERMISSION_DELETE_FAIL); | ||
| 147 | + } | ||
| 148 | + // 校验操作人是否为负责人 | ||
| 149 | + CrmPermissionDO permission = crmPermissionMapper.selectByIdAndUserId(permissions.get(0).getBizId(), userId); | ||
| 150 | + if (!CrmPermissionLevelEnum.isOwner(permission.getLevel())) { | ||
| 151 | + throw exception(CRM_PERMISSION_DELETE_DENIED); | ||
| 152 | + } | ||
| 153 | + | ||
| 154 | + // 删除数据权限 | ||
| 155 | + crmPermissionMapper.deleteBatchIds(ids); | ||
| 140 | } | 156 | } |
| 141 | 157 | ||
| 142 | @Override | 158 | @Override |
| 143 | - public List<CrmPermissionDO> getPermissionListByBiz(Integer bizType, Long bizId) { | ||
| 144 | - return crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId); | 159 | + public void deleteSelfPermission(Long id, Long userId) { |
| 160 | + // 校验数据存在且是自己 | ||
| 161 | + CrmPermissionDO permission = crmPermissionMapper.selectByIdAndUserId(id, userId); | ||
| 162 | + if (permission == null) { | ||
| 163 | + throw exception(CRM_PERMISSION_NOT_EXISTS); | ||
| 164 | + } | ||
| 165 | + // 校验是否是负责人 | ||
| 166 | + if (CrmPermissionLevelEnum.isOwner(permission.getLevel())) { | ||
| 167 | + throw exception(CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER); | ||
| 168 | + } | ||
| 169 | + | ||
| 170 | + // 删除 | ||
| 171 | + crmPermissionMapper.deleteById(id); | ||
| 145 | } | 172 | } |
| 146 | 173 | ||
| 147 | @Override | 174 | @Override |
| 148 | - public List<CrmPermissionDO> getPermissionList(Collection<Long> ids) { | ||
| 149 | - if (CollUtil.isEmpty(ids)) { | ||
| 150 | - return Collections.emptyList(); | ||
| 151 | - } | ||
| 152 | - return crmPermissionMapper.selectBatchIds(ids); | 175 | + public List<CrmPermissionDO> getPermissionListByBiz(Integer bizType, Long bizId) { |
| 176 | + return crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId); | ||
| 153 | } | 177 | } |
| 154 | 178 | ||
| 155 | @Override | 179 | @Override |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java deleted
| 1 | -package cn.iocoder.yudao.module.crm.util; | ||
| 2 | - | ||
| 3 | -import cn.hutool.core.util.StrUtil; | ||
| 4 | -import com.github.yulichang.wrapper.MPJLambdaWrapper; | ||
| 5 | - | ||
| 6 | -// TODO @puhui999:这个类还要哇? | ||
| 7 | -/** | ||
| 8 | - * 数据权限工具类 | ||
| 9 | - * | ||
| 10 | - * @author HUIHUI | ||
| 11 | - */ | ||
| 12 | -public class CrmPermissionUtils { | ||
| 13 | - | ||
| 14 | - /** | ||
| 15 | - * 构建用户可查看数据连表条件 | ||
| 16 | - * | ||
| 17 | - * @param mpjLambdaWrapper 多表查询 wrapper | ||
| 18 | - * @param bizTyp 模块类型 | ||
| 19 | - * @param userId 用户 | ||
| 20 | - */ | ||
| 21 | - public static void builderRightJoinQuery(MPJLambdaWrapper<?> mpjLambdaWrapper, Integer bizTyp, Long userId) { | ||
| 22 | - String querySql = "(SELECT t1.biz_id FROM crm_permission t1 WHERE (t1.biz_type = {} AND t1.user_id = {})) t2 on t.id = t2.biz_id"; | ||
| 23 | - // 默认主表别名是 t | ||
| 24 | - mpjLambdaWrapper.rightJoin(StrUtil.format(querySql, bizTyp, userId)); | ||
| 25 | - } | ||
| 26 | - | ||
| 27 | -} |