From 9638421752624d43529c6c8f4e17dd2c52ff6de1 Mon Sep 17 00:00:00 2001 From: tanglong <842690096@qq.com> Date: Fri, 16 Jan 2026 09:17:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=AD=A6=E6=A0=A1=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VOL.Ai/IServices/IJingShiTiJiaoService.cs | 7 ++ VOL.Ai/Services/AiAppService.cs | 70 +++++++------------ VOL.Ai/Services/JingShiTiJiaoService.cs | 41 +++++++++++ .../JingShiTiJiao/JingShiSchoolClassDto.cs | 42 +++++++++++ 4 files changed, 117 insertions(+), 43 deletions(-) create mode 100644 VOL.Model/JingShiTiJiao/JingShiSchoolClassDto.cs diff --git a/VOL.Ai/IServices/IJingShiTiJiaoService.cs b/VOL.Ai/IServices/IJingShiTiJiaoService.cs index c591d90..80f6ac8 100644 --- a/VOL.Ai/IServices/IJingShiTiJiaoService.cs +++ b/VOL.Ai/IServices/IJingShiTiJiaoService.cs @@ -33,5 +33,12 @@ namespace VOL.Ai.IServices /// /// Task PushSportsData(List list); + + /// + /// 根据学校编码获取年级/班级接口 + /// + /// + /// + Task GetClassBySchoolAsync(string schoolNo); } } diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs index 178487c..ba9918e 100644 --- a/VOL.Ai/Services/AiAppService.cs +++ b/VOL.Ai/Services/AiAppService.cs @@ -147,32 +147,20 @@ namespace VOL.Ai.Services if (res == null) return new Ai_SchoolDto(); - // ========================= - // 2️⃣ 查询扫码登录信息 - // ========================= - var loginInfo = await _scanCodeLoginRepository - .FindAsIQueryable(x => - x.Code == paramDto.Code && - x.SchoolCode == res.SchoolCode) - .FirstOrDefaultAsync(); - - if (loginInfo == null) - throw new Exception("未查询到登录信息!"); - - // ========================= - // 3️⃣ 获取京师老师信息 - // ========================= - var teacher = await _jingShiTiJiaoService - .GetClassListByTeacher(loginInfo.TeacherPhoneNo); - - if (teacher == null) - throw new Exception("获取京师老师信息失败!"); - - var gradeDtos = teacher.GradeList ?? new List(); var schoolCode = res.SchoolCode; // ========================= - // 4️⃣ 获取已存在的年级和班级,用 HashSet 做幂等 + // 2️⃣ 调用京师接口获取学校年级班级 + // ========================= + var schoolClass = await _jingShiTiJiaoService.GetClassBySchoolAsync(schoolCode); + + if (schoolClass?.Grades == null || !schoolClass.Grades.Any()) + throw new Exception("获取京师年级班级失败!"); + + var gradeDtos = schoolClass.Grades; + + // ========================= + // 3️⃣ 提取所有 GradeNo / ClassNo // ========================= var allGradeNos = gradeDtos .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) @@ -180,11 +168,14 @@ namespace VOL.Ai.Services .ToList(); var allClassNos = gradeDtos - .SelectMany(g => g.ClassList ?? new List()) + .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(); @@ -197,7 +188,7 @@ namespace VOL.Ai.Services var existClassNoSet = existClasses.Select(x => x.ClassNo).ToHashSet(); // ========================= - // 5️⃣ 构造要插入的主子表对象(一次性插入) + // 5️⃣ 构造待插入的年级 + 班级 // ========================= var newGrades = new List(); @@ -208,18 +199,14 @@ namespace VOL.Ai.Services var grade = new JS_Grade { - TeacherNo = teacher.TeacherNo, - TeacherName = teacher.TeacherName, SchoolCode = schoolCode, Code = paramDto.Code, GradeNo = g.GradeNo, GradeName = g.GradeName, - Classes = g.ClassList? + Classes = g.Classes? .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo) && !existClassNoSet.Contains(c.ClassNo)) .Select(c => new JS_Class { - TeacherNo = teacher.TeacherNo, - TeacherName = teacher.TeacherName, SchoolCode = schoolCode, Code = paramDto.Code, GradeNo = g.GradeNo, @@ -231,7 +218,6 @@ namespace VOL.Ai.Services newGrades.Add(grade); - // 更新 HashSet,避免重复插入 existGradeNoSet.Add(g.GradeNo); foreach (var c in grade.Classes) existClassNoSet.Add(c.ClassNo); @@ -241,7 +227,7 @@ namespace VOL.Ai.Services await _studentRepository.DbContext.Set().AddRangeAsync(newGrades); // ========================= - // 6️⃣ 保存数据库,唯一索引冲突可忽略(并发安全) + // 6️⃣ 保存(并发幂等兜底) // ========================= try { @@ -253,31 +239,29 @@ namespace VOL.Ai.Services } // ========================= - // 7️⃣ 重新读取数据库获取 Id 映射 + // 7️⃣ 回查数据库,组装返回 DTO // ========================= var dbGrades = await _studentRepository.DbContext.Set() .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo)) .Include(g => g.Classes) .ToListAsync(); - // ========================= - // 8️⃣ 组装返回 DTO - // ========================= res.Grade = dbGrades.Select(g => new Grades { - Id = (int)g.Id, // 数据库自增主键 + Id = (int)g.Id, Name = g.GradeName, - Class = g.Classes? - .Select(c => new Classes - { - Id = (int)c.Id, // 数据库自增主键 - Name = c.ClassName - }).ToList() ?? new List() + Class = g.Classes.Select(c => new Classes + { + Id = (int)c.Id, + Name = c.ClassName + }).ToList() }).ToList(); return res; } + + public Ai_OSSInfoDto OSSInfo(Ai_Request paramDto) { return new Ai_OSSInfoDto() diff --git a/VOL.Ai/Services/JingShiTiJiaoService.cs b/VOL.Ai/Services/JingShiTiJiaoService.cs index c7f60f9..f97e7f2 100644 --- a/VOL.Ai/Services/JingShiTiJiaoService.cs +++ b/VOL.Ai/Services/JingShiTiJiaoService.cs @@ -5,6 +5,7 @@ using VOL.Core.Configuration; using VOL.Core.Extensions.AutofacManager; using VOL.Core.Utilities; using VOL.Model.JingShiTiJiao; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace VOL.Ai.Services { @@ -175,5 +176,45 @@ namespace VOL.Ai.Services return res != null && res.Code == 0; } + + /// + /// 根据学校编码获取年级/班级接口 + /// + /// + /// + public async Task GetClassBySchoolAsync(string schoolNo) + { + var res = new JingShiSchoolClassDto(); + + long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + string nonce = SaTokenSignHelper.RandomString(); + + var paramMap = new Dictionary + { + { "channel", AppSetting.JingShiTiJiao.Channel }, + { "schoolNo", schoolNo }, + { "timestamp", timestamp }, + { "nonce", nonce } + }; + + // 4. 构建签名 QueryString + string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSetting.JingShiTiJiao.SecretKey); + + // 5. 拼接最终 URL + string url = $"{AppSetting.JingShiTiJiao.BaseUrl}/api/open/class/by/school?{queryStr}"; + + string json = await HttpManager.HttpGetAsync(url); + + if (string.IsNullOrWhiteSpace(json)) + return res; + + var data = JsonConvert.DeserializeObject>(json); + if (data != null && data.Code == 0) + { + return data.Data; + } + + return res; + } } } diff --git a/VOL.Model/JingShiTiJiao/JingShiSchoolClassDto.cs b/VOL.Model/JingShiTiJiao/JingShiSchoolClassDto.cs new file mode 100644 index 0000000..92c8f36 --- /dev/null +++ b/VOL.Model/JingShiTiJiao/JingShiSchoolClassDto.cs @@ -0,0 +1,42 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VOL.Model.JingShiTiJiao +{ + public class JingShiSchoolClassDto + { + [JsonProperty("schoolNo")] + public string SchoolNo { get; set; } + + [JsonProperty("schoolName")] + public string SchoolName { get; set; } + + [JsonProperty("array")] + public List Grades { get; set; } + } + + public class JingShiGradeDto + { + [JsonProperty("gradeNo")] + public string GradeNo { get; set; } + + [JsonProperty("gradeName")] + public string GradeName { get; set; } + + [JsonProperty("claArray")] + public List Classes { get; set; } + } + + public class JingShiClassDto + { + [JsonProperty("classNo")] + public string ClassNo { get; set; } + + [JsonProperty("className")] + public string ClassName { get; set; } + } +}