| | |
| | | package com.flightfeather.uav.biz.sourcetrace.model |
| | | |
| | | 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.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.UnderwayWebSocketSender |
| | | import java.util.* |
| | | |
| | | /** |
| | | * 污染情况汇总 |
| | | * 针对单次走航,定时统计已有污染线索[PollutedClue],按照策略给出走航建议 |
| | |
| | | * 每一刻钟对历史线索进行统计,提出会商建议(离污染源较远、污染源数量、出现次数)、走航路线调整建议(离污染源较近、走航轨迹未接近溯源场景) |
| | | */ |
| | | |
| | | 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() |
| | | ) |
| | | initTask() |
| | | } |
| | | |
| | | constructor(sceneInfoRep: SceneInfoRep) : this(sceneInfoRep, null) |
| | | |
| | | // 污染线索 |
| | | var clueList = mutableListOf<PollutedClue>() |
| | | |
| | | private val sceneInfoRep: SceneInfoRep |
| | | |
| | | private val config: RTExcWindLevelConfig |
| | | |
| | | private val taskList = mutableListOf<BaseExceptionAnalysis<RTExcWindLevelConfig, PollutedClue>>() |
| | | |
| | | fun initTask() { |
| | | taskList.clear() |
| | | 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() }) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 计算新的一条实时走航数据 |
| | | */ |
| | | fun addOneData(data: BaseRealTimeData) { |
| | | // 计算异常 |
| | | taskList.forEach { it.onNextData(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) |
| | | clueList |
| | | // 广播污染溯源异常结果 |
| | | UnderwayWebSocketSender.broadcast(GsonUtils.gson.toJson(ex)) |
| | | } |
| | | } |