Commit ea4b4b8956757a6c60d8e440d7c2c24a59110cf8

Authored by puhui999
1 parent e6f4c1f0

CRM-客户:精简 VO

Showing 15 changed files with 189 additions and 259 deletions
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/config/YudaoOperateLogV2Configuration.java
1 1 package cn.iocoder.yudao.framework.operatelog.config;
2 2  
3   -import cn.iocoder.yudao.framework.operatelog.core.service.ILogRecordServiceImpl;
  3 +import cn.iocoder.yudao.framework.operatelog.core.service.LogRecordServiceImpl;
4 4 import com.mzt.logapi.service.ILogRecordService;
5 5 import com.mzt.logapi.starter.annotation.EnableLogRecord;
6 6 import lombok.extern.slf4j.Slf4j;
... ... @@ -21,7 +21,7 @@ public class YudaoOperateLogV2Configuration {
21 21 @Bean
22 22 @Primary
23 23 public ILogRecordService iLogRecordServiceImpl() {
24   - return new ILogRecordServiceImpl();
  24 + return new LogRecordServiceImpl();
25 25 }
26 26  
27 27 }
... ...
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/ILogRecordServiceImpl.java renamed to yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java
... ... @@ -2,7 +2,8 @@ package cn.iocoder.yudao.framework.operatelog.core.service;
2 2  
3 3 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
4 4 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
5   -import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
  5 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  6 +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
