Commit 6b752b5cb4b27bda60fb47a0c638a106d5fa2458

Authored by 芋道源码
Committed by Gitee
2 parents 8dcc12f2 af5fbb6f

!907 CRM: 根据 review 完善数据权限

Merge pull request !907 from puhui999/develop
Showing 20 changed files with 207 additions and 144 deletions
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java
@@ -60,32 +60,17 @@ public class SelectSheetWriteHandler implements SheetWriteHandler { @@ -60,32 +60,17 @@ public class SelectSheetWriteHandler implements SheetWriteHandler {
60 } 60 }
61 61
62 // 解析下拉数据 62 // 解析下拉数据
63 - Map<String, Field> excelPropertyFields = getFieldsWithAnnotation(head, ExcelProperty.class);  
64 - Map<String, Field> excelColumnSelectFields = getFieldsWithAnnotation(head, ExcelColumnSelect.class);  
65 int colIndex = 0; 63 int colIndex = 0;
66 - for (String fieldName : excelPropertyFields.keySet()) {  
67 - Field field = excelColumnSelectFields.get(fieldName);  
68 - if (field != null) {  
69 - // ExcelProperty 有一个自定义列索引的属性 index 兼容这个字段  
70 - int index = field.getAnnotation(ExcelProperty.class).index();  
71 - if (index != -1) {  
72 - colIndex = index; 64 + for (Field field : head.getDeclaredFields()) {
  65 + if (field.isAnnotationPresent(ExcelColumnSelect.class)) {
  66 + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
  67 + if (excelProperty != null && excelProperty.index() != -1) {
  68 + colIndex = excelProperty.index();
73 } 69 }
74 - buildSelectDataList(colIndex, field); 70 + getSelectDataList(colIndex, field);
75 } 71 }
76 colIndex++; 72 colIndex++;
77 } 73 }
78 - // TODO @puhui999:感觉可以 head 循环 field,如果有 ExcelColumnSelect 则进行处理;而 ExcelProperty 可能是非必须的。回答:主要是用于定位到列索引;补充:可以看看下面这样写?  
79 -// for (Field field : head.getDeclaredFields()) {  
80 -// if (field.isAnnotationPresent(ExcelColumnSelect.class)) {  
81 -// ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);  
82 -// if (excelProperty != null) {  
83 -// colIndex = excelProperty.index();  
84 -// }  
85 -// getSelectDataList(colIndex, field);  
86 -// }  
87 -// colIndex++;  
88 -// }  
89 } 74 }
90 75
91 /** 76 /**
@@ -94,7 +79,7 @@ public class SelectSheetWriteHandler implements SheetWriteHandler { @@ -94,7 +79,7 @@ public class SelectSheetWriteHandler implements SheetWriteHandler {
94 * @param colIndex 列索引 79 * @param colIndex 列索引
95 * @param field 字段 80 * @param field 字段
96 */ 81 */
97 - private void buildSelectDataList(int colIndex, Field field) { 82 + private void getSelectDataList(int colIndex, Field field) {
98 ExcelColumnSelect columnSelect = field.getAnnotation(ExcelColumnSelect.class); 83 ExcelColumnSelect columnSelect = field.getAnnotation(ExcelColumnSelect.class);
99 String dictType = columnSelect.dictType(); 84 String dictType = columnSelect.dictType();
100 String functionName = columnSelect.functionName(); 85 String functionName = columnSelect.functionName();
@@ -174,15 +159,4 @@ public class SelectSheetWriteHandler implements SheetWriteHandler { @@ -174,15 +159,4 @@ public class SelectSheetWriteHandler implements SheetWriteHandler {
174 writeSheetHolder.getSheet().addValidationData(validation); 159 writeSheetHolder.getSheet().addValidationData(validation);
175 } 160 }
176 161
177 - public static Map<String, Field> getFieldsWithAnnotation(Class<?> clazz, Class<? extends Annotation> annotationClass) {  
178 - Map<String, Field> annotatedFields = new LinkedHashMap<>();  
179 - Field[] fields = clazz.getDeclaredFields();  
180 - for (Field field : fields) {  
181 - if (field.isAnnotationPresent(annotationClass)) {  
182 - annotatedFields.put(field.getName(), field);  
183 - }  
184 - }  
185 - return annotatedFields;  
186 - }  
187 -  
188 } 162 }
189 \ No newline at end of file 163 \ No newline at end of file
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
@@ -74,6 +74,7 @@ public interface ErrorCodeConstants { @@ -74,6 +74,7 @@ public interface ErrorCodeConstants {
74 ErrorCode CRM_PERMISSION_DELETE_DENIED = new ErrorCode(1_020_007_006, "删除数据权限失败,原因:没有权限"); 74 ErrorCode CRM_PERMISSION_DELETE_DENIED = new ErrorCode(1_020_007_006, "删除数据权限失败,原因:没有权限");
75 ErrorCode CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_007, "删除数据权限失败,原因:不能删除负责人"); 75 ErrorCode CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_007, "删除数据权限失败,原因:不能删除负责人");
76 ErrorCode CRM_PERMISSION_CREATE_FAIL = new ErrorCode(1_020_007_008, "创建数据权限失败,原因:所加用户已有权限"); 76 ErrorCode CRM_PERMISSION_CREATE_FAIL = new ErrorCode(1_020_007_008, "创建数据权限失败,原因:所加用户已有权限");
  77 + ErrorCode CRM_PERMISSION_CREATE_FAIL_EXISTS = new ErrorCode(1_020_007_009, "同时添加数据权限失败,原因:用户【{}】已有模块【{}】数据【{}】的【{}】权限");
