From 60761f72f43b1c805e5e788f7f7a2be2c9991f64 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 17 四月 2026 09:31:38 +0800
Subject: [PATCH] feat: 销售订单新增的生产订单移除工艺路线与BOM,改为查询对应的部件类型

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |  100 +++++++++++++++++----------------
 src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java          |   19 +++++-
 doc/君歌化工.sql                                                                  |   14 ++++
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java                |    5 -
 4 files changed, 82 insertions(+), 56 deletions(-)

diff --git "a/doc/\345\220\233\346\255\214\345\214\226\345\267\245.sql" "b/doc/\345\220\233\346\255\214\345\214\226\345\267\245.sql"
index 446d326..bf29b5d 100644
--- "a/doc/\345\220\233\346\255\214\345\214\226\345\267\245.sql"
+++ "b/doc/\345\220\233\346\255\214\345\214\226\345\267\245.sql"
@@ -16,4 +16,16 @@
     ADD COLUMN `product_model_id` bigint NULL COMMENT '浜у搧ID' AFTER `id`,
     MODIFY COLUMN `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '宸ュ簭鍚嶇О' AFTER `no`,
     MODIFY COLUMN `create_time` datetime NULL DEFAULT NULL COMMENT '褰曞叆鏃堕棿' AFTER `dept_id`,
-    MODIFY COLUMN `update_time` datetime NULL DEFAULT NULL COMMENT '鏇存柊鏃堕棿' AFTER `create_time`;
\ No newline at end of file
+    MODIFY COLUMN `update_time` datetime NULL DEFAULT NULL COMMENT '鏇存柊鏃堕棿' AFTER `create_time`;
+
+ALTER TABLE `product-inventory-management-jghg`.`product_process_route_item`
+    ADD COLUMN `planned_work_hours` decimal(15, 2) NULL COMMENT '璁″垝宸ユ椂' AFTER `product_order_id`,
+    MODIFY COLUMN `product_route_id` bigint NULL DEFAULT 0 COMMENT '鐢熶骇璁㈠崟鐨勫伐鑹鸿矾绾縤d' AFTER `product_order_id`;
+
+ALTER TABLE `product-inventory-management-jghg`.`product_work_order`
+    MODIFY COLUMN `product_process_route_item_id` bigint NULL DEFAULT 0 COMMENT '宸ヨ壓璺嚎椤圭洰id' AFTER `id`;
+
+ALTER TABLE `product-inventory-management-jghg`.`product_process_route_item`
+    ADD COLUMN `type`         int          NULL COMMENT '绫诲瀷1-鍔犲伐锛�2-鍒澘鍐疯姱鍒朵綔銆�3-绠¤矾缁勫銆�4-缃愪綋杩炴帴鍙婅皟璇曪紝5-娴嬭瘯鎵撳帇锛�6-鍏朵粬' AFTER `dept_id`,
+    ADD COLUMN `planner_id`   bigint       NULL COMMENT '璁″垝浜哄憳ID' AFTER `type`,
+    ADD COLUMN `planner_name` varchar(255) NULL COMMENT '璁″垝浜哄憳濮撳悕' AFTER `planner_id`;
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 2d3e608..9a58b22 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -145,7 +145,7 @@
 
     @Autowired
     private ProductProcessMapper productProcessMapper;
-    
+
     @Autowired
     private AccountExpenseMapper accountExpenseMapper;
 
@@ -2480,8 +2480,7 @@
     }
 
     @Override
-    public List<processDataProductionStatisticsDto> processDataProductionStatistics(Integer type,
-                                                                                    List<Long> processIds) {
+    public List<processDataProductionStatisticsDto> processDataProductionStatistics(Integer type, List<Long> processIds) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         Long userId = SecurityUtils.isAdmin(loginUser.getUserId()) ? null : loginUser.getUserId();
 
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java b/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
index 1f7c585..20e0931 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
@@ -4,6 +4,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
@@ -22,7 +23,7 @@
     @ApiModelProperty(value = "宸ュ簭id")
     private Long processId;
 
-    @ApiModelProperty(value ="浜у搧id")
+    @ApiModelProperty(value = "浜у搧id")
     private Long productModelId;
 
     @ApiModelProperty(value = "绉熸埛ID")
@@ -35,10 +36,10 @@
     @TableField(fill = FieldFill.UPDATE)
     private LocalDateTime updateTime;
 
-    @ApiModelProperty(value ="鎷栧姩鎺掑簭")
+    @ApiModelProperty(value = "鎷栧姩鎺掑簭")
     private Integer dragSort;
 
-    @ApiModelProperty(value ="鏄惁璐ㄦ")
+    @ApiModelProperty(value = "鏄惁璐ㄦ")
     private Boolean isQuality;
 
     @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
@@ -48,4 +49,16 @@
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
 
+    @ApiModelProperty("璁″垝宸ユ椂")
+    private BigDecimal plannedWorkHours;
+
+    @ApiModelProperty("閮ㄤ欢绫诲瀷")
+    private Integer type;
+
+    @ApiModelProperty("璁″垝浜哄憳ID")
+    private Long plannerId;
+
+    @ApiModelProperty("璁″垝浜哄憳濮撳悕")
+    private String plannerName;
+
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index 68b52cb..e4eb0f3 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -73,6 +73,7 @@
 
     private ProcessRouteMapper processRouteMapper;
     private ProductProcessRouteMapper productProcessRouteMapper;
+    private ProductProcessMapper productProcessMapper;
 
     private ProductWorkOrderMapper productWorkOrderMapper;
     private ProductionProductMainMapper productionProductMainMapper;
@@ -83,7 +84,6 @@
     private ShippingInfoServiceImpl shippingInfoService;
 
     private StockUtils stockUtils;
-
 
 
     @Autowired
@@ -104,14 +104,14 @@
 //        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
 //                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
         List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct);
-        if(!CollectionUtils.isEmpty(salesLedgerProducts)){
+        if (!CollectionUtils.isEmpty(salesLedgerProducts)) {
             salesLedgerProducts.forEach(item -> {
                 // 鍙戣揣淇℃伅
                 ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
                         .eq(ShippingInfo::getSalesLedgerProductId, item.getId())
                         .orderByDesc(ShippingInfo::getCreateTime)
                         .last("limit 1"));
-                if(shippingInfo != null){
+                if (shippingInfo != null) {
                     item.setShippingDate(shippingInfo.getShippingDate());
                     item.setShippingCarNumber(shippingInfo.getShippingCarNumber());
                     item.setShippingStatus(shippingInfo.getStatus());
@@ -131,8 +131,8 @@
                     BigDecimal noInvoiceNum = BigDecimal.ZERO;
                     BigDecimal noInvoiceAmount = BigDecimal.ZERO;
                     for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) {
-                        if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){
-                            invoiceNum =  invoiceNum.add(registrationProductDto.getInvoiceNum());
+                        if (ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()) {
+                            invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum());
                             invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount());
                         }
                     }
@@ -166,7 +166,7 @@
         //鍒犻櫎鍙戣揣淇℃伅
         List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
                 .in(ShippingInfo::getSalesLedgerProductId, Arrays.asList(ids)));
-        if(!CollectionUtils.isEmpty(shippingInfos)){
+        if (!CollectionUtils.isEmpty(shippingInfos)) {
             shippingInfoService.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
         }
 
@@ -203,12 +203,12 @@
     @Transactional(rollbackFor = Exception.class)
     public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) {
         // 寰呭洖娆撅紝浠樻
-        if(salesLedgerProduct.getType().equals(1)){
+        if (salesLedgerProduct.getType().equals(1)) {
             salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal()));
             //鏈紑绁ㄦ暟閲�+閲戦
             salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
             salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
-        }else{
+        } else {
             salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal()));
             // 鏈潵绁ㄦ暟閲�+閲戦
             salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
@@ -276,60 +276,61 @@
         productOrder.setCompleteQuantity(BigDecimal.ZERO);//瀹屾垚鏁伴噺
         productOrderMapper.insert(productOrder);
 
-        List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda()
-                .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())
-                .orderByDesc(ProcessRoute::getCreateTime));
-        if (processRoutes.size()>0){
-            ProcessRoute processRoute = processRoutes.get(0);
-            //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
+        // 鏌ヨ璇ヤ骇鍝佸瀷鍙峰搴旂殑宸ュ簭
+        List<ProductProcess> productProcesses = productProcessMapper.selectList(new QueryWrapper<ProductProcess>().lambda()
+                .eq(ProductProcess::getProductModelId, salesLedgerProduct.getProductModelId())
+                .orderByAsc(ProductProcess::getId));
+        if (!CollectionUtils.isEmpty(productProcesses)) {
             ProductProcessRoute productProcessRoute = new ProductProcessRoute();
-            productProcessRoute.setProductModelId(processRoute.getProductModelId());
-            productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
+            productProcessRoute.setProductModelId(salesLedgerProduct.getProductModelId());
             productProcessRoute.setProductOrderId(productOrder.getId());
-            productProcessRoute.setBomId(processRoute.getBomId());
             productProcessRouteMapper.insert(productProcessRoute);
-            //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎瀛愯〃
-            List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
+
             // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
             String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-            for (ProcessRouteItem processRouteItem : processRouteItems) {
+            // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿锛屼綔涓哄悗缁伐鍗曞彿鐨勮捣濮嬪簭鍙�
+            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;
+                    }
+                }
+            }
+
+            // 鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎瀛愯〃 + 宸ュ崟
+            for (int i = 0; i < productProcesses.size(); i++) {
+                ProductProcess process = productProcesses.get(i);
+
                 ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
-                productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
-                productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
+                productProcessRouteItem.setProductModelId(salesLedgerProduct.getProductModelId());
+                productProcessRouteItem.setProcessId(process.getId());
                 productProcessRouteItem.setProductOrderId(productOrder.getId());
                 productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
-                productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
+                productProcessRouteItem.setDragSort(i + 1);
+                productProcessRouteItem.setIsQuality(process.getIsQuality());
+                productProcessRouteItem.setPlannedWorkHours(process.getSalaryQuota());
+
                 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 = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
+                    sequenceNumber++;
+
                     ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                     productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                     productWorkOrder.setProductOrderId(productOrder.getId());
                     productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
                     productWorkOrder.setWorkOrderNo(workOrderNoStr);
                     productWorkOrder.setStatus(1);
-
                     productWorkOrderMapper.insert(productWorkOrder);
                 }
-
             }
-            productOrder.setRouteId(processRoute.getId());
-            productOrderMapper.updateById(productOrder);
         }
     }
 
@@ -431,9 +432,9 @@
         IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPage(page, salesLedgerProduct);
         salesLedgerProductDtoIPage.getRecords().forEach(item -> {
             // 鍒ゆ柇鐘舵��
-            if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){
+            if (item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0) {
                 item.setStatusName("宸插畬鎴愪粯娆�");
-            }else{
+            } else {
                 item.setStatusName("鏈畬鎴愪粯娆�");
             }
         });
@@ -445,9 +446,9 @@
         IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPagePurchaseLedger(page, salesLedgerProduct);
         salesLedgerProductDtoIPage.getRecords().forEach(item -> {
             // 鍒ゆ柇鐘舵��
-            if(item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0){
+            if (item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0) {
                 item.setStatusName("宸插畬鎴愪粯娆�");
-            }else{
+            } else {
                 item.setStatusName("鏈畬鎴愪粯娆�");
             }
         });
@@ -488,6 +489,7 @@
             throw new RuntimeException("鍔ㄦ�佹洿鏂颁富琛ㄩ噾棰濆け璐�", e);
         }
     }
+
     @Override
     public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) {
         //鑾峰彇浜у搧鏈�鏂扮殑宸ヨ壓璺嚎
@@ -506,7 +508,7 @@
 
             //鎵�闇�鏁伴噺
             BigDecimal multiply = salesLedgerProduct.getQuantity().multiply(productStructureDto.getUnitQuantity());
-            BigDecimal subtract =stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
+            BigDecimal subtract = stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
             if (subtract.compareTo(BigDecimal.ZERO) <= 0) {
                 count++;
                 stringBuffer.append(productStructureDto.getProductName())
@@ -517,9 +519,9 @@
                         .append(System.lineSeparator());
             }
         }
-        if (count>0) {
+        if (count > 0) {
             return R.fail(stringBuffer.toString());
-        }else {
+        } else {
             return R.ok();
         }
     }

--
Gitblit v1.9.3