年级班级

This commit is contained in:
tanglong 2026-01-14 17:31:27 +08:00
parent f7bf21f46a
commit 940ea162d2

View File

@ -1476,23 +1476,27 @@ namespace VOL.Ai.Services
// ========================= // =========================
var loginInfo = await _scanCodeLoginRepository var loginInfo = await _scanCodeLoginRepository
.FindAsIQueryable(x => x.Code == paramDto.Code && x.SchoolCode == paramDto.SchoolCode) .FindAsIQueryable(x => x.Code == paramDto.Code && x.SchoolCode == paramDto.SchoolCode)
//.FindAsIQueryable(x => x.Code == paramDto.Code)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (loginInfo == null) if (loginInfo == null)
throw new Exception("未查询到登录信息!"); throw new Exception("未查询到登录信息!");
// ========================= // =========================
// 2️⃣ 获取老师信息 // 2️⃣ 获取京师老师信息
// ========================= // =========================
var teacher = await _jingShiTiJiaoService.GetClassListByTeacher(loginInfo.TeacherPhoneNo); var teacher = await _jingShiTiJiaoService
.GetClassListByTeacher(loginInfo.TeacherPhoneNo);
if (teacher == null) if (teacher == null)
throw new Exception("获取京师老师信息失败!"); throw new Exception("获取京师老师信息失败!");
if (string.IsNullOrWhiteSpace(teacher.TeacherNo)) if (string.IsNullOrWhiteSpace(teacher.TeacherNo))
throw new Exception("接口返回的教师编号为空,无法插入!"); throw new Exception("接口返回的教师编号为空!");
if (string.IsNullOrWhiteSpace(teacher.TeacherName)) if (string.IsNullOrWhiteSpace(teacher.TeacherName))
throw new Exception("接口返回的教师姓名为空,无法插入!"); throw new Exception("接口返回的教师姓名为空!");
var schoolCode = paramDto.SchoolCode;
var gradeDtos = teacher.GradeList ?? new List<GradeDto>();
// ========================= // =========================
// 3️⃣ 同步教师信息 // 3️⃣ 同步教师信息
@ -1510,7 +1514,7 @@ namespace VOL.Ai.Services
var jsTeacher = new JS_Teacher var jsTeacher = new JS_Teacher
{ {
Code = paramDto.Code, Code = paramDto.Code,
SchoolCode = paramDto.SchoolCode, SchoolCode = schoolCode,
SchoolName = teacher.School ?? "", SchoolName = teacher.School ?? "",
TeacherName = teacher.TeacherName, TeacherName = teacher.TeacherName,
TeacherNo = teacher.TeacherNo TeacherNo = teacher.TeacherNo
@ -1522,7 +1526,8 @@ namespace VOL.Ai.Services
await _teacherRepository.SaveChangesAsync(); await _teacherRepository.SaveChangesAsync();
tId = jsTeacher.Id; tId = jsTeacher.Id;
} }
catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("IX_JS_Teacher_TeacherNo") == true) catch (DbUpdateException ex) when (
ex.InnerException?.Message.Contains("IX_JS_Teacher_TeacherNo") == true)
{ {
var conflictTeacher = await _teacherRepository.DbContext.Set<JS_Teacher>() var conflictTeacher = await _teacherRepository.DbContext.Set<JS_Teacher>()
.FirstAsync(t => t.TeacherNo == teacher.TeacherNo); .FirstAsync(t => t.TeacherNo == teacher.TeacherNo);
@ -1533,48 +1538,116 @@ namespace VOL.Ai.Services
if (tId == 0) if (tId == 0)
throw new Exception("教师信息同步失败!"); throw new Exception("教师信息同步失败!");
// ========================= // =====================================================
// 4️⃣ 获取数据库中的班级 Id // 4️⃣ 同步【年级 + 班级】(你提供的核心逻辑)
// ========================= // =====================================================
var classNos = teacher.GradeList var allGradeNos = gradeDtos
.Where(g => !string.IsNullOrWhiteSpace(g.GradeNo))
.Select(g => g.GradeNo)
.ToList();
var allClassNos = gradeDtos
.SelectMany(g => g.ClassList ?? new List<ClassDto>()) .SelectMany(g => g.ClassList ?? new List<ClassDto>())
.Where(c => !string.IsNullOrWhiteSpace(c.ClassNo))
.Select(c => c.ClassNo) .Select(c => c.ClassNo)
.ToList(); .ToList();
var dbClasses = await _classRepository.DbContext.Set<JS_Class>() var existGrades = await _studentRepository.DbContext.Set<JS_Grade>()
.Where(c => c.SchoolCode == paramDto.SchoolCode && classNos.Contains(c.ClassNo)) .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo))
.ToListAsync();
var existClasses = await _classRepository.DbContext.Set<JS_Class>()
.Where(x => x.SchoolCode == schoolCode && allClassNos.Contains(x.ClassNo))
.ToListAsync();
var existGradeNoSet = existGrades.Select(x => x.GradeNo).ToHashSet();
var existClassNoSet = existClasses.Select(x => x.ClassNo).ToHashSet();
var newGrades = new List<JS_Grade>();
foreach (var g in gradeDtos)
{
if (string.IsNullOrWhiteSpace(g.GradeNo) || existGradeNoSet.Contains(g.GradeNo))
continue;
var grade = new JS_Grade
{
TeacherNo = teacher.TeacherNo,
TeacherName = teacher.TeacherName,
SchoolCode = schoolCode,
Code = paramDto.Code,
GradeNo = g.GradeNo,
GradeName = g.GradeName,
Classes = g.ClassList?
.Where(c => !string.IsNullOrWhiteSpace(c.ClassNo)
&& !existClassNoSet.Contains(c.ClassNo))
.Select(c => 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
}).ToList() ?? new List<JS_Class>()
};
newGrades.Add(grade);
existGradeNoSet.Add(g.GradeNo);
foreach (var c in grade.Classes)
existClassNoSet.Add(c.ClassNo);
}
if (newGrades.Any())
await _studentRepository.DbContext.Set<JS_Grade>().AddRangeAsync(newGrades);
try
{
await _studentRepository.DbContext.SaveChangesAsync();
}
catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true)
{
// 并发唯一索引冲突可忽略
}
// =========================
// 5️⃣ 重新读取数据库,获取 Id
// =========================
var dbGrades = await _studentRepository.DbContext.Set<JS_Grade>()
.Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo))
.Include(g => g.Classes)
.ToListAsync(); .ToListAsync();
// ========================= // =========================
// 5️⃣ 组装返回 DTO // 6️⃣ 组装返回 DTO
// ========================= // =========================
var res = new Ai_TeacherFaceInfo var res = new Ai_TeacherFaceInfo
{ {
Id = (int)tId, Id = (int)tId,
TeacherName = teacher.TeacherName, TeacherName = teacher.TeacherName,
Phone = teacher.TeacherNo, Phone = teacher.TeacherNo,
GradeAndClassList = dbGrades
GradeAndClassList = teacher.GradeList .SelectMany(g => g.Classes)
.SelectMany(g => g.ClassList ?? new List<ClassDto>()) .Select(c => new Classes
.Select(c =>
{ {
var dbCls = dbClasses.FirstOrDefault(x => x.ClassNo == c.ClassNo); Id = (int)c.Id,
return new Classes Name = $"{c.GradeName}-{c.ClassName}"
{
Id = dbCls?.Id != null ? (int)dbCls.Id : 0,
Name = c.ClassName ?? ""
};
}) })
.ToList() .ToList()
}; };
// =========================
// 7️⃣ 删除扫码记录
// =========================
_scanCodeLoginRepository.Delete(loginInfo); _scanCodeLoginRepository.Delete(loginInfo);
await _scanCodeLoginRepository.SaveChangesAsync(); //await _scanCodeLoginRepository.SaveChangesAsync();
return res; return res;
} }
/// <summary> /// <summary>
/// 登录 /// 登录
/// </summary> /// </summary>