Browse Source

CRM-CONTRACT: 完善合同编辑回显

puhui999 1 năm trước cách đây
mục cha
commit
6a63f2f078

+ 22 - 3
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<CrmContractRespVO> 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<CrmBusinessProductDO> businessProductList = businessProductService.getBusinessProductListByContractId(id);
+        Map<Long, CrmBusinessProductDO> businessProductMap = convertMap(businessProductList, CrmBusinessProductDO::getProductId);
+        List<CrmProductDO> 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")

+ 35 - 0
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<CrmContractProductItemRespVO> 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;
+
+    }
+
 }

+ 1 - 1
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<CrmContractProductItem> productItems;
 
-    @Schema(description = "商品属性")
+    @Schema(description = "产品列表")
     @Data
     @NoArgsConstructor
     @AllArgsConstructor

+ 8 - 0
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<CrmProductDO> {
         return selectOne(CrmProductDO::getNo, no);
     }
 
+    default List<CrmProductDO> selectListByIds(Collection<Long> ids) {
+        return selectList(new LambdaQueryWrapperX<CrmProductDO>().in(CrmProductDO::getId, ids));
+    }
+
 }

+ 6 - 6
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<CrmBusinessProductDO> list);
+    void createBusinessProductBatch(List<CrmBusinessProductDO> list);
 
     /**
      * 根据商机id获取商机产品关联数据集合
      *
      * @param businessId 商机id
      */
-    List<CrmBusinessProductDO> selectListByBusinessId(Long businessId);
+    List<CrmBusinessProductDO> getBusinessProductListByBusinessId(Long businessId);
 
     /**
      * 批量更新商机产品表
      *
      * @param list 商机产品数据集合
      */
-    void updateBatch(List<CrmBusinessProductDO> list);
+    void updateBusinessProductBatch(List<CrmBusinessProductDO> list);
 
     /**
      * 批量删除
      *
      * @param list 需要删除的商机产品集合
      */
-    void deleteBatch(List<CrmBusinessProductDO> list);
+    void deleteBusinessProductBatch(List<CrmBusinessProductDO> list);
 
     /**
      * 根据商机id删除商机产品关联数据
      *
      * @param businessId 商机id
      */
-    void deleteByBusinessId(Long businessId);
+    void deleteBusinessProductByBusinessId(Long businessId);
 
     /**
      * 获得合同关联的商品列表
@@ -54,6 +54,6 @@ public interface CrmBusinessProductService {
      * @param contractId 合同编号
      * @return 关联的商品列表
      */
-    List<CrmBusinessProductDO> selectListByContractId(Long contractId);
+    List<CrmBusinessProductDO> getBusinessProductListByContractId(Long contractId);
 
 }

+ 6 - 6
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<CrmBusinessProductDO> list) {
+    public void createBusinessProductBatch(List<CrmBusinessProductDO> list) {
         businessProductMapper.insertBatch(list);
     }
 
     @Override
-    public List<CrmBusinessProductDO> selectListByBusinessId(Long businessId) {
+    public List<CrmBusinessProductDO> getBusinessProductListByBusinessId(Long businessId) {
         return businessProductMapper.selectList(CrmBusinessProductDO::getBusinessId, businessId);
     }
 
     @Override
-    public void updateBatch(List<CrmBusinessProductDO> list) {
+    public void updateBusinessProductBatch(List<CrmBusinessProductDO> list) {
         businessProductMapper.updateBatch(list);
     }
 
     // TODO @lzxhqs:这个方法,可以直接调用 deleteList 方法,然后传递 ids 就好了;
     @Override
-    public void deleteBatch(List<CrmBusinessProductDO> list) {
+    public void deleteBusinessProductBatch(List<CrmBusinessProductDO> 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<CrmBusinessProductDO> selectListByContractId(Long contractId) {
+    public List<CrmBusinessProductDO> getBusinessProductListByContractId(Long contractId) {
         return businessProductMapper.selectList(CrmBusinessProductDO::getContractId, contractId);
     }
 

+ 6 - 6
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<CrmBusinessProductDO> oldProducts = businessProductService.selectListByBusinessId(businessId);
+            List<CrmBusinessProductDO> oldProducts = businessProductService.getBusinessProductListByBusinessId(businessId);
             List<List<CrmBusinessProductDO>> 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 @商机待定:如果状态发生变化,插入商机状态变更记录表

+ 9 - 7
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<CrmBusinessProductDO> 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<CrmBusinessProductDO> newProductList = convertBusinessProductList(updateReqVO, contractId);
-        List<CrmBusinessProductDO> oldProductList = businessProductService.selectListByContractId(contractId);
+        List<CrmBusinessProductDO> oldProductList = businessProductService.getBusinessProductListByContractId(contractId);
         List<List<CrmBusinessProductDO>> 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));
         }
     }
 

+ 9 - 0
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<CrmProductDO> getProductListByIds(Collection<Long> ids);
+
 }

+ 8 - 0
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<CrmProductDO>().eq(CrmProductDO::getCategoryId, categoryId));
     }
 
+    @Override
+    public List<CrmProductDO> getProductListByIds(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return Collections.emptyList();
+        }
+        return productMapper.selectListByIds(ids);
+    }
+
 }