From 3f2d4ba07ee9e1e0ddba97b43dc70af09f0e39a2 Mon Sep 17 00:00:00 2001
From: chenhj <1263187585@qq.com>
Date: 星期四, 30 四月 2026 17:40:30 +0800
Subject: [PATCH] 审核附件修改

---
 src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java |  270 +++++++++++++++++++++++++++++++++++------------------
 1 files changed, 177 insertions(+), 93 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 fe3b8e0..0296ef4 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -1,58 +1,66 @@
 package com.ruoyi.quality.service.impl;
 
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.production.mapper.ProductProcessRouteItemMapper;
-import com.ruoyi.production.mapper.ProductProcessRouteMapper;
-import com.ruoyi.production.mapper.ProductWorkOrderMapper;
+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.pojo.*;
-import com.ruoyi.production.service.ProductOrderService;
-import com.ruoyi.quality.mapper.QualityInspectMapper;
+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.QualityTestStandard;
 import com.ruoyi.quality.pojo.QualityUnqualified;
 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 javax.servlet.http.HttpServletResponse;
+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.List;
+import java.util.Map;
 
 @AllArgsConstructor
 @Service
-public class QualityUnqualifiedServiceImpl extends ServiceImpl<QualityUnqualifiedMapper, QualityUnqualified>  implements IQualityUnqualifiedService {
+public class QualityUnqualifiedServiceImpl extends ServiceImpl<QualityUnqualifiedMapper, QualityUnqualified> implements IQualityUnqualifiedService {
 
-    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
-    private IQualityInspectService qualityInspectService;
-    private ProductOrderService productOrderService;
-    private ProductionProductMainMapper productionProductMainMapper;
-    private ProductProcessRouteMapper productProcessRouteMapper;
-    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
-    private ProductWorkOrderMapper productWorkOrderMapper;
-
+    private final StockUtils stockUtils;
+    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;
 
     @Override
     public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) {
-        return qualityUnqualifiedMapper.qualityUnqualifiedListPage(page,qualityUnqualified);
+        return qualityUnqualifiedMapper.qualityUnqualifiedListPage(page, qualityUnqualified);
     }
 
     @Override
     public void qualityUnqualifiedExport(HttpServletResponse response, QualityUnqualified qualityUnqualified) {
-        List<QualityUnqualified> qualityUnqualifieds =qualityUnqualifiedMapper.qualityUnqualifiedExport(qualityUnqualified);
-        ExcelUtil<QualityUnqualified> util = new ExcelUtil<QualityUnqualified>(QualityUnqualified.class);
+        List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.qualityUnqualifiedExport(qualityUnqualified);
+        ExcelUtil<QualityUnqualified> util = new ExcelUtil<>(QualityUnqualified.class);
         util.exportExcel(response, qualityUnqualifieds, "涓嶅悎鏍肩鐞嗗鍑�");
     }
 
@@ -60,80 +68,156 @@
     public int deal(QualityUnqualified qualityUnqualified) {
         QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId());
         QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId());
