-- ===================================================== -- 连续制造业改进 SQL 脚本 -- 作者: 周启威 -- 日期: 2025-11-11 -- 说明: 支持连续制造业的生产报工流程 -- ===================================================== -- ===================================================== -- 第一部分:物料表改动 -- ===================================================== -- 1. 物料表新增字段 ALTER TABLE `md_material` ADD COLUMN `manufacture_type` VARCHAR(20) DEFAULT 'DISCRETE' COMMENT '制造类型: DISCRETE-离散, CONTINUOUS-连续', ADD COLUMN `report_mode` VARCHAR(20) COMMENT '报工模式: PROCESS-按工序, TIME-按时间, SHIFT-按班次, QUANTITY-按产量, BATCH-按批次'; -- 2. 创建索引 CREATE INDEX `idx_manufacture_type` ON `md_material`(`manufacture_type`); -- 3. 为现有数据设置默认值(第一条SQL物料设置为连续制造业,第二条SQL物料设置为离散制造业) -- UPDATE `md_material` SET `manufacture_type` = 'DISCRETE' WHERE `manufacture_type` IS NULL; -- UPDATE `md_material` SET `manufacture_type` = 'CONTINUOUS' WHERE `manufacture_type` IS NULL; -- ===================================================== -- 第二部分:工单表改动 -- ===================================================== -- 1. 工单表新增字段 ALTER TABLE `pro_workorder` ADD COLUMN `manufacture_type` VARCHAR(20) DEFAULT 'DISCRETE' COMMENT '制造类型: DISCRETE-离散, CONTINUOUS-连续', ADD COLUMN `report_mode` VARCHAR(20) DEFAULT 'PROCESS' COMMENT '报工模式: PROCESS-按工序, TIME-按时间, SHIFT-按班次, QUANTITY-按产量, BATCH-按批次', ADD COLUMN `total_report_count` INT DEFAULT 0 COMMENT '总报工次数', ADD COLUMN `total_reported_quantity` DECIMAL(10,3) DEFAULT 0.000 COMMENT '累计报工数量', ADD COLUMN `equipment_id` BIGINT COMMENT '关联设备ID', ADD COLUMN `equipment_name` VARCHAR(255) COMMENT '设备名称', ADD COLUMN `actual_start_time` DATETIME COMMENT '实际开始时间', ADD COLUMN `actual_end_time` DATETIME COMMENT '实际结束时间', ADD COLUMN `downtime_minutes` INT DEFAULT 0 COMMENT '累计停机时间(分钟)'; -- 2. 创建索引 CREATE INDEX `idx_manufacture_type` ON `pro_workorder`(`manufacture_type`); CREATE INDEX `idx_equipment_id` ON `pro_workorder`(`equipment_id`); CREATE INDEX `idx_report_mode` ON `pro_workorder`(`report_mode`); -- 3. 为现有数据设置默认值 UPDATE `pro_workorder` SET `manufacture_type` = 'DISCRETE' WHERE `manufacture_type` IS NULL; UPDATE `pro_workorder` SET `report_mode` = 'PROCESS' WHERE `report_mode` IS NULL; UPDATE `pro_workorder` SET `total_report_count` = 0 WHERE `total_report_count` IS NULL; UPDATE `pro_workorder` SET `total_reported_quantity` = 0.000 WHERE `total_reported_quantity` IS NULL; UPDATE `pro_workorder` SET `downtime_minutes` = 0 WHERE `downtime_minutes` IS NULL; -- ===================================================== -- 第三部分:报工单表改动 -- ===================================================== -- 1. 报工单表新增字段 -- 说明:如果字段已存在会报错,可以忽略错误继续执行 ALTER TABLE `pro_report` ADD COLUMN `work_order_id` BIGINT COMMENT '工单ID(连续制造业直接关联工单)', ADD COLUMN `report_period_start` DATETIME COMMENT '报工时段开始', ADD COLUMN `report_period_end` DATETIME COMMENT '报工时段结束', ADD COLUMN `report_sequence` INT COMMENT '报工序号', ADD COLUMN `shift_name` VARCHAR(64) COMMENT '班次名称', ADD COLUMN `equipment_id` BIGINT COMMENT '设备ID', ADD COLUMN `equipment_name` VARCHAR(255) COMMENT '设备名称', ADD COLUMN `downtime_minutes` INT DEFAULT 0 COMMENT '该时段停机时间(分钟)', ADD COLUMN `downtime_reason` VARCHAR(500) COMMENT '停机原因'; -- 说明: -- 1. report_user_id 和 report_user_name 字段已存在,用于记录报工人 -- 连续制造业使用现有字段即可,无需新增 operator_ids -- 2. work_order_entry_id 字段保留(离散制造业使用) -- work_order_id 字段新增(连续制造业使用) -- 两者互不冲突,根据工单类型选择使用 -- 3. equipment_id 关联到 dm_equipment 表(系统已有设备表) -- 2. 修改 work_order_entry_id 字段为可空(重要!) -- 说明:连续制造业报工不使用工序分录,此字段必须允许为空 ALTER TABLE `pro_report` MODIFY COLUMN `work_order_entry_id` BIGINT(20) NULL COMMENT '工单子表ID(离散制造业使用)'; -- 3. 创建索引 -- 说明:如果索引已存在会报错,可以忽略错误继续执行 CREATE INDEX `idx_work_order_id` ON `pro_report`(`work_order_id`); CREATE INDEX `idx_report_period` ON `pro_report`(`report_period_start`, `report_period_end`); CREATE INDEX `idx_shift_name` ON `pro_report`(`shift_name`); CREATE INDEX `idx_equipment_id` ON `pro_report`(`equipment_id`); CREATE INDEX `idx_work_order_entry_id` ON `pro_report`(`work_order_entry_id`); -- ===================================================== -- 第四部分:数据验证 -- ===================================================== -- 验证物料表字段 SELECT COUNT(*) as total_materials, SUM(CASE WHEN manufacture_type = 'DISCRETE' THEN 1 ELSE 0 END) as discrete_count, SUM(CASE WHEN manufacture_type = 'CONTINUOUS' THEN 1 ELSE 0 END) as continuous_count FROM `md_material`; -- 验证工单表字段 SELECT COUNT(*) as total_workorders, SUM(CASE WHEN manufacture_type = 'DISCRETE' THEN 1 ELSE 0 END) as discrete_count, SUM(CASE WHEN manufacture_type = 'CONTINUOUS' THEN 1 ELSE 0 END) as continuous_count FROM `pro_workorder`; -- 验证报工单表字段 SELECT COUNT(*) as total_reports, SUM(CASE WHEN work_order_id IS NOT NULL THEN 1 ELSE 0 END) as continuous_report_count, SUM(CASE WHEN work_order_entry_id IS NOT NULL THEN 1 ELSE 0 END) as discrete_report_count FROM `pro_report`; -- ===================================================== -- 第五部分:班次字典配置 -- ===================================================== -- 说明:连续制造业按班次报工时需要选择班次,使用数据字典管理班次选项 -- 1. 添加班次类型字典 INSERT INTO `sys_dict_type` (`dict_name`, `dict_type`, `status`, `create_by`, `create_time`, `remark`) VALUES ('班次类型', 'sys_shift_type', '0', 'admin', NOW(), '用于连续制造业按班次报工'); -- 2. 添加默认班次选项 INSERT INTO `sys_dict_data` (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `remark`) VALUES (1, '早班', 'MORNING', 'sys_shift_type', '', 'default', 'Y', '0', 'admin', NOW(), '08:00-16:00'), (2, '中班', 'AFTERNOON', 'sys_shift_type', '', 'default', 'N', '0', 'admin', NOW(), '16:00-00:00'), (3, '晚班', 'NIGHT', 'sys_shift_type', '', 'default', 'N', '0', 'admin', NOW(), '00:00-08:00'); -- 说明: -- 1. 企业可在"系统管理→字典管理"中修改班次名称和数量 -- 2. dict_label 是显示名称,可自定义(如:白班、夜班、A班、B班等) -- 3. dict_value 是存储值,建议保持英文编码 -- 4. remark 字段可记录班次时间段,仅供参考 -- 5. 支持两班制、三班制、四班制等多种班次制度 -- 6. is_default='Y' 表示默认选项(早班) -- ===================================================== -- 执行说明 -- ===================================================== -- 1. 请在测试环境先执行此脚本 -- 2. 验证数据无误后再在生产环境执行 -- 3. 执行前建议备份数据库 -- 4. 执行顺序:物料表 → 工单表 → 报工单表 → 班次字典 → 验证 -- 5. 预计执行时间:< 1分钟(取决于数据量) -- 6. 影响范围:新增字段、索引、字典数据,不修改现有数据 -- 7. 兼容性:完全向后兼容,现有功能不受影响 -- 8. 班次配置:执行后可在"系统管理→字典管理"中修改班次选项 -- ===================================================== -- ===================================================== -- 重要说明 -- ===================================================== -- 【已删除的字段】 -- 1. report_interval - 原计划在 md_material 表中,已确认不需要 -- 2. operator_ids - 原计划在 pro_report 表中,与现有字段重复已删除 -- -- 【不需要修改的表】 -- 1. sal_order - 销售订单表不需要任何修改 -- 2. dm_equipment - 设备表已存在,直接复用 -- 3. pro_workorder_entry - 工单分录表保持不变(连续制造业不使用) -- -- 【字段使用规则】 -- pro_report 表: -- - 离散制造业:使用 work_order_entry_id,其他新字段为NULL -- - 连续制造业:使用 work_order_id,work_order_entry_id为NULL -- ===================================================== -- ===================================================== -- 回滚脚本(如需回滚,请执行以下语句) -- ===================================================== /* -- 回滚物料表 ALTER TABLE `md_material` DROP COLUMN `manufacture_type`, DROP COLUMN `report_mode`; DROP INDEX `idx_manufacture_type` ON `md_material`; -- 回滚工单表 ALTER TABLE `pro_workorder` DROP COLUMN `manufacture_type`, DROP COLUMN `report_mode`, DROP COLUMN `total_report_count`, DROP COLUMN `total_reported_quantity`, DROP COLUMN `equipment_id`, DROP COLUMN `equipment_name`, DROP COLUMN `actual_start_time`, DROP COLUMN `actual_end_time`, DROP COLUMN `downtime_minutes`; DROP INDEX `idx_manufacture_type` ON `pro_workorder`; DROP INDEX `idx_equipment_id` ON `pro_workorder`; DROP INDEX `idx_report_mode` ON `pro_workorder`; -- 回滚报工单表 ALTER TABLE `pro_report` DROP COLUMN `work_order_id`, DROP COLUMN `report_period_start`, DROP COLUMN `report_period_end`, DROP COLUMN `report_sequence`, DROP COLUMN `shift_name`, DROP COLUMN `equipment_id`, DROP COLUMN `equipment_name`, DROP COLUMN `downtime_minutes`, DROP COLUMN `downtime_reason`; DROP INDEX `idx_work_order_id` ON `pro_report`; DROP INDEX `idx_report_period` ON `pro_report`; DROP INDEX `idx_shift_name` ON `pro_report`; DROP INDEX `idx_equipment_id` ON `pro_report`; */