From 458def14d8a8c9b88179cca983573a8b8ec6e27c Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 27 三月 2026 16:58:17 +0800
Subject: [PATCH] yys 1.修改bug

---
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java |  303 ++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 276 insertions(+), 27 deletions(-)

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 14426c4..85c21ce 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -1,20 +1,42 @@
 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.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductOrderDto;
+import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
-import com.ruoyi.production.service.ProcessRouteService;
 import com.ruoyi.production.service.ProductOrderService;
+import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
+import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.service.impl.StockInventoryServiceImpl;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder> implements ProductOrderService {
@@ -29,6 +51,9 @@
     private ProductProcessRouteMapper productProcessRouteMapper;
 
     @Autowired
+    private ProductStructureRecordMapper productStructureRecordMapper;
+
+    @Autowired
     private ProcessRouteItemMapper processRouteItemMapper;
 
     @Autowired
@@ -37,10 +62,48 @@
     @Autowired
     private ProductWorkOrderMapper productWorkOrderMapper;
 
+    @Autowired
+    private ProductionProductMainMapper productionProductMainMapper;
+
+    @Autowired
+    private ProductionProductOutputMapper productionProductOutputMapper;
+
+    @Autowired
+    private ProductionProductInputMapper productionProductInputMapper;
+
+    @Autowired
+    private QualityInspectMapper qualityInspectMapper;
+
+    @Autowired
+    private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+
+    @Autowired
+    private StockUtils stockUtils;
+
+    @Autowired
+    private StockInventoryServiceImpl stockInventoryService;
+
+    @Autowired
+    private CommonFileServiceImpl commonFileService;
 
     @Override
     public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
-        return productOrderMapper.pageProductOrder(page, productOrder);
+        IPage<ProductOrderDto> productOrderDtoIPage = productOrderMapper.pageProductOrder(page, productOrder);
+        productOrderDtoIPage.getRecords().forEach(productOrderDto -> {
+            // 鑾峰彇浜у搧鍚堟牸搴撳瓨
+            StockInventoryDto stockInventoryDto = new StockInventoryDto();
+            stockInventoryDto.setProductModelId(productOrderDto.getProductModelId());
+            stockInventoryDto.setProductType(1);
+            Page page1 = new Page<>(1,1);
+            IPage<StockInventoryDto> stockInventoryDtoIPage = stockInventoryService.pagestockInventory(page1,stockInventoryDto);
+            if(stockInventoryDtoIPage.getTotal() > 0){
+                productOrderDto.setInventoryQuantity(stockInventoryDtoIPage.getRecords().get(0).getQualitity());
+            }
+            // 闄勪欢
+            productOrderDto.setSalesLedgerFiles(commonFileService.getFileListByBusinessId(productOrderDto.getId()
+            , FileNameType.PRODUCT_ORDER.getValue()));
+        });
+        return productOrderDtoIPage;
     }
 
     @Override
@@ -53,52 +116,238 @@
         productProcessRoute.setProductOrderId(productOrder.getId());
         productProcessRoute.setBomId(processRoute.getBomId());
         productProcessRouteMapper.insert(productProcessRoute);
+        // 缁戝畾鐢熶骇bom娓呭崟
+        List<ProductStructureRecord> productStructureDtos = productOrder.getProductStructureRecords();
+        productStructureDtos.forEach(item ->{
+            item.setProductOrderId(productOrder.getId());
+            productStructureRecordMapper.insert(item);
+        });
         //鏂板鐢熶骇璁㈠崟涓嬬殑宸ヨ壓璺嚎瀛愯〃
-        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
+        List<ProductProcessRouteItem> processRouteItems = productOrder.getProcessRouteItems();
         // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
         String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        for (ProcessRouteItem processRouteItem : processRouteItems) {
-            ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
-            productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
-            productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
+        for (ProductProcessRouteItem productProcessRouteItem : processRouteItems) {
+            productProcessRouteItem.setProductModelId(productOrder.getProductModelId());
             productProcessRouteItem.setProductOrderId(productOrder.getId());
             productProcessRouteItem.setProductRouteId(productProcessRoute.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 lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
+                String workOrderNoStr = getWorkOrderNoStr(lastWorkOrder, datePrefix); // 宸ュ崟鍙�
                 ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                 productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                 productWorkOrder.setProductOrderId(productOrder.getId());
-                productWorkOrder.setPlanQuantity(productOrder.getQuantity());
+                ProductOrder order = productOrderMapper.selectById(productOrder.getId());
+                productWorkOrder.setPlanQuantity(BigDecimal.valueOf(productProcessRouteItem.getPlanNum()));
                 productWorkOrder.setWorkOrderNo(workOrderNoStr);
+                productWorkOrder.setPlanStartTime(productProcessRouteItem.getPlanStartTime());
+                productWorkOrder.setPlanEndTime(productProcessRouteItem.getPlanEndTime());
                 productWorkOrder.setStatus(1);
+                productWorkOrder.setUserPower(productProcessRouteItem.getUserPower());
                 productWorkOrderMapper.insert(productWorkOrder);
             }
         }
         return productOrderMapper.updateById(productOrder);
     }
 
