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; }
+ }
+}