-- =====================================================
-- 连续制造业改进 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`;
*/
