fix:修改粒度解析
This commit is contained in:
parent
bfee93d7bb
commit
9f81ec1290
@ -88,6 +88,9 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) (
|
|||||||
var result []model.AggregatedData
|
var result []model.AggregatedData
|
||||||
|
|
||||||
// 对每个时间桶进行处理
|
// 对每个时间桶进行处理
|
||||||
|
var lastKnownRainfall float64 = 0
|
||||||
|
var firstBucketProcessed bool = false
|
||||||
|
|
||||||
for i, bucketTime := range buckets {
|
for i, bucketTime := range buckets {
|
||||||
var nextBucketTime time.Time
|
var nextBucketTime time.Time
|
||||||
if i < len(buckets)-1 {
|
if i < len(buckets)-1 {
|
||||||
@ -106,14 +109,21 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(bucketData) == 0 {
|
if len(bucketData) == 0 {
|
||||||
// 如果该时间桶内没有数据,尝试使用上一个时间桶的最后数据
|
// 如果该时间桶内没有数据,表示没有新增雨量
|
||||||
|
var newData model.AggregatedData
|
||||||
|
newData.Timestamp = bucketTime
|
||||||
|
// 使用上一个有效时间桶的其他数据(温度等)
|
||||||
if i > 0 && len(result) > 0 {
|
if i > 0 && len(result) > 0 {
|
||||||
lastBucketData := result[len(result)-1]
|
lastBucketData := result[len(result)-1]
|
||||||
// 复制上一个时间桶的数据,但更新时间戳
|
newData.AvgTemperature = lastBucketData.AvgTemperature
|
||||||
newData := lastBucketData
|
newData.AvgHumidity = lastBucketData.AvgHumidity
|
||||||
newData.Timestamp = bucketTime
|
newData.AvgWindSpeed = lastBucketData.AvgWindSpeed
|
||||||
result = append(result, newData)
|
newData.AvgAtmPressure = lastBucketData.AvgAtmPressure
|
||||||
|
newData.AvgSolarRadiation = lastBucketData.AvgSolarRadiation
|
||||||
}
|
}
|
||||||
|
// 新增雨量为0
|
||||||
|
newData.Rainfall = 0
|
||||||
|
result = append(result, newData)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,20 +147,30 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) (
|
|||||||
aggregated.AvgAtmPressure = sumAtmPressure / count
|
aggregated.AvgAtmPressure = sumAtmPressure / count
|
||||||
aggregated.AvgSolarRadiation = sumSolarRadiation / count
|
aggregated.AvgSolarRadiation = sumSolarRadiation / count
|
||||||
|
|
||||||
// 对于雨量,使用时间桶内最后一个(最新的)数据点的值
|
// 获取该时间桶内最后一个(最新的)数据点的累积雨量值
|
||||||
aggregated.Rainfall = bucketData[len(bucketData)-1].Rainfall
|
currentRainfall := bucketData[len(bucketData)-1].Rainfall
|
||||||
|
|
||||||
// 计算新增雨量(相对于前一个时间桶)
|
// 计算新增雨量
|
||||||
if i > 0 && len(result) > 0 {
|
if !firstBucketProcessed {
|
||||||
prevRainfall := result[len(result)-1].Rainfall
|
// 第一个有数据的时间桶,记录累积雨量作为基准
|
||||||
// 如果当前雨量大于前一个时间桶的雨量,计算差值作为新增雨量
|
lastKnownRainfall = currentRainfall
|
||||||
if aggregated.Rainfall > prevRainfall {
|
// 如果是第一个时间桶,新增雨量就是当前累积值
|
||||||
aggregated.Rainfall = aggregated.Rainfall - prevRainfall
|
aggregated.Rainfall = currentRainfall
|
||||||
} else if aggregated.Rainfall == prevRainfall {
|
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
|
aggregated.Rainfall = 0
|
||||||
}
|
}
|
||||||
// 如果当前雨量小于前一个时间桶的雨量(可能是雨量计重置),保留当前值作为新增雨量
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result = append(result, aggregated)
|
result = append(result, aggregated)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user