新增 ShiftPattern 数据模型,以锚点日期 + 循环序列描述周期性轮班,与法定调休完全独立。 默认配置 2026-05-15 起 [班,班,休,休] 4 天周期,DayCell 左上角渲染胶囊角标。
34 lines
1.0 KiB
Kotlin
34 lines
1.0 KiB
Kotlin
package plus.rua.project
|
|
|
|
import kotlinx.datetime.LocalDate
|
|
import kotlinx.datetime.daysUntil
|
|
|
|
/**
|
|
* 个人轮班类型。仅区分上班与休息;后续可扩展早/中/晚班、休假等。
|
|
*/
|
|
enum class ShiftKind { WORK, OFF }
|
|
|
|
/**
|
|
* 个人轮班周期。
|
|
*
|
|
* 与法定节假日完全独立:周期内某天是 WORK 还是 OFF,只看
|
|
* `(date - anchorDate) mod cycle.size` 在 cycle 中的取值,不受任何节假日/调休影响。
|
|
*
|
|
* @param anchorDate 周期基准日,对应 cycle[0]
|
|
* @param cycle 一个周期内的班次序列,例如 [WORK, WORK, OFF, OFF] 表示 "2 班 2 休"
|
|
* @param name 方案名,用于后续多套方案场景
|
|
*/
|
|
data class ShiftPattern(
|
|
val anchorDate: LocalDate,
|
|
val cycle: List<ShiftKind>,
|
|
val name: String = "默认"
|
|
) {
|
|
fun kindAt(date: LocalDate): ShiftKind? {
|
|
if (cycle.isEmpty()) return null
|
|
val diff = anchorDate.daysUntil(date)
|
|
val size = cycle.size
|
|
val idx = ((diff % size) + size) % size
|
|
return cycle[idx]
|
|
}
|
|
}
|