From 7ea8883ca6b47ec014a32ed57c3bea64544e893e Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 19 三月 2026 17:09:34 +0800
Subject: [PATCH] feat: 生产订单绑定工艺路线、BOM、工艺路线、工序参数新增修改

---
 src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java          |   10 
 src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java                           |    1 
 src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java    |   43 ++
 src/main/java/com/ruoyi/production/dto/ProductOrderDto.java                                 |   36 +
 src/main/java/com/ruoyi/production/service/ProductOrderService.java                         |    2 
 src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java                         |    4 
 src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java         |   28 +
 src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml                       |    1 
 src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemInstanceDto.java                       |   24 +
 src/main/java/com/ruoyi/appendix/service/AppendixService.java                               |   17 
 src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java               |   14 
 src/main/resources/mapper/production/ProductOrderMapper.xml                                 |   75 ++-
 doc/宁夏-中盛建材.sql                                                                             |   82 ++--
 src/main/java/com/ruoyi/appendix/dto/ProductStructureInstanceDto.java                       |   32 +
 src/main/java/com/ruoyi/production/pojo/ProductProcessParam.java                            |    2 
 src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java                      |  162 +++++---
 src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml                       |    1 
 src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java                    |   28 +
 src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java      |  176 +++++++++
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java                |   18 
 src/main/java/com/ruoyi/production/pojo/ProcessRouteItemParam.java                          |    2 
 src/main/java/com/ruoyi/appendix/controller/AppendixController.java                         |   20 
 src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml                  |   10 
 src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemParamInstanceDto.java                  |   24 +
 src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java      |  131 ++++++
 src/main/java/com/ruoyi/production/pojo/ProductOrder.java                                   |    4 
 src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java |   85 ++++
 /dev/null                                                                                   |   22 -
 src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java               |    7 
 src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java          |   12 
 src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemParamServiceImpl.java       |    2 
 src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java                         |    3 
 src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java         |   49 ++
 33 files changed, 924 insertions(+), 203 deletions(-)

diff --git "a/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql" "b/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql"
index d91f818..39cc073 100644
--- "a/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql"
+++ "b/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql"
@@ -304,54 +304,36 @@
 -- Table structure for process_route_item_param_instance
 -- ----------------------------
 DROP TABLE IF EXISTS `process_route_item_param_instance`;
+
 CREATE TABLE `process_route_item_param_instance`
 (
     `id`               bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID',
+    `order_id`         bigint                                                                 DEFAULT NULL COMMENT '鐢熶骇璁㈠崟ID',
     `route_item_id`    bigint                                                        NOT NULL COMMENT '鍏宠仈宸ヨ壓璺嚎鏄庣粏ID (process_route_item.id)',
-    `param_id`         bigint                                                        NOT NULL COMMENT '鍏宠仈鍩虹鍙傛暟瀹氫箟ID (base_param.id)',
-    `process_param_id` bigint                                                        NULL     DEFAULT NULL COMMENT '鏉ユ簮宸ュ簭鍙傛暟ID',
-    `standard_value`   varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL     DEFAULT NULL COMMENT '姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鍊�',
-    `min_value`        decimal(10, 2)                                                NULL     DEFAULT NULL COMMENT '姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�灏忓��',
-    `max_value`        decimal(10, 2)                                                NULL     DEFAULT NULL COMMENT '姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�澶у��',
-    `is_required`      tinyint                                                       NOT NULL DEFAULT 0 COMMENT '鏄惁蹇呭~',
-    `sort`             int                                                           NOT NULL DEFAULT 0 COMMENT '鎺掑簭',
-    `tenant_id`        bigint                                                        NULL     DEFAULT NULL COMMENT '绉熸埛ID',
-    `create_time`      datetime                                                      NULL     DEFAULT CURRENT_TIMESTAMP,
-    `update_time`      datetime                                                      NULL     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    `process_param_id` bigint                                                                 DEFAULT NULL COMMENT '鏉ユ簮宸ュ簭鍙傛暟ID',
+    `param_key`        varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci          DEFAULT NULL COMMENT '鍙傛暟鍞竴鏍囪瘑',
+    `param_name`       varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '鍙傛暟鍚嶇О',
+    `param_type`       tinyint                                                       NOT NULL COMMENT '鍙傛暟绫诲瀷(1鏁板瓧 2鏂囨湰 3涓嬫媺閫夋嫨 4鏃堕棿)',
+    `param_format`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci          DEFAULT NULL COMMENT '鍙傛暟鏍煎紡',
+    `value_mode`       tinyint                                                                DEFAULT '1' COMMENT '鍊兼ā寮�(1鍗曞�� 2鍖洪棿)',
+    `unit`             varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci           DEFAULT NULL COMMENT '鍗曚綅',
+    `remark`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci          DEFAULT NULL COMMENT '澶囨敞',
+    `standard_value`   varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci          DEFAULT NULL COMMENT '鏍囧噯鍊�',
+    `min_value`        decimal(10, 2)                                                         DEFAULT NULL COMMENT '姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�灏忓��',
+    `max_value`        decimal(10, 2)                                                         DEFAULT NULL COMMENT '姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�澶у��',
+    `is_required`      tinyint                                                       NOT NULL DEFAULT '0' COMMENT '鏄惁蹇呭~',
+    `sort`             int                                                           NOT NULL DEFAULT '0' COMMENT '鎺掑簭',
+    `tenant_id`        bigint                                                                 DEFAULT NULL COMMENT '绉熸埛ID',
+    `create_time`      datetime                                                               DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+    `update_time`      datetime                                                               DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
     PRIMARY KEY (`id`) USING BTREE,
-    INDEX `idx_route_item_id` (`route_item_id` ASC) USING BTREE,
-    INDEX `idx_param_id` (`param_id` ASC) USING BTREE
+    KEY `idx_route_item_id` (`route_item_id`) USING BTREE,
+    KEY `idx_param_key` (`param_key`)
 ) ENGINE = InnoDB
-  AUTO_INCREMENT = 178
-  CHARACTER SET = utf8mb4
-  COLLATE = utf8mb4_0900_ai_ci COMMENT = '宸ヨ壓璺嚎宸ュ簭鍙傛暟-闄勮〃'
-  ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Table structure for product_process_param_instance
--- ----------------------------
-DROP TABLE IF EXISTS `product_process_param_instance`;
-CREATE TABLE `product_process_param_instance`
-(
-    `id`             bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID',
-    `process_id`     bigint                                                        NOT NULL COMMENT '鎵�灞炲伐搴廔D (product_process.id)',
-    `param_id`       bigint                                                        NOT NULL COMMENT '鍏宠仈鍩虹鍙傛暟ID (base_param.id)',
-    `standard_value` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL     DEFAULT NULL COMMENT '鍦ㄦ宸ュ簭璁惧畾鐨勬爣鍑嗗��(鍗曞�兼ā寮�)',
-    `min_value`      decimal(10, 2)                                                NULL     DEFAULT NULL COMMENT '鍦ㄦ宸ュ簭璁惧畾鐨勬爣鍑嗘渶灏忓��(鍖洪棿妯″紡)',
-    `max_value`      decimal(10, 2)                                                NULL     DEFAULT NULL COMMENT '鍦ㄦ宸ュ簭璁惧畾鐨勬爣鍑嗘渶澶у��(鍖洪棿妯″紡)',
-    `is_required`    tinyint                                                       NOT NULL DEFAULT 0 COMMENT '鍦ㄦ宸ュ簭涓槸鍚﹀繀濉�(0-鍚�, 1-鏄�)',
-    `sort`           int                                                           NOT NULL DEFAULT 0 COMMENT '鎺掑簭鍙�',
-    `tenant_id`      bigint                                                        NULL     DEFAULT NULL COMMENT '绉熸埛ID',
-    `create_time`    datetime                                                      NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
-    `update_time`    datetime                                                      NULL     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
-    PRIMARY KEY (`id`) USING BTREE,
-    INDEX `idx_process_id` (`process_id` ASC) USING BTREE,
-    INDEX `idx_param_id` (`param_id` ASC) USING BTREE
-) ENGINE = InnoDB
-  AUTO_INCREMENT = 61
-  CHARACTER SET = utf8mb4
-  COLLATE = utf8mb4_0900_ai_ci COMMENT = '宸ュ簭缁戝畾鍙傛暟-闄勮〃'
-  ROW_FORMAT = Dynamic;
+  AUTO_INCREMENT = 1
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci
+  ROW_FORMAT = DYNAMIC COMMENT ='宸ヨ壓璺嚎宸ュ簭鍙傛暟瀹炰緥琛�';
 
 -- ----------------------------
 -- Table structure for product_structure_instance
@@ -376,6 +358,22 @@
 
 SET FOREIGN_KEY_CHECKS = 1;
 