+    @NotNull
+    private static String getWorkOrderNoStr(ProductWorkOrder lastWorkOrder, String datePrefix) {
+        int sequenceNumber = 1; // 榛樿搴忓彿
+        if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
+            String lastNo = lastWorkOrder.getWorkOrderNo();
+            if (lastNo.startsWith(datePrefix)) {
+                String seqStr = lastNo.substring(datePrefix.length());
+                try {
+                    sequenceNumber = Integer.parseInt(seqStr) + 1;
+                } catch (NumberFormatException e) {
+                    sequenceNumber = 1;
+                }
+            }
+        }
+        // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
+        String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
+        return workOrderNoStr;
+    }
+
     @Override
     public List<ProcessRoute> listProcessRoute(Long productModelId) {
         return productOrderMapper.listProcessRoute(productModelId);
     }
+
+    @Override
+    public List<ProductStructureDto> listProcessBom(Long orderId) {
+        return productOrderMapper.listProcessBom(orderId);
+    }
+
+    @Override
+    public Boolean addProductOrder(ProductOrder productOrder) throws IOException {
+        String string = generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+        productOrder.setNpsNo(string);
+        productOrder.setCompleteQuantity(BigDecimal.ZERO);
+        productOrder.setStatus("寰呯敓浜�");
+        this.save(productOrder);
+        if (ObjectUtils.isNotEmpty(productOrder.getRouteId())) {
+            this.bindingRoute(productOrder);
+        }
+        if(CollectionUtils.isNotEmpty(productOrder.getTempFileIds())){
+            commonFileService.migrateTempFilesToFormal(productOrder.getId(), productOrder.getTempFileIds());
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delete(Long[] idList) {
+        //鎵归噺鏌ヨproductOrder
+        List<ProductOrder> productOrders = productOrderMapper.selectList(
+                new LambdaQueryWrapper<ProductOrder>()
+                        .in(ProductOrder::getId, Arrays.asList(idList))
+        );
+        if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
+            List<Long> ids = productOrders.stream().map(ProductOrder::getId).collect(Collectors.toList());
+
+            // 鎵归噺鏌ヨprocessRouteItems
+            List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
+                    new LambdaQueryWrapper<ProductProcessRouteItem>()
+                            .in(ProductProcessRouteItem::getProductOrderId, ids)
+            );
+
+            if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(allRouteItems)) {
+                // 鑾峰彇瑕佸垹闄ょ殑宸ュ簭椤笽D
+                List<Long> routeItemIds = allRouteItems.stream()
+                        .map(ProductProcessRouteItem::getId)
+                        .collect(Collectors.toList());
+
+                // 鏌ヨ鍏宠仈鐨勫伐鍗旾D
+                List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList(
+                        new LambdaQueryWrapper<ProductWorkOrder>()
+                                .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)
+                );
+                if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(workOrders)) {
+                    List<Long> workOrderIds = workOrders.stream()
+                            .map(ProductWorkOrder::getId)
+                            .collect(Collectors.toList());
+
+                    // 鏌ヨ鍏宠仈鐨勭敓浜т富琛↖D
+                    List<ProductionProductMain> productMains = productionProductMainMapper.selectList(
+                            new LambdaQueryWrapper<ProductionProductMain>()
+                                    .in(ProductionProductMain::getWorkOrderId, workOrderIds)
+                    );
+                    List<Long> productMainIds = productMains.stream()
+                            .map(ProductionProductMain::getId)
+                            .collect(Collectors.toList());
+
+                    // 鍒犻櫎浜у嚭琛ㄣ�佹姇鍏ヨ〃鏁版嵁
+                    if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) {
+                        productionProductOutputMapper.deleteByProductMainIds(ids);
+                        productionProductInputMapper.deleteByProductMainIds(ids);
+                        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
+                                new LambdaQueryWrapper<QualityInspect>()
+                                        .in(QualityInspect::getProductMainId, productMainIds)
+                        );
+                        //鍒犻櫎鍑哄簱璁板綍
+                        for (Long productMainId : productMainIds) {
+                            //鍒犻櫎鐢熶骇鍑哄簱璁板綍
+                            stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
+                            //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
+                            stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+                        }
+                        qualityInspects.forEach(qualityInspect -> {
+                            //inspectState=1 宸叉彁浜� 涓嶈兘鍒犻櫎
+                            if (qualityInspect.getInspectState() == 1) {
+                                throw new RuntimeException("宸叉彁浜ょ殑妫�楠屽崟涓嶈兘鍒犻櫎");
+                            }
+                        });
+                        qualityInspectMapper.deleteByProductMainIds(productMainIds);
+                        salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
+                                .in(SalesLedgerProductionAccounting::getProductMainId, productMainIds));
+                    }
+
+                    // 鍒犻櫎鐢熶骇涓昏〃鏁版嵁
+                    productionProductMainMapper.deleteByWorkOrderIds(workOrderIds);
+
+                    // 鍒犻櫎宸ュ崟鏁版嵁
+                    productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
+                            .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
+                }
+            }
+            // 鎵归噺鍒犻櫎processRouteItem
+            productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
+                    .in(ProductProcessRouteItem::getProductOrderId, ids));
+
+            // 鎵归噺鍒犻櫎productProcessRoute
+            productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
+                    .in(ProductProcessRoute::getProductOrderId, ids));
+
+            // 鎵归噺鍒犻櫎productOrder
+            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
+                    .in(ProductOrder::getId, ids));
+            // 鍒犻櫎闄勪欢
+            commonFileService.deleteByBusinessIds(ids, FileNameType.PRODUCT_ORDER.getValue());
+            // 鍒犻櫎鐢熶骇璁㈠崟-鐗╂枡娓呭崟
+            productStructureRecordMapper.delete(new LambdaQueryWrapper<ProductStructureRecord>()
+                    .in(ProductStructureRecord::getProductOrderId, ids));
+        }
+
+        return true;
+    }
+
+    @Override
+    public Object startOrPause(ProductOrderDto item) {
+        ProductOrder productOrder = productOrderMapper.selectById(item.getId());
+        if(productOrder == null){
+            throw new ServiceException("鐢熶骇璁㈠崟涓嶅瓨鍦�");
+        }
+        int i;
+        if(item.getOperation().equals(1)){
+            i = 2;
+        } else {
+            i = 1;
+        }
+        productOrder.setStatus(item.getOperation() == 1 ? "鐢熶骇涓�" : "寰呯敓浜�");
+        productOrderMapper.updateById(productOrder);
+        List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(new LambdaQueryWrapper<ProductWorkOrder>()
+                .eq(ProductWorkOrder::getProductOrderId, productOrder.getId()));
+        if(CollectionUtils.isNotEmpty(productWorkOrders)){
+
+            productWorkOrders.forEach(productWorkOrder -> {
+                productWorkOrder.setStatus(i);
+                productWorkOrderMapper.updateById(productWorkOrder);
+            });
+        }
+        return "鎿嶄綔鎴愬姛";
+    }
+
+    //鑾峰彇褰撳墠鐢熶骇璁㈠崟鍙�
+    public String getMaxOrderNoByDate(String datePrefix) {
+        QueryWrapper<ProductOrder> queryWrapper = new QueryWrapper<>();
+        // 鍖归厤浠� SC + 鏃ユ湡寮�澶寸殑璁㈠崟鍙�
+        queryWrapper.likeRight("nps_no", "SC" + datePrefix);
+        // 鎸夎鍗曞彿鍊掑簭鎺掑垪
+        queryWrapper.orderByDesc("nps_no");
+        queryWrapper.last("LIMIT 1");
+
+        ProductOrder latestOrder = this.getOne(queryWrapper);
+        return latestOrder != null ? latestOrder.getNpsNo() : null;
+    }
+
+    public String generateNextOrderNo(String datePrefix) {
+        String maxOrderNo = getMaxOrderNoByDate(datePrefix);
+        int sequence = 1; // 榛樿璧峰搴忓彿
+        if (maxOrderNo != null && !maxOrderNo.isEmpty()) {
+            // 鎻愬彇娴佹按鍙烽儴鍒嗭紙鍋囪鏍煎紡涓� SC + 鏃ユ湡 + 娴佹按鍙凤級
+            String sequenceStr = maxOrderNo.substring(("SC" + datePrefix).length());
+            try {
+                sequence = Integer.parseInt(sequenceStr) + 1;
+            } catch (NumberFormatException e) {
+                // 寮傚父鎯呭喌涓嬮噸缃负1
+                sequence = 1;
+            }
+        }
+        // 鐢熸垚鏂拌鍗曞彿
+        return "SC" + datePrefix + String.format("%04d", sequence);
+    }
+
+
 }

--
Gitblit v1.9.3