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

@@ -51,7 +51,7 @@ describe('SlotGeneratorService', () => {
// -------------------------------------------------------------------------
describe('generateSlots', () => {
it('creates slots for every day using the default schedule (14 slots per day)', async () => {
it('creates slots for every day using the default schedule', async () => {
const defaultSlots = getDefaultTimeSlots()
mockPrisma.timeSlot.createMany.mockResolvedValueOnce({ count: defaultSlots.length * 7 })
@@ -64,24 +64,25 @@ describe('SlotGeneratorService', () => {
skipDuplicates: boolean
}
expect(skipDuplicates).toBe(true)
// 7 days × 14 slots per day = 98
expect(data).toHaveLength(defaultSlots.length * 7)
expect(count).toBe(defaultSlots.length * 7)
})
it('creates 14 slots per day (08:00-22:00 hourly)', async () => {
mockPrisma.timeSlot.createMany.mockResolvedValueOnce({ count: 14 })
it('creates 13 slots per day (08:00-09:00, then 09:30-21:30 hourly)', async () => {
mockPrisma.timeSlot.createMany.mockResolvedValueOnce({ count: 13 })
await service.generateSlots(1)
const { data } = mockPrisma.timeSlot.createMany.mock.calls[0][0] as {
data: Array<{ startTime: string; endTime: string }>
}
expect(data).toHaveLength(14)
expect(data).toHaveLength(13)
expect(data[0].startTime).toBe('08:00')
expect(data[0].endTime).toBe('09:00')
expect(data[13].startTime).toBe('21:00')
expect(data[13].endTime).toBe('22:00')
expect(data[1].startTime).toBe('09:30')
expect(data[1].endTime).toBe('10:30')
expect(data[12].startTime).toBe('20:30')
expect(data[12].endTime).toBe('21:30')
})
it('passes skipDuplicates: true to handle existing date+time combinations', async () => {
@@ -96,7 +97,7 @@ describe('SlotGeneratorService', () => {
})
it('sets source to TEMPLATE for all generated slots', async () => {
mockPrisma.timeSlot.createMany.mockResolvedValueOnce({ count: 14 })
mockPrisma.timeSlot.createMany.mockResolvedValueOnce({ count: 13 })
await service.generateSlots(1)

View File

@@ -25,7 +25,7 @@ export class SlotGeneratorService {
/**
* Generate time slots for the next `daysAhead` days based on the fixed
* default schedule (Mon-Sun, 08:00-22:00 hourly).
* default schedule (Mon-Sun: 08:00-09:00, then 09:30-21:30 hourly).
* Uses `createMany` with `skipDuplicates` so re-runs are safe.
*
* @returns Number of newly created slots