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