From 8c6e742562d0c8647e0ee8deff01a3eb176d677b Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期二, 02 九月 2025 17:30:47 +0800
Subject: [PATCH] 2025.9.2 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..d5e9614 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(dataList, 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