72 lines
5.3 KiB
SQL
72 lines
5.3 KiB
SQL
-- ============================================================
|
||
-- 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;
|