6 7 import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
7 8 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
8 9 import com.mzt.logapi.beans.LogRecord;
... ... @@ -13,7 +14,6 @@ import lombok.extern.slf4j.Slf4j;
13 14  
14 15 import java.util.List;
15 16  
16   -// TODO @puhui999:LogRecordServiceImpl 改成这个名字哈
17 17 /**
18 18 * 操作日志 ILogRecordService 实现类
19 19 *
... ... @@ -22,7 +22,7 @@ import java.util.List;
22 22 * @author HUIHUI
23 23 */
24 24 @Slf4j
25   -public class ILogRecordServiceImpl implements ILogRecordService {
  25 +public class LogRecordServiceImpl implements ILogRecordService {
26 26  
27 27 @Resource
28 28 private OperateLogApi operateLogApi;
... ... @@ -46,9 +46,13 @@ public class ILogRecordServiceImpl implements ILogRecordService {
46 46 }
47 47  
48 48 private static void fillUserFields(OperateLogV2CreateReqDTO reqDTO) {
49   - // TODO @puhui999:使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web;
50   - reqDTO.setUserId(WebFrameworkUtils.getLoginUserId());
51   - reqDTO.setUserType(WebFrameworkUtils.getLoginUserType());
  49 + // 使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web;
  50 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
  51 + if (loginUser == null) {
  52 + return;
  53 + }
  54 + reqDTO.setUserId(loginUser.getId());
  55 + reqDTO.setUserType(loginUser.getUserType());
52 56 }
53 57  
54 58 public static void fillModuleFields(OperateLogV2CreateReqDTO reqDTO, LogRecord logRecord) {
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 6 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
8 7 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
9 8 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*;
... ... @@ -19,7 +18,6 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
19 18 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
20 19 import io.swagger.v3.oas.annotations.Operation;
21 20 import io.swagger.v3.oas.annotations.Parameter;
22   -import io.swagger.v3.oas.annotations.Parameters;
23 21 import io.swagger.v3.oas.annotations.tags.Tag;
24 22 import jakarta.annotation.Resource;
25 23 import jakarta.servlet.http.HttpServletResponse;
... ... @@ -58,28 +56,24 @@ public class CrmCustomerController {
58 56 @Resource
59 57 private OperateLogApi operateLogApi;
60 58  
61   - // TODO @puhui999:把 CrmCustomerCreateReqVO、CrmCustomerUpdateReqVO、CrmCustomerRespVO 按照新的规范,搞一下哈;
62 59 @PostMapping("/create")
63 60 @Operation(summary = "创建客户")
64   - @OperateLog(enable = false) // TODO 关闭原有日志记录;@puhui999:注解都先删除。先记录,没关系。我们下个迭代,就都删除掉操作日志了;
65 61 @PreAuthorize("@ss.hasPermission('crm:customer:create')")
66   - public CommonResult<Long> createCustomer(@Valid @RequestBody CrmCustomerCreateReqVO createReqVO) {
  62 + public CommonResult<Long> createCustomer(@Valid @RequestBody CrmCustomerSaveReqVO createReqVO) {
67 63 return success(customerService.createCustomer(createReqVO, getLoginUserId()));
68 64 }
69 65  
70 66 @PutMapping("/update")
71 67 @Operation(summary = "更新客户")
72   - @OperateLog(enable = false) // TODO 关闭原有日志记录
73 68 @PreAuthorize("@ss.hasPermission('crm:customer:update')")
74   - public CommonResult<Boolean> updateCustomer(@Valid @RequestBody CrmCustomerUpdateReqVO updateReqVO) {
  69 + public CommonResult<Boolean> updateCustomer(@Valid @RequestBody CrmCustomerSaveReqVO updateReqVO) {
75 70 customerService.updateCustomer(updateReqVO);
76 71 return success(true);
77 72 }
78 73  
79 74 @DeleteMapping("/delete")
80 75 @Operation(summary = "删除客户")
81   - @OperateLog(enable = false) // TODO 关闭原有日志记录
82   - @Parameter(name = "id", description = "编号", required = true)
  76 + @Parameter(name = "id", description = "客户编号", required = true)
83 77 @PreAuthorize("@ss.hasPermission('crm:customer:delete')")
84 78 public CommonResult<Boolean> deleteCustomer(@RequestParam("id") Long id) {
85 79 customerService.deleteCustomer(id);
... ... @@ -103,7 +97,6 @@ public class CrmCustomerController {
103 97 return success(CrmCustomerConvert.INSTANCE.convert(customer, userMap, deptMap));
104 98 }
105 99  
106   - // TODO @puhui999:这个查询会查出多个;微信发你图了
107 100 @GetMapping("/page")
108 101 @Operation(summary = "获得客户分页")
109 102 @PreAuthorize("@ss.hasPermission('crm:customer:query')")
... ... @@ -131,32 +124,32 @@ public class CrmCustomerController {
131 124 pageVO.setPageSize(PAGE_SIZE_NONE); // 不分页
132 125 List<CrmCustomerDO> list = customerService.getCustomerPage(pageVO, getLoginUserId()).getList();
133 126 // 导出 Excel
134   - List<CrmCustomerExcelVO> datas = CrmCustomerConvert.INSTANCE.convertList02(list);
135   - ExcelUtils.write(response, "客户.xls", "数据", CrmCustomerExcelVO.class, datas);
  127 + List<CrmCustomerRespVO> datas = CrmCustomerConvert.INSTANCE.convertList02(list);
  128 + ExcelUtils.write(response, "客户.xls", "数据", CrmCustomerRespVO.class, datas);
136 129 }
137 130  
138 131 @PutMapping("/transfer")
139 132 @Operation(summary = "转移客户")
140   - @OperateLog(enable = false) // TODO 关闭原有日志记录
141 133 @PreAuthorize("@ss.hasPermission('crm:customer:update')")
142 134 public CommonResult<Boolean> transfer(@Valid @RequestBody CrmCustomerTransferReqVO reqVO) {
143 135 customerService.transferCustomer(reqVO, getLoginUserId());
144 136 return success(true);
145 137 }
146 138  
147   - // TODO @puhui999:是不是接口只要传递 bizId,由 Controller 自己组装出 OperateLogV2PageReqDTO
148 139 @GetMapping("/operate-log-page")
149 140 @Operation(summary = "获得客户操作日志")
  141 + @Parameter(name = "id", description = "客户编号", required = true)
150 142 @PreAuthorize("@ss.hasPermission('crm:customer:query')")
151   - public CommonResult<PageResult<OperateLogV2RespDTO>> getCustomerOperateLog(CrmCustomerOperateLogPageReqVO reqVO) {
152   - reqVO.setPageSize(PAGE_SIZE_NONE); // 不分页
153   - reqVO.setBizType(CRM_CUSTOMER);
154   - return success(operateLogApi.getOperateLogPage(BeanUtils.toBean(reqVO, OperateLogV2PageReqDTO.class)));
  143 + public CommonResult<PageResult<OperateLogV2RespDTO>> getCustomerOperateLog(@RequestParam("id") Long id) {
  144 + OperateLogV2PageReqDTO reqDTO = new OperateLogV2PageReqDTO();
  145 + reqDTO.setPageSize(PAGE_SIZE_NONE); // 不分页
  146 + reqDTO.setBizType(CRM_CUSTOMER);
  147 + reqDTO.setBizId(id);
  148 + return success(operateLogApi.getOperateLogPage(reqDTO));
155 149 }
156 150  
157 151 @PutMapping("/lock")
158 152 @Operation(summary = "锁定/解锁客户")
159   - @OperateLog(enable = false) // TODO 关闭原有日志记录
160 153 @PreAuthorize("@ss.hasPermission('crm:customer:update')")
161 154 public CommonResult<Boolean> lockCustomer(@Valid @RequestBody CrmCustomerLockReqVO lockReqVO) {
162 155 customerService.lockCustomer(lockReqVO, getLoginUserId());
... ... @@ -167,7 +160,6 @@ public class CrmCustomerController {
167 160  
168 161 @PutMapping("/put-pool")
169 162 @Operation(summary = "数据放入公海")
170   - @OperateLog(enable = false) // TODO 关闭原有日志记录
171 163 @Parameter(name = "id", description = "客户编号", required = true, example = "1024")
172 164 @PreAuthorize("@ss.hasPermission('crm:customer:update')")
173 165 public CommonResult<Boolean> putCustomerPool(@RequestParam("id") Long id) {
... ... @@ -184,28 +176,22 @@ public class CrmCustomerController {
184 176 return success(true);
185 177 }
186 178  
187   - // TODO @puhui999:需要搞个 VO 类
188 179 @PutMapping("/distribute")
189 180 @Operation(summary = "分配公海给对应负责人")
190   - @Parameters({
191   - @Parameter(name = "ids", description = "客户编号数组", required = true, example = "1,2,3"),
192   - @Parameter(name = "ownerUserId", description = "分配的负责人编号", required = true, example = "12345")
193   - })
194 181 @PreAuthorize("@ss.hasPermission('crm:customer:distribute')")
195   - public CommonResult<Boolean> distributeCustomer(@RequestParam(value = "ids") List<Long> ids,
196   - @RequestParam(value = "ownerUserId") Long ownerUserId) {
197   - customerService.receiveCustomer(ids, ownerUserId);
  182 + public CommonResult<Boolean> distributeCustomer(@Valid @RequestBody CrmCustomerDistributeReqVO distributeReqVO) {
  183 + customerService.receiveCustomer(distributeReqVO.getIds(), distributeReqVO.getOwnerUserId());
198 184 return success(true);
199 185 }
200 186  
201 187 // TODO 芋艿:这个接口要调整下
202   - @GetMapping("/query-all-list")
203   - @Operation(summary = "查询客户列表")
204   - @PreAuthorize("@ss.hasPermission('crm:customer:all')")
205   - public CommonResult<List<CrmCustomerQueryAllRespVO>> queryAll() {
206   - List<CrmCustomerDO> crmCustomerDOList = customerService.getCustomerList();
207   - List<CrmCustomerQueryAllRespVO> data = CrmCustomerConvert.INSTANCE.convertQueryAll(crmCustomerDOList);
208   - return success(data);
209   - }
  188 + //@GetMapping("/query-all-list")
  189 + //@Operation(summary = "查询客户列表")
  190 + //@PreAuthorize("@ss.hasPermission('crm:customer:all')")
  191 + //public CommonResult<List<CrmCustomerQueryAllRespVO>> queryAll() {
  192 + // List<CrmCustomerDO> crmCustomerDOList = customerService.getCustomerList();
  193 + // List<CrmCustomerQueryAllRespVO> data = CrmCustomerConvert.INSTANCE.convertQueryAll(crmCustomerDOList);
  194 + // return success(data);
  195 + //}
210 196  
211 197 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerCreateReqVO.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.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7   -
8   -import jakarta.validation.constraints.NotNull;
9   -
10   -@Schema(description = "管理后台 - CRM 客户创建 Request VO")
11   -@Data
12   -@EqualsAndHashCode(callSuper = true)
13   -@ToString(callSuper = true)
14   -public class CrmCustomerCreateReqVO extends CrmCustomerBaseVO {
15   -
16   - @Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
17   - @NotNull(message = "负责人不能为空")
18   - private Long ownerUserId;
19   -
20   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerDistributeReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotNull;
  5 +import lombok.Data;
  6 +
  7 +import java.util.List;
  8 +
  9 +@Schema(description = "管理后台 - CRM 客户分配公海给对应负责人 Request VO")
  10 +@Data
  11 +public class CrmCustomerDistributeReqVO {
  12 +
  13 + @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1024]")
  14 + @NotNull(message = "客户编号不能为空")
  15 + private List<Long> ids;
  16 +
  17 + @Schema(description = "负责人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  18 + @NotNull(message = "负责人不能为空")
  19 + private Long ownerUserId;
  20 +
  21 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExcelVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
2   -
3   -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4   -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelProperty;
7   -import io.swagger.v3.oas.annotations.media.Schema;
8   -import lombok.Data;
9   -
10   -import java.time.LocalDateTime;
11   -
12   -// TODO 芋艿:导出最后做,等基本确认的差不多之后;
13   -/**
14   - * CRM 客户 Excel VO
15   - *
16   - * @author Wanwan
17   - */
18   -@Data
19   -public class CrmCustomerExcelVO {
20   -
21   - @ExcelProperty("编号")
22   - private Long id;
23   -
24   - @ExcelProperty("客户名称")
25   - private String name;
26   -
27   - @ExcelProperty(value = "跟进状态", converter = DictConvert.class)
28   - @DictFormat(DictTypeConstants.BOOLEAN_STRING)
29   - private Boolean followUpStatus;
30   -
31   - @ExcelProperty(value = "锁定状态", converter = DictConvert.class)
32   - @DictFormat(DictTypeConstants.BOOLEAN_STRING)
33   - private Boolean lockStatus;
34   -
35   - @ExcelProperty(value = "成交状态", converter = DictConvert.class)
36   - @DictFormat(DictTypeConstants.BOOLEAN_STRING)
37   - private Boolean dealStatus;
38   -
39   - @ExcelProperty(value = "所属行业", converter = DictConvert.class)
40   - @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY)
41   - private Integer industryId;
42   -
43   - @ExcelProperty(value = "客户等级", converter = DictConvert.class)
44   - @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_LEVEL)
45   - private Integer level;
46   -
47   - @ExcelProperty(value = "客户来源", converter = DictConvert.class)
48   - @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_SOURCE)
49   - private Integer source;
50   -
51   - @ExcelProperty("手机")
52   - private String mobile;
53   -
54   - @ExcelProperty("电话")
55   - private String telephone;
56   -
57   - @ExcelProperty("网址")
58   - private String website;
59   -
60   - @ExcelProperty("QQ")
61   - private String qq;
62   -
63   - @ExcelProperty("wechat")
64   - private String wechat;
65   -
66   - @ExcelProperty("email")
67   - private String email;
68   -
69   - @ExcelProperty("客户描述")
70   - private String description;
71   -
72   - @ExcelProperty("备注")
73   - private String remark;
74   -
75   - @ExcelProperty("负责人的用户编号")
76   - private Long ownerUserId;
77   -
78   - @ExcelProperty("地区编号")
79   - private Integer areaId;
80   -
81   - @ExcelProperty("详细地址")
82   - private String detailAddress;
83   -
84   - @ExcelProperty("最后跟进时间")
85   - private LocalDateTime contactLastTime;
86   -
87   - @ExcelProperty("下次联系时间")
88   - private LocalDateTime contactNextTime;
89   -
90   - @ExcelProperty("创建时间")
91   - private LocalDateTime createTime;
92   -
93   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerOperateLogPageReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.PageParam;
4   -import io.swagger.v3.oas.annotations.media.Schema;
5   -import lombok.Data;
6   -
7   -@Schema(description = "管理后台 - crm 客户操作日志分页 Request VO")
8   -@Data
9   -public class CrmCustomerOperateLogPageReqVO extends PageParam {
10   -
11   - @Schema(description = "模块数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
12   - private Long bizId;
13   -
14   - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
15   - private Long userId;
16   -
17   - @Schema(description = "模块类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
18   - private String bizType;
19   -
20   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.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.Data;
5   -
6   -// TODO 芋艿:这块要统一下;
7   -@Schema(description = "管理后台 - CRM 全部客户 Response VO")
8   -@Data
9   -public class CrmCustomerQueryAllRespVO{
10   -
11   - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
12   - private Long id;
13   -
14   - @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
15   - private String name;
16   -
17   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerRespVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
2 2  
  3 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5 +import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
  6 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  7 +import com.alibaba.excel.annotation.ExcelProperty;
3 8 import io.swagger.v3.oas.annotations.media.Schema;
4 9 import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7 10 import org.springframework.format.annotation.DateTimeFormat;
8 11  
9 12 import java.time.LocalDateTime;
... ... @@ -12,45 +15,121 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
12 15  
13 16 @Schema(description = "管理后台 - CRM 客户 Response VO")
14 17 @Data
15   -@EqualsAndHashCode(callSuper = true)
16   -@ToString(callSuper = true)
17   -public class CrmCustomerRespVO extends CrmCustomerBaseVO {
  18 +@ExcelIgnoreUnannotated
  19 +public class CrmCustomerRespVO {
18 20  
19 21 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  22 + @ExcelProperty("编号")
20 23 private Long id;
21 24  
22   - @Schema(description = "跟进状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
  25 + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  26 + @ExcelProperty("客户名称")
  27 + private String name;
  28 +
  29 + @Schema(description = "跟进状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  30 + @ExcelProperty(value = "跟进状态", converter = DictConvert.class)
  31 + @DictFormat(DictTypeConstants.BOOLEAN_STRING)
23 32 private Boolean followUpStatus;
24 33  
25   - @Schema(description = "锁定状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
  34 + @Schema(description = "锁定状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  35 + @ExcelProperty(value = "锁定状态", converter = DictConvert.class)
  36 + @DictFormat(DictTypeConstants.BOOLEAN_STRING)
26 37 private Boolean lockStatus;
27 38  
28   - @Schema(description = "成交状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
  39 + @Schema(description = "成交状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  40 + @ExcelProperty(value = "成交状态", converter = DictConvert.class)
  41 + @DictFormat(DictTypeConstants.BOOLEAN_STRING)
29 42 private Boolean dealStatus;
30 43  
  44 + @Schema(description = "所属行业", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  45 + @ExcelProperty(value = "所属行业", converter = DictConvert.class)
  46 + @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY)
  47 + private Integer industryId;
  48 +
  49 + @Schema(description = "客户等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  50 + @ExcelProperty(value = "客户等级", converter = DictConvert.class)
  51 + @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_LEVEL)
  52 + private Integer level;
  53 +
  54 + @Schema(description = "客户来源", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  55 + @ExcelProperty(value = "客户来源", converter = DictConvert.class)
  56 + @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_SOURCE)
  57 + private Integer source;
  58 +
  59 + @Schema(description = "负责人的用户编号", example = "25682")
  60 + @ExcelProperty("手机")
  61 + private String mobile;
  62 +
31 63 @Schema(description = "负责人的用户编号", example = "25682")
  64 + @ExcelProperty("电话")
  65 + private String telephone;
  66 +
  67 + @Schema(description = "负责人的用户编号", example = "25682")
  68 + @ExcelProperty("网址")
  69 + private String website;
  70 +
  71 + @Schema(description = "负责人的用户编号", example = "25682")
  72 + @ExcelProperty("QQ")
  73 + private String qq;
  74 +
  75 + @Schema(description = "负责人的用户编号", example = "25682")
  76 + @ExcelProperty("wechat")
  77 + private String wechat;
  78 +
  79 + @Schema(description = "负责人的用户编号", example = "25682")
  80 + @ExcelProperty("email")
  81 + private String email;
  82 +
  83 + @Schema(description = "负责人的用户编号", example = "25682")
  84 + @ExcelProperty("客户描述")
  85 + private String description;
  86 +
  87 + @Schema(description = "负责人的用户编号", example = "25682")
  88 + @ExcelProperty("备注")
  89 + private String remark;
  90 +
  91 + @Schema(description = "负责人的用户编号", example = "25682")
  92 + @ExcelProperty("负责人的用户编号")
32 93 private Long ownerUserId;
33 94 @Schema(description = "负责人名字", example = "25682")
  95 + @ExcelProperty("负责人名字")
34 96 private String ownerUserName;
35 97 @Schema(description = "负责人部门")
  98 + @ExcelProperty("负责人部门")
36 99 private String ownerUserDeptName;
37 100  
  101 + @Schema(description = "地区编号", example = "1024")
  102 + @ExcelProperty("地区编号")
  103 + private Integer areaId;
38 104 @Schema(description = "地区名称", example = "北京市")
  105 + @ExcelProperty("地区名称")
39 106 private String areaName;
  107 + @Schema(description = "详细地址", example = "北京市成华大道")
  108 + @ExcelProperty("详细地址")
  109 + private String detailAddress;
40 110  
41 111 @Schema(description = "最后跟进时间")
  112 + @ExcelProperty("最后跟进时间")
42 113 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
43 114 private LocalDateTime contactLastTime;
44 115  
  116 + @Schema(description = "下次联系时间")
  117 + @ExcelProperty("下次联系时间")
  118 + private LocalDateTime contactNextTime;
  119 +
45 120 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  121 + @ExcelProperty("创建时间")
46 122 private LocalDateTime createTime;
47 123  
48 124 @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
  125 + @ExcelProperty("更新时间")
49 126 private LocalDateTime updateTime;
50 127  
51   - @Schema(description = "创建人")
  128 + @Schema(description = "创建人", example = "1024")
  129 + @ExcelProperty("创建人")
52 130 private String creator;
53   - @Schema(description = "创建人名字")
  131 + @Schema(description = "创建人名字", example = "芋道源码")
  132 + @ExcelProperty("创建人名字")
54 133 private String creatorName;
55 134  
56 135 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerBaseVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerSaveReqVO.java
... ... @@ -18,12 +18,12 @@ import java.time.LocalDateTime;
18 18 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
19 19 import static cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY;
20 20  
21   -/**
22   - * 客户 Base VO,提供给添加、修改、详细的子 VO 使用
23   - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
24   - */
  21 +@Schema(description = "管理后台 - CRM 客户新增/修改 Request VO")
25 22 @Data
26   -public class CrmCustomerBaseVO {
  23 +public class CrmCustomerSaveReqVO {
  24 +
  25 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  26 + private Long id;
27 27  
28 28 @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
29 29 @DiffLogField(name = "客户名称")
... ... @@ -96,4 +96,7 @@ public class CrmCustomerBaseVO {
96 96 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
97 97 private LocalDateTime contactNextTime;
98 98  
  99 + @Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  100 + private Long ownerUserId;
  101 +
99 102 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerUpdateReqVO.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.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7   -
8   -import jakarta.validation.constraints.NotNull;
9   -
10   -@Schema(description = "管理后台 - CRM 客户更新 Request VO")
11   -@Data
12   -@EqualsAndHashCode(callSuper = true)
13   -@ToString(callSuper = true)
14   -public class CrmCustomerUpdateReqVO extends CrmCustomerBaseVO {
15   -
16   - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
17   - @NotNull(message = "编号不能为空")
18   - private Long id;
19   -
20   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java
... ... @@ -2,7 +2,9 @@ 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.ip.core.utils.AreaUtils;
5   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerRespVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO;
6 8 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO;
7 9 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO;
8 10 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
... ... @@ -29,9 +31,7 @@ public interface CrmCustomerConvert {
29 31  
30 32 CrmCustomerConvert INSTANCE = Mappers.getMapper(CrmCustomerConvert.class);
31 33  
32   - CrmCustomerDO convert(CrmCustomerCreateReqVO bean);
33   -
34   - CrmCustomerDO convert(CrmCustomerUpdateReqVO bean);
  34 + CrmCustomerDO convert(CrmCustomerSaveReqVO bean);
35 35  
36 36 CrmCustomerRespVO convert(CrmCustomerDO bean);
37 37  
... ... @@ -51,7 +51,7 @@ public interface CrmCustomerConvert {
51 51 findAndThen(userMap, Long.parseLong(customer.getCreator()), user -> customer.setCreatorName(user.getNickname()));
52 52 }
53 53  
54   - List<CrmCustomerExcelVO> convertList02(List<CrmCustomerDO> list);
  54 + List<CrmCustomerRespVO> convertList02(List<CrmCustomerDO> list);
55 55  
56 56 @Mapping(target = "bizId", source = "reqVO.id")
57 57 CrmPermissionTransferReqBO convert(CrmCustomerTransferReqVO reqVO, Long userId);
... ... @@ -76,6 +76,4 @@ public interface CrmCustomerConvert {
76 76  
77 77 CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO);
78 78  
79   - List<CrmCustomerQueryAllRespVO> convertQueryAll(List<CrmCustomerDO> crmCustomerDO);
80   -
81 79 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java
1 1 package cn.iocoder.yudao.module.crm.service.customer;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLockReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO;
5 8 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
6 9 import jakarta.validation.Valid;
7 10  
... ... @@ -22,14 +25,14 @@ public interface CrmCustomerService {
22 25 * @param userId 用户编号
23 26 * @return 编号
24 27 */
25   - Long createCustomer(@Valid CrmCustomerCreateReqVO createReqVO, Long userId);
  28 + Long createCustomer(@Valid CrmCustomerSaveReqVO createReqVO, Long userId);
26 29  
27 30 /**
28 31 * 更新客户
29 32 *
30 33 * @param updateReqVO 更新信息
31 34 */
32   - void updateCustomer(@Valid CrmCustomerUpdateReqVO updateReqVO);
  35 + void updateCustomer(@Valid CrmCustomerSaveReqVO updateReqVO);
33 36  
34 37 /**
35 38 * 删除客户
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
1 1 package cn.iocoder.yudao.module.crm.service.customer;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
6 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*;
  8 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLockReqVO;
  9 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO;
  10 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO;
  11 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO;
8 12 import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert;
9 13 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
10 14 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO;
... ... @@ -24,7 +28,10 @@ import org.springframework.transaction.annotation.Transactional;
24 28 import org.springframework.validation.annotation.Validated;
25 29  
26 30 import java.time.LocalDateTime;
27   -import java.util.*;
  31 +import java.util.ArrayList;
  32 +import java.util.Collection;
  33 +import java.util.Collections;
  34 +import java.util.List;
28 35  
29 36 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
30 37 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
... ... @@ -56,8 +63,10 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
56 63  
57 64 @Override
58 65 @Transactional(rollbackFor = Exception.class)
59   - @LogRecord(type = CRM_CUSTOMER, subType = "创建客户", bizNo = "{{#customerId}}", success = "创建了客户") // TODO @puhui999:创建了客户【客户名】,要记录进去;不然在展示操作日志的全列表,看不清楚是哪个客户哈;
60   - public Long createCustomer(CrmCustomerCreateReqVO createReqVO, Long userId) {
  66 + @LogRecord(type = CRM_CUSTOMER, subType = "创建客户", bizNo = "{{#customerId}}", success = "创建了客户")
  67 + // TODO @puhui999:创建了客户【客户名】,要记录进去;不然在展示操作日志的全列表,看不清楚是哪个客户哈;
  68 + public Long createCustomer(CrmCustomerSaveReqVO createReqVO, Long userId) {
  69 + createReqVO.setId(null);
61 70 // 1. 校验拥有客户是否到达上限
62 71 validateCustomerExceedOwnerLimit(createReqVO.getOwnerUserId(), 1);
63 72  
... ... @@ -81,8 +90,10 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
81 90 @Transactional(rollbackFor = Exception.class)
82 91 @LogRecord(type = CRM_CUSTOMER, subType = "更新客户", bizNo = "{{#updateReqVO.id}}", success = "更新了客户{_DIFF{#updateReqVO}}", extra = "{{#extra}}")
83 92 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE)
84   - public void updateCustomer(CrmCustomerUpdateReqVO updateReqVO) {
85   - // TODO @puhui999:更新的时候,要把 updateReqVO 负责人设置为空,避免修改。
  93 + public void updateCustomer(CrmCustomerSaveReqVO updateReqVO) {
  94 + Assert.notNull(updateReqVO.getId(), "客户编号不能为空");
  95 + // 更新的时候,要把 updateReqVO 负责人设置为空,避免修改。
  96 + updateReqVO.setOwnerUserId(null);
86 97 // 1. 校验存在
87 98 CrmCustomerDO oldCustomer = validateCustomerExists(updateReqVO.getId());
88 99  
... ... @@ -91,11 +102,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
91 102 customerMapper.updateById(updateObj);
92 103  
93 104 // 3. 记录操作日志
94   - LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldCustomer, CrmCustomerUpdateReqVO.class));
95   - // TODO 扩展信息测试 @puhui999:看着没啥问题,可以删除啦;
96   - HashMap<String, Object> extra = new HashMap<>();
97   - extra.put("tips", "随便记录一点啦");
98   - LogRecordContext.putVariable("extra", extra);
  105 + LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldCustomer, CrmCustomerSaveReqVO.class));
99 106 }
100 107  
101 108 @Override
... ... @@ -197,7 +204,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
197 204 /**
198 205 * 校验用户拥有的客户数量,是否到达上限
199 206 *
200   - * @param userId 用户编号
  207 + * @param userId 用户编号
201 208 * @param newCount 附加数量
202 209 */
203 210 private void validateCustomerExceedOwnerLimit(Long userId, int newCount) {
... ... @@ -237,7 +244,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
237 244  
238 245 @Override
239 246 @Transactional(rollbackFor = Exception.class)
240   - @LogRecord(type = CRM_CUSTOMER, subType = "客户放入公海", bizNo = "{{#id}}", success = "将客户放入了公海") // TODO @puhui999:将客户【】放入了公海
  247 + @LogRecord(type = CRM_CUSTOMER, subType = "客户放入公海", bizNo = "{{#id}}", success = "将客户放入了公海")
  248 + // TODO @puhui999:将客户【】放入了公海
241 249 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
242 250 public void putCustomerPool(Long id) {
243 251 // 1. 校验存在
... ...
yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java
... ... @@ -2,19 +2,17 @@ package cn.iocoder.yudao.module.crm.service.customer;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
5   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerCreateReqVO;
6 5 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO;
7   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdateReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO;
8 7 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
9 8 import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper;
10 9 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
  10 +import jakarta.annotation.Resource;
11 11 import org.junit.jupiter.api.Disabled;
12 12 import org.junit.jupiter.api.Test;
13 13 import org.springframework.boot.test.mock.mockito.MockBean;
14 14 import org.springframework.context.annotation.Import;
15 15  
16   -import jakarta.annotation.Resource;
17   -
18 16 import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE;
19 17 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
20 18 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
... ... @@ -47,7 +45,7 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest {
47 45 @Test
48 46 public void testCreateCustomer_success() {
49 47 // 准备参数
50   - CrmCustomerCreateReqVO reqVO = randomPojo(CrmCustomerCreateReqVO.class);
  48 + CrmCustomerSaveReqVO reqVO = randomPojo(CrmCustomerSaveReqVO.class);
51 49  
52 50 // 调用
53 51 Long customerId = customerService.createCustomer(reqVO, getLoginUserId());
... ... @@ -64,7 +62,7 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest {
64 62 CrmCustomerDO dbCustomer = randomPojo(CrmCustomerDO.class);
65 63 customerMapper.insert(dbCustomer);// @Sql: 先插入出一条存在的数据
66 64 // 准备参数
67   - CrmCustomerUpdateReqVO reqVO = randomPojo(CrmCustomerUpdateReqVO.class, o -> {
  65 + CrmCustomerSaveReqVO reqVO = randomPojo(CrmCustomerSaveReqVO.class, o -> {
68 66 o.setId(dbCustomer.getId()); // 设置更新的 ID
69 67 });
70 68  
... ... @@ -78,7 +76,7 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest {
78 76 @Test
79 77 public void testUpdateCustomer_notExists() {
80 78 // 准备参数
81   - CrmCustomerUpdateReqVO reqVO = randomPojo(CrmCustomerUpdateReqVO.class);
  79 + CrmCustomerSaveReqVO reqVO = randomPojo(CrmCustomerSaveReqVO.class);
82 80  
83 81 // 调用, 并断言异常
84 82 assertServiceException(() -> customerService.updateCustomer(reqVO), CUSTOMER_NOT_EXISTS);
... ...