diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs index b9ec719..aa76d7a 100644 --- a/VOL.Ai/Services/AiAppService.cs +++ b/VOL.Ai/Services/AiAppService.cs @@ -139,163 +139,163 @@ 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; // ========================= - // 1️⃣ 调用京师接口获取学校信息及年级班级 + // 2️⃣ 调用京师接口获取学校年级班级 // ========================= 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 = "", - Grade = schoolClass.Grades.Select(g => new Grades - { - Id = 1, // 京师接口没有数据库 Id,可用占位 - Name = g.GradeName, - Class = g.Classes?.Select(c => new Classes - { - Id = 1, // 同上 - Name = c.ClassName - }).ToList() ?? new List() - }).ToList() + 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; + + //// ========================= + //// 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, // 可根据业务修改 + // Province = "", + // City = "", + // Grade = schoolClass.Grades.Select(g => new Grades + // { + // Id = 1, // 京师接口没有数据库 Id,可用占位 + // Name = g.GradeName, + // Class = g.Classes?.Select(c => new Classes + // { + // Id = 1, // 同上 + // Name = c.ClassName + // }).ToList() ?? new List() + // }).ToList() + //}; + + //return res; } public Ai_OSSInfoDto OSSInfo(Ai_Request paramDto)