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/PollutedClue.kt |   90 ++++++++++++++++++++++++++++++++++----------
 1 files changed, 69 insertions(+), 21 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 c87812e..6035ec5 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
@@ -18,39 +18,87 @@
  * @date 2025/5/27
  * @author feiyu02
  */
-class PollutedClue() : BaseExceptionResult(){
+class PollutedClue() : BaseExceptionResult() {
 
 //    constructor(
-//        start: BaseRealTimeData,
-//        end: BaseRealTimeData?,
-//        factor: FactorFilter.SelectedFactor,
-//        exceptionData: List<BaseRealTimeData>,
-//        eType: ExceptionType,
-//        config: RTExcWindLevelConfig,
+//        tag: ExceptionTag, factor: FactorFilter.SelectedFactor, eType: ExceptionType, config: RTExcWindLevelConfig,
 //        windLevelCondition: RTExcWindLevelConfig.WindLevelCondition?,
 //    ) : this() {
-//        if (exceptionData.isEmpty()) return
-//        pollutedData = PollutedData(start, end, factor, exceptionData, eType, windLevelCondition)
-//        pollutedArea = PollutedArea(exceptionData, config, windLevelCondition)
+//        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(
-        tag: ExceptionTag, factor: FactorFilter.SelectedFactor, eType: ExceptionType, config: RTExcWindLevelConfig,
+        exceptions: List<Pair<FactorFilter.SelectedFactor, ExceptionTag>>,
+        eType: ExceptionType,
+        config: RTExcWindLevelConfig,
         windLevelCondition: RTExcWindLevelConfig.WindLevelCondition?,
-    ) : this()
-//            this(
-//        tag.startData!!, tag.endData, factor, tag.exceptionData, eType, config,
-//        windLevelCondition
-//    )
-    {
-        if (tag.exceptionData.isEmpty()) return
-        deviceCode = tag.startData?.deviceCode
+    ) : this() {
+        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 }.distinct()
         pollutedData = PollutedData(
-            tag.startData!!, tag.endData, factor, tag.exceptionData, tag.historyData, eType, windLevelCondition
+            startData!!, endData, factorList, exceptionData, historyData, eType, windLevelCondition
         )
-        pollutedArea = PollutedArea(tag.historyData, tag.exceptionData, config, windLevelCondition)
+        pollutedArea = PollutedArea(historyData, exceptionData, config, windLevelCondition)
+
     }
 
+
     /**
      * 6. 灞曠ず鏁版嵁鍙樺寲鎯呭喌锛屼笂鍗囬�熺巼绛夌瓑
      */

--
Gitblit v1.9.3