From 38d72198bfcced01ed9513b978163e5cd1d84625 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期一, 21 七月 2025 15:31:41 +0800
Subject: [PATCH] 2025.7.21 1. 修改动态溯源异常判断逻辑

---
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSummary.kt |   73 +++++++++++++++++++++++++-----------
 1 files changed, 51 insertions(+), 22 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSummary.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSummary.kt
index c2c651f..188bb7f 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSummary.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSummary.kt
@@ -1,14 +1,19 @@
 package com.flightfeather.uav.biz.sourcetrace.model
 
 import com.flightfeather.uav.biz.sourcetrace.config.RTExcWindLevelConfig
+import com.flightfeather.uav.common.net.AMapService
+import com.flightfeather.uav.common.utils.DateUtil
+import com.flightfeather.uav.common.utils.MapUtil
 import com.flightfeather.uav.domain.entity.BaseRealTimeData
 import com.flightfeather.uav.domain.entity.SceneInfo
+import java.math.BigDecimal
 import java.time.LocalDateTime
+import java.util.Date
 import java.util.Timer
 import java.util.TimerTask
 
 // 寮傚父鏁版嵁鐢熸垚鍥炶皟绫�
-typealias NewPolluteSummaryCallback = (ex: PollutedSummary.AnalysisResult) -> Unit
+typealias NewPolluteSummaryCallback = (ex: AnalysisResult) -> Unit
 
 /**
  * 姹℃煋鎯呭喌姹囨��
@@ -23,14 +28,6 @@
      * 5. 姹℃煋婧愮殑琚壂鎻忔鏁�
      * 姣忎竴鍒婚挓瀵瑰巻鍙茬嚎绱㈣繘琛岀粺璁★紝鎻愬嚭浼氬晢寤鸿锛堢姹℃煋婧愯緝杩溿�佹薄鏌撴簮鏁伴噺銆佸嚭鐜版鏁帮級銆佽蛋鑸矾绾胯皟鏁村缓璁紙绂绘薄鏌撴簮杈冭繎銆佽蛋鑸建杩规湭鎺ヨ繎婧簮鍦烘櫙锛�
      */
