实验成绩计算
This commit is contained in:
@@ -100,6 +100,8 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
"20260809_52_reusable_course_groups";
|
||||
private const string CourseGradeStatisticsRefreshSettingsMigration =
|
||||
"20260809_53_course_grade_statistics_refresh_settings";
|
||||
private const string ExperimentCourseGradesMigration =
|
||||
"20260809_54_experiment_course_grades";
|
||||
|
||||
public async Task MigrateAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
@@ -721,6 +723,14 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
ReusableCourseGroupsMigration,
|
||||
courseGroupsExist ? [] : ReusableCourseGroupsStatements,
|
||||
cancellationToken);
|
||||
var experimentCourseGradesExist = await db.Database
|
||||
.SqlQueryRaw<int>(
|
||||
"SELECT COUNT(*) AS \"Value\" FROM sqlite_master WHERE type = 'table' AND name = 'ExperimentCourseGrades'")
|
||||
.AnyAsync(value => value > 0, cancellationToken);
|
||||
await ApplyMigrationAsync(
|
||||
ExperimentCourseGradesMigration,
|
||||
experimentCourseGradesExist ? [] : ExperimentCourseGradesStatements,
|
||||
cancellationToken);
|
||||
}
|
||||
|
||||
private async Task ApplyMigrationAsync(
|
||||
@@ -2989,6 +2999,80 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_CourseGradeStatisticsRefreshSettings_Key" ON "CourseGradeStatisticsRefreshSettings" ("Key");"""
|
||||
];
|
||||
|
||||
private static readonly string[] ExperimentCourseGradesStatements =
|
||||
[
|
||||
"""
|
||||
CREATE TABLE "ExperimentCourseGrades" (
|
||||
"Id" TEXT NOT NULL CONSTRAINT "PK_ExperimentCourseGrades" PRIMARY KEY,
|
||||
"TeachingTaskId" TEXT NOT NULL,
|
||||
"StudentId" TEXT NOT NULL,
|
||||
"WeightedAverageScore" TEXT NULL,
|
||||
"TotalWeight" TEXT NOT NULL,
|
||||
"PublishedProjectCount" INTEGER NOT NULL,
|
||||
"RefreshedAt" TEXT NOT NULL,
|
||||
"CreatedAt" TEXT NOT NULL,
|
||||
"UpdatedAt" TEXT NOT NULL,
|
||||
CONSTRAINT "FK_ExperimentCourseGrades_TeachingTasks_TeachingTaskId"
|
||||
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE CASCADE,
|
||||
CONSTRAINT "FK_ExperimentCourseGrades_Students_StudentId"
|
||||
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
|
||||
);
|
||||
""",
|
||||
"""CREATE INDEX "IX_ExperimentCourseGrades_StudentId" ON "ExperimentCourseGrades" ("StudentId");""",
|
||||
"""CREATE UNIQUE INDEX "IX_ExperimentCourseGrades_TeachingTaskId_StudentId" ON "ExperimentCourseGrades" ("TeachingTaskId", "StudentId");""",
|
||||
"""
|
||||
INSERT INTO "ExperimentCourseGrades"
|
||||
("Id", "TeachingTaskId", "StudentId", "WeightedAverageScore",
|
||||
"TotalWeight", "PublishedProjectCount", "RefreshedAt",
|
||||
"CreatedAt", "UpdatedAt")
|
||||
SELECT
|
||||
lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-' ||
|
||||
'4' || substr(lower(hex(randomblob(2))), 2) || '-' ||
|
||||
substr('89ab', abs(random()) % 4 + 1, 1) ||
|
||||
substr(lower(hex(randomblob(2))), 2) || '-' || lower(hex(randomblob(6))),
|
||||
project."TeachingTaskId",
|
||||
record."StudentId",
|
||||
CASE
|
||||
WHEN COUNT(*) = (
|
||||
SELECT COUNT(*)
|
||||
FROM "ExperimentGradeSheets" AS all_sheet
|
||||
INNER JOIN "ExperimentProjects" AS all_project
|
||||
ON all_project."Id" = all_sheet."ExperimentProjectId"
|
||||
WHERE all_sheet."Status" = 4
|
||||
AND all_project."TeachingTaskId" = project."TeachingTaskId")
|
||||
AND SUM(CASE WHEN record."TotalScore" IS NULL THEN 1 ELSE 0 END) = 0
|
||||
THEN ROUND(
|
||||
SUM(record."TotalScore" * sheet."ContributionWeight") /
|
||||
SUM(sheet."ContributionWeight"), 1)
|
||||
ELSE NULL
|
||||
END,
|
||||
(
|
||||
SELECT COALESCE(SUM(all_sheet."ContributionWeight"), 0)
|
||||
FROM "ExperimentGradeSheets" AS all_sheet
|
||||
INNER JOIN "ExperimentProjects" AS all_project
|
||||
ON all_project."Id" = all_sheet."ExperimentProjectId"
|
||||
WHERE all_sheet."Status" = 4
|
||||
AND all_project."TeachingTaskId" = project."TeachingTaskId"),
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM "ExperimentGradeSheets" AS all_sheet
|
||||
INNER JOIN "ExperimentProjects" AS all_project
|
||||
ON all_project."Id" = all_sheet."ExperimentProjectId"
|
||||
WHERE all_sheet."Status" = 4
|
||||
AND all_project."TeachingTaskId" = project."TeachingTaskId"),
|
||||
strftime('%Y-%m-%d %H:%M:%f', 'now'),
|
||||
strftime('%Y-%m-%d %H:%M:%f', 'now'),
|
||||
strftime('%Y-%m-%d %H:%M:%f', 'now')
|
||||
FROM "ExperimentGradeRecords" AS record
|
||||
INNER JOIN "ExperimentGradeSheets" AS sheet
|
||||
ON sheet."Id" = record."ExperimentGradeSheetId"
|
||||
INNER JOIN "ExperimentProjects" AS project
|
||||
ON project."Id" = sheet."ExperimentProjectId"
|
||||
WHERE sheet."Status" = 4
|
||||
GROUP BY project."TeachingTaskId", record."StudentId";
|
||||
"""
|
||||
];
|
||||
|
||||
private static readonly string[] ExperimentClassroomConstraintStatements =
|
||||
[
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user