From 940ea162d2cb2854defc51ca9f18b4af2ab6ddb2 Mon Sep 17 00:00:00 2001 From: tanglong <842690096@qq.com> Date: Wed, 14 Jan 2026 17:31:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=B4=E7=BA=A7=E7=8F=AD=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VOL.Ai/Services/AiAppService.cs | 125 +++++++++++++++++++++++++------- 1 file changed, 99 insertions(+), 26 deletions(-) diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs index 7bd4e65..a9870e8 100644 --- a/VOL.Ai/Services/AiAppService.cs +++ b/VOL.Ai/Services/AiAppService.cs @@ -1476,23 +1476,27 @@ namespace VOL.Ai.Services // ========================= var loginInfo = await _scanCodeLoginRepository .FindAsIQueryable(x => x.Code == paramDto.Code && x.SchoolCode == paramDto.SchoolCode) - //.FindAsIQueryable(x => x.Code == paramDto.Code) .FirstOrDefaultAsync(); if (loginInfo == null) throw new Exception("未查询到登录信息!"); // ========================= - // 2️⃣ 获取老师信息 + // 2️⃣ 获取京师老师信息 // ========================= - var teacher = await _jingShiTiJiaoService.GetClassListByTeacher(loginInfo.TeacherPhoneNo); + var teacher = await _jingShiTiJiaoService + .GetClassListByTeacher(loginInfo.TeacherPhoneNo); + if (teacher == null) throw new Exception("获取京师老师信息失败!"); if (string.IsNullOrWhiteSpace(teacher.TeacherNo)) - throw new Exception("接口返回的教师编号为空,无法插入!"); + throw new Exception("接口返回的教师编号为空!"); if (string.IsNullOrWhiteSpace(teacher.TeacherName)) - throw new Exception("接口返回的教师姓名为空,无法插入!"); + throw new Exception("接口返回的教师姓名为空!"); + + var schoolCode = paramDto.SchoolCode; + var gradeDtos = teacher.GradeList ?? new List(); // ========================= // 3️⃣ 同步教师信息 @@ -1510,7 +1514,7 @@ namespace VOL.Ai.Services var jsTeacher = new JS_Teacher { Code = paramDto.Code, - SchoolCode = paramDto.SchoolCode, + SchoolCode = schoolCode, SchoolName = teacher.School ?? "", TeacherName = teacher.TeacherName, TeacherNo = teacher.TeacherNo @@ -1522,7 +1526,8 @@ namespace VOL.Ai.Services await _teacherRepository.SaveChangesAsync(); 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() .FirstAsync(t => t.TeacherNo == teacher.TeacherNo); @@ -1533,48 +1538,116 @@ namespace VOL.Ai.Services if (tId == 0) throw new Exception("教师信息同步失败!"); - // ========================= - // 4️⃣ 获取数据库中的班级 Id - // ========================= - var classNos = teacher.GradeList + // ===================================================== + // 4️⃣ 同步【年级 + 班级】(你提供的核心逻辑) + // ===================================================== + var allGradeNos = gradeDtos + .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) + .Select(g => g.GradeNo) + .ToList(); + + var allClassNos = gradeDtos .SelectMany(g => g.ClassList ?? new List()) + .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo)) .Select(c => c.ClassNo) .ToList(); - var dbClasses = await _classRepository.DbContext.Set() - .Where(c => c.SchoolCode == paramDto.SchoolCode && classNos.Contains(c.ClassNo)) + var existGrades = await _studentRepository.DbContext.Set() + .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo)) + .ToListAsync(); + + var existClasses = await _classRepository.DbContext.Set() + .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(); + + 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() + }; + + newGrades.Add(grade); + + existGradeNoSet.Add(g.GradeNo); + foreach (var c in grade.Classes) + existClassNoSet.Add(c.ClassNo); + } + + if (newGrades.Any()) + await _studentRepository.DbContext.Set().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() + .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo)) + .Include(g => g.Classes) .ToListAsync(); // ========================= - // 5️⃣ 组装返回 DTO + // 6️⃣ 组装返回 DTO // ========================= var res = new Ai_TeacherFaceInfo { Id = (int)tId, TeacherName = teacher.TeacherName, Phone = teacher.TeacherNo, - - GradeAndClassList = teacher.GradeList - .SelectMany(g => g.ClassList ?? new List()) - .Select(c => + GradeAndClassList = dbGrades + .SelectMany(g => g.Classes) + .Select(c => new Classes { - var dbCls = dbClasses.FirstOrDefault(x => x.ClassNo == c.ClassNo); - return new Classes - { - Id = dbCls?.Id != null ? (int)dbCls.Id : 0, - Name = c.ClassName ?? "" - }; + Id = (int)c.Id, + Name = $"{c.GradeName}-{c.ClassName}" }) .ToList() }; + // ========================= + // 7️⃣ 删除扫码记录 + // ========================= _scanCodeLoginRepository.Delete(loginInfo); - await _scanCodeLoginRepository.SaveChangesAsync(); + //await _scanCodeLoginRepository.SaveChangesAsync(); return res; } - /// /// 登录 ///