From 124a6178ae918de05886b52199b7755d4fa1ece3 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期三, 18 三月 2026 17:06:44 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_宁夏_中盛建材' into dev_宁夏_中盛建材

---
 src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java          |   12 
 src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java                           |    2 
 src/main/java/com/ruoyi/appendix/service/impl/ProductProcessParamInstanceServiceImpl.java   |   22 +
 src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java    |   21 +
 src/main/java/com/ruoyi/appendix/controller/ProductProcessParamInstanceController.java      |   20 +
 src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java                         |   53 ++
 src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java         |   20 +
 src/main/java/com/ruoyi/appendix/pojo/ProductProcessParamInstance.java                      |   67 +++
 src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml                       |   20 +
 src/main/java/com/ruoyi/appendix/service/AppendixService.java                               |   45 ++
 src/main/resources/mapper/production/ProcessRouteMapper.xml                                 |   20 +
 src/main/java/com/ruoyi/appendix/mapper/ProductProcessParamInstanceMapper.java              |   16 
 src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java               |   16 
 doc/宁夏-中盛建材.sql                                                                             |   99 +++++
 src/main/resources/mapper/appendix/ProductProcessParamInstanceMapper.xml                    |   22 +
 src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemParamInstanceMapper.java            |   16 
 src/main/java/com/ruoyi/production/service/ProcessRouteService.java                         |    2 
 src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java                      |  216 ++++++++++++
 src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml                       |   20 +
 src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java                    |   69 +++
 src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java      |   24 +
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java                |   15 
 src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java                 |   16 
 src/main/java/com/ruoyi/appendix/controller/AppendixController.java                         |   20 +
 src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml                  |   23 +
 src/main/java/com/ruoyi/appendix/service/ProductProcessParamInstanceService.java            |   16 
 src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java      |   22 +
 src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java |   22 +
 src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java                          |    1 
 src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java               |   16 
 src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java                 |   16 
 src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java          |   16 
 src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java                |    5 
 src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java                         |   58 +++
 src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java         |   20 +
 35 files changed, 1,065 insertions(+), 3 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 bebb0f6..098fde4 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"
@@ -276,3 +276,102 @@
 
 ALTER TABLE `product-inventory-management-zsjc`.`process_route`
     ADD COLUMN `dict_code` bigint NOT NULL COMMENT '浜у搧绫诲瀷瀛楀吀缂栫爜' AFTER `status`;
