已添加23个文件
已重命名2个文件
已修改13个文件
已删除22个文件
2884 ■■■■ 文件已修改
doc/宁夏-中盛建材.sql 171 ●●●● 补丁 | 查看 | 原始文档 | 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/ProcessRouteItemInstanceServiceImpl.java 174 ●●●●● 补丁 | 查看 | 原始文档 | 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/ProductOrderController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductStructureController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderAppendixController.java 39 ●●●●● 补丁 | 查看 | 原始文档 | 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/ProductOrderSourceDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | 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 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | 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 21 ●●●●● 补丁 | 查看 | 原始文档 | 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/ProductOrderService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductStructureService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | 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 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProcessRouteMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductOrderMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductStructureMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | 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 35 ●●●●● 补丁 | 查看 | 原始文档 | 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`;
@@ -423,4 +334,84 @@
    ADD COLUMN `param_format` varchar(255) DEFAULT NULL COMMENT '参数格式',
    ADD COLUMN `value_mode`   tinyint      DEFAULT '1' COMMENT '值模式(1单值 2区间)',
    ADD COLUMN `unit`         varchar(50)  DEFAULT NULL COMMENT '单位',
    ADD COLUMN `remark`       varchar(255) DEFAULT NULL COMMENT '备注';
    ADD COLUMN `remark`       varchar(255) DEFAULT NULL COMMENT '备注';
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`,
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/ProcessRouteItemInstanceServiceImpl.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/ProductOrderController.java
@@ -1,13 +1,13 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.dto.ProductOrderSourceDto;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.ProductOrderService;
import io.swagger.annotations.Api;
@@ -16,7 +16,6 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
@RequestMapping("/productOrder")
@@ -48,8 +47,14 @@
    @PostMapping("/revoke")
    @ApiOperation("撤回生产计划")
    public R revoke(@RequestBody ProductOrder productOrder) {
        return R.ok(productOrderService.revoke(productOrder));
    public R revoke(@RequestBody List<Long> ids) {
        return R.ok(productOrderService.revoke(ids));
    }
    @ApiOperation("删除生产订单")
    @DeleteMapping("/{id}")
    public R delete(@PathVariable("id") Long ids) {
        return R.ok(productOrderService.delete(ids));
    }
    /**
@@ -76,9 +81,11 @@
        return R.ok(productOrderService.addProductOrder(productOrder));
    }
    @ApiOperation("删除生产订单")
    @DeleteMapping("/{ids}")
    public R delete(@PathVariable("ids") Long[] ids) {
        return R.ok(productOrderService.delete(ids));
    @GetMapping("/productOrderSource/{orderId}")
    @ApiOperation("查看生产订单对应的生产计划")
    public AjaxResult productOrderSource(@PathVariable Long orderId) {
        List<ProductOrderSourceDto> list = productOrderService.productOrderSource(orderId);
        return AjaxResult.success(list);
    }
}
src/main/java/com/ruoyi/production/controller/ProductStructureController.java
@@ -17,6 +17,7 @@
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
@RequestMapping("productStructure")
@RestController
@@ -27,9 +28,9 @@
    @ApiOperation("新增BOM子集")
    @PostMapping()
    public R addOrUpdate(@RequestBody ProductStructureDto productStructureDto){
        return R.ok(productStructureService.addProductStructureDto(productStructureDto));
    @PostMapping("/{bomId}")
    public R addOrUpdate(@PathVariable Integer bomId, @RequestBody List<ProductStructureDto> list){
        return R.ok(productStructureService.addProductStructureDto(bomId, list));
    }
    @ApiOperation("BOM查看子集详情")
src/main/java/com/ruoyi/production/controller/ProductionOrderAppendixController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.production.controller;
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/{orderId}")
    @ApiOperation("新增/更新BOM子集结构")
    public AjaxResult addOrUpdateBomStructs(@PathVariable Long orderId, @RequestBody List<ProductionOrderStructureDto> list) {
        productionOrderStructureService.addOrUpdateBomStructs(orderId, list);
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/production/dto/ProductOrderSourceDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.production.dto;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * <br>
 * ç”Ÿäº§è®¢å•来源-主生产计划
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/20
 */
@Data
@ApiModel(value = "ProductOrderSourceDto", description = "生产订单来源-主生产计划")
public class ProductOrderSourceDto {
    @ApiModelProperty("申请单编号")
    private String applyNo;
    @ApiModelProperty("主生产计划数据")
    private List<ProductionPlanDto> productPlans;
}
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,42 @@
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;
    @ApiModelProperty("工序名称")
    private String processName;
    @ApiModelProperty("产品名称")
    private String productName;
    @ApiModelProperty("产品规格")
    private String model;
}
src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java
@@ -43,13 +43,20 @@
    }
    /**
     * åˆ¤æ–­æ˜¯å¦å…è®¸åˆ é™¤ï¼ˆ1、4)
     * åˆ¤æ–­æ˜¯å¦å…è®¸åˆ é™¤ï¼ˆ4)
     */
    public static boolean canDelete(Integer code) {
        return WAIT.getCode().equals(code) || CANCEL.getCode().equals(code);
    }
    /**
     * åˆ¤æ–­æ˜¯å¦å…è®¸æ’¤å›žï¼ˆ1)
     */
    public static boolean canRevoke(Integer code) {
        return WAIT.getCode().equals(code);
    }
    /**
     * åˆ¤æ–­æ˜¯å¦å·²å¼€å§‹ç”Ÿäº§ï¼ˆ2、3)
     */
    public static boolean isStarted(Integer code) {
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
@@ -3,8 +3,8 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductOrderSourceDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProductOrder;
@@ -27,4 +27,6 @@
    Integer countCompleted(@Param("startDate") String startDate, @Param("endDate") String endDate);
    Integer countPending(@Param("startDate") String startDate, @Param("endDate") String endDate);
    List<ProductOrderSourceDto> productOrderSource(@Param("orderId") Long orderId);
}
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,21 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.dto.ProductionOrderStructureDto;
import com.ruoyi.production.pojo.ProductionOrderStructure;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的BOM子表 Mapper æŽ¥å£
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
public interface ProductionOrderStructureMapper extends BaseMapper<ProductionOrderStructure> {
    List<ProductionOrderStructureDto> listByOrderId(Long orderId);
}
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(Long orderId, List<ProductionOrderStructureDto> list);
}
src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -3,8 +3,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductOrderSourceDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProductOrder;
@@ -21,7 +21,7 @@
    /**
     * æ’¤å›žç”Ÿäº§è®¡åˆ’
     */
    Boolean revoke(ProductOrder productOrder);
    Boolean revoke(List<Long> ids);
    List<ProcessRoute> listProcessRoute(Long productModelId);
