From 70ea74cfb981f812bfa4e3ef91843c5ad93f7b27 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 04 十一月 2026 17:32:49 +0800
Subject: [PATCH] feat(erp): 采购台账改造与采购退货增强

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java |   73 ++++++++++++++++++++++++++++++++++++
 1 files changed, 73 insertions(+), 0 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
index d5bc3c3..b085553 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
@@ -9,7 +9,11 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorMapper;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum;
 import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
 import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
@@ -28,7 +32,9 @@
 import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@@ -46,6 +52,11 @@
 
     @Resource
     private MesWmArrivalNoticeLineService arrivalNoticeLineService;
+
+    @Resource
+    private MesWmReturnVendorMapper returnVendorMapper;
+    @Resource
+    private MesWmReturnVendorLineMapper returnVendorLineMapper;
 
     @Resource
     private SrmSupplierApi srmSupplierApi;
@@ -371,6 +382,68 @@
         return notice.getId();
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createReplacementArrivalNotice(Long returnVendorId) {
+        // 1. 鏍¢獙閫�璐у崟
+        MesWmReturnVendorDO returnVendor = returnVendorMapper.selectById(returnVendorId);
+        if (returnVendor == null) {
+            throw exception(WM_RETURN_VENDOR_NOT_EXISTS);
+        }
+        if (returnVendor.getPurchaseOrderId() == null) {
+            throw exception(WM_RETURN_VENDOR_PURCHASE_ORDER_REQUIRED);
+        }
+        List<MesWmReturnVendorLineDO> returnLines = returnVendorLineMapper.selectListByReturnId(returnVendorId);
+        if (CollUtil.isEmpty(returnLines)) {
+            throw exception(WM_RETURN_VENDOR_NO_LINE);
+        }
+
+        // 2. 鑾峰彇閲囪喘璁㈠崟鏄庣粏锛岀敤浜庢寜鐗╂枡鍖归厤閲囪喘璁㈠崟鏄庣粏缂栧彿锛堜繚璇佸叆搴撳悗鑳藉洖鍐欏叆搴�/閫�璐ф暟閲忥級
+        Map<Long, Long> purchaseOrderItemIdMap = new HashMap<>();
+        List<ErpPurchaseOrderItemRespDTO> orderItems = purchaseOrderApi
+                .getPurchaseOrderItemList(returnVendor.getPurchaseOrderId()).getCheckedData();
+        if (CollUtil.isNotEmpty(orderItems)) {
+            orderItems.stream()
+                    .filter(item -> item.getProductId() != null)
+                    .forEach(item -> purchaseOrderItemIdMap.putIfAbsent(item.getProductId(), item.getId()));
+        }
+
+        // 3. 鍒涘缓鍒拌揣閫氱煡鍗曚富琛紝鐘舵�佺洿鎺ョ疆涓哄緟璐ㄦ
+        MesWmArrivalNoticeDO notice = new MesWmArrivalNoticeDO();
+        notice.setCode(generateArrivalNoticeCode());
+        notice.setName(returnVendor.getCode() + "鎹㈣揣鍒拌揣");
+        notice.setPurchaseOrderId(returnVendor.getPurchaseOrderId());
+        notice.setPurchaseOrderCode(returnVendor.getPurchaseOrderCode());
+        notice.setVendorId(returnVendor.getVendorId());
+        notice.setArrivalDate(java.time.LocalDateTime.now());
+        notice.setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus());
+        notice.setRemark("渚涘簲鍟嗛��璐у崟[" + returnVendor.getCode() + "]鎹㈣揣閲嶆柊鍏ュ簱锛屽悎鍚屽彿["
+                + returnVendor.getContractNo() + "]");
+        arrivalNoticeMapper.insert(notice);
+
+        // 4. 閬嶅巻閫�璐ц鍒涘缓鍒拌揣閫氱煡鍗曡锛屽叏閮ㄦ爣璁伴渶瑕佽川妫�
+        for (MesWmReturnVendorLineDO returnLine : returnLines) {
+            MesWmArrivalNoticeLineDO line = new MesWmArrivalNoticeLineDO();
+            line.setNoticeId(notice.getId());
+            line.setPurchaseOrderItemId(purchaseOrderItemIdMap.get(returnLine.getItemId()));
+            line.setItemId(returnLine.getItemId());
+            line.setArrivalQuantity(returnLine.getQuantity());
+            line.setIqcCheckFlag(true);
+            arrivalNoticeLineService.createArrivalNoticeLineFromPurchaseOrderItem(line);
+        }
+
+        // 5. 閫愯鑷姩鍒涘缓 IQC 妫�楠屽崟
+        List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(notice.getId());
+        for (MesWmArrivalNoticeLineDO line : lines) {
+            Long iqcId = iqcService.createIqcFromArrivalNotice(
+                    notice.getId(), line, notice.getCode(), notice.getVendorId());
+            arrivalNoticeLineService.updateArrivalNoticeLineIqcId(line.getId(), iqcId);
+            log.info("[createReplacementArrivalNotice][鎹㈣揣鍒拌揣閫氱煡鍗�({}) 琛�({}) 鑷姩鍒涘缓 IQC 妫�楠屽崟({})]",
+                    notice.getId(), line.getId(), iqcId);
+        }
+        return notice.getId();
+    }
+
     /**
      * 鐢熸垚鍒拌揣閫氱煡鍗曠紪鐮�
      */

--
Gitblit v1.9.3