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/dataanalysis/BaseExceptionContinuous.kt | 183 +++++++++++++++++++++++++++++++++++++-------- 1 files changed, 149 insertions(+), 34 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..3866509 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) + checkDelayedExceptions(data) + mergeExceptionResult(data) + onNewResult(result) clearExceptions(data) } @@ -277,54 +283,163 @@ } /** + * 灏嗕笉鍦ㄥ叧鑱斿叧绯讳腑鐨勭洃娴嬪洜瀛愬紓甯稿瓨鍌紝骞跺墧闄� + */ + fun removeSingleFactor(data: BaseRealTimeData) { + // 鏌ユ壘涓嶅湪鍥犲瓙鍏宠仈缁勫悎涓殑寮傚父鍥犲瓙 + 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>> { + // 琚尮閰嶆垚鍔熺殑鐩戞祴鍥犲瓙鍏宠仈鍏崇郴 + 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 + } + + /** * 鍚堝苟寮傚父 */ - open fun mergeExceptionResult() { + open fun mergeExceptionResult(data: BaseRealTimeData) { + 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 - } - } + 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 { + 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