ai 运动

This commit is contained in:
tanglong 2026-01-26 18:52:09 +08:00
parent 4223361919
commit 17d110a878

View File

@ -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
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpPost(nameof(ScanCodeLogin))]
[HttpPost(nameof(ScanCodeLogin))]
public async Task<Ai_TeacherFaceInfo> 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<GradeDto>();
// =========================
// 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<JS_Grade>()
.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<JS_Grade>();
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<ClassDto>())
{
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<JS_Class>()
};
newGrades.Add(gradeNew);
existGradeNoSet.Add(g.GradeNo);
foreach (var c in gradeNew.Classes)
existClassNoSet.Add(c.ClassNo);
}
if (newGrades.Any())
await _studentRepository.DbContext.Set<JS_Grade>().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<JS_Grade>()
.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
}
/// <summary>
/// 登录
/// </summary>