diff --git a/YD_AllHeartRates.Api/Controllers/DataPushController.cs b/YD_AllHeartRates.Api/Controllers/DataPushController.cs index 1bf7dd3..1fb84f1 100644 --- a/YD_AllHeartRates.Api/Controllers/DataPushController.cs +++ b/YD_AllHeartRates.Api/Controllers/DataPushController.cs @@ -24,7 +24,10 @@ namespace YD_AllHeartRates.Api.Controllers _dataPushService = dataPushService; } - + /// + /// 获取Token + /// + /// [HttpGet(nameof(GetToken))] public async Task GetToken() { @@ -32,6 +35,10 @@ namespace YD_AllHeartRates.Api.Controllers return res; } + /// + /// 获取学生EduId + /// + /// [HttpPost(nameof(GetStudentEduId))] public async Task> GetStudentEduId() { @@ -39,6 +46,10 @@ namespace YD_AllHeartRates.Api.Controllers return res; } + /// + /// 常规数据上报 + /// + /// [HttpPost(nameof(SportsRoutineReport))] public async Task SportsRoutineReport() { @@ -67,5 +78,70 @@ namespace YD_AllHeartRates.Api.Controllers var res = await _dataPushService.SportsRoutineReport(data); return res; } + + /// + /// 异常数据上报 + /// + /// + [HttpPost(nameof(SportsAbnormalReport))] + public async Task SportsAbnormalReport() + { + var data = new List + { + new SportsAbnormalReportDto + { + SBID = "1234567", + XSEDUID = "d1cd4ff5-6511-58b8-809f-22d102b3c20d", + HDSJ = new List + { + new AbnormalHeartRateRecordDto { SJSJ = "2025-10-30 18:50:00", XL = 90, JXXL = 80, YCXX="心率过高", YCYY="持续剧烈运动" } + } + }, + new SportsAbnormalReportDto + { + SBID = "5678934", + XSEDUID = "d1cd4ff5-6511-58b8-809f-22d102b3c20e", + HDSJ = new List + { + new AbnormalHeartRateRecordDto { SJSJ = "2025-10-30 18:50:00", XL = 88, JXXL = 78, YCXX="心率过高", YCYY="持续剧烈运动" } + } + } + }; + var res = await _dataPushService.SportsAbnormalReport(data); + return res; + } + + /// + /// 补传数据上报 + /// + /// + [HttpPost(nameof(SportsDataReplay))] + public async Task SportsDataReplay() + { + var data = new List + { + new StudentData + { + SBID = "1234567", + XSEDUID = "d1cd4ff5-6511-58b8-809f-22d102b3c20d", + HDSJ = new List + { + new HeartRateRecordDto { SJSJ = "2025-10-29 14:50:00", XL = 90, JXXL = 80 }, + new HeartRateRecordDto { SJSJ = "2025-10-29 14:51:00", XL = 92, JXXL = 80 } + } + }, + new StudentData + { + SBID = "5678934", + XSEDUID = "d1cd4ff5-6511-58b8-809f-22d102b3c20e", + HDSJ = new List + { + new HeartRateRecordDto { SJSJ = "2025-10-29 14:50:00", XL = 88, JXXL = 78 } + } + } + }; + var res = await _dataPushService.SportsDataReplay(data); + return res; + } } } diff --git a/YD_AllHeartRates.Api/Services/Impl/DataPushService.cs b/YD_AllHeartRates.Api/Services/Impl/DataPushService.cs index ff2d55d..075651a 100644 --- a/YD_AllHeartRates.Api/Services/Impl/DataPushService.cs +++ b/YD_AllHeartRates.Api/Services/Impl/DataPushService.cs @@ -235,7 +235,7 @@ namespace YD_AllHeartRates.Api.Services.Impl string jsonPlain; try { - jsonPlain = JsonConvert.SerializeObject(package, Formatting.None); + jsonPlain = JsonConvert.SerializeObject(package, Formatting.None); Console.WriteLine($"[SportsRoutineReport] Package JSON: {jsonPlain}"); } catch (Exception ex) @@ -318,5 +318,251 @@ namespace YD_AllHeartRates.Api.Services.Impl } return resp; } + + public async Task SportsAbnormalReport(List data) + { + SportsRoutineReportResponse resp = new SportsRoutineReportResponse(); + if (data == null || data.Count == 0) + { + Console.WriteLine("data参数为空!"); + return resp; + } + + var token = await GetToken(); + if (string.IsNullOrWhiteSpace(token)) + { + Console.WriteLine("获取token失败!"); + return resp; + } + + string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + Console.WriteLine($"[SportsRoutineReport] Timestamp: {timestamp}"); + + var headers = new Dictionary + { + { "token", token } + }; + + // 1. 构造请求参数字典(有序保证 JSON 序列化顺序) + var package = new AbnormalHeartPackage + { + TOKEN = token, + APPID = AppSettings.DataPush.Appid, + SCSJ = timestamp, + SJCOUNT = data?.Count ?? 0, + CLIENT_ID = AppSettings.DataPush.ClientId, + DATA = data + }; + + // 1. 序列化 package 对象为 JSON + string jsonPlain; + try + { + jsonPlain = JsonConvert.SerializeObject(package, Formatting.None); + Console.WriteLine($"[SportsRoutineReport] Package JSON: {jsonPlain}"); + } + catch (Exception ex) + { + Console.WriteLine($"[SportsRoutineReport] Package序列化失败: {ex}"); + throw; + } + + // 2. 压缩 + SM2 加密 + string bodyEncrypted; + try + { + bodyEncrypted = DataEncryptHelper.EncryptSm2Zip(jsonPlain, AppSettings.DataPush.PublicKey); + Console.WriteLine($"[SportsRoutineReport] Encrypted BODY (Hex): {bodyEncrypted}"); + } + catch (Exception ex) + { + Console.WriteLine($"[SportsRoutineReport] SM2加密失败: {ex}"); + throw; + } + + // 4. 构造 POST 请求 URL + string url = $"{AppSettings.DataPush.Hous}oauth2/sportsDataReplay"; + + // 5. 发送 POST 请求 + string responseText; + try + { + responseText = await HttpManager.HttpPostAsync( + url, + postData: bodyEncrypted, + contentType: "application/json", + headers: headers + ); + Console.WriteLine($"[SportsRoutineReport] Response: {responseText}"); + } + catch (Exception ex) + { + Console.WriteLine($"[SportsRoutineReport] HTTP请求失败: {ex}"); + throw; + } + + // 6. 解析响应,返回对象数组 + if (!string.IsNullOrWhiteSpace(responseText) && responseText.TrimStart().StartsWith("{")) + { + try + { + var json = JsonConvert.DeserializeObject>(responseText); + + if (json != null) + { + var codeStr = json.ContainsKey("code") ? json["code"]?.ToString() : null; + var msgStr = json.ContainsKey("msg") ? json["msg"]?.ToString() : null; + + if (codeStr == "200") + { + // 成功返回固定响应 + resp.code = 200; + resp.msg = "数据上报成功"; + Console.WriteLine("[SportsRoutineReport] 数据上报成功"); + return resp; + } + else + { + // 接口返回错误 + resp.code = 500; + resp.msg = $"接口返回错误: {msgStr}"; + Console.WriteLine($"[SportsRoutineReport] 接口返回错误: code={codeStr}, msg={msgStr}"); + return resp; + } + } + } + catch (Exception ex) + { + resp.code = 500; + resp.msg = "JSON解析异常"; + Console.WriteLine($"[SportsRoutineReport] JSON解析失败: {ex}"); + return resp; + } + } + return resp; + } + + public async Task SportsDataReplay(List data) + { + SportsRoutineReportResponse resp = new SportsRoutineReportResponse(); + if (data == null || data.Count == 0) + { + Console.WriteLine("data参数为空!"); + return resp; + } + + var token = await GetToken(); + if (string.IsNullOrWhiteSpace(token)) + { + Console.WriteLine("获取token失败!"); + return resp; + } + + string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + Console.WriteLine($"[SportsRoutineReport] Timestamp: {timestamp}"); + + var headers = new Dictionary + { + { "token", token } + }; + + // 1. 构造请求参数字典(有序保证 JSON 序列化顺序) + var package = new Package + { + TOKEN = token, + APPID = AppSettings.DataPush.Appid, + SCSJ = timestamp, + SJCOUNT = data?.Count ?? 0, + CLIENT_ID = AppSettings.DataPush.ClientId, + DATA = data + }; + + // 1. 序列化 package 对象为 JSON + string jsonPlain; + try + { + jsonPlain = JsonConvert.SerializeObject(package, Formatting.None); + Console.WriteLine($"[SportsRoutineReport] Package JSON: {jsonPlain}"); + } + catch (Exception ex) + { + Console.WriteLine($"[SportsRoutineReport] Package序列化失败: {ex}"); + throw; + } + + // 2. 压缩 + SM2 加密 + string bodyEncrypted; + try + { + bodyEncrypted = DataEncryptHelper.EncryptSm2Zip(jsonPlain, AppSettings.DataPush.PublicKey); + Console.WriteLine($"[SportsRoutineReport] Encrypted BODY (Hex): {bodyEncrypted}"); + } + catch (Exception ex) + { + Console.WriteLine($"[SportsRoutineReport] SM2加密失败: {ex}"); + throw; + } + + // 4. 构造 POST 请求 URL + string url = $"{AppSettings.DataPush.Hous}oauth2/sportsDataReplay"; + + // 5. 发送 POST 请求 + string responseText; + try + { + responseText = await HttpManager.HttpPostAsync( + url, + postData: bodyEncrypted, + contentType: "application/json", + headers: headers + ); + Console.WriteLine($"[SportsRoutineReport] Response: {responseText}"); + } + catch (Exception ex) + { + Console.WriteLine($"[SportsRoutineReport] HTTP请求失败: {ex}"); + throw; + } + + // 6. 解析响应,返回对象数组 + if (!string.IsNullOrWhiteSpace(responseText) && responseText.TrimStart().StartsWith("{")) + { + try + { + var json = JsonConvert.DeserializeObject>(responseText); + + if (json != null) + { + var codeStr = json.ContainsKey("code") ? json["code"]?.ToString() : null; + var msgStr = json.ContainsKey("msg") ? json["msg"]?.ToString() : null; + + if (codeStr == "200") + { + // 成功返回固定响应 + resp.code = 200; + resp.msg = "数据上报成功"; + Console.WriteLine("[SportsRoutineReport] 数据上报成功"); + return resp; + } + else + { + // 接口返回错误 + resp.code = 500; + resp.msg = $"接口返回错误: {msgStr}"; + Console.WriteLine($"[SportsRoutineReport] 接口返回错误: code={codeStr}, msg={msgStr}"); + return resp; + } + } + } + catch (Exception ex) + { + resp.code = 500; + resp.msg = "JSON解析异常"; + Console.WriteLine($"[SportsRoutineReport] JSON解析失败: {ex}"); + return resp; + } + } + return resp; + } } } diff --git a/YD_AllHeartRates.Api/Services/Interface/IDataPushService.cs b/YD_AllHeartRates.Api/Services/Interface/IDataPushService.cs index a4f6523..6a5332c 100644 --- a/YD_AllHeartRates.Api/Services/Interface/IDataPushService.cs +++ b/YD_AllHeartRates.Api/Services/Interface/IDataPushService.cs @@ -25,10 +25,24 @@ namespace YD_AllHeartRates.Api.Services.Interface Task> GetStudentEduId(string schoolName, string gradeName, string className, string realName, string xsId); /// - /// 常规成绩上报 + /// 常规数据上报 /// /// /// Task SportsRoutineReport(List data); + + /// + /// 异常数据上报 + /// + /// + /// + Task SportsAbnormalReport(List data); + + /// + /// 补传数据上报 + /// + /// + /// + Task SportsDataReplay(List data); } } diff --git a/YD_AllHeartRates.Commons/Dto/DataPush/HeartRateRecordDto.cs b/YD_AllHeartRates.Commons/Dto/DataPush/HeartRateRecordDto.cs index a844632..06f2fc8 100644 --- a/YD_AllHeartRates.Commons/Dto/DataPush/HeartRateRecordDto.cs +++ b/YD_AllHeartRates.Commons/Dto/DataPush/HeartRateRecordDto.cs @@ -19,12 +19,6 @@ namespace YD_AllHeartRates.Commons.Dto.DataPush public string XSEDUID { get; set; } public List HDSJ { get; set; } } - - public class SportsRoutineReportResponse - { - public int code { get; set; } - public string msg { get; set; } - } public class Package { public string TOKEN { get; set; } @@ -34,4 +28,10 @@ namespace YD_AllHeartRates.Commons.Dto.DataPush public string CLIENT_ID { get; set; } public List DATA { get; set; } } + + public class SportsRoutineReportResponse + { + public int code { get; set; } + public string msg { get; set; } + } } diff --git a/YD_AllHeartRates.Commons/Dto/DataPush/SportsAbnormalReportDto.cs b/YD_AllHeartRates.Commons/Dto/DataPush/SportsAbnormalReportDto.cs new file mode 100644 index 0000000..9e46780 --- /dev/null +++ b/YD_AllHeartRates.Commons/Dto/DataPush/SportsAbnormalReportDto.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace YD_AllHeartRates.Commons.Dto.DataPush +{ + public class SportsAbnormalReportDto + { + public string SBID { get; set; } + public string XSEDUID { get; set; } + public List HDSJ { get; set; } + } + + public class AbnormalHeartRateRecordDto + { + public string SJSJ { get; set; } + public int XL { get; set; } + public int JXXL { get; set; } + public string YCXX { get; set; } + public string YCYY { get; set; } + } + + public class AbnormalHeartPackage + { + public string TOKEN { get; set; } + public string APPID { get; set; } + public string SCSJ { get; set; } + public int SJCOUNT { get; set; } + public string CLIENT_ID { get; set; } + public List DATA { get; set; } + } + +} diff --git a/YD_AllHeartRates.Commons/obj/Debug/net6.0/YD_AllHeartRates.Commons.AssemblyInfo.cs b/YD_AllHeartRates.Commons/obj/Debug/net6.0/YD_AllHeartRates.Commons.AssemblyInfo.cs index cae6a07..9f85742 100644 --- a/YD_AllHeartRates.Commons/obj/Debug/net6.0/YD_AllHeartRates.Commons.AssemblyInfo.cs +++ b/YD_AllHeartRates.Commons/obj/Debug/net6.0/YD_AllHeartRates.Commons.AssemblyInfo.cs @@ -14,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("YD_AllHeartRates.Commons")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+857eed77fc204c64ae8490450264180778bfa33e")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+94971e02db73531e4079a33ffae322fffa5f4e33")] [assembly: System.Reflection.AssemblyProductAttribute("YD_AllHeartRates.Commons")] [assembly: System.Reflection.AssemblyTitleAttribute("YD_AllHeartRates.Commons")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/YD_AllHeartRates.Commons/obj/Debug/net6.0/YD_AllHeartRates.Commons.AssemblyInfoInputs.cache b/YD_AllHeartRates.Commons/obj/Debug/net6.0/YD_AllHeartRates.Commons.AssemblyInfoInputs.cache index 0fbc024..ba3f037 100644 --- a/YD_AllHeartRates.Commons/obj/Debug/net6.0/YD_AllHeartRates.Commons.AssemblyInfoInputs.cache +++ b/YD_AllHeartRates.Commons/obj/Debug/net6.0/YD_AllHeartRates.Commons.AssemblyInfoInputs.cache @@ -1 +1 @@ -b5d32f6c572a27481cac1478a198112167f74a8eae290203e50a77f2f9f6e014 +ff05671de86704e3e86a0d8b5edff7f82112b0109caf9ce5bbc08098bde6510e