From 53857f42f777e2b9753b8f00cce1a60ce3dcb8fd Mon Sep 17 00:00:00 2001
From: Riku <risaku@163.com>
Date: 星期三, 15 十月 2025 22:42:29 +0800
Subject: [PATCH] 2025.10.15 修改高德地图地理逆编码结果,让地理位置信息更加详细
---
src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt | 197 ++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 162 insertions(+), 35 deletions(-)
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt
index 36fdfa1..0388a35 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt
@@ -2,10 +2,10 @@
import com.flightfeather.uav.biz.FactorFilter
import com.flightfeather.uav.biz.dataanalysis.model.ExceptionTag
+import com.flightfeather.uav.biz.sourcetrace.model.RemainException
import com.flightfeather.uav.domain.entity.BaseRealTimeData
import com.flightfeather.uav.lightshare.eunm.ExceptionStatusType
import com.flightfeather.uav.socket.eunm.FactorType
-import org.springframework.beans.BeanUtils
import java.time.Duration
/**
@@ -34,17 +34,20 @@
protected var lastData: BaseRealTimeData? = null
// 鏈�鏂扮殑涓�缁勫紓甯革紝璁板綍鍗曞洜瀛愬紓甯�
- protected val latestExceptions = mutableListOf<Pair<FactorFilter.SelectedFactor, T>>()
+ val latestExceptions = mutableListOf<Pair<FactorFilter.SelectedFactor, T>>()
/**
* 鏈�鏂扮殑涓�缁勫悎骞跺紓甯革紝鏍规嵁閰嶇疆鍙傛暟浠嶽latestExceptions]鍗曞洜瀛愬紓甯镐腑锛屽悎骞跺紓甯�
*/
protected val latestCombinedExc = mutableListOf<List<Pair<FactorFilter.SelectedFactor, T>>>()
+ // 璁板綍闇�瑕佸欢杩熸暟鎹懆鏈熻繘琛屽悎骞剁殑寮傚父
+ val remainingExceptions = mutableListOf<RemainException<T>>()
+
/**
* 寮傚父缁撴灉
*/
- protected val result = mutableListOf<Y>()
+ val result = mutableListOf<Y>()
/**
* 涓嶉�傜敤浜庢寮傚父绫诲瀷鐨勭洃娴嬪洜瀛�
@@ -150,7 +153,10 @@
}
lastData = data
- mergeExceptionResult()
+ removeSingleFactor(data)
+ val fittedComb = checkDelayedExceptions(data)
+ mergeExceptionResult(data, fittedComb)
+ onNewResult(result)
clearExceptions(data)
}
@@ -277,54 +283,175 @@
}
/**
- * 鍚堝苟寮傚父
+ * 灏嗕笉鍦ㄥ叧鑱斿叧绯讳腑鐨勭洃娴嬪洜瀛愬紓甯稿瓨鍌紝骞跺墧闄�
*/
- open fun mergeExceptionResult() {
+ fun removeSingleFactor(data: BaseRealTimeData) {
+ if (latestExceptions.isEmpty()) return
+
+ // 鏌ユ壘涓嶅湪鍥犲瓙鍏宠仈缁勫悎涓殑寮傚父鍥犲瓙
+ val sfList = latestExceptions.filter {
+ config.factorFilter.combination.find { c -> c.find { f -> f == it.first.main } != null } == null
+ }
+ // 鐢熸垚瀵瑰簲鐨勫紓甯哥粨鏋滐紝骞跺垵濮嬪寲璇ュ紓甯�
+ sfList.forEach {
+ result.add(newResult(listOf(it)))
+ it.second.refreshWithNextException(data)
+ }
+ // 鍓旈櫎
+ latestExceptions.removeAll(sfList)
+ }
+
+ /**
+ * 妫�鏌ュ欢杩熺殑寰呭悎骞跺紓甯镐笌褰撳墠寮傚父鏄惁鑳藉尮閰�
+ * 1. 灏嗛仐鐣欑殑瓒呰繃绛夊緟鏁版嵁鍛ㄦ湡鐨勫紓甯稿瓨鍌�
+ * 2. 灏嗗尮閰嶆垚鍔熺殑鍚堝苟寮傚父瀛樺偍锛屽悓鏃跺皢鍏宠仈鍏崇郴鏍囪涓哄凡鍖归厤
+ * 3. 淇濈暀渚濇棫鏈悎骞舵垚鍔熷苟涓斿彲缁х画绛夊緟鐨勫紓甯�
+ * @return 琚尮閰嶆垚鍔熺殑鍏宠仈鍏崇郴
+ */
+ fun checkDelayedExceptions(data: BaseRealTimeData): List<List<FactorType>> {
+ if (latestExceptions.isEmpty()) return emptyList()
+
+ // 琚尮閰嶆垚鍔熺殑鐩戞祴鍥犲瓙鍏宠仈鍏崇郴
+ val fittedComb = mutableListOf<List<FactorType>>()
+ // 閬楃暀鐨勮繘鍏ヤ笅涓�涓暟鎹懆鏈熷仛鍒ゆ柇鐨勫緟鍚堝苟寮傚父闆嗗悎
+ val leftExc = mutableListOf<RemainException<T>>()
+ // 鎴愬姛鍖归厤鐨勫悎骞跺紓甯搁泦鍚�
+ val combinedExc = mutableListOf<List<Pair<FactorFilter.SelectedFactor, T>>>()
+ // 鏈鏁版嵁鍛ㄦ湡涓紝琚尮閰嶆垚鍔熺殑寮傚父闆嗗悎
+ val exceps = mutableListOf<Pair<FactorFilter.SelectedFactor, T>>()
+ remainingExceptions.forEach {
+ // 妫�鏌ユ湰娆℃暟鎹懆鏈熺殑寮傚父涓紝鏄惁鍖呭惈鍥犲瓙鍏宠仈鍏崇郴涓殑寮傚父
+ val combRes = matchCombFactor(it.combination, latestExceptions)
+ val res = combRes.second
+ // 鍒ゆ柇鏈鏁版嵁鍛ㄦ湡涓壘鍒扮殑鍥犲瓙鍜屽凡鏈夌殑鍥犲瓙鏄惁婊¤冻鍏宠仈鍏崇郴
+ val findFactors = mutableListOf<FactorType>()
+ res.forEach {r -> findFactors.add(r.first.main) }
+ it.exceptions.forEach {r -> findFactors.add(r.first.main) }
+ val isFitAll = findFactors.distinct() == it.combination
+ // 濡傛灉宸茬粡娌℃湁缂哄け鐨勫紓甯稿洜瀛愶紝鍒欏彲鍚堝苟涓虹粍鍚堝紓甯�
+ if (isFitAll) {
+ fittedComb.add(it.combination)
+ // 灏嗘煡鎵剧粨鏋滄坊鍔犺嚦宸叉湁寮傚父闆嗗悎涓�
+ it.addExceptions(res)
+// // 璁板綍琚尮閰嶆垚鍔熺殑寮傚父
+// res.forEach { r->
+// if (exceps.find { e -> e.second == r.second } == null) {
+// exceps.add(r)
+// }
+// }
+ // 灏嗗悎骞跺紓甯稿瓨鍌�
+ combinedExc.add(it.exceptions)
+
+ }
+ // 鍚﹀垯鐣欎綔涓嬫鏁版嵁鍛ㄦ湡鍐嶅垽瀹氬瓨鍏ュ緟鍚堝苟寮傚父闆嗗悎
+ else {
+ it.period++
+ // 褰撳緟鍚堝苟鐨勫紓甯哥瓑寰呮暟鎹懆鏈熷ぇ浜庤瀹氬�兼椂锛屼笉鍐嶇瓑寰咃紝鐩存帴杈撳嚭寮傚父
+ if (it.period > config.maxDelayPeriod) {
+ result.add(newResult(it.exceptions))
+ return@forEach
+ } else {
+ fittedComb.add(it.combination)
+ // 灏嗘煡鎵剧粨鏋滄坊鍔犺嚦宸叉湁寮傚父闆嗗悎涓�
+ it.addExceptions(res)
+// // 璁板綍琚尮閰嶆垚鍔熺殑寮傚父
+// res.forEach { r->
+// if (exceps.find { e -> e.second == r.second } == null) {
+// exceps.add(r)
+// }
+// }
+ leftExc.add(it)
+ }
+ }
+ }
+ // 瀛樺偍鍚堝苟寮傚父
+ combinedExc.forEach {
+ result.add(newResult(it))
+ }
+// // 灏嗚鍖归厤鎴愬姛鐨勫紓甯稿埛鏂帮紝骞朵粠鏈鏁版嵁鍛ㄦ湡鐨勫紓甯搁泦鍚堜腑绉婚櫎
+// exceps.forEach { r-> r.second.refreshWithNextException(data) }
+// latestExceptions.removeAll(exceps)
+ // 淇濈暀鏈尮閰嶇殑缁勫悎
+ remainingExceptions.clear()
+ remainingExceptions.addAll(leftExc)
+
+ return fittedComb
+ }
+
+ /**
+ * 鍚堝苟寮傚父
+ * @param data 褰撳墠鐩戞祴鏁版嵁
+ * @param fittedComb 鍦ㄩ仐鐣欑殑寮傚父[remainingExceptions]鍒ゆ柇涓紝宸茬粡杩涜鍖归厤鍒ゆ柇鐨勫叧鑱斿叧绯伙紝灏嗕笉鍐嶈繘琛屽尮閰�
+ */
+ open fun mergeExceptionResult(data: BaseRealTimeData, fittedComb: List<List<FactorType>>) {
+ if (latestExceptions.isEmpty()) return
+
+ val combinedExc = mutableListOf<List<Pair<FactorFilter.SelectedFactor, T>>>()
// 閬嶅巻鎵�鏈夌殑鍥犲瓙缁勫悎
config.factorFilter.combination.forEach { c ->
- val res = mutableListOf<Pair<FactorFilter.SelectedFactor, T>>()
- var exist = true
- // 鏌ョ湅缁勫悎鍐呯殑鎵�鏈夊洜瀛愭槸鍚﹂兘鍚屾椂鍑虹幇寮傚父
- c.forEach { f ->
- val r = latestExceptions.find { e ->
- e.first.main == f
- }
- if (r != null) {
- res.add(r)
- } else {
- exist = false
- }
- }
+ /**
+ * 璺宠繃宸茬粡鍦╗checkDelayedExceptions]涓垽鏂繃鐨勫叧鑱斿叧绯�
+ */
+ if (fittedComb.indexOf(c) >= 0) return@forEach
+
+ val combRes = matchCombFactor(c, latestExceptions)
+ val res = combRes.second
+ val exist = combRes.first
// 濡傛灉缁勫悎鍐呯殑鎵�鏈夊洜瀛愰兘瀛樺湪寮傚父锛屽垯瀛樺偍涓哄悎骞跺紓甯�
if (exist) {
- // 灏嗗悎骞跺紓甯镐粠鍗曚釜寮傚父闆嗗悎涓幓闄�
- res.forEach { r ->
- latestExceptions.removeIf { e -> e.first.main == r.first.main }
- }
// 灏嗗悎骞跺紓甯稿瓨鍌�
- latestCombinedExc.add(res)
+ combinedExc.add(res)
+ }
+ // 鍚﹀垯灏嗗紓甯哥殑娣辨嫹璐濈増鏈瓨鍏ュ緟鍚堝苟寮傚父闆嗗悎
+ // TODO 2025.8.4: 鍚庣画娣诲姞褰撳叧鑱旂殑鐩戞祴鍥犲瓙绱寮傚父璁℃暟鎺ヨ繎闃堝�兼椂锛屾墠瀛樺叆闆嗗悎鐨勯�昏緫
+ else if (res.isNotEmpty()) {
+ remainingExceptions.add(RemainException(res, c))
}
}
- // 瀛樺偍寮傚父缁撴灉
- latestExceptions.forEach {
- result.add(newResult(listOf(it)))
- }
- latestCombinedExc.forEach {
+
+ // 瀛樺偍鍚堝苟寮傚父
+ combinedExc.forEach {
result.add(newResult(it))
}
}
+ /**
+ * 鍖归厤鍏宠仈寮傚父鍥犲瓙
+ * @param comb 鍏宠仈鍥犲瓙鍏崇郴
+ * @param exceptions 鍚勭洃娴嬪洜瀛愬紓甯搁泦鍚�
+ * @return exist琛ㄧず鏄惁鎵惧埌鍏宠仈鍏崇郴[comb]涓墍鏈夌殑鍥犲瓙锛宺es琛ㄧず鎵惧埌鐨勭粨鏋�
+ */
+ private fun matchCombFactor(
+ comb: List<FactorType>,
+ exceptions: List<Pair<FactorFilter.SelectedFactor, T>>,
+ ): Pair<Boolean, MutableList<Pair<FactorFilter.SelectedFactor, T>>> {
+ val res = mutableListOf<Pair<FactorFilter.SelectedFactor, T>>()
+ var exist = true
+ // 鏌ョ湅缁勫悎鍐呯殑鎵�鏈夊洜瀛愭槸鍚﹂兘鍚屾椂鍑虹幇寮傚父
+ comb.forEach { f ->
+ val r = exceptions.find { e ->
+ e.first.main == f
+ }
+ if (r != null) {
+ res.add(r)
+ } else {
+ exist = false
+ }
+ }
+ return exist to res
+ }
+
+ abstract fun onNewResult(result: List<Y>)
+
+ /**
+ * 鍦ㄥ紓甯哥敓鎴愮粨鏋滃悗锛岃繘琛屽垵濮嬪寲
+ */
private fun clearExceptions(data: BaseRealTimeData) {
+ // 姝ゆ椂latestExceptions涓簲璇ュ寘鍚殑渚濇棫鏄湰娆℃暟鎹懆鏈熷唴鐨勬墍鏈夊紓甯�
latestExceptions.forEach {
it.second.refreshWithNextException(data)
}
latestExceptions.clear()
- latestCombinedExc.forEach {
- it.forEach { e ->
- e.second.refreshWithNextException(data)
- }
- }
- latestCombinedExc.clear()
result.clear()
}
--
Gitblit v1.9.3