From 00724136fb9f8baecd9e69e94c08d8b1a2f0b9a6 Mon Sep 17 00:00:00 2001 From: tanglong <842690096@qq.com> Date: Fri, 16 Jan 2026 10:09:36 +0800 Subject: [PATCH] js --- VOL.Ai/IServices/IJingShiTiJiaoService.cs | 44 +++++ VOL.Ai/Services/JingShiTiJiaoService.cs | 220 ++++++++++++++++++++++ 2 files changed, 264 insertions(+) create mode 100644 VOL.Ai/IServices/IJingShiTiJiaoService.cs create mode 100644 VOL.Ai/Services/JingShiTiJiaoService.cs diff --git a/VOL.Ai/IServices/IJingShiTiJiaoService.cs b/VOL.Ai/IServices/IJingShiTiJiaoService.cs new file mode 100644 index 0000000..80f6ac8 --- /dev/null +++ b/VOL.Ai/IServices/IJingShiTiJiaoService.cs @@ -0,0 +1,44 @@ +using VOL.Model.JingShiTiJiao; + +namespace VOL.Ai.IServices +{ + /// + /// 京师体教接口 + /// + public interface IJingShiTiJiaoService + { + /// + /// 根据教师获取教师年级班级信息 + /// + /// + Task GetClassListByTeacher(string teacherNo); + + /// + /// 根据班级编号获取学生列表 + /// + /// + /// + Task> GetStuListByClass(string classNo); + + /// + /// 根据学生编号获取学生详情 + /// + /// + /// + Task GetStudentInfo(string stuNo); + + /// + /// 上传数据 + /// + /// + /// + Task PushSportsData(List list); + + /// + /// 根据学校编码获取年级/班级接口 + /// + /// + /// + Task GetClassBySchoolAsync(string schoolNo); + } +} diff --git a/VOL.Ai/Services/JingShiTiJiaoService.cs b/VOL.Ai/Services/JingShiTiJiaoService.cs new file mode 100644 index 0000000..f97e7f2 --- /dev/null +++ b/VOL.Ai/Services/JingShiTiJiaoService.cs @@ -0,0 +1,220 @@ +using Newtonsoft.Json; +using System.Text; +using VOL.Ai.IServices; +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 +{ + /// + /// 京师体教接口服务 + /// + public class JingShiTiJiaoService : IJingShiTiJiaoService, IDependency + { + /// + /// 根据教师获取教师年级班级信息 + /// + /// + public async Task GetClassListByTeacher(string teacherNo) + { + var res = new TeacherClassData(); + + long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + string nonce = SaTokenSignHelper.RandomString(20); + + // 1. 签名参数 + var paramMap = new Dictionary + { + { "channel", AppSetting.JingShiTiJiao.Channel }, + { "teacherNo", teacherNo }, + { "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/teacher?{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; + } + + /// + /// 根据班级编号获取学生列表 + /// + /// + /// + /// + public async Task> GetStuListByClass(string classNo) + { + var res = new List(); + + long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + string nonce = SaTokenSignHelper.RandomString(20); + + // 1. 签名参数 + var paramMap = new Dictionary + { + { "channel", AppSetting.JingShiTiJiao.Channel }, + { "classNo", classNo }, + { "timestamp", timestamp }, + { "nonce", nonce } + }; + + // 4. 构建签名 QueryString + string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSetting.JingShiTiJiao.SecretKey); + + // 5. 拼接最终 URL + string url = $"{AppSetting.JingShiTiJiao.BaseUrl}/api/open/stu/by/class?{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; + } + + /// + /// 根据学生编号获取学生详情 + /// + /// + /// + public async Task GetStudentInfo(string stuNo) + { + var res = new StudentDetailDto(); + + long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + string nonce = SaTokenSignHelper.RandomString(20); + + // 1. 签名参数 + var paramMap = new Dictionary + { + { "channel", AppSetting.JingShiTiJiao.Channel }, + { "stuNo", stuNo }, + { "timestamp", timestamp }, + { "nonce", nonce } + }; + + // 4. 构建签名 QueryString + string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSetting.JingShiTiJiao.SecretKey); + + // 5. 拼接最终 URL + string url = $"{AppSetting.JingShiTiJiao.BaseUrl}/api/open/stu/info?{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; + } + + + /// + /// 上传成绩数据 + /// + /// + /// + /// + public async Task PushSportsData(List list) + { + long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + string nonce = SaTokenSignHelper.RandomString(); + + var paramMap = new Dictionary + { + { "channel", AppSetting.JingShiTiJiao.Channel }, + { "timestamp", timestamp }, + { "nonce", nonce } + }; + + string jsonBody = JsonConvert.SerializeObject(list); + + // ⭐ POST JSON 的签名 + string queryStr = SaTokenSignHelper.BuildPostJsonQueryString( + paramMap, + AppSetting.JingShiTiJiao.SecretKey, + jsonBody); + + string url = $"{AppSetting.JingShiTiJiao.BaseUrl}/api/sports/data/push?{queryStr}"; + + using var client = new HttpClient(); + var content = new StringContent(jsonBody, Encoding.UTF8, "application/json"); + + var response = await client.PostAsync(url, content); + string result = await response.Content.ReadAsStringAsync(); + + var res = JsonConvert.DeserializeObject>(result); + + 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; + } + } +}