diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs index 710c8d5..3750efd 100644 --- a/VOL.Ai/Services/AiAppService.cs +++ b/VOL.Ai/Services/AiAppService.cs @@ -1,4 +1,5 @@ using AutoMapper; +using EFCore.BulkExtensions; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; @@ -253,7 +254,7 @@ namespace VOL.Ai.Services .ToListAsync(); res.Grade = dbGrades - .Where(g => g.Classes != null && g.Classes.Any()) + .Where(g => g.Classes != null && g.Classes.Any()) .Select(g => new Grades { Id = (int)g.Id, @@ -1520,41 +1521,51 @@ namespace VOL.Ai.Services if (teacher == null || string.IsNullOrWhiteSpace(teacher.TeacherNo) || string.IsNullOrWhiteSpace(teacher.TeacherName)) throw new Exception("获取京师老师信息失败!"); - var gradeDtos = teacher.GradeList ?? new List(); - var allGradeNos = gradeDtos.Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) - .Select(g => g.GradeNo) - .ToList(); + // 3️⃣ 确保老师存在数据库 + var dbTeacher = await _teacherRepository.DbContext.Set() + .FirstOrDefaultAsync(t => t.TeacherNo == teacher.TeacherNo); - // 3️⃣ 查询数据库已有年级和班级 + if (dbTeacher == null) + { + dbTeacher = new JS_Teacher + { + TeacherNo = teacher.TeacherNo, + TeacherName = teacher.TeacherName, + SchoolCode = paramDto.SchoolCode, + Code = paramDto.Code + }; + + await _teacherRepository.DbContext.Set().AddAsync(dbTeacher); + await _teacherRepository.DbContext.SaveChangesAsync(); // 保存后 Id 可用 + } + + var gradeDtos = teacher.GradeList ?? new List(); + var allGradeNos = gradeDtos + .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) + .Select(g => g.GradeNo) + .ToList(); + + // 4️⃣ 查询数据库已有年级和班级 var existGrades = await _studentRepository.DbContext.Set() - .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo)) + .Where(x => x.SchoolCode == schoolCode && x.TeacherNo == teacher.TeacherNo && allGradeNos.Contains(x.GradeNo)) .Include(g => g.Classes) .ToListAsync(); - // 4️⃣ 更新已存在的年级老师信息(直接 UPDATE) - foreach (var grade in existGrades) - { - grade.TeacherNo = teacher.TeacherNo; - grade.TeacherName = teacher.TeacherName; + var existClasses = existGrades.SelectMany(g => g.Classes).ToList(); - foreach (var cls in grade.Classes) - { - cls.TeacherNo = teacher.TeacherNo; - cls.TeacherName = teacher.TeacherName; - } - } + // 5️⃣ 先删除旧班级,再删除旧年级 + if (existClasses.Any()) + _studentRepository.DbContext.Set().RemoveRange(existClasses); - // 5️⃣ 构造新增年级和班级 - var newGrades = new List(); - var existGradeNoSet = existGrades.Select(g => g.GradeNo).ToHashSet(); - var existClassNoSet = existGrades.SelectMany(g => g.Classes).Select(c => c.ClassNo).ToHashSet(); + if (existGrades.Any()) + _studentRepository.DbContext.Set().RemoveRange(existGrades); - foreach (var g in gradeDtos) - { - if (string.IsNullOrWhiteSpace(g.GradeNo) || existGradeNoSet.Contains(g.GradeNo)) - continue; + await _studentRepository.DbContext.SaveChangesAsync(); - var gradeNew = new JS_Grade + // 6️⃣ 构造新增年级和班级 + var newGrades = gradeDtos + .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) + .Select(g => new JS_Grade { TeacherNo = teacher.TeacherNo, TeacherName = teacher.TeacherName, @@ -1575,33 +1586,19 @@ namespace VOL.Ai.Services ClassNo = c.ClassNo, ClassName = c.ClassName }).ToList() ?? new List() - }; - newGrades.Add(gradeNew); - } + }).ToList(); if (newGrades.Any()) await _studentRepository.DbContext.Set().AddRangeAsync(newGrades); - // 6️⃣ 保存所有修改和新增 - - // EF Core 显式标记更新 - _studentRepository.UpdateRange(existGrades); - - // 同时更新所有班级(必须显式) - var allClasses = existGrades.SelectMany(g => g.Classes).ToList(); - _classRepository.UpdateRange(allClasses); - await _studentRepository.DbContext.SaveChangesAsync(); - // 7️⃣ 返回结果 - var dbGrades = await _studentRepository.DbContext.Set() - .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo) && x.TeacherNo == teacher.TeacherNo) - .Include(g => g.Classes) - .ToListAsync(); + // 7️⃣ 使用 EF 跟踪的实体直接返回,不用再查询数据库 + var dbGrades = newGrades; var res = new Ai_TeacherFaceInfo { - Id = 0, + Id = (int)dbTeacher.Id, TeacherName = teacher.TeacherName, Phone = teacher.TeacherNo, GradeAndClassList = dbGrades @@ -1621,8 +1618,6 @@ namespace VOL.Ai.Services return res; } - - /// /// 登录 /// diff --git a/VOL.Business/Services/HomeWork/S_HomeWorkService.cs b/VOL.Business/Services/HomeWork/S_HomeWorkService.cs index 83b87ee..8a4e32f 100644 --- a/VOL.Business/Services/HomeWork/S_HomeWorkService.cs +++ b/VOL.Business/Services/HomeWork/S_HomeWorkService.cs @@ -141,7 +141,7 @@ namespace VOL.Business.Services.Norm if (paramDto.EndTime.HasValue) { DateTime detectionDate = paramDto.EndTime.Value.Date; - query = query.Where(x => x.EndTime.HasValue && x.EndTime.Value.Date < detectionDate); + query = query.Where(x => x.EndTime.HasValue && x.EndTime.Value.Date <= detectionDate); } res.Total = await query.CountAsync();