| | |
| | | package com.flightfeather.uav.biz.dataanalysis |
| | | |
| | | import com.flightfeather.uav.biz.FactorFilter |
| | | import com.flightfeather.uav.biz.dataanalysis.model.DataAnalysisConfig |
| | | import com.flightfeather.uav.domain.entity.BaseRealTimeData |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | |
| | | /** |
| | | * 连续类型的异常分析基类,适用于当前数据与相邻数据之间有关联关系的情况 |
| | |
| | | private const val OFFSET = 10 |
| | | } |
| | | |
| | | // 起始数据下标 |
| | | protected var sIndex = mutableListOf<Int>() |
| | | inner class Tag { |
| | | // 起始数据下标 |
| | | var sIndex = 0 |
| | | |
| | | // 起始数据对象 |
| | | protected var startData = mutableListOf<BaseRealTimeData?>() |
| | | // 起始数据对象 |
| | | var startData :BaseRealTimeData? = null |
| | | |
| | | // 末尾数据下标 |
| | | protected var eIndex = mutableListOf<Int>() |
| | | // 末尾数据下标 |
| | | var eIndex = -1 |
| | | |
| | | // 末尾数据对象 |
| | | protected var lastData: BaseRealTimeData? = null |
| | | // 末尾数据对象 |
| | | var endData: BaseRealTimeData? = null |
| | | |
| | | // 异常数据段 |
| | | protected var exceptionData = mutableListOf<MutableList<BaseRealTimeData>>() |
| | | // 异常数据段 |
| | | var exceptionData = mutableListOf<BaseRealTimeData>() |
| | | |
| | | // 是否存在异常 |
| | | var existException = false |
| | | |
| | | fun refreshAfterCheckResult(data: BaseRealTimeData) { |
| | | sIndex = eIndex |
| | | startData = data |
| | | exceptionData.clear() |
| | | exceptionData.add(data) |
| | | } |
| | | } |
| | | |
| | | protected val tagMap = mutableMapOf<FactorType, Tag>() |
| | | |
| | | // // 起始数据下标 |
| | | // protected var sIndex = mutableListOf<Int>() |
| | | // |
| | | // // 起始数据对象 |
| | | // protected var startData = mutableListOf<BaseRealTimeData?>() |
| | | // |
| | | // // 末尾数据下标 |
| | | // protected var eIndex = mutableListOf<Int>() |
| | | // |
| | | // // 异常数据段 |
| | | // protected var exceptionData = mutableListOf<MutableList<BaseRealTimeData>>() |
| | | |
| | | // protected var existException = mutableListOf<Boolean>() |
| | | |
| | | // 起始数据与末尾数据间隔 |
| | | open var durationCount = 1 |
| | | protected var existException = mutableListOf<Boolean>() |
| | | // 末尾数据对象 |
| | | protected var lastData: BaseRealTimeData? = null |
| | | |
| | | /** |
| | | * 判断是否满足异常条件 |
| | | */ |
| | | abstract fun judgeException(p: BaseRealTimeData?, n: BaseRealTimeData): List<Boolean> |
| | | abstract fun judgeException(p: BaseRealTimeData?, n: BaseRealTimeData): MutableMap<FactorType, Boolean> |
| | | |
| | | /** |
| | | * 判断异常出现的连续时长是否满足条件 |
| | | * @param sIndex |
| | | * @param eIndex |
| | | */ |
| | | abstract fun judgeDuration(sIndex: Int, eIndex: Int): Boolean |
| | | |
| | | override fun init() { |
| | | super.init() |
| | | lastData = null |
| | | repeat(config.factorCount) { |
| | | startData.add(null) |
| | | sIndex.add(0) |
| | | eIndex.add(-1) |
| | | existException.add(false) |
| | | exceptionData.add(mutableListOf()) |
| | | // repeat(config.factorCount) { |
| | | // startData.add(null) |
| | | // sIndex.add(0) |
| | | // eIndex.add(-1) |
| | | // existException.add(false) |
| | | // exceptionData.add(mutableListOf()) |
| | | // } |
| | | tagMap.clear() |
| | | config.factorFilter.mainList().forEach {f-> |
| | | tagMap[f] = Tag() |
| | | } |
| | | } |
| | | |
| | | override fun onNextData(data: BaseRealTimeData) { |
| | | val isContinue = isContinuous(lastData, data) |
| | | val hasException = judgeException(lastData, data) |
| | | repeat(config.factorCount) { i -> |
| | | eIndex[i]++ |
| | | // 起始数据 |
| | | if (lastData == null) { |
| | | refreshAfterCheckResult(i, data) |
| | | } |
| | | // 判断相邻数据是否连续并且是否满足异常判断 |
| | | if (!isContinue) { |
| | | checkResult() |
| | | // 数据不连续时,记录异常情况 |
| | | if (eIndex[i] - sIndex[i] >= durationCount) { |
| | | refreshAfterCheckResult(i, data) |
| | | config.factorFilter.selectedList.forEach {s-> |
| | | val f = s.main |
| | | tagMap[f]?.let { |
| | | it.eIndex++ |
| | | // 起始数据 |
| | | it.endData = lastData |
| | | if (it.endData == null) { |
| | | it.refreshAfterCheckResult(data) |
| | | } |
| | | } else { |
| | | if (hasException[i]) { |
| | | existException[i] = true |
| | | exceptionData[i].add(data) |
| | | // 判断相邻数据是否连续并且是否满足异常判断 |
| | | if (!isContinue) { |
| | | checkResult(s) |
| | | // 数据不连续时,记录异常情况 |
| | | if (it.eIndex - it.sIndex >= durationCount) { |
| | | it.refreshAfterCheckResult(data) |
| | | } |
| | | } else { |
| | | // 异常不再重复出现时,记录异常情况 |
| | | checkResult() |
| | | if (eIndex[i] - sIndex[i] >= durationCount) { |
| | | refreshAfterCheckResult(i, data) |
| | | if (hasException[f] == true) { |
| | | it.existException = true |
| | | it.exceptionData.add(data) |
| | | } else { |
| | | // 异常不再重复出现时,记录异常情况 |
| | | checkResult(s) |
| | | if (it.eIndex - it.sIndex >= durationCount) { |
| | | it.refreshAfterCheckResult(data) |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | checkResult() |
| | | } |
| | | |
| | | fun refreshAfterCheckResult(i:Int, data: BaseRealTimeData) { |
| | | sIndex[i] = eIndex[i] |
| | | startData[i] = data |
| | | exceptionData[i].clear() |
| | | exceptionData[i].add(data) |
| | | } |
| | | // fun refreshAfterCheckResult(i:Int, data: BaseRealTimeData) { |
| | | // sIndex[i] = eIndex[i] |
| | | // startData[i] = data |
| | | // exceptionData[i].clear() |
| | | // exceptionData[i].add(data) |
| | | // } |
| | | |
| | | /** |
| | | * 检查连续异常结束时,是否符合异常存储条件 |
| | | */ |
| | | open fun checkResult(index: Int? = null) { |
| | | if (index != null) { |
| | | if (existException[index] && judgeDuration(sIndex[index], eIndex[index])) { |
| | | startData[index]?.let { |
| | | resultList.add(newResult(it, lastData, index, exceptionData[index])) |
| | | open fun checkResult(factor: FactorFilter.SelectedFactor? = null) { |
| | | val tag = tagMap[factor?.main] |
| | | if (factor != null && tag != null) { |
| | | if (tag.existException && judgeDuration(tag.sIndex, tag.eIndex - 1)) { |
| | | tag.startData?.let { |
| | | resultList.add(newResult(it, lastData, factor, tag.exceptionData)) |
| | | } |
| | | existException[index] = false |
| | | tag.existException = false |
| | | } |
| | | } else { |
| | | repeat(config.factorCount) { i -> |
| | | if (existException[i] && judgeDuration(sIndex[i], eIndex[i])) { |
| | | startData[i]?.let { |
| | | resultList.add(newResult(it, lastData, i, exceptionData[i])) |
| | | config.factorFilter.selectedList.forEach { f -> |
| | | val tag1 = tagMap[f.main] ?: return@forEach |
| | | if (tag1.existException && judgeDuration(tag1.sIndex, tag1.eIndex - 1)) { |
| | | tag1.startData?.let { |
| | | resultList.add(newResult(it, lastData, f, tag1.exceptionData)) |
| | | } |
| | | existException[i] = false |
| | | tag1.existException = false |
| | | } |
| | | } |
| | | // repeat(config.factorCount) { i -> |
| | | // if (existException[i] && judgeDuration(sIndex[i], eIndex[i])) { |
| | | // startData[i]?.let { |
| | | // resultList.add(newResult(it, lastData, i, exceptionData[i])) |
| | | // } |
| | | // existException[i] = false |
| | | // } |
| | | // } |
| | | } |
| | | } |
| | | } |