From 6fa82a1ad7c3ae061ef499f0d0806a16846e122b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 10 十一月 2026 16:55:02 +0800
Subject: [PATCH] feat(mes): 来料检验与不合格退货闭环优化

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcPurchaseReturnService.java |   48 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcPurchaseReturnService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcPurchaseReturnService.java
index 1edbd1b..2d2c37d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcPurchaseReturnService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcPurchaseReturnService.java
@@ -5,8 +5,15 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcNcrDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcPurchaseReturnDO;
+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.qc.ncr.MesQcPurchaseReturnMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.qc.ncr.MesQcPurchaseConcessionMapper;
+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.MesWmReturnVendorStatusEnum;
+import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
+import cn.hutool.core.util.StrUtil;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -16,10 +23,16 @@
 
 @Service
 public class MesQcPurchaseReturnService {
+    /** 閲囪喘閫�璐у崟缂栫爜瑙勫垯锛圡esMdAutoCodeRule 涓殑 code锛� */
+    private static final String RETURN_VENDOR_CODE_RULE = "WM_RETURN_VENDOR_CODE";
+
     @Resource private MesQcNcrPurchaseSourceValidator sourceValidator;
     @Resource private MesQcPurchaseReturnMapper mapper;
     @Resource private MesQcPurchaseConcessionMapper concessionMapper;
     @Resource private MesQcArrivalDispositionService arrivalDispositionService;
+    @Resource private MesWmReturnVendorMapper returnVendorMapper;
+    @Resource private MesWmReturnVendorLineMapper returnVendorLineMapper;
+    @Resource private MesMdAutoCodeRecordService autoCodeRecordService;
 
     /** 蹇呴』鐢卞凡閿佸畾 NCR 鐨勫缃簨鍔¤皟鐢ㄣ�� */
     @Transactional(rollbackFor = Exception.class)
@@ -32,8 +45,35 @@
         if (source.notice().getVendorId() == null || source.notice().getPurchaseOrderId() == null
                 || source.line().getPurchaseOrderItemId() == null)
             throw new ServiceException(400, "鍒拌揣鍗曠己灏戜緵搴斿晢銆侀噰璐鍗曟垨閲囪喘鏄庣粏锛屾棤娉曠敓鎴愬彲杩芥函閫�璐у崟");
+
+        // 1. 鐢熸垚銆屼緵搴斿晢閫�璐у崟銆嶏細涓嶅悎鏍煎搧浠庢湭鍏ュ簱锛屼笉浜х敓搴撳瓨鍑哄簱锛屼篃鏃犻渶鎷h揣涓庡鎵癸紝
+        //    鐩存帴浠ュ凡瀹屾垚鐘舵�佽惤鍒伴噰璐粨搴�-閲囪喘閫�璐у垪琛ㄤ腑锛屼緵浠撳簱/閲囪喘杩芥函骞舵寜瀹炵墿閫�鍥炰緵搴斿晢銆�
+        String code = autoCodeRecordService.generateAutoCode(RETURN_VENDOR_CODE_RULE, null);
+        MesWmReturnVendorDO vendorReturn = new MesWmReturnVendorDO();
+        vendorReturn.setCode(code);
+        vendorReturn.setName("鏉ユ枡涓嶅悎鏍奸��璐�-" + ncr.getCode());
+        vendorReturn.setPurchaseOrderId(source.notice().getPurchaseOrderId());
+        vendorReturn.setPurchaseOrderCode(source.notice().getPurchaseOrderCode());
+        vendorReturn.setContractNo(source.notice().getContractNo());
+        vendorReturn.setVendorId(source.notice().getVendorId());
+        vendorReturn.setReturnDate(LocalDateTime.now());
+        vendorReturn.setReturnReason("鏉ユ枡妫�楠屼笉鍚堟牸");
+        vendorReturn.setStatus(MesWmReturnVendorStatusEnum.FINISHED.getStatus());
+        vendorReturn.setRemark("鐢辨潵鏂欎笉鍚堟牸鍗� " + ncr.getCode() + "锛堟潵鏂欐楠� " + source.iqc().getCode()
+                + "锛夐��璐у缃嚜鍔ㄧ敓鎴愶紱涓嶅悎鏍煎搧鏈叆搴擄紝鏃犻渶鎷h揣锛屽崟鎹洿鎺ュ畬鎴愩��");
+        returnVendorMapper.insert(vendorReturn);
+        MesWmReturnVendorLineDO vendorReturnLine = new MesWmReturnVendorLineDO();
+        vendorReturnLine.setReturnId(vendorReturn.getId());
+        vendorReturnLine.setItemId(ncr.getItemId());
+        vendorReturnLine.setQuantity(ncr.getUnqualifiedQuantity());
+        vendorReturnLine.setBatchCode(StrUtil.blankToDefault(source.iqc().getVendorBatch(), null));
+        vendorReturnLine.setRemark("鏉ユ枡妫�楠� " + source.iqc().getCode() + " 涓嶅悎鏍兼暟閲�");
+        returnVendorLineMapper.insert(vendorReturnLine);
+
+        // 2. 璁板綍璐ㄩ噺渚у缃彴璐︼紙涓庨��璐у崟鍚屽彿锛夛紝鍥犻��璐у崟宸茬洿鎺ュ畬鎴愶紝杩欓噷鍚屾鏍囪涓哄凡纭锛�
+        //    涓嶅悎鏍煎崟鍏抽棴鏃舵牎楠岀殑姝f槸杩欐潯璁板綍銆�
         MesQcPurchaseReturnDO doc = new MesQcPurchaseReturnDO();
-        doc.setCode("NCR-RET-" + ncr.getId());
+        doc.setCode(code);
         doc.setNcrId(ncr.getId());
         doc.setIqcId(ncr.getQcId());
         doc.setNoticeId(source.notice().getId());
@@ -44,8 +84,12 @@
         doc.setItemId(ncr.getItemId());
         doc.setVendorBatch(source.iqc().getVendorBatch());
         doc.setQuantity(ncr.getUnqualifiedQuantity());
-        doc.setStatus(0);
+        doc.setStatus(1);
+        doc.setConfirmedBy(getLoginUserId());
+        doc.setConfirmedAt(LocalDateTime.now());
+        doc.setConfirmationRemark("闅忎笉鍚堟牸澶勭疆鑷姩鐢熸垚閲囪喘閫�璐у崟 " + code + "锛屾湭鍙戠敓搴撳瓨鍑哄簱");
         mapper.insert(doc);
+        arrivalDispositionService.refresh(source.notice().getId());
         return doc;
     }
 

--
Gitblit v1.9.3