-- ============================================================
-- 报工单页面类别与字段控制
-- 版本：v2.0.003  日期：2026-03-05  作者：周启威
-- ============================================================

-- ============================================================
-- 1. 创建类别配置表
-- ============================================================
CREATE TABLE `pro_report_category_config` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `category_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类别编码（A/B/C/D/E为系统类别，F/G/H...为自定义类别）',
  `category_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类别名称（可自定义修改）',
  `default_category_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '默认类别名称（系统初始名称，用于重置）',
  `category_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'SYSTEM' COMMENT '类别类型（SYSTEM=系统类别/CUSTOM=自定义类别）',
  `is_enabled` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'Y' COMMENT '是否启用（Y=启用/N=停用）',
  `sort_order` int DEFAULT NULL COMMENT '排序号',
  `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_category_code` (`category_code`),
  KEY `idx_category_type` (`category_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='报工单类别配置表';

-- ============================================================
-- 2. 创建字段配置表
-- ============================================================
CREATE TABLE `pro_report_field_config` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `category_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '所属类别编码（A/B/C/D/E）',
  `field_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字段编码（系统字段=实体类字段名，自定义字段=custom_field_xxx，不可修改）',
  `field_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字段显示名称（可自定义修改）',
  `default_field_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '默认字段名称（系统初始名称，用于重置）',
  `field_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'SYSTEM' COMMENT '字段类型（SYSTEM=系统字段/CUSTOM=自定义字段）',
  `data_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'STRING' COMMENT '数据类型（STRING=文本/NUMBER=数字/DATE=日期/DATETIME=日期时间/BOOLEAN=布尔/SELECT=下拉选择）',
  `control_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'INPUT' COMMENT '控件类型（INPUT=文本框/NUMBER=数字框/DATE=日期选择/DATETIME=日期时间选择/SELECT=下拉框/TEXTAREA=文本域/SWITCH=开关）',
  `options` text CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '下拉选项（JSON格式，仅当control_type=SELECT时有效）',
  `is_enabled` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'Y' COMMENT '是否启用（Y=启用/N=停用）',
  `is_required` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'N' COMMENT '是否必填（Y=必填/N=非必填）',
  `sort_order` int DEFAULT NULL COMMENT '排序号',
  `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_category_field` (`category_code`,`field_code`),
  KEY `idx_category_code` (`category_code`),
  KEY `idx_field_type` (`field_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='报工单字段配置表';

-- ============================================================
-- 3. 报工单表增加自定义字段JSON列
-- ============================================================
ALTER TABLE `pro_report` ADD COLUMN `custom_fields` json DEFAULT NULL COMMENT '自定义字段值（JSON格式）';

-- ============================================================
-- 4. 初始化类别配置数据（系统类别）
-- ============================================================
INSERT INTO `pro_report_category_config` (`category_code`, `category_name`, `default_category_name`, `category_type`, `is_enabled`, `sort_order`, `create_by`, `create_time`) VALUES
('A', '基础信息', '基础信息', 'SYSTEM', 'Y', 1, 'admin', NOW()),
('B', '数量信息', '数量信息', 'SYSTEM', 'Y', 2, 'admin', NOW()),
('C', '时间节拍', '时间节拍', 'SYSTEM', 'Y', 3, 'admin', NOW()),
('D', '成本效益', '成本效益', 'SYSTEM', 'Y', 4, 'admin', NOW()),
('E', '异常记录', '异常记录', 'SYSTEM', 'Y', 5, 'admin', NOW());

-- ============================================================
-- 5. 初始化字段配置数据
-- ============================================================

-- A. 基础信息字段
INSERT INTO `pro_report_field_config` (`category_code`, `field_code`, `field_name`, `default_field_name`, `field_type`, `data_type`, `control_type`, `is_enabled`, `is_required`, `sort_order`, `create_by`, `create_time`) VALUES
('A', 'reportUserId', '报工人', '报工人', 'SYSTEM', 'NUMBER', 'SELECT', 'Y', 'Y', 1, 'admin', NOW()),
('A', 'reportTime', '报工时间', '报工时间', 'SYSTEM', 'DATETIME', 'DATETIME', 'Y', 'Y', 2, 'admin', NOW()),
('A', 'reportType', '报工类型', '报工类型', 'SYSTEM', 'STRING', 'SELECT', 'Y', 'N', 3, 'admin', NOW()),
('A', 'shiftName', '班次', '班次', 'SYSTEM', 'STRING', 'SELECT', 'Y', 'N', 4, 'admin', NOW()),
('A', 'teamName', '班组', '班组', 'SYSTEM', 'STRING', 'SELECT', 'Y', 'N', 5, 'admin', NOW()),
('A', 'executionStandard', '执行标准', '执行标准', 'SYSTEM', 'STRING', 'INPUT', 'Y', 'N', 6, 'admin', NOW()),
('A', 'workshopId', '车间', '车间', 'SYSTEM', 'NUMBER', 'SELECT', 'Y', 'Y', 7, 'admin', NOW()),
('A', 'stationId', '工位', '工位', 'SYSTEM', 'NUMBER', 'SELECT', 'Y', 'Y', 8, 'admin', NOW());

-- B. 数量信息字段
INSERT INTO `pro_report_field_config` (`category_code`, `field_code`, `field_name`, `default_field_name`, `field_type`, `data_type`, `control_type`, `is_enabled`, `is_required`, `sort_order`, `create_by`, `create_time`) VALUES
('B', 'planCount', '计划数', '计划数', 'SYSTEM', 'NUMBER', 'INPUT', 'Y', 'N', 1, 'admin', NOW()),
('B', 'reportQuantity', '报工数量', '报工数量', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'Y', 2, 'admin', NOW()),
('B', 'qualifiedQuantity', '合格数量', '合格数量', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'Y', 3, 'admin', NOW()),
('B', 'unqualifiedQuantity', '不合格数量', '不合格数量', 'SYSTEM', 'NUMBER', 'INPUT', 'Y', 'N', 4, 'admin', NOW()),
('B', 'yieldRate', '良品率', '良品率', 'SYSTEM', 'NUMBER', 'INPUT', 'Y', 'N', 5, 'admin', NOW());

-- C. 时间节拍字段
INSERT INTO `pro_report_field_config` (`category_code`, `field_code`, `field_name`, `default_field_name`, `field_type`, `data_type`, `control_type`, `is_enabled`, `is_required`, `sort_order`, `create_by`, `create_time`) VALUES
('C', 'planStartTime', '计划开始时间', '计划开始时间', 'SYSTEM', 'DATETIME', 'INPUT', 'Y', 'N', 1, 'admin', NOW()),
('C', 'planEndTime', '计划完工时间', '计划完工时间', 'SYSTEM', 'DATETIME', 'DATETIME', 'Y', 'N', 2, 'admin', NOW()),
('C', 'actualStartTime', '实际开始时间', '实际开始时间', 'SYSTEM', 'DATETIME', 'DATETIME', 'Y', 'N', 3, 'admin', NOW()),
('C', 'actualEndTime', '实际完工时间', '实际完工时间', 'SYSTEM', 'DATETIME', 'DATETIME', 'Y', 'N', 4, 'admin', NOW()),
('C', 'reportPeriodStart', '报工周期开始', '报工周期开始', 'SYSTEM', 'DATETIME', 'DATETIME', 'Y', 'N', 5, 'admin', NOW()),
('C', 'reportPeriodEnd', '报工周期结束', '报工周期结束', 'SYSTEM', 'DATETIME', 'DATETIME', 'Y', 'N', 6, 'admin', NOW()),
('C', 'theoreticalCycleTime', '理论节拍', '理论节拍', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'N', 7, 'admin', NOW()),
('C', 'downtimeMinutes', '停机时间', '停机时间', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'N', 8, 'admin', NOW()),
('C', 'downtimeReason', '停机原因', '停机原因', 'SYSTEM', 'STRING', 'INPUT', 'Y', 'N', 9, 'admin', NOW());

-- D. 成本效益字段
INSERT INTO `pro_report_field_config` (`category_code`, `field_code`, `field_name`, `default_field_name`, `field_type`, `data_type`, `control_type`, `is_enabled`, `is_required`, `sort_order`, `create_by`, `create_time`) VALUES
('D', 'performanceWages', '绩效工资', '绩效工资', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'N', 1, 'admin', NOW()),
('D', 'energyConsumption', '能耗', '能耗', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'N', 2, 'admin', NOW()),
('D', 'materialConsumption', '工耗', '工耗', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'N', 3, 'admin', NOW()),
('D', 'otherCosts', '其他成本', '其他成本', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'N', 4, 'admin', NOW()),
('D', 'valueAdded', '增值', '增值', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'N', 5, 'admin', NOW()),
('D', 'stationOee', '工位OEE', '工位OEE', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'N', 6, 'admin', NOW()),
('D', 'currentBenefit', '本次效益', '本次效益', 'SYSTEM', 'NUMBER', 'INPUT', 'Y', 'N', 7, 'admin', NOW()),
('D', 'isSettle', '是否结算工资', '是否结算工资', 'SYSTEM', 'STRING', 'SELECT', 'Y', 'N', 8, 'admin', NOW()),
('D', 'wages', '结算工资', '结算工资', 'SYSTEM', 'NUMBER', 'NUMBER', 'Y', 'N', 9, 'admin', NOW());

-- E. 异常记录字段
INSERT INTO `pro_report_field_config` (`category_code`, `field_code`, `field_name`, `default_field_name`, `field_type`, `data_type`, `control_type`, `is_enabled`, `is_required`, `sort_order`, `create_by`, `create_time`) VALUES
('E', 'stationException', '工位异常情况', '工位异常情况', 'SYSTEM', 'STRING', 'TEXTAREA', 'Y', 'N', 1, 'admin', NOW()),
('E', 'rectificationSuggestion', '整改建议', '整改建议', 'SYSTEM', 'STRING', 'TEXTAREA', 'Y', 'N', 2, 'admin', NOW()),
('E', 'remark', '备注', '备注', 'SYSTEM', 'STRING', 'TEXTAREA', 'Y', 'N', 3, 'admin', NOW());

-- ============================================================
-- 6. 说明
-- ============================================================
-- 1. 类别配置表存储系统类别和自定义类别：
--    - category_type: SYSTEM=系统类别（A/B/C/D/E，不可删除），CUSTOM=自定义类别（F/G/H...，可删除）
--    - category_code: 系统类别固定为A/B/C/D/E，自定义类别按字母顺序生成F/G/H...
--    - category_name: 可自定义修改的显示名称
--    - default_category_name: 系统默认名称，用于重置
-- 2. 字段配置表存储每个类别下字段的配置信息：
--    - field_type: SYSTEM=系统字段（对应实体类字段），CUSTOM=自定义字段（存储在JSON中）
--    - field_code: 系统字段使用实体类字段名，自定义字段使用 custom_field_xxx
--    - field_name: 可自定义修改的显示名称
--    - default_field_name: 系统默认名称，用于重置
--    - data_type: 数据类型（STRING/NUMBER/DATE/DATETIME/BOOLEAN/SELECT）
--    - control_type: 控件类型（INPUT/NUMBER/DATE/DATETIME/SELECT/TEXTAREA/SWITCH）
--    - options: 下拉选项（JSON格式，仅SELECT类型有效）
--    - category_code: 所属类别编码，自定义字段可修改（移动到其他类别）
-- 3. 自定义字段的值存储在 pro_report.custom_fields（JSON类型）中
-- 4. 停用的类别在报工单表单中完全隐藏
-- 5. 停用的字段在报工单表单中完全隐藏
-- 6. 必填字段根据配置动态添加校验规则
-- 7. 配置仅影响新增/编辑时的表单显示，不影响已保存的报工单数据
-- 8. 新增自定义字段时可以选择放入任一类别中（包括自定义类别）
-- 9. 删除自定义类别前需确认该类别下没有字段
-- 10. 配置功能通过报工单页面的"表单配置"按钮打开弹窗进行设置，无需单独的配置菜单
