年级班级

This commit is contained in:
tanglong 2026-01-26 16:50:33 +08:00
parent be31757973
commit e6f5ef8932
2 changed files with 300 additions and 125 deletions

View File

@ -139,126 +139,167 @@ namespace VOL.Ai.Services
//if (res == null)
// return new Ai_SchoolDto();
//var schoolCode = paramDto.Code;
//// =========================
//// 2️⃣ 调用京师接口获取学校年级班级
//// =========================
//var schoolClass = await _jingShiTiJiaoService.GetClassBySchoolAsync(schoolCode);
//if (schoolClass?.Grades == null || !schoolClass.Grades.Any())
// throw new Exception("获取京师年级班级失败!");
//var res = new Ai_SchoolDto()
//{
// SchoolCode = schoolCode,
// Name = schoolClass.SchoolName,
// Type = 1,
// Province = "",
// City = ""
//};
//var gradeDtos = schoolClass.Grades;
//// =========================
//// 3️⃣ 提取所有 GradeNo / ClassNo
//// =========================
//var allGradeNos = gradeDtos
// .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo))
// .Select(g => g.GradeNo)
// .ToList();
//var allClassNos = gradeDtos
// .SelectMany(g => g.Classes ?? new List<JingShiClassDto>())
// .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo))
// .Select(c => c.ClassNo)
// .ToList();
//// =========================
//// 4️⃣ 查询数据库中已存在的数据(幂等)
//// =========================
//var existGrades = await _studentRepository.DbContext.Set<JS_Grade>()
// .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();
//// =========================
//// 5️⃣ 构造待插入的年级 + 班级
//// =========================
//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
// {
// SchoolCode = schoolCode,
// Code = paramDto.Code,
// GradeNo = g.GradeNo,
// GradeName = g.GradeName,
// Classes = g.Classes?
// .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo) && !existClassNoSet.Contains(c.ClassNo))
// .Select(c => new JS_Class
// {
// 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);
//// =========================
//// 6️⃣ 保存(并发幂等兜底)
//// =========================
//try
//{
// await _studentRepository.DbContext.SaveChangesAsync();
//}
//catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true)
//{
// // 并发下唯一索引冲突可忽略
//}
//// =========================
//// 7️⃣ 回查数据库,组装返回 DTO
//// =========================
//var dbGrades = await _studentRepository.DbContext.Set<JS_Grade>()
// .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo))
// .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
// {
// Id = (int)c.Id,
// Name = c.ClassName
// }).ToList()
//}).ToList();
//return res;
if (string.IsNullOrWhiteSpace(paramDto.Code))
throw new ArgumentException("学校编码不能为空", nameof(paramDto.Code));
var schoolCode = paramDto.Code;
// =========================
// 2️⃣ 调用京师接口获取学校年级班级
// 1️⃣ 调用京师接口获取学校信息及年级班级
// =========================
var schoolClass = await _jingShiTiJiaoService.GetClassBySchoolAsync(schoolCode);
if (schoolClass?.Grades == null || !schoolClass.Grades.Any())
throw new Exception("获取京师年级班级失败!");
// =========================
// 2️⃣ 组装返回 DTO
// =========================
var res = new Ai_SchoolDto()
{
SchoolCode = schoolCode,
Name = schoolClass.SchoolName,
Type = 1,
Type = 1, // 可根据业务修改
Province = "",
City = ""
};
var gradeDtos = schoolClass.Grades;
// =========================
// 3️⃣ 提取所有 GradeNo / ClassNo
// =========================
var allGradeNos = gradeDtos
.Where(g => !string.IsNullOrWhiteSpace(g.GradeNo))
.Select(g => g.GradeNo)
.ToList();
var allClassNos = gradeDtos
.SelectMany(g => g.Classes ?? new List<JingShiClassDto>())
.Where(c => !string.IsNullOrWhiteSpace(c.ClassNo))
.Select(c => c.ClassNo)
.ToList();
// =========================
// 4️⃣ 查询数据库中已存在的数据(幂等)
// =========================
var existGrades = await _studentRepository.DbContext.Set<JS_Grade>()
.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();
// =========================
// 5️⃣ 构造待插入的年级 + 班级
// =========================
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
City = "",
Grade = schoolClass.Grades.Select(g => new Grades
{
SchoolCode = schoolCode,
Code = paramDto.Code,
GradeNo = g.GradeNo,
GradeName = g.GradeName,
Classes = g.Classes?
.Where(c => !string.IsNullOrWhiteSpace(c.ClassNo) && !existClassNoSet.Contains(c.ClassNo))
.Select(c => new JS_Class
{
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);
// =========================
// 6️⃣ 保存(并发幂等兜底)
// =========================
try
{
await _studentRepository.DbContext.SaveChangesAsync();
}
catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true)
{
// 并发下唯一索引冲突可忽略
}
// =========================
// 7️⃣ 回查数据库,组装返回 DTO
// =========================
var dbGrades = await _studentRepository.DbContext.Set<JS_Grade>()
.Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo))
.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
{
Id = (int)c.Id,
Name = c.ClassName
Id = 0, // 京师接口没有数据库 Id,可用占位
Name = g.GradeName,
Class = g.Classes?.Select(c => new Classes
{
Id = 0, // 同上
Name = c.ClassName
}).ToList() ?? new List<Classes>()
}).ToList()
}).ToList();
};
return res;
}

View File

