This commit is contained in:
tanglong 2025-06-27 15:37:57 +08:00
parent cba47da795
commit a17b11b808
44 changed files with 523 additions and 14 deletions

View File

@ -36,5 +36,37 @@ namespace YD_AllHeartRates.Api.Controllers
var res = await _rateReportService.SchoolHeartRateReport(scoreTime);
return res;
}
/// <summary>
/// 年级心率报告
/// </summary>
/// <returns></returns>
[HttpGet(nameof(GradeHeartRateReport))]
public async Task<GradeHeartRateReportDataDto> GradeHeartRateReport(int gradeId, DateTime? scoreTime = null)
{
var res = await _rateReportService.GradeHeartRateReport(gradeId, scoreTime);
return res;
}
/// <summary>
/// 班级心率报告
/// </summary>
/// <returns></returns>
[HttpGet(nameof(ClassHeartRateReport))]
public async Task<ClassHeartRateReportDataDto> ClassHeartRateReport(int classId, DateTime? scoreTime = null)
{
var res = await _rateReportService.ClassHeartRateReport(classId,scoreTime);
return res;
}
/// <summary>
/// 学生心率报告
/// </summary>
/// <returns></returns>
[HttpGet(nameof(StudentHeartRateReport))]
public async Task<StudentHeartRateReportDataDto> StudentHeartRateReport(string studentNo, DateTime? scoreTime = null)
{
var res = await _rateReportService.StudentHeartRateReport(studentNo, scoreTime);
return res;
}
}
}

View File

