From 176d7d8283e66ccf63878c9ab823e900df94b748 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期二, 05 八月 2025 17:20:58 +0800 Subject: [PATCH] 2025.8.5 1. 动态溯源模块添加延迟数据周期异常合并功能 --- src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedData.kt | 122 +++++++++++++++++++++++++++------------- 1 files changed, 81 insertions(+), 41 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedData.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedData.kt index d9adf45..266ed2a 100644 --- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedData.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedData.kt @@ -6,7 +6,9 @@ import com.flightfeather.uav.common.utils.DateUtil import com.flightfeather.uav.domain.entity.BaseRealTimeData import com.flightfeather.uav.lightshare.bean.DataVo +import com.flightfeather.uav.socket.eunm.FactorType import java.util.Date +import kotlin.math.round /** * 姹℃煋鏁版嵁 @@ -14,6 +16,23 @@ * @author feiyu02 */ class PollutedData() { + + inner class Statistic(){ + var factorId: Int? = null + var factorName: String? = null + var subFactorId: List<Int>? = null + var subFactorName: List<String>? = null + var selectedFactor: FactorFilter.SelectedFactor? = null + + // 鍥犲瓙閲忕骇骞冲潎鍙樺寲骞呭害 + var avgPer: Double? = null + // 鍥犲瓙閲忕骇骞冲潎鍙樺寲閫熺巼 + var avgRate: Double? = null + + var avg: Double? = null + var min: Double? = null + var max: Double? = null + } /** * 9. 鍏宠仈鍥犲瓙 @@ -27,7 +46,7 @@ constructor( start: BaseRealTimeData, end: BaseRealTimeData?, - factor: FactorFilter.SelectedFactor, + factorList: List<FactorFilter.SelectedFactor>, exceptionData: List<BaseRealTimeData>, historyData: List<BaseRealTimeData>, eType: ExceptionType, @@ -35,11 +54,6 @@ ) : this() { exception = eType.des exceptionType = eType.value - factorId = factor.main.value - factorName = factor.main.des - subFactorId = factor.subs.map { it.value } - subFactorName = factor.subs.map { it.des } - selectedFactor = factor startTime = start.dataTime endTime = end?.dataTime @@ -49,7 +63,6 @@ endData = end windSpeed = exceptionData.first().windSpeed?.toDouble() - percentage = windLevelCondition?.mutationRate?.first times = windLevelCondition?.countLimit dataList.add(start) @@ -59,20 +72,30 @@ dataVoList.addAll(dataList.map { it.toDataVo() }) historyDataList.addAll(historyData.map { it.toDataVo() }) - calPer() - calRate() + + factorList.forEach { f-> + statisticMap[f.main] = Statistic().apply { + factorId = f.main.value + factorName = f.main.des + subFactorId = f.subs.map { it.value } + subFactorName = f.subs.map { it.des } + selectedFactor = f + + avgPer = calPer(f.main) + avgRate = calRate(f.main) + + val s = dataSummary(exceptionData, f.main) + avg = s.first + min = s.second + max = s.third + } + } } var deviceCode: String? = null var exception: String? = null var exceptionType: Int? = null - - var factorId: Int? = null - var factorName: String? = null - var subFactorId: List<Int>? = null - var subFactorName: List<String>? = null - var selectedFactor: FactorFilter.SelectedFactor? = null var startTime: Date? = null var endTime: Date? = null @@ -83,13 +106,6 @@ // 椋庨�� var windSpeed: Double? = null - // 鍥犲瓙閲忕骇鍙樺寲骞呭害 - var percentage: Double? = null - // 鍥犲瓙閲忕骇骞冲潎鍙樺寲骞呭害 - var avgPer: Double? = null - // 鍥犲瓙閲忕骇骞冲潎鍙樺寲閫熺巼 - var avgRate: Double? = null - // 鍙戠敓娆℃暟 var times: Int? = null @@ -98,33 +114,57 @@ var dataList: MutableList<BaseRealTimeData> = mutableListOf() var dataVoList: MutableList<DataVo> = mutableListOf() - private fun calPer() { - val list = dataList -// list.add(startData) -// list.addAll(dataList) - if (list.size < 2) return + var statisticMap = mutableMapOf<FactorType, Statistic>() - var total = .0 - for (i in 0 until list.size - 1) { - val p = list[i]?.getByFactorType(selectedFactor!!.main)!! - val n = list[i + 1]?.getByFactorType(selectedFactor!!.main)!! - total += (n - p) / p - } - avgPer = total / (list.size - 1) + fun toFactorNames(): String { + val factors = statisticMap.entries.map { it.key }.sortedBy { it.value }.joinToString(";") { it.des } + return factors } - private fun calRate() { + private fun calPer(factorType: FactorType): Double? { val list = dataList -// list.add(startData) -// list.addAll(dataList) - if (list.size < 2) return + if (list.size < 2) return null var total = .0 for (i in 0 until list.size - 1) { - val p = list[i]?.getByFactorType(selectedFactor!!.main)!! - val n = list[i + 1]?.getByFactorType(selectedFactor!!.main)!! + val p = list[i].getByFactorType(factorType) ?: .0f + val n = list[i + 1].getByFactorType(factorType) ?: .0f + total += (n - p) / p + } + return total / (list.size - 1) + } + + private fun calRate(factorType: FactorType): Double? { + val list = dataList + if (list.size < 2) return null + + var total = .0 + for (i in 0 until list.size - 1) { + val p = list[i].getByFactorType(factorType) ?: .0f + val n = list[i + 1].getByFactorType(factorType) ?: .0f total += (n - p) / 4 } - avgRate = total / (list.size - 1) + return total / (list.size - 1) + } + + private fun dataSummary(exceptionData: List<BaseRealTimeData?>, factorType: FactorType): Triple<Double, Double, + Double> { + var min = -1.0 + var max = -1.0 + var total = .0 + var count = 0 + exceptionData.forEach { + val value = it?.getByFactorType(factorType)?.toDouble() ?: return@forEach + if (min == -1.0 || min > value) { + min = round(value * 1000) / 1000 + } + if (max == -1.0 || max < value) { + max = round(value * 1000) / 1000 + } + total += value + count++ + } + val avg = if (count == 0) .0 else round(total / count * 1000) / 1000 + return Triple(avg, min, max) } } \ No newline at end of file -- Gitblit v1.9.3