meyou ecf4cf601e 新增个人轮班 MVP:左上角胶囊显示班/休
新增 ShiftPattern 数据模型,以锚点日期 + 循环序列描述周期性轮班,与法定调休完全独立。
默认配置 2026-05-15 起 [班,班,休,休] 4 天周期,DayCell 左上角渲染胶囊角标。
2026-05-16 19:12:18 +08:00

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]
}
}