From 85909f9a78a328de2bc3efc0d1d184320cb8970b Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期五, 11 七月 2025 17:22:54 +0800
Subject: [PATCH] 2025.7.11 1. 修改动态溯源异常判断逻辑

---
 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseAnalysisConfig.kt               |   13 +++++-
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt             |   14 ++++--
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcWindLevel.kt  |    4 +-
 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionResult.kt              |    3 +
 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt          |   54 ++++++++++++++++++++++----
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcChangeRate.kt |   22 +++++++++--
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/config/RTExcWindLevelConfig.kt       |    3 +
 7 files changed, 89 insertions(+), 24 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseAnalysisConfig.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseAnalysisConfig.kt
index c3c1992..df613f2 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseAnalysisConfig.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseAnalysisConfig.kt
@@ -1,14 +1,21 @@
 package com.flightfeather.uav.biz.dataanalysis
 
 import com.flightfeather.uav.biz.FactorFilter
+import com.flightfeather.uav.socket.eunm.FactorType
 
 /**
  * 鏁版嵁鍒嗘瀽閰嶇疆鍙傛暟鍩虹被
  * @date 2025/5/13
  * @author feiyu02
  */
-abstract class BaseAnalysisConfig(
+abstract class BaseAnalysisConfig{
+    constructor(factorFilter: FactorFilter, combination: List<List<FactorType>>?){
+        this.factorFilter = factorFilter
+        this.combination = combination
+    }
     // 鍥犲瓙绛涢��
-    val factorFilter: FactorFilter,
-) {
+    constructor(factorFilter: FactorFilter):this(factorFilter, null)
+
+    val factorFilter:FactorFilter
+    val combination: List<List<FactorType>>?
 }
\ No newline at end of file
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 f0acf81..0336e02 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt
@@ -27,12 +27,11 @@
     // 鏈熬鏁版嵁瀵硅薄
     protected var lastData: BaseRealTimeData? = null
 
-    /**
-     * 鍚庣疆鍒ゆ柇锛氬綋鐩搁偦鏁版嵁鏃堕棿涓嶈繛缁椂锛屾垨鑰呮弧瓒宠嚜瀹氫箟鏉′欢鏃讹紝瀵逛箣鍓嶅凡鏈夌殑寮傚父杩涜璁板綍
-     */
-    open fun afterExcCheck(isContinue: Boolean, tag: T, hasException: Boolean?): Boolean {
-        return !isContinue || needCut(tag, hasException)
-    }
+    // 鏈�鏂扮殑涓�缁勫紓甯革紝鏍规嵁璁惧畾鍙傛暟锛屽皢鐩稿叧鑱旂殑鍥犲瓙浜х敓鐨勫紓甯稿悎骞�
+    protected val latestExceptionResult = mutableListOf<BaseExceptionResult>()
+
+    // 鏈�鏂扮殑涓�缁勫悎骞跺紓甯�
+    protected val latestCombinedResult = mutableListOf<List<BaseExceptionResult>>()
 
     /**
      * 绔嬪嵆鍒ゆ柇锛氬綋鍑虹幇寮傚父鏃讹紝缂撳瓨寮傚父鏁版嵁鐨勫悓鏃讹紝绔嬪嵆瀵瑰凡鏈夊紓甯歌繘琛屽垽鏂槸鍚︽弧瓒冲紓甯哥粨鏋滆姹�
@@ -90,7 +89,7 @@
      * 寮傚父鏁版嵁鐨勬埅鍙栧垽鏂�
      * @return
      */
-    open fun needCut(tag: T, hasException: Boolean?): Boolean {
+    open fun needCut(tag: T, hasException: Boolean?, data: BaseRealTimeData): Boolean {
         // 榛樿鍒ゆ柇鏉′欢涓� 褰撳紓甯镐笉鍐嶉噸澶嶅嚭鐜版椂锛屽舰鎴愬紓甯哥粨鏋�
         return tag.exceptionExisted && hasException == false
     }
@@ -127,8 +126,11 @@
 //                }
                 // 2. 绔嬪嵆鍒ゆ柇锛氬綋鍑虹幇寮傚父鏃讹紝缂撳瓨寮傚父鏁版嵁鐨勫悓鏃讹紝绔嬪嵆瀵瑰凡鏈夊紓甯歌繘琛屽垽鏂槸鍚︽弧瓒冲紓甯哥粨鏋滆姹�
                 if (hasException[f] == true) {
+
 //                    afterExcCheck(isContinue, it, hasException[f])
-                    needCut(it, hasException[f])
+                    if (needCut(it, hasException[f], data)) {
+                        it.refreshWithNextException(data)
+                    }
                     // 鏈夊紓甯稿嚭鐜版椂锛岃褰曞紓甯告暟鎹�
                     it.addExceptionData(data)
                     // 褰撶珛鍗冲垽鏂�氳繃鏃讹紝褰㈡垚寮傚父缁撴灉
@@ -144,6 +146,8 @@
             }
         }
         lastData = data
+
+        mergeExceptionResult()
     }
 
     override fun onDone() {
@@ -200,9 +204,41 @@
         // 寮傚父鏈垱寤烘椂锛屾柊寤哄紓甯镐俊鎭�
         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)
