From 344d9006faa27ea65e3eaf5e8f9173aad2266038 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期三, 23 七月 2025 17:23:53 +0800
Subject: [PATCH] 2025.7.23 1. 动态溯源模块完成,发布
---
src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSummary.kt | 102 ++++++++++++++++++++++++++++++++++----------------
1 files changed, 69 insertions(+), 33 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..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,16 +50,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
@@ -76,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) }
}
// 鍒锋柊褰撳墠鏈�鏂扮殑璧拌埅鐩戞祴鏁版嵁
@@ -104,10 +99,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 +113,7 @@
*/
private fun analysisOnClueCount() {
if (clueList.size >= config.analysisCount && !analysisTaskIsRunning) {
- analysisOnTimeTask.run()
+ newAnalysisTask().run()
resetAnalysisOnTime()
}
}
@@ -128,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 {
@@ -145,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 {
@@ -157,19 +155,57 @@
}
}
}
- 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()
}
+ // 瀹氭椂姹℃煋鍒嗘瀽浠诲姟
+ 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