@ -1624,6 +1624,12 @@
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.AllInstances.FemaleReachCountSetInt32">
<summary>设置 ClassListDto.set_FemaleReachCount(ClassListDto this, Int32 value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.AllInstances.GradeNameGet">
<summary>设置 ClassListDto.get_GradeName(ClassListDto this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.AllInstances.GradeNameSetString">
<summary>设置 ClassListDto.set_GradeName(ClassListDto this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.AllInstances.MaleReachCountGet">
<summary>设置 ClassListDto.get_MaleReachCount(ClassListDto this) 的 填充码</summary>
</member>
@ -1681,6 +1687,12 @@
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.FemaleReachCountSetInt32">
<summary>设置 ClassListDto.set_FemaleReachCount(ClassListDto this, Int32 value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.GradeNameGet">
<summary>设置 ClassListDto.get_GradeName(ClassListDto this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.GradeNameSetString">
<summary>设置 ClassListDto.set_GradeName(ClassListDto this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.MaleReachCountGet">
<summary>设置 ClassListDto.get_MaleReachCount(ClassListDto this) 的 填充码</summary>
</member>

View File

@ -82,7 +82,8 @@ namespace YD_AllHeartRates.Api.Services.Impl
}
res.SportsData.OnlineDevicesCount = data.GroupBy(x => x.StudentNo).Count();
res.SportsData.AvgHeartRate = (int)data.Average(x => x.Value);
res.SportsData.AvgHeartRate = (int)data.Select(x => x.Value).DefaultIfEmpty(0).Average();
var durationsByStudent = HeartRateReportHelper.CalculateDurations(
data, x => (x.StudentNo, x.Sex, x.GradeId));
@ -136,6 +137,7 @@ namespace YD_AllHeartRates.Api.Services.Impl
{
ClassId = c.Id,
ClassName = c.ClassName,
GradeName = c.GradeName,
TeacherName = t.TeacherName
}).OrderBy(x => x.ClassId).ToListAsync();
@ -143,9 +145,9 @@ namespace YD_AllHeartRates.Api.Services.Impl
from s in _sportsContext.Student
join c in _sportsContext.Class on s.ClassId equals c.Id
where c.SchoolCode == schoolCode && c.GradeId == gradeId
select new { s.StudentNo, s.Sex, ClassId = c.Id, c.GradeName }).ToListAsync();
select new { s.StudentNo, s.Sex, ClassId = c.Id }).ToListAsync();
res.GradeName = studentList.FirstOrDefault()?.GradeName ?? "";
res.GradeName = classList.FirstOrDefault()?.GradeName ?? "";
res.ClassCount = classList.Count;
res.MaleCount = studentList.Count(x => x.Sex == 1);
res.FemaleCount = studentList.Count(x => x.Sex == 2);
@ -166,7 +168,8 @@ namespace YD_AllHeartRates.Api.Services.Impl
var data = allData.Where(x => x.GradeId == gradeId).ToList();
res.SportsData.OnlineDevicesCount = data.GroupBy(x => x.StudentNo).Count();
res.SportsData.AvgHeartRate = (int)data.Average(x => x.Value);
res.SportsData.AvgHeartRate = (int)data.Select(x => x.Value).DefaultIfEmpty(0).Average();
var durationsByStudent = HeartRateReportHelper.CalculateDurations(data, x => (x.StudentNo, x.Sex, x.ClassId));
@ -191,6 +194,7 @@ namespace YD_AllHeartRates.Api.Services.Impl
ClassId = cls.ClassId,
ClassName = cls.ClassName,
TeacherName = cls.TeacherName,
GradeName = cls.GradeName,
StudentCount = total,
MaleReachCount = maleQualified,
FemaleReachCount = femaleQualified,
@ -246,7 +250,8 @@ namespace YD_AllHeartRates.Api.Services.Impl
var data = allData.Where(x => x.GradeId == classId).ToList();
res.SportsData.OnlineDevicesCount = data.GroupBy(x => x.StudentNo).Count();
res.SportsData.AvgHeartRate = (int)data.Average(x => x.Value);
res.SportsData.AvgHeartRate = (int)data.Select(x => x.Value).DefaultIfEmpty(0).Average();
var durationsByStudent = HeartRateReportHelper.CalculateDurations(data, x => x.StudentNo);
res.SportsData.AvgDuration = (int)durationsByStudent.Values.DefaultIfEmpty(0).Average();

View File

@ -36,7 +36,7 @@ namespace YD_AllHeartRates.Api.SmartSportsEntitys
[Display(Name = "年级名称")]
[Comment("年级名称")]
[Column(TypeName = "nvarchar(100)")]
public string GradeName { get; set; }
public string? GradeName { get; set; }
/// <summary>
///班级名称

View File

@ -31,6 +31,24 @@
</summary>
<returns></returns>
</member>
<member name="M:YD_AllHeartRates.Api.Controllers.HeartRateReportController.GradeHeartRateReport(System.Int32,System.Nullable{System.DateTime})">
<summary>
年级心率报告
</summary>
<returns></returns>
</member>
<member name="M:YD_AllHeartRates.Api.Controllers.HeartRateReportController.ClassHeartRateReport(System.Int32,System.Nullable{System.DateTime})">
<summary>
班级心率报告
</summary>
<returns></returns>
</member>
<member name="M:YD_AllHeartRates.Api.Controllers.HeartRateReportController.StudentHeartRateReport(System.String,System.Nullable{System.DateTime})">
<summary>
学生心率报告
</summary>
<returns></returns>
</member>
<member name="T:YD_AllHeartRates.Api.Controllers.LargeScreenController">
<summary>
大屏

View File

@ -1,4 +1,66 @@
[
{
"ContainingType": "YD_AllHeartRates.Api.Controllers.HeartRateReportController",
"Method": "ClassHeartRateReport",
"RelativePath": "ClassHeartRateReport",
"HttpMethod": "GET",
"IsController": true,
"Order": 0,
"Parameters": [
{
"Name": "classId",
"Type": "System.Int32",
"IsRequired": false
},
{
"Name": "scoreTime",
"Type": "System.Nullable\u00601[[System.DateTime, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]",
"IsRequired": false
}
],
"ReturnTypes": [
{
"Type": "YD_AllHeartRates.Commons.Dto.LargeScreen.ClassHeartRateReportDataDto",
"MediaTypes": [
"text/plain",
"application/json",
"text/json"
],
"StatusCode": 200
}
]
},
{
"ContainingType": "YD_AllHeartRates.Api.Controllers.HeartRateReportController",
"Method": "GradeHeartRateReport",
"RelativePath": "GradeHeartRateReport",
"HttpMethod": "GET",
"IsController": true,
"Order": 0,
"Parameters": [
{
"Name": "gradeId",
"Type": "System.Int32",
"IsRequired": false
},
{
"Name": "scoreTime",
"Type": "System.Nullable\u00601[[System.DateTime, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]",
"IsRequired": false
}
],
"ReturnTypes": [
{
"Type": "YD_AllHeartRates.Commons.Dto.LargeScreen.GradeHeartRateReportDataDto",
"MediaTypes": [
"text/plain",
"application/json",
"text/json"
],
"StatusCode": 200
}
]
},
{
"ContainingType": "YD_AllHeartRates.Api.Controllers.LargeScreenController",
"Method": "HeartRateData",
@ -70,5 +132,36 @@
"StatusCode": 200
}
]
},
{
"ContainingType": "YD_AllHeartRates.Api.Controllers.HeartRateReportController",
"Method": "StudentHeartRateReport",
"RelativePath": "StudentHeartRateReport",
"HttpMethod": "GET",
"IsController": true,
"Order": 0,
"Parameters": [
{
"Name": "studentNo",
"Type": "System.String",
"IsRequired": false
},
{
"Name": "scoreTime",
"Type": "System.Nullable\u00601[[System.DateTime, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]",
"IsRequired": false
}
],
"ReturnTypes": [
{
"Type": "YD_AllHeartRates.Commons.Dto.LargeScreen.StudentHeartRateReportDataDto",
"MediaTypes": [
"text/plain",
"application/json",
"text/json"
],
"StatusCode": 200
}
]
}
]

