From 37d47c6a7ab0f454b948b68c987146b261117993 Mon Sep 17 00:00:00 2001 From: Riku <risaku@163.com> Date: 星期日, 13 七月 2025 22:47:21 +0800 Subject: [PATCH] 2025.7.13 动态溯源逻辑调整 --- src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt | 171 +++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 113 insertions(+), 58 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 bf4f1d1..0336e02 100644 --- a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt @@ -19,42 +19,6 @@ private const val OFFSET = 10 } - inner class Tag { - // 璧峰鏁版嵁涓嬫爣 - var sIndex = 0 - - // 璧峰鏁版嵁瀵硅薄 - var startData: BaseRealTimeData? = null - - // 鏈熬鏁版嵁涓嬫爣 - var eIndex = -1 - - // 鏈熬鏁版嵁瀵硅薄 - var endData: BaseRealTimeData? = null - - // 寮傚父鏁版嵁娈� - var exceptionData = mutableListOf<BaseRealTimeData>() - - // 鏄惁瀛樺湪寮傚父 - var exceptionExisted = false - - // 寮傚父缁撴灉鏄惁鍒涘缓 - var exceptionCreated = false - - fun addExceptionData(data: BaseRealTimeData) { - exceptionExisted = true - exceptionData.add(data) - } - - fun refreshWithNextException(data: BaseRealTimeData) { - sIndex = eIndex - startData = data - exceptionData.clear() - exceptionExisted = false - exceptionCreated = false - } - } - protected val tagMap = mutableMapOf<FactorType, T>() // 璧峰鏁版嵁涓庢湯灏炬暟鎹棿闅� @@ -62,6 +26,19 @@ // 鏈熬鏁版嵁瀵硅薄 protected var lastData: BaseRealTimeData? = null + + // 鏈�鏂扮殑涓�缁勫紓甯革紝鏍规嵁璁惧畾鍙傛暟锛屽皢鐩稿叧鑱旂殑鍥犲瓙浜х敓鐨勫紓甯稿悎骞� + protected val latestExceptionResult = mutableListOf<BaseExceptionResult>() + + // 鏈�鏂扮殑涓�缁勫悎骞跺紓甯� + protected val latestCombinedResult = mutableListOf<List<BaseExceptionResult>>() + + /** + * 绔嬪嵆鍒ゆ柇锛氬綋鍑虹幇寮傚父鏃讹紝缂撳瓨寮傚父鏁版嵁鐨勫悓鏃讹紝绔嬪嵆瀵瑰凡鏈夊紓甯歌繘琛屽垽鏂槸鍚︽弧瓒冲紓甯哥粨鏋滆姹� + */ + open fun immeExcCheck(tag: T, factorType: FactorType): Boolean { + return false + } /** * 鍒ゆ柇鐩搁偦鏁版嵁鏄惁杩炵画 @@ -75,7 +52,17 @@ } /** - * 鍒ゆ柇鏄惁婊¤冻寮傚父鏉′欢 + * 鍒ゆ柇鏁版嵁閲忕骇鍦ㄥ紓甯稿垽鏂殑鑼冨洿鍐� + * 榛樿鎵�鏈夐噺绾ч兘鍦ㄥ紓甯稿垽鏂殑鑼冨洿鍐� + */ + open fun judgeDataScale(p: BaseRealTimeData?, n: BaseRealTimeData): MutableMap<FactorType, Boolean> { + val res = mutableMapOf<FactorType, Boolean>() + config.factorFilter.mainList().forEach { f -> res[f] = true } + return res + } + + /** + * 鍒ゆ柇鍓嶅悗鏁版嵁鏄惁婊¤冻寮傚父鏉′欢 */ abstract fun judgeException(p: BaseRealTimeData?, n: BaseRealTimeData): MutableMap<FactorType, Boolean> @@ -83,15 +70,28 @@ * 鍒ゆ柇寮傚父鍑虹幇鐨勮繛缁釜鏁版槸鍚︽弧瓒虫潯浠� * @param tag 寮傚父鏁版嵁瀵硅薄 */ - abstract fun judgeExceptionCount(tag: T): Boolean + abstract fun judgeExceptionCount(tag: T, factorType: FactorType?): Boolean + + /** + * 鍒ゆ柇鐩戞祴鍥犲瓙鏄惁鍑虹幇寮傚父 + */ + open fun judge(p: BaseRealTimeData?, n: BaseRealTimeData): MutableMap<FactorType, Boolean> { + val jds = judgeDataScale(p, n) + val jex = judgeException(p, n) + val res = mutableMapOf<FactorType, Boolean>() + jds.forEach { (t, u) -> + res[t] = u && jex[t] ?: false + } + return res + } /** * 寮傚父鏁版嵁鐨勬埅鍙栧垽鏂� - * 鏄惁闇�瑕侀檺鍒朵竴缁勫紓甯告暟鎹殑闀垮害 - * @return 榛樿涓嶉渶瑕佹埅鍙� + * @return */ - open fun needCut(tag: T): Boolean { - return false + open fun needCut(tag: T, hasException: Boolean?, data: BaseRealTimeData): Boolean { + // 榛樿鍒ゆ柇鏉′欢涓� 褰撳紓甯镐笉鍐嶉噸澶嶅嚭鐜版椂锛屽舰鎴愬紓甯哥粨鏋� + return tag.exceptionExisted && hasException == false } override fun init() { @@ -105,31 +105,49 @@ override fun onNextData(data: BaseRealTimeData) { val isContinue = isContinuous(lastData, data) - val hasException = judgeException(lastData, data) + val hasException = judge(lastData, data) config.factorFilter.selectedList.forEach { s -> val f = s.main tagMap[f]?.let { + it.addHistoryData(data) + it.eIndex++ // 璧峰鏁版嵁 it.endData = data if (it.startData == null) { it.refreshWithNextException(data) } - // 鍒ゆ柇鐩搁偦鏁版嵁鏄惁杩炵画骞朵笖鏄惁婊¤冻寮傚父鍒ゆ柇 - if (!isContinue || needCut(it)) { - // 鏁版嵁涓嶈繛缁椂锛岃褰曞紓甯告儏鍐� - recordException(s, it, data) - } else { - if (hasException[f] == true) { - it.addExceptionData(data) - } else { - // 寮傚父涓嶅啀閲嶅鍑虹幇鏃讹紝璁板綍寮傚父鎯呭喌 + + // 瀵逛簬寮傚父鐨勭敓鎴愬垎鍒墽琛屽悗缃垽鏂�佸拰绔嬪嵆鍒ゆ柇 + // 1. 鍚庣疆鍒ゆ柇锛氬綋鐩搁偦鏁版嵁鏃堕棿涓嶈繛缁椂锛屾垨鑰呮弧瓒宠嚜瀹氫箟鏉′欢鏃讹紝瀵逛箣鍓嶅凡鏈夌殑寮傚父杩涜璁板綍锛屽舰鎴愬紓甯哥粨鏋� +// if (afterExcCheck(isContinue, it, hasException[f])) { +// // 鏁版嵁涓嶈繛缁椂鎴栬�呮弧瓒充富鍔ㄦ埅鏂潯浠舵椂锛岃褰曞紓甯告儏鍐� +// recordException(s, it, data) +// } + // 2. 绔嬪嵆鍒ゆ柇锛氬綋鍑虹幇寮傚父鏃讹紝缂撳瓨寮傚父鏁版嵁鐨勫悓鏃讹紝绔嬪嵆瀵瑰凡鏈夊紓甯歌繘琛屽垽鏂槸鍚︽弧瓒冲紓甯哥粨鏋滆姹� + if (hasException[f] == true) { + +// afterExcCheck(isContinue, it, hasException[f]) + if (needCut(it, hasException[f], data)) { + it.refreshWithNextException(data) + } + // 鏈夊紓甯稿嚭鐜版椂锛岃褰曞紓甯告暟鎹� + it.addExceptionData(data) + // 褰撶珛鍗冲垽鏂�氳繃鏃讹紝褰㈡垚寮傚父缁撴灉 + if (immeExcCheck(it, f)) { recordException(s, it, data) } } + // 3. 鏁版嵁姝e父锛屾棤浠讳綍寮傚父鏃禿 + // TODO("2025.6.3锛氬叾浠栧瓙绫荤殑姝ゅ鍒锋柊閫昏緫寰呭畬鎴愨��) +// else { +// it.refreshWithNextException(data) +// } } } lastData = data + + mergeExceptionResult() } override fun onDone() { @@ -138,12 +156,11 @@ /** * 寮傚父缁撴潫锛岃褰曞紓甯� + * 鍒ゆ柇宸叉湁鐨勫紓甯告暟鎹槸鍚︽弧瓒冲紓甯告潯浠讹紝婊¤冻鍒欒褰曪紝涓嶆弧瓒冲垯鐣ヨ繃 */ fun recordException(factor: FactorFilter.SelectedFactor, tag: T, data: BaseRealTimeData) { checkResult(factor, ExceptionStatusType.Ended) -// if (tag.eIndex - tag.sIndex >= durationCount) { tag.refreshWithNextException(data) -// } } /** @@ -155,13 +172,13 @@ ) { val tag = tagMap[factor?.main] if (factor != null && tag != null) { - if (tag.exceptionExisted && judgeExceptionCount(tag)) { + if (tag.exceptionExisted && judgeExceptionCount(tag, factor.main)) { onNewException(tag, factor, exceptionStatus) } } else { config.factorFilter.selectedList.forEach { f -> val tag1 = tagMap[f.main] ?: return@forEach - if (tag1.exceptionExisted && judgeExceptionCount(tag1)) { + if (tag1.exceptionExisted && judgeExceptionCount(tag1, f.main)) { onNewException(tag1, f, exceptionStatus) } } @@ -173,7 +190,8 @@ */ open fun onNewException(tag: T, factor: FactorFilter.SelectedFactor, exceptionStatus: ExceptionStatusType) { if (tag.startData == null) return - val ex = newResult(tag.startData!!, lastData, factor, tag.exceptionData) +// val ex = newResult(tag.startData!!, tag.endData, factor, tag.exceptionData) + val ex = newResult(tag, factor) .apply { status = exceptionStatus.value } // 寮傚父宸插垱寤烘椂锛屾洿鏂板紓甯镐俊鎭� if (tag.exceptionCreated) { @@ -186,9 +204,46 @@ // 寮傚父鏈垱寤烘椂锛屾柊寤哄紓甯镐俊鎭� else { tag.exceptionResult.add(ex) -// resultList.add(ex) tag.exceptionCreated = true } + + latestExceptionResult.add(ex) } + /** + * 鍚堝苟寮傚父 + */ + open fun mergeExceptionResult() { + // 閬嶅巻鎵�鏈夌殑鍥犲瓙缁勫悎 + config.combination?.forEach {c -> + val res = mutableListOf<BaseExceptionResult>() + var exist = true + // 鏌ョ湅缁勫悎鍐呯殑鎵�鏈夊洜瀛愭槸鍚﹂兘鍚屾椂鍑虹幇寮傚父 + c.forEach { f-> + val r = latestExceptionResult.find { e-> + e.factorId == f.value + } + if (r != null) { + res.add(r) + } else { + exist = false + } + } + // 濡傛灉缁勫悎鍐呯殑鎵�鏈夊洜瀛愰兘瀛樺湪寮傚父锛屽垯瀛樺偍涓哄悎骞跺紓甯� + if (exist) { + // 灏嗗悎骞跺紓甯镐粠鍗曚釜寮傚父闆嗗悎涓幓闄� + res.forEach { r-> + latestExceptionResult.removeIf { e-> e.factorId == r.factorId } + } + // 灏嗗悎骞跺紓甯稿瓨鍌� + latestCombinedResult.add(res) + } + } + } + + /** + * 鐢熸垚涓�鏉″紓甯稿垎鏋愮粨鏋� + */ + abstract fun newResult(tag:T, factor: FactorFilter.SelectedFactor): Y + } \ No newline at end of file -- Gitblit v1.9.3