From ffca46b39d25439a06a27cafda2ec523a3fb67cf Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 27 十月 2026 17:53:02 +0800
Subject: [PATCH] feat(mes): 增加盘号字段支持和优化报工质检流程

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java |   84 ++++++++++++++----------------------------
 1 files changed, 28 insertions(+), 56 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
index e8ed301..c50473e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
@@ -96,6 +96,13 @@
 
     private void createTransactionList(Long produceId, List<MesWmProductProduceLineDO> lines) {
         for (MesWmProductProduceLineDO line : lines) {
+            if (MesWmQualityStatusEnum.FAIL.getStatus().equals(line.getQualityStatus())) {
+                // 涓嶅悎鏍间骇鍑轰繚鐣欒褰曪紝浜ょ敱涓嶅悎鏍煎搧澶勭悊锛屼笉鐢熸垚鍚堟牸搴撳瓨娴佹按銆�
+                continue;
+            }
+            if (!MesWmQualityStatusEnum.PASS.getStatus().equals(line.getQualityStatus())) {
+                throw exception(WM_PRODUCT_PRODUCE_QUALITY_PENDING);
+            }
             // 1. 鏍¢獙姣忚鏄庣粏鏁伴噺涔嬪拰绛変簬琛屾暟閲�
             List<MesWmProductProduceDetailDO> details = productProduceDetailService.getProductProduceDetailListByLineId(
                     line.getId());
@@ -121,6 +128,7 @@
     @Transactional(rollbackFor = Exception.class)
     public MesWmProductProduceDO generateProductProduce(MesProFeedbackDO feedback, boolean checkFlag,
                                                          MesProFeedbackApproveReqVO approveReqVO) {
+        if (!checkFlag) throw exception(WM_PRODUCT_PRODUCE_QUALITY_PENDING);
         // 0. 鏌ヨ鍏宠仈鐨勫伐鍗曪紙鐢ㄤ簬鑾峰彇 clientId 绛変俊鎭級
         MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(feedback.getWorkOrderId());
 
@@ -135,6 +143,7 @@
         // 2. 鑾峰彇鎴栫敓鎴愭壒娆★紙瀹℃壒璇锋眰涓殑鎵规灞炴�т紭鍏堬級
         MesWmBatchGenerateReqVO batchReqVO = new MesWmBatchGenerateReqVO()
                 .setItemId(feedback.getItemId())
+                .setReelNo(workOrder != null ? workOrder.getReelNo() : null)
                 .setProduceDate(LocalDate.now().atStartOfDay()) // 鎴柇鍒板綋澶╅浂鐐癸紝纭繚鍚屼竴澶╃殑鎶ュ伐鐢熸垚鐩稿悓鎵规鍙�
                 .setExpireDate(feedback.getExpireDate())
                 .setWorkOrderId(feedback.getWorkOrderId())
@@ -160,68 +169,23 @@
         Long batchId = batch != null ? batch.getId() : null;
         String batchCode = batch != null ? batch.getCode() : null;
 
-        WarehouseTarget outputTarget = resolveOutputTarget(feedback.getWorkOrderId(), feedback.getProcessId(), feedback.getItemId());
-
-        // 3. 鏍规嵁鏄惁闇�瑕佹楠屽垎鏀鐞�
-        if (checkFlag) {
-            // 3.1 闇�瑕佹楠岋細鍒涘缓涓�鏉¤锛堣川閲忕姸鎬�=寰呮楠岋級锛屼笉鐢熸垚鏄庣粏
-            MesWmProductProduceLineDO line = buildProduceLine(produce, feedback, batchId, batchCode,
-                    feedback.getFeedbackQuantity(), MesWmQualityStatusEnum.PENDING.getStatus());
-            productProduceLineService.createProductProduceLine(line);
-            // 娉ㄦ剰锛歝heckFlag=true 鏃朵笉鐢熸垚鏄庣粏琛岋紝绛� IPQC 妫�楠屽畬鎴愬悗鐢� splitPendingAndFinishProduce 鎸夎川閲忕粨鏋滄媶琛�+鐢熸垚鏄庣粏
-        } else {
-            // 3.2 鏃犻渶妫�楠岋細鎸夊悎鏍煎搧/涓嶅悎鏍煎搧鍚勭敓鎴愪竴琛� + 鏄庣粏
-            BigDecimal qualifiedQty = ObjectUtil.defaultIfNull(feedback.getQualifiedQuantity(), BigDecimal.ZERO);
-            BigDecimal unqualifiedQty = ObjectUtil.defaultIfNull(feedback.getUnqualifiedQuantity(), BigDecimal.ZERO);
-            // 3.2.0 鍏滃簳锛氬悎鏍�/涓嶈壇鏁伴噺閮芥湭濉啓鏃讹紙鎶ュ伐鍙~鎶ュ伐鏁伴噺锛夛紝榛樿鏁村崟涓哄悎鏍煎搧
-            if (qualifiedQty.compareTo(BigDecimal.ZERO) <= 0 && unqualifiedQty.compareTo(BigDecimal.ZERO) <= 0) {
-                qualifiedQty = feedback.getFeedbackQuantity();
-            }
-            // 3.2.1 涓嶅悎鏍煎搧琛� + 鏄庣粏
-            if (unqualifiedQty.compareTo(BigDecimal.ZERO) > 0) {
-                MesWmProductProduceLineDO unqualifiedLine = buildProduceLine(produce, feedback, batchId, batchCode,
-                        unqualifiedQty, MesWmQualityStatusEnum.FAIL.getStatus());
-                productProduceLineService.createProductProduceLine(unqualifiedLine);
-                MesWmProductProduceDetailDO unqualifiedDetail = buildProduceDetail(produce, feedback, batchId, batchCode,
-                        unqualifiedLine.getId(), unqualifiedQty,
-                        outputTarget.warehouseId(), outputTarget.locationId(), outputTarget.areaId());
-                productProduceDetailService.createProductProduceDetail(unqualifiedDetail);
-            }
-            // 3.2.2 鍚堟牸鍝佽 + 鏄庣粏
-            if (qualifiedQty.compareTo(BigDecimal.ZERO) > 0) {
-                MesWmProductProduceLineDO qualifiedLine = buildProduceLine(produce, feedback, batchId, batchCode,
-                        qualifiedQty, MesWmQualityStatusEnum.PASS.getStatus());
-                productProduceLineService.createProductProduceLine(qualifiedLine);
-                MesWmProductProduceDetailDO qualifiedDetail = buildProduceDetail(produce, feedback, batchId, batchCode,
-                        qualifiedLine.getId(), qualifiedQty,
-                        outputTarget.warehouseId(), outputTarget.locationId(), outputTarget.areaId());
-                productProduceDetailService.createProductProduceDetail(qualifiedDetail);
-            }
-        }
+        // 鏂版姤宸ヤ骇鍑虹粺涓�寰呮锛屽巻鍙蹭笉妫�楠屽嵆鍏ュ簱鍒嗘敮宸茬Щ闄ゃ��
+        MesWmProductProduceLineDO line = buildProduceLine(produce, feedback, batchId, batchCode,
+                feedback.getFeedbackQuantity(), MesWmQualityStatusEnum.PENDING.getStatus(),
+                workOrder != null ? workOrder.getReelNo() : null);
+        productProduceLineService.createProductProduceLine(line);
         return produce;
     }
 
     private MesWmProductProduceLineDO buildProduceLine(MesWmProductProduceDO produce, MesProFeedbackDO feedback,
                                                        Long batchId, String batchCode,
-                                                       BigDecimal quantity, Integer qualityStatus) {
+                                                       BigDecimal quantity, Integer qualityStatus, String reelNo) {
         return MesWmProductProduceLineDO.builder()
                 .produceId(produce.getId()).feedbackId(feedback.getId())
                 .itemId(feedback.getItemId()).quantity(quantity)
-                .batchId(batchId).batchCode(batchCode)
+                .batchId(batchId).batchCode(batchCode).reelNo(reelNo)
                 .expireDate(feedback.getExpireDate()).lotNumber(feedback.getLotNumber())
                 .qualityStatus(qualityStatus)
-                .build();
-    }
-
-    private MesWmProductProduceDetailDO buildProduceDetail(MesWmProductProduceDO produce, MesProFeedbackDO feedback,
-                                                           Long batchId, String batchCode,
-                                                           Long lineId, BigDecimal quantity,
-                                                           Long warehouseId, Long locationId, Long areaId) {
-        return MesWmProductProduceDetailDO.builder()
-                .produceId(produce.getId()).lineId(lineId)
-                .itemId(feedback.getItemId()).quantity(quantity)
-                .batchId(batchId).batchCode(batchCode)
-                .warehouseId(warehouseId).locationId(locationId).areaId(areaId)
                 .build();
     }
 
@@ -256,6 +220,14 @@
         }
         // 2. 閫氳繃 sourceLineId 鐩存帴瀹氫綅寰呮楠岃
         MesWmProductProduceLineDO pendingLine = productProduceLineService.validateProductProduceLineExists(sourceLineId);
+        if (!ObjUtil.equal(pendingLine.getProduceId(), produce.getId())
+                || !ObjUtil.equal(pendingLine.getFeedbackId(), feedbackId)
+                || !ObjUtil.equal(pendingLine.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus())
+                || qualifiedQty == null || unqualifiedQty == null || pendingLine.getQuantity() == null
+                || qualifiedQty.signum() < 0 || unqualifiedQty.signum() < 0
+                || qualifiedQty.add(unqualifiedQty).compareTo(pendingLine.getQuantity()) != 0) {
+            throw exception(WM_PRODUCT_PRODUCE_INSPECTION_INVALID);
+        }
         WarehouseTarget outputTarget = resolveOutputTarget(produce.getWorkOrderId(), produce.getProcessId(), pendingLine.getItemId());
 
         // 3A. 鎯呭喌涓�锛氬瓨鍦ㄤ笉鍚堟牸鍝佹暟閲忥紝闇�瑕佹媶鍒嗚
@@ -265,14 +237,14 @@
                     .produceId(produce.getId()).feedbackId(feedbackId)
                     .itemId(pendingLine.getItemId()).quantity(unqualifiedQty)
                     .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode())
