diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs index 4a66503..eec7259 100644 --- a/VOL.Ai/Services/AiAppService.cs +++ b/VOL.Ai/Services/AiAppService.cs @@ -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()) + // .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo)) + // .Select(c => c.ClassNo) + // .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)) + // .ToListAsync(); + + //var existGradeNoSet = existGrades.Select(x => x.GradeNo).ToHashSet(); + //var existClassNoSet = existClasses.Select(x => x.ClassNo).ToHashSet(); + + //// ========================= + //// 5️⃣ 构造待插入的年级 + 班级 + //// ========================= + //var newGrades = new List(); + + //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() + // }; + + // 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); + + //// ========================= + //// 6️⃣ 保存(并发幂等兜底) + //// ========================= + //try + //{ + // await _studentRepository.DbContext.SaveChangesAsync(); + //} + //catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true) + //{ + // // 并发下唯一索引冲突可忽略 + //} + + //// ========================= + //// 7️⃣ 回查数据库,组装返回 DTO + //// ========================= + //var dbGrades = await _studentRepository.DbContext.Set() + // .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()) - .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo)) - .Select(c => c.ClassNo) - .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)) - .ToListAsync(); - - var existGradeNoSet = existGrades.Select(x => x.GradeNo).ToHashSet(); - var existClassNoSet = existClasses.Select(x => x.ClassNo).ToHashSet(); - - // ========================= - // 5️⃣ 构造待插入的年级 + 班级 - // ========================= - var newGrades = new List(); - - 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() - }; - - 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); - - // ========================= - // 6️⃣ 保存(并发幂等兜底) - // ========================= - try - { - await _studentRepository.DbContext.SaveChangesAsync(); - } - catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true) - { - // 并发下唯一索引冲突可忽略 - } - - // ========================= - // 7️⃣ 回查数据库,组装返回 DTO - // ========================= - var dbGrades = await _studentRepository.DbContext.Set() - .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() }).ToList() - }).ToList(); + }; return res; } diff --git a/VOL.WebApi/Controllers/JingShiTiJiao/JingShiTiJiaoController.cs b/VOL.WebApi/Controllers/JingShiTiJiao/JingShiTiJiaoController.cs index a1b87ff..d33b0f5 100644 --- a/VOL.WebApi/Controllers/JingShiTiJiao/JingShiTiJiaoController.cs +++ b/VOL.WebApi/Controllers/JingShiTiJiao/JingShiTiJiaoController.cs @@ -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> GetGradeList(string schoolCode) { + //if (string.IsNullOrWhiteSpace(schoolCode)) + // return new List(); + + //var dbContext = _studentRepository.DbContext; + + //// 1️⃣ 先从数据库读取年级 + //var grades = await dbContext.Set() + // .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()) + // .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo)) + // .Select(c => c.ClassNo) + // .ToList(); + + //// 5️⃣ 查询数据库中已存在的数据(幂等) + //var existGrades = await dbContext.Set() + // .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo)) + // .ToListAsync(); + + //var existClasses = await 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(); + + //// 6️⃣ 构造待插入的年级 + 班级 + //var newGrades = new List(); + //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() + // }; + + // newGrades.Add(grade); + + // existGradeNoSet.Add(g.GradeNo); + // foreach (var c in grade.Classes) + // existClassNoSet.Add(c.ClassNo); + //} + + //if (newGrades.Any()) + // await dbContext.Set().AddRangeAsync(newGrades); + + //// 7️⃣ 保存(并发幂等兜底) + //try + //{ + // await dbContext.SaveChangesAsync(); + //} + //catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true) + //{ + // // 并发冲突可忽略 + //} + + //// 8️⃣ 回查数据库,组装返回 DTO + //grades = await dbContext.Set() + // .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(); - // 1️⃣ 从数据库读取年级 - var grades = await _studentRepository.DbContext.Set() + var dbContext = _studentRepository.DbContext; + + // 1️⃣ 先从数据库读取年级 + var grades = await dbContext.Set() .Where(x => x.SchoolCode == schoolCode) + .Include(g => g.Classes) .ToListAsync(); - if (grades == null || !grades.Any()) - return new List(); - - // 2️⃣ 从数据库读取班级 - var allGradeNos = grades.Select(x => x.GradeNo).ToList(); - var classes = await _studentRepository.DbContext.Set() - .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(); // 或抛异常 + + 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() }).ToList(); return result; } - } }