获取学校信息

This commit is contained in:
tanglong 2026-01-16 09:17:35 +08:00
parent 6f4b2afce0
commit 9638421752
4 changed files with 117 additions and 43 deletions

View File

@ -33,5 +33,12 @@ namespace VOL.Ai.IServices
/// <param name="list"></param>
/// <returns></returns>
Task<bool> PushSportsData(List<SportsDataPushDto> list);
/// <summary>
/// 根据学校编码获取年级/班级接口
/// </summary>
/// <param name="schoolNo"></param>
/// <returns></returns>
Task<JingShiSchoolClassDto> GetClassBySchoolAsync(string schoolNo);
}
}

View File

@ -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<GradeDto>();
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<ClassDto>())
.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();
@ -197,7 +188,7 @@ namespace VOL.Ai.Services
var existClassNoSet = existClasses.Select(x => x.ClassNo).ToHashSet();
// =========================
// 5️⃣ 构造要插入的主子表对象(一次性插入)
// 5️⃣ 构造待插入的年级 + 班级
// =========================
var newGrades = new List<JS_Grade>();
@ -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<JS_Grade>().AddRangeAsync(newGrades);
// =========================
// 6️⃣ 保存数据库,唯一索引冲突可忽略(并发安全)
// 6️⃣ 保存(并发幂等兜底)
// =========================
try
{
@ -253,31 +239,29 @@ namespace VOL.Ai.Services
}
// =========================
// 7️⃣ 重新读取数据库获取 Id 映射
// 7️⃣ 回查数据库,组装返回 DTO
// =========================
var dbGrades = await _studentRepository.DbContext.Set<JS_Grade>()
.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<Classes>()
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()

View File

@ -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;
}
/// <summary>
/// 根据学校编码获取年级/班级接口
/// </summary>
/// <param name="schoolNo"></param>
/// <returns></returns>
public async Task<JingShiSchoolClassDto> GetClassBySchoolAsync(string schoolNo)
{
var res = new JingShiSchoolClassDto();
long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
string nonce = SaTokenSignHelper.RandomString();
var paramMap = new Dictionary<string, object>
{
{ "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<JingShiResponse<JingShiSchoolClassDto>>(json);
if (data != null && data.Code == 0)
{
return data.Data;
}
return res;
}
}
}

View File

@ -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<JingShiGradeDto> Grades { get; set; }
}
public class JingShiGradeDto
{
[JsonProperty("gradeNo")]
public string GradeNo { get; set; }
[JsonProperty("gradeName")]
public string GradeName { get; set; }
[JsonProperty("claArray")]
public List<JingShiClassDto> Classes { get; set; }
}
public class JingShiClassDto
{
[JsonProperty("classNo")]
public string ClassNo { get; set; }
[JsonProperty("className")]
public string ClassName { get; set; }
}
}