+
+
+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',
+    `route_item_id`    bigint                                                        NOT NULL COMMENT '鍏宠仈宸ヨ壓璺嚎鏄庣粏ID (process_route_item.id)',
+    `param_id`         bigint                                                        NOT NULL COMMENT '鍏宠仈鍩虹鍙傛暟瀹氫箟ID (base_param.id)',
+    `process_param_id` bigint                                                        NULL     DEFAULT NULL COMMENT '鏉ユ簮宸ュ簭鍙傛暟ID',
+    `standard_value`   varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL     DEFAULT NULL COMMENT '姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鍊�',
+    `min_value`        decimal(10, 2)                                                NULL     DEFAULT NULL COMMENT '姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�灏忓��',
+    `max_value`        decimal(10, 2)                                                NULL     DEFAULT NULL COMMENT '姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�澶у��',
+    `is_required`      tinyint                                                       NOT NULL DEFAULT 0 COMMENT '鏄惁蹇呭~',
+    `sort`             int                                                           NOT NULL DEFAULT 0 COMMENT '鎺掑簭',
+    `tenant_id`        bigint                                                        NULL     DEFAULT NULL COMMENT '绉熸埛ID',
+    `create_time`      datetime                                                      NULL     DEFAULT CURRENT_TIMESTAMP,
+    `update_time`      datetime                                                      NULL     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx_route_item_id` (`route_item_id` ASC) USING BTREE,
+    INDEX `idx_param_id` (`param_id` ASC) USING BTREE
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 178
+  CHARACTER SET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT = '宸ヨ壓璺嚎宸ュ簭鍙傛暟-闄勮〃'
+  ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for product_process_param_instance
+-- ----------------------------
+DROP TABLE IF EXISTS `product_process_param_instance`;
+CREATE TABLE `product_process_param_instance`
+(
+    `id`             bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID',
+    `process_id`     bigint                                                        NOT NULL COMMENT '鎵�灞炲伐搴廔D (product_process.id)',
+    `param_id`       bigint                                                        NOT NULL COMMENT '鍏宠仈鍩虹鍙傛暟ID (base_param.id)',
+    `standard_value` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL     DEFAULT NULL COMMENT '鍦ㄦ宸ュ簭璁惧畾鐨勬爣鍑嗗��(鍗曞�兼ā寮�)',
+    `min_value`      decimal(10, 2)                                                NULL     DEFAULT NULL COMMENT '鍦ㄦ宸ュ簭璁惧畾鐨勬爣鍑嗘渶灏忓��(鍖洪棿妯″紡)',
+    `max_value`      decimal(10, 2)                                                NULL     DEFAULT NULL COMMENT '鍦ㄦ宸ュ簭璁惧畾鐨勬爣鍑嗘渶澶у��(鍖洪棿妯″紡)',
+    `is_required`    tinyint                                                       NOT NULL DEFAULT 0 COMMENT '鍦ㄦ宸ュ簭涓槸鍚﹀繀濉�(0-鍚�, 1-鏄�)',
+    `sort`           int                                                           NOT NULL DEFAULT 0 COMMENT '鎺掑簭鍙�',
+    `tenant_id`      bigint                                                        NULL     DEFAULT NULL COMMENT '绉熸埛ID',
+    `create_time`    datetime                                                      NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+    `update_time`    datetime                                                      NULL     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx_process_id` (`process_id` ASC) USING BTREE,
+    INDEX `idx_param_id` (`param_id` ASC) USING BTREE
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 61
+  CHARACTER SET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT = '宸ュ簭缁戝畾鍙傛暟-闄勮〃'
+  ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- 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;
diff --git a/src/main/java/com/ruoyi/appendix/controller/AppendixController.java b/src/main/java/com/ruoyi/appendix/controller/AppendixController.java
new file mode 100644
index 0000000..af62eef
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/controller/AppendixController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.appendix.controller;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <br>
+ * BOM-宸ヨ壓璺嚎闄勮〃鎺у埗灞�
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 14:44
+ */
+@RestController
+@RequestMapping("/appendix")
+@Api("BOM-宸ヨ壓璺嚎闄勮〃鎺у埗灞�")
+public class AppendixController {
+}
diff --git a/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java b/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java
new file mode 100644
index 0000000..ef7ac19
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.appendix.controller;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <br>
+ * 宸ヨ壓璺嚎瀛愰泦-闄勮〃鎺у埗灞�
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:07
+ */
+@RestController
+@RequestMapping("/processRouteItemInstance")
+@Api("鑹鸿矾绾垮瓙闆�-闄勮〃鎺у埗灞�")
+public class ProcessRouteItemInstanceController {
+}
diff --git a/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java b/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java
new file mode 100644
index 0000000..78ca75d
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java
@@ -0,0 +1,21 @@
+package com.ruoyi.appendix.controller;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <br>
+ * 宸ヨ壓璺嚎宸ュ簭鍙傛暟鎺ュ彛
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:14
+ */
+
+@Api(tags = "宸ヨ壓璺嚎宸ュ簭鍙傛暟鎺ュ彛")
+@RestController
+@RequestMapping("/processRouteItemParamInstance")
+public class ProcessRouteItemParamInstanceController {
+}
diff --git a/src/main/java/com/ruoyi/appendix/controller/ProductProcessParamInstanceController.java b/src/main/java/com/ruoyi/appendix/controller/ProductProcessParamInstanceController.java
new file mode 100644
index 0000000..d6d8109
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/controller/ProductProcessParamInstanceController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.appendix.controller;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <br>
+ * 宸ュ簭缁戝畾鍙傛暟-闄勮〃Controller
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:19
+ */
+@Api(tags = "宸ュ簭缁戝畾鍙傛暟鎺ュ彛")
+@RestController
+@RequestMapping("/productProcessParamInstance")
+public class ProductProcessParamInstanceController {
+}
diff --git a/src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java b/src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
new file mode 100644
index 0000000..4c9c95a
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.appendix.controller;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <br>
+ * BOM瀛愰泦-闄勮〃Controller
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:22
+ */
+@Api(tags = "BOM缁撴瀯鎺ュ彛")
+@RestController
+@RequestMapping("/productStructureInstance")
+public class ProductStructureInstanceController {
+}
diff --git a/src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java b/src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java
new file mode 100644
index 0000000..2048f3c
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java
@@ -0,0 +1,16 @@
+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
new file mode 100644
index 0000000..f4e88e2
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemParamInstanceMapper.java
@@ -0,0 +1,16 @@
+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/ProductProcessParamInstanceMapper.java b/src/main/java/com/ruoyi/appendix/mapper/ProductProcessParamInstanceMapper.java
new file mode 100644
index 0000000..7b3e2cf
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/mapper/ProductProcessParamInstanceMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.appendix.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.appendix.pojo.ProductProcessParamInstance;
+
+/**
+ * <br>
+ * 宸ュ簭缁戝畾鍙傛暟-闄勮〃Mapper
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:15
+ */
+public interface ProductProcessParamInstanceMapper extends BaseMapper<ProductProcessParamInstance> {
+}
diff --git a/src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java b/src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java
new file mode 100644
index 0000000..859feca
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java
@@ -0,0 +1,16 @@
+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
new file mode 100644
index 0000000..ffc24c6
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java
@@ -0,0 +1,58 @@
+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 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
new file mode 100644
index 0000000..ad1f3e7
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java
@@ -0,0 +1,69 @@
+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 routeItemId;
+
+    @ApiModelProperty("鍏宠仈鍩虹鍙傛暟瀹氫箟ID")
+    private Long paramId;
+
+    @ApiModelProperty("鏉ユ簮宸ュ簭鍙傛暟ID")
+    private Long processParamId;
+
+    @ApiModelProperty("鏍囧噯鍊�")
+    private String standardValue;
+
+    @ApiModelProperty("鏈�灏忓��")
+    private BigDecimal minValue;
+
+    @ApiModelProperty("鏈�澶у��")
+    private BigDecimal maxValue;
+
+    @ApiModelProperty("鏄惁蹇呭~")
+    private Integer 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/ProductProcessParamInstance.java b/src/main/java/com/ruoyi/appendix/pojo/ProductProcessParamInstance.java
new file mode 100644
index 0000000..88bcc94
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/pojo/ProductProcessParamInstance.java
@@ -0,0 +1,67 @@
+package com.ruoyi.appendix.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+
+/**
+ * <br>
+ * 宸ュ簭缁戝畾鍙傛暟-闄勮〃
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:14
+ */
+@Data
+@TableName("product_process_param_instance")
+@Api(tags = "宸ュ簭缁戝畾鍙傛暟-闄勮〃")
+public class ProductProcessParamInstance {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty("涓婚敭ID")
+    private Long id;
+
+    @ApiModelProperty("鎵�灞炲伐搴廔D")
+    private Long processId;
+
+    @ApiModelProperty("鍏宠仈鍩虹鍙傛暟ID")
+    private Long paramId;
+
+    @ApiModelProperty("鏍囧噯鍊�(鍗曞�兼ā寮�)")
+    private String standardValue;
+
+    @ApiModelProperty("鏈�灏忓��(鍖洪棿妯″紡)")
+    private BigDecimal minValue;
+
+    @ApiModelProperty("鏈�澶у��(鍖洪棿妯″紡)")
+    private BigDecimal maxValue;
+
+    @ApiModelProperty("鏄惁蹇呭~(0-鍚�,1-鏄�)")
+    private Boolean isRequired;
+
+    @ApiModelProperty("鎺掑簭鍙�")
+    private Integer sort;
+
+    @ApiModelProperty("绉熸埛ID")
+    private Long tenantId;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java b/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
new file mode 100644
index 0000000..80ff4e1
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
@@ -0,0 +1,53 @@
+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("鐖惰妭鐐笽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/AppendixService.java b/src/main/java/com/ruoyi/appendix/service/AppendixService.java
new file mode 100644
index 0000000..d42c1a7
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/AppendixService.java
@@ -0,0 +1,45 @@
+package com.ruoyi.appendix.service;
+
+import com.ruoyi.productionPlan.dto.ProductionPlanDto;
+
+/**
+ * <br>
+ * BOM-宸ヨ壓璺嚎闄勮〃Service鎺ュ彛
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 14:45
+ */
+public interface AppendixService {
+
+
+    /**
+     * 灏嗗搴旂殑宸ヨ壓璺嚎瀛愰泦涓庣粦瀹氱殑BOM瀛愰泦濉厖鍒伴檮琛ㄤ腑
+     *
+     * @param productOrderId 鐢熶骇璁㈠崟ID
+     * @param processRouteId 宸ヨ壓璺嚎ID
+     */
+    void populateData(Long productOrderId, Long processRouteId);
+
+    /**
+     * 缁欎笅鍙戠殑鐮屽潡鎷夊彇瀵瑰簲鐨勫伐鑹鸿矾绾垮瓙闆嗕笌缁戝畾鐨凚OM瀛愰泦濉厖鍒伴檮琛ㄤ腑
+     *
+     * @param productionPlanDto 浜у搧璇︽儏
+     */
+    Long populateBlocks(ProductionPlanDto productionPlanDto);
+
+    /**
+     * 缁欎笅鍙戠殑鏉挎潗鎷夊彇瀵瑰簲鐨勫伐鑹鸿矾绾垮瓙闆嗕笌缁戝畾鐨凚OM瀛愰泦濉厖鍒伴檮琛ㄤ腑
+     *
+     * @param productionPlanDto 浜у搧璇︽儏
+     */
+    Long populatePlates(ProductionPlanDto productionPlanDto);
+
+    /**
+     * 鍒犻櫎璇ヨ鍗曟惡甯︾殑闄勮〃鏁版嵁
+     *
+     * @param processRouteId 宸ヨ壓璺嚎ID
+     */
+    void deleteData(Long processRouteId);
+}
diff --git a/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java b/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
new file mode 100644
index 0000000..8a05031
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.appendix.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.appendix.pojo.ProcessRouteItemInstance;
+
+/**
+ * <br>
+ *宸ヨ壓璺嚎瀛愰泦-闄勮〃Service
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:07
+ */
+public interface ProcessRouteItemInstanceService extends IService<ProcessRouteItemInstance> {
+}
\ 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
new file mode 100644
index 0000000..6faa0e7
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.appendix.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
+
+/**
+ * <br>
+ * 宸ヨ壓璺嚎宸ュ簭鍙傛暟-闄勮〃Service
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:11
+ */
+public interface ProcessRouteItemParamInstanceService extends IService<ProcessRouteItemParamInstance> {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/ProductProcessParamInstanceService.java b/src/main/java/com/ruoyi/appendix/service/ProductProcessParamInstanceService.java
new file mode 100644
index 0000000..6405a9a
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/ProductProcessParamInstanceService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.appendix.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.appendix.pojo.ProductProcessParamInstance;
+
+/**
+ * <br>
+ * 宸ュ簭缁戝畾鍙傛暟-闄勮〃Service鎺ュ彛
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:16
+ */
+public interface ProductProcessParamInstanceService extends IService<ProductProcessParamInstance> {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java b/src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
new file mode 100644
index 0000000..5faf372
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.appendix.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.appendix.pojo.ProductStructureInstance;
+
+/**
+ * <br>
+ * BOM瀛愰泦-闄勮〃Service鎺ュ彛
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:21
+ */
+public interface ProductStructureInstanceService extends IService<ProductStructureInstance> {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java
new file mode 100644
index 0000000..5d77a0f
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java
@@ -0,0 +1,216 @@
+package com.ruoyi.appendix.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.ProductProcessParamInstance;
+import com.ruoyi.appendix.pojo.ProductStructureInstance;
+import com.ruoyi.appendix.service.*;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.production.pojo.*;
+import com.ruoyi.production.service.*;
+import com.ruoyi.productionPlan.dto.ProductionPlanDto;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <br>
+ * BOM-宸ヨ壓璺嚎闄勮〃Service鎺ュ彛瀹炵幇绫�
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 14:45
+ */
+@Slf4j
+@Service
+public class AppendixServiceImpl implements AppendixService {
+
+    @Resource
+    private ProcessRouteItemInstanceService processRouteItemInstanceService;
+
+    @Resource
+    private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService;
+
+    @Resource
+    private ProductProcessParamInstanceService productProcessParamInstanceService;
+
+    @Resource
+    private ProductStructureInstanceService productStructureInstanceService;
+
+    @Resource
+    private ProcessRouteService processRouteService;
+
+    @Resource
+    private ProcessRouteItemService processRouteItemService;
+
+    @Resource
+    private ProcessRouteItemParamService processRouteItemParamService;
+
+    @Resource
+    private ProductProcessParamService productProcessParamService;
+
+    @Resource
+    private ProductStructureService productStructureService;
+
+    @Resource
+    private ProductOrderService productOrderService;
+
+    @Override
+    public Long populateBlocks(ProductionPlanDto productionPlanDto) {
+        if (productionPlanDto == null) {
+            throw new ServiceException("涓嬪彂鏁版嵁涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isEmpty(productionPlanDto.getStrength())) {
+            throw new ServiceException("鐮屽潡鐨勪骇鍝佺被鍨嬩笉鑳戒负绌�");
+        }
+        ProcessRoute processRoute = processRouteService.latestTypeDate(productionPlanDto.getProductName(), productionPlanDto.getStrength());
+        if (processRoute == null) {
+            log.info("涓嬪彂浜у搧銆恵}銆戞湭鏌ヨ鍑哄伐鑹鸿矾绾�", productionPlanDto.getProductName());
+            return null;
+        }
+        migration(processRoute);
+        return processRoute.getId();
+    }
+
+    @Override
+    public Long populatePlates(ProductionPlanDto productionPlanDto) {
+        if (productionPlanDto == null) {
+            throw new ServiceException("涓嬪彂鏁版嵁涓嶈兘涓虹┖");
+        }
+        //  鏉挎潗涓嶅尯鍒嗗己搴︼紝strength浼爊ull
+        ProcessRoute processRoute = processRouteService.latestTypeDate(productionPlanDto.getProductName(), null);
+        if (processRoute == null) {
+            log.info("涓嬪彂浜у搧銆恵}銆戞湭鏌ヨ鍑哄伐鑹鸿矾绾�", productionPlanDto.getProductName());
+            return null;
+        }
+        migration(processRoute);
+        return processRoute.getId();
+    }
+
+    @Override
+    public void populateData(Long productOrderId, Long processRouteId) {
+        ProcessRoute processRoute = processRouteService.getById(processRouteId);
+        if (processRoute == null) {
+            log.info("鐢熶骇璁㈠崟銆恵}銆戞湭鏌ヨ鍑哄伐鑹鸿矾绾裤�恵}銆�", productOrderId, processRouteId);
+            return;
+        }
+        migration(processRoute);
+
+        //  鍥炲啓宸ヨ壓璺嚎id鍒扮敓浜ц鍗�
+        ProductOrder productOrder = new ProductOrder();
+        productOrder.setId(productOrderId);
+        productOrder.setRouteId(processRouteId);
+        productOrderService.updateById(productOrder);
+    }
+
+    @Override
+    public void deleteData(Long processRouteId) {
+        //  鏌ュ嚭宸ヨ壓璺嚎瀛愰泦锛岀敤浜庡叧鑱斿垹闄ゅ弬鏁伴檮琛�
+        List<ProcessRouteItem> itemList = processRouteItemService.list(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRouteId));
+
+        if (itemList != null && !itemList.isEmpty()) {
+            List<Long> itemIds = itemList.stream().map(ProcessRouteItem::getId).collect(Collectors.toList());
+            List<Long> processIds = itemList.stream().map(ProcessRouteItem::getProcessId).collect(Collectors.toList());
+
+            //  鍒犻櫎宸ヨ壓璺嚎宸ュ簭鍙傛暟闄勮〃
+            processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>().in(ProcessRouteItemParamInstance::getRouteItemId, itemIds));
+
+            //  鍒犻櫎宸ュ簭缁戝畾鍙傛暟闄勮〃
+            productProcessParamInstanceService.remove(new LambdaQueryWrapper<ProductProcessParamInstance>().in(ProductProcessParamInstance::getProcessId, processIds));
+        }
+
+        //  鍒犻櫎宸ヨ壓璺嚎瀛愰泦闄勮〃
+        processRouteItemInstanceService.remove(
+                new LambdaQueryWrapper<ProcessRouteItemInstance>().eq(ProcessRouteItemInstance::getRouteId, processRouteId));
+
+        //  鍒犻櫎BOM瀛愰泦闄勮〃
+        ProcessRoute processRoute = processRouteService.getById(processRouteId);
+        if (processRoute != null && processRoute.getBomId() != null) {
+            productStructureInstanceService.remove(new LambdaQueryWrapper<ProductStructureInstance>().eq(ProductStructureInstance::getBomId, processRoute.getBomId()));
+        }
+    }
+
+    /**
+     * 鏍规嵁宸ヨ壓璺嚎杩佺Щ鍥涘紶闄勮〃鏁版嵁
+     */
+    private void migration(ProcessRoute processRoute) {
+        //  杩佺Щ宸ヨ壓璺嚎瀛愰泦琛ㄦ暟鎹�
+        List<ProcessRouteItem> processRouteItemList = processRouteItemService.list(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
+        migrationProcessRouteItem(processRouteItemList);
+
+        //  杩佺Щ宸ヨ壓璺嚎鍐呯粦瀹氱殑宸ュ簭鍙婂伐搴忓弬鏁�
+        if (processRouteItemList != null && !processRouteItemList.isEmpty()) {
+            for (ProcessRouteItem item : processRouteItemList) {
+                List<ProcessRouteItemParam> paramList = processRouteItemParamService.list(new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId, item.getId()));
+                migrationProcessRouteItemParam(paramList);
+
+                List<ProductProcessParam> processParamList = productProcessParamService.list(new LambdaQueryWrapper<ProductProcessParam>().eq(ProductProcessParam::getProcessId, item.getProcessId()));
+                migrationProductProcessParam(processParamList);
+            }
+        }
+
+        //  杩佺ЩBOM瀛愰泦琛ㄦ暟鎹�
+        if (processRoute.getBomId() != null) {
+            List<ProductStructure> structureList = productStructureService.list(new LambdaQueryWrapper<ProductStructure>().eq(ProductStructure::getBomId, processRoute.getBomId()));
+            migrationProductStructure(structureList);
+        }
+    }
+
+    private void migrationProcessRouteItem(List<ProcessRouteItem> list) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        List<ProcessRouteItemInstance> instances = list.stream().map(item -> {
+            ProcessRouteItemInstance instance = new ProcessRouteItemInstance();
+            BeanUtils.copyProperties(item, instance, "id");
+            instance.setIsQuality(item.getIsQuality() != null && item.getIsQuality() ? 1 : 0);
+            return instance;
+        }).collect(Collectors.toList());
+        processRouteItemInstanceService.saveBatch(instances);
+    }
+
+    private void migrationProcessRouteItemParam(List<ProcessRouteItemParam> list) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        List<ProcessRouteItemParamInstance> instances = list.stream().map(item -> {
+            ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance();
+            BeanUtils.copyProperties(item, instance, "id");
+            return instance;
+        }).collect(Collectors.toList());
+        processRouteItemParamInstanceService.saveBatch(instances);
+    }
+
+    private void migrationProductProcessParam(List<ProductProcessParam> list) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        List<ProductProcessParamInstance> instances = list.stream().map(item -> {
+            ProductProcessParamInstance instance = new ProductProcessParamInstance();
+            BeanUtils.copyProperties(item, instance, "id");
+            instance.setIsRequired(item.getIsRequired() != null && item.getIsRequired() == 1);
+            return instance;
+        }).collect(Collectors.toList());
+        productProcessParamInstanceService.saveBatch(instances);
+    }
+
+    private void migrationProductStructure(List<ProductStructure> list) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        List<ProductStructureInstance> instances = list.stream().map(item -> {
+            ProductStructureInstance instance = new ProductStructureInstance();
+            BeanUtils.copyProperties(item, instance, "id");
+            instance.setBomId(item.getBomId() != null ? item.getBomId().longValue() : null);
+            return instance;
+        }).collect(Collectors.toList());
+        productStructureInstanceService.saveBatch(instances);
+    }
+}
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java
new file mode 100644
index 0000000..153521d
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java
@@ -0,0 +1,24 @@
+package com.ruoyi.appendix.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.appendix.mapper.ProcessRouteItemInstanceMapper;
+import com.ruoyi.appendix.pojo.ProcessRouteItemInstance;
+import com.ruoyi.appendix.service.ProcessRouteItemInstanceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * <br>
+ * 宸ヨ壓璺嚎瀛愰泦-闄勮〃Service瀹炵幇绫�
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:08
+ */
+@Slf4j
+@Service
+public class ProcessRouteItemInstanceServiceImpl extends ServiceImpl<ProcessRouteItemInstanceMapper, ProcessRouteItemInstance> implements ProcessRouteItemInstanceService {
+
+
+}
\ 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
new file mode 100644
index 0000000..9b84705
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java
@@ -0,0 +1,22 @@
+package com.ruoyi.appendix.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.appendix.mapper.ProcessRouteItemParamInstanceMapper;
+import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
+import com.ruoyi.appendix.service.ProcessRouteItemParamInstanceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * <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 {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/ProductProcessParamInstanceServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/ProductProcessParamInstanceServiceImpl.java
new file mode 100644
index 0000000..d2c9c96
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/impl/ProductProcessParamInstanceServiceImpl.java
@@ -0,0 +1,22 @@
+package com.ruoyi.appendix.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.appendix.mapper.ProductProcessParamInstanceMapper;
+import com.ruoyi.appendix.pojo.ProductProcessParamInstance;
+import com.ruoyi.appendix.service.ProductProcessParamInstanceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * <br>
+ * 宸ュ簭缁戝畾鍙傛暟-闄勮〃Service瀹炵幇绫�
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/18 13:18
+ */
+@Slf4j
+@Service
+public class ProductProcessParamInstanceServiceImpl extends ServiceImpl<ProductProcessParamInstanceMapper, ProductProcessParamInstance> implements ProductProcessParamInstanceService {
+}
diff --git a/src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java b/src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
new file mode 100644
index 0000000..827e035
--- /dev/null
+++ b/src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
@@ -0,0 +1,22 @@
+package com.ruoyi.appendix.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.appendix.mapper.ProductStructureInstanceMapper;
+import com.ruoyi.appendix.pojo.ProductStructureInstance;
+import com.ruoyi.appendix.service.ProductStructureInstanceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * <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 {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java b/src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java
index 493b764..1925a19 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java
@@ -12,4 +12,6 @@
 public interface ProcessRouteMapper extends BaseMapper<ProcessRoute> {
 
     IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page,@Param("c") ProcessRouteDto processRouteDto);
+
+    ProcessRoute latestTypeDate(String productName, String strength);
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
index f02eed1..d385f37 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -33,6 +33,7 @@
     private Long workOrderId;
 
     @ApiModelProperty(value = "鐢熶骇璁㈠崟id")
+    @TableField(exist = false)
     private Long productOrderId;
 
     @ApiModelProperty(value = "鎶ュ伐鐘舵��")
diff --git a/src/main/java/com/ruoyi/production/service/ProcessRouteService.java b/src/main/java/com/ruoyi/production/service/ProcessRouteService.java
index 8ec28d7..b2080d8 100644
--- a/src/main/java/com/ruoyi/production/service/ProcessRouteService.java
+++ b/src/main/java/com/ruoyi/production/service/ProcessRouteService.java
@@ -18,4 +18,6 @@
     int batchDelete(List<Long> ids);
 
     List<ProductStructureDto> getRouteBom(Long id);
+
+    ProcessRoute latestTypeDate(String productName, String strength);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
index 411f2c8..b62665a 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -106,4 +106,9 @@
         }
         return list;
     }
