Commit 7f569f32998b7a8f036c8ede96389ff18de8b0e2

Authored by puhui999
1 parent 3e9eb59d

crm-数据权限:完善数据权限

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 -}