Commit e79c750b469fa940f44146dec1964688cd79ef62

Authored by YunaiV
1 parent d80406ac

📖 CRM:code review 跟进记录的实现

Showing 17 changed files with 66 additions and 138 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java
... ... @@ -123,7 +123,7 @@ public class LocalDateTimeUtils {
123 123 }
124 124  
125 125 /**
126   - * 获取指定日期到现在过了几天,如果指定日期在当前日期之后,获取结果为负。
  126 + * 获取指定日期到现在过了几天,如果指定日期在当前日期之后,获取结果为负
127 127 *
128 128 * @param dateTime 日期
129 129 * @return 相差天数
... ...
yudao-module-crm/yudao-module-crm-api/pom.xml
... ... @@ -28,6 +28,7 @@
28 28 <artifactId>spring-boot-starter-validation</artifactId>
29 29 <optional>true</optional>
30 30 </dependency>
  31 + <!-- TODO @puhui999:api 之间,不直接引入哈;然后,logrecord function 在微服务下,这么跑会高不起来,所以每个服务自己写 function -->
31 32 <dependency>
32 33 <groupId>cn.iocoder.boot</groupId>
33 34 <artifactId>yudao-module-system-api</artifactId>
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/operatelog/CrmParseFunctionNameConstants.java
... ... @@ -6,6 +6,7 @@ package cn.iocoder.yudao.module.crm.enums.operatelog;
6 6 *
7 7 * @author HUIHUI
8 8 */
  9 +// TODO @puhui999:这个枚举,还是放在对应的 Function 里好。主要考虑,和 Function 实现可以更近一点哈
9 10 public interface CrmParseFunctionNameConstants {
10 11  
11 12 String GET_CONTACT_BY_ID = "getContactById"; // 获取联系人信息
... ... @@ -15,4 +16,4 @@ public interface CrmParseFunctionNameConstants {
15 16 String GET_CUSTOMER_SOURCE = "getCustomerSource"; // 获取客户来源
16 17 String GET_CONTRACT_BY_ID = "getContractById"; // 获取合同信息
17 18  
18 19 -}
  20 +}
19 21 \ No newline at end of file
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
... ... @@ -115,10 +115,8 @@ public class CrmCustomerController {
115 115 }
116 116  
117 117 // 2. 拼接数据
118   - Map<Long, Long> poolDayMap = null;
119   - if (ObjUtil.notEqual(pageVO.getPool(), Boolean.TRUE)) {
120   - poolDayMap = getPoolDayMap(pageResult.getList()); // 距离进入公海的时间
121   - }
  118 + Map<Long, Long> poolDayMap = Boolean.TRUE.equals(pageVO.getPool()) ? null :
  119 + getPoolDayMap(pageResult.getList()); // 客户界面,需要查看距离进入公海的时间
