From f7bdafb7cddd049bbb1bbf265fa006683b4ac693 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期三, 11 六月 2025 17:08:35 +0800
Subject: [PATCH] 1. 新增动态污染溯源新的判定逻辑(待完成)

---
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSummary.kt |   73 +++++++++++++++++++++++++++---------
 1 files changed, 55 insertions(+), 18 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 6ec9d46..140c499 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,9 +1,13 @@
 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.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
 
@@ -27,9 +31,12 @@
     /**
      * 鍒嗘瀽缁撴灉
      */
-    inner class AnalysisResult{
+    inner class AnalysisResult {
         // 鎸夌収琚壂鎻忔鏁伴檷搴忔帓鍒楃殑姹℃煋婧愬垪琛�
         var sortedSceneList: List<Pair<SceneInfo?, Int>>? = null
+        var time: Date? = null
+        var advice: String? = null
+        var direction: AMapService.AMapDirection? = null
     }
 
     /**
@@ -53,16 +60,7 @@
     private var analysisTimer: Timer? = null
 
     // 瀹氭椂姹℃煋鍒嗘瀽浠诲姟
-    private val analysisOnTimeTask = object : TimerTask() {
-        override fun run() {
-            // 璁板綍浠诲姟杩愯鐘舵��
-            analysisTaskIsRunning = true
-            analysis()
-            // 璁板綍涓婁竴娆$殑浠诲姟缁撴潫鏃堕棿
-            lastAnalysisTime = LocalDateTime.now()
-            analysisTaskIsRunning = false
-        }
-    }
+    private var lastAnalysisOnTimeTask: TimerTask? = null
 
     // 瀹氭椂姹℃煋鍒嗘瀽浠诲姟杩愯鐘舵��
     private var analysisTaskIsRunning = false
@@ -104,10 +102,12 @@
     private fun resetAnalysisOnTime() {
         // 鍙栨秷鍘熸湁鐨勫垎鏋愪换鍔¤鏃�
         analysisTimer?.cancel()
+        lastAnalysisOnTimeTask?.cancel()
         // 浠ュ綋鍓嶆椂闂翠负璧风偣锛岄噸鏂板紑濮嬫柊鐨勪竴杞瓑寰呰鏃�
         analysisTimer = Timer()
         val period = config.analysisPeriod * 60 * 1000L
-        analysisTimer?.schedule(analysisOnTimeTask, period, period)
+        lastAnalysisOnTimeTask = newAnalysisTask()
+        analysisTimer?.schedule(lastAnalysisOnTimeTask, period, period)
     }
 
     /**
@@ -116,7 +116,7 @@
      */
     private fun analysisOnClueCount() {
         if (clueList.size >= config.analysisCount && !analysisTaskIsRunning) {
-            analysisOnTimeTask.run()
+            newAnalysisTask().run()
             resetAnalysisOnTime()
         }
     }
@@ -128,8 +128,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 {
@@ -145,11 +145,12 @@
      * 绾跨储鍒嗘瀽
      */
     private fun analysis() {
+        if (clueList.isEmpty()) return
         val result = AnalysisResult()
         // 鍏辨湁澶氬皯鐩稿叧姹℃煋婧愶紝鍝簺姹℃煋婧愯鎵弿娆℃暟杈冨
         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 {
@@ -157,11 +158,33 @@
                 }
             }
         }
-        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 = clueList.first().pollutedData?.startTime
+            val closetScene = result.sortedSceneList?.first()
+            // 璧拌埅璺嚎璋冩暣寤鸿
+            result.advice =
+                "鏍规嵁${sT}璧风殑${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
+            ) {
+
+                val origin = MapUtil.wgs84ToGcj02(lastP.longitude!!.toDouble() to lastP.latitude!!.toDouble())
+                val destination = closetScene.first!!.longitude.toDouble() to closetScene.first!!.latitude.toDouble()
+
+                // 寤鸿鐨勮蛋鑸矾绾�
+                result.direction = AMapService.directionDriving(origin, destination)
+            }
+        }
 
         // 绾跨储鍒嗘瀽瀹屾垚鍚庯紝绉诲姩鑷冲巻鍙茬嚎绱㈠垪琛�
         historyClueList.addAll(clueList)
@@ -172,4 +195,18 @@
 //        TODO()
     }
 
+    // 瀹氭椂姹℃煋鍒嗘瀽浠诲姟
+    private fun newAnalysisTask(): TimerTask {
+        return object : TimerTask() {
+            override fun run() {
+                // 璁板綍浠诲姟杩愯鐘舵��
+                analysisTaskIsRunning = true
+                analysis()
+                // 璁板綍涓婁竴娆$殑浠诲姟缁撴潫鏃堕棿
+                lastAnalysisTime = LocalDateTime.now()
+                analysisTaskIsRunning = false
+            }
+        }
+    }
+
 }
\ No newline at end of file

--
Gitblit v1.9.3