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/ProductProcessRouteService.java              |   18 +
 src/main/java/com/ruoyi/production/controller/ProductProcessRouteController.java        |   18 +
 src/main/java/com/ruoyi/production/dto/ProductOrderDto.java                             |   26 
 src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java                           |   24 
 src/main/java/com/ruoyi/production/service/ProductOrderService.java                     |    8 
 src/main/java/com/ruoyi/production/pojo/ProcessRoute.java                               |    3 
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java                          |    8 
 src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java                  |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java     |   29 +
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java           |   24 +
 src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java                       |    5 
 src/main/resources/mapper/production/ProductOrderMapper.xml                             |   32 +
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                  |   26 +
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java            |   86 +++++
 src/main/java/com/ruoyi/common/config/MybatisHandler.java                               |    3 
 src/main/java/com/ruoyi/production/pojo/ProductOrder.java                               |   43 ++
 src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java                        |   61 ++++
 src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java |  189 ++++++++++++
 src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java    |  188 +----------
 src/main/java/com/ruoyi/production/controller/ProductOrderController.java               |   36 ++
 src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java                |   21 +
 src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml                  |    2 
 src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java                    |    5 
 src/main/java/com/ruoyi/production/service/ProductProcessRouteItemService.java          |    7 
 src/main/resources/mapper/production/ProductProcessRouteMapper.xml                      |   26 +
 src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java        |    2 
 26 files changed, 663 insertions(+), 229 deletions(-)

diff --git a/src/main/java/com/ruoyi/common/config/MybatisHandler.java b/src/main/java/com/ruoyi/common/config/MybatisHandler.java
index 71d9b56..adfaf53 100644
--- a/src/main/java/com/ruoyi/common/config/MybatisHandler.java
+++ b/src/main/java/com/ruoyi/common/config/MybatisHandler.java
@@ -18,7 +18,6 @@
             tenantId = SecurityUtils.getLoginUser().getTenantId();
         } catch (Exception ignored) {
         }
-        System.out.println("鎵ц鎻掑叆濉厖...");
         this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
         this.strictInsertFill(metaObject, "updateTime",  LocalDateTime.class, LocalDateTime.now());
         this.strictInsertFill(metaObject, "createUser", Integer.class, userId);
@@ -36,4 +35,4 @@
         this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 璧峰鐗堟湰 3.3.0(鎺ㄨ崘)
         this.strictUpdateFill(metaObject, "updateUser", Integer.class, userId);
     }
-}
\ 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 58b6c06..56ca983 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -514,9 +514,9 @@
         List<ProductOrderDto> productOrderDtoList = new ArrayList<>();
         productOrderList.forEach(productOrder -> {
             ProductOrderDto productOrderDto = productOrderMapper.productMainByOrderId(productOrder);
-            if (productOrderDto != null && productOrderDto.getPlanQuantity() != null && productOrderDto.getQuantity() != null) {
-                productOrderDto.setCompletionStatus(BigDecimal.valueOf(productOrderDto.getPlanQuantity()-productOrderDto.getQuantity()).divide(BigDecimal.valueOf(productOrderDto.getPlanQuantity()), 2, RoundingMode.HALF_UP));
-            }
+//            if (productOrderDto != null && productOrderDto.getPlanQuantity() != null && productOrderDto.getQuantity() != null) {
+//                productOrderDto.setCompletionStatus((productOrderDto.getPlanQuantity().subtract(productOrderDto.getQuantity())).divide(productOrderDto.getPlanQuantity(), 2, RoundingMode.HALF_UP));
+//            }
             productOrderDtoList.add(productOrderDto);
         });
         productionProgressDto.setCompletedOrderDetails(productOrderDtoList);
@@ -525,7 +525,7 @@
 
         // 2. 鍒濆鍖栨眹鎬绘暟鎹�
         int totalCount = productOrderDtoIPage.getRecords().size();
-        int completedCount = (int) productOrderDtoIPage.getRecords().stream().map(productOrderDto -> productOrderMapper.productMainByOrderId(productOrderDto)).filter(productOrderDto1 -> productOrderDto1.getQuantity() != null && productOrderDto1.getQuantity() == 0).count();
+        int completedCount = (int) productOrderDtoIPage.getRecords().stream().map(productOrderDto -> productOrderMapper.productMainByOrderId(productOrderDto)).filter(productOrderDto1 -> productOrderDto1.getQuantity() != null && productOrderDto1.getQuantity().compareTo(BigDecimal.ZERO) == 0).count();
 
         // 6. 璧嬪�兼眹鎬绘暟鎹�
         productionProgressDto.setTotalOrderCount(totalCount);
diff --git a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
index 15a7ca6..978e9b3 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -1,18 +1,26 @@
 package com.ruoyi.production.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.pojo.Customer;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.dto.ProductOrderDto;
