package com.flightfeather.uav.biz.sourcetrace
|
|
import com.flightfeather.uav.biz.FactorFilter
|
import com.flightfeather.uav.biz.dataanalysis.BaseExceptionAnalysis
|
import com.flightfeather.uav.biz.sourcetrace.RealTimeAnalysisConfig
|
import com.flightfeather.uav.biz.sourcetrace.config.RTExcWindLevelConfig
|
import com.flightfeather.uav.biz.sourcetrace.exceptiontype.*
|
import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue
|
import com.flightfeather.uav.biz.sourcetrace.model.PollutedSummary
|
import com.flightfeather.uav.common.utils.GsonUtils
|
import com.flightfeather.uav.domain.entity.BaseRealTimeData
|
import com.flightfeather.uav.domain.repository.SceneInfoRep
|
import com.flightfeather.uav.socket.eunm.FactorType
|
import com.flightfeather.uav.socket.sender.MsgType
|
import com.flightfeather.uav.socket.sender.UnderwayWebSocketSender
|
import java.util.*
|
|
/**
|
* 污染线索控制器
|
* @date 2025/5/27
|
* @author feiyu02
|
*/
|
class SourceTraceController {
|
|
|
/**
|
* 5. 污染源的被扫描次数
|
* 每一刻钟对历史线索进行统计,提出会商建议(离污染源较远、污染源数量、出现次数)、走航路线调整建议(离污染源较近、走航轨迹未接近溯源场景)
|
*/
|
|
constructor(sceneInfoRep: SceneInfoRep, factorFilter: FactorFilter?) {
|
this.sceneInfoRep = sceneInfoRep
|
this.config = if (factorFilter != null)
|
RTExcWindLevelConfig(factorFilter)
|
else
|
RTExcWindLevelConfig(
|
FactorFilter.builder()
|
// .withMain(FactorType.NO2)
|
// .withMain(FactorType.CO)
|
// .withMain(FactorType.H2S)
|
// .withMain(FactorType.SO2)
|
// .withMain(FactorType.O3)
|
.withMain(FactorType.PM25)
|
.withMain(FactorType.PM10)
|
.withMain(FactorType.VOC)
|
.create()
|
)
|
pollutedSummary = PollutedSummary(config) { summaryCallback(it) }
|
newTask()
|
}
|
|
constructor(sceneInfoRep: SceneInfoRep) : this(sceneInfoRep, null)
|
|
private val pollutedSummary: PollutedSummary
|
|
private val sceneInfoRep: SceneInfoRep
|
|
private val config: RTExcWindLevelConfig
|
|
private val taskList = mutableListOf<BaseExceptionAnalysis<RTExcWindLevelConfig, PollutedClue>>()
|
|
fun initTask() {
|
taskList.clear()
|
newTask()
|
pollutedSummary.clear()
|
}
|
|
private fun newTask() {
|
taskList.apply {
|
add(RTExcWindLevel1(config) { exceptionCallback(it) }.also { it.init() })
|
add(RTExcWindLevel1_1(config) { exceptionCallback(it) }.also { it.init() })
|
add(RTExcWindLevel4(config) { exceptionCallback(it) }.also { it.init() })
|
add(RTExcWindLevel6(config) { exceptionCallback(it) }.also { it.init() })
|
add(RTExcChangeRate(config) { exceptionCallback(it) }.also { it.init() })
|
add(RTWarnChangeRate(config) { dataChangeCallback(it) }.also { it.init() })
|
}
|
}
|
|
/**
|
* 计算新的一条实时走航数据
|
*/
|
fun addOneData(data: BaseRealTimeData) {
|
// 计算异常
|
taskList.forEach { it.onNextData(data) }
|
pollutedSummary.refreshLatestMonitorData(data)
|
// 限定时间内没有新数据传入,则结束当前的计算
|
}
|
|
/**
|
* 超时处理,较长时间没有新数据进入,进行初始化操作
|
*/
|
private fun dealOnTimeout() {
|
val timer = Timer(true)
|
timer.schedule(object : TimerTask() {
|
override fun run() {
|
TODO("Not yet implemented")
|
}
|
}, 60 * 1000)
|
timer.cancel()
|
}
|
|
// 数据突变异常回调
|
private fun exceptionCallback(ex: PollutedClue) {
|
// 溯源污染源信息
|
ex.searchScenes(sceneInfoRep)
|
|
// 广播污染溯源异常结果
|
UnderwayWebSocketSender.broadcast(MsgType.PolClue.value, ex)
|
|
// 记录污染线索
|
pollutedSummary.addClue(ex)
|
}
|
|
// 数据变化提醒回调
|
private fun dataChangeCallback(ex: PollutedClue) {
|
// 溯源污染源信息
|
ex.searchScenes(sceneInfoRep)
|
|
// 广播数据变化提醒
|
UnderwayWebSocketSender.broadcast(MsgType.DataChange.value, ex)
|
}
|
|
private fun summaryCallback(ex: PollutedSummary.AnalysisResult) {
|
// 广播污染溯源异常结果
|
UnderwayWebSocketSender.broadcast(MsgType.AnaResult.value, ex)
|
}
|
}
|