77 78
78 // ========== 产品 1_020_008_000 ========== 79 // ========== 产品 1_020_008_000 ==========
79 ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1_020_008_000, "产品不存在"); 80 ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1_020_008_000, "产品不存在");
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java
1 package cn.iocoder.yudao.module.crm.enums.permission; 1 package cn.iocoder.yudao.module.crm.enums.permission;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.hutool.core.util.ObjUtil; 4 import cn.hutool.core.util.ObjUtil;
4 import cn.iocoder.yudao.framework.common.core.IntArrayValuable; 5 import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
5 import lombok.AllArgsConstructor; 6 import lombok.AllArgsConstructor;
@@ -50,4 +51,10 @@ public enum CrmPermissionLevelEnum implements IntArrayValuable { @@ -50,4 +51,10 @@ public enum CrmPermissionLevelEnum implements IntArrayValuable {
50 return ObjUtil.equal(WRITE.level, level); 51 return ObjUtil.equal(WRITE.level, level);
51 } 52 }
52 53
  54 + public static String getNameByLevel(Integer level) {
  55 + CrmPermissionLevelEnum typeEnum = CollUtil.findOne(CollUtil.newArrayList(CrmPermissionLevelEnum.values()),
  56 + item -> ObjUtil.equal(item.level, level));
  57 + return typeEnum == null ? null : typeEnum.getName();
  58 + }
  59 +
