Files
yunzerwebsiteallinone/go/docs/sql/create_oa_scheduling.sql
2026-10-26 08:54:34 +08:00

152 lines
9.5 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================
-- 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';