+            }
+        }
     }
 
     /**
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionResult.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionResult.kt
index 2d9a64e..f8c3f84 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionResult.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionResult.kt
@@ -15,6 +15,9 @@
     // 寮傚父鐨勭姸鎬�
     var status: Int = ExceptionStatusType.InProgress.value
 
+    var factorId: Int? = null
+    var factorName: String? = null
+
     init {
         guid = UUID.randomUUID().toString()
     }
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt
index b8c3e98..65fc3a8 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt
@@ -32,19 +32,23 @@
         this.sceneInfoRep = sceneInfoRep
         this.sourceTraceRep = sourceTraceRep
         this.config = if (factorFilter != null) {
-            RTExcWindLevelConfig(factorFilter)
+            RTExcWindLevelConfig(factorFilter, emptyList())
         } else {
             RTExcWindLevelConfig(
                 FactorFilter.builder()
-//                    .withMain(FactorType.NO2)
-//                    .withMain(FactorType.CO)
+                    .withMain(FactorType.NO2)
+                    .withMain(FactorType.CO)
 //                    .withMain(FactorType.H2S)
 //                    .withMain(FactorType.SO2)
-//                    .withMain(FactorType.O3)
+                    .withMain(FactorType.O3)
                     .withMain(FactorType.PM25)
                     .withMain(FactorType.PM10)
                     .withMain(FactorType.VOC)
-                    .create()
+                    .create(),
+                listOf(
+                    listOf(FactorType.PM25, FactorType.PM10),
+                    listOf(FactorType.VOC, FactorType.CO),
+                )
             )
         }
         pollutedSummary = PollutedSummary(config) { summaryCallback(it) }
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/config/RTExcWindLevelConfig.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/config/RTExcWindLevelConfig.kt
index 5665000..d6a68a2 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/config/RTExcWindLevelConfig.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/config/RTExcWindLevelConfig.kt
@@ -10,7 +10,8 @@
  * @date 2025/5/29
  * @author feiyu02
  */
-class RTExcWindLevelConfig(factorFilter: FactorFilter): BaseAnalysisConfig(factorFilter) {
+class RTExcWindLevelConfig(factorFilter: FactorFilter, combination: List<List<FactorType>>?): BaseAnalysisConfig
+    (factorFilter, combination) {
 
     inner class WindLevelCondition(
         val windSpeed: Pair<Double, Double>,
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcChangeRate.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcChangeRate.kt
index e36031e..91f783a 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcChangeRate.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcChangeRate.kt
@@ -77,12 +77,12 @@
         return tag.exceptionData.size >= (changeRate[factorType]?.countLimit ?: 1)
     }
 
-    override fun needCut(tag: ExceptionTag, hasException: Boolean?): Boolean {
+    override fun needCut(tag: ExceptionTag, hasException: Boolean?, data: BaseRealTimeData): Boolean {
         // 鎸夌収鏃堕暱鍜岃窛绂婚檺鍒跺皢寮傚父鎴彇
         if (tag.exceptionData.isEmpty()) return false
 
         val se = tag.exceptionData.first()
-        val ee = tag.exceptionData.last()
+        val ee = data
 
         val sTime = LocalDateTime.ofInstant(se.dataTime?.toInstant(), ZoneId.systemDefault())
         val eTime = LocalDateTime.ofInstant(ee.dataTime?.toInstant(), ZoneId.systemDefault())
@@ -119,9 +119,23 @@
         exceptionStatus: ExceptionStatusType,
     ) {
         super.onNewException(tag, factor, exceptionStatus)
+//        callback?.let { func ->
+//            val exc = tag.exceptionResult.last()
+//            func.invoke(exc as PollutedClue)
+//        }
+    }
+
+    override fun mergeExceptionResult() {
+        super.mergeExceptionResult()
+        latestExceptionResult
+        latestCombinedResult
         callback?.let { func ->
-            val exc = tag.exceptionResult.last()
-            func.invoke(exc as PollutedClue)
+            latestExceptionResult.forEach {
+                func.invoke(it as PollutedClue)
+            }
+            latestCombinedResult.forEach {
+                func.invoke(it as PollutedClue)
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcWindLevel.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcWindLevel.kt
index 84933af..2fa4571 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcWindLevel.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/exceptiontype/BaseRTExcWindLevel.kt
@@ -83,12 +83,12 @@
         return tag.exceptionData.size >= windLevelCondition.countLimit
     }
 
-    override fun needCut(tag: ExceptionTag, hasException: Boolean?): Boolean {
+    override fun needCut(tag: ExceptionTag, hasException: Boolean?, data: BaseRealTimeData): Boolean {
         // 鎸夌収鏃堕暱鍜岃窛绂婚檺鍒跺皢寮傚父鎴彇
         if (tag.exceptionData.isEmpty()) return false
 
         val se = tag.exceptionData.first()
-        val ee = tag.exceptionData.last()
+        val ee = data
 
         val sTime = LocalDateTime.ofInstant(se.dataTime?.toInstant(), ZoneId.systemDefault())
         val eTime = LocalDateTime.ofInstant(ee.dataTime?.toInstant(), ZoneId.systemDefault())

--
Gitblit v1.9.3