122 120 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
123 121 convertSetByFlatMap(pageResult.getList(), user -> Stream.of(Long.parseLong(user.getCreator()), user.getOwnerUserId())));
124 122 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
... ... @@ -132,21 +130,23 @@ public class CrmCustomerController {
132 130 * @return Map<key 客户编号, value 距离进入公海的时间>
133 131 */
134 132 private Map<Long, Long> getPoolDayMap(List<CrmCustomerDO> customerList) {
135   - CrmCustomerPoolConfigDO customerPoolConfig = customerPoolConfigService.getCustomerPoolConfig();
136   - if (customerPoolConfig == null || !customerPoolConfig.getEnabled()) {
  133 + CrmCustomerPoolConfigDO poolConfig = customerPoolConfigService.getCustomerPoolConfig();
  134 + if (poolConfig == null || !poolConfig.getEnabled()) {
137 135 return MapUtil.empty();
138 136 }
139   - // TODO @puhui999:需要考虑 lock 的情况么? 回复:锁定正常显示距离进入公海的时间有个提示
140 137 return convertMap(customerList, CrmCustomerDO::getId, customer -> {
  138 + // 1.1 未成交放入公海天数
141 139 long dealExpireDay = 0;
142   - if (!customer.getDealStatus()) { // 检查是否成交
143   - dealExpireDay = customerPoolConfig.getDealExpireDays() - LocalDateTimeUtils.between(customer.getCreateTime());
  140 + if (!customer.getDealStatus()) {
  141 + dealExpireDay = poolConfig.getDealExpireDays() - LocalDateTimeUtils.between(customer.getCreateTime());
144 142 }
145   - LocalDateTime lastTime = customer.getContactLastTime() != null ? customer.getContactLastTime() : customer.getCreateTime();
146   - long contactExpireDay = customerPoolConfig.getContactExpireDays() - LocalDateTimeUtils.between(lastTime);
  143 + // 1.2 未跟进放入公海天数
  144 + LocalDateTime lastTime = ObjUtil.defaultIfNull(customer.getContactLastTime(), customer.getCreateTime());
  145 + long contactExpireDay = poolConfig.getContactExpireDays() - LocalDateTimeUtils.between(lastTime);
147 146 if (contactExpireDay < 0) {
148   - contactExpireDay = 0; // 如果为负的话重置为零
  147 + contactExpireDay = 0;
149 148 }
  149 + // 2. 返回最小的天数
150 150 return Math.min(dealExpireDay, contactExpireDay);
151 151 });
152 152 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java
... ... @@ -29,8 +29,8 @@ public class CrmCustomerPoolConfigController {
29 29 @Operation(summary = "获取客户公海规则设置")
30 30 @PreAuthorize("@ss.hasPermission('crm:customer-pool-config:query')")
31 31 public CommonResult<CrmCustomerPoolConfigRespVO> getCustomerPoolConfig() {
32   - CrmCustomerPoolConfigDO customerPoolConfig = customerPoolConfigService.getCustomerPoolConfig();
33   - return success(BeanUtils.toBean(customerPoolConfig, CrmCustomerPoolConfigRespVO.class));
  32 + CrmCustomerPoolConfigDO poolConfig = customerPoolConfigService.getCustomerPoolConfig();
  33 + return success(BeanUtils.toBean(poolConfig, CrmCustomerPoolConfigRespVO.class));
34 34 }
35 35  
36 36 @PutMapping("/save")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanTransferReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan;
2   -
3   -import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
5   -import io.swagger.v3.oas.annotations.media.Schema;
6   -import jakarta.validation.constraints.NotNull;
7   -import lombok.Data;
8   -
9   -@Schema(description = "管理后台 - CRM 回款计划转移 Request VO")
10   -@Data
11   -public class CrmReceivablePlanTransferReqVO {
12   -
13   - @Schema(description = "回款计划编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
14   - @NotNull(message = "回款计划编号不能为空")
15   - private Long id;
16   -
17   - @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
18   - @NotNull(message = "新负责人的用户编号不能为空")
19   - private Long newOwnerUserId;
20   -
21   - @Schema(description = "老负责人加入团队后的权限级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
22   - @InEnum(value = CrmPermissionLevelEnum.class)
23   - private Integer oldOwnerPermissionLevel; // 老负责人加入团队后的权限级别。如果 null 说明移除
24   -
25   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivableTransferReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable;
2   -
3   -import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
5   -import io.swagger.v3.oas.annotations.media.Schema;
6   -import jakarta.validation.constraints.NotNull;
7   -import lombok.Data;
8   -
9   -@Schema(description = "管理后台 - CRM 回款转移 Request VO")
10   -@Data
11   -public class CrmReceivableTransferReqVO {
12   -
13   - @Schema(description = "回款编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
14   - @NotNull(message = "回款编号不能为空")
15   - private Long id;
16   -
17   - @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
18   - @NotNull(message = "新负责人的用户编号不能为空")
19   - private Long newOwnerUserId;
20   -
21   - @Schema(description = "老负责人加入团队后的权限级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
22   - @InEnum(value = CrmPermissionLevelEnum.class)
23   - private Integer oldOwnerPermissionLevel; // 老负责人加入团队后的权限级别。如果 null 说明移除
24   -
25   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.customer;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
4 5 import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
5 6 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerRespVO;
6 7 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO;
... ... @@ -26,7 +27,22 @@ public interface CrmCustomerConvert {
26 27  
27 28 CrmCustomerConvert INSTANCE = Mappers.getMapper(CrmCustomerConvert.class);
28 29  
29   - CrmCustomerRespVO convert(CrmCustomerDO bean);
  30 + default CrmCustomerRespVO convert(CrmCustomerDO customer, Map<Long, AdminUserRespDTO> userMap,
  31 + Map<Long, DeptRespDTO> deptMap) {
  32 + CrmCustomerRespVO customerResp = BeanUtils.toBean(customer, CrmCustomerRespVO.class);
  33 + setUserInfo(customerResp, userMap, deptMap);
  34 + return customerResp;
  35 + }
  36 +
  37 + default PageResult<CrmCustomerRespVO> convertPage(PageResult<CrmCustomerDO> pageResult, Map<Long, AdminUserRespDTO> userMap,
  38 + Map<Long, DeptRespDTO> deptMap, Map<Long, Long> poolDayMap) {
  39 + PageResult<CrmCustomerRespVO> result = BeanUtils.toBean(pageResult, CrmCustomerRespVO.class);
  40 + result.getList().forEach(item -> {
  41 + setUserInfo(item, userMap, deptMap);
  42 + findAndThen(poolDayMap, item.getId(), item::setPoolDay);
  43 + });
  44 + return result;
  45 + }
30 46  
31 47 /**
32 48 * 设置用户信息
... ... @@ -47,23 +63,4 @@ public interface CrmCustomerConvert {
47 63 @Mapping(target = "bizId", source = "reqVO.id")
48 64 CrmPermissionTransferReqBO convert(CrmCustomerTransferReqVO reqVO, Long userId);
49 65  
50   - PageResult<CrmCustomerRespVO> convertPage(PageResult<CrmCustomerDO> page);
51   -
52   - default CrmCustomerRespVO convert(CrmCustomerDO customer, Map<Long, AdminUserRespDTO> userMap,
53   - Map<Long, DeptRespDTO> deptMap) {
54   - CrmCustomerRespVO customerResp = convert(customer);
55   - setUserInfo(customerResp, userMap, deptMap);
56   - return customerResp;
57   - }
58   -
59   - default PageResult<CrmCustomerRespVO> convertPage(PageResult<CrmCustomerDO> pageResult, Map<Long, AdminUserRespDTO> userMap,
60   - Map<Long, DeptRespDTO> deptMap, Map<Long, Long> poolDayMap) {
61   - PageResult<CrmCustomerRespVO> result = convertPage(pageResult);
62   - result.getList().forEach(item -> {
63   - setUserInfo(item, userMap, deptMap);
64   - findAndThen(poolDayMap, item.getId(), item::setPoolDay);
65   - });
66   - return result;
67   - }
68   -
69 66 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.convert.customer;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 6 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigRespVO;
6 7 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO;
7 8 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
... ... @@ -9,6 +10,7 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
9 10 import org.mapstruct.Mapper;
10 11 import org.mapstruct.factory.Mappers;
11 12  
  13 +import java.util.List;
12 14 import java.util.Map;
13 15  
14 16 /**
... ... @@ -21,34 +23,20 @@ public interface CrmCustomerLimitConfigConvert {
21 23  
22 24 CrmCustomerLimitConfigConvert INSTANCE = Mappers.getMapper(CrmCustomerLimitConfigConvert.class);
23 25  
24   - CrmCustomerLimitConfigRespVO convert(CrmCustomerLimitConfigDO bean);
25   -
26   - PageResult<CrmCustomerLimitConfigRespVO> convertPage(PageResult<CrmCustomerLimitConfigDO> page);
27   -
28   - default PageResult<CrmCustomerLimitConfigRespVO> convertPage(PageResult<CrmCustomerLimitConfigDO> pageResult,
29   - Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
30   - PageResult<CrmCustomerLimitConfigRespVO> result = convertPage(pageResult);
31   - result.getList().forEach(respVo -> fillNameField(userMap, deptMap, respVo));
32   - return result;
  26 + default PageResult<CrmCustomerLimitConfigRespVO> convertPage(
  27 + PageResult<CrmCustomerLimitConfigDO> pageResult,
  28 + Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
  29 + List<CrmCustomerLimitConfigRespVO> list = CollectionUtils.convertList(pageResult.getList(),
  30 + limitConfig -> convert(limitConfig, userMap, deptMap));
  31 + return new PageResult<>(list, pageResult.getTotal());
33 32 }
34 33  
35   - default CrmCustomerLimitConfigRespVO convert(CrmCustomerLimitConfigDO customerLimitConfig,
  34 + default CrmCustomerLimitConfigRespVO convert(CrmCustomerLimitConfigDO limitConfig,
36 35 Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
37   - CrmCustomerLimitConfigRespVO respVo = convert(customerLimitConfig);
38   - fillNameField(userMap, deptMap, respVo);
39   - return respVo;
40   - }
41   -
42   - /**
43   - * 填充名称字段
44   - *
45   - * @param userMap 用户映射
46   - * @param deptMap 部门映射
47   - * @param respVo 响应实体
48   - */
49   - static void fillNameField(Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap, CrmCustomerLimitConfigRespVO respVo) {
50   - respVo.setUsers(CollectionUtils.convertList(respVo.getUserIds(), userMap::get));
51   - respVo.setDepts(CollectionUtils.convertList(respVo.getDeptIds(), deptMap::get));
  36 + CrmCustomerLimitConfigRespVO limitConfigVO = BeanUtils.toBean(limitConfig, CrmCustomerLimitConfigRespVO.class);
  37 + limitConfigVO.setUsers(CollectionUtils.convertList(limitConfigVO.getUserIds(), userMap::get));
  38 + limitConfigVO.setDepts(CollectionUtils.convertList(limitConfigVO.getDeptIds(), deptMap::get));
  39 + return limitConfigVO;
52 40 }
53 41  
54 42 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/receivable/CrmReceivableConvert.java
... ... @@ -4,15 +4,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 5 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableCreateReqVO;
6 6 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableRespVO;
7   -import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableTransferReqVO;
8 7 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableUpdateReqVO;
9 8 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
10 9 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
11 10 import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO;
12   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
13 11 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
14 12 import org.mapstruct.Mapper;
15   -import org.mapstruct.Mapping;
16 13 import org.mapstruct.factory.Mappers;
17 14  
18 15 import java.util.List;
... ... @@ -52,7 +49,4 @@ public interface CrmReceivableConvert {
52 49 return voPageResult;
53 50 }
54 51  
55   - @Mapping(target = "bizId", source = "reqVO.id")
56   - CrmPermissionTransferReqBO convert(CrmReceivableTransferReqVO reqVO, Long userId);
57   -
58 52 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/receivable/CrmReceivablePlanConvert.java
... ... @@ -4,16 +4,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 5 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceivablePlanCreateReqVO;
6 6 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceivablePlanRespVO;
7   -import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceivablePlanTransferReqVO;
8 7 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceivablePlanUpdateReqVO;
9 8 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
10 9 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
11 10 import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO;
12 11 import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivablePlanDO;
13   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
14 12 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
15 13 import org.mapstruct.Mapper;
16   -import org.mapstruct.Mapping;
17 14 import org.mapstruct.factory.Mappers;
18 15  
19 16 import java.util.List;
... ... @@ -56,7 +53,4 @@ public interface CrmReceivablePlanConvert {
56 53 return voPageResult;
57 54 }
58 55  
59   - @Mapping(target = "bizId", source = "reqVO.id")
60   - CrmPermissionTransferReqBO convert(CrmReceivablePlanTransferReqVO reqVO, Long userId);
61   -
62 56 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueServiceImpl.java
... ... @@ -142,9 +142,11 @@ public class CrmClueServiceImpl implements CrmClueService {
142 142 clues.forEach(clue -> {
143 143 clue.setId(null);
144 144 // 创建客户
  145 + // TODO @puhui999:上面的 id 置空,适合 bean copy 后,在设置为 null,不直接修改 clu 哈
145 146 customerService.createCustomer(BeanUtils.toBean(clue, CrmCustomerSaveReqVO.class), userId);
146 147 // 更新线索状态
147 148 // TODO @min:新建一个 CrmClueDO 去更新。尽量规避直接用原本的对象去更新。因为这样万一并发更新,会存在覆盖的问题。
  149 + // TODO @min:customerId 没有更新进去
148 150 // TODO @puhui999:如果有跟进记录,需要一起转过去;
149 151 clue.setTransformStatus(Boolean.TRUE);
150 152 clueMapper.updateById(clue);
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
... ... @@ -154,7 +154,6 @@ public class CrmContactServiceImpl implements CrmContactService {
154 154 permissionService.deletePermission(CrmBizTypeEnum.CRM_CONTACT.getType(), id);
155 155 // 4.2 删除商机关联
156 156 contactBusinessService.deleteContactBusinessByContactId(id);
157   - // TODO @puhui999:删除跟进记录
158 157  
159 158 // 记录操作日志上下文
160 159 LogRecordContext.putVariable("contactName", contact.getName());
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigServiceImpl.java
... ... @@ -48,13 +48,13 @@ public class CrmCustomerLimitConfigServiceImpl implements CrmCustomerLimitConfig
48 48 public Long createCustomerLimitConfig(CrmCustomerLimitConfigSaveReqVO createReqVO) {
49 49 validateUserAndDept(createReqVO.getUserIds(), createReqVO.getDeptIds());
50 50 // 插入
51   - CrmCustomerLimitConfigDO customerLimitConfig = BeanUtils.toBean(createReqVO, CrmCustomerLimitConfigDO.class);
52   - customerLimitConfigMapper.insert(customerLimitConfig);
  51 + CrmCustomerLimitConfigDO limitConfig = BeanUtils.toBean(createReqVO, CrmCustomerLimitConfigDO.class);
  52 + customerLimitConfigMapper.insert(limitConfig);
53 53  
54 54 // 记录操作日志上下文
55   - LogRecordContext.putVariable("limitType", CrmCustomerLimitConfigTypeEnum.getNameByType(customerLimitConfig.getType()));
56   - LogRecordContext.putVariable("limitId", customerLimitConfig.getId());
57   - return customerLimitConfig.getId();
  55 + LogRecordContext.putVariable("limitType", CrmCustomerLimitConfigTypeEnum.getNameByType(limitConfig.getType()));
  56 + LogRecordContext.putVariable("limitId", limitConfig.getId());
  57 + return limitConfig.getId();
58 58 }
59 59  
60 60 @Override
... ... @@ -77,12 +77,12 @@ public class CrmCustomerLimitConfigServiceImpl implements CrmCustomerLimitConfig
77 77 success = CRM_CUSTOMER_LIMIT_CONFIG_DELETE_SUCCESS)
78 78 public void deleteCustomerLimitConfig(Long id) {
79 79 // 校验存在
80   - CrmCustomerLimitConfigDO limitConfigDO = validateCustomerLimitConfigExists(id);
  80 + CrmCustomerLimitConfigDO limitConfig = validateCustomerLimitConfigExists(id);
81 81 // 删除
82 82 customerLimitConfigMapper.deleteById(id);
83 83  
84 84 // 记录操作日志上下文
85   - LogRecordContext.putVariable("limitType", CrmCustomerLimitConfigTypeEnum.getNameByType(limitConfigDO.getType()));
  85 + LogRecordContext.putVariable("limitType", CrmCustomerLimitConfigTypeEnum.getNameByType(limitConfig.getType()));
86 86 }
87 87  
88 88 @Override
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
... ... @@ -127,17 +127,17 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
127 127 success = CRM_CUSTOMER_DELETE_SUCCESS)
128 128 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
129 129 public void deleteCustomer(Long id) {
130   - // 校验存在
  130 + // 1.1 校验存在
131 131 CrmCustomerDO customer = validateCustomerExists(id);
132   - // 检查引用
  132 + // 1.2 检查引用
133 133 checkCustomerReference(id);
134   - // 删除
  134 +
  135 + // 2. 删除
135 136 customerMapper.deleteById(id);
136   - // 删除数据权限
  137 + // 3. 删除数据权限
137 138 permissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), id);
138   - // TODO @puhui999:删除跟进记录
139 139  
140   - // 记录操作日志上下文
  140 + // 4. 记录操作日志上下文
141 141 LogRecordContext.putVariable("customerName", customer.getName());
142 142 }
143 143  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java
... ... @@ -77,7 +77,8 @@ public class CrmReceivableServiceImpl implements CrmReceivableService {
77 77 permissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_RECEIVABLE.getType())
78 78 .setBizId(receivable.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人
79 79 // TODO @liuhongfeng:需要更新关联的 plan
80   - // 记录操作日志上下文
  80 +
  81 + // 4. 记录操作日志上下文
81 82 LogRecordContext.putVariable("receivable", receivable);
82 83 return receivable.getId();
83 84 }
... ...
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/operatelog/SysParseFunctionNameConstants.java
... ... @@ -6,6 +6,7 @@ package cn.iocoder.yudao.module.system.enums.operatelog;
6 6 *
7 7 * @author HUIHUI
8 8 */
  9 +// TODO @puhui999:这个枚举,还是放在对应的 Function 里好。主要考虑,和 Function 实现可以更近一点哈
9 10 public interface SysParseFunctionNameConstants {
10 11  
11 12 String GET_ADMIN_USER_BY_ID = "getAdminUserById"; // 获取用户信息
... ...