Commit 794649ea8a55741e43c1e2ac15a687607c7360e9

Authored by puhui999
1 parent f4c92089

CRM-数据权限:完善团队成员相关操作

yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java
... ... @@ -28,17 +28,16 @@ import org.springframework.web.bind.annotation.*;
28 28  
29 29 import javax.annotation.Resource;
30 30 import javax.validation.Valid;
31   -import java.util.Collections;
32   -import java.util.List;
33   -import java.util.Map;
34   -import java.util.Set;
  31 +import java.util.*;
35 32 import java.util.function.Predicate;
36 33 import java.util.stream.Collectors;
37 34  
  35 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
38 36 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
39 37 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
40 38 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
41 39 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  40 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSION_NOT_EXISTS;
42 41  
43 42 @Tag(name = "管理后台 - CRM 数据权限(数据团队成员操作)")
44 43 @RestController
... ... @@ -85,12 +84,12 @@ public class CrmPermissionController {
85 84 }
86 85  
87 86 @PutMapping("/update")
88   - @Operation(summary = "编辑团队成员")
  87 + @Operation(summary = "编辑团队成员权限")
89 88 @PreAuthorize("@ss.hasPermission('crm:permission:update')")
90 89 @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#updateReqVO.bizType", bizId = "#updateReqVO.bizId"
91   - , level = CrmPermissionLevelEnum.WRITE)
  90 + , level = CrmPermissionLevelEnum.OWNER)
92 91 public CommonResult<Boolean> updatePermission(@Valid @RequestBody CrmPermissionUpdateReqVO updateReqVO) {
93   - permissionService.updatePermission(CrmPermissionConvert.INSTANCE.convert(updateReqVO));
  92 + permissionService.updatePermission(updateReqVO);
94 93 return success(true);
95 94 }
96 95  
... ... @@ -99,15 +98,33 @@ public class CrmPermissionController {
99 98 @Parameters({
100 99 @Parameter(name = "bizType", description = "CRM 类型", required = true, example = "2"),
101 100 @Parameter(name = "bizId", description = "CRM 类型数据编号", required = true, example = "1024"),
102   - @Parameter(name = "id", description = "团队成员编号", required = true, example = "1024")
  101 + @Parameter(name = "ids", description = "团队成员编号", required = true, example = "1024")
103 102 })
104 103 @PreAuthorize("@ss.hasPermission('crm:permission:delete')")
105 104 @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#bizType", bizId = "#bizId"
106   - , level = CrmPermissionLevelEnum.OWNER)
  105 + , level = CrmPermissionLevelEnum.OWNER) // 为了校验权限请求必须带上 bizType 和 bizId
107 106 public CommonResult<Boolean> deletePermission(@RequestParam("bizType") Integer bizType,
108 107 @RequestParam("bizId") Long bizId,
109   - @RequestParam("id") Long id) {
110   - permissionService.deletePermission(id);
  108 + @RequestParam("ids") Collection<Long> ids) {
  109 + permissionService.deletePermission(ids);
  110 + return success(true);
  111 + }
  112 +
  113 + @DeleteMapping("/quit-team")
  114 + @Operation(summary = "退出团队")
  115 + @Parameters({
  116 + @Parameter(name = "id", description = "团队成员编号", required = true, example = "1024")
  117 + })
  118 + @PreAuthorize("@ss.hasPermission('crm:permission:delete')")
  119 + public CommonResult<Boolean> deletePermission(@RequestParam("id") Long id) {
  120 + // 校验数据存在且是自己
  121 + CrmPermissionDO permission = permissionService.getPermissionByIdAndUserId(id, getLoginUserId());
  122 + if (permission == null) {
  123 + throw exception(CRM_PERMISSION_NOT_EXISTS);
  124 + }
  125 +
  126 + // 删除
  127 + permissionService.deletePermission(Collections.singletonList(id));
111 128 return success(true);
112 129 }
113 130  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionRespVO.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.permission.vo;
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
5 5  
  6 +import java.time.LocalDateTime;