+
+    @Override
+    public ProcessRoute latestTypeDate(String productName, String strength) {
+        return baseMapper.latestTypeDate(productName, strength);
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 4a0cebc..7ee2e65 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.appendix.service.AppendixService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductOrderDto;
 import com.ruoyi.production.dto.ProductStructureDto;
@@ -73,6 +74,9 @@
 
     @Autowired
     private StockUtils stockUtils;
+
+    @Autowired
+    private AppendixService appendixService;
 
     @Override
     public IPage<ProductOrderDto> pageProductOrder(Page<ProductOrder> page, ProductOrderDto productOrder) {
@@ -241,9 +245,14 @@
         // 鍒犻櫎涓棿琛�
         productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids));
 
-        // TODO: 鍒犻櫎闄勮〃鐨勫伐鑹鸿矾绾夸笌BOM
-        productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().in(ProductProcessRouteItem::getProductOrderId, ids));
-        productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>().in(ProductProcessRoute::getProductOrderId, ids));
+        //  鍒犻櫎闄勮〃鐨勫伐鑹鸿矾绾夸笌BOM
+        for (Long id : ids) {
+            ProductOrder productOrder = baseMapper.selectById(id);
+            appendixService.deleteData(productOrder.getRouteId());
+        }
+
+//        productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().in(ProductProcessRouteItem::getProductOrderId, ids));
+//        productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>().in(ProductProcessRoute::getProductOrderId, ids));
 
         //  鍒犻櫎璁㈠崟
         productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>().in(ProductOrder::getId, ids));
