调课、停课、补课申请

This commit is contained in:
2026-07-25 15:36:14 +08:00 Unverified
parent 9685435da9
commit 13b61f191a
11 changed files with 1162 additions and 1 deletions
@@ -36,6 +36,8 @@ public sealed class DevelopmentSqliteMigrator(
"20260725_20_exam_scheduling_optimization";
private const string RetakeEnrollmentMigration =
"20260725_21_retake_enrollment";
private const string CourseAdjustmentsMigration =
"20260725_22_course_adjustments";
public async Task MigrateAsync(CancellationToken cancellationToken = default)
{
@@ -240,6 +242,19 @@ public sealed class DevelopmentSqliteMigrator(
RetakeEnrollmentMigration,
retakeEnrollmentExists ? [] : RetakeEnrollmentStatements,
cancellationToken);
var courseAdjustmentsExist = await db.Database
.SqlQueryRaw<int>(
"""
SELECT COUNT(*) AS "Value"
FROM sqlite_master
WHERE type = 'table' AND name = 'CourseAdjustments'
""")
.AnyAsync(value => value > 0, cancellationToken);
await ApplyMigrationAsync(
CourseAdjustmentsMigration,
courseAdjustmentsExist ? [] : CourseAdjustmentsStatements,
cancellationToken);
}
private async Task ApplyMigrationAsync(
@@ -1484,4 +1499,58 @@ public sealed class DevelopmentSqliteMigrator(
ADD COLUMN "EnrollmentType" INTEGER NOT NULL DEFAULT 1;
"""
];
private static readonly string[] CourseAdjustmentsStatements =
[
"""
CREATE TABLE "CourseAdjustments" (
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseAdjustments" PRIMARY KEY,
"TeachingTaskId" TEXT NOT NULL,
"Type" INTEGER NOT NULL,
"Status" INTEGER NOT NULL,
"ApplicantUserId" TEXT NOT NULL,
"TargetDate" TEXT NULL,
"DayOfWeek" INTEGER NULL,
"StartPeriod" INTEGER NULL,
"PeriodCount" INTEGER NULL,
"ClassroomId" TEXT NULL,
"SubstituteTeacherId" TEXT NULL,
"CancelWeek" INTEGER NULL,
"CancelDate" TEXT NULL,
"Reason" TEXT NOT NULL,
"ReviewComment" TEXT NULL,
"SubmittedAt" TEXT NULL,
"ReviewedAt" TEXT NULL,
"ReviewedByUserId" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_CourseAdjustments_TeachingTasks"
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id")
ON DELETE RESTRICT,
CONSTRAINT "FK_CourseAdjustments_Classrooms"
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id")
ON DELETE SET NULL,
CONSTRAINT "FK_CourseAdjustments_Teachers"
FOREIGN KEY ("SubstituteTeacherId") REFERENCES "Teachers" ("Id")
ON DELETE SET NULL
);
""",
"""CREATE INDEX "IX_CourseAdjustments_TeachingTaskId_Status" ON "CourseAdjustments" ("TeachingTaskId", "Status");""",
"""CREATE INDEX "IX_CourseAdjustments_ApplicantUserId" ON "CourseAdjustments" ("ApplicantUserId");""",
"""CREATE INDEX "IX_CourseAdjustments_Status_CreatedAt" ON "CourseAdjustments" ("Status", "CreatedAt");""",
"""
CREATE TABLE "Notifications" (
"Id" TEXT NOT NULL CONSTRAINT "PK_Notifications" PRIMARY KEY,
"UserId" TEXT NOT NULL,
"Title" TEXT NOT NULL,
"Content" TEXT NOT NULL,
"IsRead" INTEGER NOT NULL,
"LinkUrl" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL
);
""",
"""CREATE INDEX "IX_Notifications_UserId_IsRead" ON "Notifications" ("UserId", "IsRead");""",
"""CREATE INDEX "IX_Notifications_CreatedAt" ON "Notifications" ("CreatedAt");"""
];
}