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