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 | \ 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 | 79 | ||
| 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); |