-- ============================================================= -- hr-roster 花名册字段体系 (F03) DDL -- 数据库: MySQL 8.0+ / 兼容 MariaDB 10.4+ -- 编码: utf8mb4 -- 说明: 覆盖 F03 验收项 1/3/6 所需表结构 -- roster_field_group 字段分组 -- roster_field_def 字段定义 -- roster_type_rule 员工类型规则 -- roster_empno_rule 工号生成规则 -- roster_op_log 操作审计日志 -- ============================================================= SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ------------------------------------------------------------- -- 1. 字段分组表 -- ------------------------------------------------------------- DROP TABLE IF EXISTS `roster_field_group`; CREATE TABLE `roster_field_group` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', `group_code` VARCHAR(64) NOT NULL COMMENT '分组编码(唯一, 如 work_info/personal_info)', `group_name` VARCHAR(128) NOT NULL COMMENT '分组名称', `group_desc` VARCHAR(512) NULL DEFAULT NULL COMMENT '分组描述', `is_builtin` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否内置(1内置不可删,0自定义)', `sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号(升序)', `is_enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '启用状态(1启用0停用)', `created_by` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '创建人用户ID', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '更新人用户ID', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted_at` DATETIME NULL DEFAULT NULL COMMENT '软删除时间(NULL未删)', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_code` (`group_code`), KEY `idx_sort` (`sort_order`), KEY `idx_enabled` (`is_enabled`), KEY `idx_deleted` (`deleted_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='花名册字段分组'; -- 内置分组初始化数据 INSERT INTO `roster_field_group` (`group_code`, `group_name`, `group_desc`, `is_builtin`, `sort_order`, `is_enabled`) VALUES ('work_info', '工作信息', '组织/岗位/职级/工号等', 1, 10, 1), ('personal_info', '个人信息', '姓名/证件/联系方式等', 1, 20, 1), ('contract_info', '合同信息', '合同/入离职/试用期等', 1, 30, 1), ('payroll_info', '薪酬信息', '薪资/社保/公积金等', 1, 40, 1); -- ------------------------------------------------------------- -- 2. 字段定义表 -- ------------------------------------------------------------- DROP TABLE IF EXISTS `roster_field_def`; CREATE TABLE `roster_field_def` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', `group_id` BIGINT UNSIGNED NOT NULL COMMENT '所属分组ID(roster_field_group.id)', `field_code` VARCHAR(64) NOT NULL COMMENT '字段编码(唯一, 如 emp_name/emp_no)', `field_name` VARCHAR(128) NOT NULL COMMENT '字段显示名称', `field_type` VARCHAR(32) NOT NULL COMMENT '字段类型(text/number/date/datetime/select/multi_select/attachment/bool)', `is_required` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否必填(1是0否)', `is_unique` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否唯一(1是0否)', `is_sensitive` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '敏感标记(1是0否, 敏感字段读需脱敏)', `default_value` VARCHAR(512) NULL DEFAULT NULL COMMENT '默认值', `options_json` JSON NULL COMMENT '选项(select/multi_select用), 格式:[{"label":"","value":""}]', `validation_rule` VARCHAR(512) NULL DEFAULT NULL COMMENT '校验规则(正则/范围等)', `placeholder` VARCHAR(256) NULL DEFAULT NULL COMMENT '输入提示', `help_text` VARCHAR(512) NULL DEFAULT NULL COMMENT '帮助说明', `sort_order` INT NOT NULL DEFAULT 0 COMMENT '组内排序号(拖拽排序)', `is_enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '启用状态(1启用0停用)', `created_by` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '创建人用户ID', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '更新人用户ID', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted_at` DATETIME NULL DEFAULT NULL COMMENT '软删除时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_field_code` (`field_code`), KEY `idx_group` (`group_id`), KEY `idx_sort` (`group_id`, `sort_order`), KEY `idx_enabled` (`is_enabled`), KEY `idx_deleted` (`deleted_at`), CONSTRAINT `fk_field_group` FOREIGN KEY (`group_id`) REFERENCES `roster_field_group` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='花名册字段定义'; -- ------------------------------------------------------------- -- 3. 员工类型规则表 (不同员工类型不同必填规则) -- ------------------------------------------------------------- DROP TABLE IF EXISTS `roster_type_rule`; CREATE TABLE `roster_type_rule` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', `rule_code` VARCHAR(64) NOT NULL COMMENT '规则编码(唯一)', `rule_name` VARCHAR(128) NOT NULL COMMENT '规则名称', `emp_type` VARCHAR(32) NOT NULL COMMENT '员工类型(正式工/临时工/实习生/劳务派遣等)', `required_field_codes` JSON NULL COMMENT '该类型必填字段编码列表, 格式:["emp_no","emp_name",...]', `extra_config` JSON NULL COMMENT '扩展配置(校验/联动等)', `is_enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '启用状态(1启用0停用)', `sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号', `created_by` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '创建人用户ID', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '更新人用户ID', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted_at` DATETIME NULL DEFAULT NULL COMMENT '软删除时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_rule_code` (`rule_code`), KEY `idx_emp_type` (`emp_type`), KEY `idx_enabled` (`is_enabled`), KEY `idx_deleted` (`deleted_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='员工类型必填规则'; -- 默认规则初始化 INSERT INTO `roster_type_rule` (`rule_code`, `rule_name`, `emp_type`, `required_field_codes`) VALUES ('type_formal', '正式工必填规则', '正式工', '["emp_no","emp_name","dept_id","position_id","join_date"]'), ('type_temp', '临时工必填规则', '临时工', '["emp_no","emp_name","dept_id","join_date"]'), ('type_intern', '实习生必填规则', '实习生', '["emp_no","emp_name","join_date","end_date"]'); -- ------------------------------------------------------------- -- 4. 工号生成规则表 -- ------------------------------------------------------------- DROP TABLE IF EXISTS `roster_empno_rule`; CREATE TABLE `roster_empno_rule` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', `rule_code` VARCHAR(64) NOT NULL COMMENT '规则编码(唯一)', `rule_name` VARCHAR(128) NOT NULL COMMENT '规则名称', `subsidiary_code` VARCHAR(32) NULL DEFAULT NULL COMMENT '子公司前缀编码(如子公A=001)', `prefix` VARCHAR(32) NULL DEFAULT NULL COMMENT '固定前缀', `date_format` VARCHAR(32) NULL DEFAULT NULL COMMENT '日期格式(如 %Y%m / YYYYMM / 空=无日期段)', `seq_length` INT NOT NULL DEFAULT 4 COMMENT '流水号位数', `start_seq` INT NOT NULL DEFAULT 1 COMMENT '起始流水号', `current_seq` BIGINT NOT NULL DEFAULT 0 COMMENT '当前流水号(生成时原子递增)', `is_enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '启用状态(1启用0停用)', `sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号(匹配优先级)', `created_by` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '创建人用户ID', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '更新人用户ID', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted_at` DATETIME NULL DEFAULT NULL COMMENT '软删除时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_rule_code` (`rule_code`), KEY `idx_subsidiary` (`subsidiary_code`), KEY `idx_enabled` (`is_enabled`), KEY `idx_deleted` (`deleted_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工号生成规则'; -- 默认规则初始化 INSERT INTO `roster_empno_rule` (`rule_code`, `rule_name`, `subsidiary_code`, `prefix`, `date_format`, `seq_length`, `start_seq`, `current_seq`) VALUES ('empno_default', '默认工号规则', NULL, 'E', '%Y%m', 5, 1, 0), ('empno_subs_a', '子公司A工号规则', '001', 'A', '%Y%m', 4, 1, 0); -- ------------------------------------------------------------- -- 5. 操作审计日志表 (写操作审计落库) -- ------------------------------------------------------------- DROP TABLE IF EXISTS `roster_op_log`; CREATE TABLE `roster_op_log` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', `op_type` VARCHAR(32) NOT NULL COMMENT '操作类型(create/update/delete/enable/disable/sort/gen_empno)', `target_table` VARCHAR(64) NOT NULL COMMENT '目标表名', `target_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '目标记录ID', `before_json` JSON NULL COMMENT '变更前数据快照', `after_json` JSON NULL COMMENT '变更后数据快照', `operator_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '操作人用户ID', `operator_name` VARCHAR(128) NULL DEFAULT NULL COMMENT '操作人姓名', `client_ip` VARCHAR(64) NULL DEFAULT NULL COMMENT '客户端IP', `remark` VARCHAR(512) NULL DEFAULT NULL COMMENT '备注', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', PRIMARY KEY (`id`), KEY `idx_target` (`target_table`, `target_id`), KEY `idx_op_type` (`op_type`), KEY `idx_operator` (`operator_id`), KEY `idx_created` (`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='花名册操作审计日志'; SET FOREIGN_KEY_CHECKS = 1;