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
}
+
///
/// 登录
///