@@ -31,5 +31,7 @@
    Long insertProductOrder(ProductOrder productOrder);
    Boolean delete(Long[] id);
    Boolean delete(Long id);
    List<ProductOrderSourceDto> productOrderSource(Long orderId);
}
src/main/java/com/ruoyi/production/service/ProductStructureService.java
@@ -10,7 +10,7 @@
public interface ProductStructureService extends IService<ProductStructure> {
    Boolean addProductStructureDto(ProductStructureDto productStructureDto);
    Boolean addProductStructureDto(Integer bomId, List<ProductStructureDto> list);
    List<ProductStructureDto> listByBomId(Integer bomId);
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -1,19 +1,20 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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.procurementrecord.utils.StockUtils;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductOrderSourceDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.enums.ProductOrderStatusEnum;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.IProductionOrderAppendixService;
import com.ruoyi.production.service.ProductOrderService;
import com.ruoyi.productionPlan.mapper.ProductOrderPlanMapper;
import com.ruoyi.productionPlan.mapper.ProductionPlanMapper;
@@ -76,7 +77,7 @@
    private StockUtils stockUtils;
    @Autowired
    private AppendixService appendixService;
    private IProductionOrderAppendixService productionOrderAppendixService;
    @Override
    public IPage<ProductOrderDto> pageProductOrder(Page<ProductOrder> page, ProductOrderDto productOrder) {
@@ -137,25 +138,48 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean revoke(ProductOrder productOrder) {
        // todo åˆ¤æ–­æ˜¯å¦äº§ç”ŸæŠ¥å·¥ä¿¡æ¯
        // æŸ¥è¯¢åˆå¹¶çš„生产计划
        List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, productOrder.getId()));
        if (productOrderPlans.isEmpty()) {
            throw new RuntimeException("合并的生产计划不存在");
    public Boolean revoke(List<Long> ids) {
        List<ProductOrder> orders = productOrderMapper.selectBatchIds(ids);
        if (orders.isEmpty()) {
            throw new RuntimeException("生产订单不存在");
        }
        for (ProductOrder order : orders) {
            if (!ProductOrderStatusEnum.canRevoke(order.getStatus())) {
                throw new RuntimeException("只有【待开始】状态的订单才可以撤回");
            }
        }
        // å›žé€€ç”Ÿäº§è®¡åˆ’
        List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids));
        for (ProductOrderPlan productOrderPlan : productOrderPlans) {
            ProductionPlan productionPlan = productionPlanMapper.selectById(productOrderPlan.getProductionPlanId());
            productionPlan.setAssignedQuantity(productionPlan.getAssignedQuantity().subtract(productOrderPlan.getAssignedQuantity()));
            productionPlanMapper.updateById(productionPlan);
            if (productionPlan != null) {
                BigDecimal newAssigned = productionPlan.getAssignedQuantity().subtract(productOrderPlan.getAssignedQuantity());
                if (newAssigned.compareTo(BigDecimal.ZERO) < 0) {
                    newAssigned = BigDecimal.ZERO;
                }
                productionPlan.setAssignedQuantity(newAssigned);
                BigDecimal volume = productionPlan.getVolume() == null ? BigDecimal.ZERO : productionPlan.getVolume();
                int status;
                if (newAssigned.compareTo(BigDecimal.ZERO) == 0) {
                    status = 0; // æœªä¸‹å‘
                } else if (newAssigned.compareTo(volume) < 0) {
                    status = 1; // éƒ¨åˆ†ä¸‹å‘
                } else {
                    status = 2; // å·²ä¸‹å‘
                }
                productionPlan.setStatus(status);
                productionPlanMapper.updateById(productionPlan);
            }
        }
        // åˆ é™¤å…³è”关系
        productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, productOrder.getId()));
        // åˆ é™¤è®¢å•
        productOrderMapper.deleteById(productOrder.getId());
        // todo åˆ é™¤è®¢å•下的工艺路线子表
        return null;
        // å°†è®¢å•状态改为已取消
        for (ProductOrder order : orders) {
            order.setStatus(ProductOrderStatusEnum.CANCEL.getCode());
        }
        updateBatchById(orders);
        return true;
    }
    @Override