6 7 import java.util.Set;
7 8  
8 9 @Schema(description = "管理后台 - CRM 数据权限(团队成员) Response VO")
... ... @@ -21,4 +22,7 @@ public class CrmPermissionRespVO extends CrmPermissionBaseVO {
21 22 @Schema(description = "岗位名称数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[BOOS,经理]")
22 23 private Set<String> postNames;
23 24  
  25 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-01-01 00:00:00")
  26 + private LocalDateTime createTime;
  27 +
24 28 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionUpdateReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.permission.vo;
2 2  
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
  5 +import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
3 6 import io.swagger.v3.oas.annotations.media.Schema;
4 7 import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7 8  
8 9 import javax.validation.constraints.NotNull;
  10 +import java.util.List;
9 11  
10 12 @Schema(description = "管理后台 - CRM 数据权限更新 Request VO")
11 13 @Data
12   -@EqualsAndHashCode(callSuper = true)
13   -@ToString(callSuper = true)
14   -public class CrmPermissionUpdateReqVO extends CrmPermissionBaseVO {
  14 +public class CrmPermissionUpdateReqVO {
15 15  
16   - @Schema(description = "数据权限编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
17   - @NotNull(message = "数据权限编号不能为空")
18   - private Long id;
  16 + @Schema(description = "数据权限编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2]")
  17 + @NotNull(message = "数据权限编号列表不能为空")
  18 + private List<Long> ids;
19 19  
20   - // TODO @puhui999:是不是只更新 permission??? 是的
  20 + @Schema(description = "Crm 类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  21 + @InEnum(CrmBizTypeEnum.class)
  22 + @NotNull(message = "Crm 类型不能为空")
  23 + private Integer bizType;
  24 +
  25 + @Schema(description = "Crm 类型数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  26 + @NotNull(message = "Crm 类型数据编号不能为空")
  27 + private Long bizId;
  28 +
  29 + @Schema(description = "权限级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  30 + @InEnum(CrmPermissionLevelEnum.class)
  31 + @NotNull(message = "权限级别不能为空")
  32 + private Integer level;
21 33  
22 34 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java
... ... @@ -15,6 +15,7 @@ import com.google.common.collect.Multimaps;
15 15 import org.mapstruct.Mapper;
16 16 import org.mapstruct.factory.Mappers;
17 17  
  18 +import java.util.ArrayList;
18 19 import java.util.List;
19 20 import java.util.Map;
20 21  
... ... @@ -54,4 +55,12 @@ public interface CrmPermissionConvert {
54 55 });
55 56 }
56 57  
  58 + default List<CrmPermissionDO> convertList(CrmPermissionUpdateReqVO updateReqVO) {
  59 + List<CrmPermissionDO> permissions = new ArrayList<>();
  60 + updateReqVO.getIds().forEach(id -> {
  61 + permissions.add(new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel()));
  62 + });
  63 + return permissions;
  64 + }
  65 +
57 66 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java
... ... @@ -42,4 +42,9 @@ public interface CrmPermissionMapper extends BaseMapperX&lt;CrmPermissionDO&gt; {
42 42 .eq(CrmPermissionDO::getLevel, level));
43 43 }
44 44  
  45 + default CrmPermissionDO selectByIdAndUserId(Long id, Long userId) {
  46 + return selectOne(new LambdaQueryWrapperX<CrmPermissionDO>()
  47 + .eq(CrmPermissionDO::getId, id).eq(CrmPermissionDO::getUserId, userId));
  48 + }
  49 +
45 50 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java
1 1 package cn.iocoder.yudao.module.crm.service.permission;
2 2  
3 3  
  4 +import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO;
4 5 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
5 6 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
6 7 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
7 8 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
8   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO;
9 9  
10 10 import javax.validation.Valid;
11 11 import java.util.Collection;
... ... @@ -29,16 +29,16 @@ public interface CrmPermissionService {
29 29 /**
30 30 * 更新数据权限
31 31 *
32   - * @param updateBO 更新信息
  32 + * @param updateReqVO 更新信息
33 33 */
34   - void updatePermission(@Valid CrmPermissionUpdateReqBO updateBO);
  34 + void updatePermission(CrmPermissionUpdateReqVO updateReqVO);
35 35  
36 36 /**
37 37 * 删除数据权限
38 38 *
39   - * @param id 编号
  39 + * @param ids 编号
40 40 */
41   - void deletePermission(Long id);
  41 + void deletePermission(Collection<Long> ids);
42 42  
43 43 /**
44 44 * 获取用户数据权限通过 数据类型 x 某个数据 x 用户编号
... ... @@ -51,6 +51,15 @@ public interface CrmPermissionService {
51 51 CrmPermissionDO getPermissionByBizTypeAndBizIdAndUserId(Integer bizType, Long bizId, Long userId);
52 52  
53 53 /**
  54 + * 获取用户数据权限通过 权限编号 x 用户编号
  55 + *
  56 + * @param id 权限编号
  57 + * @param userId 用户编号
  58 + * @return 数据权限
  59 + */
  60 + CrmPermissionDO getPermissionByIdAndUserId(Long id, Long userId);
  61 +
  62 + /**
54 63 * 获取数据权限列表,通过 数据类型 x 某个数据
55 64 *
56 65 * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.service.permission;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.ObjUtil;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO;
5 6 import cn.iocoder.yudao.module.crm.convert.permission.CrmPermissionConvert;
6 7 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
7 8 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper;
... ... @@ -9,7 +10,6 @@ import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
9 10 import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
10 11 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
11 12 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
12   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO;
13 13 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
14 14 import org.springframework.stereotype.Service;
15 15 import org.springframework.transaction.annotation.Transactional;
... ... @@ -53,25 +53,22 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
53 53  
54 54 @Override
55 55 @Transactional(rollbackFor = Exception.class)
56   - public void updatePermission(CrmPermissionUpdateReqBO updateBO) {
57   - // 1.1 校验用户是否存在
58   - adminUserApi.validateUserList(Collections.singletonList(updateBO.getUserId()));
59   - // 1.2 校验存在
60   - validateCrmPermissionExists(updateBO.getId());
61   -
62   - // 2. 更新操作
63   - CrmPermissionDO updateDO = CrmPermissionConvert.INSTANCE.convert(updateBO);
64   - crmPermissionMapper.updateById(updateDO);
  56 + public void updatePermission(CrmPermissionUpdateReqVO updateReqVO) {
  57 + // 校验存在
  58 + validateCrmPermissionExists(updateReqVO.getIds());
  59 +
  60 + List<CrmPermissionDO> updateDO = CrmPermissionConvert.INSTANCE.convertList(updateReqVO);
  61 + crmPermissionMapper.updateBatch(updateDO);
65 62 }
66 63  
67 64 @Override
68 65 @Transactional(rollbackFor = Exception.class)
69   - public void deletePermission(Long id) {
  66 + public void deletePermission(Collection<Long> ids) {
70 67 // 校验存在
71   - validateCrmPermissionExists(id);
  68 + validateCrmPermissionExists(ids);
72 69  
73 70 // 删除
74   - crmPermissionMapper.deleteById(id);
  71 + crmPermissionMapper.deleteBatchIds(ids);
75 72 }
76 73  
77 74 @Override
... ... @@ -80,6 +77,11 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
80 77 }
81 78  
82 79 @Override
  80 + public CrmPermissionDO getPermissionByIdAndUserId(Long id, Long userId) {
  81 + return crmPermissionMapper.selectByIdAndUserId(id, userId);
  82 + }
  83 +
  84 + @Override
83 85 public List<CrmPermissionDO> getPermissionByBizTypeAndBizId(Integer bizType, Long bizId) {
84 86 return crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId);
85 87 }
... ... @@ -89,13 +91,16 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
89 91 return crmPermissionMapper.selectListByBizTypeAndBizIdsAndLevel(bizType, bizIds, level);
90 92 }
91 93  
92   - private void validateCrmPermissionExists(Long id) {
93   - if (crmPermissionMapper.selectById(id) == null) {
  94 + private void validateCrmPermissionExists(Collection<Long> ids) {
  95 + List<CrmPermissionDO> permissionList = crmPermissionMapper.selectBatchIds(ids);
  96 + // 校验存在
  97 + if (ObjUtil.notEqual(permissionList.size(), ids.size())) {
94 98 throw exception(CRM_PERMISSION_NOT_EXISTS);
95 99 }
96 100 }
97 101  
98 102 @Override
  103 + @Transactional(rollbackFor = Exception.class)
99 104 public void transferPermission(CrmPermissionTransferReqBO transferReqBO) {
100 105 // 1. 校验数据权限-是否是负责人,只有负责人才可以转移
101 106 CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(transferReqBO.getBizType(),
... ... @@ -142,6 +147,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
142 147 }
143 148  
144 149 @Override
  150 + @Transactional(rollbackFor = Exception.class)
145 151 public void receiveBiz(Integer bizType, Long bizId, Long userId) {
146 152 CrmPermissionDO permission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, CrmPermissionDO.POOL_USER_ID);
147 153 if (permission == null) { // 不存在则模块数据也不存在
... ... @@ -152,6 +158,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
152 158 }
153 159  
154 160 @Override
  161 + @Transactional(rollbackFor = Exception.class)
155 162 public void putPool(Integer bizType, Long bizId, Long userId) {
156 163 CrmPermissionDO permission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, userId);
157 164 if (permission == null) { // 不存在则模块数据也不存在
... ...