获取学校信息
This commit is contained in:
parent
6f4b2afce0
commit
9638421752
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
42
VOL.Model/JingShiTiJiao/JingShiSchoolClassDto.cs
Normal file
42
VOL.Model/JingShiTiJiao/JingShiSchoolClassDto.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user