From 422a5676c2d96dd37c1be62935a314d70fef79b5 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 15 七月 2026 15:28:04 +0800
Subject: [PATCH] 修改不合格管理

---
 src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java |  235 +++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 133 insertions(+), 102 deletions(-)

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 0296ef4..ffd12d9 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -6,37 +6,33 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
-import com.ruoyi.production.mapper.ProductionOrderMapper;
-import com.ruoyi.production.mapper.ProductionOrderRoutingMapper;
-import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.service.ProductionAccountService;
 import com.ruoyi.production.pojo.ProductionOperationTask;
-import com.ruoyi.production.pojo.ProductionOrder;
-import com.ruoyi.production.pojo.ProductionOrderRouting;
-import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
 import com.ruoyi.production.pojo.ProductionProductMain;
 import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityUnqualified;
+import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.quality.service.IQualityUnqualifiedService;
 import com.ruoyi.stock.service.StockUninventoryService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import jakarta.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.HashMap;
+import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
 
 @AllArgsConstructor
 @Service
@@ -46,11 +42,10 @@
     private final QualityUnqualifiedMapper qualityUnqualifiedMapper;
     private final IQualityInspectService qualityInspectService;
     private final ProductionProductMainMapper productionProductMainMapper;
-    private final ProductionOrderMapper productionOrderMapper;
-    private final ProductionOrderRoutingMapper productionOrderRoutingMapper;
-    private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper;
     private final ProductionOperationTaskMapper productionOperationTaskMapper;
     private final StockUninventoryService stockUninventoryService;
+    private final StockInRecordService stockInRecordService;
+    private final ProductionAccountService productionAccountService;
 
     @Override
     public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) {
@@ -65,28 +60,27 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int deal(QualityUnqualified qualityUnqualified) {
         QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId());
         QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId());
+        String batchNo = qualityInspect == null ? null
+                : resolveProductionBatchNo(qualityInspect.getProductMainId(), qualityInspect.getId(), qualityInspect.getProductModelId());
         if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) {
+            ProductionProductMain sourceMain = null;
+            if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) {
+                sourceMain = productionProductMainMapper.selectById(qualityInspect.getProductMainId());
+            }
             switch (qualityUnqualified.getDealResult()) {
-                case "杩斾慨":
-                case "杩斿伐":
-                    if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) {
-                        ProductionProductMain sourceMain = productionProductMainMapper.selectById(qualityInspect.getProductMainId());
-                        if (sourceMain == null || sourceMain.getProductionOperationTaskId() == null) {
-                            throw new ServiceException("鍘嗗彶鎶ュ伐鏈粦瀹氱敓浜у伐鍗曪紝鏃犳硶鎸夋柊妯″瀷杩斾慨/杩斿伐");
-                        }
-                        createReworkProductionByNewModel(sourceMain, unqualified.getQuantity());
-                    }
+                case "鎶ュ伐":
+                    handleProductionReportResult(qualityUnqualified, unqualified, sourceMain);
                     break;
                 case "鎶ュ簾":
-                    stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
-                            StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+                    handleProductionScrapResult(qualityInspect, qualityUnqualified, unqualified, sourceMain, batchNo);
                     break;
                 case "璁╂鏀捐":
-                    stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
-                            StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+                    stockUtils.addStockWithBatchNo(qualityInspect.getProductModelId(), unqualified.getQuantity(),
+                            StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId(), batchNo);
                     break;
                 default:
                     break;
