diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs index 3211b28..710c8d5 100644 --- a/VOL.Ai/Services/AiAppService.cs +++ b/VOL.Ai/Services/AiAppService.cs @@ -21,6 +21,7 @@ using VOL.Model.JingShiTiJiao; using VOL.Model.Norm.Response; using VOL.Model.Training.Response; using VOL.System.IRepositories; +using VOL.System.Repositories; namespace VOL.Ai.Services { @@ -251,16 +252,20 @@ namespace VOL.Ai.Services .Include(g => g.Classes) .ToListAsync(); - res.Grade = dbGrades.Select(g => new Grades - { - Id = (int)g.Id, - Name = g.GradeName, - Class = g.Classes.Select(c => new Classes + res.Grade = dbGrades + .Where(g => g.Classes != null && g.Classes.Any()) + .Select(g => new Grades { - Id = (int)c.Id, - Name = c.ClassName - }).ToList() - }).ToList(); + Id = (int)g.Id, + Name = g.GradeName, + Class = g.Classes.Select(c => new Classes + { + Id = (int)c.Id, + Name = c.ClassName + }).ToList() + }) + .ToList(); + return res; @@ -1494,6 +1499,7 @@ namespace VOL.Ai.Services /// /// [HttpPost(nameof(ScanCodeLogin))] + [HttpPost(nameof(ScanCodeLogin))] public async Task ScanCodeLogin(Ai_Request paramDto) { if (paramDto == null || string.IsNullOrWhiteSpace(paramDto.Code) || string.IsNullOrWhiteSpace(paramDto.SchoolCode)) @@ -1501,9 +1507,7 @@ namespace VOL.Ai.Services var schoolCode = paramDto.SchoolCode; - // ========================= // 1️⃣ 查询扫码登录信息 - // ========================= var loginInfo = await _scanCodeLoginRepository .FindAsIQueryable(x => x.Code == paramDto.Code && x.SchoolCode == schoolCode) .FirstOrDefaultAsync(); @@ -1511,82 +1515,45 @@ namespace VOL.Ai.Services if (loginInfo == null) throw new Exception("未查询到登录信息!"); - // ========================= // 2️⃣ 获取京师老师信息 - // ========================= var teacher = await _jingShiTiJiaoService.GetClassListByTeacher(loginInfo.TeacherPhoneNo); if (teacher == null || string.IsNullOrWhiteSpace(teacher.TeacherNo) || string.IsNullOrWhiteSpace(teacher.TeacherName)) throw new Exception("获取京师老师信息失败!"); var gradeDtos = teacher.GradeList ?? new List(); - - // ========================= - // 3️⃣ 提取所有 GradeNo / ClassNo - // ========================= var allGradeNos = gradeDtos.Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) .Select(g => g.GradeNo) .ToList(); - // ========================= - // 4️⃣ 查询已有年级和班级 - // ========================= + // 3️⃣ 查询数据库已有年级和班级 var existGrades = await _studentRepository.DbContext.Set() .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo)) .Include(g => g.Classes) .ToListAsync(); - var existGradeNoSet = existGrades.Select(x => x.GradeNo).ToHashSet(); - var existClassNoSet = existGrades.SelectMany(g => g.Classes).Select(c => c.ClassNo).ToHashSet(); + // 4️⃣ 更新已存在的年级老师信息(直接 UPDATE) + foreach (var grade in existGrades) + { + grade.TeacherNo = teacher.TeacherNo; + grade.TeacherName = teacher.TeacherName; + foreach (var cls in grade.Classes) + { + cls.TeacherNo = teacher.TeacherNo; + cls.TeacherName = teacher.TeacherName; + } + } + + // 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(); foreach (var g in gradeDtos) { - if (string.IsNullOrWhiteSpace(g.GradeNo)) + if (string.IsNullOrWhiteSpace(g.GradeNo) || existGradeNoSet.Contains(g.GradeNo)) continue; - if (existGradeNoSet.Contains(g.GradeNo)) - { - // 已存在年级,更新老师信息 - var grade = existGrades.First(x => x.GradeNo == g.GradeNo); - grade.TeacherNo = teacher.TeacherNo; // ✅ 更新老师编号 - grade.TeacherName = teacher.TeacherName; // ✅ 更新老师姓名 - - foreach (var c in g.ClassList ?? new List()) - { - if (string.IsNullOrWhiteSpace(c.ClassNo)) - continue; - - var cls = grade.Classes.FirstOrDefault(x => x.ClassNo == c.ClassNo); - if (cls != null) - { - cls.TeacherNo = teacher.TeacherNo; // ✅ 更新班级老师编号 - cls.TeacherName = teacher.TeacherName; // ✅ 更新班级老师姓名 - } - else - { - // 新增班级 - var newClass = new JS_Class - { - TeacherNo = teacher.TeacherNo, - TeacherName = teacher.TeacherName, - SchoolCode = schoolCode, - Code = paramDto.Code, - GradeNo = g.GradeNo, - GradeName = g.GradeName, - ClassNo = c.ClassNo, - ClassName = c.ClassName, - GradeId = grade.Id - }; - grade.Classes.Add(newClass); - existClassNoSet.Add(c.ClassNo); - } - } - - continue; - } - - // 新增年级 + 班级 var gradeNew = new JS_Grade { TeacherNo = teacher.TeacherNo, @@ -1609,39 +1576,32 @@ namespace VOL.Ai.Services ClassName = c.ClassName }).ToList() ?? new List() }; - newGrades.Add(gradeNew); - existGradeNoSet.Add(g.GradeNo); - foreach (var c in gradeNew.Classes) - existClassNoSet.Add(c.ClassNo); } if (newGrades.Any()) await _studentRepository.DbContext.Set().AddRangeAsync(newGrades); - // ========================= - // 5️⃣ 保存(EF Core 自动生成 UPDATE) - // ========================= - try - { - await _studentRepository.DbContext.SaveChangesAsync(); - } - catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true) - { - // 并发唯一索引冲突可忽略 - } + // 6️⃣ 保存所有修改和新增 - // ========================= - // 6️⃣ 组装返回 DTO - // ========================= + // 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)) + .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo) && x.TeacherNo == teacher.TeacherNo) .Include(g => g.Classes) .ToListAsync(); var res = new Ai_TeacherFaceInfo { - Id = 0, // 老师表不操作 + Id = 0, TeacherName = teacher.TeacherName, Phone = teacher.TeacherNo, GradeAndClassList = dbGrades @@ -1654,9 +1614,7 @@ namespace VOL.Ai.Services .ToList() }; - // ========================= - // 7️⃣ 删除扫码记录 - // ========================= + // 8️⃣ 删除扫码记录 _scanCodeLoginRepository.Delete(loginInfo); await _scanCodeLoginRepository.SaveChangesAsync(); @@ -1664,6 +1622,7 @@ namespace VOL.Ai.Services } + /// /// 登录 ///