From 7f7993e0fde1e08bfd37982ab6eb9e5a08545b2d Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 20 三月 2026 11:24:33 +0800
Subject: [PATCH] refactor: 生产订单绑定工艺路线的子表重命名

---
 src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemParamDto.java                  |   27 +
 src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemParamController.java    |   57 ++
 src/main/resources/mapper/production/ProductionOrderRouteItemMapper.xml                       |   19 
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java      |  151 ++++++
 src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java                 |   16 
 src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java         |   43 +
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemServiceImpl.java      |   85 +-
 src/main/java/com/ruoyi/production/service/IProductionOrderAppendixService.java               |    6 
 doc/宁夏-中盛建材.sql                                                                               |  167 +++---
 src/main/resources/mapper/production/ProductionOrderStructureMapper.xml                       |   19 
 src/main/java/com/ruoyi/production/controller/ProductionOrderAppendixController.java          |   40 +
 src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java                       |   34 +
 src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItem.java                         |   69 ++
 src/main/resources/mapper/production/ProductionOrderRouteItemParamMapper.xml                  |   28 +
 src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemParamService.java         |   26 +
 src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemService.java              |   28 +
 src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemDto.java                       |   23 
 src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItemParam.java                    |   97 +++
 src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java              |   22 
 src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemMapper.java                 |   16 
 /dev/null                                                                                     |  153 ------
 src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemController.java         |   64 ++
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemParamServiceImpl.java |  122 ++++
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderAppendixServiceImpl.java       |   66 +-
 src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemParamMapper.java            |   16 
 src/main/java/com/ruoyi/production/pojo/ProductionOrderStructure.java                         |   62 ++
 26 files changed, 1,132 insertions(+), 324 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 d9c5e24..f91a888 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"
@@ -281,95 +281,6 @@
 ALTER TABLE `product-inventory-management-zsjc`.`product_order`
     ADD COLUMN `status` int NULL COMMENT '鐘舵�侊紙1.寰呭紑濮嬨��2.杩涜涓��3.宸插畬鎴愩��4.宸插彇娑堬級' AFTER `plan_complete_time`;
 
-DROP TABLE IF EXISTS `process_route_item_instance`;
-CREATE TABLE `process_route_item_instance`
-(
-    `id`               bigint     NOT NULL AUTO_INCREMENT,
-    `route_id`         bigint     NOT NULL DEFAULT 0 COMMENT '宸ヨ壓璺嚎id',
-    `product_model_id` bigint     NULL     DEFAULT 0 COMMENT '浜у搧id',
-    `process_id`       bigint     NOT NULL DEFAULT 0 COMMENT '宸ュ簭id',
-    `tenant_id`        bigint     NOT NULL COMMENT '绉熸埛id',
-    `create_time`      datetime   NULL     DEFAULT NULL COMMENT '褰曞叆鏃堕棿',
-    `update_time`      datetime   NULL     DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
-    `drag_sort`        int        NULL     DEFAULT NULL COMMENT '鎷栧姩鎺掑簭',
-    `is_quality`       tinyint(1) NULL     DEFAULT 1 COMMENT '鏄惁璐ㄦ宸ュ簭',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB
-  AUTO_INCREMENT = 83
-  CHARACTER SET = utf8mb4
-  COLLATE = utf8mb4_0900_ai_ci COMMENT = '宸ヨ壓璺嚎瀛愰泦-闄勮〃'
-  ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- 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)',
-    `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,
-    KEY `idx_route_item_id` (`route_item_id`) USING BTREE,
-    KEY `idx_param_key` (`param_key`)
-) ENGINE = InnoDB
-  AUTO_INCREMENT = 1
-  DEFAULT CHARSET = utf8mb4
-  COLLATE = utf8mb4_0900_ai_ci
-  ROW_FORMAT = DYNAMIC COMMENT ='宸ヨ壓璺嚎宸ュ簭鍙傛暟瀹炰緥琛�';
-
--- ----------------------------
--- Table structure for product_structure_instance
--- ----------------------------
-DROP TABLE IF EXISTS `product_structure_instance`;
-CREATE TABLE `product_structure_instance`
-(
-    `id`                bigint                                                        NOT NULL AUTO_INCREMENT,
-    `parent_id`         bigint                                                        NULL DEFAULT NULL COMMENT '鐖惰妭鐐笽D',
-    `product_model_id`  bigint                                                        NULL DEFAULT NULL COMMENT '浜у搧id',
-    `process_id`        bigint                                                        NULL DEFAULT NULL COMMENT '宸ュ簭id',
-    `unit_quantity`     decimal(16, 4)                                                NOT NULL COMMENT '鍗曚綅浜у嚭闇�瑕佹暟閲�',
-    `demanded_quantity` decimal(16, 4)                                                NULL DEFAULT NULL COMMENT '闇�姹傛暟閲�',
-    `unit`              varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '鍗曚綅',
-    `tenant_id`         bigint                                                        NULL DEFAULT NULL COMMENT '绉熸埛id',
-    `bom_id`            bigint                                                        NOT NULL COMMENT 'bom鐨刬d',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB
-  CHARACTER SET = utf8mb4
-  COLLATE = utf8mb4_0900_ai_ci COMMENT = 'BOM瀛愰泦-闄勮〃'
-  ROW_FORMAT = Dynamic;
-
-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`;
@@ -427,4 +338,80 @@
 
 ALTER TABLE `product-inventory-management-zsjc`.`product_structure`
     MODIFY COLUMN `unit_quantity` decimal(20, 15) NOT NULL COMMENT '鍗曚綅浜у嚭闇�瑕佹暟閲�' AFTER `process_id`,
