Commit 67ac11b56c242df634a000315c8265e43fb2552a

Authored by YunaiV
1 parent f73b8575

code review:crm 客户转移

Showing 17 changed files with 23 additions and 53 deletions
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
@@ -11,7 +11,7 @@ public interface ErrorCodeConstants { @@ -11,7 +11,7 @@ public interface ErrorCodeConstants {
11 11
12 // ========== 合同管理 1-020-000-000 ========== 12 // ========== 合同管理 1-020-000-000 ==========
13 ErrorCode CONTRACT_NOT_EXISTS = new ErrorCode(1_020_000_000, "合同不存在"); 13 ErrorCode CONTRACT_NOT_EXISTS = new ErrorCode(1_020_000_000, "合同不存在");
14 - ErrorCode CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_000_001, "合同转移失败,原因:没有转移权限"); 14 + ErrorCode CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_000_001, "合同转移失败,原因:没有转移权限"); // TODO @puhui999:这个搞成 “合同操作失败,原因:没有权限”
15 ErrorCode CONTRACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_000_002, "合同转移失败,原因:负责人不存在"); 15 ErrorCode CONTRACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_000_002, "合同转移失败,原因:负责人不存在");
16 16
17 // ========== 线索管理 1-020-001-000 ========== 17 // ========== 线索管理 1-020-001-000 ==========
@@ -19,7 +19,7 @@ public interface ErrorCodeConstants { @@ -19,7 +19,7 @@ public interface ErrorCodeConstants {
19 19
20 // ========== 商机管理 1-020-002-000 ========== 20 // ========== 商机管理 1-020-002-000 ==========
21 ErrorCode BUSINESS_NOT_EXISTS = new ErrorCode(1_020_002_000, "商机不存在"); 21 ErrorCode BUSINESS_NOT_EXISTS = new ErrorCode(1_020_002_000, "商机不存在");
22 - ErrorCode BUSINESS_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_002_001, "商机转移失败,原因:没有转移权限"); 22 + ErrorCode BUSINESS_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_002_001, "商机转移失败,原因:没有转移权限"); // TODO @puhui999:这个搞成 “商机操作失败,原因:没有权限”
23 ErrorCode BUSINESS_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_002_002, "商机转移失败,原因:负责人不存在"); 23 ErrorCode BUSINESS_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_002_002, "商机转移失败,原因:负责人不存在");
24 24
25 // TODO @lilleo:商机状态、商机类型,都单独错误码段 25 // TODO @lilleo:商机状态、商机类型,都单独错误码段
@@ -29,7 +29,7 @@ public interface ErrorCodeConstants { @@ -29,7 +29,7 @@ public interface ErrorCodeConstants {
29 29
30 // ========== 联系人管理 1-020-003-000 ========== 30 // ========== 联系人管理 1-020-003-000 ==========
31 ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_020_003_000, "联系人不存在"); 31 ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_020_003_000, "联系人不存在");
32 - ErrorCode CONTACT_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_003_001, "联系人转移失败,原因:没有转移权限"); 32 + ErrorCode CONTACT_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_003_001, "联系人转移失败,原因:没有转移权限"); // TODO @puhui999:这个搞成 “联系人操作失败,原因:没有权限”
33 ErrorCode CONTACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_003_002, "联系人转移失败,原因:负责人不存在"); 33 ErrorCode CONTACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_003_002, "联系人转移失败,原因:负责人不存在");
34 34
35 // TODO @liuhongfeng:错误码分段; 35 // TODO @liuhongfeng:错误码分段;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessCreateReqVO.java
@@ -5,21 +5,12 @@ import lombok.Data; @@ -5,21 +5,12 @@ import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 -import java.util.Set;  
9 -  
10 @Schema(description = "管理后台 - 商机创建 Request VO") 8 @Schema(description = "管理后台 - 商机创建 Request VO")
11 @Data 9 @Data
12 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 11 @ToString(callSuper = true)
14 public class CrmBusinessCreateReqVO extends CrmBusinessBaseVO { 12 public class CrmBusinessCreateReqVO extends CrmBusinessBaseVO {
15 13
16 - @Schema(description = "只读权限的用户编号数组")  
17 - private Set<Long> roUserIds;  
18 -  
19 - @Schema(description = "读写权限的用户编号数组")  
20 - private Set<Long> rwUserIds;  
21 -  
22 -  
23 // TODO @ljileo:新建的时候,应该可以传递添加的产品; 14 // TODO @ljileo:新建的时候,应该可以传递添加的产品;
24 15
25 } 16 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessTransferReqVO.java
@@ -15,6 +15,6 @@ public class CrmBusinessTransferReqVO { @@ -15,6 +15,6 @@ public class CrmBusinessTransferReqVO {
15 15
16 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 16 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
17 @NotNull(message = "新负责人的用户编号不能为空") 17 @NotNull(message = "新负责人的用户编号不能为空")
18 - private Long ownerUserId; // 新的负责人 18 + private Long ownerUserId;
19 19
20 } 20 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessUpdateReqVO.java
@@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode; @@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 import javax.validation.constraints.NotNull; 8 import javax.validation.constraints.NotNull;
9 -import java.util.Set;  
10 9
11 @Schema(description = "管理后台 - 商机更新 Request VO") 10 @Schema(description = "管理后台 - 商机更新 Request VO")
12 @Data 11 @Data
@@ -18,13 +17,6 @@ public class CrmBusinessUpdateReqVO extends CrmBusinessBaseVO { @@ -18,13 +17,6 @@ public class CrmBusinessUpdateReqVO extends CrmBusinessBaseVO {
18 @NotNull(message = "主键不能为空") 17 @NotNull(message = "主键不能为空")
19 private Long id; 18 private Long id;
20 19
21 - @Schema(description = "只读权限的用户编号数组")  
22 - private Set<Long> roUserIds;  
23 -  
24 - @Schema(description = "读写权限的用户编号数组")  
25 - private Set<Long> rwUserIds;  
26 -  
27 -  
28 // TODO @ljileo:修改的时候,应该可以传递添加的产品; 20 // TODO @ljileo:修改的时候,应该可以传递添加的产品;
29 21
30 } 22 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactUpdateReqVO.java
@@ -5,8 +5,6 @@ import lombok.Data; @@ -5,8 +5,6 @@ import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 -import java.util.Set;  
9 -  
10 @Schema(description = "管理后台 - crm联系人更新 Request VO") 8 @Schema(description = "管理后台 - crm联系人更新 Request VO")
11 @Data 9 @Data
12 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
@@ -16,10 +14,4 @@ public class ContactUpdateReqVO extends ContactBaseVO { @@ -16,10 +14,4 @@ public class ContactUpdateReqVO extends ContactBaseVO {
16 @Schema(description = "主键", example = "23210") 14 @Schema(description = "主键", example = "23210")
17 private Long id; 15 private Long id;
18 16
19 - @Schema(description = "只读权限的用户编号数组")  
20 - private Set<Long> roUserIds;  
21 -  
22 - @Schema(description = "读写权限的用户编号数组")  
23 - private Set<Long> rwUserIds;  
24 -  
25 } 17 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java
@@ -15,6 +15,6 @@ public class CrmContactTransferReqVO { @@ -15,6 +15,6 @@ public class CrmContactTransferReqVO {
15 15
16 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 16 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
17 @NotNull(message = "新负责人的用户编号不能为空") 17 @NotNull(message = "新负责人的用户编号不能为空")
18 - private Long ownerUserId; // 新的负责人 18 + private Long ownerUserId;
19 19
20 } 20 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/ContractController.java
@@ -95,5 +95,4 @@ public class ContractController { @@ -95,5 +95,4 @@ public class ContractController {
95 return success(true); 95 return success(true);
96 } 96 }
97 97
98 -  
99 } 98 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractCreateReqVO.java
@@ -5,18 +5,10 @@ import lombok.Data; @@ -5,18 +5,10 @@ import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 -import java.util.Set;  
9 -  
10 @Schema(description = "管理后台 - 合同创建 Request VO") 8 @Schema(description = "管理后台 - 合同创建 Request VO")
11 @Data 9 @Data
12 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 11 @ToString(callSuper = true)
14 public class ContractCreateReqVO extends ContractBaseVO { 12 public class ContractCreateReqVO extends ContractBaseVO {
15 13
16 - @Schema(description = "只读权限的用户编号数组")  
17 - private Set<Long> roUserIds;  
18 -  
19 - @Schema(description = "读写权限的用户编号数组")  
20 - private Set<Long> rwUserIds;  
21 -  
22 } 14 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractUpdateReqVO.java
@@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode; @@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 import javax.validation.constraints.NotNull; 8 import javax.validation.constraints.NotNull;
9 -import java.util.Set;  
10 9
11 @Schema(description = "管理后台 - 合同更新 Request VO") 10 @Schema(description = "管理后台 - 合同更新 Request VO")
12 @Data 11 @Data
@@ -18,10 +17,4 @@ public class ContractUpdateReqVO extends ContractBaseVO { @@ -18,10 +17,4 @@ public class ContractUpdateReqVO extends ContractBaseVO {
18 @NotNull(message = "合同编号不能为空") 17 @NotNull(message = "合同编号不能为空")
19 private Long id; 18 private Long id;
20 19
21 - @Schema(description = "只读权限的用户编号数组")  
22 - private Set<Long> roUserIds;  
23 -  
24 - @Schema(description = "读写权限的用户编号数组")  
25 - private Set<Long> rwUserIds;  
26 -  
27 } 20 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java
@@ -15,6 +15,6 @@ public class CrmContractTransferReqVO { @@ -15,6 +15,6 @@ public class CrmContractTransferReqVO {
15 15
16 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") 16 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
17 @NotNull(message = "新负责人的用户编号不能为空") 17 @NotNull(message = "新负责人的用户编号不能为空")
18 - private Long ownerUserId; // 新的负责人 18 + private Long ownerUserId;
19 19
20 } 20 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java
@@ -32,8 +32,10 @@ public interface CrmBusinessConvert { @@ -32,8 +32,10 @@ public interface CrmBusinessConvert {
32 32
33 default CrmBusinessDO convert(CrmBusinessDO business, CrmBusinessTransferReqVO reqVO, Long userId) { 33 default CrmBusinessDO convert(CrmBusinessDO business, CrmBusinessTransferReqVO reqVO, Long userId) {
34 Set<Long> rwUserIds = business.getRwUserIds(); 34 Set<Long> rwUserIds = business.getRwUserIds();
35 - rwUserIds.removeIf(item -> ObjUtil.equal(item, userId)); // 移除老负责人 35 + rwUserIds.removeIf(item -> ObjUtil.equal(item, userId)); // 移除老负责人 TODO puhui999:是不是直接 rwUserIds.remove(userId)
  36 + // TODO @puhui999:ownerUserId 不用添加到进去,它就是 ownerUserId 就够;因为一共有 3 个角色:负责人、读写、只读;
36 rwUserIds.add(reqVO.getOwnerUserId()); // 读写权限加入新的负人 37 rwUserIds.add(reqVO.getOwnerUserId()); // 读写权限加入新的负人
  38 + // TODO @puhui999:对原负责人,加个类似的处理:移除、转化为团队成员(只读、读写)
37 return new CrmBusinessDO().setId(business.getId()).setOwnerUserId(reqVO.getOwnerUserId()) // 设置新负责人 39 return new CrmBusinessDO().setId(business.getId()).setOwnerUserId(reqVO.getOwnerUserId()) // 设置新负责人
38 .setRwUserIds(rwUserIds); 40 .setRwUserIds(rwUserIds);
39 } 41 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java
@@ -32,6 +32,7 @@ public interface ContactConvert { @@ -32,6 +32,7 @@ public interface ContactConvert {
32 32
33 List<ContactExcelVO> convertList02(List<ContactDO> list); 33 List<ContactExcelVO> convertList02(List<ContactDO> list);
34 34
  35 + // TODO @puhui999:参考 CrmBusinessConvert 的修改建议
35 default ContactDO convert(ContactDO contact, CrmContactTransferReqVO reqVO, Long userId) { 36 default ContactDO convert(ContactDO contact, CrmContactTransferReqVO reqVO, Long userId) {
36 Set<Long> rwUserIds = contact.getRwUserIds(); 37 Set<Long> rwUserIds = contact.getRwUserIds();
37 rwUserIds.removeIf(item -> ObjUtil.equal(item, userId)); // 移除老负责人 38 rwUserIds.removeIf(item -> ObjUtil.equal(item, userId)); // 移除老负责人
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java
@@ -32,6 +32,7 @@ public interface ContractConvert { @@ -32,6 +32,7 @@ public interface ContractConvert {
32 32
33 List<ContractExcelVO> convertList02(List<ContractDO> list); 33 List<ContractExcelVO> convertList02(List<ContractDO> list);
34 34
  35 + // TODO @puhui999:参考 CrmBusinessConvert 的修改建议
35 default ContractDO convert(ContractDO contract, CrmContractTransferReqVO reqVO, Long userId) { 36 default ContractDO convert(ContractDO contract, CrmContractTransferReqVO reqVO, Long userId) {
36 Set<Long> rwUserIds = contract.getRwUserIds(); 37 Set<Long> rwUserIds = contract.getRwUserIds();
37 rwUserIds.removeIf(item -> ObjUtil.equal(item, userId)); // 移除老负责人 38 rwUserIds.removeIf(item -> ObjUtil.equal(item, userId)); // 移除老负责人
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/utils/AuthUtil.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.framework.utils; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.framework.utils;
2 2
3 import java.util.Collection; 3 import java.util.Collection;
4 4
  5 +// TODO @puhui999:改成 CrmPermissionUtils;
5 /** 6 /**
6 * 数据读写权限校验工具类 7 * 数据读写权限校验工具类
7 * 8 *
@@ -9,6 +10,8 @@ import java.util.Collection; @@ -9,6 +10,8 @@ import java.util.Collection;
9 */ 10 */
10 public class AuthUtil { 11 public class AuthUtil {
11 12
  13 + // TODO @puhui999:负责人是单独的字段哈;
  14 + // TODO @puhui999:额外校验,如果是管理员,可以查看所有;看着要做成有状态的了,可能要搞个 CrmPermissionService 咧;
12 /** 15 /**
13 * 判断当前数据对用户来说是否是只读的 16 * 判断当前数据对用户来说是否是只读的
14 * 17 *
@@ -17,6 +20,7 @@ public class AuthUtil { @@ -17,6 +20,7 @@ public class AuthUtil {
17 * @return boolean 是/否 20 * @return boolean 是/否
18 */ 21 */
19 public static boolean isReadOnly(Collection<Long> roUserIds, Long userId) { 22 public static boolean isReadOnly(Collection<Long> roUserIds, Long userId) {
  23 + // TODO @puhui999:从代码角度来说,最好使用 CollUtil.contains
20 return roUserIds.contains(userId); 24 return roUserIds.contains(userId);
21 } 25 }
22 26
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
@@ -92,26 +92,27 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { @@ -92,26 +92,27 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
92 return businessMapper.selectList(exportReqVO); 92 return businessMapper.selectList(exportReqVO);
93 } 93 }
94 94
  95 + // TODO @puhui999:动名词哈。transferBusiness
95 @Override 96 @Override
96 public void businessTransfer(CrmBusinessTransferReqVO reqVO, Long userId) { 97 public void businessTransfer(CrmBusinessTransferReqVO reqVO, Long userId) {
97 - // 1. 校验商机是否存在 98 + // 1.1 校验商机是否存在
98 CrmBusinessDO business = validateBusinessExists(reqVO.getId()); 99 CrmBusinessDO business = validateBusinessExists(reqVO.getId());
99 - // 1.2. 校验用户是否拥有读写权限 100 + // 1.2 校验用户是否拥有读写权限
100 if (!isReadAndWrite(business.getRwUserIds(), userId)) { 101 if (!isReadAndWrite(business.getRwUserIds(), userId)) {
101 throw exception(BUSINESS_TRANSFER_FAIL_PERMISSION_DENIED); 102 throw exception(BUSINESS_TRANSFER_FAIL_PERMISSION_DENIED);
102 } 103 }
103 - // 2. 校验新负责人是否存在 104 + // TODO @puhui999:如果已经是该负责人,抛个业务异常;
  105 + // 1.3 校验新负责人是否存在
104 AdminUserRespDTO user = adminUserApi.getUser(reqVO.getOwnerUserId()); 106 AdminUserRespDTO user = adminUserApi.getUser(reqVO.getOwnerUserId());
105 if (user == null) { 107 if (user == null) {
106 throw exception(BUSINESS_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS); 108 throw exception(BUSINESS_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS);
107 } 109 }
108 110
109 - // 3. 更新新的负责人 111 + // 2. 更新新的负责人
110 CrmBusinessDO updateBusiness = CrmBusinessConvert.INSTANCE.convert(business, reqVO, userId); 112 CrmBusinessDO updateBusiness = CrmBusinessConvert.INSTANCE.convert(business, reqVO, userId);
111 businessMapper.updateById(updateBusiness); 113 businessMapper.updateById(updateBusiness);
112 114
113 // 4. TODO 记录商机转移日志 115 // 4. TODO 记录商机转移日志
114 -  
115 } 116 }
116 117
117 } 118 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java
@@ -95,6 +95,7 @@ public class ContactServiceImpl implements ContactService { @@ -95,6 +95,7 @@ public class ContactServiceImpl implements ContactService {
95 return contactMapper.selectList(exportReqVO); 95 return contactMapper.selectList(exportReqVO);
96 } 96 }
97 97
  98 + // TODO @puhui999:参考 CrmBusinessServiceImpl 修改建议
98 @Override 99 @Override
99 public void contactTransfer(CrmContactTransferReqVO reqVO, Long userId) { 100 public void contactTransfer(CrmContactTransferReqVO reqVO, Long userId) {
100 // 1. 校验联系人是否存在 101 // 1. 校验联系人是否存在
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java
@@ -92,6 +92,7 @@ public class ContractServiceImpl implements ContractService { @@ -92,6 +92,7 @@ public class ContractServiceImpl implements ContractService {
92 return contractMapper.selectList(exportReqVO); 92 return contractMapper.selectList(exportReqVO);
93 } 93 }
94 94
  95 + // TODO @puhui999:参考 CrmBusinessServiceImpl 修改建议
95 @Override 96 @Override
96 public void contractTransfer(CrmContractTransferReqVO reqVO, Long userId) { 97 public void contractTransfer(CrmContractTransferReqVO reqVO, Long userId) {
97 // 1. 校验合同是否存在 98 // 1. 校验合同是否存在