From 8168aef3c7557c9e1361892270a1ebe35dbddba5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 10 十一月 2026 11:42:19 +0800
Subject: [PATCH] refactor(erp): 采购申请与询价比价流程重构

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java |  141 +++++++++++++++--------------------------------
 1 files changed, 45 insertions(+), 96 deletions(-)

diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
index 4c2366e..9ffba24 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
@@ -4,7 +4,6 @@
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 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.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
@@ -30,9 +29,8 @@
 import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
 import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
 import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
+import cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderSourceTypeEnum;
 import cn.iocoder.yudao.module.erp.enums.ErpPurchaseRequestStatusEnum;
-import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
-import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -86,8 +84,6 @@
     @Resource
     private ErpSupplierService supplierService;
     @Resource
-    private SrmSupplierApi srmSupplierApi;
-    @Resource
     private MdmItemApi mdmItemApi;
 
     @Resource
@@ -128,7 +124,7 @@
                 .setStatus(ErpPurchaseRequestStatusEnum.DRAFT.getStatus())
                 .setRequestUserId(userId)
                 .setRequestDeptId(deptId));
-        calculateTotalPrice(purchaseRequest, requestItems);
+        calculateTotalCount(purchaseRequest, requestItems);
         purchaseRequestMapper.insert(purchaseRequest);
 
         // 6. 缁戝畾闄勪欢
@@ -156,7 +152,7 @@
 
         // 4. 鏇存柊鐢宠鍗�
         ErpPurchaseRequestDO updateObj = BeanUtils.toBean(updateReqVO, ErpPurchaseRequestDO.class);
-        calculateTotalPrice(updateObj, requestItems);
+        calculateTotalCount(updateObj, requestItems);
         purchaseRequestMapper.updateById(updateObj);
 
         // 5. 鏇存柊鐢宠鏄庣粏
@@ -182,39 +178,24 @@
             return respVO;
         }
 
