diff --git a/internal/dao/sensor.go b/internal/dao/sensor.go index d277fa9..514e8b9 100644 --- a/internal/dao/sensor.go +++ b/internal/dao/sensor.go @@ -88,6 +88,9 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( var result []model.AggregatedData // 对每个时间桶进行处理 + var lastKnownRainfall float64 = 0 + var firstBucketProcessed bool = false + for i, bucketTime := range buckets { var nextBucketTime time.Time if i < len(buckets)-1 { @@ -106,14 +109,21 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( } if len(bucketData) == 0 { - // 如果该时间桶内没有数据,尝试使用上一个时间桶的最后数据 + // 如果该时间桶内没有数据,表示没有新增雨量 + var newData model.AggregatedData + newData.Timestamp = bucketTime + // 使用上一个有效时间桶的其他数据(温度等) if i > 0 && len(result) > 0 { lastBucketData := result[len(result)-1] - // 复制上一个时间桶的数据,但更新时间戳 - newData := lastBucketData - newData.Timestamp = bucketTime - result = append(result, newData) + newData.AvgTemperature = lastBucketData.AvgTemperature + newData.AvgHumidity = lastBucketData.AvgHumidity + newData.AvgWindSpeed = lastBucketData.AvgWindSpeed + newData.AvgAtmPressure = lastBucketData.AvgAtmPressure + newData.AvgSolarRadiation = lastBucketData.AvgSolarRadiation } + // 新增雨量为0 + newData.Rainfall = 0 + result = append(result, newData) continue } @@ -137,20 +147,30 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( aggregated.AvgAtmPressure = sumAtmPressure / count aggregated.AvgSolarRadiation = sumSolarRadiation / count - // 对于雨量,使用时间桶内最后一个(最新的)数据点的值 - aggregated.Rainfall = bucketData[len(bucketData)-1].Rainfall + // 获取该时间桶内最后一个(最新的)数据点的累积雨量值 + currentRainfall := bucketData[len(bucketData)-1].Rainfall - // 计算新增雨量(相对于前一个时间桶) - if i > 0 && len(result) > 0 { - prevRainfall := result[len(result)-1].Rainfall - // 如果当前雨量大于前一个时间桶的雨量,计算差值作为新增雨量 - if aggregated.Rainfall > prevRainfall { - aggregated.Rainfall = aggregated.Rainfall - prevRainfall - } else if aggregated.Rainfall == prevRainfall { - // 如果雨量没有变化,表示没有新增雨量 + // 计算新增雨量 + if !firstBucketProcessed { + // 第一个有数据的时间桶,记录累积雨量作为基准 + lastKnownRainfall = currentRainfall + // 如果是第一个时间桶,新增雨量就是当前累积值 + aggregated.Rainfall = currentRainfall + firstBucketProcessed = true + } else { + // 后续时间桶,计算相对于上一个已知累积雨量的差值 + if currentRainfall > lastKnownRainfall { + // 如果当前累积雨量增加,计算新增部分 + aggregated.Rainfall = currentRainfall - lastKnownRainfall + lastKnownRainfall = currentRainfall + } else if currentRainfall < lastKnownRainfall { + // 如果当前累积雨量减少(可能是雨量计重置),视为新一轮累积 + aggregated.Rainfall = currentRainfall + lastKnownRainfall = currentRainfall + } else { + // 如果累积雨量没有变化,表示没有新增雨量 aggregated.Rainfall = 0 } - // 如果当前雨量小于前一个时间桶的雨量(可能是雨量计重置),保留当前值作为新增雨量 } result = append(result, aggregated)