2026-07-02 fce7a8df22ab7b5b0be0fb5151c40abbfbab6be8
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -34,6 +34,8 @@
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction;
@@ -49,6 +51,8 @@
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
@@ -100,6 +104,8 @@
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private ErpSaleOrderApi saleOrderApi;
    @Resource
    private MdmItemApi mdmItemApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -213,11 +219,19 @@
    }
    private List<CrmContractProductDO> validateContractProducts(List<CrmContractSaveReqVO.Product> list) {
        // 1. 校验产品存在
        productService.validProductList(convertSet(list, CrmContractSaveReqVO.Product::getProductId));
        // 1. 校验物料存在且启用
        Set<Long> itemIds = convertSet(list, CrmContractSaveReqVO.Product::getItemId);
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(itemIds);
        // 2. 转化为 CrmContractProductDO 列表
        return convertList(list, o -> BeanUtils.toBean(o, CrmContractProductDO.class,
                item -> item.setTotalPrice(MoneyUtils.priceMultiply(item.getContractPrice(), item.getCount()))));
        return convertList(list, o -> BeanUtils.toBean(o, CrmContractProductDO.class, item -> {
            MdmItemRespDTO mdmItem = itemMap.get(item.getItemId());
            if (mdmItem == null) {
                throw exception(PRODUCT_NOT_EXISTS);
            }
            item.setItemUnitId(mdmItem.getUnitMeasureId());
            item.setItemPrice(mdmItem.getSalesPrice());
            item.setTotalPrice(MoneyUtils.priceMultiply(item.getContractPrice(), item.getCount()));
        }));
    }
    private void calculateTotalPrice(CrmContractDO contract, List<CrmContractProductDO> contractProducts) {
@@ -455,7 +469,7 @@
        List<ErpSaleOrderCreateReqDTO.Item> items = contractProducts.stream()
                .map(cp -> {
                    ErpSaleOrderCreateReqDTO.Item item = new ErpSaleOrderCreateReqDTO.Item();
                    item.setProductId(cp.getProductId());
                    item.setProductId(cp.getItemId());
                    item.setProductPrice(cp.getContractPrice());
                    item.setCount(cp.getCount());
                    return item;