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 1 package cn.iocoder.yudao.module.crm.controller.admin.permission;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.util.ObjUtil;
5 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 6 import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionCreateReqVO;
... ... @@ -30,11 +29,9 @@ import javax.annotation.Resource;
30 29 import javax.validation.Valid;
31 30 import java.util.*;
32 31  
33   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
34 32 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
35 33 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
36 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 36 @Tag(name = "管理后台 - CRM 数据权限")
40 37 @RestController
... ... @@ -71,59 +68,21 @@ public class CrmPermissionController {
71 68 return success(true);
72 69 }
73 70  
74   - // TODO @puhui999:这个要不要放到 Service 实现,让 Controller 还轻一点;
75 71 @DeleteMapping("/delete")
76 72 @Operation(summary = "删除数据权限")
77 73 @Parameter(name = "ids", description = "数据权限编号", required = true, example = "1024")
78 74 @PreAuthorize("@ss.hasPermission('crm:permission:delete')")
79 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 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 81 @Operation(summary = "删除自己的数据权限")
112 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 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 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 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 40 * @param updateReqVO 更新信息
... ... @@ -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 54 * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
55 55 * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
56 56 * @param level 数据权限级别,关联 {@link CrmPermissionLevelEnum}
... ... @@ -58,13 +58,19 @@ public interface CrmPermissionService {
58 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 70 * @param id 权限编号
64 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 76 * 获取数据权限列表,通过 数据类型 x 某个数据
... ... @@ -76,14 +82,6 @@ public interface CrmPermissionService {
76 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 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 19 import java.util.Collection;
20 20 import java.util.Collections;
21 21 import java.util.List;
  22 +import java.util.Set;
22 23  
23 24 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
24 25 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
... ... @@ -53,6 +54,16 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
53 54 }
54 55  
55 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 67 @Transactional(rollbackFor = Exception.class)
57 68 public void updatePermission(CrmPermissionUpdateReqVO updateReqVO) {
58 69 // 1. 校验存在
... ... @@ -112,16 +123,6 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
112 123  
113 124 @Override
114 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 126 public void deletePermission(Integer bizType, Long bizId, Integer level) {
126 127 List<CrmPermissionDO> permissions = crmPermissionMapper.selectListByBizTypeAndBizIdAndLevel(
127 128 bizType, bizId, level);
... ... @@ -135,21 +136,44 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
135 136 }
136 137  
137 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 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 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 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   -}