1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.flightfeather.uav.biz.sourcetrace.exceptiontype
 
import com.flightfeather.uav.biz.FactorFilter
import com.flightfeather.uav.biz.dataanalysis.BaseExceptionContinuous
import com.flightfeather.uav.biz.sourcetrace.RealTimeAnalysisConfig
import com.flightfeather.uav.biz.sourcetrace.model.RealTimeExceptionResult
import com.flightfeather.uav.domain.entity.BaseRealTimeData
 
// 异常数据生成回调类
typealias NewExceptionCallback = (ex: RealTimeExceptionResult) -> Unit
/**
 * 走航动态溯源异常判断
 * 相比于其父类,修改了异常分组的逻辑,不再考虑异常需要连续出现,而是只通过数据采样时间是否连续以及是否需要主动截取分组来决定
 * 另外新增了异常实时播报的逻辑
 * @date 2025/5/13
 * @author feiyu02
 */
abstract class BaseRealTimeException(config: RealTimeAnalysisConfig) :
    BaseExceptionContinuous<RealTimeAnalysisConfig, RealTimeExceptionResult>(config) {
 
    constructor(config: RealTimeAnalysisConfig, callback: NewExceptionCallback) : this(config){
        this.callback = callback
    }
 
    var callback: NewExceptionCallback? = null
 
    override fun onNextData(data: BaseRealTimeData) {
        val isContinue = isContinuous(lastData, data)
        val hasException = judgeException(lastData, data)
        config.factorFilter.selectedList.forEach { s ->
            val f = s.main
            tagMap[f]?.let {
                it.eIndex++
                // 起始数据
                it.endData = data
                if (it.startData == null) {
                    it.refreshAfterCheckResult(data)
                }
                // 判断相邻数据是否连续或者是否满足自定义截取条件
                if (!isContinue || needCut(it)) {
                    // 记录异常,结束异常的实时状态播报
                    recordException(s, it, data)
                } else {
                    if (hasException[f] == true) {
                        it.existException = true
                        it.exceptionData.add(data)
                    }
                    // 移除了父类原有逻辑,改为当满足异常条件时,需要实时推送播报异常的状态变化,但不截取异常
                    checkResult(s)
                }
            }
        }
        lastData = data
    }
 
    override fun newResult(
        start: BaseRealTimeData,
        end: BaseRealTimeData?,
        factor: FactorFilter.SelectedFactor,
        exceptionData: List<BaseRealTimeData>,
    ): RealTimeExceptionResult {
        val eType = getExceptionType()
        return RealTimeExceptionResult(start, end, factor, exceptionData, eType)
    }
 
    override fun onNewException(tag: Tag, factor: FactorFilter.SelectedFactor) {
        super.onNewException(tag, factor)
        callback?.let { func ->
            val exc = resultList.last()
            func.invoke(exc)
        }
    }
}