From cf160e28026ed1ed8bea82701d66e79a1085c503 Mon Sep 17 00:00:00 2001
From: Riku <risaku@163.com>
Date: 星期四, 15 五月 2025 00:24:39 +0800
Subject: [PATCH] 1. 新增走航动态溯源功能

---
 src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt |  111 +++++++++++++++++++++++++++++++------------------------
 1 files changed, 62 insertions(+), 49 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 52f9cac..bf4f1d1 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionContinuous.kt
@@ -1,15 +1,18 @@
 package com.flightfeather.uav.biz.dataanalysis
 
 import com.flightfeather.uav.biz.FactorFilter
+import com.flightfeather.uav.biz.dataanalysis.model.ExceptionTag
 import com.flightfeather.uav.domain.entity.BaseRealTimeData
+import com.flightfeather.uav.lightshare.eunm.ExceptionStatusType
 import com.flightfeather.uav.socket.eunm.FactorType
 import java.time.Duration
 
 /**
  * 杩炵画绫诲瀷鐨勫紓甯稿垎鏋愬熀绫�,閫傜敤浜庡綋鍓嶆暟鎹笌鐩搁偦鏁版嵁涔嬮棿鏈夊叧鑱斿叧绯荤殑鎯呭喌
  */
-abstract class BaseExceptionContinuous<V : BaseAnalysisConfig, Y : BaseExceptionResult>(config: V) :
-    BaseExceptionAnalysis<V, Y>(config) {
+abstract class BaseExceptionContinuous<T : ExceptionTag, V : BaseAnalysisConfig, Y : BaseExceptionResult>(
+    config: V, private val tagClz: Class<T>
+) : BaseExceptionAnalysis<V, Y>(config) {
 
     companion object {
         // 璁板綍寮傚父鏁版嵁娈垫椂锛屽垎鍒悜璧峰鍓嶅拰鏈熬鍚庨澶栬褰曠殑鏁版嵁涓暟鍋忕Щ閲�
@@ -33,17 +36,26 @@
         var exceptionData = mutableListOf<BaseRealTimeData>()
 
         // 鏄惁瀛樺湪寮傚父
-        var existException = false
+        var exceptionExisted = false
 
-        fun refreshAfterCheckResult(data: BaseRealTimeData) {
+        // 寮傚父缁撴灉鏄惁鍒涘缓
+        var exceptionCreated = false
+
+        fun addExceptionData(data: BaseRealTimeData) {
+            exceptionExisted = true
+            exceptionData.add(data)
+        }
+
+        fun refreshWithNextException(data: BaseRealTimeData) {
             sIndex = eIndex
             startData = data
             exceptionData.clear()
-//            exceptionData.add(data)
+            exceptionExisted = false
+            exceptionCreated = false
         }
     }
 
-    protected val tagMap = mutableMapOf<FactorType, Tag>()
+    protected val tagMap = mutableMapOf<FactorType, T>()
 
     // 璧峰鏁版嵁涓庢湯灏炬暟鎹棿闅�
     open var durationCount = 1
@@ -71,14 +83,14 @@
      * 鍒ゆ柇寮傚父鍑虹幇鐨勮繛缁釜鏁版槸鍚︽弧瓒虫潯浠�
      * @param tag 寮傚父鏁版嵁瀵硅薄
      */
-    abstract fun judgeExceptionCount(tag: Tag): Boolean
+    abstract fun judgeExceptionCount(tag: T): Boolean
 
     /**
      * 寮傚父鏁版嵁鐨勬埅鍙栧垽鏂�
      * 鏄惁闇�瑕侀檺鍒朵竴缁勫紓甯告暟鎹殑闀垮害
      * @return 榛樿涓嶉渶瑕佹埅鍙�
      */
-    open fun needCut(tag: Tag): Boolean {
+    open fun needCut(tag: T): Boolean {
         return false
     }
 
@@ -87,7 +99,7 @@
         lastData = null
         tagMap.clear()
         config.factorFilter.mainList().forEach { f ->
-            tagMap[f] = Tag()
+            tagMap[f] = tagClz.newInstance()
         }
     }
 
@@ -101,25 +113,18 @@
                 // 璧峰鏁版嵁
                 it.endData = data
                 if (it.startData == null) {
-                    it.refreshAfterCheckResult(data)
+                    it.refreshWithNextException(data)
                 }
                 // 鍒ゆ柇鐩搁偦鏁版嵁鏄惁杩炵画骞朵笖鏄惁婊¤冻寮傚父鍒ゆ柇
                 if (!isContinue || needCut(it)) {
-                    checkResult(s)
                     // 鏁版嵁涓嶈繛缁椂锛岃褰曞紓甯告儏鍐�
-                    if (it.eIndex - it.sIndex >= durationCount) {
-                        it.refreshAfterCheckResult(data)
-                    }
+                    recordException(s, it, data)
                 } else {
                     if (hasException[f] == true) {
-                        it.existException = true
-                        it.exceptionData.add(data)
+                        it.addExceptionData(data)
                     } else {
                         // 寮傚父涓嶅啀閲嶅鍑虹幇鏃讹紝璁板綍寮傚父鎯呭喌
-                        checkResult(s)
-                        if (it.eIndex - it.sIndex >= durationCount) {
-                            it.refreshAfterCheckResult(data)
-                        }
+                        recordException(s, it, data)
                     }
                 }
             }
@@ -128,54 +133,62 @@
     }
 
     override fun onDone() {
-        checkResult()
+        checkResult(exceptionStatus = ExceptionStatusType.Ended)
+    }
+
+    /**
+     * 寮傚父缁撴潫锛岃褰曞紓甯�
+     */
+    fun recordException(factor: FactorFilter.SelectedFactor, tag: T, data: BaseRealTimeData) {
+        checkResult(factor, ExceptionStatusType.Ended)
+//        if (tag.eIndex - tag.sIndex >= durationCount) {
+        tag.refreshWithNextException(data)
+//        }
     }
 
     /**
      * 妫�鏌ヨ繛缁紓甯哥粨鏉熸椂锛屾槸鍚︾鍚堝紓甯稿瓨鍌ㄦ潯浠�
      */
-    open fun checkResult(factor: FactorFilter.SelectedFactor? = null) {
+    open fun checkResult(
+        factor: FactorFilter.SelectedFactor? = null,
+        exceptionStatus: ExceptionStatusType = ExceptionStatusType.InProgress
+    ) {
         val tag = tagMap[factor?.main]
         if (factor != null && tag != null) {
-            if (tag.existException && judgeExceptionCount(tag)) {
-                onNewException(tag, factor)
-//                tag.startData?.let {
-//                    resultList.add(newResult(it, lastData, factor, tag.exceptionData))
-//                }
-//                tag.existException = false
+            if (tag.exceptionExisted && judgeExceptionCount(tag)) {
+                onNewException(tag, factor, exceptionStatus)
             }
         } else {
             config.factorFilter.selectedList.forEach { f ->
                 val tag1 = tagMap[f.main] ?: return@forEach
-                if (tag1.existException && judgeExceptionCount(tag1)) {
-                    onNewException(tag1, f)
-//                    tag1.startData?.let {
-//                        resultList.add(newResult(it, lastData, f, tag1.exceptionData))
-//                    }
-//                    tag1.existException = false
+                if (tag1.exceptionExisted && judgeExceptionCount(tag1)) {
+                    onNewException(tag1, f, exceptionStatus)
                 }
             }
         }
     }
 
     /**
-     * 鏂板涓�鏉″紓甯�
+     * 鏂板鎴栨洿鏂颁竴鏉″紓甯�
      */
-    open fun onNewException(tag:Tag, factor: FactorFilter.SelectedFactor) {
-        tag.startData?.let {
-            resultList.add(newResult(it, lastData, factor, tag.exceptionData))
+    open fun onNewException(tag: T, factor: FactorFilter.SelectedFactor, exceptionStatus: ExceptionStatusType) {
+        if (tag.startData == null) return
+        val ex = newResult(tag.startData!!, lastData, factor, tag.exceptionData)
+            .apply { status = exceptionStatus.value }
+        // 寮傚父宸插垱寤烘椂锛屾洿鏂板紓甯镐俊鎭�
+        if (tag.exceptionCreated) {
+            // 灏嗘渶鏂扮殑寮傚父鐨刧uid璧嬪�肩粰ex
+            val lastEx = tag.exceptionResult.last()
+            ex.guid = lastEx.guid
+            tag.exceptionResult.removeLast()
+            tag.exceptionResult.add(ex)
         }
-        tag.existException = false
+        // 寮傚父鏈垱寤烘椂锛屾柊寤哄紓甯镐俊鎭�
+        else {
+            tag.exceptionResult.add(ex)
+//            resultList.add(ex)
+            tag.exceptionCreated = true
+        }
     }
-
-    /**
-     * 鐢熸垚涓�鏉″紓甯稿垎鏋愮粨鏋�
-     */
-    abstract fun newResult(
-        start: BaseRealTimeData,
-        end: BaseRealTimeData?,
-        factor: FactorFilter.SelectedFactor,
-        exceptionData: List<BaseRealTimeData>,
-    ): Y
 
 }
\ No newline at end of file

--
Gitblit v1.9.3