feat: 调整默认排课节奏并限制时间选择
第一节 08:00-09:00,之后从 09:30 起每小时一节至 21:30;排课时间仅可选整点或半点。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
67
packages/app/src/utils/schedule-time.ts
Normal file
67
packages/app/src/utils/schedule-time.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import {
|
||||
DEFAULT_SCHEDULE_START_TIME,
|
||||
DEFAULT_SCHEDULE_END_TIME,
|
||||
SCHEDULE_MINUTE_STEP,
|
||||
} from '@mp-pilates/shared'
|
||||
|
||||
function buildHourOptions(): string[] {
|
||||
const startHour = parseInt(DEFAULT_SCHEDULE_START_TIME.slice(0, 2), 10)
|
||||
const endHour = parseInt(DEFAULT_SCHEDULE_END_TIME.slice(0, 2), 10)
|
||||
const list: string[] = []
|
||||
for (let h = startHour; h <= endHour; h++) {
|
||||
list.push(String(h).padStart(2, '0'))
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
function buildMinuteOptions(): string[] {
|
||||
const list: string[] = []
|
||||
for (let m = 0; m < 60; m += SCHEDULE_MINUTE_STEP) {
|
||||
list.push(String(m).padStart(2, '0'))
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
export const SCHEDULE_HOUR_OPTIONS = buildHourOptions()
|
||||
export const SCHEDULE_MINUTE_OPTIONS = buildMinuteOptions()
|
||||
export const SCHEDULE_TIME_PICKER_RANGE = [SCHEDULE_HOUR_OPTIONS, SCHEDULE_MINUTE_OPTIONS]
|
||||
|
||||
export function timeToMinutes(time: string): number {
|
||||
const [h, m] = time.split(':').map(Number)
|
||||
return h * 60 + (m || 0)
|
||||
}
|
||||
|
||||
export function minutesToTime(total: number): string {
|
||||
const h = Math.floor(total / 60)
|
||||
const m = total % 60
|
||||
return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`
|
||||
}
|
||||
|
||||
export function timeToPickerIndex(time: string): number[] {
|
||||
let total = timeToMinutes(time || DEFAULT_SCHEDULE_START_TIME)
|
||||
const minTotal = timeToMinutes(DEFAULT_SCHEDULE_START_TIME)
|
||||
const maxTotal = timeToMinutes(DEFAULT_SCHEDULE_END_TIME)
|
||||
total = Math.max(minTotal, Math.min(maxTotal, total))
|
||||
total = Math.round(total / SCHEDULE_MINUTE_STEP) * SCHEDULE_MINUTE_STEP
|
||||
total = Math.max(minTotal, Math.min(maxTotal, total))
|
||||
|
||||
const hour = String(Math.floor(total / 60)).padStart(2, '0')
|
||||
const minute = String(total % 60).padStart(2, '0')
|
||||
return [
|
||||
Math.max(0, SCHEDULE_HOUR_OPTIONS.indexOf(hour)),
|
||||
Math.max(0, SCHEDULE_MINUTE_OPTIONS.indexOf(minute)),
|
||||
]
|
||||
}
|
||||
|
||||
export function pickerIndexToTime(value: number[]): string {
|
||||
const hour = SCHEDULE_HOUR_OPTIONS[value[0]] ?? SCHEDULE_HOUR_OPTIONS[0]
|
||||
const minute = SCHEDULE_MINUTE_OPTIONS[value[1]] ?? SCHEDULE_MINUTE_OPTIONS[0]
|
||||
return `${hour}:${minute}`
|
||||
}
|
||||
|
||||
/** 将 "HH:mm" 加一小时,不超过当日最晚结束时间 21:30 */
|
||||
export function addOneHourCapped(time: string): string {
|
||||
const next = timeToMinutes(time) + 60
|
||||
const cap = timeToMinutes(DEFAULT_SCHEDULE_END_TIME)
|
||||
return minutesToTime(Math.min(next, cap))
|
||||
}
|
||||
Reference in New Issue
Block a user