gongchunyi
7 小时以前 7f7993e0fde1e08bfd37982ab6eb9e5a08545b2d
refactor: 生产订单绑定工艺路线的子表重命名
已添加21个文件
已重命名3个文件
已修改1个文件
已删除18个文件
2178 ■■■■ 文件已修改
doc/宁夏-中盛建材.sql 167 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/controller/AppendixController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemInstanceDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemParamInstanceDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/dto/ProductStructureInstanceDto.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemParamInstanceMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderAppendixController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemController.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemParamController.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemParamDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemParamMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItem.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItemParam.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderStructure.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/IProductionOrderAppendixService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemParamService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderAppendixServiceImpl.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemParamServiceImpl.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemServiceImpl.java 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderRouteItemMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderRouteItemParamMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderStructureMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -281,95 +281,6 @@
ALTER TABLE `product-inventory-management-zsjc`.`product_order`
    ADD COLUMN `status` int NULL COMMENT '状态(1.待开始、2.进行中、3.已完成、4.已取消)' AFTER `plan_complete_time`;
DROP TABLE IF EXISTS `process_route_item_instance`;
CREATE TABLE `process_route_item_instance`
(
    `id`               bigint     NOT NULL AUTO_INCREMENT,
    `route_id`         bigint     NOT NULL DEFAULT 0 COMMENT '工艺路线id',
    `product_model_id` bigint     NULL     DEFAULT 0 COMMENT '产品id',
    `process_id`       bigint     NOT NULL DEFAULT 0 COMMENT '工序id',
    `tenant_id`        bigint     NOT NULL COMMENT '租户id',
    `create_time`      datetime   NULL     DEFAULT NULL COMMENT '录入时间',
    `update_time`      datetime   NULL     DEFAULT NULL COMMENT '更新时间',
    `drag_sort`        int        NULL     DEFAULT NULL COMMENT '拖动排序',
    `is_quality`       tinyint(1) NULL     DEFAULT 1 COMMENT '是否质检工序',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  AUTO_INCREMENT = 83
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci COMMENT = '工艺路线子集-附表'
  ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for process_route_item_param_instance
-- ----------------------------
DROP TABLE IF EXISTS `process_route_item_param_instance`;
CREATE TABLE `process_route_item_param_instance`
(
    `id`               bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `order_id`         bigint                                                                 DEFAULT NULL COMMENT '生产订单ID',
    `route_item_id`    bigint                                                        NOT NULL COMMENT '关联工艺路线明细ID (process_route_item.id)',
    `process_param_id` bigint                                                                 DEFAULT NULL COMMENT '来源工序参数ID',
    `param_key`        varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci          DEFAULT NULL COMMENT '参数唯一标识',
    `param_name`       varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数名称',
    `param_type`       tinyint                                                       NOT NULL COMMENT '参数类型(1数字 2文本 3下拉选择 4时间)',
    `param_format`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci          DEFAULT NULL COMMENT '参数格式',
    `value_mode`       tinyint                                                                DEFAULT '1' COMMENT '值模式(1单值 2区间)',
    `unit`             varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci           DEFAULT NULL COMMENT '单位',
    `remark`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci          DEFAULT NULL COMMENT '备注',
    `standard_value`   varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci          DEFAULT NULL COMMENT '标准值',
    `min_value`        decimal(10, 2)                                                         DEFAULT NULL COMMENT '此路线节点设定的标准最小值',
    `max_value`        decimal(10, 2)                                                         DEFAULT NULL COMMENT '此路线节点设定的标准最大值',
    `is_required`      tinyint                                                       NOT NULL DEFAULT '0' COMMENT '是否必填',
    `sort`             int                                                           NOT NULL DEFAULT '0' COMMENT '排序',
    `tenant_id`        bigint                                                                 DEFAULT NULL COMMENT '租户ID',
    `create_time`      datetime                                                               DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time`      datetime                                                               DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`) USING BTREE,
    KEY `idx_route_item_id` (`route_item_id`) USING BTREE,
    KEY `idx_param_key` (`param_key`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci
  ROW_FORMAT = DYNAMIC COMMENT ='工艺路线工序参数实例表';
-- ----------------------------
-- Table structure for product_structure_instance
-- ----------------------------
DROP TABLE IF EXISTS `product_structure_instance`;
CREATE TABLE `product_structure_instance`
(
    `id`                bigint                                                        NOT NULL AUTO_INCREMENT,
    `parent_id`         bigint                                                        NULL DEFAULT NULL COMMENT '父节点ID',
    `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的id',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci COMMENT = 'BOM子集-附表'
  ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
ALTER TABLE `process_route_item_instance`
    ADD COLUMN `order_id` bigint NOT NULL COMMENT '生产订单id' AFTER `id`,
    ADD INDEX `idx_order_id` (`order_id`);
ALTER TABLE `process_route_item_param_instance`
    ADD COLUMN `order_id` bigint NOT NULL COMMENT '生产订单id' AFTER `id`,
    ADD INDEX `idx_order_id` (`order_id`);
ALTER TABLE `product_structure_instance`
    ADD COLUMN `order_id` bigint NOT NULL COMMENT '生产订单id' AFTER `id`,
    ADD INDEX `idx_order_id` (`order_id`);
ALTER TABLE `product-inventory-management-zsjc`.`product_order`
    ADD COLUMN `strength` varchar(255) NULL COMMENT '产品类型' AFTER `plan_complete_time`;
@@ -427,4 +338,80 @@
ALTER TABLE `product-inventory-management-zsjc`.`product_structure`
    MODIFY COLUMN `unit_quantity` decimal(20, 15) NOT NULL COMMENT '单位产出需要数量' AFTER `process_id`,
    MODIFY COLUMN `demanded_quantity` decimal(20, 15) NULL DEFAULT NULL COMMENT '需求数量' AFTER `unit_quantity`,
    MODIFY COLUMN `demanded_quantity` decimal(20, 15) NULL DEFAULT NULL COMMENT '需求数量' AFTER `unit_quantity`,
CREATE TABLE `production_order_route_item`
(
    `id`               bigint NOT NULL AUTO_INCREMENT,
    `order_id`         bigint NOT NULL COMMENT '生产订单id',
    `route_id`         bigint NOT NULL DEFAULT '0' COMMENT '工艺路线id',
    `product_model_id` bigint          DEFAULT '0' COMMENT '产品id',
    `process_id`       bigint NOT NULL DEFAULT '0' COMMENT '工序id',
    `tenant_id`        bigint NOT NULL COMMENT '租户id',
    `create_time`      datetime        DEFAULT NULL COMMENT '录入时间',
    `update_time`      datetime        DEFAULT NULL COMMENT '更新时间',
    `drag_sort`        int             DEFAULT NULL COMMENT '拖动排序',
    `is_quality`       tinyint(1)      DEFAULT '1' COMMENT '是否质检工序',
    PRIMARY KEY (`id`) USING BTREE,
    KEY `idx_order_id` (`order_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 83
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci
  ROW_FORMAT = DYNAMIC
    COMMENT ='生产订单绑定的工艺路线--工序表';
CREATE TABLE `production_order_route_item_param`
(
    `id`               bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `order_id`         bigint                                                                 DEFAULT NULL COMMENT '生产订单ID',
    `route_item_id`    bigint                                                        NOT NULL COMMENT '关联工艺路线明细ID (production_order_route_item.id)',
    `process_param_id` bigint                                                                 DEFAULT NULL COMMENT '来源工序参数ID',
    `param_key`        varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci          DEFAULT NULL COMMENT '参数唯一标识',
    `param_name`       varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数名称',
    `param_type`       tinyint                                                       NOT NULL COMMENT '参数类型(1数字 2文本 3下拉选择 4时间)',
    `param_format`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci          DEFAULT NULL COMMENT '参数格式',
    `value_mode`       tinyint                                                                DEFAULT '1' COMMENT '值模式(1单值 2区间)',
    `unit`             varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci           DEFAULT NULL COMMENT '单位',
    `remark`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci          DEFAULT NULL COMMENT '备注',
    `standard_value`   varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci          DEFAULT NULL COMMENT '标准值',
    `min_value`        decimal(10, 2)                                                         DEFAULT NULL COMMENT '此路线节点设定的标准最小值',
    `max_value`        decimal(10, 2)                                                         DEFAULT NULL COMMENT '此路线节点设定的标准最大值',
    `is_required`      tinyint                                                       NOT NULL DEFAULT '0' COMMENT '是否必填',
    `sort`             int                                                           NOT NULL DEFAULT '0' COMMENT '排序',
    `tenant_id`        bigint                                                                 DEFAULT NULL COMMENT '租户ID',
    `create_time`      datetime                                                               DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time`      datetime                                                               DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`) USING BTREE,
    KEY `idx_route_item_id` (`route_item_id`) USING BTREE,
    KEY `idx_param_key` (`param_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci
  ROW_FORMAT = DYNAMIC
    COMMENT ='生产订单绑定的工艺路线工序--参数表';
CREATE TABLE `production_order_structure`
(
    `id`                bigint         NOT NULL AUTO_INCREMENT,
    `order_id`          bigint         NOT NULL COMMENT '生产订单id',
    `parent_id`         bigint                                                        DEFAULT NULL COMMENT '父节点ID',
    `product_model_id`  bigint                                                        DEFAULT NULL COMMENT '产品id',
    `process_id`        bigint                                                        DEFAULT NULL COMMENT '工序id',
    `unit_quantity`     decimal(16, 4) NOT NULL COMMENT '单位产出需要数量',
    `demanded_quantity` decimal(16, 4)                                                DEFAULT NULL COMMENT '需求数量',
    `unit`              varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '单位',
    `tenant_id`         bigint                                                        DEFAULT NULL COMMENT '租户id',
    `bom_id`            bigint         NOT NULL COMMENT 'bom的id',
    PRIMARY KEY (`id`) USING BTREE,
    KEY `idx_order_id` (`order_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci
  ROW_FORMAT = DYNAMIC
    COMMENT ='生产订单绑定的BOM子表';
DROP TABLE IF EXISTS process_route_item_instance;
DROP TABLE IF EXISTS process_route_item_param_instance;
DROP TABLE IF EXISTS product_structure_instance;
src/main/java/com/ruoyi/appendix/controller/AppendixController.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemInstanceDto.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemParamInstanceDto.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/dto/ProductStructureInstanceDto.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemParamInstanceMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/production/controller/ProductionOrderAppendixController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.production.controller;
import com.ruoyi.appendix.service.AppendixService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.IProductionOrderAppendixService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * <br>
 * BOM-工艺路线附表控制层
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/20
 */
@RestController
@RequestMapping("/appendix")
@Api("BOM-工艺路线附表控制层")
public class ProductionOrderAppendixController {
    @Resource
    private IProductionOrderAppendixService iProductionOrderAppendixService;
    @PostMapping("/bindingRoute")
    @ApiOperation("生产订单绑定工艺路线")
    public AjaxResult bindingRoute(@RequestBody ProductOrder productOrder) {
        iProductionOrderAppendixService.populateData(productOrder);
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductionOrderRouteItemDto;
import com.ruoyi.production.service.IProductionOrderRouteItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线--工序表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
@RestController
@RequestMapping("/productionOrderRouteItem")
@Api(tags = "工艺路线工序接口")
public class ProductionOrderRouteItemController {
    @Resource
    private IProductionOrderRouteItemService productionOrderRouteItemService;
    @GetMapping("/list/{orderId}")
    @ApiOperation("获取工序列表")
    public AjaxResult getProcessItem(@PathVariable Long orderId) {
        List<ProductionOrderRouteItemDto> list = productionOrderRouteItemService.getProcessItem(orderId);
        return AjaxResult.success(list);
    }
    @PostMapping("/add")
    @ApiOperation("新增工序")
    public AjaxResult addProcessItem(@RequestBody ProductionOrderRouteItemDto dto) {
        productionOrderRouteItemService.addProcessItem(dto);
        return AjaxResult.success();
    }
    @PutMapping("/update")
    @ApiOperation("修改工序")
    public AjaxResult updateProcessItem(@RequestBody ProductionOrderRouteItemDto dto) {
        productionOrderRouteItemService.updateProcessItem(dto);
        return AjaxResult.success();
    }
    @DeleteMapping("/delete/{id}")
    @ApiOperation("删除工序")
    public AjaxResult deleteProcessItem(@PathVariable Long id) {
        productionOrderRouteItemService.deleteProcessItem(id);
        return AjaxResult.success();
    }
    @PostMapping("/sort")
    @ApiOperation("工序排序")
    public AjaxResult sortProcessItem(@RequestBody ProductionOrderRouteItemDto dto) {
        productionOrderRouteItemService.sortProcessItem(dto);
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemParamController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductionOrderRouteItemParamDto;
import com.ruoyi.production.service.IProductionOrderRouteItemParamService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线工序--参数表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
@Api(tags = "工艺路线工序参数接口")
@RestController
@RequestMapping("/productionOrderRouteItemParam")
public class ProductionOrderRouteItemParamController {
    @Resource
    private IProductionOrderRouteItemParamService productionOrderRouteItemParamService;
    @GetMapping("/list")
    @ApiOperation("生产订单-获取工序绑定的参数列表")
    public AjaxResult routeItemParamList(@RequestParam("orderId") Long orderId, @RequestParam("routeItemId") Long routeItemId) {
        List<ProductionOrderRouteItemParamDto> list = productionOrderRouteItemParamService.routeItemParamList(orderId, routeItemId);
        return AjaxResult.success(list);
    }
    @PostMapping("/add")
    @ApiOperation("生产订单-工序新增参数")
    public AjaxResult addRouteItemParam(@RequestBody ProductionOrderRouteItemParamDto dto) {
        productionOrderRouteItemParamService.addRouteItemParam(dto);
        return AjaxResult.success();
    }
    @PutMapping("/update")
    @ApiOperation("生产订单-工序更新参数")
    public AjaxResult updateRouteItemParam(@RequestBody ProductionOrderRouteItemParamDto dto) {
        productionOrderRouteItemParamService.updateRouteItemParam(dto);
        return AjaxResult.success();
    }
    @DeleteMapping("/delete/{id}")
    @ApiOperation("生产订单-工序删除参数")
    public AjaxResult deleteRouteItemParam(@PathVariable Long id) {
        productionOrderRouteItemParamService.deleteRouteItemParam(id);
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductionOrderStructureDto;
import com.ruoyi.production.service.IProductionOrderStructureService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的BOM子表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
@Api(tags = "BOM结构接口")
@RestController
@RequestMapping("/productionOrderStructure")
public class ProductionOrderStructureController {
    @Resource
    private IProductionOrderStructureService productionOrderStructureService;
    @GetMapping("/getBomStructs/{orderId}")
    @ApiOperation("根据生产订单ID获取绑定的BOM子集结构树")
    public AjaxResult getBomStructs(@PathVariable Long orderId) {
        List<ProductionOrderStructureDto> list = productionOrderStructureService.listByOrderId(orderId);
        return AjaxResult.success(list);
    }
    @PutMapping("/addOrUpdateBomStructs")
    @ApiOperation("新增/更新BOM子集结构")
    public AjaxResult addOrUpdateBomStructs(@RequestBody ProductionOrderStructureDto instanceDto) {
        productionOrderStructureService.addOrUpdateBomStructs(instanceDto);
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductionOrderRouteItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <br>
 * ç”Ÿäº§è®¢å•绑定的工艺路线--工序表Dto
 * </br>
 *
 * @author deslrey
 * @since 2026/03/20
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class ProductionOrderRouteItemDto extends ProductionOrderRouteItem {
    @ApiModelProperty("工序名称")
    private String processName;
}
src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemParamDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <br>
 * ç”Ÿäº§è®¢å•绑定的工艺路线工序--参数表Dto
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/20 10:11
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class ProductionOrderRouteItemParamDto extends ProductionOrderRouteItemParam {
    @ApiModelProperty("工序ID")
    private Long processId;
    @ApiModelProperty("基本参数ID")
    private Long paramId;
}
src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductionOrderStructure;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.ArrayList;
import java.util.List;
/**
 * <br>
 * ç”Ÿäº§è®¢å•绑定的BOM子表Dto
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/20 10:12
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class ProductionOrderStructureDto extends ProductionOrderStructure {
    @ApiModelProperty("子类")
    private List<ProductionOrderStructureDto> children = new ArrayList<>();
    @ApiModelProperty("临时ID")
    private String tempId;
    @ApiModelProperty("父节点临时ID")
    private String parentTempId;
}
src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.pojo.ProductionOrderRouteItem;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线--工序表 Mapper æŽ¥å£
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
public interface ProductionOrderRouteItemMapper extends BaseMapper<ProductionOrderRouteItem> {
}
src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemParamMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线工序--参数表 Mapper æŽ¥å£
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
public interface ProductionOrderRouteItemParamMapper extends BaseMapper<ProductionOrderRouteItemParam> {
}
src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.pojo.ProductionOrderStructure;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的BOM子表 Mapper æŽ¥å£
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
public interface ProductionOrderStructureMapper extends BaseMapper<ProductionOrderStructure> {
}
src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线--工序表
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("production_order_route_item")
@ApiModel(value="ProductionOrderRouteItem对象", description="生产订单绑定的工艺路线--工序表")
public class ProductionOrderRouteItem implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "生产订单id")
    private Long orderId;
    @ApiModelProperty(value = "工艺路线id")
    private Long routeId;
    @ApiModelProperty(value = "产品id")
    private Long productModelId;
    @ApiModelProperty(value = "工序id")
    private Long processId;
    @ApiModelProperty(value = "租户id")
    private Long tenantId;
    @ApiModelProperty(value = "录入时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "拖动排序")
    private Integer dragSort;
    @ApiModelProperty(value = "是否质检工序(0否 1是)")
    private Integer isQuality;
}
src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItemParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.ruoyi.production.pojo;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线工序--参数表
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("production_order_route_item_param")
@ApiModel(value="ProductionOrderRouteItemParam对象", description="生产订单绑定的工艺路线工序--参数表")
public class ProductionOrderRouteItemParam implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "生产订单ID")
    private Long orderId;
    @ApiModelProperty(value = "关联工艺路线明细ID (production_order_route_item.id)")
    private Long routeItemId;
    @ApiModelProperty(value = "来源工序参数ID")
    private Long processParamId;
    @ApiModelProperty(value = "参数唯一标识")
    private String paramKey;
    @ApiModelProperty(value = "参数名称")
    private String paramName;
    @ApiModelProperty(value = "参数类型(1数字 2文本 3下拉选择 4时间)")
    private Integer paramType;
    @ApiModelProperty(value = "参数格式")
    private String paramFormat;
    @ApiModelProperty(value = "值模式(1单值 2区间)")
    private Integer valueMode;
    @ApiModelProperty(value = "单位")
    private String unit;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "标准值")
    private String standardValue;
    @ApiModelProperty(value = "此路线节点设定的标准最小值")
    private BigDecimal minValue;
    @ApiModelProperty(value = "此路线节点设定的标准最大值")
    private BigDecimal maxValue;
    @ApiModelProperty(value = "是否必填")
    private Boolean isRequired;
    @ApiModelProperty(value = "排序")
    private Integer sort;
    @ApiModelProperty(value = "租户ID")
    private Long tenantId;
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/production/pojo/ProductionOrderStructure.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.production.pojo;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的BOM子表
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("production_order_structure")
@ApiModel(value="ProductionOrderStructure对象", description="生产订单绑定的BOM子表")
public class ProductionOrderStructure implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "生产订单id")
    private Long orderId;
    @ApiModelProperty(value = "父节点ID")
    private Long parentId;
    @ApiModelProperty(value = "产品id")
    private Long productModelId;
    @ApiModelProperty(value = "工序id")
    private Long processId;
    @ApiModelProperty(value = "单位产出需要数量")
    private BigDecimal unitQuantity;
    @ApiModelProperty(value = "需求数量")
    private BigDecimal demandedQuantity;
    @ApiModelProperty(value = "单位")
    private String unit;
    @ApiModelProperty(value = "租户id")
    private Long tenantId;
    @ApiModelProperty(value = "bom的id")
    private Long bomId;
}
src/main/java/com/ruoyi/production/service/IProductionOrderAppendixService.java
ÎļþÃû´Ó src/main/java/com/ruoyi/appendix/service/AppendixService.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.appendix.service;
package com.ruoyi.production.service;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
@@ -10,9 +10,9 @@
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/18 14:45
 * @since 2026/03/20
 */
public interface AppendixService {
public interface IProductionOrderAppendixService {
    /**
     * å°†å¯¹åº”的工艺路线子集与绑定的BOM子集填充到附表中
src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemParamService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.production.service;
import com.ruoyi.production.dto.ProductionOrderRouteItemParamDto;
import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线工序--参数表 æœåŠ¡ç±»
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
public interface IProductionOrderRouteItemParamService extends IService<ProductionOrderRouteItemParam> {
    List<ProductionOrderRouteItemParamDto> routeItemParamList(Long orderId, Long routeItemId);
    void addRouteItemParam(ProductionOrderRouteItemParamDto dto);
    void updateRouteItemParam(ProductionOrderRouteItemParamDto dto);
    void deleteRouteItemParam(Long id);
}
src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.production.service;
import com.ruoyi.production.dto.ProductionOrderRouteItemDto;
import com.ruoyi.production.pojo.ProductionOrderRouteItem;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线--工序表 æœåŠ¡ç±»
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
public interface IProductionOrderRouteItemService extends IService<ProductionOrderRouteItem> {
    List<ProductionOrderRouteItemDto> getProcessItem(Long orderId);
    void addProcessItem(ProductionOrderRouteItemDto dto);
    void updateProcessItem(ProductionOrderRouteItemDto dto);
    void deleteProcessItem(Long id);
    void sortProcessItem(ProductionOrderRouteItemDto dto);
}
src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.production.service;
import com.ruoyi.production.dto.ProductionOrderStructureDto;
import com.ruoyi.production.pojo.ProductionOrderStructure;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的BOM子表 æœåŠ¡ç±»
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
public interface IProductionOrderStructureService extends IService<ProductionOrderStructure> {
    List<ProductionOrderStructureDto> listByOrderId(Long orderId);
    void addOrUpdateBomStructs(ProductionOrderStructureDto instanceDto);
}
src/main/java/com/ruoyi/production/service/impl/ProductionOrderAppendixServiceImpl.java
ÎļþÃû´Ó src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java ÐÞ¸Ä
@@ -1,10 +1,6 @@
package com.ruoyi.appendix.service.impl;
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.appendix.pojo.ProcessRouteItemInstance;
import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
import com.ruoyi.appendix.pojo.ProductStructureInstance;
import com.ruoyi.appendix.service.*;
import com.ruoyi.basic.service.BaseParamService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
@@ -23,25 +19,25 @@
/**
 * <br>
 * BOM-工艺路线附表Service接口实现类
 *
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/18 14:45
 * @since 2026/03/20
 */
@Slf4j
@Service
public class AppendixServiceImpl implements AppendixService {
public class ProductionOrderAppendixServiceImpl implements IProductionOrderAppendixService {
    @Resource
    private ProcessRouteItemInstanceService processRouteItemInstanceService;
    private IProductionOrderRouteItemService productionOrderRouteItemService;
    @Resource
    private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService;
    private IProductionOrderRouteItemParamService productionOrderRouteItemParamService;
    @Resource
    private ProductStructureInstanceService productStructureInstanceService;
    private IProductionOrderStructureService productionOrderStructureService;
    @Resource
    private BaseParamService baseParamService;
@@ -114,20 +110,20 @@
    @Override
    public void deleteData(Long orderId, Long processRouteId) {
        //  åˆ é™¤å·¥è‰ºè·¯çº¿å·¥åºå‚数附表
        processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
                .eq(ProcessRouteItemParamInstance::getOrderId, orderId));
        productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
                .eq(ProductionOrderRouteItemParam::getOrderId, orderId));
        //  åˆ é™¤å·¥è‰ºè·¯çº¿å­é›†é™„表
        processRouteItemInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemInstance>()
                .eq(ProcessRouteItemInstance::getOrderId, orderId)
                .eq(ProcessRouteItemInstance::getRouteId, processRouteId));
        productionOrderRouteItemService.remove(new LambdaQueryWrapper<ProductionOrderRouteItem>()
                .eq(ProductionOrderRouteItem::getOrderId, orderId)
                .eq(ProductionOrderRouteItem::getRouteId, processRouteId));
        //  åˆ é™¤BOM子集附表
        ProcessRoute processRoute = processRouteService.getById(processRouteId);
        if (processRoute != null && processRoute.getBomId() != null) {
            productStructureInstanceService.remove(new LambdaQueryWrapper<ProductStructureInstance>()
                    .eq(ProductStructureInstance::getOrderId, orderId)
                    .eq(ProductStructureInstance::getBomId, processRoute.getBomId()));
            productionOrderStructureService.remove(new LambdaQueryWrapper<ProductionOrderStructure>()
                    .eq(ProductionOrderStructure::getOrderId, orderId)
                    .eq(ProductionOrderStructure::getBomId, processRoute.getBomId()));
        }
    }
@@ -138,12 +134,12 @@
        //  è¿ç§»å·¥è‰ºè·¯çº¿å­é›†è¡¨æ•°æ®ï¼Œè¿”回旧id->新instance映射
        List<ProcessRouteItem> processRouteItemList = processRouteItemService.list(
                new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
        Map<Long, ProcessRouteItemInstance> routeItemOldIdMap = migrationProcessRouteItem(orderId, processRouteItemList);
        Map<Long, ProductionOrderRouteItem> routeItemOldIdMap = migrationProcessRouteItem(orderId, processRouteItemList);
        //  è¿ç§»å·¥è‰ºè·¯çº¿å†…绑定的工序参数
        if (processRouteItemList != null && !processRouteItemList.isEmpty()) {
            for (ProcessRouteItem item : processRouteItemList) {
                ProcessRouteItemInstance newInstance = routeItemOldIdMap.get(item.getId());
                ProductionOrderRouteItem newInstance = routeItemOldIdMap.get(item.getId());
                Long newRouteItemInstanceId = newInstance != null ? newInstance.getId() : item.getId();
                List<ProcessRouteItemParam> paramList = processRouteItemParamService.list(
@@ -160,13 +156,13 @@
        }
    }
    private Map<Long, ProcessRouteItemInstance> migrationProcessRouteItem(Long orderId, List<ProcessRouteItem> list) {
        Map<Long, ProcessRouteItemInstance> oldIdMap = new HashMap<>();
    private Map<Long, ProductionOrderRouteItem> migrationProcessRouteItem(Long orderId, List<ProcessRouteItem> list) {
        Map<Long, ProductionOrderRouteItem> oldIdMap = new HashMap<>();
        if (list == null || list.isEmpty()) {
            return oldIdMap;
        }
        List<ProcessRouteItemInstance> instances = list.stream().map(item -> {
            ProcessRouteItemInstance instance = new ProcessRouteItemInstance();
        List<ProductionOrderRouteItem> instances = list.stream().map(item -> {
            ProductionOrderRouteItem instance = new ProductionOrderRouteItem();
            BeanUtils.copyProperties(item, instance, "id");
            instance.setIsQuality(item.getIsQuality() != null && item.getIsQuality() ? 1 : 0);
            instance.setOrderId(orderId);
@@ -175,7 +171,7 @@
            }
            return instance;
        }).collect(Collectors.toList());
        processRouteItemInstanceService.saveBatch(instances);
        productionOrderRouteItemService.saveBatch(instances);
        return oldIdMap;
    }
@@ -183,23 +179,23 @@
        if (list == null || list.isEmpty()) {
            return;
        }
        List<ProcessRouteItemParamInstance> instances = list.stream().map(item -> {
            ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance();
        List<ProductionOrderRouteItemParam> instances = list.stream().map(item -> {
            ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam();
            BeanUtils.copyProperties(item, instance, "id");
            instance.setOrderId(orderId);
            instance.setRouteItemId(newRouteItemInstanceId);
            return instance;
        }).collect(Collectors.toList());
        processRouteItemParamInstanceService.saveBatch(instances);
        productionOrderRouteItemParamService.saveBatch(instances);
    }
    private void migrationProductStructure(Long orderId, List<ProductStructure> list) {
        if (list == null || list.isEmpty()) {
            return;
        }
        Map<Long, ProductStructureInstance> oldIdMap = new HashMap<>();
        List<ProductStructureInstance> instances = list.stream().map(item -> {
            ProductStructureInstance instance = new ProductStructureInstance();
        Map<Long, ProductionOrderStructure> oldIdMap = new HashMap<>();
        List<ProductionOrderStructure> instances = list.stream().map(item -> {
            ProductionOrderStructure instance = new ProductionOrderStructure();
            BeanUtils.copyProperties(item, instance, "id");
            instance.setBomId(item.getBomId() != null ? item.getBomId().longValue() : null);
            instance.setOrderId(orderId);
@@ -208,7 +204,7 @@
            }
            return instance;
        }).collect(Collectors.toList());
        productStructureInstanceService.saveBatch(instances);
        productionOrderStructureService.saveBatch(instances);
        //  æ–°å¢žåŽæœ‰id,旧id->新id,修正parentId
        Map<Long, Long> oldToNewId = new HashMap<>();
@@ -218,12 +214,12 @@
            }
        });
        List<ProductStructureInstance> toUpdate = instances.stream()
        List<ProductionOrderStructure> toUpdate = instances.stream()
                .filter(i -> i.getParentId() != null && oldToNewId.containsKey(i.getParentId()))
                .peek(i -> i.setParentId(oldToNewId.get(i.getParentId())))
                .collect(Collectors.toList());
        if (!toUpdate.isEmpty()) {
            productStructureInstanceService.updateBatchById(toUpdate);
            productionOrderStructureService.updateBatchById(toUpdate);
        }
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemParamServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.pojo.BaseParam;
import com.ruoyi.basic.service.BaseParamService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.production.dto.ProductionOrderRouteItemParamDto;
import com.ruoyi.production.mapper.ProductionOrderRouteItemParamMapper;
import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
import com.ruoyi.production.service.IProductionOrderRouteItemParamService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线工序--参数表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
@Slf4j
@Service
public class ProductionOrderRouteItemParamServiceImpl extends ServiceImpl<ProductionOrderRouteItemParamMapper, ProductionOrderRouteItemParam> implements IProductionOrderRouteItemParamService {
    @Autowired
    private BaseParamService baseParamService;
    @Override
    public List<ProductionOrderRouteItemParamDto> routeItemParamList(Long orderId, Long routeItemId) {
        List<ProductionOrderRouteItemParam> list = list(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
                .eq(ProductionOrderRouteItemParam::getOrderId, orderId)
                .eq(ProductionOrderRouteItemParam::getRouteItemId, routeItemId)
                .orderByAsc(ProductionOrderRouteItemParam::getSort));
        return list.stream().map(item -> {
            ProductionOrderRouteItemParamDto dto = new ProductionOrderRouteItemParamDto();
            BeanUtils.copyProperties(item, dto);
            return dto;
        }).collect(Collectors.toList());
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addRouteItemParam(ProductionOrderRouteItemParamDto dto) {
        if (dto == null) {
            throw new ServiceException("新增数据不能为空");
        }
        if (dto.getOrderId() == null) {
            throw new ServiceException("生产订单ID不能为空");
        }
        if (dto.getRouteItemId() == null) {
            throw new ServiceException("工艺路线明细ID不能为空");
        }
        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
        BaseParam baseParam = baseParamService.getById(dto.getParamId());
        if (baseParam == null) {
            throw new ServiceException("新增参数不存在");
        }
        ProductionOrderRouteItemParam entity = new ProductionOrderRouteItemParam();
        BeanUtils.copyProperties(dto, entity);
        entity.setId(null);
        entity.setOrderId(dto.getOrderId());
        entity.setRouteItemId(dto.getRouteItemId());
        entity.setIsRequired(dto.getIsRequired());
        //  å–当前订单+路线明细下最大 sort + 1
        ProductionOrderRouteItemParam maxSortItem = getOne(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
                .select(ProductionOrderRouteItemParam::getSort)
                .eq(ProductionOrderRouteItemParam::getOrderId, dto.getOrderId())
                .eq(ProductionOrderRouteItemParam::getRouteItemId, dto.getRouteItemId())
                .orderByDesc(ProductionOrderRouteItemParam::getSort)
                .last("limit 1"));
        entity.setSort(maxSortItem != null && maxSortItem.getSort() != null ? maxSortItem.getSort() + 1 : 1);
        entity.setParamKey(baseParam.getParamKey());
        entity.setParamName(baseParam.getParamName());
        entity.setParamFormat(baseParam.getParamFormat());
        entity.setParamType(baseParam.getParamType());
        entity.setValueMode(baseParam.getValueMode());
        entity.setUnit(baseParam.getUnit());
        entity.setRemark(baseParam.getRemark());
        entity.setTenantId(tenantId);
        entity.setCreateTime(LocalDateTime.now());
        save(entity);
    }
    @Override
    public void updateRouteItemParam(ProductionOrderRouteItemParamDto dto) {
        if (dto == null || dto.getId() == null) {
            throw new ServiceException("更新数据或ID不能为空");
        }
        if (getById(dto.getId()) == null) {
            throw new ServiceException("数据不存在");
        }
        ProductionOrderRouteItemParam entity = new ProductionOrderRouteItemParam();
        BeanUtils.copyProperties(dto, entity);
        entity.setUpdateTime(LocalDateTime.now());
        updateById(entity);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteRouteItemParam(Long id) {
        if (id == null) {
            throw new ServiceException("ID不能为空");
        }
        if (getById(id) == null) {
            throw new ServiceException("数据不存在");
        }
        removeById(id);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemServiceImpl.java
ÎļþÃû´Ó src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java ÐÞ¸Ä
@@ -1,17 +1,17 @@
package com.ruoyi.appendix.service.impl;
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.appendix.dto.ProcessRouteItemInstanceDto;
import com.ruoyi.appendix.mapper.ProcessRouteItemInstanceMapper;
import com.ruoyi.appendix.pojo.ProcessRouteItemInstance;
import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance;
import com.ruoyi.appendix.service.ProcessRouteItemInstanceService;
import com.ruoyi.appendix.service.ProcessRouteItemParamInstanceService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.production.dto.ProductionOrderRouteItemDto;
import com.ruoyi.production.mapper.ProductionOrderRouteItemMapper;
import com.ruoyi.production.pojo.ProcessRouteItemParam;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.pojo.ProductionOrderRouteItem;
import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
import com.ruoyi.production.service.IProductionOrderRouteItemParamService;
import com.ruoyi.production.service.IProductionOrderRouteItemService;
import com.ruoyi.production.service.ProcessRouteItemParamService;
import com.ruoyi.production.service.ProductProcessService;
import lombok.extern.slf4j.Slf4j;
@@ -24,34 +24,33 @@
import java.util.stream.Collectors;
/**
 * <br>
 * å·¥è‰ºè·¯çº¿å­é›†-附表Service实现类
 * </br>
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线--工序表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/18 13:08
 * @since 2026-03-20
 */
@Slf4j
@Service
public class ProcessRouteItemInstanceServiceImpl extends ServiceImpl<ProcessRouteItemInstanceMapper, ProcessRouteItemInstance> implements ProcessRouteItemInstanceService {
public class ProductionOrderRouteItemServiceImpl extends ServiceImpl<ProductionOrderRouteItemMapper, ProductionOrderRouteItem> implements IProductionOrderRouteItemService {
    @Resource
    private ProductProcessService productProcessService;
    @Resource
    private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService;
    private IProductionOrderRouteItemParamService productionOrderRouteItemParamService;
    @Resource
    private ProcessRouteItemParamService processRouteItemParamService;
    @Override
    public List<ProcessRouteItemInstanceDto> getProcessItem(Long orderId) {
        List<ProcessRouteItemInstance> list = list(new LambdaQueryWrapper<ProcessRouteItemInstance>()
                .eq(ProcessRouteItemInstance::getOrderId, orderId)
                .orderByAsc(ProcessRouteItemInstance::getDragSort));
    public List<ProductionOrderRouteItemDto> getProcessItem(Long orderId) {
        List<ProductionOrderRouteItem> list = list(new LambdaQueryWrapper<ProductionOrderRouteItem>()
                .eq(ProductionOrderRouteItem::getOrderId, orderId)
                .orderByAsc(ProductionOrderRouteItem::getDragSort));
        return list.stream().map(item -> {
            ProcessRouteItemInstanceDto dto = new ProcessRouteItemInstanceDto();
            ProductionOrderRouteItemDto dto = new ProductionOrderRouteItemDto();
            BeanUtils.copyProperties(item, dto);
            if (item.getProcessId() != null) {
                ProductProcess process = productProcessService.getById(item.getProcessId());
@@ -64,7 +63,7 @@
    }
    @Override
    public void addProcessItem(ProcessRouteItemInstanceDto dto) {
    public void addProcessItem(ProductionOrderRouteItemDto dto) {
        if (dto == null) {
            throw new ServiceException("新增数据不能为空");
        }
@@ -74,51 +73,51 @@
        if (dto.getProcessId() == null) {
            throw new ServiceException("工序ID不能为空");
        }
        ProcessRouteItemInstance entity = new ProcessRouteItemInstance();
        ProductionOrderRouteItem entity = new ProductionOrderRouteItem();
        BeanUtils.copyProperties(dto, entity);
        entity.setId(null);
        entity.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        entity.setCreateTime(LocalDateTime.now());
        //  å–当前订单下最大 dragSort + 1
        ProcessRouteItemInstance maxSortItem = getOne(new LambdaQueryWrapper<ProcessRouteItemInstance>()
                .eq(ProcessRouteItemInstance::getOrderId, dto.getOrderId())
                .orderByDesc(ProcessRouteItemInstance::getDragSort)
        ProductionOrderRouteItem maxSortItem = getOne(new LambdaQueryWrapper<ProductionOrderRouteItem>()
                .eq(ProductionOrderRouteItem::getOrderId, dto.getOrderId())
                .orderByDesc(ProductionOrderRouteItem::getDragSort)
                .last("limit 1"));
        entity.setDragSort(maxSortItem != null && maxSortItem.getDragSort() != null ? maxSortItem.getDragSort() + 1 : 1);
        save(entity);
    }
    @Override
    public void updateProcessItem(ProcessRouteItemInstanceDto dto) {
    public void updateProcessItem(ProductionOrderRouteItemDto dto) {
        if (dto == null || dto.getId() == null) {
            throw new ServiceException("更新数据或ID不能为空");
        }
        ProcessRouteItemInstance old = getById(dto.getId());
        ProductionOrderRouteItem old = getById(dto.getId());
        if (old == null) {
            throw new ServiceException("数据不存在");
        }
        // å·¥åºå˜æ›´ï¼Œåˆ é™¤æ—§å‚数附表,迁移新工序参数
        if (dto.getProcessId() != null && !dto.getProcessId().equals(old.getProcessId())) {
            // åˆ é™¤å·¥è‰ºè·¯çº¿å·¥åºå‚数附表
            processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
                    .eq(ProcessRouteItemParamInstance::getOrderId, old.getOrderId())
                    .eq(ProcessRouteItemParamInstance::getRouteItemId, old.getId()));
            productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
                    .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId())
                    .eq(ProductionOrderRouteItemParam::getRouteItemId, old.getId()));
            // è¿ç§»æ–°å·¥åºçš„ process_route_item_param
            List<ProcessRouteItemParam> routeItemParams = processRouteItemParamService.list(
                    new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId, old.getId()));
            if (!routeItemParams.isEmpty()) {
                List<ProcessRouteItemParamInstance> newInstances = routeItemParams.stream().map(p -> {
                    ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance();
                List<ProductionOrderRouteItemParam> newInstances = routeItemParams.stream().map(p -> {
                    ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam();
                    BeanUtils.copyProperties(p, instance, "id");
                    instance.setOrderId(old.getOrderId());
                    return instance;
                }).collect(Collectors.toList());
                processRouteItemParamInstanceService.saveBatch(newInstances);
                productionOrderRouteItemParamService.saveBatch(newInstances);
            }
        }
        ProcessRouteItemInstance entity = new ProcessRouteItemInstance();
        ProductionOrderRouteItem entity = new ProductionOrderRouteItem();
        BeanUtils.copyProperties(dto, entity);
        entity.setUpdateTime(LocalDateTime.now());
        updateById(entity);
@@ -129,35 +128,35 @@
        if (id == null) {
            throw new ServiceException("ID不能为空");
        }
        ProcessRouteItemInstance old = getById(id);
        ProductionOrderRouteItem old = getById(id);
        if (old == null) {
            throw new ServiceException("数据不存在");
        }
        // åˆ é™¤å·¥è‰ºè·¯çº¿å·¥åºå‚数附表
        processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>()
                .eq(ProcessRouteItemParamInstance::getOrderId, old.getOrderId())
                .eq(ProcessRouteItemParamInstance::getRouteItemId, id));
        productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
                .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId())
                .eq(ProductionOrderRouteItemParam::getRouteItemId, id));
        removeById(id);
    }
    @Override
    public void sortProcessItem(ProcessRouteItemInstanceDto dto) {
    public void sortProcessItem(ProductionOrderRouteItemDto dto) {
        if (dto == null || dto.getId() == null) {
            throw new ServiceException("数据或ID不能为空");
        }
        ProcessRouteItemInstance old = getById(dto.getId());
        ProductionOrderRouteItem old = getById(dto.getId());
        if (old == null) {
            throw new ServiceException("数据不存在");
        }
        List<ProcessRouteItemInstance> items = list(new LambdaQueryWrapper<ProcessRouteItemInstance>()
                .eq(ProcessRouteItemInstance::getOrderId, old.getOrderId())
                .orderByAsc(ProcessRouteItemInstance::getDragSort));
        List<ProductionOrderRouteItem> items = list(new LambdaQueryWrapper<ProductionOrderRouteItem>()
                .eq(ProductionOrderRouteItem::getOrderId, old.getOrderId())
                .orderByAsc(ProductionOrderRouteItem::getDragSort));
        Integer targetPosition = dto.getDragSort();
        if (targetPosition != null && targetPosition >= 1) {
            items.removeIf(item -> item.getId().equals(old.getId()));
            items.add(targetPosition - 1, old);
            for (int i = 0; i < items.size(); i++) {
                ProcessRouteItemInstance item = items.get(i);
                ProductionOrderRouteItem item = items.get(i);
                int newSort = i + 1;
                if (!item.getId().equals(old.getId())) {
                    if (!Integer.valueOf(newSort).equals(item.getDragSort())) {
src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,151 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.production.dto.ProductionOrderStructureDto;
import com.ruoyi.production.mapper.ProductionOrderStructureMapper;
import com.ruoyi.production.pojo.ProductionOrderStructure;
import com.ruoyi.production.service.IProductionOrderStructureService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的BOM子表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
@Slf4j
@Service
public class ProductionOrderStructureServiceImpl extends ServiceImpl<ProductionOrderStructureMapper, ProductionOrderStructure> implements IProductionOrderStructureService {
    @Override
    public List<ProductionOrderStructureDto> listByOrderId(Long orderId) {
        List<ProductionOrderStructure> list = list(new LambdaQueryWrapper<ProductionOrderStructure>().eq(ProductionOrderStructure::getOrderId, orderId));
        List<ProductionOrderStructureDto> dtoList = list.stream().map(item -> {
            ProductionOrderStructureDto dto = new ProductionOrderStructureDto();
            BeanUtils.copyProperties(item, dto);
            return dto;
        }).collect(Collectors.toList());
        Map<Long, ProductionOrderStructureDto> map = new HashMap<>();
        for (ProductionOrderStructureDto node : dtoList) {
            map.put(node.getId(), node);
        }
        List<ProductionOrderStructureDto> tree = new ArrayList<>();
        for (ProductionOrderStructureDto node : dtoList) {
            Long parentId = node.getParentId();
            if (parentId == null || !map.containsKey(parentId)) {
                tree.add(node);
            } else {
                map.get(parentId).getChildren().add(node);
            }
        }
        return tree;
    }
    @Override
    public void addOrUpdateBomStructs(ProductionOrderStructureDto instanceDto) {
        Long orderId = instanceDto.getOrderId();
        // æ‰å¹³åŒ–前端传入的树
        List<ProductionOrderStructureDto> flatList = new ArrayList<>();
        flattenTree(instanceDto.getChildren(), flatList);
        // æŸ¥è¯¢æ•°æ®åº“已有数据
        List<ProductionOrderStructure> dbList = list(new LambdaQueryWrapper<ProductionOrderStructure>()
                .eq(ProductionOrderStructure::getOrderId, orderId));
        // å‰ç«¯å·²æœ‰id集合
        Set<Long> frontendIds = flatList.stream()
                .map(ProductionOrderStructureDto::getId)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        // éœ€è¦åˆ é™¤çš„节点
        Set<Long> deleteIds = dbList.stream()
                .map(ProductionOrderStructure::getId)
                .filter(id -> !frontendIds.contains(id))
                .collect(Collectors.toSet());
        if (!deleteIds.isEmpty()) {
            removeByIds(deleteIds);
        }
        List<ProductionOrderStructure> insertList = new ArrayList<>();
        List<ProductionOrderStructure> updateList = new ArrayList<>();
        Map<String, ProductionOrderStructure> tempEntityMap = new HashMap<>();
        for (ProductionOrderStructureDto dto : flatList) {
            ProductionOrderStructure entity = new ProductionOrderStructure();
            BeanUtils.copyProperties(dto, entity);
            entity.setOrderId(orderId);
            if (dto.getId() == null) {
                entity.setId(null);
                entity.setParentId(null);
                insertList.add(entity);
                if (dto.getTempId() != null) {
                    tempEntityMap.put(dto.getTempId(), entity);
                }
            } else {
                updateList.add(entity);
            }
        }
        if (!insertList.isEmpty()) {
            saveBatch(insertList);
        }
        // å›žå†™æ–°å¢žèŠ‚ç‚¹çš„ parentId
        List<ProductionOrderStructure> parentFixList = new ArrayList<>();
        for (ProductionOrderStructureDto dto : flatList) {
            if (dto.getId() != null) continue;
            ProductionOrderStructure child = tempEntityMap.get(dto.getTempId());
            if (child == null) continue;
            String parentTempId = dto.getParentTempId();
            if (parentTempId != null && !parentTempId.isEmpty()) {
                Long realParentId;
                if (tempEntityMap.containsKey(parentTempId)) {
                    realParentId = tempEntityMap.get(parentTempId).getId();
                } else {
                    try {
                        realParentId = Long.valueOf(parentTempId);
                    } catch (NumberFormatException e) {
                        realParentId = 0L;
                    }
                }
                child.setParentId(realParentId);
            } else {
                child.setParentId(0L);
            }
            parentFixList.add(child);
        }
        if (!parentFixList.isEmpty()) {
            updateBatchById(parentFixList);
        }
        if (!updateList.isEmpty()) {
            updateBatchById(updateList);
        }
    }
    private void flattenTree(List<ProductionOrderStructureDto> source, List<ProductionOrderStructureDto> result) {
        if (source == null) return;
        for (ProductionOrderStructureDto node : source) {
            result.add(node);
            flattenTree(node.getChildren(), result);
        }
    }
}
src/main/resources/mapper/production/ProductionOrderRouteItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.production.mapper.ProductionOrderRouteItemMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionOrderRouteItem">
        <id column="id" property="id"/>
        <result column="order_id" property="orderId"/>
        <result column="route_id" property="routeId"/>
        <result column="product_model_id" property="productModelId"/>
        <result column="process_id" property="processId"/>
        <result column="tenant_id" property="tenantId"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="drag_sort" property="dragSort"/>
        <result column="is_quality" property="isQuality"/>
    </resultMap>
</mapper>
src/main/resources/mapper/production/ProductionOrderRouteItemParamMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.production.mapper.ProductionOrderRouteItemParamMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionOrderRouteItemParam">
        <id column="id" property="id"/>
        <result column="order_id" property="orderId"/>
        <result column="route_item_id" property="routeItemId"/>
        <result column="process_param_id" property="processParamId"/>
        <result column="param_key" property="paramKey"/>
        <result column="param_name" property="paramName"/>
        <result column="param_type" property="paramType"/>
        <result column="param_format" property="paramFormat"/>
        <result column="value_mode" property="valueMode"/>
        <result column="unit" property="unit"/>
        <result column="remark" property="remark"/>
        <result column="standard_value" property="standardValue"/>
        <result column="min_value" property="minValue"/>
        <result column="max_value" property="maxValue"/>
        <result column="is_required" property="isRequired"/>
        <result column="sort" property="sort"/>
        <result column="tenant_id" property="tenantId"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
    </resultMap>
</mapper>
src/main/resources/mapper/production/ProductionOrderStructureMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.production.mapper.ProductionOrderStructureMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionOrderStructure">
        <id column="id" property="id"/>
        <result column="order_id" property="orderId"/>
        <result column="parent_id" property="parentId"/>
        <result column="product_model_id" property="productModelId"/>
        <result column="process_id" property="processId"/>
        <result column="unit_quantity" property="unitQuantity"/>
        <result column="demanded_quantity" property="demandedQuantity"/>
        <result column="unit" property="unit"/>
        <result column="tenant_id" property="tenantId"/>
        <result column="bom_id" property="bomId"/>
    </resultMap>
</mapper>