Commit 2d1e57554dda75a62d091f3e6c423be3ca8e4779

Authored by YunaiV
1 parent 3c7f63c3

📖 CRM:code review CRM 客户逻辑

Showing 17 changed files with 62 additions and 104 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java
... ... @@ -122,6 +122,7 @@ public class LocalDateTimeUtils {
122 122 return date.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
123 123 }
124 124  
  125 + // TODO @puhui999:加下注释哈;
125 126 public static Long between(LocalDateTime dateTime) {
126 127 return LocalDateTimeUtil.between(dateTime, LocalDateTime.now(), ChronoUnit.DAYS);
127 128 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java
... ... @@ -46,7 +46,7 @@ import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE;
46 46 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
47 47 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
48 48 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
49   -import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.CRM_CONTACT;
  49 +import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.CRM_CONTACT_TYPE;
50 50  
51 51 @Tag(name = "管理后台 - CRM 联系人")
52 52 @RestController
... ... @@ -156,7 +156,7 @@ public class CrmContactController {
156 156 public CommonResult<PageResult<OperateLogV2RespDTO>> getCustomerOperateLog(@RequestParam("bizId")Long bizId) {
157 157 OperateLogV2PageReqDTO reqVO = new OperateLogV2PageReqDTO();
158 158 reqVO.setPageSize(PAGE_SIZE_NONE); // 不分页
159   - reqVO.setBizType(CRM_CONTACT);
  159 + reqVO.setBizType(CRM_CONTACT_TYPE);
160 160 reqVO.setBizId(bizId);
161 161 return success(operateLogApi.getOperateLogPage(BeanUtils.toBean(reqVO, OperateLogV2PageReqDTO.class)));
162 162 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
... ... @@ -112,37 +112,42 @@ public class CrmCustomerController {
112 112 }
113 113  
114 114 // 2. 拼接数据
115   - // 距离进入公海的时间
116   - Map<Long, Long> poolDayMap = getPoolDayMap(pageResult);
  115 + Map<Long, Long> poolDayMap = getPoolDayMap(pageResult); // 距离进入公海的时间
117 116 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
118 117 convertSetByFlatMap(pageResult.getList(), user -> Stream.of(Long.parseLong(user.getCreator()), user.getOwnerUserId())));
119 118 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
120 119 return success(CrmCustomerConvert.INSTANCE.convertPage(pageResult, userMap, deptMap, poolDayMap));
121 120 }
122 121  
  122 + // TODO @puhui999:加下注释哈;
123 123 private Map<Long, Long> getPoolDayMap(PageResult<CrmCustomerDO> pageResult) {
124 124 Map<Long, Long> poolDayMap = null;
125 125 CrmCustomerPoolConfigDO customerPoolConfig = customerPoolConfigService.getCustomerPoolConfig();
  126 + // TODO @puhui999:if return 减少括号
126 127 if (customerPoolConfig != null && customerPoolConfig.getEnabled()) { // 有公海配置的情况
  128 + // TODO @puhui999:item 改成 customer 更好,容易理解;
127 129 poolDayMap = convertMap(pageResult.getList(), CrmCustomerDO::getId, item -> {
128 130 long dealExpireDay = 0;
129 131 if (!item.getDealStatus()) { // 检查是否成交
130 132 dealExpireDay = customerPoolConfig.getDealExpireDays() - LocalDateTimeUtils.between(item.getCreateTime());
131 133 }
  134 + // TODO @puhui999:需要考虑 contactLastTime 为空的情况哈;
132 135 long contactExpireDay = customerPoolConfig.getContactExpireDays() - LocalDateTimeUtils.between(item.getContactLastTime());
133 136 return dealExpireDay == 0 ? contactExpireDay : Math.min(dealExpireDay, contactExpireDay);
134 137 });
  138 + // TODO @puhui999:需要考虑 lock 的情况么?
135 139 }
136 140 return poolDayMap;
137 141 }
138 142  
139 143 @GetMapping(value = "/list-all-simple")
140 144 @Operation(summary = "获取客户精简信息列表", description = "只包含有读权限的客户,主要用于前端的下拉选项")
141   - public CommonResult<List<CrmCustomerSimpleRespVO>> getSimpleDeptList() {
  145 + public CommonResult<List<CrmCustomerRespVO>> getSimpleDeptList() {
142 146 CrmCustomerPageReqVO reqVO = new CrmCustomerPageReqVO();
143 147 reqVO.setPageSize(PAGE_SIZE_NONE); // 不分页
144 148 List<CrmCustomerDO> list = customerService.getCustomerPage(reqVO, getLoginUserId()).getList();
145   - return success(BeanUtils.toBean(list, CrmCustomerSimpleRespVO.class));
  149 + return success(convertList(list, customer -> // 只返回 id、name 精简字段
  150 + new CrmCustomerRespVO().setId(customer.getId()).setName(customer.getName())));
146 151 }
147 152  
148 153 @GetMapping("/export-excel")
... ... @@ -154,8 +159,8 @@ public class CrmCustomerController {
154 159 pageVO.setPageSize(PAGE_SIZE_NONE); // 不分页
155 160 List<CrmCustomerDO> list = customerService.getCustomerPage(pageVO, getLoginUserId()).getList();
156 161 // 导出 Excel
157   - List<CrmCustomerRespVO> datas = CrmCustomerConvert.INSTANCE.convertList02(list);
158   - ExcelUtils.write(response, "客户.xls", "数据", CrmCustomerRespVO.class, datas);
  162 + ExcelUtils.write(response, "客户.xls", "数据", CrmCustomerRespVO.class,
  163 + BeanUtils.toBean(list, CrmCustomerRespVO.class));
159 164 }
160 165  
161 166 @PutMapping("/transfer")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerDistributeReqVO.java
... ... @@ -11,7 +11,7 @@ import java.util.List;
11 11 public class CrmCustomerDistributeReqVO {
12 12  
13 13 @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1024]")
14   - @NotNull(message = "客户编号不能为空")
  14 + @NotNull(message = "客户编号不能为空") // TODO @puhui999:list 是 @NotEmpty
15 15 private List<Long> ids;
16 16  
17 17 @Schema(description = "负责人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerSimpleRespVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.AllArgsConstructor;
5   -import lombok.Data;
6   -import lombok.NoArgsConstructor;
7   -
8   -@Schema(description = "管理后台 - 客户精简信息 Response VO")
9   -@Data
10   -@NoArgsConstructor
11   -@AllArgsConstructor
12   -public class CrmCustomerSimpleRespVO {
13   -
14   - @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
15   - private Long id;
16   -
17   - @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
18   - private String name;
19   -
20   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig;
3 3 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
4 4 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6   -import jakarta.validation.constraints.NotNull;
7 6 import lombok.Data;
8 7  
9 8 import java.time.LocalDateTime;
... ... @@ -17,7 +16,6 @@ public class CrmCustomerLimitConfigRespVO {
17 16 private Long id;
18 17  
19 18 @Schema(description = "规则类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
20   - @NotNull(message = "规则类型不能为空")
21 19 private Integer type;
22 20  
23 21 @Schema(description = "规则适用人群")
... ... @@ -27,10 +25,9 @@ public class CrmCustomerLimitConfigRespVO {
27 25 private List<Long> deptIds;
28 26  
29 27 @Schema(description = "数量上限", requiredMode = Schema.RequiredMode.REQUIRED, example = "28384")
30   - @NotNull(message = "数量上限不能为空")
31 28 private Integer maxCount;
32 29  
33   - @Schema(description = "成交客户是否占有拥有客户数(当 type = 1 时)")
  30 + @Schema(description = "成交客户是否占有拥有客户数")
34 31 private Boolean dealCountEnabled;
35 32  
36 33 @Schema(description = "规则适用人群名称")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigSaveReqVO.java
... ... @@ -15,10 +15,11 @@ public class CrmCustomerLimitConfigSaveReqVO {
15 15 private Long id;
16 16  
17 17 @Schema(description = "规则类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
18   - @DiffLogField(name = "规则类型")
19 18 @NotNull(message = "规则类型不能为空")
  19 + @DiffLogField(name = "规则类型")
20 20 private Integer type;
21 21  
  22 + // TODO @puhui999:可以把 Function 那的 functionName 搞成 NAME 枚举,这里直接引用。这样后续改动更方便哈。
22 23 @Schema(description = "规则适用人群")
23 24 @DiffLogField(name = "规则适用人群", function = "getAdminUserById")
24 25 private List<Long> userIds;
... ... @@ -28,8 +29,8 @@ public class CrmCustomerLimitConfigSaveReqVO {
28 29 private List<Long> deptIds;
29 30  
30 31 @Schema(description = "数量上限", requiredMode = Schema.RequiredMode.REQUIRED, example = "28384")
31   - @DiffLogField(name = "数量上限")
32 32 @NotNull(message = "数量上限不能为空")
  33 + @DiffLogField(name = "数量上限")
33 34 private Integer maxCount;
34 35  
35 36 @Schema(description = "成交客户是否占有拥有客户数(当 type = 1 时)")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java
... ... @@ -16,7 +16,6 @@ import org.mapstruct.Mapper;
16 16 import org.mapstruct.Mapping;
17 17 import org.mapstruct.factory.Mappers;
18 18  
19   -import java.util.List;
20 19 import java.util.Map;
21 20  
22 21 import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
... ... @@ -31,6 +30,7 @@ public interface CrmCustomerConvert {
31 30  
32 31 CrmCustomerConvert INSTANCE = Mappers.getMapper(CrmCustomerConvert.class);
33 32  
  33 + // TODO @puhui999:可以清理掉可以用 BeanUtil 替代的方法哈
34 34 CrmCustomerDO convert(CrmCustomerSaveReqVO bean);
35 35  
36 36 CrmCustomerRespVO convert(CrmCustomerDO bean);
... ... @@ -51,8 +51,6 @@ public interface CrmCustomerConvert {
51 51 findAndThen(userMap, Long.parseLong(customer.getCreator()), user -> customer.setCreatorName(user.getNickname()));
52 52 }
53 53  
54   - List<CrmCustomerRespVO> convertList02(List<CrmCustomerDO> list);
55   -
56 54 @Mapping(target = "bizId", source = "reqVO.id")
57 55 CrmPermissionTransferReqBO convert(CrmCustomerTransferReqVO reqVO, Long userId);
58 56  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java
... ... @@ -23,6 +23,7 @@ public interface CrmCustomerLimitConfigConvert {
23 23  
24 24 CrmCustomerLimitConfigConvert INSTANCE = Mappers.getMapper(CrmCustomerLimitConfigConvert.class);
25 25  
  26 + // TODO @puhui999:可以把 convert 改成 BeanUtils
26 27 CrmCustomerLimitConfigDO convert(CrmCustomerLimitConfigSaveReqVO bean);
27 28  
28 29 CrmCustomerLimitConfigRespVO convert(CrmCustomerLimitConfigDO bean);
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java
... ... @@ -48,9 +48,7 @@ public interface CrmPermissionConvert {
48 48 return CollectionUtils.convertList(convert(permission), item -> {
49 49 findAndThen(userMap, item.getUserId(), user -> {
50 50 item.setNickname(user.getNickname());
51   - findAndThen(deptMap, user.getDeptId(), deptRespDTO -> {
52   - item.setDeptName(deptRespDTO.getName());
53   - });
  51 + findAndThen(deptMap, user.getDeptId(), deptRespDTO -> item.setDeptName(deptRespDTO.getName()));
54 52 List<PostRespDTO> postRespList = MapUtils.getList(Multimaps.forMap(postMap), user.getPostIds());
55 53 if (CollUtil.isEmpty(postRespList)) {
56 54 item.setPostNames(Collections.emptySet());
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/aop/CrmPermissionAspect.java
... ... @@ -40,12 +40,12 @@ public class CrmPermissionAspect {
40 40  
41 41 @Before("@annotation(crmPermission)")
42 42 public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) {
43   - // 获取相关属性值
  43 + // 1.1 获取相关属性值
44 44 Map<String, Object> expressionValues = parseExpressions(joinPoint, crmPermission);
45 45 Integer bizType = StrUtil.isEmpty(crmPermission.bizTypeValue()) ?
46 46 crmPermission.bizType()[0].getType() : (Integer) expressionValues.get(crmPermission.bizTypeValue()); // 模块类型
47   - // 处理兼容多个 bizId 的情况
48   - Object object = expressionValues.get(crmPermission.bizId());// 模块数据编号
  47 + // 1.2 处理兼容多个 bizId 的情况
  48 + Object object = expressionValues.get(crmPermission.bizId()); // 模块数据编号
49 49 Set<Long> bizIds = new HashSet<>();
50 50 if (object instanceof Collection<?>) {
51 51 bizIds.addAll(convertSet((Collection<?>) object, item -> Long.parseLong(item.toString())));
... ... @@ -53,11 +53,11 @@ public class CrmPermissionAspect {
53 53 bizIds.add(Long.parseLong(object.toString()));
54 54 }
55 55 Integer permissionLevel = crmPermission.level().getLevel(); // 需要的权限级别
  56 +
  57 + // 2. 逐个校验权限
56 58 List<CrmPermissionDO> permissionList = crmPermissionService.getPermissionListByBiz(bizType, bizIds);
57 59 Map<Long, List<CrmPermissionDO>> multiMap = convertMultiMap(permissionList, CrmPermissionDO::getBizId);
58   - bizIds.forEach(bizId -> {
59   - validatePermission(bizType, multiMap.get(bizId), permissionLevel);
60   - });
  60 + bizIds.forEach(bizId -> validatePermission(bizType, multiMap.get(bizId), permissionLevel));
61 61 }
62 62  
63 63 private void validatePermission(Integer bizType, List<CrmPermissionDO> bizPermissions, Integer permissionLevel) {
... ... @@ -71,7 +71,6 @@ public class CrmPermissionAspect {
71 71 if (CrmPermissionLevelEnum.isRead(permissionLevel)) {
72 72 return;
73 73 }
74   -
75 74 // 没有数据权限的情况下超出了读权限直接报错,避免后面校验空指针
76 75 throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType));
77 76 } else { // 1.2 有数据权限但是没有负责人的情况
... ... @@ -102,9 +101,8 @@ public class CrmPermissionAspect {
102 101 }
103 102 }
104 103 }
105   - // 2.4 没有权限!
106   - // 打个 info 日志,方便后续排查问题、审计
107   - log.info("[doBefore][userId({}) 要求权限({}) 实际权限({}) 数据校验错误]",
  104 + // 2.4 没有权限,抛出异常
  105 + log.info("[doBefore][userId({}) 要求权限({}) 实际权限({}) 数据校验错误]", // 打个 info 日志,方便后续排查问题、审计
108 106 getUserId(), permissionLevel, toJsonString(userPermission));
109 107 throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType));
110 108 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
... ... @@ -33,7 +33,7 @@ import java.util.List;
33 33  
34 34 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
35 35 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
36   -import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.CRM_CONTACT;
  36 +import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.CRM_CONTACT_TYPE;
37 37 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS;
38 38 import static java.util.Collections.singletonList;
39 39  
... ... @@ -65,7 +65,7 @@ public class CrmContactServiceImpl implements CrmContactService {
65 65  
66 66 @Override
67 67 @Transactional(rollbackFor = Exception.class)
68   - @LogRecord(type = CRM_CONTACT, subType = "创建联系人", bizNo = "{{#contactId}}", success = "创建了联系人[{{#contactName}}]")
  68 + @LogRecord(type = CRM_CONTACT_TYPE, subType = "创建联系人", bizNo = "{{#contactId}}", success = "创建了联系人[{{#contactName}}]")
69 69 public Long createContact(CrmContactSaveReqVO createReqVO, Long userId) {
70 70 // 1. 校验
71 71 validateRelationDataExists(createReqVO);
... ... @@ -93,7 +93,7 @@ public class CrmContactServiceImpl implements CrmContactService {
93 93  
94 94 @Override
95 95 @Transactional(rollbackFor = Exception.class)
96   - @LogRecord(type = CRM_CONTACT, subType = "更新联系人", bizNo = "{{#updateReqVO.id}}", success = "更新了联系人{_DIFF{#updateReqVO}}")
  96 + @LogRecord(type = CRM_CONTACT_TYPE, subType = "更新联系人", bizNo = "{{#updateReqVO.id}}", success = "更新了联系人{_DIFF{#updateReqVO}}")
97 97 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACT, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE)
98 98 public void updateContact(CrmContactSaveReqVO updateReqVO) {
99 99 // 1. 校验存在
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigServiceImpl.java
... ... @@ -44,7 +44,8 @@ public class CrmCustomerLimitConfigServiceImpl implements CrmCustomerLimitConfig
44 44 private AdminUserApi adminUserApi;
45 45  
46 46 @Override
47   - @LogRecord(type = CRM_CUSTOMER_LIMIT_CONFIG_TYPE, subType = CRM_CUSTOMER_LIMIT_CONFIG_CREATE_SUB_TYPE, bizNo = "{{#limitId}}", success = CRM_CUSTOMER_LIMIT_CONFIG_CREATE_SUCCESS)
  47 + @LogRecord(type = CRM_CUSTOMER_LIMIT_CONFIG_TYPE, subType = CRM_CUSTOMER_LIMIT_CONFIG_CREATE_SUB_TYPE, bizNo = "{{#limitId}}",
  48 + success = CRM_CUSTOMER_LIMIT_CONFIG_CREATE_SUCCESS)
48 49 public Long createCustomerLimitConfig(CrmCustomerLimitConfigSaveReqVO createReqVO) {
49 50 validateUserAndDept(createReqVO.getUserIds(), createReqVO.getDeptIds());
50 51 // 插入
... ... @@ -54,12 +55,12 @@ public class CrmCustomerLimitConfigServiceImpl implements CrmCustomerLimitConfig
54 55 // 记录操作日志上下文
55 56 LogRecordContext.putVariable("limitType", CrmCustomerLimitConfigTypeEnum.getNameByType(customerLimitConfig.getType()));
56 57 LogRecordContext.putVariable("limitId", customerLimitConfig.getId());
57   - // 返回
58 58 return customerLimitConfig.getId();
59 59 }
60 60  
61 61 @Override
62   - @LogRecord(type = CRM_CUSTOMER_LIMIT_CONFIG_TYPE, subType = CRM_CUSTOMER_LIMIT_CONFIG_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}", success = CRM_CUSTOMER_LIMIT_CONFIG_UPDATE_SUCCESS)
  62 + @LogRecord(type = CRM_CUSTOMER_LIMIT_CONFIG_TYPE, subType = CRM_CUSTOMER_LIMIT_CONFIG_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}",
  63 + success = CRM_CUSTOMER_LIMIT_CONFIG_UPDATE_SUCCESS)
63 64 public void updateCustomerLimitConfig(CrmCustomerLimitConfigSaveReqVO updateReqVO) {
64 65 // 校验存在
65 66 CrmCustomerLimitConfigDO oldLimitConfig = validateCustomerLimitConfigExists(updateReqVO.getId());
... ... @@ -73,7 +74,8 @@ public class CrmCustomerLimitConfigServiceImpl implements CrmCustomerLimitConfig
73 74 }
74 75  
75 76 @Override
76   - @LogRecord(type = CRM_CUSTOMER_LIMIT_CONFIG_TYPE, subType = CRM_CUSTOMER_LIMIT_CONFIG_DELETE_SUB_TYPE, bizNo = "{{#id}}", success = CRM_CUSTOMER_LIMIT_CONFIG_DELETE_SUCCESS)
  77 + @LogRecord(type = CRM_CUSTOMER_LIMIT_CONFIG_TYPE, subType = CRM_CUSTOMER_LIMIT_CONFIG_DELETE_SUB_TYPE, bizNo = "{{#id}}",
  78 + success = CRM_CUSTOMER_LIMIT_CONFIG_DELETE_SUCCESS)
77 79 public void deleteCustomerLimitConfig(Long id) {
78 80 // 校验存在
79 81 CrmCustomerLimitConfigDO limitConfigDO = validateCustomerLimitConfigExists(id);
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java
... ... @@ -34,6 +34,7 @@ public class CrmCustomerPoolConfigServiceImpl implements CrmCustomerPoolConfigSe
34 34 */
35 35 @Override
36 36 public CrmCustomerPoolConfigDO getCustomerPoolConfig() {
  37 + // TODO @puhui999:这个要搞到 mapper 里噢。
37 38 return customerPoolConfigMapper.selectOne(new LambdaQueryWrapperX<CrmCustomerPoolConfigDO>().last("LIMIT 1"));
38 39 }
39 40  
... ... @@ -43,7 +44,8 @@ public class CrmCustomerPoolConfigServiceImpl implements CrmCustomerPoolConfigSe
43 44 * @param saveReqVO 更新信息
44 45 */
45 46 @Override
46   - @LogRecord(type = CRM_CUSTOMER_POOL_CONFIG_TYPE, subType = CRM_CUSTOMER_POOL_CONFIG_SUB_TYPE, bizNo = "{{#poolConfigId}}", success = CRM_CUSTOMER_POOL_CONFIG_SUCCESS)
  47 + @LogRecord(type = CRM_CUSTOMER_POOL_CONFIG_TYPE, subType = CRM_CUSTOMER_POOL_CONFIG_SUB_TYPE, bizNo = "{{#poolConfigId}}",
  48 + success = CRM_CUSTOMER_POOL_CONFIG_SUCCESS)
47 49 public void saveCustomerPoolConfig(CrmCustomerPoolConfigSaveReqVO saveReqVO) {
48 50 // 存在,则进行更新
49 51 CrmCustomerPoolConfigDO dbConfig = getCustomerPoolConfig();
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
... ... @@ -65,7 +65,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
65 65  
66 66 @Override
67 67 @Transactional(rollbackFor = Exception.class)
68   - @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_CREATE_SUB_TYPE, bizNo = "{{#customer.id}}", success = CRM_CUSTOMER_CREATE_SUCCESS)
  68 + @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_CREATE_SUB_TYPE, bizNo = "{{#customer.id}}",
  69 + success = CRM_CUSTOMER_CREATE_SUCCESS)
69 70 public Long createCustomer(CrmCustomerSaveReqVO createReqVO, Long userId) {
70 71 createReqVO.setId(null);
71 72 // 1. 校验拥有客户是否到达上限
... ... @@ -89,12 +90,12 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
89 90  
90 91 @Override
91 92 @Transactional(rollbackFor = Exception.class)
92   - @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}", success = CRM_CUSTOMER_UPDATE_SUCCESS)
  93 + @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}",
  94 + success = CRM_CUSTOMER_UPDATE_SUCCESS)
93 95 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE)
94 96 public void updateCustomer(CrmCustomerSaveReqVO updateReqVO) {
95 97 Assert.notNull(updateReqVO.getId(), "客户编号不能为空");
96   - // 更新的时候,要把 updateReqVO 负责人设置为空,避免修改。
97   - updateReqVO.setOwnerUserId(null);
  98 + updateReqVO.setOwnerUserId(null); // 更新的时候,要把 updateReqVO 负责人设置为空,避免修改
98 99 // 1. 校验存在
99 100 CrmCustomerDO oldCustomer = validateCustomerExists(updateReqVO.getId());
100 101  
... ... @@ -109,7 +110,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
109 110  
110 111 @Override
111 112 @Transactional(rollbackFor = Exception.class)
112   - @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_DELETE_SUB_TYPE, bizNo = "{{#id}}", success = CRM_CUSTOMER_DELETE_SUCCESS)
  113 + @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_DELETE_SUB_TYPE, bizNo = "{{#id}}",
  114 + success = CRM_CUSTOMER_DELETE_SUCCESS)
113 115 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
114 116 public void deleteCustomer(Long id) {
115 117 // 校验存在
... ... @@ -128,7 +130,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
128 130  
129 131 @Override
130 132 @Transactional(rollbackFor = Exception.class)
131   - @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}", success = CRM_CUSTOMER_TRANSFER_SUCCESS)
  133 + @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}",
  134 + success = CRM_CUSTOMER_TRANSFER_SUCCESS)
132 135 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER)
133 136 public void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId) {
134 137 // 1.1 校验客户是否存在
... ... @@ -144,11 +147,13 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
144 147  
145 148 // 3. TODO 记录转移日志
146 149 // 记录操作日志上下文
  150 + // TODO @puhui999:crmCustomer=》customer,也看看其他有没类似的情况哈
147 151 LogRecordContext.putVariable("crmCustomer", customer);
148 152 }
149 153  
150 154 @Override
151   - @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_LOCK_SUB_TYPE, bizNo = "{{#lockReqVO.id}}", success = CRM_CUSTOMER_LOCK_SUCCESS)
  155 + @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_LOCK_SUB_TYPE, bizNo = "{{#lockReqVO.id}}",
  156 + success = CRM_CUSTOMER_LOCK_SUCCESS)
152 157 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#lockReqVO.id", level = CrmPermissionLevelEnum.OWNER)
153 158 public void lockCustomer(CrmCustomerLockReqVO lockReqVO, Long userId) {
154 159 // 1.1 校验当前客户是否存在
... ... @@ -165,7 +170,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
165 170 // 2. 更新锁定状态
166 171 customerMapper.updateById(BeanUtils.toBean(lockReqVO, CrmCustomerDO.class));
167 172  
168   - // 3. 记录操作日志上下文. tips: 因为这里使用的是老的状态所以记录时反着记录,也就是 lockStatus 为 true 那么就是解锁反之为锁定
  173 + // 3. 记录操作日志上下文
  174 + // tips: 因为这里使用的是老的状态所以记录时反着记录,也就是 lockStatus 为 true 那么就是解锁反之为锁定
169 175 LogRecordContext.putVariable("crmCustomer", customer);
170 176 }
171 177  
... ... @@ -173,7 +179,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
173 179  
174 180 @Override
175 181 @Transactional(rollbackFor = Exception.class)
176   - @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_POOL_SUB_TYPE, bizNo = "{{#id}}", success = CRM_CUSTOMER_POOL_SUCCESS)
  182 + @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_POOL_SUB_TYPE, bizNo = "{{#id}}",
  183 + success = CRM_CUSTOMER_POOL_SUCCESS)
177 184 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
178 185 public void putCustomerPool(Long id) {
179 186 // 1. 校验存在
... ... @@ -252,7 +259,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
252 259 }
253 260 }
254 261  
255   - @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_RECEIVE_SUB_TYPE, bizNo = "{{#customer.id}}", success = CRM_CUSTOMER_RECEIVE_SUCCESS)
  262 + @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_RECEIVE_SUB_TYPE, bizNo = "{{#customer.id}}",
  263 + success = CRM_CUSTOMER_RECEIVE_SUCCESS)
256 264 public void receiveCustomerLog(CrmCustomerDO customer, String ownerUserName) {
257 265 // 记录操作日志上下文
258 266 LogRecordContext.putVariable("customer", customer);
... ... @@ -280,7 +288,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
280 288 return customerMapper.selectPage(pageReqVO, userId);
281 289 }
282 290  
283   - //======================= 校验相关 =======================
  291 + // ======================= 校验相关 =======================
284 292  
285 293 /**
286 294 * 校验客户是否存在
... ...
yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java
... ... @@ -138,38 +138,4 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest {
138 138 //assertPojoEquals(dbCustomer, pageResult.getList().get(0));
139 139 }
140 140  
141   - @Test
142   - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
143   - public void testGetCustomerList() {
144   - // mock 数据
145   - CrmCustomerDO dbCustomer = randomPojo(CrmCustomerDO.class, o -> { // 等会查询到
146   - o.setName(null);
147   - o.setMobile(null);
148   - o.setTelephone(null);
149   - o.setWebsite(null);
150   - });
151   - customerMapper.insert(dbCustomer);
152   - // 测试 name 不匹配
153   - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setName(null)));
154   - // 测试 mobile 不匹配
155   - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setMobile(null)));
156   - // 测试 telephone 不匹配
157   - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setTelephone(null)));
158   - // 测试 website 不匹配
159   - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setWebsite(null)));
160   - // 准备参数
161   - CrmCustomerPageReqVO reqVO = new CrmCustomerPageReqVO();
162   - reqVO.setName("张三");
163   - reqVO.setMobile("13888888888");
164   - reqVO.setPageSize(PAGE_SIZE_NONE);
165   - //reqVO.setTelephone(null);
166   - //reqVO.setWebsite(null);
167   -
168   - // 调用
169   - PageResult<CrmCustomerDO> pageResult = customerService.getCustomerPage(reqVO, 1L);
170   - // 断言
171   - assertEquals(1, pageResult.getList().size());
172   - assertPojoEquals(dbCustomer, pageResult.getList().get(0));
173   - }
174   -
175 141 }
... ...
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpMessageServiceImpl.java
... ... @@ -74,6 +74,7 @@ public class MpMessageServiceImpl implements MpMessageService {
74 74 Assert.notNull(account, "公众号账号({}) 不存在", appId);
75 75  
76 76 // 订阅事件不记录,因为此时公众号粉丝表中还没有此粉丝的数据
  77 + // TODO @芋艿:这个修复,后续看看还有啥问题
77 78 if (ObjUtil.equal(wxMessage.getEvent(), WxConsts.EventType.SUBSCRIBE)) {
78 79 return;
79 80 }
... ...