feat: 调整默认排课节奏并限制时间选择
第一节 08:00-09:00,之后从 09:30 起每小时一节至 21:30;排课时间仅可选整点或半点。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user