-        switch (qualityUnqualified.getDealResult()) {
-            case "杩斾慨":
-            case "杩斿伐":
-                //鍒ゆ柇璐ㄦ琛ㄦ槸鍚︽湁鐩稿叧鐨勬姤宸d,濡傛灉鏈夋姤宸d,閭d箞杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
-                if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())){
-                    //杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
-                    ProductOrder productOrder = productionProductMainMapper.getOrderByMainId(qualityInspect.getProductMainId());
-                    ProductOrder order = new ProductOrder();
-                    BeanUtils.copyProperties(productOrder, order);
-                    order.setId(null);
-                    order.setQuantity(unqualified.getQuantity());
-                    order.setCompleteQuantity(BigDecimal.ZERO);
-                    order.setStartTime(null);
-                    order.setEndTime(null);
-                    productOrderService.save(order);
-                    //鏂板鐢熶骇璁㈠崟涓嬬殑宸ヨ壓璺嚎涓昏〃
-                    ProductProcessRoute productProcessRoute = productProcessRouteMapper.selectList(Wrappers.<ProductProcessRoute>lambdaQuery().eq(ProductProcessRoute::getProductOrderId,productOrder.getId()).orderByDesc(ProductProcessRoute::getId)).get(0);
-                    ProductProcessRoute newProcessRoute = new ProductProcessRoute();
-                    BeanUtils.copyProperties(productProcessRoute, newProcessRoute);
-                    newProcessRoute.setId(null);
-                    newProcessRoute.setProductOrderId(order.getId());
-                    productProcessRouteMapper.insert(newProcessRoute);
-                    //鏂板鐢熶骇璁㈠崟涓嬬殑宸ヨ壓璺嚎瀛愯〃
-                    List<ProductProcessRouteItem> processRouteItems = productProcessRouteItemMapper.selectList(new QueryWrapper<ProductProcessRouteItem>().lambda().eq(ProductProcessRouteItem::getProductRouteId, productProcessRoute.getId()));
-                    // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
-                    String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-                    for (ProductProcessRouteItem processRouteItem : processRouteItems) {
-                        ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
-                        BeanUtils.copyProperties(processRouteItem, productProcessRouteItem);
-                        productProcessRouteItem.setId(null);
-                        productProcessRouteItem.setProductRouteId(newProcessRoute.getId());
-                        int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
-                        if (insert > 0) {
-                            // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
-                            QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
-                            queryWrapper.likeRight("work_order_no", datePrefix)
-                                    .orderByDesc("work_order_no")
-                                    .last("LIMIT 1");
-                            ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
-                            int sequenceNumber = 1; // 榛樿搴忓彿
-                            if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
-                                String lastNo = lastWorkOrder.getWorkOrderNo().toString();
-                                if (lastNo.startsWith(datePrefix)) {
-                                    String seqStr = lastNo.substring(datePrefix.length());
-                                    try {
-                                        sequenceNumber = Integer.parseInt(seqStr) + 1;
-                                    } catch (NumberFormatException e) {
-                                        sequenceNumber = 1;
-                                    }
-                                }
-                            }
-                            // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
-                            String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber);
-                            ProductWorkOrder productWorkOrder = new ProductWorkOrder();
-                            productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
-                            productWorkOrder.setProductOrderId(order.getId());
-                            productWorkOrder.setPlanQuantity(order.getQuantity());
-                            productWorkOrder.setWorkOrderNo(workOrderNoStr);
-                            productWorkOrder.setStatus(1);
-                            productWorkOrderMapper.insert(productWorkOrder);
+        if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) {
+            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());
                     }
-                }
-                break;
-            case "鎶ュ簾":
-                break;
-            case "璁╂鏀捐":
-                //璋冪敤鎻愪氦鍚堟牸鐨勬帴鍙�
-                qualityInspect.setCheckResult("鍚堟牸");
-                qualityInspectService.submit(qualityInspect);
-                break;
-            default:
-                break;
+                    break;
+                case "鎶ュ簾":
+                    stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
+                            StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+                    break;
+                case "璁╂鏀捐":
+                    stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
+                            StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+                    break;
+                default:
+                    break;
+            }
+        } else {
+            Long modelId = qualityUnqualifiedMapper.getModelId(qualityUnqualified.getProductName(), qualityUnqualified.getModel());
+            switch (qualityUnqualified.getDealResult()) {
+                case "鎶ュ簾":
+                    stockUtils.addUnStock(modelId, unqualified.getQuantity(),
+                            StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+                    break;
+                case "璁╂鏀捐":
+                    stockUtils.addStock(modelId, unqualified.getQuantity(),
+                            StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+                    break;
+                default:
+                    break;
+            }
         }
+        qualityUnqualified.setInspectState(1);
         return qualityUnqualifiedMapper.updateById(qualityUnqualified);
     }
+
+    @Override
+    public QualityUnqualified getUnqualified(Integer id) {
+        return qualityUnqualifiedMapper.getUnqualified(id);
+    }
+
+    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);
+    }
+
+    private String generateNextTaskNo(String prefix) {
+        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String taskPrefix = prefix + datePrefix;
+        ProductionOperationTask latestTask = productionOperationTaskMapper.selectOne(
+                Wrappers.<ProductionOperationTask>lambdaQuery()
+                        .likeRight(ProductionOperationTask::getWorkOrderNo, taskPrefix)
+                        .orderByDesc(ProductionOperationTask::getWorkOrderNo)
+                        .last("limit 1"));
+        int sequence = 1;
+        if (latestTask != null && latestTask.getWorkOrderNo() != null && latestTask.getWorkOrderNo().startsWith(taskPrefix)) {
+            try {
+                sequence = Integer.parseInt(latestTask.getWorkOrderNo().substring(taskPrefix.length())) + 1;
+            } catch (NumberFormatException ignored) {
+                sequence = 1;
+            }
+        }
+        return taskPrefix + String.format("%03d", sequence);
+    }
+
+    private BigDecimal defaultDecimal(BigDecimal value) {
+        return value == null ? BigDecimal.ZERO : value;
+    }
 }

--
Gitblit v1.9.3