学籍异动:休学、复学、退学申请及辅导员→学院→教务处分级审批。

毕业审核:批次计算、缺失课程检查、人工复核、结果发布。
学位授予:毕业资格与 GPA 计算、人工调整、发布授予结果。
毕业离校:离校事项配置、责任角色分工、逐项办理及批次关闭。
This commit is contained in:
2026-07-24 17:30:05 +08:00 Unverified
parent 7493ab4a60
commit b0eaa20da6
34 changed files with 11137 additions and 8 deletions
@@ -15,6 +15,9 @@ public sealed class DevelopmentSqliteMigrator(
private const string GradesMigration = "20260724_07_grades";
private const string ExamsMigration = "20260724_08_exams";
private const string StudentStatusChangesMigration = "20260724_09_student_status_changes";
private const string GraduationAuditsMigration = "20260724_10_graduation_audits";
private const string DegreeAwardsMigration = "20260724_11_degree_awards";
private const string GraduationClearanceMigration = "20260724_12_graduation_clearance";
public async Task MigrateAsync(CancellationToken cancellationToken = default)
{
@@ -75,6 +78,18 @@ public sealed class DevelopmentSqliteMigrator(
StudentStatusChangesMigration,
StudentStatusChangesStatements,
cancellationToken);
await ApplyMigrationAsync(
GraduationAuditsMigration,
GraduationAuditsStatements,
cancellationToken);
await ApplyMigrationAsync(
DegreeAwardsMigration,
DegreeAwardsStatements,
cancellationToken);
await ApplyMigrationAsync(
GraduationClearanceMigration,
GraduationClearanceStatements,
cancellationToken);
}
private async Task ApplyMigrationAsync(
@@ -637,4 +652,119 @@ public sealed class DevelopmentSqliteMigrator(
""",
"""CREATE INDEX IF NOT EXISTS "IX_StudentStatusChanges_StudentId_State" ON "StudentStatusChanges" ("StudentId", "State");"""
];
private static readonly string[] GraduationAuditsStatements =
[
"""
CREATE TABLE IF NOT EXISTS "GraduationAuditBatches" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationAuditBatches" PRIMARY KEY,
"Name" TEXT NOT NULL, "GraduationYear" INTEGER NOT NULL,
"EnrollmentYear" INTEGER NOT NULL, "Status" INTEGER NOT NULL,
"Notes" TEXT NULL, "CalculatedAt" TEXT NULL, "PublishedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditBatches_GraduationYear_EnrollmentYear" ON "GraduationAuditBatches" ("GraduationYear", "EnrollmentYear");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditBatches_Status" ON "GraduationAuditBatches" ("Status");""",
"""
CREATE TABLE IF NOT EXISTS "GraduationAuditResults" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationAuditResults" PRIMARY KEY,
"GraduationAuditBatchId" TEXT NOT NULL, "StudentId" TEXT NOT NULL,
"CurriculumPlanId" TEXT NULL, "StudentStatusSnapshot" INTEGER NOT NULL,
"RequiredCredits" TEXT NOT NULL, "EarnedCredits" TEXT NOT NULL,
"RequiredCourseCount" INTEGER NOT NULL,
"PassedRequiredCourseCount" INTEGER NOT NULL,
"FailedCourseCount" INTEGER NOT NULL,
"MissingCourseNames" TEXT NOT NULL,
"CalculatedConclusion" INTEGER NOT NULL, "Conclusion" INTEGER NOT NULL,
"IsOverridden" INTEGER NOT NULL, "ReviewComment" TEXT NULL,
"ReviewedAt" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_GraduationAuditResults_GraduationAuditBatches_GraduationAuditBatchId"
FOREIGN KEY ("GraduationAuditBatchId") REFERENCES "GraduationAuditBatches" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_GraduationAuditResults_Students_StudentId"
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT,
CONSTRAINT "FK_GraduationAuditResults_CurriculumPlans_CurriculumPlanId"
FOREIGN KEY ("CurriculumPlanId") REFERENCES "CurriculumPlans" ("Id") ON DELETE SET NULL
);
""",
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_GraduationAuditResults_GraduationAuditBatchId_StudentId" ON "GraduationAuditResults" ("GraduationAuditBatchId", "StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditResults_StudentId" ON "GraduationAuditResults" ("StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditResults_CurriculumPlanId" ON "GraduationAuditResults" ("CurriculumPlanId");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditResults_Conclusion_IsOverridden" ON "GraduationAuditResults" ("Conclusion", "IsOverridden");"""
];
private static readonly string[] DegreeAwardsStatements =
[
"""
CREATE TABLE IF NOT EXISTS "DegreeAwardBatches" (
"Id" TEXT NOT NULL CONSTRAINT "PK_DegreeAwardBatches" PRIMARY KEY,
"Name" TEXT NOT NULL, "GraduationYear" INTEGER NOT NULL,
"DegreeName" TEXT NOT NULL, "MinimumGradePoint" TEXT NOT NULL,
"Status" INTEGER NOT NULL, "Notes" TEXT NULL,
"CalculatedAt" TEXT NULL, "PublishedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardBatches_GraduationYear_Status" ON "DegreeAwardBatches" ("GraduationYear", "Status");""",
"""
CREATE TABLE IF NOT EXISTS "DegreeAwardResults" (
"Id" TEXT NOT NULL CONSTRAINT "PK_DegreeAwardResults" PRIMARY KEY,
"DegreeAwardBatchId" TEXT NOT NULL, "StudentId" TEXT NOT NULL,
"GraduationAuditResultId" TEXT NOT NULL, "AverageGradePoint" TEXT NOT NULL,
"CalculatedConclusion" INTEGER NOT NULL, "Conclusion" INTEGER NOT NULL,
"ExceptionReason" TEXT NOT NULL, "IsOverridden" INTEGER NOT NULL,
"ReviewComment" TEXT NULL, "ReviewedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_DegreeAwardResults_DegreeAwardBatches_DegreeAwardBatchId"
FOREIGN KEY ("DegreeAwardBatchId") REFERENCES "DegreeAwardBatches" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_DegreeAwardResults_Students_StudentId"
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT,
CONSTRAINT "FK_DegreeAwardResults_GraduationAuditResults_GraduationAuditResultId"
FOREIGN KEY ("GraduationAuditResultId") REFERENCES "GraduationAuditResults" ("Id") ON DELETE RESTRICT
);
""",
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_DegreeAwardResults_DegreeAwardBatchId_StudentId" ON "DegreeAwardResults" ("DegreeAwardBatchId", "StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardResults_StudentId" ON "DegreeAwardResults" ("StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardResults_GraduationAuditResultId" ON "DegreeAwardResults" ("GraduationAuditResultId");""",
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardResults_Conclusion_IsOverridden" ON "DegreeAwardResults" ("Conclusion", "IsOverridden");"""
];
private static readonly string[] GraduationClearanceStatements =
[
"""
CREATE TABLE IF NOT EXISTS "GraduationClearanceBatches" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationClearanceBatches" PRIMARY KEY,
"Name" TEXT NOT NULL, "GraduationYear" INTEGER NOT NULL,
"Status" INTEGER NOT NULL, "Notes" TEXT NULL, "ClosedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationClearanceBatches_GraduationYear_Status" ON "GraduationClearanceBatches" ("GraduationYear", "Status");""",
"""
CREATE TABLE IF NOT EXISTS "GraduationClearanceItems" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationClearanceItems" PRIMARY KEY,
"GraduationClearanceBatchId" TEXT NOT NULL, "Code" TEXT NOT NULL,
"Name" TEXT NOT NULL, "ResponsibleUnit" TEXT NOT NULL,
"ResponsibleRole" TEXT NOT NULL, "IsRequired" INTEGER NOT NULL,
"SortOrder" INTEGER NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_GraduationClearanceItems_GraduationClearanceBatches_GraduationClearanceBatchId"
FOREIGN KEY ("GraduationClearanceBatchId") REFERENCES "GraduationClearanceBatches" ("Id") ON DELETE CASCADE
);
""",
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_GraduationClearanceItems_GraduationClearanceBatchId_Code" ON "GraduationClearanceItems" ("GraduationClearanceBatchId", "Code");""",
"""
CREATE TABLE IF NOT EXISTS "GraduationClearanceRecords" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationClearanceRecords" PRIMARY KEY,
"GraduationClearanceItemId" TEXT NOT NULL, "StudentId" TEXT NOT NULL,
"Status" INTEGER NOT NULL, "Notes" TEXT NULL, "CompletedAt" TEXT NULL,
"CompletedByUserId" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_GraduationClearanceRecords_GraduationClearanceItems_GraduationClearanceItemId"
FOREIGN KEY ("GraduationClearanceItemId") REFERENCES "GraduationClearanceItems" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_GraduationClearanceRecords_Students_StudentId"
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
);
""",
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_GraduationClearanceRecords_GraduationClearanceItemId_StudentId" ON "GraduationClearanceRecords" ("GraduationClearanceItemId", "StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationClearanceRecords_StudentId_Status" ON "GraduationClearanceRecords" ("StudentId", "Status");"""
];
}