diff --git a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java b/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
index 1444f36..cedf8f6 100644
--- a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.appendix.service.AppendixService;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.StringUtils;
@@ -77,6 +78,9 @@
     @Autowired
     private ProductMaterialService productMaterialService;
 
+    @Autowired
+    private AppendixService appendixService;
+
     /**
      * 鍚屾閿侊紝纭繚鎵嬪姩鍜屽畾鏃朵换鍔′笉鍚屾椂鎵ц
      */
@@ -143,6 +147,14 @@
         productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity());
         productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime());
         productOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode());
+
+        //  褰撲笅鍙戠殑浜у搧涓虹爩鍧楁垨鏉挎潗锛屽氨鎷夊彇BOM瀛愰泦涓庡伐鑹鸿矾绾垮瓙闆嗘暟鎹瓨鍏ュ埌闄勮〃涓�
+        if ("鐮屽潡".equals(productionPlanDto.getProductName())) {
+            productOrder.setRouteId(appendixService.populateBlocks(productionPlanDto));
+        }
+        if ("鏉挎潗".equals(productionPlanDto.getProductName())) {
+            productOrder.setRouteId(appendixService.populatePlates(productionPlanDto));
+        }
         productOrderService.addProductOrder(productOrder);
 
         // 鏍规嵁涓嬪彂鏁伴噺锛屼粠绗竴涓敓浜ц鍒掑紑濮嬪垎閰嶆柟鏁�
diff --git a/src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml b/src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml
new file mode 100644
index 0000000..9705b88
--- /dev/null
+++ b/src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.ruoyi.appendix.mapper.ProcessRouteItemInstanceMapper">
+
+    <resultMap id="ProcessRouteItemInstanceMap" type="com.ruoyi.appendix.pojo.ProcessRouteItemInstance">
+        <id property="id" column="id"/>
+        <result property="routeId" column="route_id"/>
+        <result property="productModelId" column="product_model_id"/>
+        <result property="processId" column="process_id"/>
+        <result property="tenantId" column="tenant_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="dragSort" column="drag_sort"/>
+        <result property="isQuality" column="is_quality"/>
+    </resultMap>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml b/src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml
new file mode 100644
index 0000000..b6d4de2
--- /dev/null
+++ b/src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.ruoyi.appendix.mapper.ProcessRouteItemParamInstanceMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance">
+        <id property="id" column="id"/>
+        <result property="routeItemId" column="route_item_id"/>
+        <result property="paramId" column="param_id"/>
+        <result property="processParamId" column="process_param_id"/>
+        <result property="standardValue" column="standard_value"/>
+        <result property="minValue" column="min_value"/>
+        <result property="maxValue" column="max_value"/>
+        <result property="isRequired" column="is_required"/>
+        <result property="sort" column="sort"/>
+        <result property="tenantId" column="tenant_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/appendix/ProductProcessParamInstanceMapper.xml b/src/main/resources/mapper/appendix/ProductProcessParamInstanceMapper.xml
new file mode 100644
index 0000000..690c084
--- /dev/null
+++ b/src/main/resources/mapper/appendix/ProductProcessParamInstanceMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.ruoyi.appendix.mapper.ProductProcessParamInstanceMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.appendix.pojo.ProductProcessParamInstance">
+        <id property="id" column="id"/>
+        <result property="processId" column="process_id"/>
+        <result property="paramId" column="param_id"/>
+        <result property="standardValue" column="standard_value"/>
+        <result property="minValue" column="min_value"/>
+        <result property="maxValue" column="max_value"/>
+        <result property="isRequired" column="is_required"/>
+        <result property="sort" column="sort"/>
+        <result property="tenantId" column="tenant_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml b/src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml
new file mode 100644
index 0000000..ebb91af
--- /dev/null
+++ b/src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.ruoyi.appendix.mapper.ProductStructureInstanceMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.appendix.pojo.ProductStructureInstance">
+        <id property="id" column="id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="productModelId" column="product_model_id"/>
+        <result property="processId" column="process_id"/>
+        <result property="unitQuantity" column="unit_quantity"/>
+        <result property="demandedQuantity" column="demanded_quantity"/>
+        <result property="unit" column="unit"/>
+        <result property="tenantId" column="tenant_id"/>
+        <result property="bomId" column="bom_id"/>
+    </resultMap>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/production/ProcessRouteMapper.xml b/src/main/resources/mapper/production/ProcessRouteMapper.xml
index 48d0708..1baf536 100644
--- a/src/main/resources/mapper/production/ProcessRouteMapper.xml
+++ b/src/main/resources/mapper/production/ProcessRouteMapper.xml
@@ -29,4 +29,24 @@
         order by ps.id
     </select>
 
+    <select id="latestTypeDate" resultType="com.ruoyi.production.pojo.ProcessRoute">
+        SELECT *
+        FROM process_route pr
+        WHERE pr.dict_code = (SELECT d.dict_code
+                              FROM sys_dict_data d
+                              WHERE d.dict_label =
+                                <choose>
+                                    <when test="strength != null and strength != ''">
+                                        CONCAT(#{productName}, '-', #{strength})
+                                    </when>
+                                    <otherwise>
+                                        #{productName}
+                                    </otherwise>
+                                </choose>
+                                AND d.dict_type = 'product_type'
+                              LIMIT 1)
+        ORDER BY pr.create_time DESC
+        LIMIT 1
+    </select>
+
 </mapper>

--
Gitblit v1.9.3