@ -16,6 +16,7 @@ using VOL.Entity.DomainModels;
using VOL.Entity.Enum;
using VOL.Model;
using VOL.Model.HomeWork;
using VOL.Model.JingShiTiJiao;
using VOL.Model.Training.Response;
using VOL.System.IRepositories;
using VOL.System.Repositories;
@ -128,40 +129,173 @@ namespace VOL.WebApi.Controllers.JingShiTiJiao
[HttpGet(nameof(GetGradeList))]
public async Task<List<GradeNameModel>> GetGradeList(string schoolCode)
{
//if (string.IsNullOrWhiteSpace(schoolCode))
// return new List<GradeNameModel>();
//var dbContext = _studentRepository.DbContext;
//// 1️⃣ 先从数据库读取年级
//var grades = await dbContext.Set<JS_Grade>()
// .Where(x => x.SchoolCode == schoolCode)
// .Include(g => g.Classes)
// .ToListAsync();
//// 2️⃣ 如果数据库有数据,直接返回
//if (grades != null && grades.Any())
//{
// return grades.Select(g => new GradeNameModel
// {
// Id = (int)g.Id,
// GradeName = g.GradeName,
// Class = g.Classes.Select(c => new ClassNameModel
// {
// Id = (int)c.Id,
// ClassName = c.ClassName
// }).ToList()
// }).ToList();
//}
//// 3️⃣ 数据库没有,调用京师接口获取学校年级班级
//var schoolClass = await _jingShiTiJiaoService.GetClassBySchoolAsync(schoolCode);
//if (schoolClass?.Grades == null || !schoolClass.Grades.Any())
// throw new Exception("获取京师年级班级失败!");
//var gradeDtos = schoolClass.Grades;
//// 4️⃣ 提取所有 GradeNo / ClassNo
//var allGradeNos = gradeDtos
// .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo))
// .Select(g => g.GradeNo)
// .ToList();
//var allClassNos = gradeDtos
// .SelectMany(g => g.Classes ?? new List<JingShiClassDto>())
// .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo))
// .Select(c => c.ClassNo)
// .ToList();
//// 5️⃣ 查询数据库中已存在的数据(幂等)
//var existGrades = await dbContext.Set<JS_Grade>()
// .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo))
// .ToListAsync();
//var existClasses = await 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();
//// 6️⃣ 构造待插入的年级 + 班级
//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
// {
// SchoolCode = schoolCode,
// Code = "SYSTEM", // 这里可以用默认值或 paramDto.Code
// GradeNo = g.GradeNo,
// GradeName = g.GradeName,
// Classes = g.Classes?
// .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo) && !existClassNoSet.Contains(c.ClassNo))
// .Select(c => new JS_Class
// {
// SchoolCode = schoolCode,
// Code = "SYSTEM",
// 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 dbContext.Set<JS_Grade>().AddRangeAsync(newGrades);
//// 7️⃣ 保存(并发幂等兜底)
//try
//{
// await dbContext.SaveChangesAsync();
//}
//catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true)
//{
// // 并发冲突可忽略
//}
//// 8️⃣ 回查数据库,组装返回 DTO
//grades = await dbContext.Set<JS_Grade>()
// .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo))
// .Include(g => g.Classes)
// .ToListAsync();
//return grades.Select(g => new GradeNameModel
//{
// Id = (int)g.Id,
// GradeName = g.GradeName,
// Class = g.Classes.Select(c => new ClassNameModel
// {
// Id = (int)c.Id,
// ClassName = c.ClassName
// }).ToList()
//}).ToList();
if (string.IsNullOrWhiteSpace(schoolCode))
return new List<GradeNameModel>();
// 1️⃣ 从数据库读取年级
var grades = await _studentRepository.DbContext.Set<JS_Grade>()
var dbContext = _studentRepository.DbContext;
// 1️⃣ 先从数据库读取年级
var grades = await dbContext.Set<JS_Grade>()
.Where(x => x.SchoolCode == schoolCode)
.Include(g => g.Classes)
.ToListAsync();
if (grades == null || !grades.Any())
return new List<GradeNameModel>();
// 2️⃣ 从数据库读取班级
var allGradeNos = grades.Select(x => x.GradeNo).ToList();
var classes = await _studentRepository.DbContext.Set<JS_Class>()
.Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo))
.ToListAsync();
// 3️⃣ 按年级分组班级
var result = grades.Select(g => new GradeNameModel
// 2️⃣ 数据库有数据,直接返回
if (grades != null && grades.Any())
{
Id = (int)g.Id,
GradeName = g.GradeName,
Class = classes
.Where(c => c.GradeNo == g.GradeNo)
.Select(c => new ClassNameModel
return grades.Select(g => new GradeNameModel
{
Id = (int)g.Id,
GradeName = g.GradeName,
Class = g.Classes.Select(c => new ClassNameModel
{
Id = (int)c.Id,
ClassName = c.ClassName
})
.ToList()
}).ToList()
}).ToList();
}
// 3️⃣ 数据库没有数据,调用京师接口获取年级班级
var schoolClass = await _jingShiTiJiaoService.GetClassBySchoolAsync(schoolCode);
if (schoolClass?.Grades == null || !schoolClass.Grades.Any())
return new List<GradeNameModel>(); // 或抛异常
var gradeDtos = schoolClass.Grades;
// 4️⃣ 直接组装 DTO 返回,不落库
var result = gradeDtos.Select(g => new GradeNameModel
{
Id = 0, // 京师接口数据没有数据库 Id,可以用 0 或其他占位
GradeName = g.GradeName,
Class = g.Classes?.Select(c => new ClassNameModel
{
Id = 0, // 同上
ClassName = c.ClassName
}).ToList() ?? new List<ClassNameModel>()
}).ToList();
return result;
}
}
}