From 71af682447e953e309cc953e65a5f32cc24998b2 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期三, 18 三月 2026 17:04:56 +0800
Subject: [PATCH] feat: 生产下发时(砌块、板材)绑定最新的工艺路线到附表、删除生产订单时清除所有附表数据
---
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