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.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")

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.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;
}
}

View File

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

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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 @商机待定如果状态发生变化插入商机状态变更记录表

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.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));
}
}

View File

@ -69,4 +69,13 @@ public interface CrmProductService {
* @return 产品
*/
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));
}
@Override
public List<CrmProductDO> getProductListByIds(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return Collections.emptyList();
}
return productMapper.selectListByIds(ids);
}
}