feat: 调整默认排课节奏并限制时间选择

第一节 08:00-09:00,之后从 09:30 起每小时一节至 21:30;排课时间仅可选整点或半点。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
richarjiang
2026-09-06 20:12:52 +08:00
parent 14d7c03b05
commit 15d96c722b
7 changed files with 168 additions and 46 deletions

View File

@@ -15,17 +15,42 @@ export const DEFAULT_SLOT_CAPACITY = 1
/** 自动生成时段的天数范围 */
export const SLOT_GENERATION_DAYS = 14
/** 默认排课时间表:每天 08:00-22:00每小时一节课 */
export const DEFAULT_SCHEDULE_START_HOUR = 8
export const DEFAULT_SCHEDULE_END_HOUR = 22
/** 默认排课时间表:第一节 08:00-09:00之后从 09:30 起每小时一节至 21:30 */
export const DEFAULT_SCHEDULE_START_TIME = '08:00'
export const DEFAULT_SCHEDULE_END_TIME = '21:30'
/** 第一节课后的半点课表起点 */
export const DEFAULT_SCHEDULE_OFFSET_START_TIME = '09:30'
/** 排课时间选择步长:仅整点与半点 */
export const SCHEDULE_MINUTE_STEP = 30
function parseTimeToMinutes(time: string): number {
const [hours, minutes] = time.split(':').map(Number)
return hours * 60 + (minutes || 0)
}
function formatMinutesToTime(totalMinutes: number): string {
const hours = Math.floor(totalMinutes / 60)
const minutes = totalMinutes % 60
return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`
}
/** 生成默认时段列表 (startTime, endTime) */
export function getDefaultTimeSlots(): ReadonlyArray<{ readonly startTime: string; readonly endTime: string }> {
const slots: Array<{ startTime: string; endTime: string }> = []
for (let h = DEFAULT_SCHEDULE_START_HOUR; h < DEFAULT_SCHEDULE_END_HOUR; h++) {
const startTime = String(h).padStart(2, '0') + ':00'
const endTime = String(h + 1).padStart(2, '0') + ':00'
slots.push({ startTime, endTime })
const duration = 60
const slots: Array<{ startTime: string; endTime: string }> = [
{ startTime: DEFAULT_SCHEDULE_START_TIME, endTime: '09:00' },
]
const endMinutes = parseTimeToMinutes(DEFAULT_SCHEDULE_END_TIME)
for (
let t = parseTimeToMinutes(DEFAULT_SCHEDULE_OFFSET_START_TIME);
t + duration <= endMinutes;
t += duration
) {
slots.push({
startTime: formatMinutesToTime(t),
endTime: formatMinutesToTime(t + duration),
})
}
return slots
}

View File

@@ -19,8 +19,10 @@ export {
DEFAULT_STUDIO_GALLERY_PHOTOS,
DEFAULT_SLOT_CAPACITY,
SLOT_GENERATION_DAYS,
DEFAULT_SCHEDULE_START_HOUR,
DEFAULT_SCHEDULE_END_HOUR,
DEFAULT_SCHEDULE_START_TIME,
DEFAULT_SCHEDULE_END_TIME,
DEFAULT_SCHEDULE_OFFSET_START_TIME,
SCHEDULE_MINUTE_STEP,
getDefaultTimeSlots,
TIME_PERIODS,
DATE_SELECTOR_DAYS,