diff --git a/YD_AllHeartRates.Api/Services/Impl/HeartRateReportHelper.cs b/YD_AllHeartRates.Api/Services/Impl/HeartRateReportHelper.cs index 469ece6..05a8f3c 100644 --- a/YD_AllHeartRates.Api/Services/Impl/HeartRateReportHelper.cs +++ b/YD_AllHeartRates.Api/Services/Impl/HeartRateReportHelper.cs @@ -14,39 +14,38 @@ namespace YD_AllHeartRates.Api.Services.Impl public static ChartDataDto BuildHeartRateTrend(List data) { + // 固定时间段:8点到16点 + var fixedHours = Enumerable.Range(8, 9).ToList(); // 8~16 共9小时 + var axisX = fixedHours.Select(h => $"{h}:00").ToList(); + + var axisY = new List(); + if (data == null || data.Count == 0) - return new ChartDataDto() + { + // 无数据时返回默认0值 + axisY = Enumerable.Repeat(0, fixedHours.Count).ToList(); + } + else + { + // 按小时分组计算平均值(四舍五入) + var hourlyAvg = data + .GroupBy(x => x.ScoreTime.Hour) + .ToDictionary(g => g.Key, g => (int)Math.Round(g.Average(x => x.Value))); + + foreach (var hour in fixedHours) { - AxisX = new List() { "8:00", "9:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00" }, - AxisY = new List() { 0, 0, 0, 0, 0, 0, 0, 0, 0 } - }; - - // 按小时分组计算平均值(四舍五入) - var hourlyAvg = data - .GroupBy(x => x.ScoreTime.Hour) - .ToDictionary(g => g.Key, g => (int)Math.Round(g.Average(x => x.Value))); - - // 获取最小和最大小时 - int minHour = data.Min(x => x.ScoreTime.Hour); - int maxHour = data.Max(x => x.ScoreTime.Hour); - - var chart = new ChartDataDto - { - AxisX = new List(), - AxisY = new List() - }; - - for (int hour = minHour; hour <= maxHour; hour++) - { - chart.AxisX.Add($"{hour}:00"); // 去掉前导0 - chart.AxisY.Add(hourlyAvg.TryGetValue(hour, out int val) ? val : 80); + axisY.Add(hourlyAvg.TryGetValue(hour, out int val) ? val : 80); // 缺省用80填充 + } } - return chart; + return new ChartDataDto + { + AxisX = axisX, + AxisY = axisY + }; } - public static int CalculateReachRate(int reachCount, int total) => total == 0 ? 0 : (int)((double)reachCount / total * 100);