From b6583ed53a4965c8421cc85d8a5c7f5e1350331b Mon Sep 17 00:00:00 2001 From: tanglong <842690096@qq.com> Date: Wed, 28 Jan 2026 10:39:32 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=AF=BE=E5=A0=82=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VOL.Ai/Services/AiAppService.cs | 93 ++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 19 deletions(-) diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs index 710c8d5..3ad1810 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,6 +1521,25 @@ namespace VOL.Ai.Services if (teacher == null || string.IsNullOrWhiteSpace(teacher.TeacherNo) || string.IsNullOrWhiteSpace(teacher.TeacherName)) throw new Exception("获取京师老师信息失败!"); + // 2️⃣ 查询数据库中是否已有该老师 + var dbTeacher = await _teacherRepository.DbContext.Set() + .FirstOrDefaultAsync(t => t.TeacherNo == teacher.TeacherNo); + + 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(); + } + var gradeDtos = teacher.GradeList ?? new List(); var allGradeNos = gradeDtos.Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) .Select(g => g.GradeNo) @@ -1531,18 +1551,29 @@ namespace VOL.Ai.Services .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; - } - } + // 先删班级 + _studentRepository.DbContext.Set().RemoveRange(existClasses); + + // 再删年级 + _studentRepository.DbContext.Set().RemoveRange(existGrades); + + await _studentRepository.DbContext.SaveChangesAsync(); + + + // 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(); @@ -1584,12 +1615,12 @@ namespace VOL.Ai.Services // 6️⃣ 保存所有修改和新增 - // EF Core 显式标记更新 - _studentRepository.UpdateRange(existGrades); + //// EF Core 显式标记更新 + //_studentRepository.UpdateRange(existGrades); - // 同时更新所有班级(必须显式) - var allClasses = existGrades.SelectMany(g => g.Classes).ToList(); - _classRepository.UpdateRange(allClasses); + //// 同时更新所有班级(必须显式) + //var allClasses = existGrades.SelectMany(g => g.Classes).ToList(); + //_classRepository.UpdateRange(allClasses); await _studentRepository.DbContext.SaveChangesAsync(); @@ -1601,7 +1632,7 @@ namespace VOL.Ai.Services var res = new Ai_TeacherFaceInfo { - Id = 0, + Id = (int)dbTeacher.Id, TeacherName = teacher.TeacherName, Phone = teacher.TeacherNo, GradeAndClassList = dbGrades @@ -1614,6 +1645,31 @@ namespace VOL.Ai.Services .ToList() }; + + //// 3️⃣ 直接从 teacher 里组装年级班级数据(不进数据库) + //var gradeDtos = teacher.GradeList ?? new List(); + + //var classList = gradeDtos + // .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) + // .SelectMany(g => g.ClassList ?? new List(), + // (g, c) => new { g, c }) + // .Where(x => !string.IsNullOrWhiteSpace(x.c.ClassNo)) + // .Select(x => new Classes + // { + // Id = 0, // 不落库,Id 没意义 + // Name = $"{x.g.GradeName}-{x.c.ClassName}" + // }) + // .ToList(); + + //// 4️⃣ 返回结果 + //var res = new Ai_TeacherFaceInfo + //{ + // Id = 0, + // TeacherName = teacher.TeacherName, + // Phone = teacher.TeacherNo, + // GradeAndClassList = classList + //}; + // 8️⃣ 删除扫码记录 _scanCodeLoginRepository.Delete(loginInfo); await _scanCodeLoginRepository.SaveChangesAsync(); @@ -1622,7 +1678,6 @@ namespace VOL.Ai.Services } - /// /// 登录 /// From 5bb8e83a03a9e085e203d839c4cc25d3284ab111 Mon Sep 17 00:00:00 2001 From: tanglong <842690096@qq.com> Date: Wed, 28 Jan 2026 11:03:33 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VOL.Ai/Services/AiAppService.cs | 100 +++++++------------------------- 1 file changed, 20 insertions(+), 80 deletions(-) diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs index 3ad1810..3750efd 100644 --- a/VOL.Ai/Services/AiAppService.cs +++ b/VOL.Ai/Services/AiAppService.cs @@ -1521,13 +1521,12 @@ namespace VOL.Ai.Services if (teacher == null || string.IsNullOrWhiteSpace(teacher.TeacherNo) || string.IsNullOrWhiteSpace(teacher.TeacherName)) throw new Exception("获取京师老师信息失败!"); - // 2️⃣ 查询数据库中是否已有该老师 + // 3️⃣ 确保老师存在数据库 var dbTeacher = await _teacherRepository.DbContext.Set() .FirstOrDefaultAsync(t => t.TeacherNo == teacher.TeacherNo); if (dbTeacher == null) { - // 老师不存在,新增 dbTeacher = new JS_Teacher { TeacherNo = teacher.TeacherNo, @@ -1537,55 +1536,36 @@ namespace VOL.Ai.Services }; await _teacherRepository.DbContext.Set().AddAsync(dbTeacher); - await _teacherRepository.DbContext.SaveChangesAsync(); + 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(); + var allGradeNos = gradeDtos + .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) + .Select(g => g.GradeNo) + .ToList(); - // 3️⃣ 查询数据库已有年级和班级 + // 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(); var existClasses = existGrades.SelectMany(g => g.Classes).ToList(); - // 先删班级 - _studentRepository.DbContext.Set().RemoveRange(existClasses); + // 5️⃣ 先删除旧班级,再删除旧年级 + if (existClasses.Any()) + _studentRepository.DbContext.Set().RemoveRange(existClasses); - // 再删年级 - _studentRepository.DbContext.Set().RemoveRange(existGrades); + if (existGrades.Any()) + _studentRepository.DbContext.Set().RemoveRange(existGrades); await _studentRepository.DbContext.SaveChangesAsync(); - - // 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) || existGradeNoSet.Contains(g.GradeNo)) - continue; - - 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, @@ -1606,29 +1586,15 @@ 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 { @@ -1645,31 +1611,6 @@ namespace VOL.Ai.Services .ToList() }; - - //// 3️⃣ 直接从 teacher 里组装年级班级数据(不进数据库) - //var gradeDtos = teacher.GradeList ?? new List(); - - //var classList = gradeDtos - // .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) - // .SelectMany(g => g.ClassList ?? new List(), - // (g, c) => new { g, c }) - // .Where(x => !string.IsNullOrWhiteSpace(x.c.ClassNo)) - // .Select(x => new Classes - // { - // Id = 0, // 不落库,Id 没意义 - // Name = $"{x.g.GradeName}-{x.c.ClassName}" - // }) - // .ToList(); - - //// 4️⃣ 返回结果 - //var res = new Ai_TeacherFaceInfo - //{ - // Id = 0, - // TeacherName = teacher.TeacherName, - // Phone = teacher.TeacherNo, - // GradeAndClassList = classList - //}; - // 8️⃣ 删除扫码记录 _scanCodeLoginRepository.Delete(loginInfo); await _scanCodeLoginRepository.SaveChangesAsync(); @@ -1677,7 +1618,6 @@ namespace VOL.Ai.Services return res; } - /// /// 登录 /// From d692d62d2c01b56ebb85aa2c1bce47bd0d87a179 Mon Sep 17 00:00:00 2001 From: tanglong <842690096@qq.com> Date: Wed, 28 Jan 2026 11:16:30 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VOL.Business/Services/HomeWork/S_HomeWorkService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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();