using Newtonsoft.Json;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Channels;
using YD_WeChatApplet.Api.Services.Interface;
using YD_WeChatApplet.Api.Utilities;
using YD_WeChatApplet.Commons;
using YD_WeChatApplet.Commons.Dto.JingShiTiJiao;
using YD_WeChatApplet.Commons.Utils;
namespace YD_WeChatApplet.Api.Services.Impl
{
///
/// 京师体教接口服务
///
public class JingShiTiJiaoService : IJingShiTiJiaoService
{
private readonly ILogger _logger;
public JingShiTiJiaoService(ILogger logger)
{
_logger = logger;
}
///
/// 根据教师获取教师年级班级信息
///
///
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", AppSettings.JingShiTiJiao.Channel },
{ "teacherNo", teacherNo },
{ "timestamp", timestamp },
{ "nonce", nonce }
};
// 4. 构建签名 QueryString
string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSettings.JingShiTiJiao.SecretKey);
// 5. 拼接最终 URL
string url = $"{AppSettings.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)
{
string token = JwtHelper.IssueJwt(new UserInfoDto()
{
User_Id = -1,
UserName = data.Data.TeacherName,
Role_Id = 2,
PhoneNo = data.Data.TeacherNo,
SchoolCode = data.Data.SchoolNo,
UserNo = data.Data.TeacherNo
});
data.Data.Token = token;
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", AppSettings.JingShiTiJiao.Channel },
{ "classNo", classNo },
{ "timestamp", timestamp },
{ "nonce", nonce }
};
// 4. 构建签名 QueryString
string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSettings.JingShiTiJiao.SecretKey);
// 5. 拼接最终 URL
string url = $"{AppSettings.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", AppSettings.JingShiTiJiao.Channel },
{ "stuNo", stuNo },
{ "timestamp", timestamp },
{ "nonce", nonce }
};
// 4. 构建签名 QueryString
string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSettings.JingShiTiJiao.SecretKey);
// 5. 拼接最终 URL
string url = $"{AppSettings.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)
{
string token = JwtHelper.IssueJwt(new UserInfoDto()
{
User_Id = -1,
UserName = data.Data.StudentName,
Role_Id = 3,
PhoneNo = data.Data.TeacherNo,
SchoolCode = data.Data.SchoolNo,
UserNo = data.Data.StudentNo
});
data.Data.Token = token;
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", AppSettings.JingShiTiJiao.Channel },
{ "timestamp", timestamp },
{ "nonce", nonce }
};
string jsonBody = JsonConvert.SerializeObject(list);
// ⭐ POST JSON 的签名
string queryStr = SaTokenSignHelper.BuildPostJsonQueryString(
paramMap,
AppSettings.JingShiTiJiao.SecretKey,
jsonBody);
string url = $"{AppSettings.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", AppSettings.JingShiTiJiao.Channel },
{ "schoolNo", schoolNo },
{ "timestamp", timestamp },
{ "nonce", nonce }
};
// 4. 构建签名 QueryString
string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSettings.JingShiTiJiao.SecretKey);
// 5. 拼接最终 URL
string url = $"{AppSettings.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;
}
}
}