From 5cabba0016c61d51204c7e28bf0613b1cd335327 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 25 三月 2026 15:05:34 +0800
Subject: [PATCH] 工序不合格处理为隔离后,后续工序不继续报工

---
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                       |    1 
 doc/20260317_鹏创电子.sql                                                                 |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java      |   54 +++++++++++++-----
 src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java       |    3 +
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |   37 ++++++++---
 src/main/java/com/ruoyi/quality/mapper/QualityUnqualifiedMapper.java                  |    5 +
 src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml                        |   11 +++
 src/main/resources/mapper/production/ProductionProductMainMapper.xml                  |    9 +++
 src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java                       |    3 +
 src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java            |    8 ++
 10 files changed, 105 insertions(+), 28 deletions(-)

diff --git "a/doc/20260317_\351\271\217\345\210\233\347\224\265\345\255\220.sql" "b/doc/20260317_\351\271\217\345\210\233\347\224\265\345\255\220.sql"
index c624baf..c3c77f4 100644
--- "a/doc/20260317_\351\271\217\345\210\233\347\224\265\345\255\220.sql"
+++ "b/doc/20260317_\351\271\217\345\210\233\347\224\265\345\255\220.sql"
@@ -3,4 +3,4 @@
     add defective_reason varchar(255) default '' not null comment '涓嶈壇鍘熷洜';
 
 alter table quality_unqualified