@@ -96,7 +90,7 @@
             switch (qualityUnqualified.getDealResult()) {
                 case "鎶ュ簾":
                     stockUtils.addUnStock(modelId, unqualified.getQuantity(),
-                            StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+                            StockInQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
                     break;
                 case "璁╂鏀捐":
                     stockUtils.addStock(modelId, unqualified.getQuantity(),
@@ -115,87 +109,87 @@
         return qualityUnqualifiedMapper.getUnqualified(id);
     }
 
+    private void handleProductionReportResult(QualityUnqualified qualityUnqualified,
+                                              QualityUnqualified sourceUnqualified,
+                                              ProductionProductMain sourceMain) {
+        Integer dealType = qualityUnqualified.getDealType();
+        if (dealType == null) {
+            throw new ServiceException("鎶ュ伐鏃跺繀椤婚�夋嫨涓嶅悎鏍肩被鍨�");
+        }
+        if (sourceMain == null || sourceMain.getProductionOperationTaskId() == null) {
+            throw new ServiceException("鍘嗗彶鎶ュ伐鏈粦瀹氱敓浜у伐鍗曪紝鏃犳硶鎵ц鎶ュ伐澶勭悊");
+        }
+        if (Integer.valueOf(0).equals(dealType)) {
+            applyLightRework(sourceMain, qualityUnqualified);
+            return;
+        }
+        if (Integer.valueOf(1).equals(dealType)) {
+            markSourceMainAsUnpaid(sourceMain, 2);
+            createReworkProductionByNewModel(sourceMain, sourceUnqualified.getQuantity());
+            qualityUnqualified.setRegenerateNewOrder(1);
+            productionAccountService.rebuildByProductionProductMainId(sourceMain.getId());
+            return;
+        }
+        throw new ServiceException("鎶ュ伐澶勭悊浠呮敮鎸佽交寰繑宸ユ垨涓ラ噸杩斿伐");
+    }
+
+    private void handleProductionScrapResult(QualityInspect qualityInspect,
+                                             QualityUnqualified qualityUnqualified,
+                                             QualityUnqualified sourceUnqualified,
+                                             ProductionProductMain sourceMain,
+                                             String batchNo) {
+        if (sourceMain == null || sourceMain.getProductionOperationTaskId() == null) {
+            throw new ServiceException("鍘嗗彶鎶ュ伐鏈粦瀹氱敓浜у伐鍗曪紝鏃犳硶鎵ц鎶ュ簾澶勭悊");
+        }
+        markSourceMainAsUnpaid(sourceMain, 3);
+        createReworkProductionByNewModel(sourceMain, sourceUnqualified.getQuantity());
+        qualityUnqualified.setRegenerateNewOrder(1);
+        productionAccountService.rebuildByProductionProductMainId(sourceMain.getId());
+        // 鍘熸湁鎶ュ簾搴撳瓨澶勭悊閫昏緫鍏堟寜鏂拌鍒欐敞閲婏紝涓嶅啀鐩存帴鎸変笉鍚堟牸鍗曟墽琛屾姤搴熷嚭搴撱��
+        // stockUtils.addUnStockWithBatchNo(qualityInspect.getProductModelId(), sourceUnqualified.getQuantity(),
+        //         StockInQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), sourceUnqualified.getId(), batchNo);
+    }
+
+    private void applyLightRework(ProductionProductMain sourceMain, QualityUnqualified qualityUnqualified) {
+        if (qualityUnqualified.getRepairWorkHour() == null
+                || qualityUnqualified.getRepairWorkHour().compareTo(BigDecimal.ZERO) <= 0) {
+            throw new ServiceException("杞诲井杩斿伐蹇呴』濉啓澶т簬0鐨勪慨鐞嗗伐鏃�");
+        }
+        ProductionProductMain update = new ProductionProductMain();
+        update.setId(sourceMain.getId());
+        update.setReportType(1);
+        update.setRepairWorkHour(defaultDecimal(sourceMain.getRepairWorkHour()).add(defaultDecimal(qualityUnqualified.getRepairWorkHour())));
+        productionProductMainMapper.updateById(update);
+        qualityUnqualified.setRegenerateNewOrder(0);
+        productionAccountService.rebuildByProductionProductMainId(sourceMain.getId());
+    }
+
+    private void markSourceMainAsUnpaid(ProductionProductMain sourceMain, int reportType) {
+        ProductionProductMain update = new ProductionProductMain();
+        update.setId(sourceMain.getId());
+        update.setReportType(reportType);
+        productionProductMainMapper.updateById(update);
+    }
+
     private void createReworkProductionByNewModel(ProductionProductMain sourceMain, BigDecimal quantity) {
         ProductionOperationTask sourceTask = productionOperationTaskMapper.selectById(sourceMain.getProductionOperationTaskId());
         if (sourceTask == null) {
             throw new ServiceException("鍏宠仈鐨勭敓浜у伐鍗曚笉瀛樺湪");
         }
-        ProductionOrder sourceOrder = productionOrderMapper.selectById(sourceTask.getProductionOrderId());
-        if (sourceOrder == null) {
-            throw new ServiceException("鍏宠仈鐨勭敓浜ц鍗曚笉瀛樺湪");
-        }
-
-        ProductionOrder newOrder = new ProductionOrder();
-        BeanUtils.copyProperties(sourceOrder, newOrder);
-        newOrder.setId(null);
-        newOrder.setNpsNo(generateNextProductionOrderNo("FG"));
-        newOrder.setQuantity(defaultDecimal(quantity));
-        newOrder.setCompleteQuantity(BigDecimal.ZERO);
-        newOrder.setStartTime(null);
-        newOrder.setEndTime(null);
-        newOrder.setCreateTime(null);
-        newOrder.setUpdateTime(null);
-        productionOrderMapper.insert(newOrder);
-
-        Map<Long, Long> routingIdMap = new HashMap<>();
-        List<ProductionOrderRouting> sourceRoutings = productionOrderRoutingMapper.selectList(
-                Wrappers.<ProductionOrderRouting>lambdaQuery()
-                        .eq(ProductionOrderRouting::getProductionOrderId, sourceOrder.getId())
-                        .orderByAsc(ProductionOrderRouting::getId));
-        for (ProductionOrderRouting sourceRouting : sourceRoutings) {
-            ProductionOrderRouting newRouting = new ProductionOrderRouting();
-            BeanUtils.copyProperties(sourceRouting, newRouting);
-            newRouting.setId(null);
-            newRouting.setProductionOrderId(newOrder.getId());
-            newRouting.setCreateTime(null);
-            newRouting.setUpdateTime(null);
-            productionOrderRoutingMapper.insert(newRouting);
-            routingIdMap.put(sourceRouting.getId(), newRouting.getId());
-        }
-
-        List<ProductionOrderRoutingOperation> sourceOperations = productionOrderRoutingOperationMapper.selectList(
-                Wrappers.<ProductionOrderRoutingOperation>lambdaQuery()
-                        .eq(ProductionOrderRoutingOperation::getProductionOrderId, sourceOrder.getId())
-                        .orderByAsc(ProductionOrderRoutingOperation::getDragSort)
-                        .orderByAsc(ProductionOrderRoutingOperation::getId));
-        for (ProductionOrderRoutingOperation sourceOperation : sourceOperations) {
-            ProductionOrderRoutingOperation newOperation = new ProductionOrderRoutingOperation();
-            BeanUtils.copyProperties(sourceOperation, newOperation);
-            newOperation.setId(null);
-            newOperation.setProductionOrderId(newOrder.getId());
-            newOperation.setOrderRoutingId(routingIdMap.get(sourceOperation.getOrderRoutingId()));
-            newOperation.setCreateTime(null);
-            newOperation.setUpdateTime(null);
-            productionOrderRoutingOperationMapper.insert(newOperation);
-
-            ProductionOperationTask newTask = new ProductionOperationTask();
-            newTask.setProductionOrderRoutingOperationId(newOperation.getId());
-            newTask.setProductionOrderId(newOrder.getId());
-            newTask.setPlanQuantity(newOrder.getQuantity());
-            newTask.setCompleteQuantity(BigDecimal.ZERO);
-            newTask.setWorkOrderNo(generateNextTaskNo("FG"));
-            newTask.setStatus(1);
-            productionOperationTaskMapper.insert(newTask);
-        }
-    }
-
-    private String generateNextProductionOrderNo(String prefix) {
-        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        String orderPrefix = prefix + datePrefix;
-        ProductionOrder latestOrder = productionOrderMapper.selectOne(
-                Wrappers.<ProductionOrder>lambdaQuery()
-                        .likeRight(ProductionOrder::getNpsNo, orderPrefix)
-                        .orderByDesc(ProductionOrder::getNpsNo)
-                        .last("limit 1"));
-        int sequence = 1;
-        if (latestOrder != null && latestOrder.getNpsNo() != null && latestOrder.getNpsNo().startsWith(orderPrefix)) {
-            try {
-                sequence = Integer.parseInt(latestOrder.getNpsNo().substring(orderPrefix.length())) + 1;
-            } catch (NumberFormatException ignored) {
-                sequence = 1;
-            }
-        }
-        return orderPrefix + String.format("%04d", sequence);
+        ProductionOperationTask newTask = new ProductionOperationTask();
+        BeanUtils.copyProperties(sourceTask, newTask);
+        newTask.setId(null);
+        newTask.setWorkOrderNo(generateNextTaskNo("FG"));
+        newTask.setPlanQuantity(defaultDecimal(quantity));
+        newTask.setCompleteQuantity(BigDecimal.ZERO);
+        newTask.setPlanStartTime(null);
+        newTask.setPlanEndTime(null);
+        newTask.setActualStartTime(null);
+        newTask.setActualEndTime(null);
+        newTask.setStatus(1);
+        newTask.setCreateTime(null);
+        newTask.setUpdateTime(null);
+        productionOperationTaskMapper.insert(newTask);
     }
 
     private String generateNextTaskNo(String prefix) {
@@ -220,4 +214,41 @@
     private BigDecimal defaultDecimal(BigDecimal value) {
         return value == null ? BigDecimal.ZERO : value;
     }
+
+    private String resolveProductionBatchNo(Long productionProductMainId,
+                                            Long qualityInspectId,
+                                            Long productModelId) {
+        if (productModelId == null) {
+            return null;
+        }
+        if (productionProductMainId != null) {
+            StockInRecord productionRecord = stockInRecordService.getOne(
+                    Wrappers.<StockInRecord>lambdaQuery()
+                            .eq(StockInRecord::getRecordId, productionProductMainId)
+                            .eq(StockInRecord::getProductModelId, productModelId)
+                            .in(StockInRecord::getRecordType, Arrays.asList(
+                                    StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(),
+                                    StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()))
+                            .isNotNull(StockInRecord::getBatchNo)
+                            .orderByDesc(StockInRecord::getId)
+                            .last("limit 1"),
+                    false);
+            if (productionRecord != null) {
+                return productionRecord.getBatchNo();
+            }
+        }
+        if (qualityInspectId == null) {
+            return null;
+        }
+        StockInRecord inspectRecord = stockInRecordService.getOne(
+                Wrappers.<StockInRecord>lambdaQuery()
+                        .eq(StockInRecord::getRecordId, qualityInspectId)
+                        .eq(StockInRecord::getProductModelId, productModelId)
+                        .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode())
+                        .isNotNull(StockInRecord::getBatchNo)
+                        .orderByDesc(StockInRecord::getId)
+                        .last("limit 1"),
+                false);
+        return inspectRecord == null ? null : inspectRecord.getBatchNo();
+    }
 }

--
Gitblit v1.9.3