c
This commit is contained in:
parent
b5b2790b2a
commit
32efbdd94c
@ -14,38 +14,35 @@ namespace YD_AllHeartRates.Api.Services.Impl
|
|||||||
|
|
||||||
public static ChartDataDto BuildHeartRateTrend(List<HeartRateData> data)
|
public static ChartDataDto BuildHeartRateTrend(List<HeartRateData> data)
|
||||||
{
|
{
|
||||||
// 固定时间段:8点到16点
|
var chart = new ChartDataDto
|
||||||
var fixedHours = Enumerable.Range(8, 9).ToList(); // 8~16 共9小时
|
{
|
||||||
var axisX = fixedHours.Select(h => $"{h}:00").ToList();
|
AxisX = new List<string>(),
|
||||||
|
AxisY = new List<int>()
|
||||||
var axisY = new List<int>();
|
};
|
||||||
|
|
||||||
if (data == null || data.Count == 0)
|
if (data == null || data.Count == 0)
|
||||||
{
|
return chart;
|
||||||
// 无数据时返回默认0值
|
|
||||||
axisY = Enumerable.Repeat(0, fixedHours.Count).ToList();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 按小时分组计算平均值(四舍五入)
|
// 按小时分组计算平均值(四舍五入)
|
||||||
var hourlyAvg = data
|
var hourlyAvg = data
|
||||||
.GroupBy(x => x.ScoreTime.Hour)
|
.GroupBy(x => x.ScoreTime.Hour)
|
||||||
.ToDictionary(g => g.Key, g => (int)Math.Round(g.Average(x => x.Value)));
|
.ToDictionary(g => g.Key, g => (int)Math.Round(g.Average(x => x.Value)));
|
||||||
|
|
||||||
foreach (var hour in fixedHours)
|
// 计算最小和最大小时
|
||||||
|
int minHour = data.Min(x => x.ScoreTime.Hour);
|
||||||
|
int maxHour = data.Max(x => x.ScoreTime.Hour);
|
||||||
|
|
||||||
|
for (int hour = minHour; hour <= maxHour; hour++)
|
||||||
{
|
{
|
||||||
axisY.Add(hourlyAvg.TryGetValue(hour, out int val) ? val : 0);
|
chart.AxisX.Add($"{hour}:00");
|
||||||
}
|
chart.AxisY.Add(hourlyAvg.TryGetValue(hour, out int val) ? val : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ChartDataDto
|
return chart;
|
||||||
{
|
|
||||||
AxisX = axisX,
|
|
||||||
AxisY = axisY
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static int CalculateReachRate(int reachCount, int total)
|
public static int CalculateReachRate(int reachCount, int total)
|
||||||
=> total == 0 ? 0 : (int)((double)reachCount / total * 100);
|
=> total == 0 ? 0 : (int)((double)reachCount / total * 100);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user