From fce7a8df22ab7b5b0be0fb5151c40abbfbab6be8 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 02 七月 2026 10:49:14 +0800
Subject: [PATCH] 1.修复编译问题

---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java |   89 ++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 85 insertions(+), 4 deletions(-)

diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
index d25d7c0..1ce3f41 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -31,6 +31,11 @@
 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
 import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
 import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService;
+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;
@@ -46,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.*;
@@ -95,6 +102,10 @@
     private AdminUserApi adminUserApi;
     @Resource
     private BpmProcessInstanceApi bpmProcessInstanceApi;
+    @Resource
+    private ErpSaleOrderApi saleOrderApi;
+    @Resource
+    private MdmItemApi mdmItemApi;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -208,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) {
@@ -413,4 +432,66 @@
         return contractMapper.selectListByCustomerIdOwnerUserId(customerId, ownerUserId);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = CRM_CONTRACT_TYPE, subType = "鐢熸垚閿�鍞鍗�", bizNo = "{{#id}}",
+            success = "鍚堝悓銆恵{#contractName}}銆戠敓鎴愰攢鍞鍗曘�恵{#orderNo}}銆戞垚鍔�")
+    @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.WRITE)
+    public Long generateSaleOrder(Long id, Long userId) {
+        // 1. 鏍¢獙鍚堝悓瀛樺湪涓斿凡瀹℃壒閫氳繃
+        CrmContractDO contract = validateContractExists(id);
+        if (!CrmAuditStatusEnum.APPROVE.getStatus().equals(contract.getAuditStatus())) {
+            throw exception(CONTRACT_GENERATE_ORDER_FAIL_NOT_APPROVE);
+        }
+        // 2. 鏍¢獙鏄惁宸茬敓鎴愰攢鍞鍗�
+        ErpSaleOrderRespDTO existOrder = saleOrderApi.getSaleOrderByContractId(id).getCheckedData();
+        if (existOrder != null) {
+            throw exception(CONTRACT_GENERATE_ORDER_FAIL_EXISTS_ORDER, existOrder.getNo());
+        }
+
+        // 3. 鑾峰彇鍚堝悓浜у搧鍒楄〃
+        List<CrmContractProductDO> contractProducts = contractProductMapper.selectListByContractId(id);
+        if (CollUtil.isEmpty(contractProducts)) {
+            throw exception(CONTRACT_GENERATE_ORDER_FAIL_NO_PRODUCT);
+        }
+
+        // 4. 鏋勫缓閿�鍞鍗曞垱寤鸿姹�
+        ErpSaleOrderCreateReqDTO createReqDTO = new ErpSaleOrderCreateReqDTO();
+        createReqDTO.setCustomerId(contract.getCustomerId());
+        createReqDTO.setContractId(contract.getId());
+        createReqDTO.setContractNo(contract.getNo());
+        createReqDTO.setSaleUserId(contract.getOwnerUserId());
+        createReqDTO.setOrderTime(LocalDateTime.now().toString());
+        createReqDTO.setDiscountPercent(contract.getDiscountPercent());
+        createReqDTO.setRemark("鐢卞悎鍚屻��" + contract.getNo() + "銆戣嚜鍔ㄧ敓鎴�");
+
+        // 5. 鏋勫缓璁㈠崟椤�
+        List<ErpSaleOrderCreateReqDTO.Item> items = contractProducts.stream()
+                .map(cp -> {
+                    ErpSaleOrderCreateReqDTO.Item item = new ErpSaleOrderCreateReqDTO.Item();
+                    item.setProductId(cp.getItemId());
+                    item.setProductPrice(cp.getContractPrice());
+                    item.setCount(cp.getCount());
+                    return item;
+                })
+                .toList();
+        createReqDTO.setItems(items);
+
+        // 6. 鍒涘缓閿�鍞鍗�
+        Long orderId = saleOrderApi.createSaleOrder(createReqDTO).getCheckedData();
+        ErpSaleOrderRespDTO order = saleOrderApi.getSaleOrder(orderId).getCheckedData();
+
+        // 7. 鏇存柊鍚堝悓鍏宠仈璁㈠崟淇℃伅
+        contractMapper.updateById(new CrmContractDO()
+                .setId(id)
+                .setOrderId(orderId)
+                .setOrderNo(order.getNo()));
+
+        // 8. 璁板綍鎿嶄綔鏃ュ織
+        LogRecordContext.putVariable("contractName", contract.getName());
+        LogRecordContext.putVariable("orderNo", order.getNo());
+
+        return orderId;
+    }
+
 }

--
Gitblit v1.9.3