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

This commit is contained in:
puhui999 2024-02-03 14:08:06 +08:00
parent 59e6f23788
commit 6a63f2f078
10 changed files with 110 additions and 29 deletions

View File

@ -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.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*; 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.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.contract.CrmContractDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; 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.contract.CrmContractService;
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; 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.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -32,8 +36,8 @@ import java.util.Map;
import java.util.stream.Stream; import java.util.stream.Stream;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 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.*;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 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.operatelog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@ -47,6 +51,10 @@ public class CrmContractController {
private CrmContractService contractService; private CrmContractService contractService;
@Resource @Resource
private CrmCustomerService customerService; private CrmCustomerService customerService;
@Resource
private CrmBusinessProductService businessProductService;
@Resource
private CrmProductService productService;
@Resource @Resource
private AdminUserApi adminUserApi; private AdminUserApi adminUserApi;
@ -81,7 +89,18 @@ public class CrmContractController {
@PreAuthorize("@ss.hasPermission('crm:contract:query')") @PreAuthorize("@ss.hasPermission('crm:contract:query')")
public CommonResult<CrmContractRespVO> getContract(@RequestParam("id") Long id) { public CommonResult<CrmContractRespVO> getContract(@RequestParam("id") Long id) {
CrmContractDO contract = contractService.getContract(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") @GetMapping("/page")

View File

@ -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.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; 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; 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("审批状态") @ExcelProperty("审批状态")
private Integer auditStatus; 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;
}
} }

View File

@ -93,7 +93,7 @@ public class CrmContractSaveReqVO {
@Schema(description = "产品列表") @Schema(description = "产品列表")
private List<CrmContractProductItem> productItems; private List<CrmContractProductItem> productItems;
@Schema(description = "商品属性") @Schema(description = "产品列表")
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor

View File

@ -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.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 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.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO;
import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO; 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 cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
/** /**
* CRM 产品 Mapper * CRM 产品 Mapper
* *
@ -34,4 +38,8 @@ public interface CrmProductMapper extends BaseMapperX<CrmProductDO> {
return selectOne(CrmProductDO::getNo, no); return selectOne(CrmProductDO::getNo, no);
} }
default List<CrmProductDO> selectListByIds(Collection<Long> ids) {
return selectList(new LambdaQueryWrapperX<CrmProductDO>().in(CrmProductDO::getId, ids));
}
} }

View File

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

View File

@ -22,33 +22,33 @@ public class CrmBusinessProductServiceImpl implements CrmBusinessProductService
private CrmBusinessProductMapper businessProductMapper; private CrmBusinessProductMapper businessProductMapper;
@Override @Override
public void insertBatch(List<CrmBusinessProductDO> list) { public void createBusinessProductBatch(List<CrmBusinessProductDO> list) {
businessProductMapper.insertBatch(list); businessProductMapper.insertBatch(list);
} }
@Override @Override
public List<CrmBusinessProductDO> selectListByBusinessId(Long businessId) { public List<CrmBusinessProductDO> getBusinessProductListByBusinessId(Long businessId) {
return businessProductMapper.selectList(CrmBusinessProductDO::getBusinessId, businessId); return businessProductMapper.selectList(CrmBusinessProductDO::getBusinessId, businessId);
} }
@Override @Override
public void updateBatch(List<CrmBusinessProductDO> list) { public void updateBusinessProductBatch(List<CrmBusinessProductDO> list) {
businessProductMapper.updateBatch(list); businessProductMapper.updateBatch(list);
} }
// TODO @lzxhqs这个方法可以直接调用 deleteList 方法然后传递 ids 就好了 // TODO @lzxhqs这个方法可以直接调用 deleteList 方法然后传递 ids 就好了
@Override @Override
public void deleteBatch(List<CrmBusinessProductDO> list) { public void deleteBusinessProductBatch(List<CrmBusinessProductDO> list) {
businessProductMapper.deleteBatchIds(CollectionUtils.convertList(list, CrmBusinessProductDO::getId)); businessProductMapper.deleteBatchIds(CollectionUtils.convertList(list, CrmBusinessProductDO::getId));
} }
@Override @Override
public void deleteByBusinessId(Long businessId) { public void deleteBusinessProductByBusinessId(Long businessId) {
businessProductMapper.deleteByBusinessId(businessId); businessProductMapper.deleteByBusinessId(businessId);
} }
@Override @Override
public List<CrmBusinessProductDO> selectListByContractId(Long contractId) { public List<CrmBusinessProductDO> getBusinessProductListByContractId(Long contractId) {
return businessProductMapper.selectList(CrmBusinessProductDO::getContractId, contractId); return businessProductMapper.selectList(CrmBusinessProductDO::getContractId, contractId);
} }

View File

@ -120,20 +120,20 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
CrmBusinessProductConvert.INSTANCE.convert(product).setBusinessId(businessId)); CrmBusinessProductConvert.INSTANCE.convert(product).setBusinessId(businessId));
if (Boolean.TRUE.equals(updateFlag)) { if (Boolean.TRUE.equals(updateFlag)) {
// 根据商机 id从商机产品关联表中获取已存在的数据集合 // 根据商机 id从商机产品关联表中获取已存在的数据集合
List<CrmBusinessProductDO> oldProducts = businessProductService.selectListByBusinessId(businessId); List<CrmBusinessProductDO> oldProducts = businessProductService.getBusinessProductListByBusinessId(businessId);
List<List<CrmBusinessProductDO>> diffList = CollectionUtils.diffList(oldProducts, list, (oldValue, newValue) -> List<List<CrmBusinessProductDO>> diffList = CollectionUtils.diffList(oldProducts, list, (oldValue, newValue) ->
ObjectUtil.equal(oldValue.getProductId(), newValue.getProductId())); ObjectUtil.equal(oldValue.getProductId(), newValue.getProductId()));
if (CollUtil.isNotEmpty(diffList.getFirst())) { if (CollUtil.isNotEmpty(diffList.getFirst())) {
businessProductService.insertBatch(diffList.getFirst()); businessProductService.createBusinessProductBatch(diffList.getFirst());
} }
if (CollUtil.isNotEmpty(diffList.get(1))) { if (CollUtil.isNotEmpty(diffList.get(1))) {
businessProductService.updateBatch(diffList.get(1)); businessProductService.updateBusinessProductBatch(diffList.get(1));
} }
if (CollUtil.isNotEmpty(diffList.get(2))) { if (CollUtil.isNotEmpty(diffList.get(2))) {
businessProductService.deleteBatch(diffList.get(2)); businessProductService.deleteBusinessProductBatch(diffList.get(2));
} }
} else { } else {
businessProductService.insertBatch(list); businessProductService.createBusinessProductBatch(list);
} }
} }
@ -154,7 +154,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
if (CollUtil.isNotEmpty(updateReqVO.getProducts())) { if (CollUtil.isNotEmpty(updateReqVO.getProducts())) {
createBusinessProducts(updateReqVO.getProducts(), updateReqVO.getId(), true); createBusinessProducts(updateReqVO.getProducts(), updateReqVO.getId(), true);
} else { } else {
businessProductService.deleteByBusinessId(updateReqVO.getId()); businessProductService.deleteBusinessProductByBusinessId(updateReqVO.getId());
} }
// TODO @商机待定如果状态发生变化插入商机状态变更记录表 // TODO @商机待定如果状态发生变化插入商机状态变更记录表

View File

@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; 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.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.listener.dto.BpmResultListenerRespDTO;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
@ -91,7 +92,8 @@ public class CrmContractServiceImpl implements CrmContractService {
// 1.2 插入商机关联商品 // 1.2 插入商机关联商品
if (CollUtil.isNotEmpty(createReqVO.getProductItems())) { // 如果有的话 if (CollUtil.isNotEmpty(createReqVO.getProductItems())) { // 如果有的话
List<CrmBusinessProductDO> businessProduct = convertBusinessProductList(createReqVO, contract.getId()); List<CrmBusinessProductDO> businessProduct = convertBusinessProductList(createReqVO, contract.getId());
businessProductService.insertBatch(businessProduct); businessProductService.createBusinessProductBatch(businessProduct);
// 更新合同商品总金额
} }
// 2. 创建数据权限 // 2. 创建数据权限
@ -113,8 +115,8 @@ public class CrmContractServiceImpl implements CrmContractService {
Assert.notNull(updateReqVO.getId(), "合同编号不能为空"); Assert.notNull(updateReqVO.getId(), "合同编号不能为空");
CrmContractDO contract = validateContractExists(updateReqVO.getId()); CrmContractDO contract = validateContractExists(updateReqVO.getId());
// 只有草稿审批中可以编辑 // 只有草稿审批中可以编辑
if (ObjUtil.notEqual(contract.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus()) || if (!ObjectUtils.equalsAny(contract.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus(),
ObjUtil.notEqual(contract.getAuditStatus(), CrmAuditStatusEnum.PROCESS.getStatus())) { CrmAuditStatusEnum.PROCESS.getStatus())) {
throw exception(CONTRACT_UPDATE_FAIL_EDITING_PROHIBITED); throw exception(CONTRACT_UPDATE_FAIL_EDITING_PROHIBITED);
} }
validateRelationDataExists(updateReqVO); validateRelationDataExists(updateReqVO);
@ -136,7 +138,7 @@ public class CrmContractServiceImpl implements CrmContractService {
return; return;
} }
List<CrmBusinessProductDO> newProductList = convertBusinessProductList(updateReqVO, contractId); 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) -> { List<List<CrmBusinessProductDO>> diffList = diffList(oldProductList, newProductList, (oldObj, newObj) -> {
if (ObjUtil.notEqual(oldObj.getProductId(), newObj.getProductId())) { if (ObjUtil.notEqual(oldObj.getProductId(), newObj.getProductId())) {
return false; return false;
@ -145,13 +147,13 @@ public class CrmContractServiceImpl implements CrmContractService {
return true; return true;
}); });
if (CollUtil.isNotEmpty(diffList.getFirst())) { if (CollUtil.isNotEmpty(diffList.getFirst())) {
businessProductService.insertBatch(diffList.getFirst()); businessProductService.createBusinessProductBatch(diffList.getFirst());
} }
if (CollUtil.isNotEmpty(diffList.get(1))) { if (CollUtil.isNotEmpty(diffList.get(1))) {
businessProductService.updateBatch(diffList.get(1)); businessProductService.updateBusinessProductBatch(diffList.get(1));
} }
if (CollUtil.isNotEmpty(diffList.get(2))) { if (CollUtil.isNotEmpty(diffList.get(2))) {
businessProductService.deleteBatch(diffList.get(2)); businessProductService.deleteBusinessProductBatch(diffList.get(2));
} }
} }

View File

@ -69,4 +69,13 @@ public interface CrmProductService {
* @return 产品 * @return 产品
*/ */
CrmProductDO getProductByCategoryId(Long categoryId); CrmProductDO getProductByCategoryId(Long categoryId);
/**
* 获得产品列表
*
* @param ids 产品编号
* @return 产品列表
*/
List<CrmProductDO> getProductListByIds(Collection<Long> ids);
} }

View File

@ -155,4 +155,12 @@ public class CrmProductServiceImpl implements CrmProductService {
return productMapper.selectOne(new LambdaQueryWrapper<CrmProductDO>().eq(CrmProductDO::getCategoryId, categoryId)); 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);
}
} }