+import com.ruoyi.production.pojo.ProcessRoute;
 import com.ruoyi.production.pojo.ProductOrder;
 import com.ruoyi.production.service.ProductOrderService;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 @RequestMapping("productOrder")
 @RestController
+@Api(tags = "鐢熶骇璁㈠崟")
 public class ProductOrderController {
 
     @Autowired
@@ -25,6 +33,28 @@
         return R.ok(productOrderService.pageProductOrder(page, productOrder));
     }
 
+    @ApiOperation("缁戝畾宸ヨ壓璺嚎")
+    @PostMapping("/bindingRoute")
+    public R bindingRoute(@RequestBody ProductOrder productOrder) {
+        return R.ok(productOrderService.bindingRoute(productOrder));
+    }
 
+    @ApiOperation("鏌ヨ瑙勬牸鍨嬪彿瀵瑰簲鐨勫伐鑹鸿矾绾�")
+    @GetMapping("/listProcessRoute")
+    public R listProcessRoute(Long productModelId) {
+        return R.ok(productOrderService.listProcessRoute(productModelId));
+    }
+
+    /**
+     * 瀵煎嚭鐢熶骇璁㈠崟
+     */
+    @Log(title = "鐢熶骇璁㈠崟", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ProductOrderDto productOrderDto) {
+        List<ProductOrderDto> list;
+        list = productOrderService.pageProductOrder(new Page<>(1, -1), productOrderDto).getRecords();
+        ExcelUtil<ProductOrderDto> util = new ExcelUtil<ProductOrderDto>(ProductOrderDto.class);
+        util.exportExcel(response, list, "鐢熶骇璁㈠崟鏁版嵁");
+    }
 
 }
