From a2891398ea8c4c066d46cb8f174556ebbd93c7f9 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 27 三月 2026 17:52:01 +0800
Subject: [PATCH] yys 1.完善销售下单,生成生产订单

---
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java |  154 +++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 118 insertions(+), 36 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 c0b6691..39c4591 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -3,27 +3,38 @@
 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.StockQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
+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.ProductBomDto;
 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;
 
@@ -38,6 +49,9 @@
 
     @Autowired
     private ProductProcessRouteMapper productProcessRouteMapper;
+
+    @Autowired
+    private ProductStructureRecordMapper productStructureRecordMapper;
 
     @Autowired
     private ProcessRouteItemMapper processRouteItemMapper;
@@ -66,9 +80,30 @@
     @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
@@ -81,46 +116,57 @@
         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 = "GD" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        for (ProcessRouteItem processRouteItem : processRouteItems) {
-            ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
-            productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
-            productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
+        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        for (ProductProcessRouteItem productProcessRouteItem : processRouteItems) {
+            productProcessRouteItem.setProductModelId(productOrder.getProductModelId());
             productProcessRouteItem.setProductOrderId(productOrder.getId());
             productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
-            productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
             int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
             if (insert > 0) {
                 // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
                 ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
-                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 = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
+                String workOrderNoStr = getWorkOrderNoStr(lastWorkOrder, datePrefix); // 宸ュ崟鍙�
                 ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                 productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                 productWorkOrder.setProductOrderId(productOrder.getId());
-                ProductOrder order = productOrderMapper.selectById(productOrder.getId());
-                productWorkOrder.setPlanQuantity(order.getQuantity());
+                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
@@ -134,27 +180,31 @@
     }
 
     @Override
-    public Boolean addProductOrder(ProductOrder productOrder) {
+    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
-    public Boolean delete(Long[] ids) {
-
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delete(Long[] idList) {
         //鎵归噺鏌ヨproductOrder
         List<ProductOrder> productOrders = productOrderMapper.selectList(
                 new LambdaQueryWrapper<ProductOrder>()
-                        .in(ProductOrder::getId, ids)
+                        .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(
@@ -190,7 +240,7 @@
                     // 鍒犻櫎浜у嚭琛ㄣ�佹姇鍏ヨ〃鏁版嵁
                     if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) {
                         productionProductOutputMapper.deleteByProductMainIds(productMainIds);
-                        productionProductInputMapper.deleteByProductMainIds(productMainIds);
+                        productionProductInputMapper.deleteByProductMainIds(ids);
                         List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
                                 new LambdaQueryWrapper<QualityInspect>()
                                         .in(QualityInspect::getProductMainId, productMainIds)
@@ -198,9 +248,9 @@
                         //鍒犻櫎鍑哄簱璁板綍
                         for (Long productMainId : productMainIds) {
                             //鍒犻櫎鐢熶骇鍑哄簱璁板綍
-                            stockUtils.deleteStockOutRecord(productMainId, StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
+                            stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
                             //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
-                            stockUtils.deleteStockInRecord(productMainId, StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+                            stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
                         }
                         qualityInspects.forEach(qualityInspect -> {
                             //inspectState=1 宸叉彁浜� 涓嶈兘鍒犻櫎
@@ -232,10 +282,42 @@
             // 鎵归噺鍒犻櫎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<>();

--
Gitblit v1.9.3