From 8fc27dba6719041402e3e3c099e2f3e01d9d52c7 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期三, 16 七月 2025 17:30:56 +0800
Subject: [PATCH] 2025.7.16 1. 修改动态溯源异常判断逻辑

---
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedClue.kt |   93 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 80 insertions(+), 13 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedClue.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedClue.kt
index 6775572..19eedc2 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedClue.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedClue.kt
@@ -2,6 +2,7 @@
 
 import com.flightfeather.uav.biz.FactorFilter
 import com.flightfeather.uav.biz.dataanalysis.BaseExceptionResult
+import com.flightfeather.uav.biz.dataanalysis.model.ExceptionTag
 import com.flightfeather.uav.biz.dataanalysis.model.ExceptionType
 import com.flightfeather.uav.biz.sourcetrace.config.RTExcWindLevelConfig
 import com.flightfeather.uav.common.utils.DateUtil
@@ -9,6 +10,7 @@
 import com.flightfeather.uav.domain.entity.BaseRealTimeData
 import com.flightfeather.uav.domain.entity.SceneInfo
 import com.flightfeather.uav.domain.repository.SceneInfoRep
+import com.flightfeather.uav.socket.sender.MsgType
 
 /**
  * 姹℃煋绾跨储
@@ -18,24 +20,89 @@
  */
 class PollutedClue() : BaseExceptionResult() {
 
+//    constructor(
+//        tag: ExceptionTag, factor: FactorFilter.SelectedFactor, eType: ExceptionType, config: RTExcWindLevelConfig,
+//        windLevelCondition: RTExcWindLevelConfig.WindLevelCondition?,
+//    ) : this() {
+//        if (tag.exceptionData.isEmpty()) return
+//        deviceCode = tag.startData?.deviceCode
+//        pollutedData = PollutedData(
+//            tag.startData!!, tag.endData, factor, tag.exceptionData, tag.historyData, eType, windLevelCondition
+//        )
+//        pollutedArea = PollutedArea(tag.historyData, tag.exceptionData, config, windLevelCondition)
+//    }
+
     constructor(
-        start: BaseRealTimeData,
-        end: BaseRealTimeData?,
-        factor: FactorFilter.SelectedFactor,
-        exceptionData: List<BaseRealTimeData>,
+        exceptions: List<Pair<FactorFilter.SelectedFactor, ExceptionTag>>,
         eType: ExceptionType,
         config: RTExcWindLevelConfig,
-        windLevelCondition: RTExcWindLevelConfig.WindLevelCondition
+        windLevelCondition: RTExcWindLevelConfig.WindLevelCondition?,
     ) : this() {
-        this.factor = factor
-        if (exceptionData.isEmpty()) return
-        pollutedData = PollutedData(start, end, factor, exceptionData, eType, windLevelCondition)
-        pollutedArea = PollutedArea(exceptionData, config, windLevelCondition)
+        if (exceptions.isEmpty() || exceptions[0].second.exceptionData.isEmpty()) return
+        deviceCode = exceptions[0].second.startData?.deviceCode
+        var startData: BaseRealTimeData? = null
+        var endData: BaseRealTimeData? = null
+        var exceptionData = mutableListOf<BaseRealTimeData>()
+        var historyData = mutableListOf<BaseRealTimeData>()
+        exceptions.forEach { e ->
+            if (startData == null) {
+                startData = e.second.startData
+            } else {
+                if (e.second.startData?.dataTime!! < startData!!.dataTime) {
+                    startData = e.second.startData
+                }
+            }
+
+            if (endData == null) {
+                endData = e.second.endData
+            } else {
+                if (e.second.endData?.dataTime!! > endData!!.dataTime) {
+                    endData = e.second.endData
+                }
+            }
+
+            if (exceptionData.isEmpty()) {
+                exceptionData = e.second.exceptionData
+            } else {
+                e.second.exceptionData.forEach {
+                    if (exceptionData.find { d -> d.dataTime == it.dataTime } == null) {
+                        exceptionData.add(it)
+                    }
+                }
+            }
+
+            if (historyData.isEmpty()) {
+                historyData = e.second.historyData
+            } else {
+                e.second.historyData.forEach {
+                    if (historyData.find { d -> d.dataTime == it.dataTime } == null) {
+                        historyData.add(it)
+                    }
+                }
+            }
+        }
+        exceptionData.sortBy { it.dataTime }
+        historyData.sortBy { it.dataTime }
+
+        val factorList = exceptions.map { it.first }
+        pollutedData = PollutedData(
+            startData!!, endData, factorList, exceptionData, historyData, eType, windLevelCondition
+        )
+        pollutedArea = PollutedArea(historyData, exceptionData, config, windLevelCondition)
+
     }
+
 
     /**
      * 6. 灞曠ず鏁版嵁鍙樺寲鎯呭喌锛屼笂鍗囬�熺巼绛夌瓑
      */
+
+    /**
+     * @see [MsgType]
+     */
+    var msgType: Int? = null
+
+    var deviceCode: String? = null
 
     var pollutedData: PollutedData? = null
 
@@ -43,13 +110,13 @@
 
     var pollutedSource: PollutedSource? = null
 
-    private var factor: FactorFilter.SelectedFactor? = null
-
     /**
      * 鏌ユ壘绯荤粺鍐呴儴婧簮鑼冨洿鍐呯殑姹℃煋浼佷笟
      */
     fun searchScenes(sceneInfoRep: SceneInfoRep) {
-        if (pollutedArea == null || factor == null) return
-        pollutedSource = PollutedSource().also { it.searchScenes(pollutedArea!!, sceneInfoRep, factor!!) }
+        if (pollutedArea == null || pollutedData == null) return
+        pollutedSource = PollutedSource().also {
+            it.searchScenes(pollutedArea!!, sceneInfoRep, pollutedData!!)
+        }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3