diff --git a/src/main/java/com/ruoyi/production/controller/ProductProcessRouteController.java b/src/main/java/com/ruoyi/production/controller/ProductProcessRouteController.java
new file mode 100644
index 0000000..bb1b010
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductProcessRouteController.java
@@ -0,0 +1,18 @@
+package com.ruoyi.production.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:51:09
+ */
+@RestController
+@RequestMapping("/productProcessRoute")
+public class ProductProcessRouteController {
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java b/src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java
index beefe5e..2d5231d 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java
@@ -2,11 +2,13 @@
 
 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.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.dto.ProductProcessRouteItemDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
 import com.ruoyi.production.service.ProductProcessRouteItemService;
+import com.ruoyi.production.service.ProductProcessRouteService;
 import com.ruoyi.production.service.ProductWorkOrderService;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
@@ -34,175 +36,43 @@
 @Api(tags = "鐢熶骇宸ヨ壓璺嚎")
 public class ProductProcessRouteItemController {
 
-    private final ProductOrderMapper productOrderMapper;
+
     private ProductProcessRouteItemService productProcessRouteItemService;
-
-    private ProductWorkOrderService productWorkOrderService;
-
-    private ProductWorkOrderMapper productWorkOrderMapper;
-
-    private SalesLedgerProductMapper salesLedgerProductMapper;
-
-    private ProductionProductMainMapper productionProductMainMapper;
-
-    private ProductionProductInputMapper productionProductInputMapper;
-
-    private ProductionProductOutputMapper productionProductOutputMapper;
-
-    private QualityInspectMapper qualityInspectMapper;
-
-    private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+    private ProductProcessRouteService productProcessRouteService;
 
     @GetMapping("list")
-    @ApiOperation("鏍规嵁Id鏌ヨ宸ヨ壓椤圭洰")
+    @ApiOperation("鏍规嵁Id鏌ヨ宸ヨ壓璺嚎瀛愯〃")
     public R list(Long orderId) {
         return R.ok(productProcessRouteItemService.listItem(orderId));
     }
 
-    @PostMapping("/updateRouteItem")
-    @ApiOperation("鎵归噺鏂板淇敼")
-    @Transactional(rollbackFor = Exception.class)
-    public R addOrUpdate(@RequestBody ProductProcessRouteItemDto processRouteItemDto) {
-
-        ProductOrder productOrder = productOrderMapper.selectById(processRouteItemDto.getRouteId());
-        if (productOrder == null) {
-            return R.fail("鏈壘鍒癐D涓篬" + processRouteItemDto.getRouteId() + "]鐨勪骇鍝佽鍗�");
-        }
-        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectOne(new LambdaQueryWrapper<SalesLedgerProduct>()
-                .eq(SalesLedgerProduct::getSalesLedgerId, productOrder.getSalesLedgerId()));
-
-        if (salesLedgerProduct == null) {
-            return R.fail("鏈壘鍒伴攢鍞彴璐D涓篬" + productOrder.getSalesLedgerId() + "]鐨勫彴璐︿骇鍝�");
-        }
-
-        List<ProductProcessRouteItem> items = processRouteItemDto.getProcessRouteItem();
-        if (CollectionUtils.isEmpty(items)) {
-            return R.ok();
-        }
-
-        Map<Boolean, List<ProductProcessRouteItem>> partitioned = items.stream()
-                .collect(Collectors.partitioningBy(
-                        item -> item.getId() != null && item.getId() > 0
-                ));
-
-        List<ProductProcessRouteItem> toUpdate = partitioned.get(true);
-        List<ProductProcessRouteItem> toInsert = partitioned.get(false);
-        // 鎵归噺澶勭悊
-        boolean result = true;
-        if (!toInsert.isEmpty()) {
-            result = productProcessRouteItemService.saveBatch(toInsert);
-            if (result) {
-                // 鐢熸垚宸ュ崟鍙�
-                String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-                // 鏌ヨ浠婃棩鏈�澶у伐鍗曞彿
-                QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
-                queryWrapper.likeRight("work_order_no", datePrefix)
-                        .select("MAX(work_order_no) as maxNo");
-
-                List<Map<String, Object>> maxNoList = productWorkOrderMapper.selectMaps(queryWrapper);
-                String maxWorkOrderNo = null;
-                if (!maxNoList.isEmpty() && maxNoList.get(0) != null && maxNoList.get(0).get("maxNo") != null) {
-                    maxWorkOrderNo = maxNoList.get(0).get("maxNo").toString();
-                }
-                int startSequence = 1;
-                if (maxWorkOrderNo != null && maxWorkOrderNo.startsWith(datePrefix)) {
-                    try {
-                        String seqStr = maxWorkOrderNo.substring(datePrefix.length());
-                        startSequence = Integer.parseInt(seqStr) + 1;
-                    } catch (NumberFormatException e) {
-                        startSequence = 1;
-                    }
-                }
-                // 鎵归噺鐢熸垚宸ュ崟
-                List<ProductWorkOrder> workOrders = new ArrayList<>();
-                for (int i = 0; i < toInsert.size(); i++) {
-                    ProductProcessRouteItem item = toInsert.get(i);
-                    String workOrderNoStr = String.format("%s%03d", datePrefix, startSequence + i);
-                    ProductWorkOrder workOrder = new ProductWorkOrder();
-                    workOrder.setProductProcessRouteItemId(item.getId());
-                    workOrder.setProductOrderId(item.getRouteId());
-                    workOrder.setWorkOrderNo(workOrderNoStr);
-                    workOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
-                    workOrder.setStatus(1);
-                    workOrders.add(workOrder);
-                }
-                result = productWorkOrderService.saveBatch(workOrders);
-            }
-        }
-        if (!toUpdate.isEmpty()) {
-            result = productProcessRouteItemService.updateBatchById(toUpdate) && result;
-        }
-        return R.ok(result);
+    @GetMapping("listMain")
+    @ApiOperation("鏍规嵁Id鏌ヨ宸ヨ壓璺嚎涓昏〃")
+    public R listMain(Long orderId) {
+        return R.ok(productProcessRouteService.listMain(orderId));
     }
 
-    @DeleteMapping("/deleteRouteItem")
+    @PostMapping("/addRouteItem")
+    @ApiOperation("鏂板鐢熶骇璁㈠崟鐨勫伐鑹鸿矾绾胯鎯�")
+    public R addRouteItem(@RequestBody ProductProcessRouteItem productProcessRouteItem) {
+        return productProcessRouteItemService.addRouteItem(productProcessRouteItem);
+    }
+
+    @PostMapping("/updateRouteItem")
+    @ApiOperation("淇敼鐢熶骇璁㈠崟鐨勫伐鑹鸿矾绾胯鎯�")
+    public R updateRouteItem(@RequestBody ProductProcessRouteItem productProcessRouteItem) {
+        return R.ok(productProcessRouteItemService.updateById(productProcessRouteItem));
+    }
+
+    @DeleteMapping("/deleteRouteItem/{id}")
     @ApiOperation("鍒犻櫎鐢熶骇宸ヨ壓璺嚎")
-    @Transactional(rollbackFor = Exception.class)
-    public R deleteRouteItem(@RequestBody ProductProcessRouteItemDto processRouteItemDto) {
+    public R deleteRouteItem(@PathVariable("id") Long id) {
+        return productProcessRouteItemService.deleteRouteItem(id);
+    }
 
-        if (processRouteItemDto == null || processRouteItemDto.getId() == null) {
-            return R.fail("鍒犻櫎澶辫触锛氬伐鑹鸿矾绾块」ID涓嶈兘涓虹┖");
-        }
-        Long routeItemId = processRouteItemDto.getId();
-
-        try {
-            // 鏌ヨ宸ュ崟
-            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectOne(
-                    new LambdaQueryWrapper<ProductWorkOrder>()
-                            .eq(ProductWorkOrder::getProductProcessRouteItemId, routeItemId)
-                            .last("LIMIT 1")
-            );
-            if (productWorkOrder == null) {
-                return R.fail("鍒犻櫎澶辫触锛氭湭鎵惧埌鍏宠仈鐨勭敓浜у伐鍗�");
-            }
-            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));
-
-            // 鍒犻櫎涓昏〃鏁版嵁
-            boolean removeFlag = productProcessRouteItemService.removeById(routeItemId);
-            if (!removeFlag) {
-                return R.fail("鍒犻櫎澶辫触锛氬伐鑹鸿矾绾块」涓昏〃鏁版嵁涓嶅瓨鍦�");
-            }
-
-            return R.ok();
-        } catch (Exception e) {
-            return R.fail("鍒犻櫎鐢熶骇宸ヨ壓璺嚎澶辫触锛�" + e.getMessage());
-        }
+    @PostMapping ("/sortRouteItem")
+    @ApiOperation("鎺掑簭")
+    public R sortRouteItem(@RequestBody ProductProcessRouteItem productProcessRouteItem) {
+        return R.ok(productProcessRouteItemService.sortRouteItem(productProcessRouteItem));
     }
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
index f9fdbbd..3827dd7 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -1,5 +1,7 @@
 package com.ruoyi.production.dto;
 
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import com.ruoyi.production.pojo.ProductOrder;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -7,32 +9,30 @@
 import java.math.BigDecimal;
 
 @Data
+@ExcelIgnoreUnannotated
 public class ProductOrderDto extends ProductOrder {
 
     @ApiModelProperty(value = "閿�鍞悎鍚屽彿")
+    @Excel(name = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
     @ApiModelProperty(value = "椤圭洰鍚�")
+    @Excel(name = "椤圭洰鍚�")
     private String projectName;
 
-    @ApiModelProperty(value = "瀹㈡埛鍚�")
+    @ApiModelProperty(value = "瀹㈡埛鍚嶇О")
+    @Excel(name = "瀹㈡埛鍚嶇О")
     private String customerName;
 
     @ApiModelProperty(value = "浜у搧鍚嶇О")
+    @Excel(name = "浜у搧鍚嶇О")
     private String productCategory;
 
     @ApiModelProperty(value = "瑙勬牸")
+    @Excel(name = "瑙勬牸")
     private String specificationModel;
-    @ApiModelProperty(value = "璁″垝鏁伴噺")
-    private Integer planQuantity;
-    @ApiModelProperty(value = "鏁伴噺")
-    private Integer Quantity;
-    @ApiModelProperty(value = "宸ュ崟鍙�")
-    private String workOrderNo;
-    @ApiModelProperty(value = "鏄惁鎶ュ伐")
-    private Integer reportWork;
-    @ApiModelProperty(value = "宸ュ崟鐘舵��")
-    private Integer status;
-    @ApiModelProperty(value = "璁㈠崟瀹屾垚搴�")
-    private BigDecimal completionStatus;
+
+    @ApiModelProperty(value = "宸ヨ壓璺嚎缂栧彿")
+    @Excel(name = "宸ヨ壓璺嚎缂栧彿")
+    private String processRouteCode;
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java b/src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java
index 80c1fe3..d235ccb 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java
@@ -23,7 +23,5 @@
 
     private String productName;
 
-
-    private List<ProductProcessRouteItem> processRouteItem;
     private String model;
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
index 9ce5878..7e668b6 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
@@ -4,9 +4,12 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.production.dto.ProductOrderDto;
+import com.ruoyi.production.pojo.ProcessRoute;
 import com.ruoyi.production.pojo.ProductOrder;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface ProductOrderMapper extends BaseMapper<ProductOrder> {
@@ -16,4 +19,6 @@
      * 鏍规嵁璁㈠崟ID鏌ヨ宸ュ崟鎶ュ伐
      */
      ProductOrderDto productMainByOrderId(@Param("c") ProductOrder productOrder);
+
+    List<ProcessRoute> listProcessRoute(@Param("productModelId") Long productModelId);
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java
new file mode 100644
index 0000000..06ae748
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.production.mapper;
+
+import com.ruoyi.production.dto.ProcessRouteDto;
+import com.ruoyi.production.pojo.ProductProcessRoute;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:51:09
+ */
+@Mapper
+public interface ProductProcessRouteMapper extends BaseMapper<ProductProcessRoute> {
+
+    ProcessRouteDto listMain(@Param("orderId") Long orderId);
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java b/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
index d55a17d..2eabc15 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
@@ -18,6 +18,7 @@
     private Long id;
 
     @ApiModelProperty(value = "浜у搧ID")
+    //product_model
     private Long productModelId;
 
     @ApiModelProperty(value = "鎻忚堪")
@@ -32,7 +33,7 @@
     private LocalDateTime createTime;
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-    @TableField(fill = FieldFill.UPDATE)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
 
     @ApiModelProperty(value = "宸ヨ壓璺嚎缂栫爜")
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
index d47062f..c729ea9 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -1,11 +1,15 @@
 package com.ruoyi.production.pojo;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
@@ -24,7 +28,7 @@
     private Long salesLedgerId;
 
     /**
-     * 閿�鍞彴璐︿骇鍝乮d
+     * 閿�鍞彴璐︿骇鍝乮d(sales_ledger_product)
      */
     @ApiModelProperty(value = "閿�鍞彴璐︿骇鍝乮d")
     private Long productModelId;
@@ -39,6 +43,7 @@
      * 鐢熶骇璁㈠崟鍙�
      */
     @ApiModelProperty(value = "鐢熶骇璁㈠崟鍙�")
+    @Excel(name = "鐢熶骇璁㈠崟鍙�")
     private String npsNo;
 
     /**
@@ -51,11 +56,45 @@
     //鍒涘缓鏃堕棿
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "鍒涘缓鏃堕棿")
     private LocalDateTime createTime;
 
     //淇敼鏃堕棿
     @ApiModelProperty(value = "淇敼鏃堕棿")
-    @TableField(fill = FieldFill.UPDATE)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime updateTime;
 
+
+    /**
+     * 闇�姹傛暟閲�
+     */
+    @ApiModelProperty(value = "闇�姹傛暟閲�")
+    @Excel(name = "闇�姹傛暟閲�")
+    private BigDecimal quantity;
+
+    /**
+     * 瀹屾垚鏁伴噺
+     */
+    @ApiModelProperty(value = "瀹屾垚鏁伴噺")
+    @Excel(name = "瀹屾垚鏁伴噺")
+    private BigDecimal completeQuantity;
+
+    @Excel(name = "寮�濮嬫椂闂�")
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime startTime;
+
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    @Excel(name = "缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime endTime;
+
+
+
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java b/src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java
new file mode 100644
index 0000000..fac6d15
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java
@@ -0,0 +1,61 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:51:09
+ */
+@Getter
+@Setter
+@TableName("product_process_route")
+@ApiModel(value = "ProductProcessRoute瀵硅薄", description = "")
+public class ProductProcessRoute implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("浜у搧id")
+    //product_model
+    private Long productModelId;
+
+    @ApiModelProperty("鎻忚堪")
+    private String description;
+
+    @ApiModelProperty("绉熸埛id")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+    @ApiModelProperty("褰曞叆鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍏宠仈bom鐨刬d")
+    private Long bomId;
+
+    @ApiModelProperty("宸ヨ壓璺嚎缂栫爜")
+    private String processRouteCode;
+
+    @ApiModelProperty("鐢熶骇璁㈠崟鐨刬d")
+    private Long productOrderId;
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java b/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
index fb04df8..4b6762c 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
@@ -14,7 +14,10 @@
     private Long id;
 
     @ApiModelProperty(value = "鐢熶骇璁㈠崟id(product_order_id)")
-    private Long routeId;
+    private Long productOrderId;
+
+    @ApiModelProperty(value = "鐢熶骇璁㈠崟鐨勫伐鑹鸿矾绾縤d(product_process_route)")
+    private Long productRouteId;
 
     @ApiModelProperty(value = "宸ュ簭id")
     private Long processId;
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
index f225c45..20801ea 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
@@ -1,8 +1,10 @@
 package com.ruoyi.production.pojo;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -42,13 +44,17 @@
      */
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     /**
      * 淇敼鏃堕棿
      */
     @ApiModelProperty(value = "淇敼鏃堕棿")
-    @TableField(fill = FieldFill.UPDATE)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime updateTime;
 
     /**
@@ -102,20 +108,10 @@
 
 
     /**
-     * 璁″垝鏁伴噺
-     */
-    @ApiModelProperty(value = "璁″垝鏁伴噺")
-    private BigDecimal planQuantity;
-
-    /**
      * 瀹為檯鏁伴噺
      */
     @ApiModelProperty(value = "鏁伴噺")
-    private BigDecimal quantity;
+    private BigDecimal planQuantity;
 
-    /**
-     * 鎶ュ伐id
-     */
-    @ApiModelProperty(value = "鎶ュ伐id")
-    private Long productMainId;
-}
\ No newline at end of file
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/ProductOrderService.java b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
index 325ec47..9dd61fb 100644
--- a/src/main/java/com/ruoyi/production/service/ProductOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -4,10 +4,18 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.production.dto.ProductOrderDto;
+import com.ruoyi.production.pojo.ProcessRoute;
 import com.ruoyi.production.pojo.ProductOrder;
+
+import java.util.List;
 
 
 public interface ProductOrderService extends IService<ProductOrder> {
 
     IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder);
+
+    int bindingRoute(ProductOrder productOrder);
+
+    List<ProcessRoute> listProcessRoute(Long productModelId);
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductProcessRouteItemService.java b/src/main/java/com/ruoyi/production/service/ProductProcessRouteItemService.java
index f527657..c37eea1 100644
--- a/src/main/java/com/ruoyi/production/service/ProductProcessRouteItemService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductProcessRouteItemService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.production.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.dto.ProductProcessRouteItemDto;
 import com.ruoyi.production.pojo.ProductProcessRouteItem;
 
@@ -8,4 +9,10 @@
 
 public interface ProductProcessRouteItemService extends IService<ProductProcessRouteItem> {
     List<ProductProcessRouteItemDto> listItem(Long orderId);
+
+    R deleteRouteItem(Long id);
+
+    R addRouteItem(ProductProcessRouteItem productProcessRouteItem);
+
+    int sortRouteItem(ProductProcessRouteItem productProcessRouteItem);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java b/src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java
new file mode 100644
index 0000000..238aa1e
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java
@@ -0,0 +1,18 @@
+package com.ruoyi.production.service;
+
+import com.ruoyi.production.dto.ProcessRouteDto;
+import com.ruoyi.production.pojo.ProductProcessRoute;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:51:09
+ */
+public interface ProductProcessRouteService extends IService<ProductProcessRoute> {
+
+    ProcessRouteDto listMain(Long orderId);
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java
index 4834dcc..5614366 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java
@@ -37,8 +37,6 @@
         List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery()
                 .eq(ProcessRouteItem::getRouteId, oldProcessRouteItem.getRouteId())
                 .orderByAsc(ProcessRouteItem::getDragSort));
-        //鏌ヨ琚洿鏀圭殑閭f潯鏁版嵁鍘熸潵鏄鍑犳潯
-        int oldIndex = processRouteItems.indexOf(oldProcessRouteItem);
         // 鑾峰彇鐩爣浣嶇疆锛堢Щ鍔ㄥ埌绗嚑涓箣鍚庯級
         Integer targetPosition = processRouteItem.getDragSort();
         if (targetPosition != null && targetPosition >= 0) {
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 26ec8fa..14426c4 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -1,22 +1,104 @@
 package com.ruoyi.production.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.production.dto.ProductOrderDto;
-import com.ruoyi.production.mapper.ProductOrderMapper;
-import com.ruoyi.production.pojo.ProductOrder;
+import com.ruoyi.production.mapper.*;
+import com.ruoyi.production.pojo.*;
+import com.ruoyi.production.service.ProcessRouteService;
 import com.ruoyi.production.service.ProductOrderService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
 
 @Service
 public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder> implements ProductOrderService {
 
     @Autowired
     private ProductOrderMapper productOrderMapper;
+
+    @Autowired
+    private ProcessRouteMapper processRouteMapper;
+
+    @Autowired
+    private ProductProcessRouteMapper productProcessRouteMapper;
+
+    @Autowired
+    private ProcessRouteItemMapper processRouteItemMapper;
+
+    @Autowired
+    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
+
+    @Autowired
+    private ProductWorkOrderMapper productWorkOrderMapper;
+
+
     @Override
     public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
         return productOrderMapper.pageProductOrder(page, productOrder);
     }
+
+    @Override
+    public int bindingRoute(ProductOrder productOrder) {
+        //鏂板鐢熶骇璁㈠崟涓嬬殑宸ヨ壓璺嚎涓昏〃
+        ProcessRoute processRoute = processRouteMapper.selectById(productOrder.getRouteId());
+        ProductProcessRoute productProcessRoute = new ProductProcessRoute();
+        productProcessRoute.setProductModelId(processRoute.getProductModelId());
+        productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
+        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) {
+            ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
+            productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
+            productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
+            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 productWorkOrder = new ProductWorkOrder();
+                productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
+                productWorkOrder.setProductOrderId(productOrder.getId());
+                productWorkOrder.setPlanQuantity(productOrder.getQuantity());
+                productWorkOrder.setWorkOrderNo(workOrderNoStr);
+                productWorkOrder.setStatus(1);
+                productWorkOrderMapper.insert(productWorkOrder);
+            }
+        }
+        return productOrderMapper.updateById(productOrder);
+    }
+
+    @Override
+    public List<ProcessRoute> listProcessRoute(Long productModelId) {
+        return productOrderMapper.listProcessRoute(productModelId);
+    }
 }
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;
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java
new file mode 100644
index 0000000..f5b2e92
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java
@@ -0,0 +1,29 @@
+package com.ruoyi.production.service.impl;
+
+import com.ruoyi.production.dto.ProcessRouteDto;
+import com.ruoyi.production.pojo.ProductProcessRoute;
+import com.ruoyi.production.mapper.ProductProcessRouteMapper;
+import com.ruoyi.production.service.ProductProcessRouteService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:51:09
+ */
+@Service
+public class ProductProcessRouteServiceImpl extends ServiceImpl<ProductProcessRouteMapper, ProductProcessRoute> implements ProductProcessRouteService {
+
+    @Autowired
+    private ProductProcessRouteMapper productProcessRouteMapper;
+
+    @Override
+    public ProcessRouteDto listMain(Long orderId) {
+        return productProcessRouteMapper.listMain(orderId);
+    }
+}
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 503b3c8..88c25eb 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -55,6 +55,7 @@
     private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
 
     private ProcessRouteMapper processRouteMapper;
+    private ProductProcessRouteMapper productProcessRouteMapper;
 
     private ProductWorkOrderMapper productWorkOrderMapper;
 
@@ -136,7 +137,7 @@
             // 鎵归噺鏌ヨprocessRouteItems
             List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
                     new LambdaQueryWrapper<ProductProcessRouteItem>()
-                            .in(ProductProcessRouteItem::getRouteId, orderIds)
+                            .in(ProductProcessRouteItem::getProductOrderId, orderIds)
             );
 
             if (!CollectionUtils.isEmpty(allRouteItems)) {
@@ -149,9 +150,13 @@
                                 .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
             }
 
-            // 鎵归噺鍒犻櫎processRouteItem
+            // 鎵归噺鍒犻櫎productProcessRouteItem
             productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
-                            .in(ProductProcessRouteItem::getRouteId, orderIds));
+                            .in(ProductProcessRouteItem::getProductOrderId, orderIds));
+
+            // 鎵归噺鍒犻櫎productProcessRoute
+            productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
+                    .in(ProductProcessRoute::getProductOrderId, orderIds));
 
             // 鎵归噺鍒犻櫎productOrder
             productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
@@ -190,10 +195,20 @@
             productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
             productOrder.setProductModelId(salesLedgerProduct.getId());
             productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId()));