-    MODIFY COLUMN `demanded_quantity` decimal(20, 15) NULL DEFAULT NULL COMMENT '闇�姹傛暟閲�' AFTER `unit_quantity`,
\ No newline at end of file
+    MODIFY COLUMN `demanded_quantity` decimal(20, 15) NULL DEFAULT NULL COMMENT '闇�姹傛暟閲�' AFTER `unit_quantity`,
+
+
+CREATE TABLE `production_order_route_item`
+(
+    `id`               bigint NOT NULL AUTO_INCREMENT,
+    `order_id`         bigint NOT NULL COMMENT '鐢熶骇璁㈠崟id',
+    `route_id`         bigint NOT NULL DEFAULT '0' COMMENT '宸ヨ壓璺嚎id',
+    `product_model_id` bigint          DEFAULT '0' COMMENT '浜у搧id',
+    `process_id`       bigint NOT NULL DEFAULT '0' COMMENT '宸ュ簭id',
+    `tenant_id`        bigint NOT NULL COMMENT '绉熸埛id',
+    `create_time`      datetime        DEFAULT NULL COMMENT '褰曞叆鏃堕棿',
+    `update_time`      datetime        DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
+    `drag_sort`        int             DEFAULT NULL COMMENT '鎷栧姩鎺掑簭',
+    `is_quality`       tinyint(1)      DEFAULT '1' COMMENT '鏄惁璐ㄦ宸ュ簭',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY `idx_order_id` (`order_id`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 83
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci
+  ROW_FORMAT = DYNAMIC
+    COMMENT ='鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾�--宸ュ簭琛�';
+
+CREATE TABLE `production_order_route_item_param`
+(
+    `id`               bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID',
+    `order_id`         bigint                                                                 DEFAULT NULL COMMENT '鐢熶骇璁㈠崟ID',
+    `route_item_id`    bigint                                                        NOT NULL COMMENT '鍏宠仈宸ヨ壓璺嚎鏄庣粏ID (production_order_route_item.id)',
+    `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,
+    KEY `idx_route_item_id` (`route_item_id`) USING BTREE,
+    KEY `idx_param_key` (`param_key`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci
+  ROW_FORMAT = DYNAMIC
+    COMMENT ='鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛�';
+
+CREATE TABLE `production_order_structure`
+(
+    `id`                bigint         NOT NULL AUTO_INCREMENT,
+    `order_id`          bigint         NOT NULL COMMENT '鐢熶骇璁㈠崟id',
+    `parent_id`         bigint                                                        DEFAULT NULL COMMENT '鐖惰妭鐐笽D',
+    `product_model_id`  bigint                                                        DEFAULT NULL COMMENT '浜у搧id',
+    `process_id`        bigint                                                        DEFAULT NULL COMMENT '宸ュ簭id',
+    `unit_quantity`     decimal(16, 4) NOT NULL COMMENT '鍗曚綅浜у嚭闇�瑕佹暟閲�',
+    `demanded_quantity` decimal(16, 4)                                                DEFAULT NULL COMMENT '闇�姹傛暟閲�',
+    `unit`              varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '鍗曚綅',
+    `tenant_id`         bigint                                                        DEFAULT NULL COMMENT '绉熸埛id',
+    `bom_id`            bigint         NOT NULL COMMENT 'bom鐨刬d',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY `idx_order_id` (`order_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci
+  ROW_FORMAT = DYNAMIC
+    COMMENT ='鐢熶骇璁㈠崟缁戝畾鐨凚OM瀛愯〃';
+
+DROP TABLE IF EXISTS process_route_item_instance;
+DROP TABLE IF EXISTS process_route_item_param_instance;
+DROP TABLE IF EXISTS product_structure_instance;
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/controller/AppendixController.java b/src/main/java/com/ruoyi/appendix/controller/AppendixController.java
deleted file mode 100644
index e4d4d2f..0000000
--- a/src/main/java/com/ruoyi/appendix/controller/AppendixController.java
+++ /dev/null
@@ -1,36 +0,0 @@
-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 io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-
-/**
- * <br>
- * BOM-宸ヨ壓璺嚎闄勮〃鎺у埗灞�
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 14:44
- */
-@RestController
-@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
deleted file mode 100644
index 587b9d9..0000000
--- a/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java
+++ /dev/null
@@ -1,65 +0,0 @@
-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 io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import java.util.List;
-
-/**
- * <br>
- * 宸ヨ壓璺嚎瀛愰泦-闄勮〃鎺у埗灞�
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:07
- */
-@RestController
-@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
deleted file mode 100644
index 39dde3e..0000000
--- a/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java
+++ /dev/null
@@ -1,60 +0,0 @@
-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 io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import java.util.List;
-
-/**
- * <br>
- * 宸ヨ壓璺嚎宸ュ簭鍙傛暟鎺ュ彛
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:14
- */
-
-@Api(tags = "宸ヨ壓璺嚎宸ュ簭鍙傛暟鎺ュ彛")
-@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/ProductStructureInstanceController.java b/src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
deleted file mode 100644
index 9867f7a..0000000
--- a/src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
+++ /dev/null
@@ -1,44 +0,0 @@
-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 io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import java.util.List;
-
-/**
- * <br>
- * BOM瀛愰泦-闄勮〃Controller
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:22
- */
-@Api(tags = "BOM缁撴瀯鎺ュ彛")
-@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
deleted file mode 100644
index fc113b4..0000000
--- a/src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemInstanceDto.java
+++ /dev/null
@@ -1,24 +0,0 @@
-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
deleted file mode 100644
index e385c55..0000000
--- a/src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemParamInstanceDto.java
+++ /dev/null
@@ -1,24 +0,0 @@
-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
deleted file mode 100644
index 8a70ed3..0000000
--- a/src/main/java/com/ruoyi/appendix/dto/ProductStructureInstanceDto.java
+++ /dev/null
@@ -1,32 +0,0 @@
-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/ProcessRouteItemInstanceMapper.java b/src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java
deleted file mode 100644
index 2048f3c..0000000
--- a/src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.appendix.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.appendix.pojo.ProcessRouteItemInstance;
-
-/**
- * <br>
- * 宸ヨ壓璺嚎瀛愰泦-闄勮〃Mapper
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:02
- */
-public interface ProcessRouteItemInstanceMapper extends BaseMapper<ProcessRouteItemInstance> {
-}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemParamInstanceMapper.java b/src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemParamInstanceMapper.java
deleted file mode 100644
index f4e88e2..0000000
--- a/src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemParamInstanceMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.appendix.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
-
-/**
- * <br>
- * 宸ヨ壓璺嚎宸ュ簭鍙傛暟-闄勮〃Mapper
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:10
- */
-public interface ProcessRouteItemParamInstanceMapper extends BaseMapper<ProcessRouteItemParamInstance> {
-}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java b/src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java
deleted file mode 100644
index 859feca..0000000
--- a/src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.appendix.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.appendix.pojo.ProductStructureInstance;
-
-/**
- * <br>
- * BOM瀛愰泦-闄勮〃Mapper
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:20
- */
-public interface ProductStructureInstanceMapper extends BaseMapper<ProductStructureInstance> {
-}
diff --git a/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java b/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java
deleted file mode 100644
index cbe09a3..0000000
--- a/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.ruoyi.appendix.pojo;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-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.time.LocalDateTime;
-
-/**
- * <br>
- * 宸ヨ壓璺嚎瀛愰泦-闄勮〃
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 11:43
- */
-@Data
-@TableName("process_route_item_instance")
-@Api(tags = "宸ヨ壓璺嚎瀛愰泦-闄勮〃")
-public class ProcessRouteItemInstance {
-
-    @TableId(type = IdType.AUTO)
-    private Long id;
-
-    @ApiModelProperty("鐢熶骇璁㈠崟id")
-    private Long orderId;
-
-    @ApiModelProperty("宸ヨ壓璺嚎id")
-    private Long routeId;
-
-    @ApiModelProperty("浜у搧id")
-    private Long productModelId;
-
-    @ApiModelProperty("宸ュ簭id")
-    private Long processId;
-
-    @ApiModelProperty("绉熸埛id")
-    private Long tenantId;
-
-    @ApiModelProperty("褰曞叆鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime createTime;
-
-    @ApiModelProperty("鏇存柊鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime updateTime;
-
-    @ApiModelProperty("鎷栧姩鎺掑簭")
-    private Integer dragSort;
-
-    @ApiModelProperty("鏄惁璐ㄦ宸ュ簭")
-    private Integer isQuality;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java b/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java
deleted file mode 100644
index c363898..0000000
--- a/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java
+++ /dev/null
@@ -1,87 +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:09
- */
-@Data
-@TableName("process_route_item_param_instance")
-@Api(tags = "宸ヨ壓璺嚎宸ュ簭鍙傛暟-闄勮〃")
-public class ProcessRouteItemParamInstance {
-
-    @TableId(type = IdType.AUTO)
-    @ApiModelProperty("涓婚敭ID")
-    private Long id;
-
-    @ApiModelProperty("鐢熶骇璁㈠崟id")
-    private Long orderId;
-
-    @ApiModelProperty("鍏宠仈宸ヨ壓璺嚎鏄庣粏ID")
-    private Long routeItemId;
-
-    @ApiModelProperty("鍙傛暟鍞竴鏍囪瘑")
-    private String paramKey;
-
-    @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;
-
-    @ApiModelProperty("鏈�灏忓��")
-    private BigDecimal minValue;
-
-    @ApiModelProperty("鏈�澶у��")
-    private BigDecimal maxValue;
-
-    @ApiModelProperty("鏄惁蹇呭~")
-    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;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java b/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
deleted file mode 100644
index fe28f35..0000000
--- a/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.ruoyi.appendix.pojo;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-/**
- * <br>
- * BOM瀛愰泦-闄勮〃
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:20
- */
-@Data
-@TableName("product_structure_instance")
-@Api(tags = "BOM瀛愰泦-闄勮〃")
-public class ProductStructureInstance {
-
-    @TableId(type = IdType.AUTO)
-    @ApiModelProperty("涓婚敭ID")
-    private Long id;
-
-    @ApiModelProperty("鐢熶骇璁㈠崟id")
-    private Long orderId;
-
-    @ApiModelProperty("鐖惰妭鐐笽D")
-    private Long parentId;
-
-    @ApiModelProperty("浜у搧ID")
-    private Long productModelId;
-
-    @ApiModelProperty("宸ュ簭ID")
-    private Long processId;
-
-    @ApiModelProperty("鍗曚綅浜у嚭闇�瑕佹暟閲�")
-    private BigDecimal unitQuantity;
-
-    @ApiModelProperty("闇�姹傛暟閲�")
-    private BigDecimal demandedQuantity;
-
-    @ApiModelProperty("鍗曚綅")
-    private String unit;
-
-    @ApiModelProperty("绉熸埛ID")
-    private Long tenantId;
-
-    @ApiModelProperty("BOM ID")
-    private Long bomId;
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java b/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
deleted file mode 100644
index 31d6025..0000000
--- a/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-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
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @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
deleted file mode 100644
index 8233b33..0000000
--- a/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-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>
- * 宸ヨ壓璺嚎宸ュ簭鍙傛暟-闄勮〃Service
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @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/ProductStructureInstanceService.java b/src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
deleted file mode 100644
index 631428c..0000000
--- a/src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
+++ /dev/null
@@ -1,23 +0,0 @@
-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>
- * BOM瀛愰泦-闄勮〃Service鎺ュ彛
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @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/ProcessRouteItemParamInstanceServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java
deleted file mode 100644
index 73d3d77..0000000
--- a/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java
+++ /dev/null
@@ -1,105 +0,0 @@
-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>
- * 宸ヨ壓璺嚎宸ュ簭鍙傛暟-闄勮〃Service瀹炵幇绫�
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:12
- */
-@Slf4j
-@Service
-public class ProcessRouteItemParamInstanceServiceImpl extends ServiceImpl<ProcessRouteItemParamInstanceMapper, ProcessRouteItemParamInstance> implements ProcessRouteItemParamInstanceService {
-
-    @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/ProductStructureInstanceServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
deleted file mode 100644
index 5b2f9c2..0000000
--- a/src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
+++ /dev/null
@@ -1,153 +0,0 @@
-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>
- * BOM瀛愰泦-闄勮〃Service瀹炵幇绫�
- * </br>
- *
- * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:21
- */
-@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/controller/ProductionOrderAppendixController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderAppendixController.java
new file mode 100644
index 0000000..8a3d93b
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderAppendixController.java
@@ -0,0 +1,40 @@
+package com.ruoyi.production.controller;
+
+import com.ruoyi.appendix.service.AppendixService;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.pojo.ProductOrder;
+import com.ruoyi.production.service.IProductionOrderAppendixService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <br>
+ * BOM-宸ヨ壓璺嚎闄勮〃鎺у埗灞�
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/20
+ */
+@RestController
+@RequestMapping("/appendix")
+@Api("BOM-宸ヨ壓璺嚎闄勮〃鎺у埗灞�")
+public class ProductionOrderAppendixController {
+
+    @Resource
+    private IProductionOrderAppendixService iProductionOrderAppendixService;
+
+    @PostMapping("/bindingRoute")
+    @ApiOperation("鐢熶骇璁㈠崟缁戝畾宸ヨ壓璺嚎")
+    public AjaxResult bindingRoute(@RequestBody ProductOrder productOrder) {
+        iProductionOrderAppendixService.populateData(productOrder);
+        return AjaxResult.success();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemController.java
new file mode 100644
index 0000000..6e6fe6a
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemController.java
@@ -0,0 +1,64 @@
+package com.ruoyi.production.controller;
+
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.dto.ProductionOrderRouteItemDto;
+import com.ruoyi.production.service.IProductionOrderRouteItemService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾�--宸ュ簭琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+@RestController
+@RequestMapping("/productionOrderRouteItem")
+@Api(tags = "宸ヨ壓璺嚎宸ュ簭鎺ュ彛")
+public class ProductionOrderRouteItemController {
+
+    @Resource
+    private IProductionOrderRouteItemService productionOrderRouteItemService;
+
+    @GetMapping("/list/{orderId}")
+    @ApiOperation("鑾峰彇宸ュ簭鍒楄〃")
+    public AjaxResult getProcessItem(@PathVariable Long orderId) {
+        List<ProductionOrderRouteItemDto> list = productionOrderRouteItemService.getProcessItem(orderId);
+        return AjaxResult.success(list);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation("鏂板宸ュ簭")
+    public AjaxResult addProcessItem(@RequestBody ProductionOrderRouteItemDto dto) {
+        productionOrderRouteItemService.addProcessItem(dto);
+        return AjaxResult.success();
+    }
+
+    @PutMapping("/update")
+    @ApiOperation("淇敼宸ュ簭")
+    public AjaxResult updateProcessItem(@RequestBody ProductionOrderRouteItemDto dto) {
+        productionOrderRouteItemService.updateProcessItem(dto);
+        return AjaxResult.success();
+    }
+
+    @DeleteMapping("/delete/{id}")
+    @ApiOperation("鍒犻櫎宸ュ簭")
+    public AjaxResult deleteProcessItem(@PathVariable Long id) {
+        productionOrderRouteItemService.deleteProcessItem(id);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/sort")
+    @ApiOperation("宸ュ簭鎺掑簭")
+    public AjaxResult sortProcessItem(@RequestBody ProductionOrderRouteItemDto dto) {
+        productionOrderRouteItemService.sortProcessItem(dto);
+        return AjaxResult.success();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemParamController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemParamController.java
new file mode 100644
index 0000000..a240b45
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemParamController.java
@@ -0,0 +1,57 @@
+package com.ruoyi.production.controller;
+
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.dto.ProductionOrderRouteItemParamDto;
+import com.ruoyi.production.service.IProductionOrderRouteItemParamService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+@Api(tags = "宸ヨ壓璺嚎宸ュ簭鍙傛暟鎺ュ彛")
+@RestController
+@RequestMapping("/productionOrderRouteItemParam")
+public class ProductionOrderRouteItemParamController {
+
+    @Resource
+    private IProductionOrderRouteItemParamService productionOrderRouteItemParamService;
+
+    @GetMapping("/list")
+    @ApiOperation("鐢熶骇璁㈠崟-鑾峰彇宸ュ簭缁戝畾鐨勫弬鏁板垪琛�")
+    public AjaxResult routeItemParamList(@RequestParam("orderId") Long orderId, @RequestParam("routeItemId") Long routeItemId) {
+        List<ProductionOrderRouteItemParamDto> list = productionOrderRouteItemParamService.routeItemParamList(orderId, routeItemId);
+        return AjaxResult.success(list);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation("鐢熶骇璁㈠崟-宸ュ簭鏂板鍙傛暟")
+    public AjaxResult addRouteItemParam(@RequestBody ProductionOrderRouteItemParamDto dto) {
+        productionOrderRouteItemParamService.addRouteItemParam(dto);
+        return AjaxResult.success();
+    }
+
+    @PutMapping("/update")
+    @ApiOperation("鐢熶骇璁㈠崟-宸ュ簭鏇存柊鍙傛暟")
+    public AjaxResult updateRouteItemParam(@RequestBody ProductionOrderRouteItemParamDto dto) {
+        productionOrderRouteItemParamService.updateRouteItemParam(dto);
+        return AjaxResult.success();
+    }
+
+    @DeleteMapping("/delete/{id}")
+    @ApiOperation("鐢熶骇璁㈠崟-宸ュ簭鍒犻櫎鍙傛暟")
+    public AjaxResult deleteRouteItemParam(@PathVariable Long id) {
+        productionOrderRouteItemParamService.deleteRouteItemParam(id);
+        return AjaxResult.success();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java
new file mode 100644
index 0000000..912e99f
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java
@@ -0,0 +1,43 @@
+package com.ruoyi.production.controller;
+
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.dto.ProductionOrderStructureDto;
+import com.ruoyi.production.service.IProductionOrderStructureService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨凚OM瀛愯〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+@Api(tags = "BOM缁撴瀯鎺ュ彛")
+@RestController
+@RequestMapping("/productionOrderStructure")
+public class ProductionOrderStructureController {
+
+    @Resource
+    private IProductionOrderStructureService productionOrderStructureService;
+
+    @GetMapping("/getBomStructs/{orderId}")
+    @ApiOperation("鏍规嵁鐢熶骇璁㈠崟ID鑾峰彇缁戝畾鐨凚OM瀛愰泦缁撴瀯鏍�")
+    public AjaxResult getBomStructs(@PathVariable Long orderId) {
+        List<ProductionOrderStructureDto> list = productionOrderStructureService.listByOrderId(orderId);
+        return AjaxResult.success(list);
+    }
+
+    @PutMapping("/addOrUpdateBomStructs")
+    @ApiOperation("鏂板/鏇存柊BOM瀛愰泦缁撴瀯")
+    public AjaxResult addOrUpdateBomStructs(@RequestBody ProductionOrderStructureDto instanceDto) {
+        productionOrderStructureService.addOrUpdateBomStructs(instanceDto);
+        return AjaxResult.success();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemDto.java b/src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemDto.java
new file mode 100644
index 0000000..4d71901
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.production.pojo.ProductionOrderRouteItem;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <br>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾�--宸ュ簭琛―to
+ * </br>
+ *
+ * @author deslrey
+ * @since 2026/03/20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProductionOrderRouteItemDto extends ProductionOrderRouteItem {
+
+    @ApiModelProperty("宸ュ簭鍚嶇О")
+    private String processName;
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemParamDto.java b/src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemParamDto.java
new file mode 100644
index 0000000..e75e0eb
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemParamDto.java
@@ -0,0 +1,27 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <br>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛―to
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/20 10:11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProductionOrderRouteItemParamDto extends ProductionOrderRouteItemParam {
+
+    @ApiModelProperty("宸ュ簭ID")
+    private Long processId;
+
+    @ApiModelProperty("鍩烘湰鍙傛暟ID")
+    private Long paramId;
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java b/src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java
new file mode 100644
index 0000000..a0757ac
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java
@@ -0,0 +1,34 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.production.pojo.ProductionOrderStructure;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <br>
+ * 鐢熶骇璁㈠崟缁戝畾鐨凚OM瀛愯〃Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/20 10:12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProductionOrderStructureDto extends ProductionOrderStructure {
+
+
+    @ApiModelProperty("瀛愮被")
+    private List<ProductionOrderStructureDto> children = new ArrayList<>();
+
+    @ApiModelProperty("涓存椂ID")
+    private String tempId;
+
+    @ApiModelProperty("鐖惰妭鐐逛复鏃禝D")
+    private String parentTempId;
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemMapper.java
new file mode 100644
index 0000000..0682512
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.production.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.production.pojo.ProductionOrderRouteItem;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾�--宸ュ簭琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+public interface ProductionOrderRouteItemMapper extends BaseMapper<ProductionOrderRouteItem> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemParamMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemParamMapper.java
new file mode 100644
index 0000000..7c6a1b1
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemParamMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.production.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+public interface ProductionOrderRouteItemParamMapper extends BaseMapper<ProductionOrderRouteItemParam> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java
new file mode 100644
index 0000000..191fbdd
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.production.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.production.pojo.ProductionOrderStructure;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨凚OM瀛愯〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+public interface ProductionOrderStructureMapper extends BaseMapper<ProductionOrderStructure> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItem.java b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItem.java
new file mode 100644
index 0000000..e0a02d2
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItem.java
@@ -0,0 +1,69 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾�--宸ュ簭琛�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("production_order_route_item")
+@ApiModel(value="ProductionOrderRouteItem瀵硅薄", description="鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾�--宸ュ簭琛�")
+public class ProductionOrderRouteItem implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "鐢熶骇璁㈠崟id")
+    private Long orderId;
+
+    @ApiModelProperty(value = "宸ヨ壓璺嚎id")
+    private Long routeId;
+
+    @ApiModelProperty(value = "浜у搧id")
+    private Long productModelId;
+
+    @ApiModelProperty(value = "宸ュ簭id")
+    private Long processId;
+
+    @ApiModelProperty(value = "绉熸埛id")
+    private Long tenantId;
+
+    @ApiModelProperty(value = "褰曞叆鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "鎷栧姩鎺掑簭")
+    private Integer dragSort;
+
+    @ApiModelProperty(value = "鏄惁璐ㄦ宸ュ簭(0鍚� 1鏄�)")
+    private Integer isQuality;
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItemParam.java b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItemParam.java
new file mode 100644
index 0000000..71885d1
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItemParam.java
@@ -0,0 +1,97 @@
+package com.ruoyi.production.pojo;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("production_order_route_item_param")
+@ApiModel(value="ProductionOrderRouteItemParam瀵硅薄", description="鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛�")
+public class ProductionOrderRouteItemParam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "鐢熶骇璁㈠崟ID")
+    private Long orderId;
+
+    @ApiModelProperty(value = "鍏宠仈宸ヨ壓璺嚎鏄庣粏ID (production_order_route_item.id)")
+    private Long routeItemId;
+
+    @ApiModelProperty(value = "鏉ユ簮宸ュ簭鍙傛暟ID")
+    private Long processParamId;
+
+    @ApiModelProperty(value = "鍙傛暟鍞竴鏍囪瘑")
+    private String paramKey;
+
+    @ApiModelProperty(value = "鍙傛暟鍚嶇О")
+    private String paramName;
+
+    @ApiModelProperty(value = "鍙傛暟绫诲瀷(1鏁板瓧 2鏂囨湰 3涓嬫媺閫夋嫨 4鏃堕棿)")
+    private Integer paramType;
+
+    @ApiModelProperty(value = "鍙傛暟鏍煎紡")
+    private String paramFormat;
+
+    @ApiModelProperty(value = "鍊兼ā寮�(1鍗曞�� 2鍖洪棿)")
+    private Integer valueMode;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鏍囧噯鍊�")
+    private String standardValue;
+
+    @ApiModelProperty(value = "姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�灏忓��")
+    private BigDecimal minValue;
+
+    @ApiModelProperty(value = "姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�澶у��")
+    private BigDecimal maxValue;
+
+    @ApiModelProperty(value = "鏄惁蹇呭~")
+    private Boolean isRequired;
+
+    @ApiModelProperty(value = "鎺掑簭")
+    private Integer sort;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    private Long tenantId;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @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/production/pojo/ProductionOrderStructure.java b/src/main/java/com/ruoyi/production/pojo/ProductionOrderStructure.java
new file mode 100644
index 0000000..8b7ad26
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionOrderStructure.java
@@ -0,0 +1,62 @@
+package com.ruoyi.production.pojo;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨凚OM瀛愯〃
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("production_order_structure")
+@ApiModel(value="ProductionOrderStructure瀵硅薄", description="鐢熶骇璁㈠崟缁戝畾鐨凚OM瀛愯〃")
+public class ProductionOrderStructure implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "鐢熶骇璁㈠崟id")
+    private Long orderId;
+
+    @ApiModelProperty(value = "鐖惰妭鐐笽D")
+    private Long parentId;
+
+    @ApiModelProperty(value = "浜у搧id")
+    private Long productModelId;
+
+    @ApiModelProperty(value = "宸ュ簭id")
+    private Long processId;
+
+    @ApiModelProperty(value = "鍗曚綅浜у嚭闇�瑕佹暟閲�")
+    private BigDecimal unitQuantity;
+
+    @ApiModelProperty(value = "闇�姹傛暟閲�")
+    private BigDecimal demandedQuantity;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty(value = "绉熸埛id")
+    private Long tenantId;
+
+    @ApiModelProperty(value = "bom鐨刬d")
+    private Long bomId;
+
+
+}
diff --git a/src/main/java/com/ruoyi/appendix/service/AppendixService.java b/src/main/java/com/ruoyi/production/service/IProductionOrderAppendixService.java
similarity index 90%
rename from src/main/java/com/ruoyi/appendix/service/AppendixService.java
rename to src/main/java/com/ruoyi/production/service/IProductionOrderAppendixService.java
index b706266..acdca2c 100644
--- a/src/main/java/com/ruoyi/appendix/service/AppendixService.java
+++ b/src/main/java/com/ruoyi/production/service/IProductionOrderAppendixService.java
@@ -1,4 +1,4 @@
-package com.ruoyi.appendix.service;
+package com.ruoyi.production.service;
 
 import com.ruoyi.production.pojo.ProductOrder;
 import com.ruoyi.productionPlan.dto.ProductionPlanDto;
@@ -10,9 +10,9 @@
  *
  * @author deslrey
  * @version 1.0
- * @since 2026/03/18 14:45
+ * @since 2026/03/20
  */
-public interface AppendixService {
+public interface IProductionOrderAppendixService {
 
     /**
      * 灏嗗搴旂殑宸ヨ壓璺嚎瀛愰泦涓庣粦瀹氱殑BOM瀛愰泦濉厖鍒伴檮琛ㄤ腑
diff --git a/src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemParamService.java b/src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemParamService.java
new file mode 100644
index 0000000..840f23b
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemParamService.java
@@ -0,0 +1,26 @@
+package com.ruoyi.production.service;
+
+import com.ruoyi.production.dto.ProductionOrderRouteItemParamDto;
+import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+public interface IProductionOrderRouteItemParamService extends IService<ProductionOrderRouteItemParam> {
+
+    List<ProductionOrderRouteItemParamDto> routeItemParamList(Long orderId, Long routeItemId);
+
+    void addRouteItemParam(ProductionOrderRouteItemParamDto dto);
+
+    void updateRouteItemParam(ProductionOrderRouteItemParamDto dto);
+
+    void deleteRouteItemParam(Long id);
+}
diff --git a/src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemService.java b/src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemService.java
new file mode 100644
index 0000000..efe43f8
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.production.service;
+
+import com.ruoyi.production.dto.ProductionOrderRouteItemDto;
+import com.ruoyi.production.pojo.ProductionOrderRouteItem;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾�--宸ュ簭琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+public interface IProductionOrderRouteItemService extends IService<ProductionOrderRouteItem> {
+
+    List<ProductionOrderRouteItemDto> getProcessItem(Long orderId);
+
+    void addProcessItem(ProductionOrderRouteItemDto dto);
+
+    void updateProcessItem(ProductionOrderRouteItemDto dto);
+
+    void deleteProcessItem(Long id);
+
+    void sortProcessItem(ProductionOrderRouteItemDto dto);
+}
diff --git a/src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java b/src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java
new file mode 100644
index 0000000..9b74d02
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java
@@ -0,0 +1,22 @@
+package com.ruoyi.production.service;
+
+import com.ruoyi.production.dto.ProductionOrderStructureDto;
+import com.ruoyi.production.pojo.ProductionOrderStructure;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨凚OM瀛愯〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+public interface IProductionOrderStructureService extends IService<ProductionOrderStructure> {
+
+    List<ProductionOrderStructureDto> listByOrderId(Long orderId);
+
+    void addOrUpdateBomStructs(ProductionOrderStructureDto instanceDto);
+}
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderAppendixServiceImpl.java
similarity index 75%
rename from src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java
rename to src/main/java/com/ruoyi/production/service/impl/ProductionOrderAppendixServiceImpl.java
index 890785d..bc6d03e 100644
--- a/src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderAppendixServiceImpl.java
@@ -1,10 +1,6 @@
-package com.ruoyi.appendix.service.impl;
+package com.ruoyi.production.service.impl;
 
 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.ProductStructureInstance;
-import com.ruoyi.appendix.service.*;
 import com.ruoyi.basic.service.BaseParamService;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
@@ -23,25 +19,25 @@
 
 /**
  * <br>
- * BOM-宸ヨ壓璺嚎闄勮〃Service鎺ュ彛瀹炵幇绫�
+ *
  * </br>
  *
  * @author deslrey
  * @version 1.0
- * @since 2026/03/18 14:45
+ * @since 2026/03/20
  */
 @Slf4j
 @Service
-public class AppendixServiceImpl implements AppendixService {
+public class ProductionOrderAppendixServiceImpl implements IProductionOrderAppendixService {
 
     @Resource
-    private ProcessRouteItemInstanceService processRouteItemInstanceService;
+    private IProductionOrderRouteItemService productionOrderRouteItemService;
 
     @Resource
-    private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService;
+    private IProductionOrderRouteItemParamService productionOrderRouteItemParamService;
 
     @Resource
-    private ProductStructureInstanceService productStructureInstanceService;
+    private IProductionOrderStructureService productionOrderStructureService;
 
     @Resource
     private BaseParamService baseParamService;
@@ -114,20 +110,20 @@
     @Override
     public void deleteData(Long orderId, Long processRouteId) {
         //  鍒犻櫎宸ヨ壓璺嚎宸ュ簭鍙傛暟闄勮〃
-        processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
-                .eq(ProcessRouteItemParamInstance::getOrderId, orderId));
+        productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
+                .eq(ProductionOrderRouteItemParam::getOrderId, orderId));
 
         //  鍒犻櫎宸ヨ壓璺嚎瀛愰泦闄勮〃
-        processRouteItemInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemInstance>()
-                .eq(ProcessRouteItemInstance::getOrderId, orderId)
-                .eq(ProcessRouteItemInstance::getRouteId, processRouteId));
+        productionOrderRouteItemService.remove(new LambdaQueryWrapper<ProductionOrderRouteItem>()
+                .eq(ProductionOrderRouteItem::getOrderId, orderId)
+                .eq(ProductionOrderRouteItem::getRouteId, processRouteId));
 
         //  鍒犻櫎BOM瀛愰泦闄勮〃
         ProcessRoute processRoute = processRouteService.getById(processRouteId);
         if (processRoute != null && processRoute.getBomId() != null) {
-            productStructureInstanceService.remove(new LambdaQueryWrapper<ProductStructureInstance>()
-                    .eq(ProductStructureInstance::getOrderId, orderId)
-                    .eq(ProductStructureInstance::getBomId, processRoute.getBomId()));
+            productionOrderStructureService.remove(new LambdaQueryWrapper<ProductionOrderStructure>()
+                    .eq(ProductionOrderStructure::getOrderId, orderId)
+                    .eq(ProductionOrderStructure::getBomId, processRoute.getBomId()));
         }
     }
 
@@ -138,12 +134,12 @@
         //  杩佺Щ宸ヨ壓璺嚎瀛愰泦琛ㄦ暟鎹紝杩斿洖鏃d->鏂癷nstance鏄犲皠
         List<ProcessRouteItem> processRouteItemList = processRouteItemService.list(
                 new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
-        Map<Long, ProcessRouteItemInstance> routeItemOldIdMap = migrationProcessRouteItem(orderId, processRouteItemList);
+        Map<Long, ProductionOrderRouteItem> routeItemOldIdMap = migrationProcessRouteItem(orderId, processRouteItemList);
 
         //  杩佺Щ宸ヨ壓璺嚎鍐呯粦瀹氱殑宸ュ簭鍙傛暟
         if (processRouteItemList != null && !processRouteItemList.isEmpty()) {
             for (ProcessRouteItem item : processRouteItemList) {
-                ProcessRouteItemInstance newInstance = routeItemOldIdMap.get(item.getId());
+                ProductionOrderRouteItem newInstance = routeItemOldIdMap.get(item.getId());
                 Long newRouteItemInstanceId = newInstance != null ? newInstance.getId() : item.getId();
 
                 List<ProcessRouteItemParam> paramList = processRouteItemParamService.list(
@@ -160,13 +156,13 @@
         }
     }
 
-    private Map<Long, ProcessRouteItemInstance> migrationProcessRouteItem(Long orderId, List<ProcessRouteItem> list) {
-        Map<Long, ProcessRouteItemInstance> oldIdMap = new HashMap<>();
+    private Map<Long, ProductionOrderRouteItem> migrationProcessRouteItem(Long orderId, List<ProcessRouteItem> list) {
+        Map<Long, ProductionOrderRouteItem> oldIdMap = new HashMap<>();
         if (list == null || list.isEmpty()) {
             return oldIdMap;
         }
-        List<ProcessRouteItemInstance> instances = list.stream().map(item -> {
-            ProcessRouteItemInstance instance = new ProcessRouteItemInstance();
+        List<ProductionOrderRouteItem> instances = list.stream().map(item -> {
+            ProductionOrderRouteItem instance = new ProductionOrderRouteItem();
             BeanUtils.copyProperties(item, instance, "id");
             instance.setIsQuality(item.getIsQuality() != null && item.getIsQuality() ? 1 : 0);
             instance.setOrderId(orderId);
@@ -175,7 +171,7 @@
             }
             return instance;
         }).collect(Collectors.toList());
-        processRouteItemInstanceService.saveBatch(instances);
+        productionOrderRouteItemService.saveBatch(instances);
         return oldIdMap;
     }
 
@@ -183,23 +179,23 @@
         if (list == null || list.isEmpty()) {
             return;
         }
-        List<ProcessRouteItemParamInstance> instances = list.stream().map(item -> {
-            ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance();
+        List<ProductionOrderRouteItemParam> instances = list.stream().map(item -> {
+            ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam();
             BeanUtils.copyProperties(item, instance, "id");
             instance.setOrderId(orderId);
             instance.setRouteItemId(newRouteItemInstanceId);
             return instance;
         }).collect(Collectors.toList());
-        processRouteItemParamInstanceService.saveBatch(instances);
+        productionOrderRouteItemParamService.saveBatch(instances);
     }
 
     private void migrationProductStructure(Long orderId, 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();
+        Map<Long, ProductionOrderStructure> oldIdMap = new HashMap<>();
+        List<ProductionOrderStructure> instances = list.stream().map(item -> {
+            ProductionOrderStructure instance = new ProductionOrderStructure();
             BeanUtils.copyProperties(item, instance, "id");
             instance.setBomId(item.getBomId() != null ? item.getBomId().longValue() : null);
             instance.setOrderId(orderId);
@@ -208,7 +204,7 @@
             }
             return instance;
         }).collect(Collectors.toList());
-        productStructureInstanceService.saveBatch(instances);
+        productionOrderStructureService.saveBatch(instances);
 
         //  鏂板鍚庢湁id锛屾棫id->鏂癷d锛屼慨姝arentId
         Map<Long, Long> oldToNewId = new HashMap<>();
@@ -218,12 +214,12 @@
             }
         });
 
-        List<ProductStructureInstance> toUpdate = instances.stream()
+        List<ProductionOrderStructure> 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);
+            productionOrderStructureService.updateBatchById(toUpdate);
         }
     }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemParamServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemParamServiceImpl.java
new file mode 100644
index 0000000..8cb5947
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemParamServiceImpl.java
@@ -0,0 +1,122 @@
+package com.ruoyi.production.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.dto.ProductionOrderRouteItemParamDto;
+import com.ruoyi.production.mapper.ProductionOrderRouteItemParamMapper;
+import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
+import com.ruoyi.production.service.IProductionOrderRouteItemParamService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+@Slf4j
+@Service
+public class ProductionOrderRouteItemParamServiceImpl extends ServiceImpl<ProductionOrderRouteItemParamMapper, ProductionOrderRouteItemParam> implements IProductionOrderRouteItemParamService {
+
+    @Autowired
+    private BaseParamService baseParamService;
+
+    @Override
+    public List<ProductionOrderRouteItemParamDto> routeItemParamList(Long orderId, Long routeItemId) {
+        List<ProductionOrderRouteItemParam> list = list(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
+                .eq(ProductionOrderRouteItemParam::getOrderId, orderId)
+                .eq(ProductionOrderRouteItemParam::getRouteItemId, routeItemId)
+                .orderByAsc(ProductionOrderRouteItemParam::getSort));
+
+        return list.stream().map(item -> {
+            ProductionOrderRouteItemParamDto dto = new ProductionOrderRouteItemParamDto();
+            BeanUtils.copyProperties(item, dto);
+            return dto;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addRouteItemParam(ProductionOrderRouteItemParamDto 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();
+
+        BaseParam baseParam = baseParamService.getById(dto.getParamId());
+        if (baseParam == null) {
+            throw new ServiceException("鏂板鍙傛暟涓嶅瓨鍦�");
+        }
+
+        ProductionOrderRouteItemParam entity = new ProductionOrderRouteItemParam();
+        BeanUtils.copyProperties(dto, entity);
+        entity.setId(null);
+        entity.setOrderId(dto.getOrderId());
+        entity.setRouteItemId(dto.getRouteItemId());
+        entity.setIsRequired(dto.getIsRequired());
+        //  鍙栧綋鍓嶈鍗�+璺嚎鏄庣粏涓嬫渶澶� sort + 1
+        ProductionOrderRouteItemParam maxSortItem = getOne(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
+                .select(ProductionOrderRouteItemParam::getSort)
+                .eq(ProductionOrderRouteItemParam::getOrderId, dto.getOrderId())
+                .eq(ProductionOrderRouteItemParam::getRouteItemId, dto.getRouteItemId())
+                .orderByDesc(ProductionOrderRouteItemParam::getSort)
+                .last("limit 1"));
+        entity.setSort(maxSortItem != null && maxSortItem.getSort() != null ? maxSortItem.getSort() + 1 : 1);
+        entity.setParamKey(baseParam.getParamKey());
+        entity.setParamName(baseParam.getParamName());
+        entity.setParamFormat(baseParam.getParamFormat());
+        entity.setParamType(baseParam.getParamType());
+        entity.setValueMode(baseParam.getValueMode());
+        entity.setUnit(baseParam.getUnit());
+        entity.setRemark(baseParam.getRemark());
+        entity.setTenantId(tenantId);
+        entity.setCreateTime(LocalDateTime.now());
+        save(entity);
+    }
+
+    @Override
+    public void updateRouteItemParam(ProductionOrderRouteItemParamDto dto) {
+        if (dto == null || dto.getId() == null) {
+            throw new ServiceException("鏇存柊鏁版嵁鎴朓D涓嶈兘涓虹┖");
+        }
+        if (getById(dto.getId()) == null) {
+            throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
+        }
+        ProductionOrderRouteItemParam entity = new ProductionOrderRouteItemParam();
+        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/ProcessRouteItemInstanceServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemServiceImpl.java
similarity index 62%
rename from src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java
rename to src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemServiceImpl.java
index 79e30e5..696a7de 100644
--- a/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemServiceImpl.java
@@ -1,17 +1,17 @@
-package com.ruoyi.appendix.service.impl;
+package com.ruoyi.production.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.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.production.dto.ProductionOrderRouteItemDto;
+import com.ruoyi.production.mapper.ProductionOrderRouteItemMapper;
 import com.ruoyi.production.pojo.ProcessRouteItemParam;
 import com.ruoyi.production.pojo.ProductProcess;
+import com.ruoyi.production.pojo.ProductionOrderRouteItem;
+import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
+import com.ruoyi.production.service.IProductionOrderRouteItemParamService;
+import com.ruoyi.production.service.IProductionOrderRouteItemService;
 import com.ruoyi.production.service.ProcessRouteItemParamService;
 import com.ruoyi.production.service.ProductProcessService;
 import lombok.extern.slf4j.Slf4j;
@@ -24,34 +24,33 @@
 import java.util.stream.Collectors;
 
 /**
- * <br>
- * 宸ヨ壓璺嚎瀛愰泦-闄勮〃Service瀹炵幇绫�
- * </br>
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾�--宸ュ簭琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
  *
  * @author deslrey
- * @version 1.0
- * @since 2026/03/18 13:08
+ * @since 2026-03-20
  */
 @Slf4j
 @Service
-public class ProcessRouteItemInstanceServiceImpl extends ServiceImpl<ProcessRouteItemInstanceMapper, ProcessRouteItemInstance> implements ProcessRouteItemInstanceService {
+public class ProductionOrderRouteItemServiceImpl extends ServiceImpl<ProductionOrderRouteItemMapper, ProductionOrderRouteItem> implements IProductionOrderRouteItemService {
 
     @Resource
     private ProductProcessService productProcessService;
 
     @Resource
-    private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService;
+    private IProductionOrderRouteItemParamService productionOrderRouteItemParamService;
 
     @Resource
     private ProcessRouteItemParamService processRouteItemParamService;
 
     @Override
-    public List<ProcessRouteItemInstanceDto> getProcessItem(Long orderId) {
-        List<ProcessRouteItemInstance> list = list(new LambdaQueryWrapper<ProcessRouteItemInstance>()
-                .eq(ProcessRouteItemInstance::getOrderId, orderId)
-                .orderByAsc(ProcessRouteItemInstance::getDragSort));
+    public List<ProductionOrderRouteItemDto> getProcessItem(Long orderId) {
+        List<ProductionOrderRouteItem> list = list(new LambdaQueryWrapper<ProductionOrderRouteItem>()
+                .eq(ProductionOrderRouteItem::getOrderId, orderId)
+                .orderByAsc(ProductionOrderRouteItem::getDragSort));
         return list.stream().map(item -> {
-            ProcessRouteItemInstanceDto dto = new ProcessRouteItemInstanceDto();
+            ProductionOrderRouteItemDto dto = new ProductionOrderRouteItemDto();
             BeanUtils.copyProperties(item, dto);
             if (item.getProcessId() != null) {
                 ProductProcess process = productProcessService.getById(item.getProcessId());
@@ -64,7 +63,7 @@
     }
 
     @Override
-    public void addProcessItem(ProcessRouteItemInstanceDto dto) {
+    public void addProcessItem(ProductionOrderRouteItemDto dto) {
         if (dto == null) {
             throw new ServiceException("鏂板鏁版嵁涓嶈兘涓虹┖");
         }
@@ -74,51 +73,51 @@
         if (dto.getProcessId() == null) {
             throw new ServiceException("宸ュ簭ID涓嶈兘涓虹┖");
         }
-        ProcessRouteItemInstance entity = new ProcessRouteItemInstance();
+        ProductionOrderRouteItem entity = new ProductionOrderRouteItem();
         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)
+        ProductionOrderRouteItem maxSortItem = getOne(new LambdaQueryWrapper<ProductionOrderRouteItem>()
+                .eq(ProductionOrderRouteItem::getOrderId, dto.getOrderId())
+                .orderByDesc(ProductionOrderRouteItem::getDragSort)
                 .last("limit 1"));
         entity.setDragSort(maxSortItem != null && maxSortItem.getDragSort() != null ? maxSortItem.getDragSort() + 1 : 1);
         save(entity);
     }
 
     @Override
-    public void updateProcessItem(ProcessRouteItemInstanceDto dto) {
+    public void updateProcessItem(ProductionOrderRouteItemDto dto) {
         if (dto == null || dto.getId() == null) {
             throw new ServiceException("鏇存柊鏁版嵁鎴朓D涓嶈兘涓虹┖");
         }
-        ProcessRouteItemInstance old = getById(dto.getId());
+        ProductionOrderRouteItem 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()));
+            productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
+                    .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId())
+                    .eq(ProductionOrderRouteItemParam::getRouteItemId, old.getId()));
 
             // 杩佺Щ鏂板伐搴忕殑 process_route_item_param
             List<ProcessRouteItemParam> routeItemParams = processRouteItemParamService.list(
                     new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId, old.getId()));
             if (!routeItemParams.isEmpty()) {
-                List<ProcessRouteItemParamInstance> newInstances = routeItemParams.stream().map(p -> {
-                    ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance();
+                List<ProductionOrderRouteItemParam> newInstances = routeItemParams.stream().map(p -> {
+                    ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam();
                     BeanUtils.copyProperties(p, instance, "id");
                     instance.setOrderId(old.getOrderId());
                     return instance;
                 }).collect(Collectors.toList());
-                processRouteItemParamInstanceService.saveBatch(newInstances);
+                productionOrderRouteItemParamService.saveBatch(newInstances);
             }
         }
-        ProcessRouteItemInstance entity = new ProcessRouteItemInstance();
+        ProductionOrderRouteItem entity = new ProductionOrderRouteItem();
         BeanUtils.copyProperties(dto, entity);
         entity.setUpdateTime(LocalDateTime.now());
         updateById(entity);
@@ -129,35 +128,35 @@
         if (id == null) {
             throw new ServiceException("ID涓嶈兘涓虹┖");
         }
-        ProcessRouteItemInstance old = getById(id);
+        ProductionOrderRouteItem old = getById(id);
         if (old == null) {
             throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
         }
         // 鍒犻櫎宸ヨ壓璺嚎宸ュ簭鍙傛暟闄勮〃
-        processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
-                .eq(ProcessRouteItemParamInstance::getOrderId, old.getOrderId())
-                .eq(ProcessRouteItemParamInstance::getRouteItemId, id));
+        productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
+                .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId())
+                .eq(ProductionOrderRouteItemParam::getRouteItemId, id));
         removeById(id);
     }
 
     @Override
-    public void sortProcessItem(ProcessRouteItemInstanceDto dto) {
+    public void sortProcessItem(ProductionOrderRouteItemDto dto) {
         if (dto == null || dto.getId() == null) {
             throw new ServiceException("鏁版嵁鎴朓D涓嶈兘涓虹┖");
         }
-        ProcessRouteItemInstance old = getById(dto.getId());
+        ProductionOrderRouteItem 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));
+        List<ProductionOrderRouteItem> items = list(new LambdaQueryWrapper<ProductionOrderRouteItem>()
+                .eq(ProductionOrderRouteItem::getOrderId, old.getOrderId())
+                .orderByAsc(ProductionOrderRouteItem::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);
+                ProductionOrderRouteItem item = items.get(i);
                 int newSort = i + 1;
                 if (!item.getId().equals(old.getId())) {
                     if (!Integer.valueOf(newSort).equals(item.getDragSort())) {
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java
new file mode 100644
index 0000000..21f14df
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java
@@ -0,0 +1,151 @@
+package com.ruoyi.production.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.production.dto.ProductionOrderStructureDto;
+import com.ruoyi.production.mapper.ProductionOrderStructureMapper;
+import com.ruoyi.production.pojo.ProductionOrderStructure;
+import com.ruoyi.production.service.IProductionOrderStructureService;
+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;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟缁戝畾鐨凚OM瀛愯〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-20
+ */
+@Slf4j
+@Service
+public class ProductionOrderStructureServiceImpl extends ServiceImpl<ProductionOrderStructureMapper, ProductionOrderStructure> implements IProductionOrderStructureService {
+
+    @Override
+    public List<ProductionOrderStructureDto> listByOrderId(Long orderId) {
+        List<ProductionOrderStructure> list = list(new LambdaQueryWrapper<ProductionOrderStructure>().eq(ProductionOrderStructure::getOrderId, orderId));
+
+        List<ProductionOrderStructureDto> dtoList = list.stream().map(item -> {
+            ProductionOrderStructureDto dto = new ProductionOrderStructureDto();
+            BeanUtils.copyProperties(item, dto);
+            return dto;
+        }).collect(Collectors.toList());
+
+        Map<Long, ProductionOrderStructureDto> map = new HashMap<>();
+        for (ProductionOrderStructureDto node : dtoList) {
+            map.put(node.getId(), node);
+        }
+
+        List<ProductionOrderStructureDto> tree = new ArrayList<>();
+        for (ProductionOrderStructureDto 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(ProductionOrderStructureDto instanceDto) {
+        Long orderId = instanceDto.getOrderId();
+
+        // 鎵佸钩鍖栧墠绔紶鍏ョ殑鏍�
+        List<ProductionOrderStructureDto> flatList = new ArrayList<>();
+        flattenTree(instanceDto.getChildren(), flatList);
+
+        // 鏌ヨ鏁版嵁搴撳凡鏈夋暟鎹�
+        List<ProductionOrderStructure> dbList = list(new LambdaQueryWrapper<ProductionOrderStructure>()
+                .eq(ProductionOrderStructure::getOrderId, orderId));
+
+        // 鍓嶇宸叉湁id闆嗗悎
+        Set<Long> frontendIds = flatList.stream()
+                .map(ProductionOrderStructureDto::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        // 闇�瑕佸垹闄ょ殑鑺傜偣
+        Set<Long> deleteIds = dbList.stream()
+                .map(ProductionOrderStructure::getId)
+                .filter(id -> !frontendIds.contains(id))
+                .collect(Collectors.toSet());
+        if (!deleteIds.isEmpty()) {
+            removeByIds(deleteIds);
+        }
+
+        List<ProductionOrderStructure> insertList = new ArrayList<>();
+        List<ProductionOrderStructure> updateList = new ArrayList<>();
+        Map<String, ProductionOrderStructure> tempEntityMap = new HashMap<>();
+
+        for (ProductionOrderStructureDto dto : flatList) {
+            ProductionOrderStructure entity = new ProductionOrderStructure();
+            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<ProductionOrderStructure> parentFixList = new ArrayList<>();
+        for (ProductionOrderStructureDto dto : flatList) {
+            if (dto.getId() != null) continue;
+            ProductionOrderStructure 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<ProductionOrderStructureDto> source, List<ProductionOrderStructureDto> result) {
+        if (source == null) return;
+        for (ProductionOrderStructureDto node : source) {
+            result.add(node);
+            flattenTree(node.getChildren(), result);
+        }
+    }
+}
diff --git a/src/main/resources/mapper/production/ProductionOrderRouteItemMapper.xml b/src/main/resources/mapper/production/ProductionOrderRouteItemMapper.xml
new file mode 100644
index 0000000..7d8e8a6
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductionOrderRouteItemMapper.xml
@@ -0,0 +1,19 @@
+<?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.ProductionOrderRouteItemMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionOrderRouteItem">
+        <id column="id" property="id"/>
+        <result column="order_id" property="orderId"/>
+        <result column="route_id" property="routeId"/>
+        <result column="product_model_id" property="productModelId"/>
+        <result column="process_id" property="processId"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="drag_sort" property="dragSort"/>
+        <result column="is_quality" property="isQuality"/>
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/production/ProductionOrderRouteItemParamMapper.xml b/src/main/resources/mapper/production/ProductionOrderRouteItemParamMapper.xml
new file mode 100644
index 0000000..b4654d3
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductionOrderRouteItemParamMapper.xml
@@ -0,0 +1,28 @@
+<?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.ProductionOrderRouteItemParamMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionOrderRouteItemParam">
+        <id column="id" property="id"/>
+        <result column="order_id" property="orderId"/>
+        <result column="route_item_id" property="routeItemId"/>
+        <result column="process_param_id" property="processParamId"/>
+        <result column="param_key" property="paramKey"/>
+        <result column="param_name" property="paramName"/>
+        <result column="param_type" property="paramType"/>
+        <result column="param_format" property="paramFormat"/>
+        <result column="value_mode" property="valueMode"/>
+        <result column="unit" property="unit"/>
+        <result column="remark" property="remark"/>
+        <result column="standard_value" property="standardValue"/>
+        <result column="min_value" property="minValue"/>
+        <result column="max_value" property="maxValue"/>
+        <result column="is_required" property="isRequired"/>
+        <result column="sort" property="sort"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/production/ProductionOrderStructureMapper.xml b/src/main/resources/mapper/production/ProductionOrderStructureMapper.xml
new file mode 100644
index 0000000..4bbafbe
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductionOrderStructureMapper.xml
@@ -0,0 +1,19 @@
+<?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.ProductionOrderStructureMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionOrderStructure">
+        <id column="id" property="id"/>
+        <result column="order_id" property="orderId"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="product_model_id" property="productModelId"/>
+        <result column="process_id" property="processId"/>
+        <result column="unit_quantity" property="unitQuantity"/>
+        <result column="demanded_quantity" property="demandedQuantity"/>
+        <result column="unit" property="unit"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="bom_id" property="bomId"/>
+    </resultMap>
+
+</mapper>

--
Gitblit v1.9.3