53 } 60 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessSaveReqVO.java
@@ -66,13 +66,13 @@ public class CrmBusinessSaveReqVO { @@ -66,13 +66,13 @@ public class CrmBusinessSaveReqVO {
66 private Long contactId; // 使用场景,在【联系人详情】添加商机时,如果需要关联两者,需要传递 contactId 字段 66 private Long contactId; // 使用场景,在【联系人详情】添加商机时,如果需要关联两者,需要传递 contactId 字段
67 67
68 @Schema(description = "产品列表") 68 @Schema(description = "产品列表")
69 - private List<Product> products; 69 + private List<BusinessProduct> businessProducts;
70 70
71 @Schema(description = "产品列表") 71 @Schema(description = "产品列表")
72 @Data 72 @Data
73 @NoArgsConstructor 73 @NoArgsConstructor
74 @AllArgsConstructor 74 @AllArgsConstructor
75 - public static class Product { 75 + public static class BusinessProduct {
76 76
77 @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") 77 @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
78 @NotNull(message = "产品编号不能为空") 78 @NotNull(message = "产品编号不能为空")
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java
@@ -13,10 +13,9 @@ import lombok.NoArgsConstructor; @@ -13,10 +13,9 @@ import lombok.NoArgsConstructor;
13 @AllArgsConstructor 13 @AllArgsConstructor
14 public class CrmBusinessTransferReqVO { 14 public class CrmBusinessTransferReqVO {
15 15
16 - // TODO @puhui999:这里最好还是用 id 哈,主要还是在 Business 业务里  
17 @Schema(description = "商机编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 16 @Schema(description = "商机编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
18 @NotNull(message = "商机编号不能为空") 17 @NotNull(message = "商机编号不能为空")
19 - private Long bizId; 18 + private Long id;
20 19
21 /** 20 /**
22 * 新负责人的用户编号 21 * 新负责人的用户编号
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueTransferReqVO.java
@@ -12,7 +12,7 @@ public class CrmClueTransferReqVO { @@ -12,7 +12,7 @@ public class CrmClueTransferReqVO {
12 12
13 @Schema(description = "线索编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 13 @Schema(description = "线索编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
14 @NotNull(message = "线索编号不能为空") 14 @NotNull(message = "线索编号不能为空")
15 - private Long bizId; 15 + private Long id;
16 16
17 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 17 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
18 @NotNull(message = "新负责人的用户编号不能为空") 18 @NotNull(message = "新负责人的用户编号不能为空")
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java
@@ -16,7 +16,7 @@ public class CrmContactTransferReqVO { @@ -16,7 +16,7 @@ public class CrmContactTransferReqVO {
16 16
17 @Schema(description = "联系人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 17 @Schema(description = "联系人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
18 @NotNull(message = "联系人编号不能为空") 18 @NotNull(message = "联系人编号不能为空")
19 - private Long bizId; 19 + private Long id;
20 20
21 /** 21 /**
22 * 新负责人的用户编号 22 * 新负责人的用户编号
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractTransferReqVO.java
@@ -17,7 +17,7 @@ public class CrmContractTransferReqVO { @@ -17,7 +17,7 @@ public class CrmContractTransferReqVO {
17 17
18 @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 18 @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
19 @NotNull(message = "联系人编号不能为空") 19 @NotNull(message = "联系人编号不能为空")
20 - private Long bizId; 20 + private Long id;
21 21
22 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 22 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
23 @NotNull(message = "新负责人的用户编号不能为空") 23 @NotNull(message = "新负责人的用户编号不能为空")
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerTransferReqVO.java
@@ -13,7 +13,7 @@ public class CrmCustomerTransferReqVO { @@ -13,7 +13,7 @@ public class CrmCustomerTransferReqVO {
13 13
14 @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 14 @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
15 @NotNull(message = "客户编号不能为空") 15 @NotNull(message = "客户编号不能为空")
16 - private Long bizId; 16 + private Long id;
17 17
18 /** 18 /**
19 * 新负责人的用户编号 19 * 新负责人的用户编号
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.extra.spring.SpringUtil;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 6 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
6 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 7 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
@@ -56,63 +57,20 @@ public class CrmPermissionController { @@ -56,63 +57,20 @@ public class CrmPermissionController {
56 @Resource 57 @Resource
57 private CrmPermissionService permissionService; 58 private CrmPermissionService permissionService;
58 @Resource 59 @Resource
59 - private CrmContactService contactService;  
60 - @Resource  
61 - private CrmBusinessService businessService;  
62 - @Resource  
63 - private CrmContractService contractService;  
64 - @Resource  
65 private AdminUserApi adminUserApi; 60 private AdminUserApi adminUserApi;
66 @Resource 61 @Resource
67 private DeptApi deptApi; 62 private DeptApi deptApi;
68 @Resource 63 @Resource
69 private PostApi postApi; 64 private PostApi postApi;
70 65
71 - // TODO @puhui999:是不是还是叫 create 好点哈。  
72 @PostMapping("/create") 66 @PostMapping("/create")
73 @Operation(summary = "创建数据权限") 67 @Operation(summary = "创建数据权限")
74 - @Transactional(rollbackFor = Exception.class)  
75 @PreAuthorize("@ss.hasPermission('crm:permission:create')") 68 @PreAuthorize("@ss.hasPermission('crm:permission:create')")
76 - @CrmPermission(bizTypeValue = "#reqVO.bizType", bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER)  
77 - public CommonResult<Boolean> savePermission(@Valid @RequestBody CrmPermissionSaveReqVO reqVO) {  
78 - permissionService.createPermission(BeanUtils.toBean(reqVO, CrmPermissionCreateReqBO.class));  
79 - // 处理【同时添加至】的权限  
80 - if (CollUtil.isNotEmpty(reqVO.getToBizTypes())) {  
81 - createBizTypePermissions(reqVO);  
82 - } 69 + public CommonResult<Boolean> create(@Valid @RequestBody CrmPermissionSaveReqVO reqVO) {
  70 + permissionService.createPermission(reqVO, getLoginUserId());
83 return success(true); 71 return success(true);
84 } 72 }
85 73
86 - private void createBizTypePermissions(CrmPermissionSaveReqVO reqVO) {  
87 - List<CrmPermissionCreateReqBO> createPermissions = new ArrayList<>();  
88 - // TODO @puhui999:需要考虑,被添加人,是不是应该有对应的权限了;  
89 - if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTACT.getType())) {  
90 - List<CrmContactDO> contactList = contactService.getContactListByCustomerIdOwnerUserId(reqVO.getBizId(), getLoginUserId());  
91 - contactList.forEach(item -> {  
92 - createPermissions.add(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTACT.getType())  
93 - .setBizId(item.getId()).setUserId(reqVO.getUserId()).setLevel(reqVO.getLevel()));  
94 - });  
95 - }  
96 - if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_BUSINESS.getType())) {  
97 - List<CrmBusinessDO> businessList = businessService.getBusinessListByCustomerIdOwnerUserId(reqVO.getBizId(), getLoginUserId());  
98 - businessList.forEach(item -> {  
99 - createPermissions.add(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType())  
100 - .setBizId(item.getId()).setUserId(reqVO.getUserId()).setLevel(reqVO.getLevel()));  
101 - });  
102 - }  
103 - if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTRACT.getType())) {  
104 - List<CrmContractDO> contractList = contractService.getContractListByCustomerIdOwnerUserId(reqVO.getBizId(), getLoginUserId());  
105 - contractList.forEach(item -> {  
106 - createPermissions.add(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType())  
107 - .setBizId(item.getId()).setUserId(reqVO.getUserId()).setLevel(reqVO.getLevel()));  
108 - });  
109 - }  
110 - if (CollUtil.isEmpty(createPermissions)) {  
111 - return;  
112 - }  
113 - permissionService.createPermissionBatch(createPermissions);  
114 - }  
115 -  
116 @PutMapping("/update") 74 @PutMapping("/update")
117 @Operation(summary = "编辑数据权限") 75 @Operation(summary = "编辑数据权限")
118 @PreAuthorize("@ss.hasPermission('crm:permission:update')") 76 @PreAuthorize("@ss.hasPermission('crm:permission:update')")
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java
@@ -74,10 +74,7 @@ public interface CrmContactMapper extends BaseMapperX&lt;CrmContactDO&gt; { @@ -74,10 +74,7 @@ public interface CrmContactMapper extends BaseMapperX&lt;CrmContactDO&gt; {
74 } 74 }
75 75
76 default List<CrmContactDO> selectListByCustomerIdOwnerUserId(Long customerId, Long ownerUserId) { 76 default List<CrmContactDO> selectListByCustomerIdOwnerUserId(Long customerId, Long ownerUserId) {
77 - // TODO @puhui999:父类有 selectList,查询 2 个字段的简化方法哈,可以用下  
78 - return selectList(new LambdaQueryWrapperX<CrmContactDO>()  
79 - .eq(CrmContactDO::getCustomerId, customerId)  
80 - .eq(CrmContactDO::getOwnerUserId, ownerUserId)); 77 + return selectList(CrmContactDO::getCustomerId, customerId, CrmContactDO::getOwnerUserId, ownerUserId);
81 } 78 }
82 79
83 } 80 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java
@@ -53,9 +53,11 @@ public interface CrmPermissionMapper extends BaseMapperX&lt;CrmPermissionDO&gt; { @@ -53,9 +53,11 @@ public interface CrmPermissionMapper extends BaseMapperX&lt;CrmPermissionDO&gt; {
53 CrmPermissionDO::getUserId, userId); 53 CrmPermissionDO::getUserId, userId);
54 } 54 }
55 55
56 - default CrmPermissionDO selectByBizIdAndUserId(Long bizId, Long userId) {  
57 - return selectOne(CrmPermissionDO::getBizId, bizId,  
58 - CrmPermissionDO::getUserId, userId); 56 + default CrmPermissionDO selectByBizAndUserId(Integer bizType, Long bizId, Long userId) {
  57 + return selectOne(new LambdaQueryWrapperX<CrmPermissionDO>()
  58 + .eq(CrmPermissionDO::getBizType, bizType)
  59 + .eq(CrmPermissionDO::getBizId, bizId)
  60 + .eq(CrmPermissionDO::getUserId, userId));
59 } 61 }
60 62
61 default int deletePermission(Integer bizType, Long bizId) { 63 default int deletePermission(Integer bizType, Long bizId) {
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/excel/core/AreaExcelColumnSelectFunction.java
@@ -8,9 +8,7 @@ import org.springframework.stereotype.Service; @@ -8,9 +8,7 @@ import org.springframework.stereotype.Service;
8 import java.util.List; 8 import java.util.List;
9 9
10 /** 10 /**
11 - * Excel 所属地区列下拉数据源获取接口实现类  
12 - *  
13 - * // TODO @puhui999:类名叫:地区下拉框数据源的 {@link ExcelColumnSelectFunction} 实现类,这样看起来会更简洁一点哈 11 + * 地区下拉框数据源的 {@link ExcelColumnSelectFunction} 实现类
14 * 12 *
15 * @author HUIHUI 13 * @author HUIHUI
16 */ 14 */
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.crm.service.business; @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.crm.service.business;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
5 -import cn.hutool.extra.spring.SpringUtil;  
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; 6 import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -24,7 +23,6 @@ import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessService; @@ -24,7 +23,6 @@ import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessService;
24 import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; 23 import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
25 import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; 24 import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
26 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; 25 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
27 -import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerServiceImpl;  
28 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; 26 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
29 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; 27 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
30 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; 28 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
@@ -90,7 +88,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { @@ -90,7 +88,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
90 success = CRM_BUSINESS_CREATE_SUCCESS) 88 success = CRM_BUSINESS_CREATE_SUCCESS)
91 public Long createBusiness(CrmBusinessSaveReqVO createReqVO, Long userId) { 89 public Long createBusiness(CrmBusinessSaveReqVO createReqVO, Long userId) {
92 // 1.1 校验产品项的有效性 90 // 1.1 校验产品项的有效性
93 - List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(createReqVO.getProducts()); 91 + List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(createReqVO.getBusinessProducts());
94 // 1.2 校验关联字段 92 // 1.2 校验关联字段
95 validateRelationDataExists(createReqVO); 93 validateRelationDataExists(createReqVO);
96 94
@@ -131,7 +129,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { @@ -131,7 +129,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
131 // 1.1 校验存在 129 // 1.1 校验存在
132 CrmBusinessDO oldBusiness = validateBusinessExists(updateReqVO.getId()); 130 CrmBusinessDO oldBusiness = validateBusinessExists(updateReqVO.getId());
133 // 1.2 校验产品项的有效性 131 // 1.2 校验产品项的有效性
134 - List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(updateReqVO.getProducts()); 132 + List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(updateReqVO.getBusinessProducts());
135 // 1.3 校验关联字段 133 // 1.3 校验关联字段
136 validateRelationDataExists(updateReqVO); 134 validateRelationDataExists(updateReqVO);
137 135
@@ -204,9 +202,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { @@ -204,9 +202,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
204 } 202 }
205 } 203 }
206 204
207 - private List<CrmBusinessProductDO> validateBusinessProducts(List<CrmBusinessSaveReqVO.Product> list) { 205 + private List<CrmBusinessProductDO> validateBusinessProducts(List<CrmBusinessSaveReqVO.BusinessProduct> list) {
208 // 1. 校验产品存在 206 // 1. 校验产品存在
209 - productService.validProductList(convertSet(list, CrmBusinessSaveReqVO.Product::getProductId)); 207 + productService.validProductList(convertSet(list, CrmBusinessSaveReqVO.BusinessProduct::getProductId));
210 // 2. 转化为 CrmBusinessProductDO 列表 208 // 2. 转化为 CrmBusinessProductDO 列表
211 return convertList(list, o -> BeanUtils.toBean(o, CrmBusinessProductDO.class, 209 return convertList(list, o -> BeanUtils.toBean(o, CrmBusinessProductDO.class,
212 item -> item.setTotalPrice(MoneyUtils.priceMultiply(item.getBusinessPrice(), item.getCount())))); 210 item -> item.setTotalPrice(MoneyUtils.priceMultiply(item.getBusinessPrice(), item.getCount()))));
@@ -294,18 +292,18 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { @@ -294,18 +292,18 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
294 292
295 @Override 293 @Override
296 @Transactional(rollbackFor = Exception.class) 294 @Transactional(rollbackFor = Exception.class)
297 - @LogRecord(type = CRM_BUSINESS_TYPE, subType = CRM_BUSINESS_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", 295 + @LogRecord(type = CRM_BUSINESS_TYPE, subType = CRM_BUSINESS_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}",
298 success = CRM_BUSINESS_TRANSFER_SUCCESS) 296 success = CRM_BUSINESS_TRANSFER_SUCCESS)
299 - @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) 297 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER)
300 public void transferBusiness(CrmBusinessTransferReqVO reqVO, Long userId) { 298 public void transferBusiness(CrmBusinessTransferReqVO reqVO, Long userId) {
301 // 1 校验商机是否存在 299 // 1 校验商机是否存在
302 - CrmBusinessDO business = validateBusinessExists(reqVO.getBizId()); 300 + CrmBusinessDO business = validateBusinessExists(reqVO.getId());
303 301
304 // 2.1 数据权限转移 302 // 2.1 数据权限转移
305 permissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_BUSINESS.getType(), 303 permissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_BUSINESS.getType(),
306 - reqVO.getBizId(), reqVO.getNewOwnerUserId(), CrmPermissionLevelEnum.OWNER.getLevel())); 304 + reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel()));
307 // 2.2 设置新的负责人 305 // 2.2 设置新的负责人
308 - businessMapper.updateOwnerUserIdById(reqVO.getBizId(), reqVO.getNewOwnerUserId()); 306 + businessMapper.updateOwnerUserIdById(reqVO.getId(), reqVO.getNewOwnerUserId());
309 307
310 // 记录操作日志上下文 308 // 记录操作日志上下文
311 LogRecordContext.putVariable("business", business); 309 LogRecordContext.putVariable("business", business);
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueServiceImpl.java
@@ -159,18 +159,18 @@ public class CrmClueServiceImpl implements CrmClueService { @@ -159,18 +159,18 @@ public class CrmClueServiceImpl implements CrmClueService {
159 159
160 @Override 160 @Override
161 @Transactional(rollbackFor = Exception.class) 161 @Transactional(rollbackFor = Exception.class)
162 - @LogRecord(type = CRM_CLUE_TYPE, subType = CRM_CLUE_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", 162 + @LogRecord(type = CRM_CLUE_TYPE, subType = CRM_CLUE_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}",
163 success = CRM_CLUE_TRANSFER_SUCCESS) 163 success = CRM_CLUE_TRANSFER_SUCCESS)
164 - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CLUE, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) 164 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CLUE, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER)
165 public void transferClue(CrmClueTransferReqVO reqVO, Long userId) { 165 public void transferClue(CrmClueTransferReqVO reqVO, Long userId) {
166 // 1 校验线索是否存在 166 // 1 校验线索是否存在
167 - CrmClueDO clue = validateClueExists(reqVO.getBizId()); 167 + CrmClueDO clue = validateClueExists(reqVO.getId());
168 168
169 // 2.1 数据权限转移 169 // 2.1 数据权限转移
170 crmPermissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CLUE.getType(), 170 crmPermissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CLUE.getType(),
171 - reqVO.getBizId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); 171 + reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel()));
172 // 2.2 设置新的负责人 172 // 2.2 设置新的负责人
173 - clueMapper.updateById(new CrmClueDO().setId(reqVO.getBizId()).setOwnerUserId(reqVO.getNewOwnerUserId())); 173 + clueMapper.updateById(new CrmClueDO().setId(reqVO.getId()).setOwnerUserId(reqVO.getNewOwnerUserId()));
174 174
175 // 3. 记录转移日志 175 // 3. 记录转移日志
176 LogRecordContext.putVariable("clue", clue); 176 LogRecordContext.putVariable("clue", clue);
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.crm.service.contact; @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.crm.service.contact;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
5 -import cn.hutool.extra.spring.SpringUtil;  
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessReqVO; 7 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessReqVO;
@@ -18,7 +17,6 @@ import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPerm @@ -18,7 +17,6 @@ import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPerm
18 import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; 17 import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
19 import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; 18 import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
20 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; 19 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
21 -import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerServiceImpl;  
22 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; 20 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
23 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; 21 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
24 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; 22 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
@@ -179,18 +177,18 @@ public class CrmContactServiceImpl implements CrmContactService { @@ -179,18 +177,18 @@ public class CrmContactServiceImpl implements CrmContactService {
179 177
180 @Override 178 @Override
181 @Transactional(rollbackFor = Exception.class) 179 @Transactional(rollbackFor = Exception.class)
182 - @LogRecord(type = CRM_CONTACT_TYPE, subType = CRM_CONTACT_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", 180 + @LogRecord(type = CRM_CONTACT_TYPE, subType = CRM_CONTACT_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}",
183 success = CRM_CONTACT_TRANSFER_SUCCESS) 181 success = CRM_CONTACT_TRANSFER_SUCCESS)
184 - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACT, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) 182 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACT, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER)
185 public void transferContact(CrmContactTransferReqVO reqVO, Long userId) { 183 public void transferContact(CrmContactTransferReqVO reqVO, Long userId) {
186 // 1 校验联系人是否存在 184 // 1 校验联系人是否存在
187 - CrmContactDO contact = validateContactExists(reqVO.getBizId()); 185 + CrmContactDO contact = validateContactExists(reqVO.getId());
188 186
189 // 2.1 数据权限转移 187 // 2.1 数据权限转移
190 permissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CONTACT.getType(), 188 permissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CONTACT.getType(),
191 - reqVO.getBizId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); 189 + reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel()));
192 // 2.2 设置新的负责人 190 // 2.2 设置新的负责人
193 - contactMapper.updateById(new CrmContactDO().setId(reqVO.getBizId()).setOwnerUserId(reqVO.getNewOwnerUserId())); 191 + contactMapper.updateById(new CrmContactDO().setId(reqVO.getId()).setOwnerUserId(reqVO.getNewOwnerUserId()));
194 192
195 // 3. 记录转移日志 193 // 3. 记录转移日志
196 LogRecordContext.putVariable("contact", contact); 194 LogRecordContext.putVariable("contact", contact);
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -252,18 +252,18 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -252,18 +252,18 @@ public class CrmContractServiceImpl implements CrmContractService {
252 252
253 @Override 253 @Override
254 @Transactional(rollbackFor = Exception.class) 254 @Transactional(rollbackFor = Exception.class)
255 - @LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", 255 + @LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}",
256 success = CRM_CONTRACT_TRANSFER_SUCCESS) 256 success = CRM_CONTRACT_TRANSFER_SUCCESS)
257 - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) 257 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER)
258 public void transferContract(CrmContractTransferReqVO reqVO, Long userId) { 258 public void transferContract(CrmContractTransferReqVO reqVO, Long userId) {
259 // 1. 校验合同是否存在 259 // 1. 校验合同是否存在
260 - CrmContractDO contract = validateContractExists(reqVO.getBizId()); 260 + CrmContractDO contract = validateContractExists(reqVO.getId());
261 261
262 // 2.1 数据权限转移 262 // 2.1 数据权限转移
263 crmPermissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CONTRACT.getType(), 263 crmPermissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CONTRACT.getType(),
264 - reqVO.getBizId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); 264 + reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel()));
265 // 2.2 设置负责人 265 // 2.2 设置负责人
266 - contractMapper.updateById(new CrmContractDO().setId(reqVO.getBizId()).setOwnerUserId(reqVO.getNewOwnerUserId())); 266 + contractMapper.updateById(new CrmContractDO().setId(reqVO.getId()).setOwnerUserId(reqVO.getNewOwnerUserId()));
267 267
268 // 3. 记录转移日志 268 // 3. 记录转移日志
269 LogRecordContext.putVariable("contract", contract); 269 LogRecordContext.putVariable("contract", contract);
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
@@ -199,19 +199,19 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @@ -199,19 +199,19 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
199 199
200 @Override 200 @Override
201 @Transactional(rollbackFor = Exception.class) 201 @Transactional(rollbackFor = Exception.class)
202 - @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", 202 + @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}",
203 success = CRM_CUSTOMER_TRANSFER_SUCCESS) 203 success = CRM_CUSTOMER_TRANSFER_SUCCESS)
204 - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) 204 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER)
205 public void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId) { 205 public void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId) {
206 // 1.1 校验客户是否存在 206 // 1.1 校验客户是否存在
207 - CrmCustomerDO customer = validateCustomerExists(reqVO.getBizId()); 207 + CrmCustomerDO customer = validateCustomerExists(reqVO.getId());
208 // 1.2 校验拥有客户是否到达上限 208 // 1.2 校验拥有客户是否到达上限
209 validateCustomerExceedOwnerLimit(reqVO.getNewOwnerUserId(), 1); 209 validateCustomerExceedOwnerLimit(reqVO.getNewOwnerUserId(), 1);
210 // 2.1 数据权限转移 210 // 2.1 数据权限转移
211 permissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CUSTOMER.getType(), 211 permissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
212 - reqVO.getBizId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); 212 + reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel()));
213 // 2.2 转移后重新设置负责人 213 // 2.2 转移后重新设置负责人
214 - customerMapper.updateById(new CrmCustomerDO().setId(reqVO.getBizId()) 214 + customerMapper.updateById(new CrmCustomerDO().setId(reqVO.getId())
215 .setOwnerUserId(reqVO.getNewOwnerUserId()).setOwnerTime(LocalDateTime.now())); 215 .setOwnerUserId(reqVO.getNewOwnerUserId()).setOwnerTime(LocalDateTime.now()));
216 216
217 // 2.3 同时转移 217 // 2.3 同时转移
@@ -231,21 +231,21 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @@ -231,21 +231,21 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
231 */ 231 */
232 private void transfer(CrmCustomerTransferReqVO reqVO, Long userId) { 232 private void transfer(CrmCustomerTransferReqVO reqVO, Long userId) {
233 if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTACT.getType())) { 233 if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTACT.getType())) {
234 - List<CrmContactDO> contactList = contactService.getContactListByCustomerIdOwnerUserId(reqVO.getBizId(), userId); 234 + List<CrmContactDO> contactList = contactService.getContactListByCustomerIdOwnerUserId(reqVO.getId(), userId);
235 contactList.forEach(item -> { 235 contactList.forEach(item -> {
236 contactService.transferContact(new CrmContactTransferReqVO(item.getId(), reqVO.getNewOwnerUserId(), 236 contactService.transferContact(new CrmContactTransferReqVO(item.getId(), reqVO.getNewOwnerUserId(),
237 reqVO.getOldOwnerPermissionLevel()), userId); 237 reqVO.getOldOwnerPermissionLevel()), userId);
238 }); 238 });
239 } 239 }
240 if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_BUSINESS.getType())) { 240 if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_BUSINESS.getType())) {
241 - List<CrmBusinessDO> businessList = businessService.getBusinessListByCustomerIdOwnerUserId(reqVO.getBizId(), userId); 241 + List<CrmBusinessDO> businessList = businessService.getBusinessListByCustomerIdOwnerUserId(reqVO.getId(), userId);
242 businessList.forEach(item -> { 242 businessList.forEach(item -> {
243 businessService.transferBusiness(new CrmBusinessTransferReqVO(item.getId(), reqVO.getNewOwnerUserId(), 243 businessService.transferBusiness(new CrmBusinessTransferReqVO(item.getId(), reqVO.getNewOwnerUserId(),
244 reqVO.getOldOwnerPermissionLevel()), userId); 244 reqVO.getOldOwnerPermissionLevel()), userId);
245 }); 245 });
246 } 246 }
247 if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTRACT.getType())) { 247 if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTRACT.getType())) {
248 - List<CrmContractDO> contractList = contractService.getContractListByCustomerIdOwnerUserId(reqVO.getBizId(), userId); 248 + List<CrmContractDO> contractList = contractService.getContractListByCustomerIdOwnerUserId(reqVO.getId(), userId);
249 contractList.forEach(item -> { 249 contractList.forEach(item -> {
250 contractService.transferContract(new CrmContractTransferReqVO(item.getId(), reqVO.getNewOwnerUserId(), 250 contractService.transferContract(new CrmContractTransferReqVO(item.getId(), reqVO.getNewOwnerUserId(),
251 reqVO.getOldOwnerPermissionLevel()), userId); 251 reqVO.getOldOwnerPermissionLevel()), userId);
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java
1 package cn.iocoder.yudao.module.crm.service.permission; 1 package cn.iocoder.yudao.module.crm.service.permission;
2 2
3 3
  4 +import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionSaveReqVO;
4 import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO; 5 import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO;
5 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; 6 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
6 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 7 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
@@ -22,6 +23,14 @@ public interface CrmPermissionService { @@ -22,6 +23,14 @@ public interface CrmPermissionService {
22 /** 23 /**
23 * 创建数据权限 24 * 创建数据权限
24 * 25 *
  26 + * @param reqVO 创建信息
  27 + * @param userId 用户编号
  28 + */
  29 + void createPermission(CrmPermissionSaveReqVO reqVO, Long userId);
  30 +
  31 + /**
  32 + * 创建数据权限
  33 + *
25 * @param createReqBO 创建信息 34 * @param createReqBO 创建信息
26 * @return 编号 35 * @return 编号
27 */ 36 */
@@ -111,10 +120,10 @@ public interface CrmPermissionService { @@ -111,10 +120,10 @@ public interface CrmPermissionService {
111 /** 120 /**
112 * 校验是否有指定数据的操作权限 121 * 校验是否有指定数据的操作权限
113 * 122 *
114 - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}  
115 - * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()  
116 - * @param userId 用户编号  
117 - * @param level 权限级别 123 + * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
  124 + * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
  125 + * @param userId 用户编号
  126 + * @param level 权限级别
118 * @return 是否有权限 127 * @return 是否有权限
119 */ 128 */
120 boolean hasPermission(Integer bizType, Long bizId, Long userId, CrmPermissionLevelEnum level); 129 boolean hasPermission(Integer bizType, Long bizId, Long userId, CrmPermissionLevelEnum level);
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
@@ -4,28 +4,34 @@ import cn.hutool.core.collection.CollUtil; @@ -4,28 +4,34 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjUtil; 4 import cn.hutool.core.util.ObjUtil;
5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionSaveReqVO;
7 import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO; 8 import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO;
  9 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
  10 +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
  11 +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
8 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; 12 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
9 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper; 13 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper;
10 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 14 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
11 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; 15 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
  16 +import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
  17 +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
  18 +import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
  19 +import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
12 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; 20 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
13 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; 21 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
14 import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils; 22 import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
15 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 23 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  24 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
16 import jakarta.annotation.Resource; 25 import jakarta.annotation.Resource;
  26 +import org.springframework.context.annotation.Lazy;
17 import org.springframework.stereotype.Service; 27 import org.springframework.stereotype.Service;
18 import org.springframework.transaction.annotation.Transactional; 28 import org.springframework.transaction.annotation.Transactional;
19 import org.springframework.validation.annotation.Validated; 29 import org.springframework.validation.annotation.Validated;
20 30
21 -import java.util.Collection;  
22 -import java.util.Collections;  
23 -import java.util.List;  
24 -import java.util.Set; 31 +import java.util.*;
25 32
26 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 33 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
27 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;  
28 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 34 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
29 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; 35 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
30 import static cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum.isOwner; 36 import static cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum.isOwner;
31 37
@@ -40,13 +46,124 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @@ -40,13 +46,124 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
40 46
41 @Resource 47 @Resource
42 private CrmPermissionMapper permissionMapper; 48 private CrmPermissionMapper permissionMapper;
43 - 49 + @Resource
  50 + @Lazy // 解决依赖循环
  51 + private CrmContactService contactService;
  52 + @Resource
  53 + @Lazy // 解决依赖循环
  54 + private CrmBusinessService businessService;
  55 + @Resource
  56 + @Lazy // 解决依赖循环
  57 + private CrmContractService contractService;
44 @Resource 58 @Resource
45 private AdminUserApi adminUserApi; 59 private AdminUserApi adminUserApi;
46 60
  61 +
  62 + @Override
  63 + @Transactional(rollbackFor = Exception.class)
  64 + @CrmPermission(bizTypeValue = "#reqVO.bizType", bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER)
  65 + public void createPermission(CrmPermissionSaveReqVO reqVO, Long userId) {
  66 + // 创建数据权限
  67 + createPermission0(BeanUtils.toBean(reqVO, CrmPermissionCreateReqBO.class));
  68 +
  69 + // 处理【同时添加至】的权限
  70 + if (CollUtil.isEmpty(reqVO.getToBizTypes())) {
  71 + return;
  72 + }
  73 + List<CrmPermissionCreateReqBO> createPermissions = new ArrayList<>();
  74 + createContactPermissions(reqVO, userId, createPermissions);
  75 + createBusinessPermissions(reqVO, userId, createPermissions);
  76 + createContractPermissions(reqVO, userId, createPermissions);
  77 + if (CollUtil.isEmpty(createPermissions)) {
  78 + return;
  79 + }
  80 + createPermissionBatch(createPermissions);
  81 + }
  82 +
  83 + /**
  84 + * 处理同时添加至联系人
  85 + *
  86 + * @param reqVO 请求
  87 + * @param userId 操作人
  88 + * @param createPermissions 待添加权限列表
  89 + */
  90 + private void createContactPermissions(CrmPermissionSaveReqVO reqVO, Long userId, List<CrmPermissionCreateReqBO> createPermissions) {
  91 + // 1. 校验是否被同时添加
  92 + Integer type = CrmBizTypeEnum.CRM_CONTACT.getType();
  93 + if (!reqVO.getToBizTypes().contains(type)) {
  94 + return;
  95 + }
  96 +
  97 + // 2.1 添加数据权限
  98 + List<CrmContactDO> contactList = contactService.getContactListByCustomerIdOwnerUserId(reqVO.getBizId(), userId);
  99 + contactList.forEach(item -> {
  100 + createBizTypePermissions(reqVO, type, item.getId(), item.getName(), createPermissions);
  101 + });
  102 + }
  103 +
  104 + /**
  105 + * 处理同时添加至商机
  106 + *
  107 + * @param reqVO 请求
  108 + * @param userId 操作人
  109 + * @param createPermissions 待添加权限列表
  110 + */
  111 + private void createBusinessPermissions(CrmPermissionSaveReqVO reqVO, Long userId, List<CrmPermissionCreateReqBO> createPermissions) {
  112 + // 1. 校验是否被同时添加
  113 + Integer type = CrmBizTypeEnum.CRM_BUSINESS.getType();
  114 + if (!reqVO.getToBizTypes().contains(type)) {
  115 + return;
  116 + }
  117 +
  118 + // 2.1 添加数据权限
  119 + List<CrmBusinessDO> businessList = businessService.getBusinessListByCustomerIdOwnerUserId(reqVO.getBizId(), userId);
  120 + businessList.forEach(item -> {
  121 + createBizTypePermissions(reqVO, type, item.getId(), item.getName(), createPermissions);
  122 + });
  123 + }
  124 +
  125 + /**
  126 + * 处理同时添加至合同
  127 + *
  128 + * @param reqVO 请求
  129 + * @param userId 操作人
  130 + * @param createPermissions 待添加权限列表
  131 + */
  132 + private void createContractPermissions(CrmPermissionSaveReqVO reqVO, Long userId, List<CrmPermissionCreateReqBO> createPermissions) {
  133 + // 1. 校验是否被同时添加
  134 + Integer type = CrmBizTypeEnum.CRM_CONTRACT.getType();
  135 + if (!reqVO.getToBizTypes().contains(type)) {
  136 + return;
  137 + }
  138 +
  139 + // 2.1 添加数据权限
  140 + List<CrmContractDO> contractList = contractService.getContractListByCustomerIdOwnerUserId(reqVO.getBizId(), userId);
  141 + contractList.forEach(item -> {
  142 + createBizTypePermissions(reqVO, type, item.getId(), item.getName(), createPermissions);
  143 + });
  144 + }
  145 +
  146 + private void createBizTypePermissions(CrmPermissionSaveReqVO reqVO, Integer type, Long bizId, String name,
  147 + List<CrmPermissionCreateReqBO> createPermissions) {
  148 + AdminUserRespDTO user = adminUserApi.getUser(reqVO.getUserId());
  149 + // 1. 需要考虑,被添加人,是不是应该有对应的权限了;
  150 + CrmPermissionDO permission = hasAnyPermission(type, bizId, reqVO.getUserId());
  151 + if (ObjUtil.isNotNull(permission)) {
  152 + throw exception(CRM_PERMISSION_CREATE_FAIL_EXISTS, user.getNickname(), CrmBizTypeEnum.getNameByType(type),
  153 + name, CrmPermissionLevelEnum.getNameByLevel(permission.getLevel()));
  154 + }
  155 + // 2. 添加数据权限
  156 + createPermissions.add(new CrmPermissionCreateReqBO().setBizType(type)
  157 + .setBizId(bizId).setUserId(reqVO.getUserId()).setLevel(reqVO.getLevel()));
  158 + }
  159 +
47 @Override 160 @Override
48 @Transactional(rollbackFor = Exception.class) 161 @Transactional(rollbackFor = Exception.class)
49 public Long createPermission(CrmPermissionCreateReqBO createReqBO) { 162 public Long createPermission(CrmPermissionCreateReqBO createReqBO) {
  163 + return createPermission0(createReqBO);
  164 + }
  165 +
  166 + private Long createPermission0(CrmPermissionCreateReqBO createReqBO) {
50 validatePermissionNotExists(Collections.singletonList(createReqBO)); 167 validatePermissionNotExists(Collections.singletonList(createReqBO));
51 // 1. 校验用户是否存在 168 // 1. 校验用户是否存在
52 adminUserApi.validateUserList(Collections.singletonList(createReqBO.getUserId())); 169 adminUserApi.validateUserList(Collections.singletonList(createReqBO.getUserId()));
@@ -170,7 +287,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @@ -170,7 +287,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
170 throw exception(CRM_PERMISSION_DELETE_FAIL); 287 throw exception(CRM_PERMISSION_DELETE_FAIL);
171 } 288 }
172 // 校验操作人是否为负责人 289 // 校验操作人是否为负责人
173 - CrmPermissionDO permission = permissionMapper.selectByBizIdAndUserId(permissions.get(0).getBizId(), userId); 290 + CrmPermissionDO permission = permissionMapper.selectByBizAndUserId(permissions.get(0).getBizType(), permissions.get(0).getBizId(), userId);
174 if (permission == null) { 291 if (permission == null) {
175 throw exception(CRM_PERMISSION_DELETE_DENIED); 292 throw exception(CRM_PERMISSION_DELETE_DENIED);
176 } 293 }
@@ -220,4 +337,9 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @@ -220,4 +337,9 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
220 ObjUtil.equal(permission.getUserId(), userId) && ObjUtil.equal(permission.getLevel(), level.getLevel())); 337 ObjUtil.equal(permission.getUserId(), userId) && ObjUtil.equal(permission.getLevel(), level.getLevel()));
221 } 338 }
222 339
  340 + public CrmPermissionDO hasAnyPermission(Integer bizType, Long bizId, Long userId) {
  341 + List<CrmPermissionDO> permissionList = permissionMapper.selectByBizTypeAndBizId(bizType, bizId);
  342 + return findFirst(permissionList, permission -> ObjUtil.equal(permission.getUserId(), userId));
  343 + }
  344 +
223 } 345 }