本文介绍一种无需手动维护、可随日期自动演进的轮班颜色编码方案,通过将轮班周期建模为可计算的数学序列(而非静态映射),结合日期偏移与模运算,精准为每位员工在任意日期所属的轮班阶段(如“第1个夜班”“第2天休息”等)分配唯一颜色标识。
要实现真正“一次配置、永久生效”的动态轮班着色系统,核心在于将轮班规律转化为可复用的时间函数,而非依赖硬编码的日期对照表或状态哈希映射。您描述的轮班模式为:2夜 → 2休 → 3日 → 2休,共9天一个完整周期(2+2+3+2=9)。该模式本质是一个周期性序列,关键在于:每个员工需有一个固定的起始基准日(即其个人轮班周期的 Day 0),后续所有日期的颜色均由 (当前日期 - 基准日) % 9 决定。
为每位员工存储 shift_start_date(必填)
这是该员工轮班周期的锚点(例如:张三的首个夜班是2025-05-01,则其 shift_start_date = '2025-05-01')。此字段只需初始化一次,永不更改。
定义周期内各位置对应的颜色与班次类型
建立长度为 9 的映射数组(索引 0–8):
const SHIFT_CYCLE = [
{ phase: 'night', color: '#C00000', label: '夜班1' }, // Day
0 → 第1个夜班
{ phase: 'night', color: '#E60000', label: '夜班2' }, // Day 1 → 第2个夜班
{ phase: 'off', color: '#F2F2F2', label: '休息1' }, // Day 2 → 第1个休息日
{ phase: 'off', color: '#E6E6E6', label: '休息2' }, // Day 3 → 第2个休息日
{ phase: 'day', color: '#0070C0', label: '日班1' }, // Day 4 → 第1个日班
{ phase: 'day', color: '#00B0F0', label: '日班2' }, // Day 5 → 第2个日班
{ phase: 'day', color: '#00BFFF', label: '日班3' }, // Day 6 → 第3个日班
{ phase: 'off', color: '#D9D9D9', label: '休息3' }, // Day 7 → 第3个休息日(即第2轮休息首日)
{ phase: 'off', color: '#CCCCCC', label: '休息4' } // Day 8 → 第4个休息日
];动态计算当日颜色(伪代码/JS 示例)
对任意日期 targetDate 和员工 emp:
function getShiftColor(emp, targetDate) {
const base = new Date(emp.shift_start_date);
const diffDays = Math.floor((targetDate - base) / (1000 * 60 * 60 * 24));
const index = ((diffDays % 9) + 9) % 9; // 防负数取模
return SHIFT_CYCLE[index].color;
}
// 使用示例:为2025-05-06着色(若张三 baseline=2025-05-01 → diff=5 → index=5 → #00B0F0)
console.log(getShiftColor({shift_start_date: '2025-05-01'}, new Date('2025-05-06'))); // → #00B0F0该方案彻底摆脱了“每周手动调整颜色”或“按星期几硬编码”的局限,让系统真正具备自演进能力——只要基准日确定,十年后的任意一天,颜色都可秒级精确生成。