更新若干事项

This commit is contained in:
hero920103 committed 2026-10-26 08:54:34 +08:00
1 parent 68cdaf38fa
commit 9898962836
30 files changed
+7715

No files matched your search

@@ -0,0 +1,71 @@
-- ============================================================
-- OA 工作排班:排班方案支持「平台模板 + 周期规则」
--
-- 适用:已执行过 create_oa_scheduling.sql 的环境(表已存在)。
-- 执行:在业务库(go-platform)下整段执行即可。
--
-- 幂等:逐列判断 information_schema,只添加缺失的列;
-- 9 列全部存在时自动跳过一次无害查询,不会报 1060。
--
-- 字段说明:
-- template_id / template_code / template_name
-- 方案来源模板的快照。租户调用模板后,模板规则会复制进本方案,
-- 之后模板调整或停用都不影响已保存方案(platform 模板只读,租户可改自己的)。
-- align_mode
-- 0 = 未使用模板(沿用 weekdays + shift_id 的按星期排班)
-- 1 = 按自然周(双休 / 单休 / 大小周)
-- 2 = 从 start_date 起滚动(三班倒 / 做一休一)
-- 3 = 按自然月(月休)
-- cycle_days 周期天数(align_mode=1/2 时等于 pattern 长度)
-- week_offset 大小周起始周偏移:0=开始日期所在周为周期第 1 周,1=第 2 周
-- month_rest_days 月休:每月休息天数
-- month_rest_weekday 月休固定休息周几(1-7),0 表示不固定
-- pattern 周期规则 JSON 快照,元素形如
-- {"day_index":0,"day_type":1,"shift_id":12,"shift_name":"白班",
-- "short_name":"白","color":"#409EFF","work_start":"09:00","work_end":"18:00"}
-- ============================================================
-- 执行前自查:existing_cols = 9 表示字段已齐全,执行到下面会自动跳过
SELECT COUNT(*) AS existing_cols
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'yz_backend_oa_schedule_plan'
AND COLUMN_NAME IN ('template_id','template_code','template_name','align_mode','cycle_days','week_offset','month_rest_days','month_rest_weekday','pattern');
SET @sql := CONCAT('ALTER TABLE `yz_backend_oa_schedule_plan` ',
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_schedule_plan' AND COLUMN_NAME = 'template_id') = 0,
'ADD COLUMN `template_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT ''来源模板ID(0=未使用模板)'', ', ''),
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_schedule_plan' AND COLUMN_NAME = 'template_code') = 0,
'ADD COLUMN `template_code` VARCHAR(50) NOT NULL DEFAULT '''' COMMENT ''来源模板编码快照'', ', ''),
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_schedule_plan' AND COLUMN_NAME = 'template_name') = 0,
'ADD COLUMN `template_name` VARCHAR(50) NOT NULL DEFAULT '''' COMMENT ''来源模板名称快照'', ', ''),
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_schedule_plan' AND COLUMN_NAME = 'align_mode') = 0,
'ADD COLUMN `align_mode` TINYINT NOT NULL DEFAULT 0 COMMENT ''0不使用模板 1按自然周 2按开始日滚动 3按自然月'', ', ''),
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_schedule_plan' AND COLUMN_NAME = 'cycle_days') = 0,
'ADD COLUMN `cycle_days` SMALLINT NOT NULL DEFAULT 0 COMMENT ''周期天数'', ', ''),
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_schedule_plan' AND COLUMN_NAME = 'week_offset') = 0,
'ADD COLUMN `week_offset` TINYINT NOT NULL DEFAULT 0 COMMENT ''大小周起始周偏移'', ', ''),
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_schedule_plan' AND COLUMN_NAME = 'month_rest_days') = 0,
'ADD COLUMN `month_rest_days` TINYINT NOT NULL DEFAULT 0 COMMENT ''月休天数'', ', ''),
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_schedule_plan' AND COLUMN_NAME = 'month_rest_weekday') = 0,
'ADD COLUMN `month_rest_weekday` TINYINT NOT NULL DEFAULT 0 COMMENT ''月休固定周几(1-7,0不固定)'', ', ''),
IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_schedule_plan' AND COLUMN_NAME = 'pattern') = 0,
'ADD COLUMN `pattern` TEXT NULL COMMENT ''周期规则JSON快照'', ', '')
);
-- 去掉结尾多余的 ", "(两个字符),否则 ALTER 语句会因尾逗号报 1064
SET @sql := IF(RIGHT(@sql, 2) = ', ', LEFT(@sql, CHAR_LENGTH(@sql) - 2), @sql);
-- 没有任何缺失列时,@sql 只剩表名,替换为一条无害语句
SET @sql := IF(RIGHT(@sql, 6) = 'TABLE ', 'SELECT 1 AS skipped_all_columns_exist', @sql);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 核对结果:应返回 9 行
SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_DEFAULT, COLUMN_COMMENT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'yz_backend_oa_schedule_plan'
AND COLUMN_NAME IN ('template_id','template_code','template_name','align_mode','cycle_days','week_offset','month_rest_days','month_rest_weekday','pattern')
ORDER BY ORDINAL_POSITION;
+151
View File
@@ -0,0 +1,151 @@
-- =============================================================
-- 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';
@@ -0,0 +1,219 @@
-- ============================================================
-- 平台端排班模板(全局预制模板 + 自定义模板)
--
-- 执行顺序:
-- 1) 本脚本:创建 2 张模板表并写入 6 个系统预置模板
-- 2) alter_oa_schedule_plan_template.sql:租户排班方案增加模板/周期字段
-- 3) platform_sched_template_menu.sql:注册平台端「排班模板」菜单
-- 4) create_oa_scheduling.sql / oa_scheduling_menus.sql(若尚未执行)
--
-- 说明:
-- 1. 模板是全局数据(不按租户隔离),只有平台端可维护;
-- 系统预置模板(is_system=1)由平台锁定:不可编辑、不可删除、不可停用。
-- 2. 租户端只能「调用」模板:调用时把模板规则快照到自己的排班方案
-- (yz_backend_oa_schedule_plan.pattern),之后在租户端随意修改,
-- 模板本身的后续调整不会再影响已保存的方案。
-- 3. align_mode:1=按自然周(双休/单休/大小周) 2=从开始日滚动(三班倒/做一休一)
-- 3=按自然月(月休,按月计算休息日)
-- 4. day_index 表示周期内第几天,从 0 开始;按自然周时 0=周一、6=周日。
-- 5. 本脚本不使用会话变量 / PREPARE,可整段执行也可逐条执行,重复执行安全。
-- ============================================================
CREATE TABLE IF NOT EXISTS `yz_platform_sched_tpl` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`code` varchar(50) NOT NULL DEFAULT '' COMMENT '模板编码(系统模板固定)',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '模板名称',
`template_type` tinyint NOT NULL DEFAULT 9 COMMENT '1双休 2单休 3大小周 4月休 5三班倒 6做一休一 9自定义',
`align_mode` tinyint NOT NULL DEFAULT 1 COMMENT '1按自然周 2按开始日滚动 3按自然月',
`cycle_days` smallint NOT NULL DEFAULT 7 COMMENT '周期天数(按自然月时为0)',
`week_offset` tinyint NOT NULL DEFAULT 0 COMMENT '大小周起始周偏移:0=开始周为第1周 1=第2周',
`month_rest_days` tinyint NOT NULL DEFAULT 0 COMMENT '月休:每月休息天数',
`month_rest_weekday` tinyint NOT NULL DEFAULT 0 COMMENT '月休固定休息周几(1-7,0=不固定)',
`summary` varchar(255) NOT NULL DEFAULT '' COMMENT '规则摘要(列表展示)',
`is_system` tinyint NOT NULL DEFAULT 0 COMMENT '1=系统预置(只读,禁止编辑/删除)',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0停用',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`creater` varchar(50) NOT NULL DEFAULT '' COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
KEY `idx_code` (`code`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台端排班模板(全局)';
CREATE TABLE IF NOT EXISTS `yz_platform_sched_tpl_day` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`template_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '模板ID',
`day_index` smallint NOT NULL DEFAULT 0 COMMENT '周期内第几天,从0开始',
`day_type` tinyint NOT NULL DEFAULT 1 COMMENT '1上班 2休息',
`shift_name` varchar(50) NOT NULL DEFAULT '' COMMENT '班次名称',
`shift_short` 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.00 COMMENT '工时(小时)',
`remark` varchar(100) NOT NULL DEFAULT '' COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tpl_day` (`template_id`,`day_index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台端排班模板-周期每日规则';
-- ============================================================
-- 系统预置模板(6 个)
-- ============================================================
-- 1. 双休:周一至周五上班,周六日休息
INSERT INTO yz_platform_sched_tpl
(code, name, template_type, align_mode, cycle_days, week_offset, month_rest_days, month_rest_weekday, summary, is_system, status, sort, creater)
SELECT 'double_weekend', '双休', 1, 1, 7, 0, 0, 0, '周一至周五上班 09:00-18:00,周六日休息', 1, 1, 10, 'system'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_platform_sched_tpl WHERE code = 'double_weekend' AND delete_time IS NULL) t);
INSERT INTO yz_platform_sched_tpl_day
(template_id, day_index, day_type, shift_name, shift_short, color, work_start, work_end, rest_start, rest_end, work_hours)
SELECT tpl.id, d.idx, d.day_type, d.shift_name, d.shift_short, d.color, d.work_start, d.work_end, d.rest_start, d.rest_end, d.work_hours
FROM (
SELECT 0 AS idx, 1 AS day_type, '白班' AS shift_name, '白' AS shift_short, '#409EFF' AS color, '09:00' AS work_start, '18:00' AS work_end, '12:00' AS rest_start, '13:30' AS rest_end, 7.50 AS work_hours
UNION ALL SELECT 1, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 2, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 3, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 4, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 5, 2, '', '', '', '', '', '', '', 0.00
UNION ALL SELECT 6, 2, '', '', '', '', '', '', '', 0.00
) d
CROSS JOIN (SELECT id FROM yz_platform_sched_tpl WHERE code = 'double_weekend' AND delete_time IS NULL LIMIT 1) tpl
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT template_id, day_index FROM yz_platform_sched_tpl_day) x
WHERE x.template_id = tpl.id AND x.day_index = d.idx
);
-- 2. 单休:周一至周六上班,周日休息
INSERT INTO yz_platform_sched_tpl
(code, name, template_type, align_mode, cycle_days, week_offset, month_rest_days, month_rest_weekday, summary, is_system, status, sort, creater)
SELECT 'single_weekend', '单休', 2, 1, 7, 0, 0, 0, '周一至周六上班 09:00-18:00,周日休息', 1, 1, 20, 'system'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_platform_sched_tpl WHERE code = 'single_weekend' AND delete_time IS NULL) t);
INSERT INTO yz_platform_sched_tpl_day
(template_id, day_index, day_type, shift_name, shift_short, color, work_start, work_end, rest_start, rest_end, work_hours)
SELECT tpl.id, d.idx, d.day_type, d.shift_name, d.shift_short, d.color, d.work_start, d.work_end, d.rest_start, d.rest_end, d.work_hours
FROM (
SELECT 0 AS idx, 1 AS day_type, '白班' AS shift_name, '白' AS shift_short, '#409EFF' AS color, '09:00' AS work_start, '18:00' AS work_end, '12:00' AS rest_start, '13:30' AS rest_end, 7.50 AS work_hours
UNION ALL SELECT 1, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 2, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 3, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 4, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 5, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 6, 2, '', '', '', '', '', '', '', 0.00
) d
CROSS JOIN (SELECT id FROM yz_platform_sched_tpl WHERE code = 'single_weekend' AND delete_time IS NULL LIMIT 1) tpl
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT template_id, day_index FROM yz_platform_sched_tpl_day) x
WHERE x.template_id = tpl.id AND x.day_index = d.idx
);
-- 3. 大小周:第 1 周双休,第 2 周单休(周六上班),14 天一个周期
INSERT INTO yz_platform_sched_tpl
(code, name, template_type, align_mode, cycle_days, week_offset, month_rest_days, month_rest_weekday, summary, is_system, status, sort, creater)
SELECT 'big_small_week', '大小周', 3, 1, 14, 0, 0, 0, '第 1 周双休、第 2 周单休(周六上班),14 天循环', 1, 1, 30, 'system'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_platform_sched_tpl WHERE code = 'big_small_week' AND delete_time IS NULL) t);
INSERT INTO yz_platform_sched_tpl_day
(template_id, day_index, day_type, shift_name, shift_short, color, work_start, work_end, rest_start, rest_end, work_hours)
SELECT tpl.id, d.idx, d.day_type, d.shift_name, d.shift_short, d.color, d.work_start, d.work_end, d.rest_start, d.rest_end, d.work_hours
FROM (
SELECT 0 AS idx, 1 AS day_type, '白班' AS shift_name, '白' AS shift_short, '#409EFF' AS color, '09:00' AS work_start, '18:00' AS work_end, '12:00' AS rest_start, '13:30' AS rest_end, 7.50 AS work_hours
UNION ALL SELECT 1, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 2, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 3, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 4, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 5, 2, '', '', '', '', '', '', '', 0.00
UNION ALL SELECT 6, 2, '', '', '', '', '', '', '', 0.00
UNION ALL SELECT 7, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 8, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 9, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 10, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 11, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 12, 1, '白班', '白', '#409EFF', '09:00', '18:00', '12:00', '13:30', 7.50
UNION ALL SELECT 13, 2, '', '', '', '', '', '', '', 0.00
) d
CROSS JOIN (SELECT id FROM yz_platform_sched_tpl WHERE code = 'big_small_week' AND delete_time IS NULL LIMIT 1) tpl
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT template_id, day_index FROM yz_platform_sched_tpl_day) x
WHERE x.template_id = tpl.id AND x.day_index = d.idx
);
-- 4. 月休 4 天:每月固定休 4 天,优先安排在周日(周末不足时从月末补齐)
INSERT INTO yz_platform_sched_tpl
(code, name, template_type, align_mode, cycle_days, week_offset, month_rest_days, month_rest_weekday, summary, is_system, status, sort, creater)
SELECT 'month_4_rest', '月休 4 天', 4, 3, 0, 0, 4, 7, '每月固定休 4 天,优先安排周日,遇 5 个周日只休前 4 个', 1, 1, 40, 'system'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_platform_sched_tpl WHERE code = 'month_4_rest' AND delete_time IS NULL) t);
INSERT INTO yz_platform_sched_tpl_day
(template_id, day_index, day_type, shift_name, shift_short, color, work_start, work_end, rest_start, rest_end, work_hours)
SELECT tpl.id, d.idx, d.day_type, d.shift_name, d.shift_short, d.color, d.work_start, d.work_end, d.rest_start, d.rest_end, d.work_hours
FROM (
SELECT 0 AS idx, 1 AS day_type, '白班' AS shift_name, '白' AS shift_short, '#409EFF' AS color, '09:00' AS work_start, '18:00' AS work_end, '12:00' AS rest_start, '13:30' AS rest_end, 7.50 AS work_hours
) d
CROSS JOIN (SELECT id FROM yz_platform_sched_tpl WHERE code = 'month_4_rest' AND delete_time IS NULL LIMIT 1) tpl
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT template_id, day_index FROM yz_platform_sched_tpl_day) x
WHERE x.template_id = tpl.id AND x.day_index = d.idx
);
-- 5. 三班倒:早班 -> 中班 -> 夜班,各 1 天循环
INSERT INTO yz_platform_sched_tpl
(code, name, template_type, align_mode, cycle_days, week_offset, month_rest_days, month_rest_weekday, summary, is_system, status, sort, creater)
SELECT 'three_shift', '三班倒', 5, 2, 3, 0, 0, 0, '早班 08:00-16:00 → 中班 16:00-24:00 → 夜班 00:00-08:00,3 天循环', 1, 1, 50, 'system'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_platform_sched_tpl WHERE code = 'three_shift' AND delete_time IS NULL) t);
INSERT INTO yz_platform_sched_tpl_day
(template_id, day_index, day_type, shift_name, shift_short, color, work_start, work_end, rest_start, rest_end, work_hours)
SELECT tpl.id, d.idx, d.day_type, d.shift_name, d.shift_short, d.color, d.work_start, d.work_end, d.rest_start, d.rest_end, d.work_hours
FROM (
SELECT 0 AS idx, 1 AS day_type, '早班' AS shift_name, '早' AS shift_short, '#67C23A' AS color, '08:00' AS work_start, '16:00' AS work_end, '' AS rest_start, '' AS rest_end, 8.00 AS work_hours
UNION ALL SELECT 1, 1, '中班', '中', '#E6A23C', '16:00', '24:00', '', '', 8.00
UNION ALL SELECT 2, 1, '夜班', '夜', '#909399', '00:00', '08:00', '', '', 8.00
) d
CROSS JOIN (SELECT id FROM yz_platform_sched_tpl WHERE code = 'three_shift' AND delete_time IS NULL LIMIT 1) tpl
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT template_id, day_index FROM yz_platform_sched_tpl_day) x
WHERE x.template_id = tpl.id AND x.day_index = d.idx
);
-- 6. 做一休一:上 1 天休 1 天
INSERT INTO yz_platform_sched_tpl
(code, name, template_type, align_mode, cycle_days, week_offset, month_rest_days, month_rest_weekday, summary, is_system, status, sort, creater)
SELECT 'work_one_rest_one', '做一休一', 6, 2, 2, 0, 0, 0, '上 1 天休 1 天循环(09:00-18:00)', 1, 1, 60, 'system'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_platform_sched_tpl WHERE code = 'work_one_rest_one' AND delete_time IS NULL) t);
INSERT INTO yz_platform_sched_tpl_day
(template_id, day_index, day_type, shift_name, shift_short, color, work_start, work_end, rest_start, rest_end, work_hours)
SELECT tpl.id, d.idx, d.day_type, d.shift_name, d.shift_short, d.color, d.work_start, d.work_end, d.rest_start, d.rest_end, d.work_hours
FROM (
SELECT 0 AS idx, 1 AS day_type, '白班' AS shift_name, '白' AS shift_short, '#409EFF' AS color, '09:00' AS work_start, '18:00' AS work_end, '12:00' AS rest_start, '13:30' AS rest_end, 7.50 AS work_hours
UNION ALL SELECT 1, 2, '', '', '', '', '', '', '', 0.00
) d
CROSS JOIN (SELECT id FROM yz_platform_sched_tpl WHERE code = 'work_one_rest_one' AND delete_time IS NULL LIMIT 1) tpl
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT template_id, day_index FROM yz_platform_sched_tpl_day) x
WHERE x.template_id = tpl.id AND x.day_index = d.idx
);
-- ============================================================
-- 结果校验:6 行,day_count 分别为 7 / 7 / 14 / 1 / 3 / 2
-- ============================================================
SELECT t.id, t.code, t.name, t.template_type, t.align_mode, t.cycle_days,
t.month_rest_days, t.month_rest_weekday, t.is_system, t.status, t.sort,
COUNT(d.id) AS day_count
FROM yz_platform_sched_tpl t
LEFT JOIN yz_platform_sched_tpl_day d ON d.template_id = t.id
WHERE t.delete_time IS NULL
GROUP BY t.id
ORDER BY t.sort;
+94
View File
@@ -0,0 +1,94 @@
-- ============================================================
-- OA 工作排班 —— 菜单配置(yz_system_menu)
-- 幂等脚本:按 path 判重,重复执行不会产生重复菜单
-- 执行:mysql -h <host> -P <port> -u <user> -p <db> < oa_scheduling_menus.sql
--
-- 挂载位置:OA 应用根(path = '/apps/oa')
-- OA
-- └─ 排班考勤(目录,/apps/oa/scheduling)
-- └─ 工作排班(页面,/apps/oa/scheduling/board)
--
-- 对应页面:backend/src/views/apps/oa/scheduling/index.vue
-- 同一页面内完成:班次管理、排班方案(公司/部门/小组/指定员工)、
-- 周看板、单个或批量员工的临时调配、变更记录查看。
--
-- 说明:
-- 1. 排班看板是 Web 管理端功能,platforms 显式为 ["web"],
-- 移动端菜单不出现(后续若开放员工查看排班,再补 APP 端页面)。
-- 2. 租户端角色(cid=2)的 rights 是显式菜单 ID 列表,菜单接口会按
-- rights 过滤。只插菜单不授权,会出现「目录可见但页面被过滤」,
-- 因此本脚本同时把两个菜单 ID 追加到角色 rights。
-- 目录与页面都必须授权,缺一不可。
-- ============================================================
SET @oa_id := (
SELECT id FROM yz_system_menu
WHERE path = '/apps/oa' AND delete_time IS NULL
LIMIT 1
);
-- ---------- 排班考勤(目录) ----------
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, platforms, type, creater, remark)
SELECT @oa_id, '排班考勤', '/apps/oa/scheduling', NULL,
'Calendar', 88, 1, 1, '[2]', '["web"]', 1, 'system',
'按公司、部门、小组或指定员工制定排班方案,支持临时调配'
FROM DUAL
WHERE @oa_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/oa/scheduling' AND delete_time IS NULL) x);
SET @scheduling_id := (
SELECT id FROM yz_system_menu
WHERE path = '/apps/oa/scheduling' AND delete_time IS NULL
LIMIT 1
);
-- ---------- 工作排班(页面) ----------
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, platforms, type, creater, remark)
SELECT @scheduling_id, '工作排班', '/apps/oa/scheduling/board', '/apps/oa/scheduling/index.vue',
'Clock', 1, 1, 1, '[2]', '["web"]', 2, 'system',
'排班看板:按周查看排班,支持方案发布、单条调班与批量临时排班'
FROM DUAL
WHERE @scheduling_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/oa/scheduling/board' AND delete_time IS NULL) x);
SET @board_id := (
SELECT id FROM yz_system_menu
WHERE path = '/apps/oa/scheduling/board' AND delete_time IS NULL
LIMIT 1
);
-- ---------- 角色授权:把菜单追加到所有租户端角色的 rights ----------
-- 只处理 rights 非空(显式授权)的角色;rights 为空表示全权限,无需追加。
UPDATE yz_system_admin_role
SET rights = CAST(JSON_ARRAY_APPEND(CAST(rights AS JSON), '$', @scheduling_id) AS CHAR)
WHERE cid = 2
AND rights IS NOT NULL
AND TRIM(rights) <> ''
AND JSON_VALID(rights)
AND @scheduling_id IS NOT NULL
AND NOT JSON_CONTAINS(CAST(rights AS JSON), CAST(@scheduling_id AS JSON));
UPDATE yz_system_admin_role
SET rights = CAST(JSON_ARRAY_APPEND(CAST(rights AS JSON), '$', @board_id) AS CHAR)
WHERE cid = 2
AND rights IS NOT NULL
AND TRIM(rights) <> ''
AND JSON_VALID(rights)
AND @board_id IS NOT NULL
AND NOT JSON_CONTAINS(CAST(rights AS JSON), CAST(@board_id AS JSON));
-- ---------- 结果校验 ----------
SELECT id, pid, title, path, component_path, platforms, type, sort
FROM yz_system_menu
WHERE delete_time IS NULL AND path LIKE '/apps/oa/scheduling%'
ORDER BY pid, sort;
SELECT id, name, tenant_id,
JSON_CONTAINS(CAST(rights AS JSON), CAST(@scheduling_id AS JSON)) AS has_dir,
JSON_CONTAINS(CAST(rights AS JSON), CAST(@board_id AS JSON)) AS has_board
FROM yz_system_admin_role
WHERE cid = 2 AND rights IS NOT NULL AND TRIM(rights) <> ''
ORDER BY tenant_id, id;
@@ -0,0 +1,42 @@
-- ============================================================
-- 排班模板 —— 平台端菜单(yz_system_menu)
--
-- 挂载位置:平台端「基础设置」(path = /basicSettings)下,与「字典管理」并列。
-- 基础设置
-- └─ 排班模板(页面,/basicSettings/schedTemplate)
--
-- 说明:
-- 1. views = [1]:只在平台端出现;租户端通过 /backend/oa/scheduling/templates
-- 读取模板(不在租户菜单里暴露模板管理入口)。
-- 2. 平台端菜单接口(/platform/menu/:id)按 views 过滤,不按角色 rights 过滤,
-- 因此本脚本无需追加角色授权。
-- 3. 幂等:按 path 判重,重复执行不会产生重复菜单。
-- 4. 本脚本不使用会话变量 / PREPARE,可整段执行也可逐条执行。
-- ============================================================
-- 1) 有「基础设置」目录时,挂到该目录下
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark)
SELECT
(SELECT id FROM (SELECT id FROM yz_system_menu WHERE path = '/basicSettings' AND delete_time IS NULL ORDER BY id LIMIT 1) b),
'排班模板', '/basicSettings/schedTemplate', '/system/schedTemplate/index.vue',
'Calendar', 90, 1, 1, '[1]', 2, 'system',
'全局排班模板:预置双休/单休/大小周/月休/三班倒/做一休一,租户调用后存入自己的方案'
FROM DUAL
WHERE EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/basicSettings' AND delete_time IS NULL) b)
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/basicSettings/schedTemplate' AND delete_time IS NULL) e);
-- 2) 未找到「基础设置」目录时,退化为平台端顶级菜单(pid=0)
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark)
SELECT 0, '排班模板', '/basicSettings/schedTemplate', '/system/schedTemplate/index.vue',
'Calendar', 92, 1, 1, '[1]', 2, 'system',
'全局排班模板:预置双休/单休/大小周/月休/三班倒/做一休一,租户调用后存入自己的方案'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/basicSettings' AND delete_time IS NULL) b)
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/basicSettings/schedTemplate' AND delete_time IS NULL) e);
-- 结果校验:应返回 1 行
SELECT id, pid, title, path, component_path, views, type, is_visible, status
FROM yz_system_menu
WHERE delete_time IS NULL AND path = '/basicSettings/schedTemplate';