From eee03bbfea8b15d1a56ab63bd09a35c6c861c4cb Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 09 十一月 2026 13:01:08 +0800
Subject: [PATCH] feat(mes): 不合格品处置联动入库与生产订单

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java |   32 ++++++++++++++++++++++++++++++--
 1 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
index 05ece24..ee084d0 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -28,6 +28,7 @@
 import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderMapper;
 import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
 import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
+import cn.iocoder.yudao.module.erp.enums.ErpSaleTypeEnum;
 import cn.iocoder.yudao.module.erp.api.sale.enums.ErpSaleOrderOutStatusEnum;
 import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService;
 import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
@@ -127,6 +128,8 @@
         List<ErpSaleOrderItemDO> saleOrderItems = validateSaleOrderItems(createReqVO.getItems());
         // 1.2 鏍¢獙瀹㈡埛锛堜娇鐢� CRM 瀹㈡埛 API锛�
         customerApi.validateCustomer(createReqVO.getCustomerId());
+        // 1.2.1 鏍¢獙閿�鍞被鍨�
+        validateSaleType(createReqVO.getSaleType());
         // 1.3 鏍¢獙缁撶畻璐︽埛
         if (createReqVO.getAccountId() != null) {
             accountService.validateAccount(createReqVO.getAccountId());
@@ -169,6 +172,8 @@
         }
         // 1.3 鏍¢獙瀹㈡埛锛堜娇鐢� CRM 瀹㈡埛 API锛�
         customerApi.validateCustomer(updateReqVO.getCustomerId());
+        // 1.3.1 鏍¢獙閿�鍞被鍨�
+        validateSaleType(updateReqVO.getSaleType());
         // 1.3 鏍¢獙缁撶畻璐︽埛
         if (updateReqVO.getAccountId() != null) {
             accountService.validateAccount(updateReqVO.getAccountId());
@@ -327,6 +332,12 @@
         return saleOrder;
     }
 
+    private void validateSaleType(Integer saleType) {
+        if (!ErpSaleTypeEnum.isValid(saleType)) {
+            throw exception(SALE_ORDER_SALE_TYPE_INVALID, saleType);
+        }
+    }
+
     /**
      * 瑙f瀽鈥滄槸鍚﹂渶瑕佺敓浜р�濓細鐣欑┖榛樿鈥滄槸(1)鈥濓紝濉�滃惁/0/涓嶉渶瑕佲�濆垯涓衡�滃惁(0)鈥�
      */
@@ -404,7 +415,24 @@
             throw exception(SALE_ORDER_SUBMIT_FAIL_ITEM_EMPTY, saleOrder.getNo());
         }
 
-        // 4. 鍒涘缓 BPM 娴佺▼瀹炰緥锛堝鎵瑰湪鍗忓悓鍔炲叕瀹屾垚锛�
+        // 4. 鍚堝悓杞潵鐨勯攢鍞鍗曪紙contractId 闈炵┖锛夋棤闇�鍐嶈蛋瀹℃壒锛�
+        //    鍚堝悓鍦� CRM 宸插鎵归�氳繃锛岃鍗曞唴瀹圭敱鍚堝悓甯﹀叆锛屾彁浜ゅ嵆鐢熸晥銆�
+        //    鐢熸晥鍚庯細闇�瑕佺敓浜х殑鏄庣粏鑷姩鍒涘缓 MPS 娴佽浆鐢熶骇妯″潡锛涙棤闇�鐢熶骇鐨勬槑缁嗗彲鐩存帴鍦ㄤ粨鍌ㄧ敓鎴愬彂璐ч�氱煡鍗曘��
+        //    鍘嗗彶鍚堝悓鐢熸垚鐨勮鍗曟槑缁嗗彲鑳芥湭缁存姢鈥滄槸鍚﹂渶瑕佺敓浜р�濓紝鎸夌郴缁熼粯璁わ紙闇�瑕佺敓浜э級琛ラ綈鍚庡啀鐢熸晥銆�
+        if (saleOrder.getContractId() != null) {
+            items.stream()
+                    .filter(item -> item.getNeedProduction() == null)
+                    .forEach(item -> saleOrderItemMapper.updateById(
+                            new ErpSaleOrderItemDO().setId(item.getId()).setNeedProduction(1)));
+            saleOrderMapper.updateById(new ErpSaleOrderDO()
+                    .setId(id)
+                    .setStatus(ErpAuditStatus.APPROVING.getStatus())
+                    .setProcessInstanceId(""));
+            updateSaleOrderAuditStatus(id, cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum.APPROVE.getStatus());
+            return;
+        }
+
+        // 5. 鍒涘缓 BPM 娴佺▼瀹炰緥锛堝鎵瑰湪鍗忓悓鍔炲叕瀹屾垚锛�
         // 鍏ㄥ眬鍏嶅鎵癸細涓氬姟鏍¢獙閫氳繃鍚庣洿鎺ユ墽琛屽鎵归�氳繃閫昏緫锛屾棤闇�娴佺▼妯″瀷銆�
         if (processInstanceApi.isGlobalAutoApprove()) {
             saleOrderMapper.updateById(new ErpSaleOrderDO()
@@ -420,7 +448,7 @@
                         .setProcessDefinitionKey(processDefinitionKey)
                         .setBusinessKey(String.valueOf(id)));
 
-        // 5. 鏇存柊閿�鍞鍗曠姸鎬佷负瀹℃壒涓紝璁板綍娴佺▼瀹炰緥缂栧彿
+        // 6. 鏇存柊閿�鍞鍗曠姸鎬佷负瀹℃壒涓紝璁板綍娴佺▼瀹炰緥缂栧彿
         saleOrderMapper.updateById(new ErpSaleOrderDO()
                 .setId(id)
                 .setStatus(ErpAuditStatus.APPROVING.getStatus())

--
Gitblit v1.9.3