diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java index d9b181029..e6180d83d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java @@ -10,10 +10,14 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*; import cn.iocoder.yudao.module.crm.convert.contract.CrmContractConvert; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessProductDO; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO; +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessProductService; import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; +import cn.iocoder.yudao.module.crm.service.product.CrmProductService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.Operation; @@ -32,8 +36,8 @@ import java.util.Map; import java.util.stream.Stream; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -47,6 +51,10 @@ public class CrmContractController { private CrmContractService contractService; @Resource private CrmCustomerService customerService; + @Resource + private CrmBusinessProductService businessProductService; + @Resource + private CrmProductService productService; @Resource private AdminUserApi adminUserApi; @@ -81,7 +89,18 @@ public class CrmContractController { @PreAuthorize("@ss.hasPermission('crm:contract:query')") public CommonResult getContract(@RequestParam("id") Long id) { CrmContractDO contract = contractService.getContract(id); - return success(BeanUtils.toBean(contract, CrmContractRespVO.class)); + CrmContractRespVO respVO = BeanUtils.toBean(contract, CrmContractRespVO.class); + List businessProductList = businessProductService.getBusinessProductListByContractId(id); + Map businessProductMap = convertMap(businessProductList, CrmBusinessProductDO::getProductId); + List productList = productService.getProductListByIds(convertSet(businessProductList, CrmBusinessProductDO::getProductId)); + respVO.setProductItems(convertList(productList, product -> { + CrmContractRespVO.CrmContractProductItemRespVO productItemRespVO = BeanUtils.toBean(product, CrmContractRespVO.CrmContractProductItemRespVO.class); + findAndThen(businessProductMap, product.getId(), businessProduct -> { + productItemRespVO.setCount(businessProduct.getCount()).setDiscountPercent(businessProduct.getDiscountPercent()); + }); + return productItemRespVO; + })); + return success(respVO); } @GetMapping("/page") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractRespVO.java index 1164f4a0c..9e6c39a3a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractRespVO.java @@ -3,10 +3,13 @@ package cn.iocoder.yudao.module.crm.controller.admin.contract.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; +import java.util.List; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -113,4 +116,36 @@ public class CrmContractRespVO { @ExcelProperty("审批状态") private Integer auditStatus; + @Schema(description = "产品列表") + private List productItems; + + @Schema(description = "产品列表") + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class CrmContractProductItemRespVO { + + @Schema(description = "产品编号", example = "20529") + private Long id; + + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911") + private String name; + + @Schema(description = "产品编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911") + private String no; + + @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911") + private Integer unit; + + @Schema(description = "价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911") + private Integer price; + + @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911") + private Integer count; + + @Schema(description = "产品折扣") + private Integer discountPercent; + + } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractSaveReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractSaveReqVO.java index a2908a3ac..20b20580e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractSaveReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractSaveReqVO.java @@ -93,7 +93,7 @@ public class CrmContractSaveReqVO { @Schema(description = "产品列表") private List productItems; - @Schema(description = "商品属性") + @Schema(description = "产品列表") @Data @NoArgsConstructor @AllArgsConstructor diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductMapper.java index 30a07eec2..3d696de7e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductMapper.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.dal.mysql.product; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO; @@ -9,6 +10,9 @@ import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; +import java.util.List; + /** * CRM 产品 Mapper * @@ -34,4 +38,8 @@ public interface CrmProductMapper extends BaseMapperX { return selectOne(CrmProductDO::getNo, no); } + default List selectListByIds(Collection ids) { + return selectList(new LambdaQueryWrapperX().in(CrmProductDO::getId, ids)); + } + } 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 index f5a040488..f819b5907 100644 --- 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 @@ -18,35 +18,35 @@ public interface CrmBusinessProductService { * * @param list 商机产品集合 */ - void insertBatch(List list); + void createBusinessProductBatch(List list); /** * 根据商机id获取商机产品关联数据集合 * * @param businessId 商机id */ - List selectListByBusinessId(Long businessId); + List getBusinessProductListByBusinessId(Long businessId); /** * 批量更新商机产品表 * * @param list 商机产品数据集合 */ - void updateBatch(List list); + void updateBusinessProductBatch(List list); /** * 批量删除 * * @param list 需要删除的商机产品集合 */ - void deleteBatch(List list); + void deleteBusinessProductBatch(List list); /** * 根据商机id删除商机产品关联数据 * * @param businessId 商机id */ - void deleteByBusinessId(Long businessId); + void deleteBusinessProductByBusinessId(Long businessId); /** * 获得合同关联的商品列表 @@ -54,6 +54,6 @@ public interface CrmBusinessProductService { * @param contractId 合同编号 * @return 关联的商品列表 */ - List selectListByContractId(Long contractId); + List getBusinessProductListByContractId(Long contractId); } 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 index 0b65019b1..88115a86a 100644 --- 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 @@ -22,33 +22,33 @@ public class CrmBusinessProductServiceImpl implements CrmBusinessProductService private CrmBusinessProductMapper businessProductMapper; @Override - public void insertBatch(List list) { + public void createBusinessProductBatch(List list) { businessProductMapper.insertBatch(list); } @Override - public List selectListByBusinessId(Long businessId) { + public List getBusinessProductListByBusinessId(Long businessId) { return businessProductMapper.selectList(CrmBusinessProductDO::getBusinessId, businessId); } @Override - public void updateBatch(List list) { + public void updateBusinessProductBatch(List list) { businessProductMapper.updateBatch(list); } // TODO @lzxhqs:这个方法,可以直接调用 deleteList 方法,然后传递 ids 就好了; @Override - public void deleteBatch(List list) { + public void deleteBusinessProductBatch(List list) { businessProductMapper.deleteBatchIds(CollectionUtils.convertList(list, CrmBusinessProductDO::getId)); } @Override - public void deleteByBusinessId(Long businessId) { + public void deleteBusinessProductByBusinessId(Long businessId) { businessProductMapper.deleteByBusinessId(businessId); } @Override - public List selectListByContractId(Long contractId) { + public List getBusinessProductListByContractId(Long contractId) { return businessProductMapper.selectList(CrmBusinessProductDO::getContractId, contractId); } 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 3b6b46aed..f40a15bc1 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 @@ -120,20 +120,20 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { CrmBusinessProductConvert.INSTANCE.convert(product).setBusinessId(businessId)); if (Boolean.TRUE.equals(updateFlag)) { // 根据商机 id从商机产品关联表中获取已存在的数据集合 - List oldProducts = businessProductService.selectListByBusinessId(businessId); + List oldProducts = businessProductService.getBusinessProductListByBusinessId(businessId); List> diffList = CollectionUtils.diffList(oldProducts, list, (oldValue, newValue) -> ObjectUtil.equal(oldValue.getProductId(), newValue.getProductId())); if (CollUtil.isNotEmpty(diffList.getFirst())) { - businessProductService.insertBatch(diffList.getFirst()); + businessProductService.createBusinessProductBatch(diffList.getFirst()); } if (CollUtil.isNotEmpty(diffList.get(1))) { - businessProductService.updateBatch(diffList.get(1)); + businessProductService.updateBusinessProductBatch(diffList.get(1)); } if (CollUtil.isNotEmpty(diffList.get(2))) { - businessProductService.deleteBatch(diffList.get(2)); + businessProductService.deleteBusinessProductBatch(diffList.get(2)); } } else { - businessProductService.insertBatch(list); + businessProductService.createBusinessProductBatch(list); } } @@ -154,7 +154,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { if (CollUtil.isNotEmpty(updateReqVO.getProducts())) { createBusinessProducts(updateReqVO.getProducts(), updateReqVO.getId(), true); } else { - businessProductService.deleteByBusinessId(updateReqVO.getId()); + businessProductService.deleteBusinessProductByBusinessId(updateReqVO.getId()); } // TODO @商机待定:如果状态发生变化,插入商机状态变更记录表 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 5c0b2ede1..87f1c20e4 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 @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.bpm.api.listener.dto.BpmResultListenerRespDTO; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; @@ -91,7 +92,8 @@ public class CrmContractServiceImpl implements CrmContractService { // 1.2 插入商机关联商品 if (CollUtil.isNotEmpty(createReqVO.getProductItems())) { // 如果有的话 List businessProduct = convertBusinessProductList(createReqVO, contract.getId()); - businessProductService.insertBatch(businessProduct); + businessProductService.createBusinessProductBatch(businessProduct); + // 更新合同商品总金额 } // 2. 创建数据权限 @@ -113,8 +115,8 @@ public class CrmContractServiceImpl implements CrmContractService { Assert.notNull(updateReqVO.getId(), "合同编号不能为空"); CrmContractDO contract = validateContractExists(updateReqVO.getId()); // 只有草稿、审批中,可以编辑; - if (ObjUtil.notEqual(contract.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus()) || - ObjUtil.notEqual(contract.getAuditStatus(), CrmAuditStatusEnum.PROCESS.getStatus())) { + if (!ObjectUtils.equalsAny(contract.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus(), + CrmAuditStatusEnum.PROCESS.getStatus())) { throw exception(CONTRACT_UPDATE_FAIL_EDITING_PROHIBITED); } validateRelationDataExists(updateReqVO); @@ -136,7 +138,7 @@ public class CrmContractServiceImpl implements CrmContractService { return; } List newProductList = convertBusinessProductList(updateReqVO, contractId); - List oldProductList = businessProductService.selectListByContractId(contractId); + List oldProductList = businessProductService.getBusinessProductListByContractId(contractId); List> diffList = diffList(oldProductList, newProductList, (oldObj, newObj) -> { if (ObjUtil.notEqual(oldObj.getProductId(), newObj.getProductId())) { return false; @@ -145,13 +147,13 @@ public class CrmContractServiceImpl implements CrmContractService { return true; }); if (CollUtil.isNotEmpty(diffList.getFirst())) { - businessProductService.insertBatch(diffList.getFirst()); + businessProductService.createBusinessProductBatch(diffList.getFirst()); } if (CollUtil.isNotEmpty(diffList.get(1))) { - businessProductService.updateBatch(diffList.get(1)); + businessProductService.updateBusinessProductBatch(diffList.get(1)); } if (CollUtil.isNotEmpty(diffList.get(2))) { - businessProductService.deleteBatch(diffList.get(2)); + businessProductService.deleteBusinessProductBatch(diffList.get(2)); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductService.java index e4eabd15a..6d2dd4943 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductService.java @@ -69,4 +69,13 @@ public interface CrmProductService { * @return 产品 */ CrmProductDO getProductByCategoryId(Long categoryId); + + /** + * 获得产品列表 + * + * @param ids 产品编号 + * @return 产品列表 + */ + List getProductListByIds(Collection ids); + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java index 80c38af3c..55f8a3593 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java @@ -155,4 +155,12 @@ public class CrmProductServiceImpl implements CrmProductService { return productMapper.selectOne(new LambdaQueryWrapper().eq(CrmProductDO::getCategoryId, categoryId)); } + @Override + public List getProductListByIds(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return productMapper.selectListByIds(ids); + } + }