@@ -192,20 +216,18 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean delete(Long[] ids) {
        List<ProductOrder> orders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getId, ids));
    public Boolean delete(Long id) {
        ProductOrder order = productOrderMapper.selectById(id);
        if (orders.isEmpty()) {
        if (order == null) {
            throw new RuntimeException("生产订单不存在");
        }
        for (ProductOrder order : orders) {
            if (!ProductOrderStatusEnum.canDelete(order.getStatus())) {
                throw new RuntimeException("只有【待开始、已取消】状态的订单才可以删除");
            }
        if (!ProductOrderStatusEnum.canDelete(order.getStatus())) {
            throw new RuntimeException("只有【待开始、已取消】状态的订单才可以删除");
        }
        //  æ˜¯å¦å·²ç”Ÿäº§
        List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids));
        List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().eq(ProductWorkOrder::getProductOrderId, id));
        if (!productWorkOrders.isEmpty()) {
            List<Long> workOrderIds = productWorkOrders.stream()
@@ -218,11 +240,11 @@
            }
            //  åˆ é™¤å·¥å•
            productWorkOrderMapper.delete(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids));
            productWorkOrderMapper.delete(Wrappers.<ProductWorkOrder>lambdaQuery().eq(ProductWorkOrder::getProductOrderId, id));
        }
        //  å›žé€€ç”Ÿäº§è®¡åˆ’
        List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids));
        List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().eq(ProductOrderPlan::getProductOrderId, id));
        for (ProductOrderPlan productOrderPlan : productOrderPlans) {
            ProductionPlan productionPlan = productionPlanMapper.selectById(productOrderPlan.getProductionPlanId());
@@ -253,19 +275,13 @@
        }
        // åˆ é™¤ä¸­é—´è¡¨
        productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids));
        productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().eq(ProductOrderPlan::getProductOrderId, id));
        //  åˆ é™¤é™„表的工艺路线与BOM
        for (Long id : ids) {
            ProductOrder productOrder = baseMapper.selectById(id);
            appendixService.deleteData(productOrder.getId(), productOrder.getRouteId());
        }
