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.exceptiontype.RealTimeExceptionValueMutation
|
import com.flightfeather.uav.biz.sourcetrace.model.RealTimeExceptionResult
|
import com.flightfeather.uav.common.api2word.utils.JsonUtils
|
import com.flightfeather.uav.common.location.LocationRoadNearby
|
import com.flightfeather.uav.common.utils.GsonUtils
|
import com.flightfeather.uav.domain.entity.BaseRealTimeData
|
import com.flightfeather.uav.domain.entity.avg
|
import com.flightfeather.uav.domain.repository.RealTimeDataRep
|
import com.flightfeather.uav.domain.repository.SegmentInfoRep
|
import com.flightfeather.uav.socket.handler.UnderwayWebSocketServerHandler
|
import com.google.gson.Gson
|
|
/**
|
* 实时走航污染溯源
|
* @date 2025/5/8
|
* @author feiyu02
|
*/
|
class RealTimeExceptionAnalysisController (
|
private val realTimeDataRep: RealTimeDataRep,
|
private val locationRoadNearby: LocationRoadNearby,
|
private val segmentInfoRep: SegmentInfoRep,
|
private val underwayWebSocketServerHandler: UnderwayWebSocketServerHandler,
|
factorFilter: FactorFilter
|
){
|
private var config:RealTimeAnalysisConfig = RealTimeAnalysisConfig(factorFilter)
|
|
private val taskList = mutableListOf<BaseExceptionAnalysis<RealTimeAnalysisConfig, RealTimeExceptionResult>>()
|
|
private fun initTask(config: RealTimeAnalysisConfig) {
|
taskList.clear()
|
taskList.apply {
|
add(RealTimeExceptionValueMutation(config){ exceptionCallback(it)})
|
}
|
}
|
|
init {
|
initTask(config)
|
}
|
|
// 计算历史任务
|
fun addOneData(data: BaseRealTimeData) {
|
taskList
|
|
}
|
|
private fun exceptionCallback(ex: RealTimeExceptionResult) {
|
if (sourceTrace(ex, config)) {
|
underwayWebSocketServerHandler.broadcast(GsonUtils.gson.toJson(ex))
|
}
|
}
|
|
private fun sourceTrace(ex: RealTimeExceptionResult, config: RealTimeAnalysisConfig):Boolean {
|
val avgData = ex.dataList.avg()
|
if (avgData.windSpeed!! > config.sourceTraceWindSpeedLimit) {
|
return false
|
}
|
|
// 取中间点作为反向溯源的起点
|
val midData = ex.dataList[ex.dataList.size / 2]
|
|
// avgData.longitude
|
// avgData.latitude
|
// avgData.windDirection
|
return false
|
}
|
|
}
|