-    add quarantine_lifted boolean not null default false comment '鏄惁宸插彇娑堥殧绂�';
\ No newline at end of file
+    add quarantine_lifted boolean not null default true comment '鏄惁宸插彇娑堥殧绂�';
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
index 5d31d88..ffe4e19 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -11,6 +11,9 @@
 @Data
 public class ProductWorkOrderDto extends ProductWorkOrder {
 
+    @ApiModelProperty(value = "浜у搧ID")
+    private String productId;
+
     //浜у搧鍚嶇О
     @ApiModelProperty(value = "浜у搧鍚嶇О")
     private String productName;
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
index 2ccf787..f4be202 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
@@ -35,4 +35,12 @@
     ArrayList<Long> listMain(List<Long> idList);
 
     List<ProductionProductMainDto> getByProductWorkOrderId(Long productWorkOrderId);
+
+    /**
+     * 妫�鏌ヤ箣鍓嶇殑宸ュ簭鏄惁鏈夎闅旂鐨勪笉鍚堟牸璁板綍
+     * @param productRouteId 褰撳墠宸ュ簭鐨勮矾鐢盜D
+     * @param currentDragSort 褰撳墠宸ュ簭鐨勬帓搴�
+     * @return 鏄惁鏈夐殧绂荤殑涓嶅悎鏍艰褰�
+     */
+    boolean checkPreviousProcessReported(@Param("productRouteId") Long productRouteId, @Param("currentDragSort") Integer currentDragSort);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
index b979cc4..924d7db 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -14,6 +14,10 @@
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
 import com.ruoyi.production.service.ProductWorkOrderService;
+import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.quality.pojo.QualityUnqualified;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -39,9 +43,13 @@
     @Autowired
     private ProductProcessRouteItemMapper productProcessRouteItemMapper;
     @Autowired
+    private ProductProcessMapper productProcessMapper;
+    @Autowired
     private ProductionProductMainMapper productionProductMainMapper;
     @Autowired
     private ProductionProductOutputMapper productionProductOutputMapper;
+    @Autowired
+    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
 
     @Value("${file.temp-dir}")
     private String tempDir;
@@ -50,27 +58,43 @@
     public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
         IPage<ProductWorkOrderDto> productWorkOrderDtoIPage = productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
         productWorkOrderDtoIPage.getRecords().forEach(record -> {
-            //妫�鏌ヤ笂涓�涓伐搴忔槸鍚﹀凡鎶ュ伐
+            // 鏄惁鑳芥姤宸ワ細 1. 绗竴涓伐搴忚兘鎶ュ伐 2. 涓婁竴涓伐搴忓凡鎶ュ伐 3. 涔嬪墠鐨勫伐搴忔湭琚殧绂�
             Integer currentDragSort = record.getDragSort();
             if (currentDragSort == null || currentDragSort == 1) {
                 record.setIsCanReport(true);
             } else {
-                //鏌ユ壘涓婁竴涓伐搴�
-                ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
-                        Wrappers.<ProductProcessRouteItem>lambdaQuery()
-                                .eq(ProductProcessRouteItem::getProductRouteId, record.getProductRouteId())
-                                .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
+                // 涓婁竴涓伐搴忔槸鍚﹀凡鎶ュ伐
+                boolean isPreviousReported = productionProductMainMapper.checkPreviousProcessReported(
+                        record.getProductRouteId(),
+                        currentDragSort
                 );
+                record.setIsCanReport(isPreviousReported);
 
-                if (previousItem != null) {
-                    //妫�鏌ヤ笂涓�涓伐搴忔槸鍚︽湁鎶ュ伐璁板綍
-                    Long count = productionProductMainMapper.selectCount(
-                            Wrappers.<ProductionProductMain>lambdaQuery()
-                                    .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
+                // 涔嬪墠鐨勫伐搴忔槸鍚﹁闅旂
+                if (record.getIsCanReport()) {
+                    // 鏌ヨ鎵�鏈変箣鍓嶇殑宸ュ簭锛堟帓搴忓彿灏忎簬褰撳墠宸ュ簭锛�
+                    List<ProductProcessRouteItem> previousItems = productProcessRouteItemMapper.selectList(
+                            Wrappers.<ProductProcessRouteItem>lambdaQuery()
+                                    .eq(ProductProcessRouteItem::getProductRouteId, record.getProductRouteId())
+                                    .lt(ProductProcessRouteItem::getDragSort, currentDragSort)
                     );
-                    record.setIsCanReport(count > 0);
-                } else {
-                    record.setIsCanReport(true);
+
+                    if (CollectionUtils.isNotEmpty(previousItems)) {
+                        // 鎻愬彇涔嬪墠宸ュ簭鐨勫悕绉板垪琛�
+                        List<String> previousProcessNames = new ArrayList<>();
+                        for (ProductProcessRouteItem item : previousItems) {
+                            ProductProcess process = productProcessMapper.selectById(item.getProcessId());
+                            if (process != null) {
+                                previousProcessNames.add(process.getName());
+                            }
+                        }
+
+                        // 妫�鏌ヤ箣鍓嶇殑宸ュ簭鏄惁鏈夎闅旂鐨勪笉鍚堟牸璁板綍
+                        List<QualityUnqualified> unqualifiedList = qualityUnqualifiedMapper.selectUnqualifiedByProcessNames(previousProcessNames);
+                        if (CollectionUtils.isNotEmpty(unqualifiedList)) {
+                            record.setIsCanReport(false);
+                        }
+                    }
                 }
             }
 
@@ -183,4 +207,4 @@
         }
         return productWorkOrderDtos;
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 7a0a9c6..7cf30f3 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -100,24 +101,38 @@
         if (productProcessRouteItem == null) {
             throw new RuntimeException("宸ヨ壓璺嚎椤逛笉瀛樺湪");
         }
+        // 鏄惁鑳芥姤宸ワ細 1. 绗竴涓伐搴忚兘鎶ュ伐 2. 涓婁竴涓伐搴忓凡鎶ュ伐 3. 涔嬪墠鐨勫伐搴忔湭琚殧绂�
         //妫�鏌ヤ笂涓�涓伐搴忔槸鍚﹀凡鎶ュ伐
         Integer currentDragSort = productProcessRouteItem.getDragSort();
         if (currentDragSort != null && currentDragSort > 1) {
-            ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
+            boolean isPreviousReported = productionProductMainMapper.checkPreviousProcessReported(
+                    productProcessRouteItem.getProductRouteId(),
+                    currentDragSort
+            );
+            if (isPreviousReported) {
+                throw new RuntimeException("涓婁竴涓伐搴忓皻鏈姤宸ワ紝涓嶈兘杩涜褰撳墠宸ュ簭鎶ュ伐");
+            }
+
+            // 鏌ヨ鎵�鏈変箣鍓嶇殑宸ュ簭锛堟帓搴忓彿灏忎簬褰撳墠宸ュ簭锛�
+            List<ProductProcessRouteItem> previousItems = productProcessRouteItemMapper.selectList(
                     Wrappers.<ProductProcessRouteItem>lambdaQuery()
                             .eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())
-                            .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
+                            .lt(ProductProcessRouteItem::getDragSort, currentDragSort)
             );
+            if (CollectionUtils.isNotEmpty(previousItems)) {
+                // 鎻愬彇涔嬪墠宸ュ簭鐨勫悕绉板垪琛�
+                List<String> previousProcessNames = new ArrayList<>();
+                for (ProductProcessRouteItem item : previousItems) {
+                    ProductProcess process = productProcessMapper.selectById(item.getProcessId());
+                    if (process != null) {
+                        previousProcessNames.add(process.getName());
+                    }
+                }
 
-            if (previousItem != null) {
-                //妫�鏌ヤ笂涓�涓伐搴忔槸鍚︽湁鎶ュ伐璁板綍
-                Long count = productionProductMainMapper.selectCount(
-                        Wrappers.<ProductionProductMain>lambdaQuery()
-                                .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
-                );
-
-                if (count == 0) {
-                    throw new RuntimeException("涓婁竴涓伐搴忓皻鏈姤宸ワ紝涓嶈兘杩涜褰撳墠宸ュ簭鎶ュ伐");
+                // 妫�鏌ヤ箣鍓嶇殑宸ュ簭鏄惁鏈夎闅旂鐨勪笉鍚堟牸璁板綍
+                List<QualityUnqualified> unqualifiedList = qualityUnqualifiedMapper.selectUnqualifiedByProcessNames(previousProcessNames);
+                if (CollectionUtils.isNotEmpty(unqualifiedList)) {
+                    throw new RuntimeException("涔嬪墠鐨勫伐搴忓凡琚殧绂伙紝涓嶈兘杩涜褰撳墠宸ュ簭鎶ュ伐");
                 }
             }
         }
diff --git a/src/main/java/com/ruoyi/quality/mapper/QualityUnqualifiedMapper.java b/src/main/java/com/ruoyi/quality/mapper/QualityUnqualifiedMapper.java
index c3e75e6..3069018 100644
--- a/src/main/java/com/ruoyi/quality/mapper/QualityUnqualifiedMapper.java
+++ b/src/main/java/com/ruoyi/quality/mapper/QualityUnqualifiedMapper.java
@@ -22,4 +22,7 @@
 
     //鎵嬪姩鏂板涓嶅悎鏍肩殑鏃跺��,鏍规嵁浜у搧鍚嶇О鍜岃鏍煎瀷鍙锋煡鍑哄搴旂殑瑙勬牸鍨嬪彿id
     Long getModelId(@Param("productName") String productName, @Param("model") String model);
-}
+    
+    //鏍规嵁宸ュ簭鍚嶇О鍒楄〃鏌ヨ琚殧绂荤殑涓嶅悎鏍艰褰�
+    List<QualityUnqualified> selectUnqualifiedByProcessNames(@Param("processNames") List<String> processNames);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index 9d1c755..7226b2a 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -148,6 +148,9 @@
                         stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
                     }
                     break;
+                case "闅旂":
+                    qualityUnqualified.setQuarantineLifted(false);
+                    break;
                 default:
                     break;
             }
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index e59e3a4..3b6178e 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -27,6 +27,7 @@
         pm.model,
         pm.unit,
         p.product_name AS productName,
+        p.id AS productId,
         po.nps_no AS productOrderNpsNo,
         ppri.drag_sort,
         ppri.product_route_id,
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index 36b0204..c2dc1d8 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -150,4 +150,13 @@
             #{id}
         </foreach>
     </delete>
+
+    <select id="checkPreviousProcessReported" resultType="java.lang.Boolean">
+        SELECT CASE WHEN COUNT(*) > 0 THEN TRUE ELSE FALSE END
+        FROM production_product_main ppm
+        JOIN product_work_order pwo ON ppm.work_order_id = pwo.id
+        JOIN product_process_route_item ppri ON pwo.product_process_route_item_id = ppri.id
+        WHERE ppri.product_route_id = #{productRouteId}
+        AND ppri.drag_sort = #{currentDragSort} - 1
+    </select>
 </mapper>
diff --git a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
index 666d3a9..b2ef2a4 100644
--- a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
+++ b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
@@ -99,4 +99,15 @@
         where pm.model=#{model}
           and  p.product_name=#{productName}
     </select>
+    <select id="selectUnqualifiedByProcessNames" resultType="com.ruoyi.quality.pojo.QualityUnqualified">
+        SELECT DISTINCT qu.*
+        FROM quality_unqualified qu
+        JOIN quality_inspect qi ON qu.inspect_id = qi.id
+        WHERE qi.process IN
+        <foreach collection="processNames" item="processName" open="(" separator="," close=")">
+            #{processName}
+        </foreach>
+        AND qu.deal_result = '闅旂'
+        AND qu.quarantine_lifted = false
+    </select>
 </mapper>

--
Gitblit v1.9.3