-- ============================================================= -- OA 工作排班 —— 表结构 -- -- 对应代码: -- models/oa_scheduling.go -- controllers/backend_oa_scheduling.go (班次管理) -- controllers/backend_oa_scheduling_scope.go (组织/员工范围展开) -- controllers/backend_oa_scheduling_plan.go (排班方案与发布) -- controllers/backend_oa_scheduling_board.go (看板、临时调配、变更记录) -- -- 执行顺序: -- 1) 本脚本:创建 4 张排班表 -- 2) oa_scheduling_menus.sql:注册「OA → 排班考勤 → 工作排班」菜单并授权角色 -- -- 设计要点: -- 1. 排班对象直接复用租户组织架构(yz_backend_organization)与员工表 -- (yz_backend_employee),不另建“小组”表:公司、部门、小组都是组织 -- 树上的节点,方案通过 scope_type + org_id + include_child 决定范围。 -- 2. 方案(plan)只保存规则;发布后展开成明细(entry),一人一天一条。 -- 看板与临时调配只操作明细,方案可重复发布(可选覆盖)。 -- 3. 明细软删除:is_deleted=0 表示有效,删除时写入记录 ID, -- 使唯一键 (tid, employee_id, schedule_date, is_deleted) 在删除后 -- 同一天重新排班时不会与历史记录冲突。 -- 4. 变更留痕(change)只记录人、日期与新旧班次,方便追溯临时调配。 -- ============================================================= SET NAMES utf8mb4; -- ---------------- 1. 班次定义 ---------------- CREATE TABLE IF NOT EXISTS `yz_backend_oa_shift` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID', `name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '班次名称,如早班/晚班', `short_name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '看板色块上的简称', `color` VARCHAR(20) NOT NULL DEFAULT '#409EFF' COMMENT '标识颜色', `work_start` VARCHAR(8) NOT NULL DEFAULT '' COMMENT '上班时间 HH:mm', `work_end` VARCHAR(8) NOT NULL DEFAULT '' COMMENT '下班时间 HH:mm(早于上班时间视为跨天)', `rest_start` VARCHAR(8) NOT NULL DEFAULT '' COMMENT '休息开始 HH:mm,空表示无', `rest_end` VARCHAR(8) NOT NULL DEFAULT '' COMMENT '休息结束 HH:mm', `work_hours` DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT '工时(已扣除休息)', `is_default` TINYINT NOT NULL DEFAULT 0 COMMENT '1=默认班次', `status` TINYINT NOT NULL DEFAULT 1 COMMENT '1=启用 0=停用', `sort` INT NOT NULL DEFAULT 0 COMMENT '排序', `remark` VARCHAR(255) DEFAULT NULL, `is_deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标记', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, `delete_time` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_tid_status` (`tid`, `status`), KEY `idx_tid_deleted` (`tid`, `is_deleted`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA-工作排班班次'; -- ---------------- 2. 排班方案 ---------------- CREATE TABLE IF NOT EXISTS `yz_backend_oa_schedule_plan` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID', `plan_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '方案名称', `plan_type` TINYINT NOT NULL DEFAULT 1 COMMENT '1=常规排班 2=临时方案', `scope_type` TINYINT NOT NULL DEFAULT 2 COMMENT '1=整个公司 2=部门/小组 3=指定员工', `org_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '范围组织ID(yz_backend_organization.id)', `org_name` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '范围名称快照', `include_child` TINYINT NOT NULL DEFAULT 1 COMMENT '1=包含全部下级组织', `employee_ids` TEXT COMMENT '指定员工ID JSON 数组:[1,2,3]', `employee_names` TEXT COMMENT '指定员工姓名快照', `start_date` DATE NOT NULL COMMENT '开始日期', `end_date` DATE NOT NULL COMMENT '结束日期', `weekdays` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '生效星期 JSON:[1,2,3,4,5];空=每天', `shift_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '班次ID', `shift_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '班次名称快照', `color` VARCHAR(20) NOT NULL DEFAULT '#409EFF' COMMENT '班次颜色快照', `note` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注', `status` TINYINT NOT NULL DEFAULT 1 COMMENT '1=启用 0=停用', `publish_status` TINYINT NOT NULL DEFAULT 0 COMMENT '0=未发布 1=已发布', `entry_count` INT NOT NULL DEFAULT 0 COMMENT '最近一次发布生成/覆盖的条数', `created_by` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人 uid', `created_by_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人名称快照', `is_deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标记', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, `delete_time` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_tid_deleted` (`tid`, `is_deleted`), KEY `idx_tid_scope` (`tid`, `scope_type`, `org_id`), KEY `idx_tid_dates` (`tid`, `start_date`, `end_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA-工作排班方案'; -- ---------------- 3. 排班明细 ---------------- CREATE TABLE IF NOT EXISTS `yz_backend_oa_schedule_entry` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID', `plan_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '来源方案ID,0=纯手工排班', `employee_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '员工ID(yz_backend_employee.id)', `employee_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '员工姓名快照', `employee_account` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '员工账号快照', `org_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属组织ID', `org_name` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '所属组织名称快照', `position` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '职位快照', `schedule_date` DATE NOT NULL COMMENT '排班日期', `shift_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '班次ID', `shift_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '班次名称快照', `short_name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '班次简称快照', `color` VARCHAR(20) NOT NULL DEFAULT '#409EFF' COMMENT '班次颜色快照', `work_start` VARCHAR(8) NOT NULL DEFAULT '' COMMENT '上班时间快照', `work_end` VARCHAR(8) NOT NULL DEFAULT '' COMMENT '下班时间快照', `source` TINYINT NOT NULL DEFAULT 1 COMMENT '1=方案生成 2=临时调配', `note` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '备注/调配原因', `created_by` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作人 uid', `created_by_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '操作人名称快照', `is_deleted` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '软删除标记:0=有效;删除时写入记录ID', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, `delete_time` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_tid_emp_date` (`tid`, `employee_id`, `schedule_date`, `is_deleted`), KEY `idx_tid_date` (`tid`, `schedule_date`), KEY `idx_tid_plan` (`tid`, `plan_id`), KEY `idx_tid_emp` (`tid`, `employee_id`), KEY `idx_tid_org_date` (`tid`, `org_id`, `schedule_date`), KEY `idx_tid_shift` (`tid`, `shift_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA-工作排班明细'; -- ---------------- 4. 排班变更记录 ---------------- CREATE TABLE IF NOT EXISTS `yz_backend_oa_schedule_change` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID', `entry_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '排班明细ID', `employee_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '员工ID', `employee_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '员工姓名快照', `schedule_date` DATE NOT NULL COMMENT '排班日期', `change_type` TINYINT NOT NULL DEFAULT 1 COMMENT '1=调班 2=清除 3=手工新增 4=方案覆盖', `old_shift_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '原班次ID', `old_shift_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '原班次名称', `new_shift_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '新班次ID', `new_shift_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '新班次名称', `reason` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '调整原因', `operator_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作人 uid', `operator_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '操作人名称快照', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_tid_date` (`tid`, `schedule_date`), KEY `idx_tid_emp` (`tid`, `employee_id`), KEY `idx_tid_entry` (`tid`, `entry_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA-工作排班变更记录'; -- ---------------- 校验 ---------------- SELECT TABLE_NAME, TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME LIKE 'yz_backend_oa_schedule_%' OR TABLE_NAME = 'yz_backend_oa_shift';