-        // 1. 棰勭儹鈥滀緵搴斿晢鍚嶇О/缂栫爜 -> 渚涘簲鍟嗙紪鍙封�濇槧灏勶紙渚涘簲鍟嗕负鍙�夛級
-        Map<String, Long> supplierIdMap = new HashMap<>();
-        CommonResult<List<SrmSupplierRespDTO>> supplierResult = srmSupplierApi.getSupplierSimpleList();
-        if (supplierResult != null && CollUtil.isNotEmpty(supplierResult.getData())) {
-            supplierResult.getData().forEach(supplier -> {
-                if (StrUtil.isNotBlank(supplier.getName())) {
-                    supplierIdMap.putIfAbsent(supplier.getName().trim(), supplier.getId());
-                }
-                if (StrUtil.isNotBlank(supplier.getCode())) {
-                    supplierIdMap.putIfAbsent(supplier.getCode().trim(), supplier.getId());
-                }
-            });
-        }
-
-        // 2. 鎸夆�滈噰璐敵璇峰崟鍙封�濆垎缁�
+        // 1. 鎸夆�滈噰璐敵璇峰崟鍙封�濆垎缁�
         Map<String, List<ErpPurchaseRequestImportExcelVO>> groups = new LinkedHashMap<>();
         for (int i = 0; i < importList.size(); i++) {
             ErpPurchaseRequestImportExcelVO row = importList.get(i);
-            if (row == null || (StrUtil.isBlank(row.getProductCode()) && StrUtil.isBlank(row.getSupplierName())
-                    && StrUtil.isBlank(row.getNo()))) {
+            if (row == null || (StrUtil.isBlank(row.getProductCode()) && StrUtil.isBlank(row.getNo()))) {
                 continue; // 璺宠繃绌鸿
             }
             String key = StrUtil.isNotBlank(row.getNo()) ? row.getNo().trim() : "__row_" + (i + 2);
             groups.computeIfAbsent(key, k -> new ArrayList<>()).add(row);
         }
 
-        // 3. 閫愬紶鐢宠瀵煎叆
+        // 2. 閫愬紶鐢宠瀵煎叆
         for (Map.Entry<String, List<ErpPurchaseRequestImportExcelVO>> entry : groups.entrySet()) {
             List<ErpPurchaseRequestImportExcelVO> rows = entry.getValue();
             String label = StrUtil.isNotBlank(rows.get(0).getNo()) ? rows.get(0).getNo().trim()
                     : "绗� " + entry.getKey().substring("__row_".length()) + " 琛�";
             try {
-                ErpPurchaseRequestDO purchaseRequest = createPurchaseRequestByImport(rows, supplierIdMap);
+                ErpPurchaseRequestDO purchaseRequest = createPurchaseRequestByImport(rows);
                 respVO.getCreateList().add(purchaseRequest.getNo());
             } catch (Exception ex) {
                 respVO.getFailureList().put(label, resolveImportErrorMessage(ex));
@@ -228,21 +209,10 @@
     /**
      * 渚濇嵁瀵煎叆鏁版嵁鍒涘缓涓�寮犻噰璐敵璇凤紙鍚槑缁嗭級銆傜敵璇蜂汉/鐢宠閮ㄩ棬鐢卞綋鍓嶇櫥褰曠敤鎴疯嚜鍔ㄥ~鍏咃紱鐘舵�佷负鈥滄湭鎻愪氦(0)鈥濄��
      */
-    private ErpPurchaseRequestDO createPurchaseRequestByImport(List<ErpPurchaseRequestImportExcelVO> rows,
-                                                              Map<String, Long> supplierIdMap) {
+    private ErpPurchaseRequestDO createPurchaseRequestByImport(List<ErpPurchaseRequestImportExcelVO> rows) {
         ErpPurchaseRequestImportExcelVO head = rows.get(0);
 
-        // 1. 渚涘簲鍟嗭紙鍙�夛級锛氬~浜嗗垯鎸夊悕绉�/缂栫爜鍖归厤骞舵牎楠�
-        Long supplierId = null;
-        if (StrUtil.isNotBlank(head.getSupplierName())) {
-            supplierId = supplierIdMap.get(head.getSupplierName().trim());
-            if (supplierId == null) {
-                throw new IllegalArgumentException("渚涘簲鍟嗕笉瀛樺湪锛�" + head.getSupplierName());
-            }
-            supplierService.validateSupplier(supplierId);
-        }
-
-        // 2. 鏄庣粏
+        // 1. 鏄庣粏
         List<ErpPurchaseRequestSaveReqVO.Item> items = new ArrayList<>();
         for (ErpPurchaseRequestImportExcelVO row : rows) {
             if (StrUtil.isBlank(row.getProductCode())) {
@@ -262,13 +232,8 @@
             ErpPurchaseRequestSaveReqVO.Item itemVO = new ErpPurchaseRequestSaveReqVO.Item();
             itemVO.setProductId(item.getId());
             itemVO.setProductUnitId(item.getUnitMeasureId());
-            // 鍗曚环锛氭湭濉啓鏃跺彇鐗╂枡鐨勯噰璐环
-            itemVO.setProductPrice(row.getProductPrice() != null ? row.getProductPrice()
-                    : (item.getPurchasePrice() != null ? item.getPurchasePrice() : BigDecimal.ZERO));
             itemVO.setCount(row.getCount());
-            itemVO.setTaxPercent(row.getTaxPercent());
             itemVO.setDemandTime(parseImportDate(row.getDemandTime()));
-            itemVO.setQcCheckFlag("鏄�".equals(StrUtil.trim(row.getQcCheckFlag())));
             itemVO.setRemark(row.getRemark());
             items.add(itemVO);
         }
@@ -293,17 +258,15 @@
         // 5. 缁勮涓昏〃锛堢姸鎬佷负鈥滄湭鎻愪氦鈥濓級
         ErpPurchaseRequestDO purchaseRequest = new ErpPurchaseRequestDO();
         purchaseRequest.setNo(no);
-        purchaseRequest.setSupplierId(supplierId);
         purchaseRequest.setRequestTime(parseImportDateTime(head.getRequestTime()));
         purchaseRequest.setRequestReason(head.getRequestReason());
         purchaseRequest.setRemark(head.getRemark());
         purchaseRequest.setStatus(ErpPurchaseRequestStatusEnum.DRAFT.getStatus());
         purchaseRequest.setRequestUserId(userId);
         purchaseRequest.setRequestDeptId(deptId);
-        purchaseRequest.setDepositPrice(BigDecimal.ZERO);
 
         List<ErpPurchaseRequestItemDO> itemDOs = validatePurchaseRequestItems(items);
-        calculateTotalPrice(purchaseRequest, itemDOs);
+        calculateTotalCount(purchaseRequest, itemDOs);
         purchaseRequestMapper.insert(purchaseRequest);
         itemDOs.forEach(item -> item.setRequestId(purchaseRequest.getId()));
         purchaseRequestItemMapper.insertBatch(itemDOs);
@@ -359,30 +322,19 @@
         return StrUtil.blankToDefault(ex.getMessage(), "瀵煎叆澶辫触");
     }
 
-    private void calculateTotalPrice(ErpPurchaseRequestDO purchaseRequest, List<ErpPurchaseRequestItemDO> requestItems) {
+    private void calculateTotalCount(ErpPurchaseRequestDO purchaseRequest, List<ErpPurchaseRequestItemDO> requestItems) {
         purchaseRequest.setTotalCount(getSumValue(requestItems, ErpPurchaseRequestItemDO::getCount, BigDecimal::add));
-        purchaseRequest.setTotalProductPrice(getSumValue(requestItems, ErpPurchaseRequestItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO));
-        purchaseRequest.setTotalTaxPrice(getSumValue(requestItems, ErpPurchaseRequestItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO));
-        // 鍗曚环涓哄惈绋庡崟浠凤細浠风◣鍚堣 = 鍗曚环 * 鏁伴噺锛岀◣棰濆凡鍖呭惈鍦ㄥ崟浠蜂腑锛屼笉鍐嶉澶栧姞绋�
-        purchaseRequest.setTotalPrice(purchaseRequest.getTotalProductPrice());
-        // 璁$畻浼樻儬浠锋牸
-        if (purchaseRequest.getDiscountPercent() == null) {
-            purchaseRequest.setDiscountPercent(BigDecimal.ZERO);
-        }
-        purchaseRequest.setDiscountPrice(MoneyUtils.priceMultiplyPercent(purchaseRequest.getTotalPrice(), purchaseRequest.getDiscountPercent()));
-        purchaseRequest.setTotalPrice(purchaseRequest.getTotalPrice().subtract(purchaseRequest.getDiscountPrice()));
     }
 
     private List<ErpPurchaseRequestItemDO> validatePurchaseRequestItems(List<ErpPurchaseRequestSaveReqVO.Item> list) {
-        return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseRequestItemDO.class, item -> {
-            if (item.getProductPrice() != null && item.getCount() != null) {
-                item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()));
-                if (item.getTaxPercent() != null) {
-                    // 鍗曚环涓哄惈绋庡崟浠凤細绋庨浠庝环绋庡悎璁′腑鍙嶇畻锛岃�屼笉鏄湪鍚堣涓婂啀鍔犵◣
-                    item.setTaxPrice(MoneyUtils.taxPriceIncluded(item.getTotalPrice(), item.getTaxPercent()));
-                }
+        return convertList(list, o -> {
+            ErpPurchaseRequestItemDO item = BeanUtils.toBean(o, ErpPurchaseRequestItemDO.class);
+            // 閲囪喘鐢宠涓嶅啀濉啓鈥滄槸鍚﹁川妫�鈥濓紝榛樿闇�瑕佹潵鏂欐楠岋紝鐢熸垚鍙拌处鍚庡彲鍦ㄥ彴璐︿腑璋冩暣
+            if (item.getQcCheckFlag() == null) {
+                item.setQcCheckFlag(true);
             }
-        }));
+            return item;
+        });
     }
 
     private void updatePurchaseRequestItemList(Long id, List<ErpPurchaseRequestItemDO> newList) {
@@ -538,23 +490,11 @@
         }
 
         // 2. 鏍规嵁瀹℃壒缁撴灉鏇存柊鐘舵��
+        // 瀹℃壒閫氳繃鍚庝笉鑷姩鐢熸垚閲囪喘鍙拌处锛氱敱閲囪喘鍛樺湪鍒楄〃涓喅瀹氥�屽彂璧疯浠枫�嶆垨銆岀洿鎺ョ敓鎴愰噰璐彴璐︺��
         Integer newStatus = convertBpmResultToStatus(bpmResult);
         if (newStatus != null) {
             purchaseRequestMapper.updateById(new ErpPurchaseRequestDO()
                     .setId(id).setStatus(newStatus));
-        }
-
-        // 3. 瀹℃壒閫氳繃涓旀湁渚涘簲鍟嗭紝鑷姩鐢熸垚閲囪喘璁㈠崟
-        if (ErpPurchaseRequestStatusEnum.APPROVE.getStatus().equals(newStatus)
-                && purchaseRequest.getSupplierId() != null
-                && purchaseRequest.getOrderId() == null) {
-            try {
-                Long orderId = doGeneratePurchaseOrder(purchaseRequest);
-                log.info("[updatePurchaseRequestAuditStatus] 閲囪喘鐢宠({}) 鑷姩鐢熸垚閲囪喘璁㈠崟({})", id, orderId);
-            } catch (Exception e) {
-                log.error("[updatePurchaseRequestAuditStatus] 閲囪喘鐢宠({}) 鑷姩鐢熸垚閲囪喘璁㈠崟澶辫触", id, e);
-                // 涓嶆姏鍑哄紓甯革紝閬垮厤褰卞搷鐘舵�佹洿鏂�
-            }
         }
     }
 
@@ -570,15 +510,18 @@
         if (purchaseRequest.getOrderId() != null) {
             throw exception(PURCHASE_REQUEST_ORDER_EXISTS);
         }
-        // 3. 渚涘簲鍟嗕互閲囪喘鐢宠鍗曚负鍑嗭細鐢宠鎻愪氦鏃跺凡缁忛�夎繃渚涘簲鍟嗭紝鐢熸垚璁㈠崟涓嶅啀瑕佹眰閲嶆柊閫夋嫨
-        //    鍏煎鏃ц皟鐢ㄦ柟浠嶆樉寮忎紶 supplierId 鐨勬儏鍐碉紝浼犱簡鍒欎互浼犲叆鍊间负鍑�
-        Long targetSupplierId = supplierId != null ? supplierId : purchaseRequest.getSupplierId();
-        if (targetSupplierId == null) {
-            throw exception(PURCHASE_REQUEST_SUPPLIER_REQUIRED);
+        // 3. 宸插彂璧疯浠风殑鐢宠锛屽繀椤荤瓑璇环纭锛堢‘瀹氫环鏍硷級鍚庢墠鑳界敓鎴愰噰璐彴璐�
+        if (purchaseRequest.getInquiryId() != null) {
+            throw exception(PURCHASE_REQUEST_INQUIRY_EXISTS);
         }
-        supplierService.validateSupplier(targetSupplierId);
+        // 4. 渚涘簲鍟嗕笉鍦ㄨ繖閲岀‘瀹氾細閲囪喘鐢宠鏈韩涓嶅~渚涘簲鍟嗭紝鐩存帴鐢熸垚鍙拌处鏃朵篃鍏佽涓虹┖锛�
+        //    鐢遍噰璐憳鍦ㄩ噰璐彴璐﹁崏绋块噷琛ュ厖渚涘簲鍟嗕笌浠锋牸鍚庡啀鎻愪氦瀹℃壒
+        Long targetSupplierId = supplierId != null ? supplierId : purchaseRequest.getSupplierId();
+        if (targetSupplierId != null) {
+            supplierService.validateSupplier(targetSupplierId);
+        }
 
-        // 4. 璁剧疆渚涘簲鍟嗗苟鐢熸垚璁㈠崟
+        // 5. 鐢熸垚璁㈠崟锛坰upplierId 鍙负绌猴紝鐣欏緟鍙拌处琛ュ厖锛�
         purchaseRequest.setSupplierId(targetSupplierId);
         return doGeneratePurchaseOrder(purchaseRequest);
     }
@@ -611,12 +554,17 @@
         purchaseOrder.setSupplierId(purchaseRequest.getSupplierId());
         purchaseOrder.setOrderTime(purchaseRequest.getRequestTime());
         purchaseOrder.setTotalCount(purchaseRequest.getTotalCount());
-        purchaseOrder.setTotalPrice(purchaseRequest.getTotalPrice());
-        purchaseOrder.setTotalProductPrice(purchaseRequest.getTotalProductPrice());
-        purchaseOrder.setTotalTaxPrice(purchaseRequest.getTotalTaxPrice());
-        purchaseOrder.setDiscountPercent(purchaseRequest.getDiscountPercent());
-        purchaseOrder.setDiscountPrice(purchaseRequest.getDiscountPrice());
-        purchaseOrder.setDepositPrice(purchaseRequest.getDepositPrice() != null ? purchaseRequest.getDepositPrice() : BigDecimal.ZERO);
+        // 閲囪喘鐢宠涓嶅惈浠锋牸锛氬彴璐﹀厛浠� 0 閲戦鐢熸垚鑽夌锛岀敱閲囪喘鍛樺湪鍙拌处涓ˉ褰曞崟浠�/绋庣巼鍚庡啀鎻愪氦瀹℃壒
+        purchaseOrder.setTotalPrice(BigDecimal.ZERO);
+        purchaseOrder.setTotalProductPrice(BigDecimal.ZERO);
+        purchaseOrder.setTotalTaxPrice(BigDecimal.ZERO);
+        purchaseOrder.setDiscountPercent(BigDecimal.ZERO);
+        purchaseOrder.setDiscountPrice(BigDecimal.ZERO);
+        purchaseOrder.setDepositPrice(BigDecimal.ZERO);
+        purchaseOrder.setSourceType(ErpPurchaseOrderSourceTypeEnum.PURCHASE_REQUEST.getType());
+        purchaseOrder.setSourceId(purchaseRequest.getId());
+        purchaseOrder.setSourceNo(purchaseRequest.getNo());
+        purchaseOrder.setPurchaseRequestId(purchaseRequest.getId());
         purchaseOrder.setRemark(purchaseRequest.getRemark());
         purchaseOrder.setInCount(BigDecimal.ZERO);
         purchaseOrder.setInStatus(0);
@@ -629,11 +577,12 @@
             orderItem.setRequestItemId(item.getId()); // 鍏宠仈閲囪喘鐢宠鏄庣粏
             orderItem.setProductId(item.getProductId());
             orderItem.setProductUnitId(item.getProductUnitId());
-            orderItem.setProductPrice(item.getProductPrice());
+            // 鍗曚环/绋庣巼寰呴噰璐憳鍦ㄥ彴璐︿腑琛ュ綍锛屽厛鎸� 0 淇濆瓨
+            orderItem.setProductPrice(BigDecimal.ZERO);
             orderItem.setCount(item.getCount());
-            orderItem.setTotalPrice(item.getTotalPrice());
-            orderItem.setTaxPercent(item.getTaxPercent());
-            orderItem.setTaxPrice(item.getTaxPrice());
+            orderItem.setTotalPrice(BigDecimal.ZERO);
+            orderItem.setTaxPercent(BigDecimal.ZERO);
+            orderItem.setTaxPrice(BigDecimal.ZERO);
             orderItem.setRemark(item.getRemark());
             orderItem.setInCount(BigDecimal.ZERO);
             // 鏄惁璐ㄦ涓庨噰璐敵璇蜂繚鎸佷竴鑷达細鏄庣粏鏈槑纭爣璁版椂榛樿涓恒�屾槸銆嶏紙鍘嗗彶鐢宠鍗曞彲鑳戒负 null锛�

--
Gitblit v1.9.3