View File

@ -46,6 +46,149 @@
}
}
},
"/GradeHeartRateReport": {
"get": {
"tags": [
"HeartRateReport"
],
"summary": "年级心率报告",
"parameters": [
{
"name": "gradeId",
"in": "query",
"schema": {
"type": "integer",
"format": "int32"
}
},
{
"name": "scoreTime",
"in": "query",
"schema": {
"type": "string",
"format": "date-time"
}
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/GradeHeartRateReportDataDto"
}
},
"application/json": {
"schema": {
"$ref": "#/components/schemas/GradeHeartRateReportDataDto"
}
},
"text/json": {
"schema": {
"$ref": "#/components/schemas/GradeHeartRateReportDataDto"
}
}
}
}
}
}
},
"/ClassHeartRateReport": {
"get": {
"tags": [
"HeartRateReport"
],
"summary": "班级心率报告",
"parameters": [
{
"name": "classId",
"in": "query",
"schema": {
"type": "integer",
"format": "int32"
}
},
{
"name": "scoreTime",
"in": "query",
"schema": {
"type": "string",
"format": "date-time"
}
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/ClassHeartRateReportDataDto"
}
},
"application/json": {
"schema": {
"$ref": "#/components/schemas/ClassHeartRateReportDataDto"
}
},
"text/json": {
"schema": {
"$ref": "#/components/schemas/ClassHeartRateReportDataDto"
}
}
}
}
}
}
},
"/StudentHeartRateReport": {
"get": {
"tags": [
"HeartRateReport"
],
"summary": "学生心率报告",
"parameters": [
{
"name": "studentNo",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "scoreTime",
"in": "query",
"schema": {
"type": "string",
"format": "date-time"
}
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/StudentHeartRateReportDataDto"
}
},
"application/json": {
"schema": {
"$ref": "#/components/schemas/StudentHeartRateReportDataDto"
}
},
"text/json": {
"schema": {
"$ref": "#/components/schemas/StudentHeartRateReportDataDto"
}
}
}
}
}
}
},
"/SchoolInfo": {
"get": {
"tags": [
@ -140,6 +283,94 @@
},
"additionalProperties": false
},
"ClassHeartRateReportDataDto": {
"type": "object",
"properties": {
"maleCount": {
"type": "integer",
"format": "int32"
},
"femaleCount": {
"type": "integer",
"format": "int32"
},
"studentCount": {
"type": "integer",
"format": "int32",
"readOnly": true
},
"startEndTime": {
"type": "string",
"nullable": true
},
"sportsData": {
"$ref": "#/components/schemas/SportsDataDto"
},
"gradeName": {
"type": "string",
"nullable": true
},
"className": {
"type": "string",
"nullable": true
},
"teacherName": {
"type": "string",
"nullable": true
},
"studentList": {
"type": "array",
"items": {
"$ref": "#/components/schemas/StudentListDto"
},
"nullable": true
}
},
"additionalProperties": false
},
"ClassListDto": {
"type": "object",
"properties": {
"classId": {
"type": "integer",
"format": "int32"
},
"gradeName": {
"type": "string",
"nullable": true
},
"className": {
"type": "string",
"nullable": true
},
"teacherName": {
"type": "string",
"nullable": true
},
"studentCount": {
"type": "integer",
"format": "int32"
},
"reachCount": {
"type": "integer",
"format": "int32",
"readOnly": true
},
"maleReachCount": {
"type": "integer",
"format": "int32"
},
"femaleReachCount": {
"type": "integer",
"format": "int32"
},
"reachRate": {
"type": "integer",
"format": "int32"
}
},
"additionalProperties": false
},
"Classes": {
"type": "object",
"properties": {
@ -154,6 +385,47 @@
},
"additionalProperties": false
},
"GradeHeartRateReportDataDto": {
"type": "object",
"properties": {
"maleCount": {
"type": "integer",
"format": "int32"
},
"femaleCount": {
"type": "integer",
"format": "int32"
},
"studentCount": {
"type": "integer",
"format": "int32",
"readOnly": true
},
"startEndTime": {
"type": "string",
"nullable": true
},
"sportsData": {
"$ref": "#/components/schemas/SportsDataDto"
},
"gradeName": {
"type": "string",
"nullable": true
},
"classCount": {
"type": "integer",
"format": "int32"
},
"classList": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ClassListDto"
},
"nullable": true
}
},
"additionalProperties": false
},
"GradeListDto": {
"type": "object",
"properties": {
@ -391,6 +663,48 @@
}
},
"additionalProperties": false
},
"StudentHeartRateReportDataDto": {
"type": "object",
"properties": {
"heartRateTrend": {
"$ref": "#/components/schemas/ChartDataDto"
}
},
"additionalProperties": false
},
"StudentListDto": {
"type": "object",
"properties": {
"studentNo": {
"type": "string",
"nullable": true
},
"studentName": {
"type": "string",
"nullable": true
},
"sex": {
"type": "integer",
"format": "int32"
},
"age": {
"type": "integer",
"format": "int32"
},
"photo": {
"type": "string",
"nullable": true
},
"isReach": {
"type": "boolean"
},
"duration": {
"type": "integer",
"format": "int32"
}
},
"additionalProperties": false
}
},
"securitySchemes": {

View File

@ -1624,6 +1624,12 @@
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.AllInstances.FemaleReachCountSetInt32">
<summary>设置 ClassListDto.set_FemaleReachCount(ClassListDto this, Int32 value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.AllInstances.GradeNameGet">
<summary>设置 ClassListDto.get_GradeName(ClassListDto this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.AllInstances.GradeNameSetString">
<summary>设置 ClassListDto.set_GradeName(ClassListDto this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.AllInstances.MaleReachCountGet">
<summary>设置 ClassListDto.get_MaleReachCount(ClassListDto this) 的 填充码</summary>
</member>
@ -1681,6 +1687,12 @@
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.FemaleReachCountSetInt32">
<summary>设置 ClassListDto.set_FemaleReachCount(ClassListDto this, Int32 value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.GradeNameGet">
<summary>设置 ClassListDto.get_GradeName(ClassListDto this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.GradeNameSetString">
<summary>设置 ClassListDto.set_GradeName(ClassListDto this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.LargeScreen.Fakes.ShimClassListDto.MaleReachCountGet">
<summary>设置 ClassListDto.get_MaleReachCount(ClassListDto this) 的 填充码</summary>
</member>

View File

@ -1 +1 @@
179d9839
c9033e1

View File

@ -1 +1 @@
T8L2/Pl4YFVd0LzVElD3k675CXn+Xe1xxjrG3w5fw3Y=WWmIfOUbyYPYdKFHlVpzo+vbEnfIsJNTTcG8+oWdtSc=
OAIdEGg7kUePvtmGLiFappRiZ+t8THQ+PJMVzStNkIk=WWmIfOUbyYPYdKFHlVpzo+vbEnfIsJNTTcG8+oWdtSc=

View File

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("YD_AllHeartRates.Api")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+2791faef427e5055e0b100213d2f516c468a2f23")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cba47da79529d88a9c2535c9c0d6a3ad9378b578")]
[assembly: System.Reflection.AssemblyProductAttribute("YD_AllHeartRates.Api")]
[assembly: System.Reflection.AssemblyTitleAttribute("YD_AllHeartRates.Api")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
a2a833dba9b68d9e097ca4bb10f4e8d37c31e1c7f2353ed088ceaaced6f4b940
5dadd7f540af7e55599b33b1bde90ec16d8c55e26389806708a87f620f4347bb

View File

@ -31,6 +31,24 @@
</summary>
<returns></returns>
</member>
<member name="M:YD_AllHeartRates.Api.Controllers.HeartRateReportController.GradeHeartRateReport(System.Int32,System.Nullable{System.DateTime})">
<summary>
年级心率报告
</summary>
<returns></returns>
</member>
<member name="M:YD_AllHeartRates.Api.Controllers.HeartRateReportController.ClassHeartRateReport(System.Int32,System.Nullable{System.DateTime})">
<summary>
班级心率报告
</summary>
<returns></returns>
</member>
<member name="M:YD_AllHeartRates.Api.Controllers.HeartRateReportController.StudentHeartRateReport(System.String,System.Nullable{System.DateTime})">
<summary>
学生心率报告
</summary>
<returns></returns>
</member>
<member name="T:YD_AllHeartRates.Api.Controllers.LargeScreenController">
<summary>
大屏

View File

@ -37,6 +37,11 @@ namespace YD_AllHeartRates.Commons.Dto.LargeScreen
/// </summary>
public int ClassId { get; set; }
/// <summary>
/// 年级名称
/// </summary>
public string? GradeName { get; set; }
/// <summary>
/// 班级名称
/// </summary>

View File

@ -34,7 +34,7 @@ namespace YD_AllHeartRates.Commons.Dto.LargeScreen
/// <summary>
/// 运动数据
/// </summary>
public SportsDataDto SportsData { get; set; }
public SportsDataDto SportsData { get; set; } = new SportsDataDto();
}
/// <summary>

View File

@ -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+2791faef427e5055e0b100213d2f516c468a2f23")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cba47da79529d88a9c2535c9c0d6a3ad9378b578")]
[assembly: System.Reflection.AssemblyProductAttribute("YD_AllHeartRates.Commons")]
[assembly: System.Reflection.AssemblyTitleAttribute("YD_AllHeartRates.Commons")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
75fe66ac65b777401eca8662675485feb709949edb700f080fb4f1742a74f061
fe596cc1e95247c75a7a0988e79c591ff26019d760d216a793314f7ca2ab770e