diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs index aa76d7a..3211b28 100644 --- a/VOL.Ai/Services/AiAppService.cs +++ b/VOL.Ai/Services/AiAppService.cs @@ -1,5 +1,6 @@ using AutoMapper; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -139,6 +140,9 @@ namespace VOL.Ai.Services //if (res == null) // return new Ai_SchoolDto(); + if (string.IsNullOrWhiteSpace(paramDto.Code)) + throw new ArgumentException("学校编码不能为空", nameof(paramDto.Code)); + var schoolCode = paramDto.Code; // ========================= @@ -1489,13 +1493,19 @@ namespace VOL.Ai.Services /// /// /// + [HttpPost(nameof(ScanCodeLogin))] public async Task ScanCodeLogin(Ai_Request paramDto) { + if (paramDto == null || string.IsNullOrWhiteSpace(paramDto.Code) || string.IsNullOrWhiteSpace(paramDto.SchoolCode)) + throw new ArgumentException("参数不能为空!"); + + var schoolCode = paramDto.SchoolCode; + // ========================= - // 1️⃣ 查询登录信息 + // 1️⃣ 查询扫码登录信息 // ========================= var loginInfo = await _scanCodeLoginRepository - .FindAsIQueryable(x => x.Code == paramDto.Code && x.SchoolCode == paramDto.SchoolCode) + .FindAsIQueryable(x => x.Code == paramDto.Code && x.SchoolCode == schoolCode) .FirstOrDefaultAsync(); if (loginInfo == null) @@ -1504,93 +1514,80 @@ namespace VOL.Ai.Services // ========================= // 2️⃣ 获取京师老师信息 // ========================= - var teacher = await _jingShiTiJiaoService - .GetClassListByTeacher(loginInfo.TeacherPhoneNo); - - if (teacher == null) + var teacher = await _jingShiTiJiaoService.GetClassListByTeacher(loginInfo.TeacherPhoneNo); + if (teacher == null || string.IsNullOrWhiteSpace(teacher.TeacherNo) || string.IsNullOrWhiteSpace(teacher.TeacherName)) throw new Exception("获取京师老师信息失败!"); - if (string.IsNullOrWhiteSpace(teacher.TeacherNo)) - throw new Exception("接口返回的教师编号为空!"); - if (string.IsNullOrWhiteSpace(teacher.TeacherName)) - throw new Exception("接口返回的教师姓名为空!"); - - var schoolCode = paramDto.SchoolCode; var gradeDtos = teacher.GradeList ?? new List(); // ========================= - // 3️⃣ 同步教师信息 + // 3️⃣ 提取所有 GradeNo / ClassNo // ========================= - var existingTeacher = await _teacherRepository.DbContext.Set() - .FirstOrDefaultAsync(t => t.TeacherNo == teacher.TeacherNo); - - long tId; - if (existingTeacher != null) - { - tId = existingTeacher.Id; - } - else - { - var jsTeacher = new JS_Teacher - { - Code = paramDto.Code, - SchoolCode = schoolCode, - SchoolName = teacher.School ?? "", - TeacherName = teacher.TeacherName, - TeacherNo = teacher.TeacherNo - }; - - try - { - await _teacherRepository.DbContext.Set().AddAsync(jsTeacher); - await _teacherRepository.SaveChangesAsync(); - tId = jsTeacher.Id; - } - 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); - tId = conflictTeacher.Id; - } - } - - if (tId == 0) - throw new Exception("教师信息同步失败!"); - - // ===================================================== - // 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 allGradeNos = gradeDtos.Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) + .Select(g => g.GradeNo) + .ToList(); + // ========================= + // 4️⃣ 查询已有年级和班级 + // ========================= 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)) + .Include(g => g.Classes) .ToListAsync(); var existGradeNoSet = existGrades.Select(x => x.GradeNo).ToHashSet(); - var existClassNoSet = existClasses.Select(x => x.ClassNo).ToHashSet(); + var existClassNoSet = existGrades.SelectMany(g => g.Classes).Select(c => c.ClassNo).ToHashSet(); var newGrades = new List(); foreach (var g in gradeDtos) { - if (string.IsNullOrWhiteSpace(g.GradeNo) || existGradeNoSet.Contains(g.GradeNo)) + if (string.IsNullOrWhiteSpace(g.GradeNo)) continue; - var grade = new JS_Grade + 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, TeacherName = teacher.TeacherName, @@ -1599,8 +1596,7 @@ namespace VOL.Ai.Services GradeNo = g.GradeNo, GradeName = g.GradeName, Classes = g.ClassList? - .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo) - && !existClassNoSet.Contains(c.ClassNo)) + .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo)) .Select(c => new JS_Class { TeacherNo = teacher.TeacherNo, @@ -1614,16 +1610,18 @@ namespace VOL.Ai.Services }).ToList() ?? new List() }; - newGrades.Add(grade); - + newGrades.Add(gradeNew); existGradeNoSet.Add(g.GradeNo); - foreach (var c in grade.Classes) + 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(); @@ -1634,22 +1632,18 @@ namespace VOL.Ai.Services } // ========================= - // 5️⃣ 重新读取数据库,获取 Id + // 6️⃣ 组装返回 DTO // ========================= var dbGrades = await _studentRepository.DbContext.Set() .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo)) .Include(g => g.Classes) .ToListAsync(); - // ========================= - // 6️⃣ 组装返回 DTO - // ========================= var res = new Ai_TeacherFaceInfo { - Id = (int)tId, + Id = 0, // 老师表不操作 TeacherName = teacher.TeacherName, Phone = teacher.TeacherNo, - //Photo = teacher.TeacherNo, GradeAndClassList = dbGrades .SelectMany(g => g.Classes) .Select(c => new Classes @@ -1669,6 +1663,7 @@ namespace VOL.Ai.Services return res; } + /// /// 登录 ///