+            productOrder.setQuantity(salesLedgerProduct.getQuantity());//闇�姹傛暟閲�
+            productOrder.setCompleteQuantity(BigDecimal.ZERO);//瀹屾垚鏁伴噺
             productOrderMapper.insert(productOrder);
 
             ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()));
             if (processRoute != null) {
+                //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
+                ProductProcessRoute productProcessRoute = new ProductProcessRoute();
+                productProcessRoute.setProductModelId(processRoute.getProductModelId());
+                productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
+                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"));
@@ -201,7 +216,8 @@
                     ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
                     productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
                     productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
-                    productProcessRouteItem.setRouteId(productOrder.getId());
+                    productProcessRouteItem.setProductOrderId(productOrder.getId());
+                    productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
                     int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
                     if (insert > 0) {
                         // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 66fabe0..135491b 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -96,6 +96,7 @@
     private final ProductOrderMapper productOrderMapper;
 
     private final ProcessRouteMapper processRouteMapper;
+    private final ProductProcessRouteMapper productProcessRouteMapper;
 
     private final ProcessRouteItemMapper processRouteItemMapper;
 
@@ -400,7 +401,7 @@
             // 鎵归噺鏌ヨprocessRouteItems
             List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
                     new LambdaQueryWrapper<ProductProcessRouteItem>()
-                            .in(ProductProcessRouteItem::getRouteId, orderIds)
+                            .in(ProductProcessRouteItem::getProductOrderId, orderIds)
             );
 
             if (!CollectionUtils.isEmpty(allRouteItems)) {
@@ -455,7 +456,11 @@
             }
             // 鎵归噺鍒犻櫎processRouteItem
             productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
-                    .in(ProductProcessRouteItem::getRouteId, orderIds));
+                    .in(ProductProcessRouteItem::getProductOrderId, orderIds));
+
+            // 鎵归噺鍒犻櫎productProcessRoute
+            productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
+                    .in(ProductProcessRoute::getProductOrderId, orderIds));
 
             // 鎵归噺鍒犻櫎productOrder
             productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
