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