-                    .expireDate(pendingLine.getExpireDate()).lotNumber(pendingLine.getLotNumber())
+                    .expireDate(pendingLine.getExpireDate()).lotNumber(pendingLine.getLotNumber()).reelNo(pendingLine.getReelNo())
                     .qualityStatus(MesWmQualityStatusEnum.FAIL.getStatus())
                     .build();
             productProduceLineService.createProductProduceLine(unqualifiedLine);
             productProduceDetailService.createProductProduceDetail(MesWmProductProduceDetailDO.builder()
                     .produceId(produce.getId()).lineId(unqualifiedLine.getId())
                     .itemId(pendingLine.getItemId()).quantity(unqualifiedQty)
-                    .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode())
+                    .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode()).reelNo(pendingLine.getReelNo())
                     .warehouseId(outputTarget.warehouseId()).locationId(outputTarget.locationId()).areaId(outputTarget.areaId())
                     .build());
             // 3A.2 鍚堟牸鍝侊細澶嶇敤鍘熷緟妫�琛岋紝鏇存柊鏁伴噺鍜岀姸鎬� + 鏄庣粏
@@ -283,7 +255,7 @@
                 productProduceDetailService.createProductProduceDetail(MesWmProductProduceDetailDO.builder()
                         .produceId(produce.getId()).lineId(pendingLine.getId())
                         .itemId(pendingLine.getItemId()).quantity(qualifiedQty)
-                        .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode())
+                        .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode()).reelNo(pendingLine.getReelNo())
                         .warehouseId(outputTarget.warehouseId()).locationId(outputTarget.locationId()).areaId(outputTarget.areaId())
                         .build());
             }
@@ -294,7 +266,7 @@
             productProduceDetailService.createProductProduceDetail(MesWmProductProduceDetailDO.builder()
                     .produceId(produce.getId()).lineId(pendingLine.getId())
                     .itemId(pendingLine.getItemId()).quantity(pendingLine.getQuantity())
-                    .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode())
+                    .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode()).reelNo(pendingLine.getReelNo())
                     .warehouseId(outputTarget.warehouseId()).locationId(outputTarget.locationId()).areaId(outputTarget.areaId())
                     .build());
         }

--
Gitblit v1.9.3