| | |
| | | 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 |
| | |
| | | /** |
| | | * 计算实时监测数据列表的统计信息 |
| | | * 为每种环境因子计算最小值、最大值和平均值 |
| | | * |
| | | * @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>() |
| | |
| | | ).forEach { statistics.add(FactorStatistics(it)) } |
| | | |
| | | // 计算平均值并同时更新各因子的最小值和最大值 |
| | | val avgData = avg { item -> |
| | | val avgData = groupedData.avg { item -> |
| | | // 更新每个因子的最小和最大值 |
| | | statistics[0].updateMinAndMaxValue(item.no2) |
| | | statistics[1].updateMinAndMaxValue(item.co) |