You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于独特日期公式动态调整排班字段及班次颜色映射?

最优方案:基于固定周期偏移的排班模型

核心思路是把固定循环班次转化为周期序列+起始偏移的模式,结合轻量数据结构实现无维护自动排班,同时满足颜色编码需求。

1. 核心规则建模

先把你的固定循环拆解成可复用的标准化序列:

  • 总周期长度:9天(2夜→2休→3白→2休)
  • 预定义班次序列(索引0-8):
    [夜班, 夜班, 休息, 休息, 白班, 白班, 白班, 休息, 休息]
    
  • 5种颜色对应场景:基础夜班、夜班重叠、基础白班、白班重叠、休息(可根据实际重叠规则调整命名)

2. 数据结构设计(替代HashMap的轻量化实现)

不用复杂的嵌套HashMap,两个简单结构就能搞定:

2.1 班次枚举(封装类型与颜色)

public enum ShiftType {
    NIGHT("夜班", "#FF5252"),
    NIGHT_OVERLAP("夜班重叠", "#FF8A80"),
    DAY("白班", "#69F0AE"),
    DAY_OVERLAP("白班重叠", "#A5D6A7"),
    REST("休息", "#F5F5F5");

    private final String label;
    private final String colorCode;

    ShiftType(String label, String colorCode) {
        this.label = label;
        this.colorCode = colorCode;
    }

    // 常规getter方法:getLabel(), getColorCode()
}

2.2 员工排班配置存储

用Map<Employee, LocalDate>存储每个员工的周期起始日期:

  • Key:员工对象
  • Value:该员工循环排班的起始日(比如用户拖拽到本周一的夜班字段,就把值设为本周一)

这个结构比嵌套HashMap更直观,查询和维护成本极低。

3. 核心排班计算逻辑

对于任意日期,直接计算员工当天的班次类型:

// 全局预定义周期序列
private static final ShiftType[] SHIFT_CYCLE = {
    ShiftType.NIGHT, ShiftType.NIGHT,
    ShiftType.REST, ShiftType.REST,
    ShiftType.DAY, ShiftType.DAY, ShiftType.DAY,
    ShiftType.REST, ShiftType.REST
};

public ShiftType getEmployeeShift(Employee employee, LocalDate targetDate) {
    LocalDate cycleStart = employeeShiftStartMap.get(employee);
    if (cycleStart == null) {
        return ShiftType.REST; // 未排班默认休息
    }

    // 计算目标日期在周期内的索引
    long daysDiff = ChronoUnit.DAYS.between(cycleStart, targetDate);
    int cycleIndex = (int) (daysDiff % SHIFT_CYCLE.length);
    // 处理目标日期早于起始日的情况,保证索引为正
    if (cycleIndex < 0) {
        cycleIndex += SHIFT_CYCLE.length;
    }

    return SHIFT_CYCLE[cycleIndex];
}

4. 重叠班次的颜色适配

当同一个班次字段(比如某日期的夜班栏)有多个员工时,直接根据员工数量切换颜色:

  • 员工数=1:使用基础班次颜色(如NIGHT)
  • 员工数≥2:使用重叠班次颜色(如NIGHT_OVERLAP)

渲染排班表时,针对每个日期的白/夜班栏统计员工数,再匹配对应颜色即可,无需额外存储颜色映射。

5. 拖拽初始化逻辑

用户拖拽员工到某日期的白/夜班字段时,自动设置员工的周期起始日:

  • 拖拽到夜班栏:直接把cycleStart设为该日期(周期第0天就是夜班,完美匹配)
  • 拖拽到白班栏:计算该日期在周期中的索引(白班对应索引4、5、6),倒推起始日:cycleStart = targetDate.minusDays(4)(比如拖拽到白班第一天,起始日就是4天前的夜班首日)

初始化完成后,后续所有日期的班次都会自动按循环生成,完全无需人工维护。

方案优势

  • 无冗余数据:仅存储员工起始日,所有排班靠计算生成,避免重复维护
  • 动态适配性:不管起始日期怎么调整,整个循环自动对齐
  • 逻辑解耦:颜色完全由班次类型和重叠数量决定,无需额外存储映射
  • 扩展性强:后续调整周期规则,只需修改SHIFT_CYCLE数组即可

内容的提问来源于stack exchange,提问作者Mateo Matijevic Bosnjak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:40:18