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