mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 02:38:43 +08:00 
			
		
		
		
	CRM-CONTRACT: 完善合同编辑回显
This commit is contained in:
		| @@ -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") | ||||
|   | ||||
| @@ -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; | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -93,7 +93,7 @@ public class CrmContractSaveReqVO { | ||||
|     @Schema(description = "产品列表") | ||||
|     private List<CrmContractProductItem> productItems; | ||||
|  | ||||
|     @Schema(description = "商品属性") | ||||
|     @Schema(description = "产品列表") | ||||
|     @Data | ||||
|     @NoArgsConstructor | ||||
|     @AllArgsConstructor | ||||
|   | ||||
| @@ -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)); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -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); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -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); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -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 @商机待定:如果状态发生变化,插入商机状态变更记录表 | ||||
|   | ||||
| @@ -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)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -69,4 +69,13 @@ public interface CrmProductService { | ||||
|      * @return 产品 | ||||
|      */ | ||||
|     CrmProductDO getProductByCategoryId(Long categoryId); | ||||
|  | ||||
|     /** | ||||
|      * 获得产品列表 | ||||
|      * | ||||
|      * @param ids 产品编号 | ||||
|      * @return 产品列表 | ||||
|      */ | ||||
|     List<CrmProductDO> getProductListByIds(Collection<Long> ids); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -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); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 puhui999
					puhui999