diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/product/CrmBusinessProductSaveReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/product/CrmBusinessProductSaveReqVO.java index 286f1a256..86598bad5 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/product/CrmBusinessProductSaveReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/product/CrmBusinessProductSaveReqVO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.business.vo.product; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -16,12 +17,12 @@ public class CrmBusinessProductSaveReqVO { // TODO @lzxhqs:这个字段,应该是 Long 类型 @Schema(description = "商机编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320") @NotNull(message = "商机编号不能为空") - private Integer businessId; + private Long businessId; // TODO @lzxhqs:这个字段,应该是 Long 类型 @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320") @NotNull(message = "产品编号不能为空") - private Integer productId; + private Long productId; @Schema(description = "产品单价", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320") @NotNull(message = "产品单价不能为空") @@ -45,7 +46,7 @@ public class CrmBusinessProductSaveReqVO { // TODO @lzxhqs:字符串,用 @NotEmpty,因为要考虑 "" 前端搞了这个玩意 @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320") - @NotNull(message = "单位不能为空") + @NotEmpty(message = "单位不能为空") private String unit; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java index e11ec5935..e8df68d2d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java @@ -98,7 +98,7 @@ public class CrmBusinessDO extends BaseDO { * * TODO @lzxhqs:目前就是 Boolean;是否跟进 */ - private Integer followUpStatus; + private Boolean followUpStatus; /** * 负责人的用户编号 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java index 4558684e9..776d537ef 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java @@ -48,7 +48,7 @@ public class CrmBusinessProductDO extends BaseDO { /** * 产品单价 */ - private BigDecimal price; + private Integer price; /** * 销售价格 @@ -59,19 +59,19 @@ public class CrmBusinessProductDO extends BaseDO { /** * 数量 */ - private BigDecimal num; + private BigDecimal count; // TODO @lzxhqs:改成 discountPercent /** * 折扣 */ - private BigDecimal discount; + private BigDecimal discountPercent; // TODO @lzxhqs:改成 totalPrice;总计价格,和现有项目风格一致; /** * 小计(折扣后价格) */ - private BigDecimal subtotal; + private BigDecimal totalPrice; /** * 单位 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessProductMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessProductMapper.java index 5750491d8..ab84b2958 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessProductMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessProductMapper.java @@ -7,10 +7,12 @@ import org.apache.ibatis.annotations.Mapper; /** * 商机产品 Mapper // TODO @lzxhqs:类注释,和作者之间要有一个空行 + * * @author lzxhqs */ @Mapper public interface CrmBusinessProductMapper extends BaseMapperX { + default void deleteByBusinessId(Long id) { // TODO @lzxhqs:第一个方法,和类之间最好空一行; delete(CrmBusinessProductDO::getBusinessId, id); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java index 2e7bafdcf..505381fb4 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java @@ -65,8 +65,9 @@ public interface CrmContractMapper extends BaseMapperX { default Long selectCountByContactId(Long contactId) { return selectCount(CrmContractDO::getContactId, contactId); } - default CrmContractDO selectByBizId(Long businessId) { // TODO @lzxhqs:1)方法和方法之间要有空行;2)selectCountByBusinessId,一个是应该求数量,一个是不要缩写 BizId 可读性; - return selectOne(CrmContractDO::getBusinessId, businessId); + + default Long selectCountByBusinessId(Long businessId) { // TODO @lzxhqs:1)方法和方法之间要有空行;2)selectCountByBusinessId,一个是应该求数量,一个是不要缩写 BizId 可读性; + return selectCount(CrmContractDO::getBusinessId, businessId); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessProductService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessProductService.java new file mode 100644 index 000000000..16dfce371 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessProductService.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.crm.service.business; + +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessProductDO; + +import java.util.List; + +/** + * 商机产品关联表 Service 接口 + * + * @author lzxhqs + */ +public interface CrmBusinessProductService { + + /** + * 批量新增商机产品关联数据 + * @param list 商机产品集合 + */ + void insertBatch(List list); + + /** + * 根据商机id获取商机产品关联数据集合 + * @param businessId 商机id + */ + List selectListByBusinessId(Long businessId); + + /** + * 批量更新商机产品表 + * @param list 商机产品数据集合 + */ + void updateBatch(List list); + + /** + * 批量删除 + * @param list 需要删除的商机产品集合 + */ + void deleteBatch(List list); + + /** + *根据商机id删除商机产品关联数据 + * @param businessId 商机id + */ + void deleteByBusinessId(Long businessId); +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessProductServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessProductServiceImpl.java new file mode 100644 index 000000000..ec52a9d9f --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessProductServiceImpl.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.crm.service.business; + +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessProductDO; +import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessProductMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +/** + * 商机产品关联表 Service 实现类 + * + * @author lzxhqs + */ +@Service +@Validated +public class CrmBusinessProductServiceImpl implements CrmBusinessProductService { + @Resource + private CrmBusinessProductMapper businessProductMapper; + + @Override + public void insertBatch(List list) { + businessProductMapper.insertBatch(list); + } + + @Override + public List selectListByBusinessId(Long businessId) { + return businessProductMapper.selectList(CrmBusinessProductDO::getBusinessId,businessId); + } + + @Override + public void updateBatch(List list) { + businessProductMapper.updateBatch(list); + } + + @Override + public void deleteBatch(List list) { + businessProductMapper.deleteBatchIds(CollectionUtils.convertList(list,CrmBusinessProductDO::getId)); + + } + + @Override + public void deleteByBusinessId(Long businessId) { + businessProductMapper.deleteByBusinessId(businessId); + } +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java index 58c0851b5..abe55bc5f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java @@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.crm.service.business; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; 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.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessSaveReqVO; @@ -13,15 +15,12 @@ import cn.iocoder.yudao.module.crm.convert.businessproduct.CrmBusinessProductCon import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessProductDO; import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessDO; -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper; -import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessProductMapper; -import cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink.CrmContactBusinessMapper; -import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper; import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessService; +import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; import cn.iocoder.yudao.module.crm.service.followup.bo.CrmUpdateFollowUpReqBO; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; @@ -33,7 +32,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -56,14 +54,13 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { private CrmBusinessMapper businessMapper; @Resource - private CrmBusinessProductMapper businessProductMapper; + private CrmBusinessProductService businessProductService; // TODO @lzxhqs:不直接调用这个 mapper,要调用对方的 service;每个业务独立收敛 @Resource - private CrmContractMapper contractMapper; + private CrmContractService contractService; // TODO @lzxhqs:不直接调用这个 mapper,要调用对方的 service;每个业务独立收敛 - @Resource - private CrmContactBusinessMapper contactBusinessMapper; + @Resource private CrmPermissionService permissionService; @Resource @@ -81,10 +78,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { businessMapper.insert(business); // TODO 商机待定:插入商机与产品的关联表;校验商品存在 // TODO lzxhqs:新增时,是不是不用调用这个方法哈; - verifyCrmBusinessProduct(business.getId()); // TODO @lzxhqs:用 CollUtils.isNotEmpty; - if (!createReqVO.getProducts().isEmpty()) { - createBusinessProducts(createReqVO.getProducts(), business.getId()); + if (CollUtil.isNotEmpty(createReqVO.getProducts())) { + createBusinessProducts(createReqVO.getProducts(), business.getId(), false); } // TODO 商机待定:在联系人的详情页,如果直接【新建商机】,则需要关联下。这里要搞个 CrmContactBusinessDO 表 createContactBusiness(business.getId(), createReqVO.getContactId()); @@ -111,37 +107,39 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { CrmContactBusinessDO contactBusiness = new CrmContactBusinessDO(); contactBusiness.setBusinessId(businessId); contactBusiness.setContactId(contactId); - contactBusinessMapper.insert(contactBusiness); + contactBusinessService.insert(contactBusiness); } // TODO @lzxhqs:这个方法注释格式不对;删除@description,然后把 插入商机产品关联表 作为方法注释; /** - * @param products 产品集合 - * @description 插入商机产品关联表 + * 插入商机产品关联表 + * + * @param products 产品集合 + * @param businessId 商机id + * @param updateFlag 更新标识 true 代表更新 * @author lzxhqs */ - private void createBusinessProducts(List products, Long businessId) { + private void createBusinessProducts(List products, Long businessId, Boolean updateFlag) { // TODO @lzxhqs:可以用 CollectionUtils.convertList; - List list = new ArrayList<>(); - for (CrmBusinessProductSaveReqVO product : products) { - CrmBusinessProductDO businessProductDO = CrmBusinessProductConvert.INSTANCE.convert(product); - businessProductDO.setBusinessId(businessId); - list.add(businessProductDO); - } - businessProductMapper.insertBatch(list); - } - - /** - * @param id businessId - * @description 校验管理的产品存在则删除 - * @author lzxhqs - */ - private void verifyCrmBusinessProduct(Long id) { - CrmBusinessProductDO businessProductDO = businessProductMapper.selectByBusinessId(id); - if (businessProductDO != null) { - //通过商机Id删除 - businessProductMapper.deleteByBusinessId(id); + List list = CollectionUtils.convertList(products, product -> + CrmBusinessProductConvert.INSTANCE.convert(product).setBusinessId(businessId)); + if (Boolean.TRUE.equals(updateFlag)) { +// 根据商机 id从商机产品关联表中获取已存在的数据集合 + List oldProducts = businessProductService.selectListByBusinessId(businessId); + List> diffList = CollectionUtils.diffList(oldProducts, list, (oldValue, newValue) -> + ObjectUtil.equal(oldValue.getProductId(), newValue.getProductId())); + if (CollUtil.isNotEmpty(diffList.getFirst())) { + businessProductService.insertBatch(diffList.getFirst()); + } + if (CollUtil.isNotEmpty(diffList.get(1))) { + businessProductService.updateBatch(diffList.get(1)); + } + if (CollUtil.isNotEmpty(diffList.get(2))) { + businessProductService.deleteBatch(diffList.get(2)); + } + } else { + businessProductService.insertBatch(list); } } @@ -160,9 +158,10 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { businessMapper.updateById(updateObj); // TODO 商机待定:插入商机与产品的关联表;校验商品存在 // TODO @lzxhqs:更新时,可以调用 CollectionUtils 的 diffList,尽量避免这种先删除再插入;而是新增的插入、变更的更新,没的删除;不然这个表每次更新,会多好多数据; - verifyCrmBusinessProduct(updateReqVO.getId()); - if (!updateReqVO.getProducts().isEmpty()) { - createBusinessProducts(updateReqVO.getProducts(), updateReqVO.getId()); + if (CollUtil.isNotEmpty(updateReqVO.getProducts())) { + createBusinessProducts(updateReqVO.getProducts(), updateReqVO.getId(), true); + } else { + businessProductService.deleteByBusinessId(updateReqVO.getId()); } // TODO @商机待定:如果状态发生变化,插入商机状态变更记录表 @@ -197,14 +196,14 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { } /** + * 删除校验合同是关联合同 + * * @param businessId 商机id - * @throws - * @description 删除校验合同是关联合同 * @author lzxhqs */ private void validateContractExists(Long businessId) { - CrmContractDO contract = contractMapper.selectByBizId(businessId); - if (contract != null) { + Long count = contractService.selectCountByBusinessId(businessId); + if (count > 0) { throw exception(BUSINESS_CONTRACT_EXISTS); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessService.java index 4a6d4c7fb..7816040fb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessService.java @@ -42,4 +42,9 @@ public interface CrmContactBusinessService { */ List getContactBusinessListByContactId(Long contactId); + /** + * 新增联系人与商机的 + * @param contactBusiness 新增联系人与商机的对象 + */ + void insert(CrmContactBusinessDO contactBusiness); } \ No newline at end of file diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessServiceImpl.java index d2e667919..10b6a2ec3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessServiceImpl.java @@ -85,4 +85,9 @@ public class CrmContactBusinessServiceImpl implements CrmContactBusinessService return contactBusinessMapper.selectListByContactId(contactId); } + @Override + public void insert(CrmContactBusinessDO contactBusiness) { + contactBusinessMapper.insert(contactBusiness); + } + } \ No newline at end of file diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java index ec52d85c0..ae1347853 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java @@ -110,4 +110,10 @@ public interface CrmContractService { */ Long getContractCountByCustomerId(Long customerId); + /** + * 根据商机ID获取关联客户的合同数量 + * @param businessId 商机ID + * @return 数量 + */ + Long selectCountByBusinessId(Long businessId); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java index dc921e952..1f1561f9b 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java @@ -178,5 +178,10 @@ public class CrmContractServiceImpl implements CrmContractService { return contractMapper.selectCount(CrmContractDO::getCustomerId, customerId); } + @Override + public Long selectCountByBusinessId(Long businessId) { + return contractMapper.selectCountByBusinessId(businessId); + } + // TODO @合同待定:需要新增一个 ContractConfigDO 表,合同配置,重点是到期提醒; }