@@ -686,20 +691,30 @@
                 productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
                 productOrder.setProductModelId(salesLedgerProduct.getId());
                 productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId()));
+                productOrder.setQuantity(salesLedgerProduct.getQuantity());//闇�姹傛暟閲�
+                productOrder.setCompleteQuantity(BigDecimal.ZERO);//瀹屾垚鏁伴噺
                 productOrderMapper.insert(productOrder);
 
                 ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()));
                 if (processRoute != null) {
+                    //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
+                    ProductProcessRoute productProcessRoute = new ProductProcessRoute();
+                    productProcessRoute.setProductModelId(processRoute.getProductModelId());
+                    productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
+                    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"));
-                    int dragSort = 1;
                     for (ProcessRouteItem processRouteItem : processRouteItems) {
                         ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
                         productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
                         productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
-                        productProcessRouteItem.setRouteId(productOrder.getId());
-                        productProcessRouteItem.setDragSort(dragSort);
+                        productProcessRouteItem.setProductOrderId(productOrder.getId());
+                        productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
+                        productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
                         int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
                         if (insert > 0) {
                             // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
@@ -732,7 +747,6 @@
                             productWorkOrder.setStatus(1);
                             productWorkOrderMapper.insert(productWorkOrder);
                         }
-                        dragSort++;
                     }
                     productOrder.setRouteId(processRoute.getId());
                     productOrderMapper.updateById(productOrder);
diff --git a/src/main/resources/mapper/production/ProductOrderMapper.xml b/src/main/resources/mapper/production/ProductOrderMapper.xml
index d4ffc40..7fe84fa 100644
--- a/src/main/resources/mapper/production/ProductOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -14,11 +14,17 @@
         <result property="updateTime" column="update_time"/>
     </resultMap>
     <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
-        select po.*,sl.sales_contract_no,sl.customer_name,slp.product_category,slp.specification_model
+        select po.*,
+        sl.sales_contract_no,
+        sl.customer_name,
+        slp.product_category,
+        slp.specification_model,
+        ppr.process_route_code,
+        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus
         from product_order po
         left join sales_ledger sl on po.sales_ledger_id = sl.id
         left join sales_ledger_product slp on po.product_model_id = slp.id
-        left join process_route pr on po.route_id = pr.id
+        left join product_process_route ppr on po.id = ppr.product_order_id
         <where>
             <if test="c.npsNo != null and c.npsNo != ''">
                 and po.nps_no like concat('%',#{c.npsNo},'%')
@@ -38,17 +44,23 @@
         </where>
     </select>
     <select id="productMainByOrderId" resultType="com.ruoyi.production.dto.ProductOrderDto">
-        select
-            po.*,
-            pwo.work_order_no,
-            pwo.report_work,
-            pwo.status,
-            pwo.quantity,
-            pwo.plan_quantity
+        select po.*,
+               pwo.work_order_no,
+               pwo.report_work,
+               pwo.status,
+               pwo.quantity,
+               pwo.plan_quantity
         from product_order po
-        left join product_work_order pwo on po.id = pwo.product_order_id
+                 left join product_work_order pwo on po.id = pwo.product_order_id
         where po.id = #{c.id}
     </select>
+    <select id="listProcessRoute" resultType="com.ruoyi.production.pojo.ProcessRoute">
+        select pr.*
+        from process_route pr
+                 left join product_model pm on pr.product_model_id = pm.id
+                 left join sales_ledger_product slp on pm.id = slp.product_model_id
+        where slp.id = #{productModelId}
+    </select>
 
 
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml b/src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml
index caa7890..13f0ad7 100644
--- a/src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml
+++ b/src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml
@@ -20,7 +20,7 @@
                  left join product_model pm on ppri.product_model_id = pm.id
                  left join product p on pm.product_id = p.id
                  left join product_process pp on pp.id = ppri.process_id
-        where ppri.route_id = #{orderId}
+        where ppri.product_order_id = #{orderId}
         order by ppri.drag_sort
     </select>
 
diff --git a/src/main/resources/mapper/production/ProductProcessRouteMapper.xml b/src/main/resources/mapper/production/ProductProcessRouteMapper.xml
new file mode 100644
index 0000000..dd4809f
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductProcessRouteMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.production.mapper.ProductProcessRouteMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductProcessRoute">
+        <id column="id" property="id"/>
+        <result column="product_model_id" property="productModelId"/>
+        <result column="description" property="description"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="bom_id" property="bomId"/>
+        <result column="process_route_code" property="processRouteCode"/>
+        <result column="product_order_id" property="productOrderId"/>
+    </resultMap>
+    <select id="listMain" resultType="com.ruoyi.production.dto.ProcessRouteDto">
+        select ppr.*, p.product_name, pm.product_id, pm.model, pb.bom_no
+        from product_process_route ppr
+                 left join product_bom pb on ppr.bom_id = pb.id
+                 left join product_model pm on ppr.product_model_id = pm.id
+                 left join product p on pm.product_id = p.id
+        where ppr.product_order_id = #{orderId}
+    </select>
+
+</mapper>

--
Gitblit v1.9.3