diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 9c78a59ac..2c15dc6af 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -17,6 +17,7 @@ public interface ErrorCodeConstants { ErrorCode CUSTOMER_CREATE_NAME_NOT_NULL = new ErrorCode(5_0906, "客户名称不能为空"); ErrorCode CUSTOMER_NAME_EXISTS = new ErrorCode(5_0907, "已存在名为【{}】的客户"); ErrorCode CUSTOMER_UPDATE_DEAL_STATUS_FAIL = new ErrorCode(5_0908, "更新客户的成交状态失败,原因:已经是该状态,无需更新"); + ErrorCode CUSTOMER_CODE_EXISTS = new ErrorCode(5_0909, "客户编码已存在"); ErrorCode MOLD_REPAIR_ID_NULL = new ErrorCode(5_0090, "维修单ID不能为空"); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/CrmCustomerController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/CrmCustomerController.java index 2d3e5d95d..5a5b7cdb9 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/CrmCustomerController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/CrmCustomerController.java @@ -219,10 +219,10 @@ public class CrmCustomerController { public void importTemplate(HttpServletResponse response) throws IOException { // 手动创建导出 demo List list = Arrays.asList( - CrmCustomerImportExcelVO.builder().name("芋道").industryId(1).level(1).source(1) + CrmCustomerImportExcelVO.builder().customerCode("CUST0001").name("芋道").contactName("张三").industryId(1).level(1).source(1) .mobile("15601691300").telephone("").qq("").wechat("").email("yunai@iocoder.cn") .areaId(null).detailAddress("").remark("").build(), - CrmCustomerImportExcelVO.builder().name("源码").industryId(1).level(1).source(1) + CrmCustomerImportExcelVO.builder().customerCode("CUST0002").name("源码").contactName("李四").industryId(1).level(1).source(1) .mobile("15601691300").telephone("").qq("").wechat("").email("yunai@iocoder.cn") .areaId(null).detailAddress("").remark("").build() ); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerImportExcelVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerImportExcelVO.java index 7d8f6b560..e634ee01c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerImportExcelVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerImportExcelVO.java @@ -27,6 +27,12 @@ public class CrmCustomerImportExcelVO { @ExcelProperty("客户名称") private String name; + @ExcelProperty("客户编码") + private String customerCode; + + @ExcelProperty("联系人") + private String contactName; + @ExcelProperty("手机") private String mobile; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerPageReqVO.java index f0d4df162..ea24bd5c8 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerPageReqVO.java @@ -30,6 +30,12 @@ public class CrmCustomerPageReqVO extends PageParam { @Schema(description = "客户名称", example = "赵六") private String name; + @Schema(description = "客户编码", example = "CUST0001") + private String customerCode; + + @Schema(description = "联系人", example = "张三") + private String contactName; + @Schema(description = "手机", example = "18000000000") private String mobile; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerRespVO.java index 20423e941..fc42cdfab 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerRespVO.java @@ -19,10 +19,18 @@ public class CrmCustomerRespVO { @ExcelProperty("编号") private Long id; + @Schema(description = "客户编码", example = "CUST0001") + @ExcelProperty("客户编码") + private String customerCode; + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") @ExcelProperty("客户名称") private String name; + @Schema(description = "联系人", example = "张三") + @ExcelProperty("联系人") + private String contactName; + @Schema(description = "跟进状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") @ExcelProperty(value = "跟进状态", converter = DictConvert.class) @DictFormat(DictTypeConstants.BOOLEAN_STRING) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerSaveReqVO.java index 8bcfc3013..226c6df20 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/customer/vo/customer/CrmCustomerSaveReqVO.java @@ -30,11 +30,20 @@ public class CrmCustomerSaveReqVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") private Long id; + @Schema(description = "客户编码", example = "CUST0001") + @DiffLogField(name = "客户编码") + private String customerCode; + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") @DiffLogField(name = "客户名称") @NotEmpty(message = "客户名称不能为空") private String name; + @Schema(description = "联系人", example = "张三") + @DiffLogField(name = "联系人") + @Size(max = 64, message = "联系人长度不能超过 64 个字符") + private String contactName; + @Schema(description = "下次联系时间") @DiffLogField(name = "下次联系时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/customer/CrmCustomerDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/customer/CrmCustomerDO.java index 2100cf788..2c64ea87c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/customer/CrmCustomerDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/customer/CrmCustomerDO.java @@ -29,11 +29,20 @@ public class CrmCustomerDO extends BaseDO { */ @TableId private Long id; + /** + * 客户编码 + */ + private String customerCode; /** * 客户名称 */ private String name; + /** + * 联系人 + */ + private String contactName; + /** * 跟进状态 */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/customer/CrmCustomerMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/customer/CrmCustomerMapper.java index ea0146648..8947060be 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/customer/CrmCustomerMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/customer/CrmCustomerMapper.java @@ -22,6 +22,10 @@ public interface CrmCustomerMapper extends BaseMapperX { return selectOne(CrmCustomerDO::getName, name); } + default CrmCustomerDO selectByCustomerCode(String customerCode) { + return selectOne(CrmCustomerDO::getCustomerCode, customerCode); + } + default List selectListByIds(Collection ids) { return selectList(CrmCustomerDO::getId, ids); } @@ -72,6 +76,8 @@ public interface CrmCustomerMapper extends BaseMapperX { static LambdaQueryWrapperX buildQuery(CrmCustomerPageReqVO pageReqVO) { LambdaQueryWrapperX query = new LambdaQueryWrapperX() .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) + .likeIfPresent(CrmCustomerDO::getCustomerCode, pageReqVO.getCustomerCode()) + .likeIfPresent(CrmCustomerDO::getContactName, pageReqVO.getContactName()) .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel()) @@ -101,4 +107,4 @@ public interface CrmCustomerMapper extends BaseMapperX { } return query; } -} \ No newline at end of file +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/customer/CrmCustomerServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/customer/CrmCustomerServiceImpl.java index cd8a18f87..3a19ebd34 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/customer/CrmCustomerServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/customer/CrmCustomerServiceImpl.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil; import cn.iocoder.yudao.module.mes.controller.admin.customer.vo.customer.*; import cn.iocoder.yudao.module.mes.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.mes.dal.mysql.customer.CrmCustomerMapper; @@ -30,10 +31,14 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Resource private CrmCustomerMapper customerMapper; + @Resource + private AutoCodeUtil autoCodeUtil; + @Override @Transactional(rollbackFor = Exception.class) public Long createCustomer(CrmCustomerSaveReqVO createReqVO, Long userId) { createReqVO.setId(null); + handleCustomerCodeForCreate(createReqVO); validateCustomerForCreate(createReqVO.getName()); CrmCustomerDO customer = initCustomer(createReqVO, userId); customerMapper.insert(customer); @@ -45,6 +50,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { public void updateCustomer(CrmCustomerSaveReqVO updateReqVO) { validateCustomerExists(updateReqVO.getId()); validateCustomerNameUnique(updateReqVO.getName(), updateReqVO.getId()); + validateCustomerCodeUnique(updateReqVO.getCustomerCode(), updateReqVO.getId()); CrmCustomerDO updateObj = BeanUtils.toBean(updateReqVO, CrmCustomerDO.class); if (updateObj.getOwnerUserId() != null) { updateObj.setOwnerTime(LocalDateTime.now()); @@ -141,6 +147,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override @Transactional(rollbackFor = Exception.class) public Long createCustomer(CrmCustomerCreateReqBO createReqBO, Long userId) { + handleCustomerCodeForCreate(createReqBO); validateCustomerForCreate(createReqBO.getName()); CrmCustomerDO customer = initCustomer(createReqBO, userId); customerMapper.insert(customer); @@ -161,6 +168,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { .build(); for (CrmCustomerImportExcelVO importCustomer : importCustomers) { try { + handleCustomerCodeForCreate(importCustomer); validateCustomerForCreate(importCustomer.getName()); } catch (ServiceException ex) { CrmCustomerDO existCustomer = customerMapper.selectByCustomerName(importCustomer.getName()); @@ -225,6 +233,30 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { return customer; } + private void handleCustomerCodeForCreate(CrmCustomerSaveReqVO reqVO) { + if (StrUtil.isBlank(reqVO.getCustomerCode())) { + reqVO.setCustomerCode(autoCodeUtil.genSerialCode("CUSTOMER_CODE", null)); + return; + } + validateCustomerCodeUnique(reqVO.getCustomerCode(), null); + } + + private void handleCustomerCodeForCreate(CrmCustomerCreateReqBO reqBO) { + if (StrUtil.isBlank(reqBO.getCustomerCode())) { + reqBO.setCustomerCode(autoCodeUtil.genSerialCode("CUSTOMER_CODE", null)); + return; + } + validateCustomerCodeUnique(reqBO.getCustomerCode(), null); + } + + private void handleCustomerCodeForCreate(CrmCustomerImportExcelVO importVO) { + if (StrUtil.isBlank(importVO.getCustomerCode())) { + importVO.setCustomerCode(autoCodeUtil.genSerialCode("CUSTOMER_CODE", null)); + return; + } + validateCustomerCodeUnique(importVO.getCustomerCode(), null); + } + private CrmCustomerDO validateCustomerExists(Long id) { CrmCustomerDO customer = customerMapper.selectById(id); if (customer == null) { @@ -246,4 +278,14 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { throw exception(CUSTOMER_NAME_EXISTS, name); } } -} \ No newline at end of file + + private void validateCustomerCodeUnique(String customerCode, Long id) { + if (StrUtil.isBlank(customerCode)) { + return; + } + CrmCustomerDO customer = customerMapper.selectByCustomerCode(customerCode); + if (customer != null && !Objects.equals(customer.getId(), id)) { + throw exception(CUSTOMER_CODE_EXISTS); + } + } +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/customer/bo/CrmCustomerCreateReqBO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/customer/bo/CrmCustomerCreateReqBO.java index d046fb503..62cb99a95 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/customer/bo/CrmCustomerCreateReqBO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/customer/bo/CrmCustomerCreateReqBO.java @@ -23,6 +23,14 @@ public class CrmCustomerCreateReqBO { */ @NotEmpty(message = "客户名称不能为空") private String name; + /** + * 客户编码 + */ + private String customerCode; + /** + * 联系人 + */ + private String contactName; /** * 跟进状态 */