From 0007e69142f83757094a941a855fca923171689d Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期三, 01 四月 2026 17:38:48 +0800
Subject: [PATCH] feat(production): 新增自动报工功能及生产订单管理

---
 src/main/java/com/ruoyi/production/service/ProductionProductMainService.java          |    4 ++
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                       |    1 
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java          |    1 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |   25 +++++++++---
 src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java                       |    2 +
 src/main/java/com/ruoyi/production/pojo/ProductProcess.java                           |    4 +
 src/main/java/com/ruoyi/production/dto/StatisticsReportWorkByProcessDto.java          |   24 ++++++++++++
 7 files changed, 54 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
index 6e2ca95..62b1193 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -43,4 +43,6 @@
 
     @ApiModelProperty(value = "宸ュ崟绫诲瀷 姝e父 /杩斿伐杩斾慨")
     private String workOrderType;
+
+    private Boolean isReportWork;
 }
diff --git a/src/main/java/com/ruoyi/production/dto/StatisticsReportWorkByProcessDto.java b/src/main/java/com/ruoyi/production/dto/StatisticsReportWorkByProcessDto.java
new file mode 100644
index 0000000..4e41939
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/StatisticsReportWorkByProcessDto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.production.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 缁熻鎶ュ伐鎯呭喌閫氳繃宸ュ簭鐨刣to
+ * @author buhuazhen
+ * @date 2026/4/1
+ * @email 3038525872@qq.com
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StatisticsReportWorkByProcessDto implements Serializable {
+    private Long processId;
+
+    // 瀹屾垚鏁伴噺
+    private BigDecimal completedQuantity;
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcess.java b/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
index e55ab4f..2056acf 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -78,5 +78,7 @@
     @ApiModelProperty(value ="鏄惁璐ㄦ")
     private Boolean isQuality;
 
-
+    // 濡傛灉涓簍rue 鐩存帴鍏ュ簱鎿嶄綔涓嶉渶瑕佷汉宸ユ姤宸�
+    @TableField(value = "is_report_work")
+    private Boolean isReportWork;
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java b/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
index 72d868c..9d5e4b8 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -6,6 +6,7 @@
 import com.ruoyi.production.dto.ProductionProductMainDto;
 import com.ruoyi.production.pojo.ProductionProductMain;
 
+import javax.validation.constraints.NotNull;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -17,4 +18,7 @@
     Boolean removeProductMain(Long id);
 
     ArrayList<Long> listMain(List<Long> idList);
+
+    // 鏍规嵁宸ヨ壓璺嚎 浠ュ強涓婃璺嚎item 杩涜鑷姩鎶ュ伐鎿嶄綔
+    void executeAutoReportWork(@NotNull Long productOrderId);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 8a1099c..f7fe5f5 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -91,6 +91,7 @@
             productProcessRouteItem.setProductOrderId(productOrder.getId());
             productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
             productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
+            productProcessRouteItem.setIsQuality(false);
             int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
             if (insert > 0) {
                 // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
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 fa34114..ddfa9da 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -12,8 +12,8 @@
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.procurementrecord.utils.StockUtils;
@@ -30,7 +30,6 @@
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.ruoyi.production.mapper.ProductionProductMainMapper;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -46,6 +45,7 @@
 @Transactional(rollbackFor = Exception.class)
 public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
 
+    private final ProcessRouteItemMapper processRouteItemMapper;
     private IQualityInspectService qualityInspectService;
     private ProductionProductMainMapper productionProductMainMapper;
 
@@ -207,7 +207,7 @@
                                 qualityInspectParamMapper.insert(param);
                             });
                 }
-            }else {
+            } else {
                 //鐩存帴鍏ュ簱
                 stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
             }
@@ -264,10 +264,10 @@
     public Boolean removeProductMain(Long id) {
         //鍒ゆ柇璇ユ潯鎶ュ伐鏄惁涓嶅悎鏍煎鐞�,濡傛灉涓嶅悎鏍煎鐞嗕簡锛屽垯涓嶅厑璁稿垹闄�
         List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id));
-        if (qualityInspects.size() > 0){
+        if (qualityInspects.size() > 0) {
             List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery()
                     .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList())));
-            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState()==1) {
+            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) {
                 throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
             }
         }
@@ -321,7 +321,7 @@
                     new LambdaQueryWrapper<QualityInspectParam>()
                             .eq(QualityInspectParam::getInspectId, q.getId()));
             qualityInspectMapper.deleteById(q.getId());
-                stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
+            stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
         });
 
         // 鍒犻櫎浜у嚭璁板綍
@@ -345,4 +345,17 @@
     public ArrayList<Long> listMain(List<Long> idList) {
         return productionProductMainMapper.listMain(idList);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void executeAutoReportWork(Long productOrderId) {
+        ProductOrder productOrder = productOrderMapper.selectById(productOrderId);
+        // 鑾峰彇瀵瑰簲宸ュ簭
+        LambdaQueryWrapper<ProductProcessRouteItem> queryWrapperProductProcessRouteItem = new LambdaQueryWrapper<>();
+        queryWrapperProductProcessRouteItem.eq(ProductProcessRouteItem::getProductOrderId, productOrder.getId());
+        queryWrapperProductProcessRouteItem.orderByAsc(ProductProcessRouteItem::getId);
+        List<ProductProcessRouteItem> processRouteItems = productProcessRouteItemMapper.selectList(queryWrapperProductProcessRouteItem);
+        // 鏌ヨ瀵瑰簲鐨勬姤宸ユ儏鍐点��
+
+    }
 }
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index 14b883e..7c9eed7 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -21,6 +21,7 @@
     <select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
         SELECT
         pwo.*,
+        pp.is_report_work,
         pp.NAME as processName,
         pm.model,
         pm.unit,

--
Gitblit v1.9.3