-
-    /**
-     * 鍒嗘瀽缁撴灉
-     */
-    inner class AnalysisResult{
-        // 鎸夌収琚壂鎻忔鏁伴檷搴忔帓鍒楃殑姹℃煋婧愬垪琛�
-        var sortedSceneList: List<Pair<SceneInfo?, Int>>? = null
-    }
 
     /**
      * 瀹炴椂缁熻
@@ -53,7 +50,7 @@
     private var analysisTimer: Timer? = null
 
     // 瀹氭椂姹℃煋鍒嗘瀽浠诲姟
-    private var lastAnalysisOnTimeTask:TimerTask? = null
+    private var lastAnalysisOnTimeTask: TimerTask? = null
 
     // 瀹氭椂姹℃煋鍒嗘瀽浠诲姟杩愯鐘舵��
     private var analysisTaskIsRunning = false
@@ -67,9 +64,16 @@
 
     // 鏂板涓�鏉℃薄鏌撶嚎绱�
     fun addClue(pollutedClue: PollutedClue) {
-        clueList.add(pollutedClue)
+        // 褰撴函婧愭湭鎵惧埌椋庨櫓婧愭椂锛屾娆℃函婧愪俊鎭笉浣滀负绾跨储缁熻椤�
+        if (pollutedClue.pollutedSource?.sceneList?.isNotEmpty() == true)
+            clueList.add(pollutedClue)
 //        realTimeSummary()
         analysisOnClueCount()
+    }
+
+    // 鏂板涓�鏉℃薄鏌撶嚎绱�
+    fun addClueList(pollutedClues: List<PollutedClue>) {
+        pollutedClues.forEach { addClue(it) }
     }
 
     // 鍒锋柊褰撳墠鏈�鏂扮殑璧拌埅鐩戞祴鏁版嵁
@@ -121,8 +125,8 @@
         val statistic = AnalysisStatistic()
         // 鍏辨湁澶氬皯鐩稿叧姹℃煋婧愶紝鍝簺姹℃煋婧愯鎵弿娆℃暟杈冨
         val sceneMap = mutableMapOf<String?, Pair<SceneInfo?, Int>>()
-        clueList.forEach {c->
-            c.pollutedSource?.sceneList?.forEach { s->
+        clueList.forEach { c ->
+            c.pollutedSource?.sceneList?.forEach { s ->
                 if (!sceneMap.containsKey(s?.guid)) {
                     sceneMap[s?.guid] = s to 1
                 } else {
@@ -138,11 +142,12 @@
      * 绾跨储鍒嗘瀽
      */
     private fun analysis() {
-        val result = AnalysisResult()
+        if (clueList.isEmpty()) return
+        val result = AnalysisResult().apply { deviceCode = clueList.first().deviceCode }
         // 鍏辨湁澶氬皯鐩稿叧姹℃煋婧愶紝鍝簺姹℃煋婧愯鎵弿娆℃暟杈冨
         val sceneMap = mutableMapOf<String?, Pair<SceneInfo?, Int>>()
-        clueList.forEach {c->
-            c.pollutedSource?.sceneList?.forEach { s->
+        clueList.forEach { c ->
+            c.pollutedSource?.sceneList?.forEach { s ->
                 if (!sceneMap.containsKey(s?.guid)) {
                     sceneMap[s?.guid] = s to 1
                 } else {
@@ -150,18 +155,42 @@
                 }
             }
         }
-        val res = sceneMap.entries.sortedBy { it.value.second }
+        val res = sceneMap.entries.sortedByDescending { it.value.second }
         result.sortedSceneList = res.map { it.value }
 
         // 褰撳墠鐨勮蛋鑸暟鎹殑瀹氫綅鍜屾薄鏌撴簮璺濈鏄惁鏄�愭笎鎺ヨ繎锛岃嫢璧拌埅杩滅浜嗕富瑕佹薄鏌撴簮锛屾彁绀虹敤鎴疯皟鏁磋蛋鑸矾绾�
+        if (!result.sortedSceneList.isNullOrEmpty()) {
+            val sT = DateUtil.instance.dateToString(clueList.first().pollutedData?.startTime, DateUtil.DateStyle.HH_MM_SS)
+            val eT = DateUtil.instance.dateToString(clueList.last().pollutedData?.endTime, DateUtil.DateStyle.HH_MM_SS)
+            val closetScene = result.sortedSceneList?.first()
+            // 璧拌埅璺嚎璋冩暣寤鸿
+            result.advice =
+                "鏍规嵁${sT}鑷�${eT}鐨�${clueList.size}涓函婧愬垏鐗囷紝椋庨櫓婧愩��" +
+                        "${closetScene?.first?.name}銆戣澶氭婧簮锛屽叿鏈夎緝楂樻薄鏌撻闄╋紝鐜版彁渚涙渶鏂扮洿杈捐蛋鑸矾绾裤��"
 
+            val lastP = realTimeDataList.last()
+            // 寤鸿瀵瑰簲鐨勬暟鎹噰鏍锋椂闂�
+            result.time = lastP.dataTime
+            if (lastP.longitude != null && lastP.latitude != null &&
+                lastP.longitude!! > BigDecimal.ZERO && lastP.latitude!! > BigDecimal.ZERO
+                && closetScene?.first?.longitude != null && closetScene.first?.latitude != null &&
+                closetScene.first?.longitude!! > BigDecimal.ZERO && closetScene.first?.latitude!! > BigDecimal.ZERO
+            ) {
 
-        // 绾跨储鍒嗘瀽瀹屾垚鍚庯紝绉诲姩鑷冲巻鍙茬嚎绱㈠垪琛�
-        historyClueList.addAll(clueList)
-        clueList.clear()
-        realTimeDataList.clear()
+                val origin = MapUtil.wgs84ToGcj02(lastP.longitude!!.toDouble() to lastP.latitude!!.toDouble())
+                val destination = closetScene.first!!.longitude.toDouble() to closetScene.first!!.latitude.toDouble()
 
-        callback(result)
+                // 寤鸿鐨勮蛋鑸矾绾�
+                result.direction = AMapService.directionDriving(origin, destination)
+                Thread.sleep(200)
+            }
+            // 绾跨储鍒嗘瀽瀹屾垚鍚庯紝绉诲姩鑷冲巻鍙茬嚎绱㈠垪琛�
+            historyClueList.addAll(clueList)
+            clueList.clear()
+            realTimeDataList.clear()
+
+            callback(result)
+        }
 //        TODO()
     }
 

--
Gitblit v1.9.3