课程库 Excel 导入导出已完成:

支持下载标准导入模板。
导出严格沿用当前关键词、学院、分类、课程性质和状态筛选。
以课程编码为唯一键:存在则更新,不存在则新增。
校验学院编码、课程分类、课程性质、学分学时及考核方式。
整批原子导入,任一行错误则全部不写入,并提示具体行号。
学院管理员仍只能维护本学院的专业课和实践课,无法借 Excel 越权。
界面入口沿用现有课程库工具栏样式。
This commit is contained in:
2026-07-24 18:56:25 +08:00 Unverified
parent 5a7a8d530b
commit d7cf3f9e76
24 changed files with 3710 additions and 32 deletions
@@ -156,10 +156,6 @@ public sealed class GraduationAuditsController(
{
var plan = plans.FirstOrDefault(x =>
x.MajorId == student.AdministrativeClass!.MajorId);
var requiredCourses = plan?.Modules
.SelectMany(x => x.Courses)
.Where(x => x.Type == CurriculumCourseType.Required)
.ToList() ?? [];
var studentGrades = grades.Where(x => x.StudentId == student.Id).ToList();
var passedCourseIds = studentGrades
.Where(IsPassed)
@@ -170,14 +166,12 @@ public sealed class GraduationAuditsController(
.Where(IsPassed)
.GroupBy(x => x.CourseId)
.Sum(x => x.Max(item => item.Credits));
var missingCourses = requiredCourses
.Where(x => !passedCourseIds.Contains(x.CourseId))
.Select(x => x.Course!.Name)
.Distinct()
.ToArray();
var completion = CurriculumCompletionRules.Evaluate(
plan?.Modules ?? [],
passedCourseIds);
var missingCourseNames = plan is null
? "未匹配已发布的培养方案"
: string.Join("、", missingCourses);
: string.Join("、", completion.MissingRequirements);
if (missingCourseNames.Length > 2000)
missingCourseNames = missingCourseNames[..2000];
var failedCourseCount = studentGrades
@@ -188,8 +182,8 @@ public sealed class GraduationAuditsController(
student.Status,
plan?.TotalCredits ?? 0,
earnedCredits,
requiredCourses.Count,
requiredCourses.Count - missingCourses.Length,
completion.RequirementCount,
completion.PassedRequirementCount,
failedCourseCount);
db.GraduationAuditResults.Add(new GraduationAuditResult
{
@@ -199,8 +193,8 @@ public sealed class GraduationAuditsController(
StudentStatusSnapshot = student.Status,
RequiredCredits = plan?.TotalCredits ?? 0,
EarnedCredits = earnedCredits,
RequiredCourseCount = requiredCourses.Count,
PassedRequiredCourseCount = requiredCourses.Count - missingCourses.Length,
RequiredCourseCount = completion.RequirementCount,
PassedRequiredCourseCount = completion.PassedRequirementCount,
FailedCourseCount = failedCourseCount,
MissingCourseNames = missingCourseNames,
CalculatedConclusion = conclusion,