src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt
@@ -10,6 +10,7 @@
import java.math.BigDecimal
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.temporal.ChronoUnit
import java.util.*
import javax.persistence.Column
import javax.persistence.GeneratedValue
@@ -332,11 +333,33 @@
/**
 * 计算实时监测数据列表的统计信息
 * 为每种环境因子计算最小值、最大值和平均值
 *
 * @param granularity 数据颗粒度,可选值为SECOND, MINUTE, HOUR, 默认MINUTE
 * @return 包含各环境因子统计信息的FactorStatistics列表
 *         每个FactorStatistics对象包含因子类型、最小值、最大值和平均值
 */
fun List<BaseRealTimeData>.calDataStatistics(): List<FactorStatistics> {
fun List<BaseRealTimeData>.calDataStatistics(granularity: String): List<FactorStatistics> {
    // 检查颗粒度是否有效
    if (granularity !in listOf("SECOND", "MINUTE", "HOUR")) {
        throw IllegalArgumentException("无效的颗粒度参数,可选值为SECOND, MINUTE, HOUR")
    }
    val groupedData = when (granularity) {
        "SECOND" -> this
        "MINUTE" -> groupBy { it.dataTime?.toInstant()?.truncatedTo(ChronoUnit.MINUTES) }.mapValues {
            it.value.avg().apply {
                dataTime = Date.from(it.key)
                createTime = dataTime
            }
        }.values.toList()
        "HOUR" -> groupBy { it.dataTime?.toInstant()?.truncatedTo(ChronoUnit.HOURS) }.mapValues {
            it.value.avg().apply {
                dataTime = Date.from(it.key)
                createTime = dataTime
            }
        }.values.toList()
        else -> throw IllegalArgumentException("无效的颗粒度参数,可选值为SECOND, MINUTE, HOUR")
    }
    // 初始化各环境因子的统计对象列表
    val statistics = mutableListOf<FactorStatistics>()
@@ -357,7 +380,7 @@
    ).forEach { statistics.add(FactorStatistics(it)) }
    // 计算平均值并同时更新各因子的最小值和最大值
    val avgData = avg { item ->
    val avgData = groupedData.avg { item ->
        // 更新每个因子的最小和最大值
        statistics[0].updateMinAndMaxValue(item.no2)
        statistics[1].updateMinAndMaxValue(item.co)