//        productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().in(ProductProcessRouteItem::getProductOrderId, ids));
//        productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>().in(ProductProcessRoute::getProductOrderId, ids));
        productionOrderAppendixService.deleteData(order.getId(), order.getRouteId());
        //  åˆ é™¤è®¢å•
        productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>().in(ProductOrder::getId, ids));
        productOrderMapper.deleteById(id);
        return true;
    }
@@ -300,5 +316,17 @@
        return "SC" + datePrefix + String.format("%04d", sequence);
    }
    @Override
    public List<ProductOrderSourceDto> productOrderSource(Long orderId) {
        if (orderId == null) {
            throw new ServiceException("查询订单数据不能为空");
        }
        ProductOrder productOrder = getById(orderId);
        if (productOrder == null) {
            throw new ServiceException("查询失败,生产订单不存在");
        }
        List<ProductOrderSourceDto> list = baseMapper.productOrderSource(orderId);
        return list;
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
@@ -25,13 +25,14 @@
    @Override
    @Transactional
    public Boolean addProductStructureDto(ProductStructureDto dto) {
    public Boolean addProductStructureDto(Integer bomId, List<ProductStructureDto> list) {
        Integer bomId = dto.getBomId();
        //  å°†æ ‘扁平化
        // æ‰å¹³åŒ–传入的树
        List<ProductStructureDto> flatDtoList = new ArrayList<>();
        flattenTree(dto.getChildren(), flatDtoList);
        for (ProductStructureDto root : list) {
            flatDtoList.add(root);
            flattenTree(root.getChildren(), flatDtoList);
        }
        //  æŸ¥è¯¢æ•°æ®åº“中已有的 BOM æ•°æ®
        List<ProductStructure> dbList = this.list(new LambdaQueryWrapper<ProductStructure>().eq(ProductStructure::getBomId, bomId));
@@ -65,13 +66,13 @@
            entity.setBomId(bomId);
            if (psDto.getId() == null) {
                // æ–°å¢ž
                entity.setId(null);
                entity.setParentId(null);
                insertList.add(entity);
                tempEntityMap.put(psDto.getTempId(), entity);
                if (psDto.getTempId() != null) {
                    tempEntityMap.put(psDto.getTempId(), entity);
                }
            } else {
                // æ›´æ–°
                updateList.add(entity);
            }
        }
@@ -83,32 +84,27 @@
        //  å›žå†™æ–°å¢žèŠ‚ç‚¹ parentId
        List<ProductStructure> parentFixList = new ArrayList<>();
        //  çœŸå®žçš„父节点 ID
        Long realParentId;
        for (ProductStructureDto psDto : flatDtoList) {
            if (psDto.getId() != null) continue;
            ProductStructure child = tempEntityMap.get(psDto.getTempId());
            if (child == null) continue;
            String parentTempId = psDto.getParentTempId();
            if (psDto.getId() == null && parentTempId != null && !parentTempId.isEmpty()) {
                ProductStructure child = tempEntityMap.get(psDto.getTempId());
            if (parentTempId != null && !parentTempId.isEmpty()) {
                if (tempEntityMap.containsKey(parentTempId)) {
                    // çˆ¶èŠ‚ç‚¹æ˜¯æ–°èŠ‚ç‚¹
                    realParentId = tempEntityMap.get(parentTempId).getId();
                } else {
                    // çˆ¶èŠ‚ç‚¹æ˜¯è€èŠ‚ç‚¹
                    try {
                        realParentId = Long.valueOf(parentTempId);
                    } catch (NumberFormatException e) {
                        realParentId = 0L;
                    }
                }
                child.setParentId(realParentId);
                parentFixList.add(child);
            } else if (psDto.getId() == null) {
                // å¦‚æžœ parentTempId ä¸ºç©ºï¼Œåˆ™æ˜¯é¡¶çº§èŠ‚ç‚¹
                ProductStructure child = tempEntityMap.get(psDto.getTempId());
            } else {
                child.setParentId(0L);
                parentFixList.add(child);
            }
            parentFixList.add(child);
        }
        if (!parentFixList.isEmpty()) {
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
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,190 @@
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.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.ProductProcess;
import com.ruoyi.production.pojo.ProductProcessParam;
import com.ruoyi.production.pojo.ProductionOrderRouteItem;
import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
import com.ruoyi.production.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
 * ç”Ÿäº§è®¢å•绑定的工艺路线--工序表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author deslrey
 * @since 2026-03-20
 */
@Slf4j
@Service
public class ProductionOrderRouteItemServiceImpl extends ServiceImpl<ProductionOrderRouteItemMapper, ProductionOrderRouteItem> implements IProductionOrderRouteItemService {
    @Resource
    private ProductProcessService productProcessService;
    @Resource
    private IProductionOrderRouteItemParamService productionOrderRouteItemParamService;
    @Resource
    private ProcessRouteItemParamService processRouteItemParamService;
    @Resource
    private ProductProcessParamService productProcessParamService;
    @Override
    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 -> {
            ProductionOrderRouteItemDto dto = new ProductionOrderRouteItemDto();
            BeanUtils.copyProperties(item, dto);
            if (item.getProcessId() != null) {
                ProductProcess process = productProcessService.getById(item.getProcessId());
                if (process != null) {
                    dto.setProcessName(process.getName());
                }
            }
            return dto;
        }).collect(Collectors.toList());
    }
    @Override
    public void addProcessItem(ProductionOrderRouteItemDto dto) {
        if (dto == null) {
            throw new ServiceException("新增数据不能为空");
        }
        if (dto.getOrderId() == null) {
            throw new ServiceException("生产订单ID不能为空");
        }
        if (dto.getProcessId() == null) {
            throw new ServiceException("工序ID不能为空");
        }
        ProductionOrderRouteItem entity = new ProductionOrderRouteItem();
        BeanUtils.copyProperties(dto, entity);
        entity.setId(null);
        entity.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        entity.setCreateTime(LocalDateTime.now());
        //  å–当前订单下最大 dragSort + 1
        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);
        // è¿ç§»è¯¥å·¥åºçš„基础参数
        List<ProductProcessParam> processParams = productProcessParamService.list(
                new LambdaQueryWrapper<ProductProcessParam>().eq(ProductProcessParam::getProcessId, dto.getProcessId()));
        if (!processParams.isEmpty()) {
            List<ProductionOrderRouteItemParam> orderParams = processParams.stream().map(p -> {
                ProductionOrderRouteItemParam op = new ProductionOrderRouteItemParam();
                BeanUtils.copyProperties(p, op, "id");
                op.setOrderId(dto.getOrderId());
                op.setRouteItemId(entity.getId());
                op.setProcessParamId(p.getId());
                return op;
            }).collect(Collectors.toList());
            productionOrderRouteItemParamService.saveBatch(orderParams);
        }
    }
    @Override
    public void updateProcessItem(ProductionOrderRouteItemDto dto) {
        if (dto == null || dto.getId() == null) {
            throw new ServiceException("更新数据或ID不能为空");
        }
        ProductionOrderRouteItem old = getById(dto.getId());
        if (old == null) {
            throw new ServiceException("数据不存在");
        }
        // å·¥åºå˜æ›´ï¼Œåˆ é™¤æ—§å‚数附表,迁移新工序参数
        if (dto.getProcessId() != null && !dto.getProcessId().equals(old.getProcessId())) {
            // åˆ é™¤å·¥è‰ºè·¯çº¿å·¥åºå‚数附表
            productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
                    .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId())
                    .eq(ProductionOrderRouteItemParam::getRouteItemId, old.getId()));
            // è¿ç§»æ–°å·¥åºçš„ product_process_param
            List<ProductProcessParam> processParams = productProcessParamService.list(
                    new LambdaQueryWrapper<ProductProcessParam>().eq(ProductProcessParam::getProcessId, dto.getProcessId()));
            if (!processParams.isEmpty()) {
                List<ProductionOrderRouteItemParam> newInstances = processParams.stream().map(p -> {
                    ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam();
                    BeanUtils.copyProperties(p, instance, "id");
                    instance.setOrderId(old.getOrderId());
                    instance.setRouteItemId(old.getId());
                    instance.setProcessParamId(p.getId());
                    return instance;
                }).collect(Collectors.toList());
                productionOrderRouteItemParamService.saveBatch(newInstances);
            }
        }
        ProductionOrderRouteItem entity = new ProductionOrderRouteItem();
        BeanUtils.copyProperties(dto, entity);
        entity.setUpdateTime(LocalDateTime.now());
        updateById(entity);
    }
    @Override
    public void deleteProcessItem(Long id) {
        if (id == null) {
            throw new ServiceException("ID不能为空");
        }
        ProductionOrderRouteItem old = getById(id);
        if (old == null) {
            throw new ServiceException("数据不存在");
        }
        // åˆ é™¤å·¥è‰ºè·¯çº¿å·¥åºå‚数附表
        productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
                .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId())
                .eq(ProductionOrderRouteItemParam::getRouteItemId, id));
        removeById(id);
    }
    @Override
    public void sortProcessItem(ProductionOrderRouteItemDto dto) {
        if (dto == null || dto.getId() == null) {
            throw new ServiceException("数据或ID不能为空");
        }
        ProductionOrderRouteItem old = getById(dto.getId());
        if (old == null) {
            throw new ServiceException("数据不存在");
        }
        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++) {
                ProductionOrderRouteItem item = items.get(i);
                int newSort = i + 1;
                if (!item.getId().equals(old.getId())) {
                    if (!Integer.valueOf(newSort).equals(item.getDragSort())) {
                        item.setDragSort(newSort);
                        updateById(item);
                    }
                } else {
                    old.setDragSort(newSort);
                    updateById(old);
                }
            }
        }
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,145 @@
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.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<ProductionOrderStructureDto> dtoList = baseMapper.listByOrderId(orderId);
        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(Long orderId, List<ProductionOrderStructureDto> list) {
        // æ‰å¹³åŒ–前端传入的树
        List<ProductionOrderStructureDto> flatList = new ArrayList<>();
        for (ProductionOrderStructureDto root : list) {
            flatList.add(root);
            flattenTree(root.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();
            org.springframework.beans.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<>();
        Long realParentId;
        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()) {
                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/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -7,7 +7,6 @@
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;
@@ -18,6 +17,7 @@
import com.ruoyi.production.enums.ProductOrderStatusEnum;
import com.ruoyi.production.pojo.ProductMaterialSku;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.IProductionOrderAppendixService;
import com.ruoyi.production.service.ProductMaterialService;
import com.ruoyi.production.service.ProductMaterialSkuService;
import com.ruoyi.production.service.ProductOrderService;
@@ -79,7 +79,7 @@
    private ProductMaterialService productMaterialService;
    @Autowired
    private AppendixService appendixService;
    private IProductionOrderAppendixService productionOrderAppendixService;
    /**
     * åŒæ­¥é”ï¼Œç¡®ä¿æ‰‹åŠ¨å’Œå®šæ—¶ä»»åŠ¡ä¸åŒæ—¶æ‰§è¡Œ
@@ -153,10 +153,10 @@
        //  å½“下发的产品为砌块或板材,就拉取BOM子集与工艺路线子集数据存入到附表中
        if ("砌块".equals(productionPlanDto.getProductName())) {
            productOrder.setRouteId(appendixService.populateBlocks(orderId, productionPlanDto));
            productOrder.setRouteId(productionOrderAppendixService.populateBlocks(orderId, productionPlanDto));
        }
        if ("板材".equals(productionPlanDto.getProductName())) {
            productOrder.setRouteId(appendixService.populatePlates(orderId, productionPlanDto));
            productOrder.setRouteId(productionOrderAppendixService.populatePlates(orderId, productionPlanDto));
        }
        //  æ›´æ–°ç»‘定的工艺路线
        productOrderService.updateById(productOrder);
@@ -181,11 +181,9 @@
            if (assignedVolume.add(remainingVolume).compareTo(productionPlanDto.getTotalAssignedQuantity()) >= 0) {
                // æœ€åŽä¸€ä¸ªè®¡åˆ’,分配剩余方数
                BigDecimal lastRemainingVolume = productionPlanDto.getTotalAssignedQuantity().subtract(assignedVolume);
                plan.setStatus(1);
                plan.setAssignedQuantity(plan.getAssignedQuantity().add(lastRemainingVolume));
                if (plan.getAssignedQuantity().compareTo(plan.getVolume()) >= 0) {
                    plan.setStatus(2);
                }
                BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(lastRemainingVolume);
                plan.setAssignedQuantity(assignedQuantity);
                plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1);
                productOrderPlan.setAssignedQuantity(lastRemainingVolume);
                productionPlanMapper.updateById(plan);
                productOrderPlanMapper.insert(productOrderPlan);
@@ -193,11 +191,9 @@
            }
            // åˆ†é…å½“前计划方数
            plan.setStatus(1);
            if (remainingVolume.compareTo(BigDecimal.ZERO) <= 0) {
                plan.setStatus(2);
            }
            plan.setAssignedQuantity(plan.getAssignedQuantity().add(remainingVolume));
            BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(remainingVolume);
            plan.setAssignedQuantity(assignedQuantity);
            plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1);
            productOrderPlan.setAssignedQuantity(remainingVolume);
            // æ›´æ–°ç”Ÿäº§è®¡åˆ’
            productionPlanMapper.updateById(plan);
@@ -205,6 +201,19 @@
            productOrderPlanMapper.insert(productOrderPlan);
            assignedVolume = assignedVolume.add(remainingVolume);
        }
        for (ProductionPlan plan : plans) {
            BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO);
            BigDecimal volume = Optional.ofNullable(plan.getVolume()).orElse(BigDecimal.ZERO);
            if (assignedQuantity.compareTo(BigDecimal.ZERO) <= 0) {
                plan.setStatus(0);
            } else if (assignedQuantity.compareTo(volume) >= 0) {
                plan.setStatus(2);
            } else {
                plan.setStatus(1);
            }
            productionPlanMapper.updateById(plan);
        }
        return true;
    }
src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/production/ProcessRouteMapper.xml
@@ -26,25 +26,31 @@
        <if test="c.dictCode != null">
            and ps.dict_code = #{c.dictCode}
        </if>
        <if test="c.status != null">
            and ps.status = #{c.status}
        </if>
        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)
        WHERE
        pr.status = 1
        and
        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>
src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -14,6 +14,19 @@
        <result property="status" column="status"/>
    </resultMap>
    <resultMap id="ProductOrderSourceMap" type="com.ruoyi.production.dto.ProductOrderSourceDto">
        <id property="applyNo" column="apply_no"/>
        <result property="applyNo" column="apply_no"/>
        <collection property="productPlans" ofType="com.ruoyi.productionPlan.dto.ProductionPlanDto" autoMapping="true">
            <id property="id" column="plan_id"/>
            <result property="materialCode" column="material_code"/>
            <result property="productName" column="product_name"/>
            <result property="model" column="model"/>
            <result property="unit" column="unit"/>
            <result property="totalAssignedQuantity" column="total_assigned_quantity"/>
        </collection>
    </resultMap>
    <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
        SELECT
        po.id,
@@ -40,7 +53,11 @@
        FROM product_order po
        LEFT JOIN process_route pr ON po.route_id = pr.id
        LEFT JOIN product_bom pb ON pr.bom_id = pb.id
        LEFT JOIN product_order_plan pop ON po.id = pop.product_order_id
        LEFT JOIN (
        SELECT product_order_id, MIN(production_plan_id) AS production_plan_id
        FROM product_order_plan
        GROUP BY product_order_id
        ) pop ON po.id = pop.product_order_id
        LEFT JOIN production_plan pp ON pop.production_plan_id = pp.id
        LEFT JOIN product_material_sku pms ON pms.id = pp.product_material_sku_id
        LEFT JOIN product_material pm ON pm.id = pms.product_id
@@ -104,4 +121,25 @@
          AND create_time &lt;= #{endDate}
          AND complete_quantity &lt; quantity
    </select>
    <select id="productOrderSource" resultMap="ProductOrderSourceMap"
            parameterType="java.lang.Long">
        SELECT pp.id                 AS plan_id,
               pp.apply_no,
               pp.*,
               pop.assigned_quantity AS total_assigned_quantity,
               sku.material_code,
               sku.model,
               pm.product_name,
               pm.unit
        FROM product_order_plan pop
                 LEFT JOIN production_plan pp ON pop.production_plan_id = pp.id
                 LEFT JOIN product_material_sku sku ON pp.product_material_sku_id = sku.id
                 LEFT JOIN product_material pm ON sku.product_id = pm.id
        WHERE pop.product_order_id = #{orderId}
        ORDER BY pp.apply_no
    </select>
</mapper>
src/main/resources/mapper/production/ProductStructureMapper.xml
@@ -20,7 +20,7 @@
               ps.process_id,
               pp.name         AS process_name,
               pm.product_name AS productName,
               pm.unit,
               ps.unit,
               pms.model
        FROM product_structure ps
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,35 @@
<?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>
    <select id="listByOrderId" resultType="com.ruoyi.production.dto.ProductionOrderStructureDto"
            parameterType="java.lang.Long">
        SELECT s.*,
               pp.name        AS process_name,
               pm.product_name AS product_name,
               sku.model       AS model
        FROM production_order_structure s
                 LEFT JOIN product_process pp ON pp.id = s.process_id
                 LEFT JOIN product_material_sku sku ON sku.id = s.product_model_id
                 LEFT JOIN product_material pm ON pm.id = sku.product_id
        WHERE s.order_id = #{orderId}
    </select>
</mapper>