From c145f0e2c2a4a301f11c8b4c132f50c8a56bec62 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期四, 15 一月 2026 17:55:51 +0800
Subject: [PATCH] 生产订单重构

---
 src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java |  189 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 186 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
index 455b6e5..6c87939 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
@@ -1,23 +1,206 @@
 package com.ruoyi.production.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.dto.ProductProcessRouteItemDto;
-import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
-import com.ruoyi.production.pojo.ProductProcessRouteItem;
+import com.ruoyi.production.mapper.*;
+import com.ruoyi.production.pojo.*;
 import com.ruoyi.production.service.ProductProcessRouteItemService;
+import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import lombok.AllArgsConstructor;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
+@Transactional(rollbackFor = Exception.class)
+@AllArgsConstructor
 public class ProductProcessRouteItemServiceImpl extends ServiceImpl<ProductProcessRouteItemMapper, ProductProcessRouteItem> implements ProductProcessRouteItemService {
 
-    @Autowired
+
     private ProductProcessRouteItemMapper productProcessRouteItemMapper;
+
+    private ProductionProductMainMapper productionProductMainMapper;
+
+    private ProductionProductInputMapper productionProductInputMapper;
+
+    private ProductionProductOutputMapper productionProductOutputMapper;
+
+    private QualityInspectMapper qualityInspectMapper;
+
+    private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+
+    private ProductWorkOrderMapper productWorkOrderMapper;
+
+    private ProductOrderMapper productOrderMapper;
+
+    private ProductProcessRouteMapper productProcessRouteMapper;
+
+    private SalesLedgerProductMapper salesLedgerProductMapper;
+
+
     @Override
     public List<ProductProcessRouteItemDto> listItem(Long orderId) {
         return productProcessRouteItemMapper.listItem(orderId);
     }
+
+    @Override
+    public R deleteRouteItem(Long id) {
+        Long routeItemId = id;
+        try {
+            // 鏌ヨ宸ュ崟
+            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectOne(
+                    new LambdaQueryWrapper<ProductWorkOrder>()
+                            .eq(ProductWorkOrder::getProductProcessRouteItemId, routeItemId)
+                            .last("LIMIT 1")
+            );
+            if (productWorkOrder == null) {
+                throw new RuntimeException("鍒犻櫎澶辫触锛氭湭鎵惧埌鍏宠仈鐨勭敓浜у伐鍗�");
+            }
+            Long workOrderId = productWorkOrder.getId();
+            Long productOrderId = productWorkOrder.getProductOrderId();
+            // 鏌ヨ鐢熶骇涓昏〃
+            List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(
+                    new LambdaQueryWrapper<ProductionProductMain>()
+                            .eq(ProductionProductMain::getWorkOrderId, workOrderId)
+            );
+            if (!productionProductMains.isEmpty()) {
+                // 鎵归噺鍒犻櫎瀛愯〃
+                for (ProductionProductMain main : productionProductMains) {
+                    Long mainId = main.getId();
+                    // 鍒犻櫎鎶曞叆
+                    productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
+                            .eq(ProductionProductInput::getProductMainId, mainId));
+                    // 鍒犻櫎浜у嚭
+                    productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
+                            .eq(ProductionProductOutput::getProductMainId, mainId));
+                    // 鍒犻櫎璐ㄦ
+                    qualityInspectMapper.delete(new LambdaQueryWrapper<QualityInspect>()
+                            .eq(QualityInspect::getProductMainId, mainId));
+                }
+            }
+            //  鍒犻櫎鎶ュ伐锛堢敓浜т富琛級
+            productionProductMainMapper.delete(new LambdaQueryWrapper<ProductionProductMain>()
+                    .eq(ProductionProductMain::getWorkOrderId, workOrderId));
+            // 鏌ヨ璁㈠崟 + 鍒犻櫎鏍哥畻
+            ProductOrder productOrder = productOrderMapper.selectById(productOrderId);
+            if (productOrder != null && productOrder.getSalesLedgerId() != null) {
+                salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
+                        .eq(SalesLedgerProductionAccounting::getSalesLedgerId, productOrder.getSalesLedgerId()));
+            }
+            // 鍒犻櫎鍏宠仈宸ュ崟
+            productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
+                    .eq(ProductWorkOrder::getProductProcessRouteItemId, routeItemId));
+
+            // 鍒犻櫎涓昏〃鏁版嵁
+            ProductProcessRouteItem deleteProductProcessRouteItem = productProcessRouteItemMapper.selectById(routeItemId);
+            Long productRouteId = deleteProductProcessRouteItem.getProductRouteId();
+            // 鍒犻櫎鎸囧畾鏁版嵁
+            productProcessRouteItemMapper.deleteById(id);
+            // 鏌ヨ璇ュ伐鑹鸿矾绾跨殑鎵�鏈夊伐搴忓苟鎸夌収椤哄簭鎺掑簭
+            List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery()
+                    .eq(ProductProcessRouteItem::getProductRouteId, productRouteId)
+                    .orderByAsc(ProductProcessRouteItem::getDragSort));
+            // 閲嶆柊璁剧疆鎺掑簭鍊硷紝浣垮簭鍙疯繛缁�
+            for (int i = 0; i < productProcessRouteItems.size(); i++) {
+                ProductProcessRouteItem item = productProcessRouteItems.get(i);
+                if (!item.getDragSort().equals(i + 1)) {
+                    item.setDragSort(i + 1);
+                    productProcessRouteItemMapper.updateById(item);
+                }
+            }
+            return R.ok();
+        } catch (Exception e) {
+            throw new RuntimeException("鍒犻櫎鐢熶骇宸ヨ壓璺嚎澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    @Override
+    public R addRouteItem(ProductProcessRouteItem productProcessRouteItem) {
+        ProductOrder productOrder = productOrderMapper.selectById(productProcessRouteItem.getProductOrderId());
+        int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
+        // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
+        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        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(productProcessRouteItem.getProductOrderId());
+            productWorkOrder.setPlanQuantity(productOrder.getQuantity());
+            productWorkOrder.setWorkOrderNo(workOrderNoStr);
+            productWorkOrder.setStatus(1);
+            productWorkOrderMapper.insert(productWorkOrder);
+        }
+        return R.ok();
+    }
+
+    @Override
+    public int sortRouteItem(ProductProcessRouteItem productProcessRouteItem) {
+        //鏌ヨ琚敼鍔ㄧ殑杩欐潯鏁版嵁
+        ProductProcessRouteItem oldProductProcessRouteItem = productProcessRouteItemMapper.selectById(productProcessRouteItem.getId());
+        //鏌ヨ璇ュ伐鑹鸿矾绾跨殑鎵�鏈夊伐搴忓苟鎸夌収椤哄簭鎺掑簭
+        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery()
+                .eq(ProductProcessRouteItem::getProductRouteId, oldProductProcessRouteItem.getProductRouteId())
+                .orderByAsc(ProductProcessRouteItem::getDragSort));
+        // 鑾峰彇鐩爣浣嶇疆锛堢Щ鍔ㄥ埌绗嚑涓箣鍚庯級
+        Integer targetPosition = productProcessRouteItem.getDragSort();
+        if (targetPosition != null && targetPosition >= 0) {
+            // 绉诲姩鍏冪礌鍒版柊鐨勪綅缃�
+            productProcessRouteItems.remove(oldProductProcessRouteItem);
+            productProcessRouteItems.add(targetPosition-1, oldProductProcessRouteItem);
+            // 鏇存柊鎵�鏈夊彈褰卞搷鐨勬帓搴忓瓧娈�
+            for (int i = 0; i < productProcessRouteItems.size(); i++) {
+                ProductProcessRouteItem item = productProcessRouteItems.get(i);
+                if (!item.getId().equals(oldProductProcessRouteItem.getId())) {
+                    // 妫�鏌ユ槸鍚﹂渶瑕佹洿鏂版帓搴忓��
+                    if (item.getDragSort() != i+1) {
+                        item.setDragSort(i+1);
+                        productProcessRouteItemMapper.updateById(item);
+                    }
+                } else {
+                    // 鏇存柊鍘熻褰曠殑鏂版帓搴忎綅缃�
+                    oldProductProcessRouteItem.setDragSort(targetPosition);
+                    productProcessRouteItemMapper.updateById(oldProductProcessRouteItem);
+                }
+            }
+            return 1;
+        }
+        return 0;
+    }
+
 }

--
Gitblit v1.9.3