+
+ALTER TABLE `process_route_item_instance`
+    ADD COLUMN `order_id` bigint NOT NULL COMMENT '鐢熶骇璁㈠崟id' AFTER `id`,
+    ADD INDEX `idx_order_id` (`order_id`);
+
+ALTER TABLE `process_route_item_param_instance`
+    ADD COLUMN `order_id` bigint NOT NULL COMMENT '鐢熶骇璁㈠崟id' AFTER `id`,
+    ADD INDEX `idx_order_id` (`order_id`);
+
+ALTER TABLE `product_structure_instance`
+    ADD COLUMN `order_id` bigint NOT NULL COMMENT '鐢熶骇璁㈠崟id' AFTER `id`,
+    ADD INDEX `idx_order_id` (`order_id`);
+
+ALTER TABLE `product-inventory-management-zsjc`.`product_order`
+    ADD COLUMN `strength` varchar(255) NULL COMMENT '浜у搧绫诲瀷' AFTER `plan_complete_time`;
+
 CREATE TABLE `product-inventory-management-zsjc`.`sales_delivery`  (
    `id` int NOT NULL AUTO_INCREMENT,
    `delivery_date` date NULL COMMENT '渚涜揣鏃ユ湡',
diff --git a/src/main/java/com/ruoyi/appendix/controller/AppendixController.java b/src/main/java/com/ruoyi/appendix/controller/AppendixController.java
index af62eef..e4d4d2f 100644
--- a/src/main/java/com/ruoyi/appendix/controller/AppendixController.java
+++ b/src/main/java/com/ruoyi/appendix/controller/AppendixController.java
@@ -1,8 +1,13 @@
 package com.ruoyi.appendix.controller;
 
+import com.ruoyi.appendix.service.AppendixService;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.pojo.ProductOrder;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
 
 /**
  * <br>
@@ -17,4 +22,15 @@
 @RequestMapping("/appendix")
 @Api("BOM-宸ヨ壓璺嚎闄勮〃鎺у埗灞�")
 public class AppendixController {
+
+    @Resource
+    private AppendixService appendixService;
+
+    @PostMapping("/bindingRoute")
+    @ApiOperation("鐢熶骇璁㈠崟缁戝畾宸ヨ壓璺嚎")
+    public AjaxResult bindingRoute(@RequestBody ProductOrder productOrder) {
+        appendixService.populateData(productOrder);
+        return AjaxResult.success();
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java b/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java
index ef7ac19..587b9d9 100644
--- a/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java
+++ b/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java
@@ -1,8 +1,14 @@
 package com.ruoyi.appendix.controller;
 
+import com.ruoyi.appendix.dto.ProcessRouteItemInstanceDto;
+import com.ruoyi.appendix.service.ProcessRouteItemInstanceService;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <br>
@@ -17,4 +23,43 @@
 @RequestMapping("/processRouteItemInstance")
 @Api("鑹鸿矾绾垮瓙闆�-闄勮〃鎺у埗灞�")
 public class ProcessRouteItemInstanceController {
+
+    @Resource
+    private ProcessRouteItemInstanceService processRouteItemInstanceService;
+
+    @GetMapping("/list/{orderId}")
+    @ApiOperation("鑾峰彇宸ュ簭鍒楄〃")
+    public AjaxResult getProcessItem(@PathVariable Long orderId) {
+        List<ProcessRouteItemInstanceDto> list = processRouteItemInstanceService.getProcessItem(orderId);
+        return AjaxResult.success(list);
+    }
+
+    @PostMapping("add")
+    @ApiOperation("鏂板宸ュ簭")
+    public AjaxResult addProcessItem(@RequestBody ProcessRouteItemInstanceDto dto) {
+        processRouteItemInstanceService.addProcessItem(dto);
+        return AjaxResult.success();
+    }
+
+    @PutMapping("/update")
+    @ApiOperation("淇敼宸ュ簭")
+    public AjaxResult updateProcessItem(@RequestBody ProcessRouteItemInstanceDto dto) {
+        processRouteItemInstanceService.updateProcessItem(dto);
+        return AjaxResult.success();
+    }
+
+    @DeleteMapping("/delete/{id}")
+    @ApiOperation("鍒犻櫎宸ュ簭")
+    public AjaxResult deleteProcessItem(@PathVariable Long id) {
+        processRouteItemInstanceService.deleteProcessItem(id);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/sort")
+    @ApiOperation("宸ュ簭鎺掑簭")
+    public AjaxResult sortProcessItem(@RequestBody ProcessRouteItemInstanceDto dto) {
+        processRouteItemInstanceService.sortProcessItem(dto);
+        return AjaxResult.success();
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java b/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java
index 78ca75d..39dde3e 100644
--- a/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java
+++ b/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java
@@ -1,8 +1,14 @@
 package com.ruoyi.appendix.controller;
 
+import com.ruoyi.appendix.dto.ProcessRouteItemParamInstanceDto;
+import com.ruoyi.appendix.service.ProcessRouteItemParamInstanceService;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <br>
@@ -18,4 +24,37 @@
 @RestController
 @RequestMapping("/processRouteItemParamInstance")
 public class ProcessRouteItemParamInstanceController {
+
+    @Resource
+    private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService;
+
+    @GetMapping("/list")
+    @ApiOperation("鐢熶骇璁㈠崟-鑾峰彇宸ュ簭缁戝畾鐨勫弬鏁板垪琛�")
+    public AjaxResult routeItemParamList(@RequestParam("orderId") Long orderId, @RequestParam("routeItemId") Long routeItemId) {
+        List<ProcessRouteItemParamInstanceDto> list = processRouteItemParamInstanceService.routeItemParamList(orderId, routeItemId);
+        return AjaxResult.success(list);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation("鐢熶骇璁㈠崟-宸ュ簭鏂板鍙傛暟")
+    public AjaxResult addRouteItemParam(@RequestBody ProcessRouteItemParamInstanceDto dto) {
+        processRouteItemParamInstanceService.addRouteItemParam(dto);
+        return AjaxResult.success();
+    }
+
+    @PutMapping("/update")
+    @ApiOperation("鐢熶骇璁㈠崟-宸ュ簭鏇存柊鍙傛暟")
+    public AjaxResult updateRouteItemParam(@RequestBody ProcessRouteItemParamInstanceDto dto){
+        processRouteItemParamInstanceService.updateRouteItemParam(dto);
+        return AjaxResult.success();
+    }
+
+    @DeleteMapping("/delete/{id}")
+    @ApiOperation("鐢熶骇璁㈠崟-宸ュ簭鍒犻櫎鍙傛暟")
+    public AjaxResult deleteRouteItemParam(@PathVariable Long id) {
+        processRouteItemParamInstanceService.deleteRouteItemParam(id);
+        return AjaxResult.success();
+    }
+
+
 }
diff --git a/src/main/java/com/ruoyi/appendix/controller/ProductProcessParamInstanceController.java b/src/main/java/com/ruoyi/appendix/controller/ProductProcessParamInstanceController.java
deleted file mode 100644
index d6d8109..0000000
--- a/src/main/java/com/ruoyi/appendix/controller/ProductProcessParamInstanceController.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.ruoyi.appendix.controller;
-
-import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * <br>
- * 宸ュ簭缁戝畾鍙傛暟-闄勮〃Controller
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:19
- */
-@Api(tags = "宸ュ簭缁戝畾鍙傛暟鎺ュ彛")
-@RestController
-@RequestMapping("/productProcessParamInstance")
-public class ProductProcessParamInstanceController {
-}
diff --git a/src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java b/src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
index 4c9c95a..9867f7a 100644
--- a/src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
+++ b/src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
@@ -1,8 +1,14 @@
 package com.ruoyi.appendix.controller;
 
+import com.ruoyi.appendix.dto.ProductStructureInstanceDto;
+import com.ruoyi.appendix.service.ProductStructureInstanceService;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <br>
@@ -17,4 +23,22 @@
 @RestController
 @RequestMapping("/productStructureInstance")
 public class ProductStructureInstanceController {
+
+    @Resource
+    private ProductStructureInstanceService productStructureInstanceService;
+
+    @GetMapping("/getBomStructs/{orderId}")
+    @ApiOperation("鏍规嵁鐢熶骇璁㈠崟ID鑾峰彇缁戝畾鐨凚OM瀛愰泦缁撴瀯鏍�")
+    public AjaxResult getBomStructs(@PathVariable Long orderId) {
+        List<ProductStructureInstanceDto> list = productStructureInstanceService.listByOrderId(orderId);
+        return AjaxResult.success(list);
+    }
+
+    @PutMapping("/addOrUpdateBomStructs")
+    @ApiOperation("鏂板/鏇存柊BOM瀛愰泦缁撴瀯")
+    public AjaxResult addOrUpdateBomStructs(@RequestBody ProductStructureInstanceDto instanceDto) {
+        productStructureInstanceService.addOrUpdateBomStructs(instanceDto);
+        return AjaxResult.success();
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemInstanceDto.java b/src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemInstanceDto.java
new file mode 100644
index 0000000..fc113b4
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemInstanceDto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.appendix.dto;
+
+import com.ruoyi.appendix.pojo.ProcessRouteItemInstance;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <br>
+ * 宸ヨ壓璺嚎瀛愰泦-闄勮〃Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/19 10:46
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProcessRouteItemInstanceDto extends ProcessRouteItemInstance {
+
+    @ApiModelProperty("宸ュ簭鍚嶇О")
+    private String processName;
+
+}
diff --git a/src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemParamInstanceDto.java b/src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemParamInstanceDto.java
new file mode 100644
index 0000000..e385c55
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemParamInstanceDto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.appendix.dto;
+
+import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <br>
+ *
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/19 11:49
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProcessRouteItemParamInstanceDto extends ProcessRouteItemParamInstance {
+
+    @ApiModelProperty("宸ュ簭ID")
+    private Long processId;
+
+}
diff --git a/src/main/java/com/ruoyi/appendix/dto/ProductStructureInstanceDto.java b/src/main/java/com/ruoyi/appendix/dto/ProductStructureInstanceDto.java
new file mode 100644
index 0000000..8a70ed3
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/dto/ProductStructureInstanceDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.appendix.dto;
+
+import com.ruoyi.appendix.pojo.ProductStructureInstance;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <br>
+ * BOM瀛愰泦-闄勮〃Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/19 10:08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProductStructureInstanceDto extends ProductStructureInstance {
+
+    @ApiModelProperty("瀛愮被")
+    private List<ProductStructureInstanceDto> children = new ArrayList<>();
+
+    @ApiModelProperty("涓存椂ID")
+    private String tempId;
+
+    @ApiModelProperty("鐖惰妭鐐逛复鏃禝D")
+    private String parentTempId;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/mapper/ProductProcessParamInstanceMapper.java b/src/main/java/com/ruoyi/appendix/mapper/ProductProcessParamInstanceMapper.java
deleted file mode 100644
index 7b3e2cf..0000000
--- a/src/main/java/com/ruoyi/appendix/mapper/ProductProcessParamInstanceMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.appendix.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.appendix.pojo.ProductProcessParamInstance;
-
-/**
- * <br>
- * 宸ュ簭缁戝畾鍙傛暟-闄勮〃Mapper
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:15
- */
-public interface ProductProcessParamInstanceMapper extends BaseMapper<ProductProcessParamInstance> {
-}
diff --git a/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java b/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java
index ffc24c6..cbe09a3 100644
--- a/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java
+++ b/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java
@@ -28,6 +28,9 @@
     @TableId(type = IdType.AUTO)
     private Long id;
 
+    @ApiModelProperty("鐢熶骇璁㈠崟id")
+    private Long orderId;
+
     @ApiModelProperty("宸ヨ壓璺嚎id")
     private Long routeId;
 
diff --git a/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java b/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java
index ad1f3e7..c363898 100644
--- a/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java
+++ b/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java
@@ -28,14 +28,32 @@
     @ApiModelProperty("涓婚敭ID")
     private Long id;
 
+    @ApiModelProperty("鐢熶骇璁㈠崟id")
+    private Long orderId;
+
     @ApiModelProperty("鍏宠仈宸ヨ壓璺嚎鏄庣粏ID")
     private Long routeItemId;
 
-    @ApiModelProperty("鍏宠仈鍩虹鍙傛暟瀹氫箟ID")
-    private Long paramId;
+    @ApiModelProperty("鍙傛暟鍞竴鏍囪瘑")
+    private String paramKey;
 
-    @ApiModelProperty("鏉ユ簮宸ュ簭鍙傛暟ID")
-    private Long processParamId;
+    @ApiModelProperty("鍙傛暟鍚嶇О")
+    private String paramName;
+
+    @ApiModelProperty("鍙傛暟绫诲瀷(1鏁板瓧 2鏂囨湰 3涓嬫媺閫夋嫨 4鏃堕棿)")
+    private Integer paramType;
+
+    @ApiModelProperty("鍙傛暟鏍煎紡")
+    private String paramFormat;
+
+    @ApiModelProperty("鍊兼ā寮�(1鍗曞�� 2鍖洪棿)")
+    private Integer valueMode;
+
+    @ApiModelProperty("鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
 
     @ApiModelProperty("鏍囧噯鍊�")
     private String standardValue;
@@ -47,7 +65,7 @@
     private BigDecimal maxValue;
 
     @ApiModelProperty("鏄惁蹇呭~")
-    private Integer isRequired;
+    private Boolean isRequired;
 
     @ApiModelProperty("鎺掑簭")
     private Integer sort;
diff --git a/src/main/java/com/ruoyi/appendix/pojo/ProductProcessParamInstance.java b/src/main/java/com/ruoyi/appendix/pojo/ProductProcessParamInstance.java
deleted file mode 100644
index 88bcc94..0000000
--- a/src/main/java/com/ruoyi/appendix/pojo/ProductProcessParamInstance.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.ruoyi.appendix.pojo;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-
-
-/**
- * <br>
- * 宸ュ簭缁戝畾鍙傛暟-闄勮〃
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:14
- */
-@Data
-@TableName("product_process_param_instance")
-@Api(tags = "宸ュ簭缁戝畾鍙傛暟-闄勮〃")
-public class ProductProcessParamInstance {
-
-    @TableId(type = IdType.AUTO)
-    @ApiModelProperty("涓婚敭ID")
-    private Long id;
-
-    @ApiModelProperty("鎵�灞炲伐搴廔D")
-    private Long processId;
-
-    @ApiModelProperty("鍏宠仈鍩虹鍙傛暟ID")
-    private Long paramId;
-
-    @ApiModelProperty("鏍囧噯鍊�(鍗曞�兼ā寮�)")
-    private String standardValue;
-
-    @ApiModelProperty("鏈�灏忓��(鍖洪棿妯″紡)")
-    private BigDecimal minValue;
-
-    @ApiModelProperty("鏈�澶у��(鍖洪棿妯″紡)")
-    private BigDecimal maxValue;
-
-    @ApiModelProperty("鏄惁蹇呭~(0-鍚�,1-鏄�)")
-    private Boolean isRequired;
-
-    @ApiModelProperty("鎺掑簭鍙�")
-    private Integer sort;
-
-    @ApiModelProperty("绉熸埛ID")
-    private Long tenantId;
-
-    @ApiModelProperty("鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(fill = FieldFill.INSERT)
-    private LocalDateTime createTime;
-
-    @ApiModelProperty("鏇存柊鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private LocalDateTime updateTime;
-}
diff --git a/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java b/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
index 80ff4e1..fe28f35 100644
--- a/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
+++ b/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
@@ -27,6 +27,9 @@
     @ApiModelProperty("涓婚敭ID")
     private Long id;
 
+    @ApiModelProperty("鐢熶骇璁㈠崟id")
+    private Long orderId;
+
     @ApiModelProperty("鐖惰妭鐐笽D")
     private Long parentId;
 
@@ -50,4 +53,5 @@
 
     @ApiModelProperty("BOM ID")
     private Long bomId;
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/AppendixService.java b/src/main/java/com/ruoyi/appendix/service/AppendixService.java
index d42c1a7..b706266 100644
--- a/src/main/java/com/ruoyi/appendix/service/AppendixService.java
+++ b/src/main/java/com/ruoyi/appendix/service/AppendixService.java
@@ -1,5 +1,6 @@
 package com.ruoyi.appendix.service;
 
+import com.ruoyi.production.pojo.ProductOrder;
 import com.ruoyi.productionPlan.dto.ProductionPlanDto;
 
 /**
@@ -13,33 +14,33 @@
  */
 public interface AppendixService {
 
-
     /**
      * 灏嗗搴旂殑宸ヨ壓璺嚎瀛愰泦涓庣粦瀹氱殑BOM瀛愰泦濉厖鍒伴檮琛ㄤ腑
-     *
-     * @param productOrderId 鐢熶骇璁㈠崟ID
-     * @param processRouteId 宸ヨ壓璺嚎ID
      */
-    void populateData(Long productOrderId, Long processRouteId);
+    void populateData(ProductOrder productOrder);
 
     /**
      * 缁欎笅鍙戠殑鐮屽潡鎷夊彇瀵瑰簲鐨勫伐鑹鸿矾绾垮瓙闆嗕笌缁戝畾鐨凚OM瀛愰泦濉厖鍒伴檮琛ㄤ腑
      *
+     * @param orderId           鐢熶骇璁㈠崟ID
      * @param productionPlanDto 浜у搧璇︽儏
      */
-    Long populateBlocks(ProductionPlanDto productionPlanDto);
+    Long populateBlocks(Long orderId, ProductionPlanDto productionPlanDto);
 
     /**
      * 缁欎笅鍙戠殑鏉挎潗鎷夊彇瀵瑰簲鐨勫伐鑹鸿矾绾垮瓙闆嗕笌缁戝畾鐨凚OM瀛愰泦濉厖鍒伴檮琛ㄤ腑
+     * <p>
      *
+     * @param orderId           鐢熶骇璁㈠崟ID
      * @param productionPlanDto 浜у搧璇︽儏
      */
-    Long populatePlates(ProductionPlanDto productionPlanDto);
+    Long populatePlates(Long orderId, ProductionPlanDto productionPlanDto);
 
     /**
      * 鍒犻櫎璇ヨ鍗曟惡甯︾殑闄勮〃鏁版嵁
      *
+     * @param orderId        鐢熶骇璁㈠崟ID
      * @param processRouteId 宸ヨ壓璺嚎ID
      */
-    void deleteData(Long processRouteId);
+    void deleteData(Long orderId, Long processRouteId);
 }
diff --git a/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java b/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
index 8a05031..31d6025 100644
--- a/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
+++ b/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
@@ -1,11 +1,14 @@
 package com.ruoyi.appendix.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.appendix.dto.ProcessRouteItemInstanceDto;
 import com.ruoyi.appendix.pojo.ProcessRouteItemInstance;
+
+import java.util.List;
 
 /**
  * <br>
- *宸ヨ壓璺嚎瀛愰泦-闄勮〃Service
+ * 宸ヨ壓璺嚎瀛愰泦-闄勮〃Service
  * </br>
  *
  * @author deslrey
@@ -13,4 +16,13 @@
  * @since 2026/03/18 13:07
  */
 public interface ProcessRouteItemInstanceService extends IService<ProcessRouteItemInstance> {
+    List<ProcessRouteItemInstanceDto> getProcessItem(Long orderId);
+
+    void addProcessItem(ProcessRouteItemInstanceDto dto);
+
+    void updateProcessItem(ProcessRouteItemInstanceDto dto);
+
+    void deleteProcessItem(Long id);
+
+    void sortProcessItem(ProcessRouteItemInstanceDto dto);
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java b/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java
index 6faa0e7..8233b33 100644
--- a/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java
+++ b/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java
@@ -1,7 +1,10 @@
 package com.ruoyi.appendix.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.appendix.dto.ProcessRouteItemParamInstanceDto;
 import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
+
+import java.util.List;
 
 /**
  * <br>
@@ -13,4 +16,13 @@
  * @since 2026/03/18 13:11
  */
 public interface ProcessRouteItemParamInstanceService extends IService<ProcessRouteItemParamInstance> {
+
+    List<ProcessRouteItemParamInstanceDto> routeItemParamList(Long orderId, Long routeItemId);
+
+    void addRouteItemParam(ProcessRouteItemParamInstanceDto dto);
+
+    void updateRouteItemParam(ProcessRouteItemParamInstanceDto dto);
+
+    void deleteRouteItemParam(Long id);
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/ProductProcessParamInstanceService.java b/src/main/java/com/ruoyi/appendix/service/ProductProcessParamInstanceService.java
deleted file mode 100644
index 6405a9a..0000000
--- a/src/main/java/com/ruoyi/appendix/service/ProductProcessParamInstanceService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.appendix.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.appendix.pojo.ProductProcessParamInstance;
-
-/**
- * <br>
- * 宸ュ簭缁戝畾鍙傛暟-闄勮〃Service鎺ュ彛
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:16
- */
-public interface ProductProcessParamInstanceService extends IService<ProductProcessParamInstance> {
-}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java b/src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
index 5faf372..631428c 100644
--- a/src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
+++ b/src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
@@ -1,7 +1,10 @@
 package com.ruoyi.appendix.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.appendix.dto.ProductStructureInstanceDto;
 import com.ruoyi.appendix.pojo.ProductStructureInstance;
+
+import java.util.List;
 
 /**
  * <br>
@@ -13,4 +16,8 @@
  * @since 2026/03/18 13:21
  */
 public interface ProductStructureInstanceService extends IService<ProductStructureInstance> {
+
+    List<ProductStructureInstanceDto> listByOrderId(Long orderId);
+
+    void addOrUpdateBomStructs(ProductStructureInstanceDto instanceDto);
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java
index 5d77a0f..e056059 100644
--- a/src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java
+++ b/src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java
@@ -3,9 +3,10 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.appendix.pojo.ProcessRouteItemInstance;
 import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
-import com.ruoyi.appendix.pojo.ProductProcessParamInstance;
 import com.ruoyi.appendix.pojo.ProductStructureInstance;
 import com.ruoyi.appendix.service.*;
+import com.ruoyi.basic.pojo.BaseParam;
+import com.ruoyi.basic.service.BaseParamService;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.production.pojo.*;
@@ -16,7 +17,9 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -39,10 +42,10 @@
     private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService;
 
     @Resource
-    private ProductProcessParamInstanceService productProcessParamInstanceService;
+    private ProductStructureInstanceService productStructureInstanceService;
 
     @Resource
-    private ProductStructureInstanceService productStructureInstanceService;
+    private BaseParamService baseParamService;
 
     @Resource
     private ProcessRouteService processRouteService;
@@ -54,16 +57,13 @@
     private ProcessRouteItemParamService processRouteItemParamService;
 
     @Resource
-    private ProductProcessParamService productProcessParamService;
-
-    @Resource
     private ProductStructureService productStructureService;
 
     @Resource
     private ProductOrderService productOrderService;
 
     @Override
-    public Long populateBlocks(ProductionPlanDto productionPlanDto) {
+    public Long populateBlocks(Long orderId, ProductionPlanDto productionPlanDto) {
         if (productionPlanDto == null) {
             throw new ServiceException("涓嬪彂鏁版嵁涓嶈兘涓虹┖");
         }
@@ -75,12 +75,12 @@
             log.info("涓嬪彂浜у搧銆恵}銆戞湭鏌ヨ鍑哄伐鑹鸿矾绾�", productionPlanDto.getProductName());
             return null;
         }
-        migration(processRoute);
+        migration(orderId, processRoute);
         return processRoute.getId();
     }
 
     @Override
-    public Long populatePlates(ProductionPlanDto productionPlanDto) {
+    public Long populatePlates(Long orderId, ProductionPlanDto productionPlanDto) {
         if (productionPlanDto == null) {
             throw new ServiceException("涓嬪彂鏁版嵁涓嶈兘涓虹┖");
         }
@@ -90,127 +90,159 @@
             log.info("涓嬪彂浜у搧銆恵}銆戞湭鏌ヨ鍑哄伐鑹鸿矾绾�", productionPlanDto.getProductName());
             return null;
         }
-        migration(processRoute);
+        migration(orderId, processRoute);
         return processRoute.getId();
     }
 
     @Override
-    public void populateData(Long productOrderId, Long processRouteId) {
-        ProcessRoute processRoute = processRouteService.getById(processRouteId);
-        if (processRoute == null) {
-            log.info("鐢熶骇璁㈠崟銆恵}銆戞湭鏌ヨ鍑哄伐鑹鸿矾绾裤�恵}銆�", productOrderId, processRouteId);
-            return;
+    public void populateData(ProductOrder productOrder) {
+        if (productOrder == null) {
+            throw new ServiceException("缁戝畾澶辫触.鏁版嵁涓嶈兘涓虹┖");
         }
-        migration(processRoute);
+        if (productOrder.getId() == null || productOrder.getRouteId() == null) {
+            throw new ServiceException("缁戝畾澶辫触,鐢熶骇璁㈠崟鎴栧伐鑹鸿矾绾夸笉鑳戒负绌�");
+        }
+        ProcessRoute processRoute = processRouteService.getById(productOrder.getRouteId());
+        if (processRoute == null) {
+            throw new ServiceException("璇ュ伐鑹鸿矾绾夸笉瀛樺湪,缁戝畾澶辫触");
+        }
+        migration(productOrder.getId(), processRoute);
 
         //  鍥炲啓宸ヨ壓璺嚎id鍒扮敓浜ц鍗�
-        ProductOrder productOrder = new ProductOrder();
-        productOrder.setId(productOrderId);
-        productOrder.setRouteId(processRouteId);
         productOrderService.updateById(productOrder);
     }
 
     @Override
-    public void deleteData(Long processRouteId) {
-        //  鏌ュ嚭宸ヨ壓璺嚎瀛愰泦锛岀敤浜庡叧鑱斿垹闄ゅ弬鏁伴檮琛�
-        List<ProcessRouteItem> itemList = processRouteItemService.list(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRouteId));
-
-        if (itemList != null && !itemList.isEmpty()) {
-            List<Long> itemIds = itemList.stream().map(ProcessRouteItem::getId).collect(Collectors.toList());
-            List<Long> processIds = itemList.stream().map(ProcessRouteItem::getProcessId).collect(Collectors.toList());
-
-            //  鍒犻櫎宸ヨ壓璺嚎宸ュ簭鍙傛暟闄勮〃
-            processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>().in(ProcessRouteItemParamInstance::getRouteItemId, itemIds));
-
-            //  鍒犻櫎宸ュ簭缁戝畾鍙傛暟闄勮〃
-            productProcessParamInstanceService.remove(new LambdaQueryWrapper<ProductProcessParamInstance>().in(ProductProcessParamInstance::getProcessId, processIds));
-        }
+    public void deleteData(Long orderId, Long processRouteId) {
+        //  鍒犻櫎宸ヨ壓璺嚎宸ュ簭鍙傛暟闄勮〃
+        processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
+                .eq(ProcessRouteItemParamInstance::getOrderId, orderId));
 
         //  鍒犻櫎宸ヨ壓璺嚎瀛愰泦闄勮〃
-        processRouteItemInstanceService.remove(
-                new LambdaQueryWrapper<ProcessRouteItemInstance>().eq(ProcessRouteItemInstance::getRouteId, processRouteId));
+        processRouteItemInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemInstance>()
+                .eq(ProcessRouteItemInstance::getOrderId, orderId)
+                .eq(ProcessRouteItemInstance::getRouteId, processRouteId));
 
         //  鍒犻櫎BOM瀛愰泦闄勮〃
         ProcessRoute processRoute = processRouteService.getById(processRouteId);
         if (processRoute != null && processRoute.getBomId() != null) {
-            productStructureInstanceService.remove(new LambdaQueryWrapper<ProductStructureInstance>().eq(ProductStructureInstance::getBomId, processRoute.getBomId()));
+            productStructureInstanceService.remove(new LambdaQueryWrapper<ProductStructureInstance>()
+                    .eq(ProductStructureInstance::getOrderId, orderId)
+                    .eq(ProductStructureInstance::getBomId, processRoute.getBomId()));
         }
     }
 
     /**
-     * 鏍规嵁宸ヨ壓璺嚎杩佺Щ鍥涘紶闄勮〃鏁版嵁
+     * 鏍规嵁宸ヨ壓璺嚎杩佺Щ闄勮〃鏁版嵁
      */
-    private void migration(ProcessRoute processRoute) {
-        //  杩佺Щ宸ヨ壓璺嚎瀛愰泦琛ㄦ暟鎹�
-        List<ProcessRouteItem> processRouteItemList = processRouteItemService.list(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
-        migrationProcessRouteItem(processRouteItemList);
+    private void migration(Long orderId, ProcessRoute processRoute) {
+        //  杩佺Щ宸ヨ壓璺嚎瀛愰泦琛ㄦ暟鎹紝杩斿洖鏃d->鏂癷nstance鏄犲皠
+        List<ProcessRouteItem> processRouteItemList = processRouteItemService.list(
+                new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
+        Map<Long, ProcessRouteItemInstance> routeItemOldIdMap = migrationProcessRouteItem(orderId, processRouteItemList);
 
-        //  杩佺Щ宸ヨ壓璺嚎鍐呯粦瀹氱殑宸ュ簭鍙婂伐搴忓弬鏁�
+        //  杩佺Щ宸ヨ壓璺嚎鍐呯粦瀹氱殑宸ュ簭鍙傛暟
         if (processRouteItemList != null && !processRouteItemList.isEmpty()) {
             for (ProcessRouteItem item : processRouteItemList) {
-                List<ProcessRouteItemParam> paramList = processRouteItemParamService.list(new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId, item.getId()));
-                migrationProcessRouteItemParam(paramList);
+                ProcessRouteItemInstance newInstance = routeItemOldIdMap.get(item.getId());
+                Long newRouteItemInstanceId = newInstance != null ? newInstance.getId() : item.getId();
 
-                List<ProductProcessParam> processParamList = productProcessParamService.list(new LambdaQueryWrapper<ProductProcessParam>().eq(ProductProcessParam::getProcessId, item.getProcessId()));
-                migrationProductProcessParam(processParamList);
+                List<ProcessRouteItemParam> paramList = processRouteItemParamService.list(
+                        new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId, item.getId()));
+                migrationProcessRouteItemParam(orderId, paramList, newRouteItemInstanceId);
             }
         }
 
         //  杩佺ЩBOM瀛愰泦琛ㄦ暟鎹�
         if (processRoute.getBomId() != null) {
-            List<ProductStructure> structureList = productStructureService.list(new LambdaQueryWrapper<ProductStructure>().eq(ProductStructure::getBomId, processRoute.getBomId()));
-            migrationProductStructure(structureList);
+            List<ProductStructure> structureList = productStructureService.list(
+                    new LambdaQueryWrapper<ProductStructure>().eq(ProductStructure::getBomId, processRoute.getBomId()));
+            migrationProductStructure(orderId, structureList);
         }
     }
 
-    private void migrationProcessRouteItem(List<ProcessRouteItem> list) {
+    private Map<Long, ProcessRouteItemInstance> migrationProcessRouteItem(Long orderId, List<ProcessRouteItem> list) {
+        Map<Long, ProcessRouteItemInstance> oldIdMap = new HashMap<>();
         if (list == null || list.isEmpty()) {
-            return;
+            return oldIdMap;
         }
         List<ProcessRouteItemInstance> instances = list.stream().map(item -> {
             ProcessRouteItemInstance instance = new ProcessRouteItemInstance();
             BeanUtils.copyProperties(item, instance, "id");
             instance.setIsQuality(item.getIsQuality() != null && item.getIsQuality() ? 1 : 0);
+            instance.setOrderId(orderId);
+            if (item.getId() != null) {
+                oldIdMap.put(item.getId(), instance);
+            }
             return instance;
         }).collect(Collectors.toList());
         processRouteItemInstanceService.saveBatch(instances);
+        return oldIdMap;
     }
 
-    private void migrationProcessRouteItemParam(List<ProcessRouteItemParam> list) {
+    private void migrationProcessRouteItemParam(Long orderId, List<ProcessRouteItemParam> list, Long newRouteItemInstanceId) {
         if (list == null || list.isEmpty()) {
             return;
+        }
+        // 鎵归噺鏌ヨ base_param
+        List<Long> paramIds = list.stream().map(ProcessRouteItemParam::getParamId)
+                .filter(id -> id != null).distinct().collect(Collectors.toList());
+        Map<Long, BaseParam> baseParamMap = new HashMap<>();
+        if (!paramIds.isEmpty()) {
+            baseParamService.listByIds(paramIds).forEach(bp -> baseParamMap.put(bp.getId(), bp));
         }
         List<ProcessRouteItemParamInstance> instances = list.stream().map(item -> {
             ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance();
             BeanUtils.copyProperties(item, instance, "id");
+            instance.setOrderId(orderId);
+            instance.setRouteItemId(newRouteItemInstanceId);
+            // 浠� base_param 濉厖鍩虹瀛楁
+            BaseParam bp = baseParamMap.get(item.getParamId());
+            if (bp != null) {
+                instance.setParamKey(bp.getParamKey());
+                instance.setParamName(bp.getParamName());
+                instance.setParamType(bp.getParamType());
+                instance.setParamFormat(bp.getParamFormat());
+                instance.setValueMode(bp.getValueMode());
+                instance.setUnit(bp.getUnit());
+                instance.setRemark(bp.getRemark());
+            }
             return instance;
         }).collect(Collectors.toList());
         processRouteItemParamInstanceService.saveBatch(instances);
     }
 
-    private void migrationProductProcessParam(List<ProductProcessParam> list) {
+    private void migrationProductStructure(Long orderId, List<ProductStructure> list) {
         if (list == null || list.isEmpty()) {
             return;
         }
-        List<ProductProcessParamInstance> instances = list.stream().map(item -> {
-            ProductProcessParamInstance instance = new ProductProcessParamInstance();
-            BeanUtils.copyProperties(item, instance, "id");
-            instance.setIsRequired(item.getIsRequired() != null && item.getIsRequired() == 1);
-            return instance;
-        }).collect(Collectors.toList());
-        productProcessParamInstanceService.saveBatch(instances);
-    }
-
-    private void migrationProductStructure(List<ProductStructure> list) {
-        if (list == null || list.isEmpty()) {
-            return;
-        }
+        Map<Long, ProductStructureInstance> oldIdMap = new HashMap<>();
         List<ProductStructureInstance> instances = list.stream().map(item -> {
             ProductStructureInstance instance = new ProductStructureInstance();
             BeanUtils.copyProperties(item, instance, "id");
             instance.setBomId(item.getBomId() != null ? item.getBomId().longValue() : null);
+            instance.setOrderId(orderId);
+            if (item.getId() != null) {
+                oldIdMap.put(item.getId(), instance);
+            }
             return instance;
         }).collect(Collectors.toList());
         productStructureInstanceService.saveBatch(instances);
+
+        //  鏂板鍚庢湁id锛屾棫id->鏂癷d锛屼慨姝arentId
+        Map<Long, Long> oldToNewId = new HashMap<>();
+        list.forEach(item -> {
+            if (item.getId() != null && oldIdMap.containsKey(item.getId())) {
+                oldToNewId.put(item.getId(), oldIdMap.get(item.getId()).getId());
+            }
+        });
+
+        List<ProductStructureInstance> toUpdate = instances.stream()
+                .filter(i -> i.getParentId() != null && oldToNewId.containsKey(i.getParentId()))
+                .peek(i -> i.setParentId(oldToNewId.get(i.getParentId())))
+                .collect(Collectors.toList());
+        if (!toUpdate.isEmpty()) {
+            productStructureInstanceService.updateBatchById(toUpdate);
+        }
     }
 }
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java
index 153521d..ef7888b 100644
--- a/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java
@@ -1,11 +1,31 @@
 package com.ruoyi.appendix.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.appendix.dto.ProcessRouteItemInstanceDto;
 import com.ruoyi.appendix.mapper.ProcessRouteItemInstanceMapper;
 import com.ruoyi.appendix.pojo.ProcessRouteItemInstance;
+import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
 import com.ruoyi.appendix.service.ProcessRouteItemInstanceService;
+import com.ruoyi.appendix.service.ProcessRouteItemParamInstanceService;
+import com.ruoyi.basic.pojo.BaseParam;
+import com.ruoyi.basic.service.BaseParamService;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.production.pojo.ProcessRouteItemParam;
+import com.ruoyi.production.pojo.ProductProcess;
+import com.ruoyi.production.service.ProcessRouteItemParamService;
+import com.ruoyi.production.service.ProductProcessService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <br>
@@ -20,5 +40,159 @@
 @Service
 public class ProcessRouteItemInstanceServiceImpl extends ServiceImpl<ProcessRouteItemInstanceMapper, ProcessRouteItemInstance> implements ProcessRouteItemInstanceService {
 
+    @Resource
+    private ProductProcessService productProcessService;
 
-}
\ No newline at end of file
+    @Resource
+    private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService;
+
+    @Resource
+    private ProcessRouteItemParamService processRouteItemParamService;
+
+    @Resource
+    private BaseParamService baseParamService;
+
+    @Override
+    public List<ProcessRouteItemInstanceDto> getProcessItem(Long orderId) {
+        List<ProcessRouteItemInstance> list = list(new LambdaQueryWrapper<ProcessRouteItemInstance>()
+                .eq(ProcessRouteItemInstance::getOrderId, orderId)
+                .orderByAsc(ProcessRouteItemInstance::getDragSort));
+        return list.stream().map(item -> {
+            ProcessRouteItemInstanceDto dto = new ProcessRouteItemInstanceDto();
+            BeanUtils.copyProperties(item, dto);
+            if (item.getProcessId() != null) {
+                ProductProcess process = productProcessService.getById(item.getProcessId());
+                if (process != null) {
+                    dto.setProcessName(process.getName());
+                }
+            }
+            return dto;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public void addProcessItem(ProcessRouteItemInstanceDto dto) {
+        if (dto == null) {
+            throw new ServiceException("鏂板鏁版嵁涓嶈兘涓虹┖");
+        }
+        if (dto.getOrderId() == null) {
+            throw new ServiceException("鐢熶骇璁㈠崟ID涓嶈兘涓虹┖");
+        }
+        if (dto.getProcessId() == null) {
+            throw new ServiceException("宸ュ簭ID涓嶈兘涓虹┖");
+        }
+        ProcessRouteItemInstance entity = new ProcessRouteItemInstance();
+        BeanUtils.copyProperties(dto, entity);
+        entity.setId(null);
+        entity.setTenantId(SecurityUtils.getLoginUser().getTenantId());
+        entity.setCreateTime(LocalDateTime.now());
+
+        //  鍙栧綋鍓嶈鍗曚笅鏈�澶� dragSort + 1
+        ProcessRouteItemInstance maxSortItem = getOne(new LambdaQueryWrapper<ProcessRouteItemInstance>()
+                .eq(ProcessRouteItemInstance::getOrderId, dto.getOrderId())
+                .orderByDesc(ProcessRouteItemInstance::getDragSort)
+                .last("limit 1"));
+        entity.setDragSort(maxSortItem != null && maxSortItem.getDragSort() != null ? maxSortItem.getDragSort() + 1 : 1);
+        save(entity);
+    }
+
+    @Override
+    public void updateProcessItem(ProcessRouteItemInstanceDto dto) {
+        if (dto == null || dto.getId() == null) {
+            throw new ServiceException("鏇存柊鏁版嵁鎴朓D涓嶈兘涓虹┖");
+        }
+        ProcessRouteItemInstance old = getById(dto.getId());
+        if (old == null) {
+            throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
+        }
+        // 宸ュ簭鍙樻洿锛屽垹闄ゆ棫鍙傛暟闄勮〃锛岃縼绉绘柊宸ュ簭鍙傛暟
+        if (dto.getProcessId() != null && !dto.getProcessId().equals(old.getProcessId())) {
+            // 鍒犻櫎宸ヨ壓璺嚎宸ュ簭鍙傛暟闄勮〃
+            processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
+                    .eq(ProcessRouteItemParamInstance::getOrderId, old.getOrderId())
+                    .eq(ProcessRouteItemParamInstance::getRouteItemId, old.getId()));
+
+            // 杩佺Щ鏂板伐搴忕殑 process_route_item_param
+            List<ProcessRouteItemParam> routeItemParams = processRouteItemParamService.list(
+                    new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId, old.getId()));
+            if (!routeItemParams.isEmpty()) {
+                // 鎵归噺鏌ヨ base_param
+                List<Long> paramIds = routeItemParams.stream().map(ProcessRouteItemParam::getParamId)
+                        .filter(id -> id != null).distinct().collect(Collectors.toList());
+                Map<Long, BaseParam> baseParamMap = new HashMap<>();
+                if (!paramIds.isEmpty()) {
+                    baseParamService.listByIds(paramIds).forEach(bp -> baseParamMap.put(bp.getId(), bp));
+                }
+                List<ProcessRouteItemParamInstance> newInstances = routeItemParams.stream().map(p -> {
+                    ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance();
+                    BeanUtils.copyProperties(p, instance, "id");
+                    instance.setOrderId(old.getOrderId());
+                    BaseParam bp = baseParamMap.get(p.getParamId());
+                    if (bp != null) {
+                        instance.setParamKey(bp.getParamKey());
+                        instance.setParamName(bp.getParamName());
+                        instance.setParamType(bp.getParamType());
+                        instance.setParamFormat(bp.getParamFormat());
+                        instance.setValueMode(bp.getValueMode());
+                        instance.setUnit(bp.getUnit());
+                        instance.setRemark(bp.getRemark());
+                    }
+                    return instance;
+                }).collect(Collectors.toList());
+                processRouteItemParamInstanceService.saveBatch(newInstances);
+            }
+        }
+        ProcessRouteItemInstance entity = new ProcessRouteItemInstance();
+        BeanUtils.copyProperties(dto, entity);
+        entity.setUpdateTime(LocalDateTime.now());
+        updateById(entity);
+    }
+
+    @Override
+    public void deleteProcessItem(Long id) {
+        if (id == null) {
+            throw new ServiceException("ID涓嶈兘涓虹┖");
+        }
+        ProcessRouteItemInstance old = getById(id);
+        if (old == null) {
+            throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
+        }
+        // 鍒犻櫎宸ヨ壓璺嚎宸ュ簭鍙傛暟闄勮〃
+        processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
+                .eq(ProcessRouteItemParamInstance::getOrderId, old.getOrderId())
+                .eq(ProcessRouteItemParamInstance::getRouteItemId, id));
+        removeById(id);
+    }
+
+    @Override
+    public void sortProcessItem(ProcessRouteItemInstanceDto dto) {
+        if (dto == null || dto.getId() == null) {
+            throw new ServiceException("鏁版嵁鎴朓D涓嶈兘涓虹┖");
+        }
+        ProcessRouteItemInstance old = getById(dto.getId());
+        if (old == null) {
+            throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
+        }
+        List<ProcessRouteItemInstance> items = list(new LambdaQueryWrapper<ProcessRouteItemInstance>()
+                .eq(ProcessRouteItemInstance::getOrderId, old.getOrderId())
+                .orderByAsc(ProcessRouteItemInstance::getDragSort));
+        Integer targetPosition = dto.getDragSort();
+        if (targetPosition != null && targetPosition >= 1) {
+            items.removeIf(item -> item.getId().equals(old.getId()));
+            items.add(targetPosition - 1, old);
+            for (int i = 0; i < items.size(); i++) {
+                ProcessRouteItemInstance item = items.get(i);
+                int newSort = i + 1;
+                if (!item.getId().equals(old.getId())) {
+                    if (!Integer.valueOf(newSort).equals(item.getDragSort())) {
+                        item.setDragSort(newSort);
+                        updateById(item);
+                    }
+                } else {
+                    old.setDragSort(newSort);
+                    updateById(old);
+                }
+            }
+        }
+    }
+}
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java
index 9b84705..73d3d77 100644
--- a/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java
@@ -1,11 +1,21 @@
 package com.ruoyi.appendix.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.appendix.dto.ProcessRouteItemParamInstanceDto;
 import com.ruoyi.appendix.mapper.ProcessRouteItemParamInstanceMapper;
 import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
 import com.ruoyi.appendix.service.ProcessRouteItemParamInstanceService;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <br>
@@ -19,4 +29,77 @@
 @Slf4j
 @Service
 public class ProcessRouteItemParamInstanceServiceImpl extends ServiceImpl<ProcessRouteItemParamInstanceMapper, ProcessRouteItemParamInstance> implements ProcessRouteItemParamInstanceService {
-}
\ No newline at end of file
+
+    @Override
+    public List<ProcessRouteItemParamInstanceDto> routeItemParamList(Long orderId, Long routeItemId) {
+        List<ProcessRouteItemParamInstance> list = list(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
+                .eq(ProcessRouteItemParamInstance::getOrderId, orderId)
+                .eq(ProcessRouteItemParamInstance::getRouteItemId, routeItemId)
+                .orderByAsc(ProcessRouteItemParamInstance::getSort));
+
+        return list.stream().map(item -> {
+            ProcessRouteItemParamInstanceDto dto = new ProcessRouteItemParamInstanceDto();
+            BeanUtils.copyProperties(item, dto);
+            return dto;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addRouteItemParam(ProcessRouteItemParamInstanceDto dto) {
+        if (dto == null) {
+            throw new ServiceException("鏂板鏁版嵁涓嶈兘涓虹┖");
+        }
+        if (dto.getOrderId() == null) {
+            throw new ServiceException("鐢熶骇璁㈠崟ID涓嶈兘涓虹┖");
+        }
+        if (dto.getRouteItemId() == null) {
+            throw new ServiceException("宸ヨ壓璺嚎鏄庣粏ID涓嶈兘涓虹┖");
+        }
+        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
+
+        ProcessRouteItemParamInstance entity = new ProcessRouteItemParamInstance();
+        BeanUtils.copyProperties(dto, entity);
+        entity.setId(null);
+        entity.setOrderId(dto.getOrderId());
+        entity.setRouteItemId(dto.getRouteItemId());
+        entity.setIsRequired(dto.getIsRequired());
+        //  鍙栧綋鍓嶈鍗�+璺嚎鏄庣粏涓嬫渶澶� sort + 1
+        ProcessRouteItemParamInstance maxSortItem = getOne(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
+                .select(ProcessRouteItemParamInstance::getSort)
+                .eq(ProcessRouteItemParamInstance::getOrderId, dto.getOrderId())
+                .eq(ProcessRouteItemParamInstance::getRouteItemId, dto.getRouteItemId())
+                .orderByDesc(ProcessRouteItemParamInstance::getSort)
+                .last("limit 1"));
+        entity.setSort(maxSortItem != null && maxSortItem.getSort() != null ? maxSortItem.getSort() + 1 : 1);
+        entity.setTenantId(tenantId);
+        entity.setCreateTime(LocalDateTime.now());
+        save(entity);
+    }
+
+    @Override
+    public void updateRouteItemParam(ProcessRouteItemParamInstanceDto dto) {
+        if (dto == null || dto.getId() == null) {
+            throw new ServiceException("鏇存柊鏁版嵁鎴朓D涓嶈兘涓虹┖");
+        }
+        if (getById(dto.getId()) == null) {
+            throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
+        }
+        ProcessRouteItemParamInstance entity = new ProcessRouteItemParamInstance();
+        BeanUtils.copyProperties(dto, entity);
+        entity.setUpdateTime(LocalDateTime.now());
+        updateById(entity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteRouteItemParam(Long id) {
+        if (id == null) {
+            throw new ServiceException("ID涓嶈兘涓虹┖");
+        }
+        if (getById(id) == null) {
+            throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
+        }
+        removeById(id);
+    }
+}
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/ProductProcessParamInstanceServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/ProductProcessParamInstanceServiceImpl.java
deleted file mode 100644
index d2c9c96..0000000
--- a/src/main/java/com/ruoyi/appendix/service/impl/ProductProcessParamInstanceServiceImpl.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.ruoyi.appendix.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.appendix.mapper.ProductProcessParamInstanceMapper;
-import com.ruoyi.appendix.pojo.ProductProcessParamInstance;
-import com.ruoyi.appendix.service.ProductProcessParamInstanceService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-/**
- * <br>
- * 宸ュ簭缁戝畾鍙傛暟-闄勮〃Service瀹炵幇绫�
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:18
- */
-@Slf4j
-@Service
-public class ProductProcessParamInstanceServiceImpl extends ServiceImpl<ProductProcessParamInstanceMapper, ProductProcessParamInstance> implements ProductProcessParamInstanceService {
-}
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
index 827e035..5b2f9c2 100644
--- a/src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
@@ -1,11 +1,23 @@
 package com.ruoyi.appendix.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.appendix.dto.ProductStructureInstanceDto;
 import com.ruoyi.appendix.mapper.ProductStructureInstanceMapper;
 import com.ruoyi.appendix.pojo.ProductStructureInstance;
 import com.ruoyi.appendix.service.ProductStructureInstanceService;
+import com.ruoyi.common.utils.bean.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * <br>
@@ -19,4 +31,123 @@
 @Slf4j
 @Service
 public class ProductStructureInstanceServiceImpl extends ServiceImpl<ProductStructureInstanceMapper, ProductStructureInstance> implements ProductStructureInstanceService {
+
+    @Override
+    public List<ProductStructureInstanceDto> listByOrderId(Long orderId) {
+        List<ProductStructureInstance> list = list(new LambdaQueryWrapper<ProductStructureInstance>().eq(ProductStructureInstance::getOrderId, orderId));
+
+        List<ProductStructureInstanceDto> dtoList = list.stream().map(item -> {
+            ProductStructureInstanceDto dto = new ProductStructureInstanceDto();
+            BeanUtils.copyProperties(item, dto);
+            return dto;
+        }).collect(java.util.stream.Collectors.toList());
+
+        Map<Long, ProductStructureInstanceDto> map = new HashMap<>();
+        for (ProductStructureInstanceDto node : dtoList) {
+            map.put(node.getId(), node);
+        }
+
+        List<ProductStructureInstanceDto> tree = new ArrayList<>();
+        for (ProductStructureInstanceDto node : dtoList) {
+            Long parentId = node.getParentId();
+            if (parentId == null || !map.containsKey(parentId)) {
+                tree.add(node);
+            } else {
+                map.get(parentId).getChildren().add(node);
+            }
+        }
+        return tree;
+    }
+
+    @Override
+    public void addOrUpdateBomStructs(ProductStructureInstanceDto instanceDto) {
+        Long orderId = instanceDto.getOrderId();
+
+        // 鎵佸钩鍖栧墠绔紶鍏ョ殑鏍�
+        List<ProductStructureInstanceDto> flatList = new ArrayList<>();
+        flattenTree(instanceDto.getChildren(), flatList);
+
+        // 鏌ヨ鏁版嵁搴撳凡鏈夋暟鎹�
+        List<ProductStructureInstance> dbList = list(new LambdaQueryWrapper<ProductStructureInstance>()
+                .eq(ProductStructureInstance::getOrderId, orderId));
+
+        // 鍓嶇宸叉湁id闆嗗悎
+        Set<Long> frontendIds = flatList.stream()
+                .map(ProductStructureInstanceDto::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        // 闇�瑕佸垹闄ょ殑鑺傜偣
+        Set<Long> deleteIds = dbList.stream()
+                .map(ProductStructureInstance::getId)
+                .filter(id -> !frontendIds.contains(id))
+                .collect(Collectors.toSet());
+        if (!deleteIds.isEmpty()) {
+            removeByIds(deleteIds);
+        }
+
+        List<ProductStructureInstance> insertList = new ArrayList<>();
+        List<ProductStructureInstance> updateList = new ArrayList<>();
+        Map<String, ProductStructureInstance> tempEntityMap = new HashMap<>();
+
+        for (ProductStructureInstanceDto dto : flatList) {
+            ProductStructureInstance entity = new ProductStructureInstance();
+            BeanUtils.copyProperties(dto, entity);
+            entity.setOrderId(orderId);
+            if (dto.getId() == null) {
+                entity.setId(null);
+                entity.setParentId(null);
+                insertList.add(entity);
+                if (dto.getTempId() != null) {
+                    tempEntityMap.put(dto.getTempId(), entity);
+                }
+            } else {
+                updateList.add(entity);
+            }
+        }
+
+        if (!insertList.isEmpty()) {
+            saveBatch(insertList);
+        }
+
+        // 鍥炲啓鏂板鑺傜偣鐨� parentId
+        List<ProductStructureInstance> parentFixList = new ArrayList<>();
+        for (ProductStructureInstanceDto dto : flatList) {
+            if (dto.getId() != null) continue;
+            ProductStructureInstance child = tempEntityMap.get(dto.getTempId());
+            if (child == null) continue;
+            String parentTempId = dto.getParentTempId();
+            if (parentTempId != null && !parentTempId.isEmpty()) {
+                Long realParentId;
+                if (tempEntityMap.containsKey(parentTempId)) {
+                    realParentId = tempEntityMap.get(parentTempId).getId();
+                } else {
+                    try {
+                        realParentId = Long.valueOf(parentTempId);
+                    } catch (NumberFormatException e) {
+                        realParentId = 0L;
+                    }
+                }
+                child.setParentId(realParentId);
+            } else {
+                child.setParentId(0L);
+            }
+            parentFixList.add(child);
+        }
+
+        if (!parentFixList.isEmpty()) {
+            updateBatchById(parentFixList);
+        }
+        if (!updateList.isEmpty()) {
+            updateBatchById(updateList);
+        }
+    }
+
+    private void flattenTree(List<ProductStructureInstanceDto> source, List<ProductStructureInstanceDto> result) {
+        if (source == null) return;
+        for (ProductStructureInstanceDto node : source) {
+            result.add(node);
+            flattenTree(node.getChildren(), result);
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
index dc2185a..589f885 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -15,25 +15,29 @@
 @ExcelIgnoreUnannotated
 public class ProductOrderDto extends ProductOrder {
 
-    @ApiModelProperty(value = "閿�鍞悎鍚屽彿")
-    @Excel(name = "閿�鍞悎鍚屽彿")
-    private String salesContractNo;
-
-    @ApiModelProperty(value = "椤圭洰鍚�")
-    @Excel(name = "椤圭洰鍚�")
-    private String projectName;
-
-    @ApiModelProperty(value = "瀹㈡埛鍚嶇О")
-    @Excel(name = "瀹㈡埛鍚嶇О")
-    private String customerName;
-
     @ApiModelProperty(value = "浜у搧鍚嶇О")
     @Excel(name = "浜у搧鍚嶇О")
-    private String productCategory;
+    private String productName;
 
     @ApiModelProperty(value = "瑙勬牸")
     @Excel(name = "瑙勬牸")
-    private String specificationModel;
+    private String model;
+
+    @ApiModelProperty(value = "浜у搧绫诲瀷")
+    @Excel(name = "浜у搧绫诲瀷")
+    private String strength;
+
+    @ApiModelProperty(value = "宸ヨ壓璺嚎鎻忚堪")
+    @Excel(name = "宸ヨ壓璺嚎鎻忚堪")
+    private String description;
+
+    @ApiModelProperty(value = "宸ヨ壓璺嚎浜у搧绫诲瀷")
+    @Excel(name = "宸ヨ壓璺嚎浜у搧绫诲瀷")
+    private String dictLabel;
+
+    @ApiModelProperty(value = "鐗╂枡缂栫爜")
+    @Excel(name = "鐗╂枡缂栫爜")
+    private String materialCode;
 
     @ApiModelProperty(value = "宸ヨ壓璺嚎缂栧彿")
     @Excel(name = "宸ヨ壓璺嚎缂栧彿")
@@ -43,6 +47,10 @@
     @Excel(name = "瀹屾垚杩涘害", suffix = "%")
     private BigDecimal completionStatus;
 
+    @ApiModelProperty(value = "BOM ID")
+    @Excel(name = "BOM ID")
+    private String bomId;
+
     @ApiModelProperty(value = "BOM缂栧彿")
     @Excel(name = "BOM缂栧彿")
     private String bomNo;
diff --git a/src/main/java/com/ruoyi/production/pojo/ProcessRouteItemParam.java b/src/main/java/com/ruoyi/production/pojo/ProcessRouteItemParam.java
index 2eea851..85a8c3d 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProcessRouteItemParam.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProcessRouteItemParam.java
@@ -50,7 +50,7 @@
     private BigDecimal maxValue;
 
     @ApiModelProperty("鏄惁蹇呭~")
-    private Integer isRequired;
+    private Boolean isRequired;
 
     @ApiModelProperty("鎺掑簭")
     private Integer sort;
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
index 3818b43..a7479fc 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -92,6 +92,10 @@
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endTime;
 
+    @Excel(name = "浜у搧绫诲瀷")
+    @ApiModelProperty("浜у搧绫诲瀷")
+    private String strength;
+
     @ApiModelProperty(value = "鐘舵�侊紙1.寰呭紑濮嬨��2.杩涜涓��3.宸插畬鎴愩��4.宸插彇娑堬級")
     private Integer status;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcessParam.java b/src/main/java/com/ruoyi/production/pojo/ProductProcessParam.java
index 079771c..c7acc12 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcessParam.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcessParam.java
@@ -46,7 +46,7 @@
     private BigDecimal maxValue;
 
     @ApiModelProperty("鍦ㄦ宸ュ簭涓槸鍚﹀繀濉�(0-鍚�, 1-鏄�)")
-    private Integer isRequired;
+    private Boolean isRequired;
 
     @ApiModelProperty("鎺掑簭鍙�")
     private Integer sort;
diff --git a/src/main/java/com/ruoyi/production/service/ProductOrderService.java b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
index f71df8f..abd84b7 100644
--- a/src/main/java/com/ruoyi/production/service/ProductOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -29,5 +29,7 @@
 
     Boolean addProductOrder(ProductOrder productOrder);
 
+    Long insertProductOrder(ProductOrder productOrder);
+
     Boolean delete(Long[] id);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemParamServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemParamServiceImpl.java
index 70c388b..0f63221 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemParamServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemParamServiceImpl.java
@@ -72,7 +72,7 @@
 
         BaseParam baseParam = baseParamService.getById(param.getParamId());
         if (baseParam == null) {
-            throw new ServiceException("鏂板澶辫触,鏀瑰熀纭�鍙傛暟涓嶅瓨鍦�");
+            throw new ServiceException("鏂板澶辫触,璇ュ熀纭�鍙傛暟涓嶅瓨鍦�");
         }
 
         Integer maxSort = baseMapper.selectMaxSortByRouteItemId(param.getRouteItemId());
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 7ee2e65..d4a9737 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -170,14 +170,24 @@
 
     @Override
     public Boolean addProductOrder(ProductOrder productOrder) {
-        String string = generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
-        productOrder.setNpsNo(string);
+        fillAndSaveProductOrder(productOrder);
+        return true;
+    }
+
+    @Override
+    public Long insertProductOrder(ProductOrder productOrder) {
+        fillAndSaveProductOrder(productOrder);
+        return productOrder.getId();
+    }
+
+    private void fillAndSaveProductOrder(ProductOrder productOrder) {
+        String orderNo = generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+        productOrder.setNpsNo(orderNo);
         productOrder.setCompleteQuantity(BigDecimal.ZERO);
         this.save(productOrder);
         if (ObjectUtils.isNotEmpty(productOrder.getRouteId())) {
             this.bindingRoute(productOrder);
         }
-        return true;
     }
 
     @Override
@@ -248,7 +258,7 @@
         //  鍒犻櫎闄勮〃鐨勫伐鑹鸿矾绾夸笌BOM
         for (Long id : ids) {
             ProductOrder productOrder = baseMapper.selectById(id);
-            appendixService.deleteData(productOrder.getRouteId());
+            appendixService.deleteData(productOrder.getId(), productOrder.getRouteId());
         }
 
 //        productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().in(ProductProcessRouteItem::getProductOrderId, ids));
diff --git a/src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java b/src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java
index 799f90b..66aa60e 100644
--- a/src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java
+++ b/src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java
@@ -55,4 +55,5 @@
      */
     @ApiModelProperty("鍏宠仈鐗╂枡淇℃伅琛↖D")
     private Long productMaterialId;
+
 }
diff --git a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java b/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
index cedf8f6..3cd448b 100644
--- a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -147,15 +147,19 @@
         productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity());
         productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime());
         productOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode());
+        productOrder.setStrength(productionPlanDto.getStrength());
+
+        Long orderId = productOrderService.insertProductOrder(productOrder);
 
         //  褰撲笅鍙戠殑浜у搧涓虹爩鍧楁垨鏉挎潗锛屽氨鎷夊彇BOM瀛愰泦涓庡伐鑹鸿矾绾垮瓙闆嗘暟鎹瓨鍏ュ埌闄勮〃涓�
         if ("鐮屽潡".equals(productionPlanDto.getProductName())) {
-            productOrder.setRouteId(appendixService.populateBlocks(productionPlanDto));
+            productOrder.setRouteId(appendixService.populateBlocks(orderId, productionPlanDto));
         }
         if ("鏉挎潗".equals(productionPlanDto.getProductName())) {
-            productOrder.setRouteId(appendixService.populatePlates(productionPlanDto));
+            productOrder.setRouteId(appendixService.populatePlates(orderId, productionPlanDto));
         }
-        productOrderService.addProductOrder(productOrder);
+        //  鏇存柊缁戝畾鐨勫伐鑹鸿矾绾�
+        productOrderService.updateById(productOrder);
 
         // 鏍规嵁涓嬪彂鏁伴噺锛屼粠绗竴涓敓浜ц鍒掑紑濮嬪垎閰嶆柟鏁�
         BigDecimal assignedVolume = BigDecimal.ZERO;
diff --git a/src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml b/src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml
index 9705b88..7907c8e 100644
--- a/src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml
+++ b/src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml
@@ -7,6 +7,7 @@
 
     <resultMap id="ProcessRouteItemInstanceMap" type="com.ruoyi.appendix.pojo.ProcessRouteItemInstance">
         <id property="id" column="id"/>
+        <result property="orderId" column="order_id"/>
         <result property="routeId" column="route_id"/>
         <result property="productModelId" column="product_model_id"/>
         <result property="processId" column="process_id"/>
diff --git a/src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml b/src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml
index b6d4de2..c32f3c5 100644
--- a/src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml
+++ b/src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml
@@ -7,9 +7,15 @@
 
     <resultMap id="BaseResultMap" type="com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance">
         <id property="id" column="id"/>
+        <result property="orderId" column="order_id"/>
         <result property="routeItemId" column="route_item_id"/>
-        <result property="paramId" column="param_id"/>
-        <result property="processParamId" column="process_param_id"/>
+        <result property="paramKey" column="param_key"/>
+        <result property="paramName" column="param_name"/>
+        <result property="paramType" column="param_type"/>
+        <result property="paramFormat" column="param_format"/>
+        <result property="valueMode" column="value_mode"/>
+        <result property="unit" column="unit"/>
+        <result property="remark" column="remark"/>
         <result property="standardValue" column="standard_value"/>
         <result property="minValue" column="min_value"/>
         <result property="maxValue" column="max_value"/>
diff --git a/src/main/resources/mapper/appendix/ProductProcessParamInstanceMapper.xml b/src/main/resources/mapper/appendix/ProductProcessParamInstanceMapper.xml
deleted file mode 100644
index 690c084..0000000
--- a/src/main/resources/mapper/appendix/ProductProcessParamInstanceMapper.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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.appendix.mapper.ProductProcessParamInstanceMapper">
-
-    <resultMap id="BaseResultMap" type="com.ruoyi.appendix.pojo.ProductProcessParamInstance">
-        <id property="id" column="id"/>
-        <result property="processId" column="process_id"/>
-        <result property="paramId" column="param_id"/>
-        <result property="standardValue" column="standard_value"/>
-        <result property="minValue" column="min_value"/>
-        <result property="maxValue" column="max_value"/>
-        <result property="isRequired" column="is_required"/>
-        <result property="sort" column="sort"/>
-        <result property="tenantId" column="tenant_id"/>
-        <result property="createTime" column="create_time"/>
-        <result property="updateTime" column="update_time"/>
-    </resultMap>
-
-</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml b/src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml
index ebb91af..bb8689d 100644
--- a/src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml
+++ b/src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml
@@ -7,6 +7,7 @@
 
     <resultMap id="BaseResultMap" type="com.ruoyi.appendix.pojo.ProductStructureInstance">
         <id property="id" column="id"/>
+        <result property="orderId" column="order_id"/>
         <result property="parentId" column="parent_id"/>
         <result property="productModelId" column="product_model_id"/>
         <result property="processId" column="process_id"/>
diff --git a/src/main/resources/mapper/production/ProductOrderMapper.xml b/src/main/resources/mapper/production/ProductOrderMapper.xml
index 80606cb..7c18400 100644
--- a/src/main/resources/mapper/production/ProductOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -15,23 +15,45 @@
     </resultMap>
 
     <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
-        select po.*,
-        ppr.process_route_code,
-        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus
-        from product_order po
-        left join product_process_route ppr on po.id = ppr.product_order_id
+        SELECT
+        po.id,
+        po.nps_no,
+        po.tenant_id,
+        po.create_time,
+        po.update_time,
+        po.route_id,
+        po.quantity,
+        po.complete_quantity,
+        po.start_time,
+        po.end_time,
+        po.plan_complete_time,
+        po.status,
+        pm.product_name,
+        po.strength AS strength,
+        pr.process_route_code AS processRouteCode,
+        pr.description,
+        pb.id AS bomId,
+        pb.bom_no AS bomNo,
+        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,
+        pms.model,
+        pms.material_code AS materialCode
+        FROM product_order po
+        LEFT JOIN process_route pr ON po.route_id = pr.id
+        LEFT JOIN product_bom pb ON pr.bom_id = pb.id
+        LEFT JOIN product_order_plan pop ON po.id = pop.product_order_id
+        LEFT JOIN production_plan pp ON pop.production_plan_id = pp.id
+        LEFT JOIN product_material_sku pms ON pms.id = pp.product_material_sku_id
+        LEFT JOIN product_material pm ON pm.id = pms.product_id
         <where>
             <if test="c.npsNo != null and c.npsNo != ''">
-                and po.nps_no like concat('%',#{c.npsNo},'%')
-            </if>
-            <if test="c.customerName != null and c.customerName != ''">
-                and sl.customer_name like concat('%',#{c.customerName},'%')
+                AND po.nps_no LIKE CONCAT('%', #{c.npsNo}, '%')
             </if>
             <if test="c.startTime != null and c.endTime != null">
-                and po.create_time between #{c.startTime} and #{c.endTime}
+                AND po.create_time BETWEEN #{c.startTime} AND #{c.endTime}
             </if>
         </where>
     </select>
+
     <select id="listProcessRoute" resultType="com.ruoyi.production.pojo.ProcessRoute">
         select pr.*
         from process_route pr
@@ -46,35 +68,40 @@
                ps.unit_quantity * po.quantity as demandedQuantity,
                ps.unit,
                p.product_name,
-               pp.name as  process_name,
+               pp.name                        as process_name,
                pm.product_id,
                pm.model
-        from
-            product_structure ps
-                left join product_model pm on ps.product_model_id = pm.id
-                left join product p on pm.product_id = p.id
-                left join product_process pp on ps.process_id = pp.id
-                left join product_process_route ppr on ps.bom_id = ppr.bom_id
-                left join product_order po on po.id = ppr.product_order_id
+        from product_structure ps
+                 left join product_model pm on ps.product_model_id = pm.id
+                 left join product p on pm.product_id = p.id
+                 left join product_process pp on ps.process_id = pp.id
+                 left join product_process_route ppr on ps.bom_id = ppr.bom_id
+                 left join product_order po on po.id = ppr.product_order_id
         where ppr.product_order_id = #{orderId}
         order by ps.id
     </select>
 
 
     <select id="countCreated" resultType="java.lang.Integer">
-        SELECT count(1) FROM product_order
-        WHERE create_time &gt;= #{startDate} AND create_time &lt;= #{endDate}
+        SELECT count(1)
+        FROM product_order
+        WHERE create_time &gt;= #{startDate}
+          AND create_time &lt;= #{endDate}
     </select>
 
     <select id="countCompleted" resultType="java.lang.Integer">
-        SELECT count(1) FROM product_order
-        WHERE end_time &gt;= #{startDate} AND end_time &lt;= #{endDate}
+        SELECT count(1)
+        FROM product_order
+        WHERE end_time &gt;= #{startDate}
+          AND end_time &lt;= #{endDate}
           AND complete_quantity &gt;= quantity
     </select>
 
     <select id="countPending" resultType="java.lang.Integer">
-        SELECT count(1) FROM product_order
-        WHERE create_time &gt;= #{startDate} AND create_time &lt;= #{endDate}
+        SELECT count(1)
+        FROM product_order
+        WHERE create_time &gt;= #{startDate}
+          AND create_time &lt;= #{endDate}
           AND complete_quantity &lt; quantity
     </select>
 </mapper>

--
Gitblit v1.9.3