Commit 966690125bfcbdb8b99de5d5b2150e94d2ad82e1

Authored by YunaiV
1 parent bf8bfef8

crm:code review 联系人

sql/mysql/crm.sql
1 -SET NAMES utf8mb4;  
2 -  
3 -CREATE TABLE `crm_contact` (  
4 - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',  
5 - `name` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人名称',  
6 - `next_time` datetime DEFAULT NULL COMMENT '下次联系时间',  
7 - `mobile` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号',  
8 - `telephone` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电话',  
9 - `email` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电子邮箱',  
10 - `post` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '职务',  
11 - `customer_id` bigint(20) DEFAULT NULL COMMENT '客户编号',  
12 - `address` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '地址',  
13 - `remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',  
14 - `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人',  
15 - `owner_user_id` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '负责人用户编号',  
16 - `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',  
17 - `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',  
18 - `last_time` timestamp NULL DEFAULT NULL COMMENT '最后跟进时间',  
19 - `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人',  
20 - `deleted` bit(1) NOT NULL DEFAULT b'0',  
21 - `tenant_id` bigint(20) DEFAULT NULL,  
22 - `parent_id` bigint(20) DEFAULT NULL COMMENT '直系上属',  
23 - `qq` int(11) DEFAULT NULL,  
24 - `webchat` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL,  
25 - `sex` int(1) DEFAULT NULL COMMENT '性别',  
26 - `policy_makers` bit(1) DEFAULT NULL COMMENT '是否关键决策人',  
27 - PRIMARY KEY (`id`) USING BTREE  
28 -) ENGINE=InnoDB AUAUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='crm联系人';  
29 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java
@@ -2,42 +2,41 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact; @@ -2,42 +2,41 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.NumberUtil; 4 import cn.hutool.core.util.NumberUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  8 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
  9 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
5 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerExportReqVO; 10 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerExportReqVO;
  11 +import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert;
  12 +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
6 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; 13 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
  14 +import cn.iocoder.yudao.module.crm.service.contact.ContactService;
7 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; 15 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
8 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 16 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
9 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 17 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
10 import com.google.common.collect.Lists; 18 import com.google.common.collect.Lists;
11 -import org.springframework.web.bind.annotation.*;  
12 -import javax.annotation.Resource;  
13 -import org.springframework.validation.annotation.Validated;  
14 -import org.springframework.security.access.prepost.PreAuthorize;  
15 -import io.swagger.v3.oas.annotations.tags.Tag;  
16 -import io.swagger.v3.oas.annotations.Parameter;  
17 import io.swagger.v3.oas.annotations.Operation; 19 import io.swagger.v3.oas.annotations.Operation;
  20 +import io.swagger.v3.oas.annotations.Parameter;
  21 +import io.swagger.v3.oas.annotations.tags.Tag;
  22 +import org.springframework.security.access.prepost.PreAuthorize;
  23 +import org.springframework.validation.annotation.Validated;
  24 +import org.springframework.web.bind.annotation.*;
18 25
19 -import javax.validation.constraints.*;  
20 -import javax.validation.*;  
21 -import javax.servlet.http.*;  
22 -import java.util.*; 26 +import javax.annotation.Resource;
  27 +import javax.servlet.http.HttpServletResponse;
  28 +import javax.validation.Valid;
23 import java.io.IOException; 29 import java.io.IOException;
  30 +import java.util.List;
  31 +import java.util.Map;
  32 +import java.util.Optional;
24 import java.util.stream.Collectors; 33 import java.util.stream.Collectors;
25 34
26 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
27 -import cn.iocoder.yudao.framework.common.pojo.CommonResult;  
28 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 35 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  36 +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
29 37
30 -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;  
31 -  
32 -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;  
33 -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;  
34 -  
35 -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;  
36 -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;  
37 -import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert;  
38 -import cn.iocoder.yudao.module.crm.service.contact.ContactService;  
39 -  
40 -@Tag(name = "管理后台 - crm联系人") 38 +// TODO @zya:crm 所有的类,dou带 Crm 前缀,因为它的名字太通用了,可能和后续的 erp 之类的冲突
  39 +@Tag(name = "管理后台 - CRM 联系人")
41 @RestController 40 @RestController
42 @RequestMapping("/crm/contact") 41 @RequestMapping("/crm/contact")
43 @Validated 42 @Validated
@@ -45,20 +44,22 @@ public class ContactController { @@ -45,20 +44,22 @@ public class ContactController {
45 44
46 @Resource 45 @Resource
47 private ContactService contactService; 46 private ContactService contactService;
48 - @Resource  
49 - private AdminUserApi adminUserApi; 47 + // TODO @zyna:模块内,注入的变量,不用带 crm 前缀哈
50 @Resource 48 @Resource
51 private CrmCustomerService crmCustomerService; 49 private CrmCustomerService crmCustomerService;
52 50
  51 + @Resource
  52 + private AdminUserApi adminUserApi;
  53 +
53 @PostMapping("/create") 54 @PostMapping("/create")
54 - @Operation(summary = "创建crm联系人") 55 + @Operation(summary = "创建联系人")
55 @PreAuthorize("@ss.hasPermission('crm:contact:create')") 56 @PreAuthorize("@ss.hasPermission('crm:contact:create')")
56 public CommonResult<Long> createContact(@Valid @RequestBody ContactCreateReqVO createReqVO) { 57 public CommonResult<Long> createContact(@Valid @RequestBody ContactCreateReqVO createReqVO) {
57 return success(contactService.createContact(createReqVO)); 58 return success(contactService.createContact(createReqVO));
58 } 59 }
59 60
60 @PutMapping("/update") 61 @PutMapping("/update")
61 - @Operation(summary = "更新crm联系人") 62 + @Operation(summary = "更新联系人")
62 @PreAuthorize("@ss.hasPermission('crm:contact:update')") 63 @PreAuthorize("@ss.hasPermission('crm:contact:update')")
63 public CommonResult<Boolean> updateContact(@Valid @RequestBody ContactUpdateReqVO updateReqVO) { 64 public CommonResult<Boolean> updateContact(@Valid @RequestBody ContactUpdateReqVO updateReqVO) {
64 contactService.updateContact(updateReqVO); 65 contactService.updateContact(updateReqVO);
@@ -66,7 +67,7 @@ public class ContactController { @@ -66,7 +67,7 @@ public class ContactController {
66 } 67 }
67 68
68 @DeleteMapping("/delete") 69 @DeleteMapping("/delete")
69 - @Operation(summary = "删除crm联系人") 70 + @Operation(summary = "删除联系人")
70 @Parameter(name = "id", description = "编号", required = true) 71 @Parameter(name = "id", description = "编号", required = true)
71 @PreAuthorize("@ss.hasPermission('crm:contact:delete')") 72 @PreAuthorize("@ss.hasPermission('crm:contact:delete')")
72 public CommonResult<Boolean> deleteContact(@RequestParam("id") Long id) { 73 public CommonResult<Boolean> deleteContact(@RequestParam("id") Long id) {
@@ -75,12 +76,14 @@ public class ContactController { @@ -75,12 +76,14 @@ public class ContactController {
75 } 76 }
76 77
77 @GetMapping("/get") 78 @GetMapping("/get")
78 - @Operation(summary = "获得crm联系人") 79 + @Operation(summary = "获得联系人")
79 @Parameter(name = "id", description = "编号", required = true, example = "1024") 80 @Parameter(name = "id", description = "编号", required = true, example = "1024")
80 @PreAuthorize("@ss.hasPermission('crm:contact:query')") 81 @PreAuthorize("@ss.hasPermission('crm:contact:query')")
81 public CommonResult<ContactRespVO> getContact(@RequestParam("id") Long id) { 82 public CommonResult<ContactRespVO> getContact(@RequestParam("id") Long id) {
82 ContactDO contact = contactService.getContact(id); 83 ContactDO contact = contactService.getContact(id);
  84 + // TODO @zyna:需要考虑 null 的情况;
83 ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact); 85 ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact);
  86 + // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑
84 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList( 87 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList(
85 NumberUtil.parseLong(contact.getCreator())))); 88 NumberUtil.parseLong(contact.getCreator()))));
86 contactRespVO.setCreatorName(Optional.ofNullable(userMap.get(NumberUtil.parseLong(contact.getCreator()))).map(AdminUserRespDTO::getNickname).orElse(null)); 89 contactRespVO.setCreatorName(Optional.ofNullable(userMap.get(NumberUtil.parseLong(contact.getCreator()))).map(AdminUserRespDTO::getNickname).orElse(null));
@@ -88,27 +91,24 @@ public class ContactController { @@ -88,27 +91,24 @@ public class ContactController {
88 return success(contactRespVO); 91 return success(contactRespVO);
89 } 92 }
90 93
91 - @GetMapping("/list")  
92 - @Operation(summary = "获得crm联系人列表")  
93 - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")  
94 - @PreAuthorize("@ss.hasPermission('crm:contact:query')")  
95 - public CommonResult<List<ContactRespVO>> getContactList(@RequestParam("ids") Collection<Long> ids) {  
96 - List<ContactDO> list = contactService.getContactList(ids);  
97 - return success(ContactConvert.INSTANCE.convertList(list));  
98 - } 94 + // TODO @zyna:url 使用中划线噢;然后,单词的拼写也要注意呀,AllList 是不是更好呀;
99 @GetMapping("/simpleAlllist") 95 @GetMapping("/simpleAlllist")
100 - @Operation(summary = "获得crm联系人列表") 96 + @Operation(summary = "获得联系人列表")
101 @PreAuthorize("@ss.hasPermission('crm:contact:query')") 97 @PreAuthorize("@ss.hasPermission('crm:contact:query')")
102 public CommonResult<List<ContactSimpleRespVO>> simpleAlllist() { 98 public CommonResult<List<ContactSimpleRespVO>> simpleAlllist() {
  99 + // TODO @zyna:方法名改成,getContactList;方法命名,要动名词,get 动词;all 可以去掉,因为没条件,自然是全部
103 List<ContactDO> list = contactService.allContactList(); 100 List<ContactDO> list = contactService.allContactList();
104 return success(ContactConvert.INSTANCE.convertAllList(list)); 101 return success(ContactConvert.INSTANCE.convertAllList(list));
105 } 102 }
  103 +
106 @GetMapping("/page") 104 @GetMapping("/page")
107 - @Operation(summary = "获得crm联系人分页") 105 + @Operation(summary = "获得联系人分页")
108 @PreAuthorize("@ss.hasPermission('crm:contact:query')") 106 @PreAuthorize("@ss.hasPermission('crm:contact:query')")
109 public CommonResult<PageResult<ContactRespVO>> getContactPage(@Valid ContactPageReqVO pageVO) { 107 public CommonResult<PageResult<ContactRespVO>> getContactPage(@Valid ContactPageReqVO pageVO) {
110 PageResult<ContactDO> pageData = contactService.getContactPage(pageVO); 108 PageResult<ContactDO> pageData = contactService.getContactPage(pageVO);
111 PageResult<ContactRespVO> pageResult =ContactConvert.INSTANCE.convertPage(pageData); 109 PageResult<ContactRespVO> pageResult =ContactConvert.INSTANCE.convertPage(pageData);
  110 + // TODO @zyna:需要考虑 null 的情况;
  111 + // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑
112 //待接口实现后修改 112 //待接口实现后修改
113 List<CrmCustomerDO> crmCustomerDOList = crmCustomerService.getCustomerList(new CrmCustomerExportReqVO()); 113 List<CrmCustomerDO> crmCustomerDOList = crmCustomerService.getCustomerList(new CrmCustomerExportReqVO());
114 Map<Long,CrmCustomerDO> crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); 114 Map<Long,CrmCustomerDO> crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v));
@@ -118,8 +118,9 @@ public class ContactController { @@ -118,8 +118,9 @@ public class ContactController {
118 return success(pageResult); 118 return success(pageResult);
119 } 119 }
120 120
  121 + // TODO @zyna:可以看下新的导出写法,这里调整下
121 @GetMapping("/export-excel") 122 @GetMapping("/export-excel")
122 - @Operation(summary = "导出crm联系人 Excel") 123 + @Operation(summary = "导出联系人 Excel")
123 @PreAuthorize("@ss.hasPermission('crm:contact:export')") 124 @PreAuthorize("@ss.hasPermission('crm:contact:export')")
124 @OperateLog(type = EXPORT) 125 @OperateLog(type = EXPORT)
125 public void exportContactExcel(@Valid ContactExportReqVO exportReqVO, 126 public void exportContactExcel(@Valid ContactExportReqVO exportReqVO,
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.*; 4 +import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
5 6
6 -import java.time.LocalDate;  
7 -import java.util.*;  
8 -import java.time.LocalDateTime;  
9 -import java.time.LocalDateTime;  
10 import java.time.LocalDateTime; 7 import java.time.LocalDateTime;
11 -import javax.validation.constraints.*;  
12 -import org.springframework.format.annotation.DateTimeFormat;  
13 8
14 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; 9 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
15 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 10 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
16 11
  12 +// TODO zyna:参考新的 vo,重新拆分下 VO
17 /** 13 /**
18 - * crm联系人 Base VO,提供给添加、修改、详细的子 VO 使用 14 + * CRM 联系人 Base VO,提供给添加、修改、详细的子 VO 使用
19 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 15 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
20 */ 16 */
21 @Data 17 @Data
22 public class ContactBaseVO { 18 public class ContactBaseVO {
23 19
  20 + // TODO @zyna:example 最好都写下
  21 + // TODO @zyna:必要的字段校验,例如说 @Mobile,@Emal 等等
  22 +
24 @Schema(description = "下次联系时间") 23 @Schema(description = "下次联系时间")
25 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) 24 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
26 private LocalDateTime nextTime; 25 private LocalDateTime nextTime;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactCreateReqVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2
3 -import lombok.*;  
4 -import java.util.*;  
5 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
6 -import javax.validation.constraints.*; 4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
7 7
8 -@Schema(description = "管理后台 - crm联系人创建 Request VO") 8 +@Schema(description = "管理后台 - CRM 联系人创建 Request VO")
9 @Data 9 @Data
10 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
11 @ToString(callSuper = true) 11 @ToString(callSuper = true)
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.*; 3 +import com.alibaba.excel.annotation.ExcelProperty;
  4 +import lombok.Data;
5 5
6 -import java.time.LocalDate;  
7 -import java.util.*;  
8 -import java.time.LocalDateTime;  
9 -import java.time.LocalDateTime;  
10 import java.time.LocalDateTime; 6 import java.time.LocalDateTime;
11 7
12 -import com.alibaba.excel.annotation.ExcelProperty;  
13 - 8 +// TODO @zyna:参考新的 VO 结构,把 ContactExcelVO 融合到 ContactRespVO 中
14 /** 9 /**
15 * crm联系人 Excel VO 10 * crm联系人 Excel VO
16 * 11 *
17 * @author 芋道源码 12 * @author 芋道源码
18 */ 13 */
19 @Data 14 @Data
  15 +@Deprecated
20 public class ContactExcelVO { 16 public class ContactExcelVO {
21 17
22 @ExcelProperty("下次联系时间") 18 @ExcelProperty("下次联系时间")
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2
3 -import lombok.*;  
4 -  
5 -import java.time.LocalDate;  
6 -import java.util.*;  
7 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
8 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
9 -import java.time.LocalDateTime; 4 +import lombok.Data;
10 import org.springframework.format.annotation.DateTimeFormat; 5 import org.springframework.format.annotation.DateTimeFormat;
11 6
  7 +import java.time.LocalDateTime;
  8 +
12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 9 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 10
  11 +// TODO @zyna:参考新的 VO 结构,使用 ContactPageReqVO 查询导出的数据
14 @Schema(description = "管理后台 - crm联系人 Excel 导出 Request VO,参数和 ContactPageReqVO 是一致的") 12 @Schema(description = "管理后台 - crm联系人 Excel 导出 Request VO,参数和 ContactPageReqVO 是一致的")
15 @Data 13 @Data
  14 +@Deprecated
16 public class ContactExportReqVO { 15 public class ContactExportReqVO {
17 16
18 @Schema(description = "下次联系时间") 17 @Schema(description = "下次联系时间")
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2
3 -import lombok.*;  
4 -  
5 -import java.time.LocalDate;  
6 -import java.util.*;  
7 -import io.swagger.v3.oas.annotations.media.Schema;  
8 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
9 import org.springframework.format.annotation.DateTimeFormat; 8 import org.springframework.format.annotation.DateTimeFormat;
  9 +
10 import java.time.LocalDateTime; 10 import java.time.LocalDateTime;
11 11
12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -17,6 +17,11 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -17,6 +17,11 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
17 @ToString(callSuper = true) 17 @ToString(callSuper = true)
18 public class ContactPageReqVO extends PageParam { 18 public class ContactPageReqVO extends PageParam {
19 19
  20 + // TODO @zyna:筛选条件
  21 + // ●客户:
  22 + // ●姓名:
  23 + // ●手机、电话、座机、QQ、微信、邮箱
  24 +
20 @Schema(description = "下次联系时间") 25 @Schema(description = "下次联系时间")
21 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 26 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
22 private LocalDateTime[] nextTime; 27 private LocalDateTime[] nextTime;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java
@@ -4,19 +4,24 @@ import io.swagger.v3.oas.annotations.media.Schema; @@ -4,19 +4,24 @@ import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.*; 4 import lombok.*;
5 import java.time.LocalDateTime; 5 import java.time.LocalDateTime;
6 6
7 -@Schema(description = "管理后台 - crm联系人 Response VO") 7 +@Schema(description = "管理后台 - CRM 联系人 Response VO")
8 @Data 8 @Data
9 @EqualsAndHashCode(callSuper = true) 9 @EqualsAndHashCode(callSuper = true)
10 @ToString(callSuper = true) 10 @ToString(callSuper = true)
11 public class ContactRespVO extends ContactBaseVO { 11 public class ContactRespVO extends ContactBaseVO {
12 12
  13 + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167")
  14 + private Long id;
  15 +
13 @Schema(description = "创建时间") 16 @Schema(description = "创建时间")
14 private LocalDateTime createTime; 17 private LocalDateTime createTime;
  18 +
  19 + // TODO @zyna:example 最好写下;
  20 +
15 @Schema(description = "创建人") 21 @Schema(description = "创建人")
16 private String creatorName; 22 private String creatorName;
17 - @Schema(description = "客户") 23 +
  24 + @Schema(description = "客户名字")
18 private String customerName; 25 private String customerName;
19 - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167")  
20 - private Long id;  
21 26
22 } 27 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java
@@ -2,16 +2,13 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; @@ -2,16 +2,13 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 -import lombok.EqualsAndHashCode;  
6 import lombok.ToString; 5 import lombok.ToString;
7 6
8 -import java.time.LocalDateTime;  
9 -  
10 -@Schema(description = "管理后台 - crm联系人 Response VO") 7 +@Schema(description = "管理后台 - CRM 联系人 Response VO")
11 @Data 8 @Data
12 @ToString(callSuper = true) 9 @ToString(callSuper = true)
13 public class ContactSimpleRespVO { 10 public class ContactSimpleRespVO {
14 - @Schema(description = "姓名", example = "芋艿") 11 + @Schema(description = "姓名", example = "芋艿") // TODO @zyna:requiredMode = Schema.RequiredMode.REQUIRED;需要空一行;字段的顺序改下,id 在 name 前面,会更干净
15 private String name; 12 private String name;
16 13
17 @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") 14 @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167")
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactUpdateReqVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.*;  
5 -import java.util.*;  
6 -import javax.validation.constraints.*; 4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
7 7
8 -@Schema(description = "管理后台 - crm联系人更新 Request VO") 8 +import javax.validation.constraints.NotNull;
  9 +
  10 +@Schema(description = "管理后台 - CRM 联系人更新 Request VO")
9 @Data 11 @Data
10 @EqualsAndHashCode(callSuper = true) 12 @EqualsAndHashCode(callSuper = true)
11 @ToString(callSuper = true) 13 @ToString(callSuper = true)
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java
1 package cn.iocoder.yudao.module.crm.dal.dataobject.contact; 1 package cn.iocoder.yudao.module.crm.dal.dataobject.contact;
2 2
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import com.baomidou.mybatisplus.annotation.KeySequence;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
3 import lombok.*; 7 import lombok.*;
4 8
5 -import java.time.LocalDate;  
6 -import java.util.*;  
7 -import java.time.LocalDateTime;  
8 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
9 -import java.time.LocalDateTime;  
10 -import com.baomidou.mybatisplus.annotation.*;  
11 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;  
12 10
13 /** 11 /**
14 - * crm联系人 DO 12 + * CRM 联系人 DO
15 * 13 *
16 * @author 芋道源码 14 * @author 芋道源码
17 */ 15 */
@@ -25,6 +23,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -25,6 +23,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
25 @AllArgsConstructor 23 @AllArgsConstructor
26 public class ContactDO extends BaseDO { 24 public class ContactDO extends BaseDO {
27 25
  26 + // TODO @zyna:这个字段的顺序,是不是整理下;
28 /** 27 /**
29 * 下次联系时间 28 * 下次联系时间
30 */ 29 */
@@ -57,11 +56,13 @@ public class ContactDO extends BaseDO { @@ -57,11 +56,13 @@ public class ContactDO extends BaseDO {
57 * 最后跟进时间 56 * 最后跟进时间
58 */ 57 */
59 private LocalDateTime lastTime; 58 private LocalDateTime lastTime;
  59 + // TODO @zyna:这个放在最前面吧
60 /** 60 /**
61 * 主键 61 * 主键
62 */ 62 */
63 @TableId 63 @TableId
64 private Long id; 64 private Long id;
  65 + // TODO @zyna:直接上级,最好写下它关联的字段,例如说这个,应该关联 ContactDO 的 id 字段
65 /** 66 /**
66 * 直属上级 67 * 直属上级
67 */ 68 */
@@ -78,18 +79,22 @@ public class ContactDO extends BaseDO { @@ -78,18 +79,22 @@ public class ContactDO extends BaseDO {
78 * QQ 79 * QQ
79 */ 80 */
80 private Long qq; 81 private Long qq;
  82 + // TODO @zyna:wechat
81 /** 83 /**
82 * 微信 84 * 微信
83 */ 85 */
84 private String webchat; 86 private String webchat;
  87 + // TODO @zyna:关联的枚举
85 /** 88 /**
86 * 性别 89 * 性别
87 */ 90 */
88 private Integer sex; 91 private Integer sex;
  92 + // TODO @zyna:这个字段改成 master 哈;
89 /** 93 /**
90 * 是否关键决策人 94 * 是否关键决策人
91 */ 95 */
92 private Boolean policyMakers; 96 private Boolean policyMakers;
  97 + // TODO @zyna:应该是 Long
93 /** 98 /**
94 * 负责人用户编号 99 * 负责人用户编号
95 */ 100 */
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java
1 package cn.iocoder.yudao.module.crm.service.contact; 1 package cn.iocoder.yudao.module.crm.service.contact;
2 2
3 -import org.springframework.stereotype.Service;  
4 -import javax.annotation.Resource;  
5 -import org.springframework.validation.annotation.Validated;  
6 -  
7 -import java.util.*;  
8 -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;  
9 -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; 3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.collection.ListUtil;
10 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
11 - 6 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactCreateReqVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactExportReqVO;
  8 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactPageReqVO;
  9 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactUpdateReqVO;
12 import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; 10 import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert;
  11 +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
13 import cn.iocoder.yudao.module.crm.dal.mysql.contact.ContactMapper; 12 import cn.iocoder.yudao.module.crm.dal.mysql.contact.ContactMapper;
  13 +import org.springframework.stereotype.Service;
  14 +import org.springframework.validation.annotation.Validated;
14 15
15 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
16 -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; 16 +import javax.annotation.Resource;
  17 +import java.util.Collection;
  18 +import java.util.List;
17 19
18 -import cn.hutool.core.collection.CollUtil;  
19 -import cn.hutool.core.collection.ListUtil; 20 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  21 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTACT_NOT_EXISTS;
20 22
21 /** 23 /**
22 * crm联系人 Service 实现类 24 * crm联系人 Service 实现类
@@ -30,7 +32,7 @@ public class ContactServiceImpl implements ContactService { @@ -30,7 +32,7 @@ public class ContactServiceImpl implements ContactService {
30 @Resource 32 @Resource
31 private ContactMapper contactMapper; 33 private ContactMapper contactMapper;
32 34
33 - @Override 35 + @Override // TODO @zyna:新增和修改时,关联字段要校验,例如说 直属上级,是不是真的存在;
34 public Long createContact(ContactCreateReqVO createReqVO) { 36 public Long createContact(ContactCreateReqVO createReqVO) {
35 // 插入 37 // 插入
36 ContactDO contact = ContactConvert.INSTANCE.convert(createReqVO); 38 ContactDO contact = ContactConvert.INSTANCE.convert(createReqVO);