152 lines
9.5 KiB
SQL
152 lines
9.5 KiB
SQL
-- =============================================================
|
||
-- 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';
|