Commit 966690125bfcbdb8b99de5d5b2150e94d2ad82e1
1 parent
bf8bfef8
crm:code review 联系人
Showing
12 changed files
with
115 additions
and
132 deletions
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 | 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 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 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 | 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 | 13 | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; |
| 14 | +import cn.iocoder.yudao.module.crm.service.contact.ContactService; | |
| 7 | 15 | import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; |
| 8 | 16 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| 9 | 17 | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| 10 | 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 | 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 | 29 | import java.io.IOException; |
| 30 | +import java.util.List; | |
| 31 | +import java.util.Map; | |
| 32 | +import java.util.Optional; | |
| 24 | 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 | 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 | 40 | @RestController |
| 42 | 41 | @RequestMapping("/crm/contact") |
| 43 | 42 | @Validated |
| ... | ... | @@ -45,20 +44,22 @@ public class ContactController { |
| 45 | 44 | |
| 46 | 45 | @Resource |
| 47 | 46 | private ContactService contactService; |
| 48 | - @Resource | |
| 49 | - private AdminUserApi adminUserApi; | |
| 47 | + // TODO @zyna:模块内,注入的变量,不用带 crm 前缀哈 | |
| 50 | 48 | @Resource |
| 51 | 49 | private CrmCustomerService crmCustomerService; |
| 52 | 50 | |
| 51 | + @Resource | |
| 52 | + private AdminUserApi adminUserApi; | |
| 53 | + | |
| 53 | 54 | @PostMapping("/create") |
| 54 | - @Operation(summary = "创建crm联系人") | |
| 55 | + @Operation(summary = "创建联系人") | |
| 55 | 56 | @PreAuthorize("@ss.hasPermission('crm:contact:create')") |
| 56 | 57 | public CommonResult<Long> createContact(@Valid @RequestBody ContactCreateReqVO createReqVO) { |
| 57 | 58 | return success(contactService.createContact(createReqVO)); |
| 58 | 59 | } |
| 59 | 60 | |
| 60 | 61 | @PutMapping("/update") |
| 61 | - @Operation(summary = "更新crm联系人") | |
| 62 | + @Operation(summary = "更新联系人") | |
| 62 | 63 | @PreAuthorize("@ss.hasPermission('crm:contact:update')") |
| 63 | 64 | public CommonResult<Boolean> updateContact(@Valid @RequestBody ContactUpdateReqVO updateReqVO) { |
| 64 | 65 | contactService.updateContact(updateReqVO); |
| ... | ... | @@ -66,7 +67,7 @@ public class ContactController { |
| 66 | 67 | } |
| 67 | 68 | |
| 68 | 69 | @DeleteMapping("/delete") |
| 69 | - @Operation(summary = "删除crm联系人") | |
| 70 | + @Operation(summary = "删除联系人") | |
| 70 | 71 | @Parameter(name = "id", description = "编号", required = true) |
| 71 | 72 | @PreAuthorize("@ss.hasPermission('crm:contact:delete')") |
| 72 | 73 | public CommonResult<Boolean> deleteContact(@RequestParam("id") Long id) { |
| ... | ... | @@ -75,12 +76,14 @@ public class ContactController { |
| 75 | 76 | } |
| 76 | 77 | |
| 77 | 78 | @GetMapping("/get") |
| 78 | - @Operation(summary = "获得crm联系人") | |
| 79 | + @Operation(summary = "获得联系人") | |
| 79 | 80 | @Parameter(name = "id", description = "编号", required = true, example = "1024") |
| 80 | 81 | @PreAuthorize("@ss.hasPermission('crm:contact:query')") |
| 81 | 82 | public CommonResult<ContactRespVO> getContact(@RequestParam("id") Long id) { |
| 82 | 83 | ContactDO contact = contactService.getContact(id); |
| 84 | + // TODO @zyna:需要考虑 null 的情况; | |
| 83 | 85 | ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact); |
| 86 | + // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑 | |
| 84 | 87 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList( |
| 85 | 88 | NumberUtil.parseLong(contact.getCreator())))); |
| 86 | 89 | contactRespVO.setCreatorName(Optional.ofNullable(userMap.get(NumberUtil.parseLong(contact.getCreator()))).map(AdminUserRespDTO::getNickname).orElse(null)); |
| ... | ... | @@ -88,27 +91,24 @@ public class ContactController { |
| 88 | 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 | 95 | @GetMapping("/simpleAlllist") |
| 100 | - @Operation(summary = "获得crm联系人列表") | |
| 96 | + @Operation(summary = "获得联系人列表") | |
| 101 | 97 | @PreAuthorize("@ss.hasPermission('crm:contact:query')") |
| 102 | 98 | public CommonResult<List<ContactSimpleRespVO>> simpleAlllist() { |
| 99 | + // TODO @zyna:方法名改成,getContactList;方法命名,要动名词,get 动词;all 可以去掉,因为没条件,自然是全部 | |
| 103 | 100 | List<ContactDO> list = contactService.allContactList(); |
| 104 | 101 | return success(ContactConvert.INSTANCE.convertAllList(list)); |
| 105 | 102 | } |
| 103 | + | |
| 106 | 104 | @GetMapping("/page") |
| 107 | - @Operation(summary = "获得crm联系人分页") | |
| 105 | + @Operation(summary = "获得联系人分页") | |
| 108 | 106 | @PreAuthorize("@ss.hasPermission('crm:contact:query')") |
| 109 | 107 | public CommonResult<PageResult<ContactRespVO>> getContactPage(@Valid ContactPageReqVO pageVO) { |
| 110 | 108 | PageResult<ContactDO> pageData = contactService.getContactPage(pageVO); |
| 111 | 109 | PageResult<ContactRespVO> pageResult =ContactConvert.INSTANCE.convertPage(pageData); |
| 110 | + // TODO @zyna:需要考虑 null 的情况; | |
| 111 | + // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑 | |
| 112 | 112 | //待接口实现后修改 |
| 113 | 113 | List<CrmCustomerDO> crmCustomerDOList = crmCustomerService.getCustomerList(new CrmCustomerExportReqVO()); |
| 114 | 114 | Map<Long,CrmCustomerDO> crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); |
| ... | ... | @@ -118,8 +118,9 @@ public class ContactController { |
| 118 | 118 | return success(pageResult); |
| 119 | 119 | } |
| 120 | 120 | |
| 121 | + // TODO @zyna:可以看下新的导出写法,这里调整下 | |
| 121 | 122 | @GetMapping("/export-excel") |
| 122 | - @Operation(summary = "导出crm联系人 Excel") | |
| 123 | + @Operation(summary = "导出联系人 Excel") | |
| 123 | 124 | @PreAuthorize("@ss.hasPermission('crm:contact:export')") |
| 124 | 125 | @OperateLog(type = EXPORT) |
| 125 | 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 | 1 | package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; |
| 2 | 2 | |
| 3 | 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 | 7 | import java.time.LocalDateTime; |
| 11 | -import javax.validation.constraints.*; | |
| 12 | -import org.springframework.format.annotation.DateTimeFormat; | |
| 13 | 8 | |
| 14 | 9 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| 15 | 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 | 15 | * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 |
| 20 | 16 | */ |
| 21 | 17 | @Data |
| 22 | 18 | public class ContactBaseVO { |
| 23 | 19 | |
| 20 | + // TODO @zyna:example 最好都写下 | |
| 21 | + // TODO @zyna:必要的字段校验,例如说 @Mobile,@Emal 等等 | |
| 22 | + | |
| 24 | 23 | @Schema(description = "下次联系时间") |
| 25 | 24 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| 26 | 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 | 1 | package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; |
| 2 | 2 | |
| 3 | -import lombok.*; | |
| 4 | -import java.util.*; | |
| 5 | 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 | 9 | @Data |
| 10 | 10 | @EqualsAndHashCode(callSuper = true) |
| 11 | 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 | 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 | 6 | import java.time.LocalDateTime; |
| 11 | 7 | |
| 12 | -import com.alibaba.excel.annotation.ExcelProperty; | |
| 13 | - | |
| 8 | +// TODO @zyna:参考新的 VO 结构,把 ContactExcelVO 融合到 ContactRespVO 中 | |
| 14 | 9 | /** |
| 15 | 10 | * crm联系人 Excel VO |
| 16 | 11 | * |
| 17 | 12 | * @author 芋道源码 |
| 18 | 13 | */ |
| 19 | 14 | @Data |
| 15 | +@Deprecated | |
| 20 | 16 | public class ContactExcelVO { |
| 21 | 17 | |
| 22 | 18 | @ExcelProperty("下次联系时间") | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java
| 1 | 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 | 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 | 5 | import org.springframework.format.annotation.DateTimeFormat; |
| 11 | 6 | |
| 7 | +import java.time.LocalDateTime; | |
| 8 | + | |
| 12 | 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 | 12 | @Schema(description = "管理后台 - crm联系人 Excel 导出 Request VO,参数和 ContactPageReqVO 是一致的") |
| 15 | 13 | @Data |
| 14 | +@Deprecated | |
| 16 | 15 | public class ContactExportReqVO { |
| 17 | 16 | |
| 18 | 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 | 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 | 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 | 8 | import org.springframework.format.annotation.DateTimeFormat; |
| 9 | + | |
| 10 | 10 | import java.time.LocalDateTime; |
| 11 | 11 | |
| 12 | 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 | 17 | @ToString(callSuper = true) |
| 18 | 18 | public class ContactPageReqVO extends PageParam { |
| 19 | 19 | |
| 20 | + // TODO @zyna:筛选条件 | |
| 21 | + // ●客户: | |
| 22 | + // ●姓名: | |
| 23 | + // ●手机、电话、座机、QQ、微信、邮箱 | |
| 24 | + | |
| 20 | 25 | @Schema(description = "下次联系时间") |
| 21 | 26 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 22 | 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 | 4 | import lombok.*; |
| 5 | 5 | import java.time.LocalDateTime; |
| 6 | 6 | |
| 7 | -@Schema(description = "管理后台 - crm联系人 Response VO") | |
| 7 | +@Schema(description = "管理后台 - CRM 联系人 Response VO") | |
| 8 | 8 | @Data |
| 9 | 9 | @EqualsAndHashCode(callSuper = true) |
| 10 | 10 | @ToString(callSuper = true) |
| 11 | 11 | public class ContactRespVO extends ContactBaseVO { |
| 12 | 12 | |
| 13 | + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") | |
| 14 | + private Long id; | |
| 15 | + | |
| 13 | 16 | @Schema(description = "创建时间") |
| 14 | 17 | private LocalDateTime createTime; |
| 18 | + | |
| 19 | + // TODO @zyna:example 最好写下; | |
| 20 | + | |
| 15 | 21 | @Schema(description = "创建人") |
| 16 | 22 | private String creatorName; |
| 17 | - @Schema(description = "客户") | |
| 23 | + | |
| 24 | + @Schema(description = "客户名字") | |
| 18 | 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 | 2 | |
| 3 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | 4 | import lombok.Data; |
| 5 | -import lombok.EqualsAndHashCode; | |
| 6 | 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 | 8 | @Data |
| 12 | 9 | @ToString(callSuper = true) |
| 13 | 10 | public class ContactSimpleRespVO { |
| 14 | - @Schema(description = "姓名", example = "芋艿") | |
| 11 | + @Schema(description = "姓名", example = "芋艿") // TODO @zyna:requiredMode = Schema.RequiredMode.REQUIRED;需要空一行;字段的顺序改下,id 在 name 前面,会更干净 | |
| 15 | 12 | private String name; |
| 16 | 13 | |
| 17 | 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 | 1 | package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; |
| 2 | 2 | |
| 3 | 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 | 11 | @Data |
| 10 | 12 | @EqualsAndHashCode(callSuper = true) |
| 11 | 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 | 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 | 7 | import lombok.*; |
| 4 | 8 | |
| 5 | -import java.time.LocalDate; | |
| 6 | -import java.util.*; | |
| 7 | -import java.time.LocalDateTime; | |
| 8 | 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 | 14 | * @author 芋道源码 |
| 17 | 15 | */ |
| ... | ... | @@ -25,6 +23,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 25 | 23 | @AllArgsConstructor |
| 26 | 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 | 56 | * 最后跟进时间 |
| 58 | 57 | */ |
| 59 | 58 | private LocalDateTime lastTime; |
| 59 | + // TODO @zyna:这个放在最前面吧 | |
| 60 | 60 | /** |
| 61 | 61 | * 主键 |
| 62 | 62 | */ |
| 63 | 63 | @TableId |
| 64 | 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 | 79 | |
| 79 | 80 | */ |
| 80 | 81 | private Long qq; |
| 82 | + // TODO @zyna:wechat | |
| 81 | 83 | /** |
| 82 | 84 | * 微信 |
| 83 | 85 | */ |
| 84 | 86 | private String webchat; |
| 87 | + // TODO @zyna:关联的枚举 | |
| 85 | 88 | /** |
| 86 | 89 | * 性别 |
| 87 | 90 | */ |
| 88 | 91 | private Integer sex; |
| 92 | + // TODO @zyna:这个字段改成 master 哈; | |
| 89 | 93 | /** |
| 90 | 94 | * 是否关键决策人 |
| 91 | 95 | */ |
| 92 | 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 | 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 | 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 | 10 | import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; |
| 11 | +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; | |
| 13 | 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 | 24 | * crm联系人 Service 实现类 |
| ... | ... | @@ -30,7 +32,7 @@ public class ContactServiceImpl implements ContactService { |
| 30 | 32 | @Resource |
| 31 | 33 | private ContactMapper contactMapper; |
| 32 | 34 | |
| 33 | - @Override | |
| 35 | + @Override // TODO @zyna:新增和修改时,关联字段要校验,例如说 直属上级,是不是真的存在; | |
| 34 | 36 | public Long createContact(ContactCreateReqVO createReqVO) { |
| 35 | 37 | // 插入 |
| 36 | 38 | ContactDO contact = ContactConvert.INSTANCE.convert(createReqVO); | ... | ... |