package com.flightfeather.uav.biz.sourcetrace.model
|
|
import com.flightfeather.uav.biz.FactorFilter
|
import com.flightfeather.uav.biz.dataanalysis.BaseExceptionResult
|
import com.flightfeather.uav.biz.dataanalysis.model.ExceptionTag
|
import com.flightfeather.uav.biz.dataanalysis.model.ExceptionType
|
import com.flightfeather.uav.biz.sourcetrace.config.RTExcWindLevelConfig
|
import com.flightfeather.uav.common.utils.DateUtil
|
import com.flightfeather.uav.common.utils.MapUtil
|
import com.flightfeather.uav.domain.entity.BaseRealTimeData
|
import com.flightfeather.uav.domain.entity.SceneInfo
|
import com.flightfeather.uav.domain.repository.SceneInfoRep
|
import com.flightfeather.uav.socket.sender.MsgType
|
|
/**
|
* 污染线索
|
* 通过污染数据[PollutedData],污染区域[PollutedArea],污染来源[PollutedSource],形成一条污染溯源线索
|
* @date 2025/5/27
|
* @author feiyu02
|
*/
|
class PollutedClue() : BaseExceptionResult() {
|
|
// constructor(
|
// tag: ExceptionTag, factor: FactorFilter.SelectedFactor, eType: ExceptionType, config: RTExcWindLevelConfig,
|
// windLevelCondition: RTExcWindLevelConfig.WindLevelCondition?,
|
// ) : this() {
|
// if (tag.exceptionData.isEmpty()) return
|
// deviceCode = tag.startData?.deviceCode
|
// pollutedData = PollutedData(
|
// tag.startData!!, tag.endData, factor, tag.exceptionData, tag.historyData, eType, windLevelCondition
|
// )
|
// pollutedArea = PollutedArea(tag.historyData, tag.exceptionData, config, windLevelCondition)
|
// }
|
|
constructor(
|
exceptions: List<Pair<FactorFilter.SelectedFactor, ExceptionTag>>,
|
eType: ExceptionType,
|
config: RTExcWindLevelConfig,
|
windLevelCondition: RTExcWindLevelConfig.WindLevelCondition?,
|
) : this() {
|
if (exceptions.isEmpty() || exceptions[0].second.exceptionData.isEmpty()) return
|
deviceCode = exceptions[0].second.startData?.deviceCode
|
var startData: BaseRealTimeData? = null
|
var endData: BaseRealTimeData? = null
|
var exceptionData = mutableListOf<BaseRealTimeData>()
|
var historyData = mutableListOf<BaseRealTimeData>()
|
exceptions.forEach { e ->
|
if (startData == null) {
|
startData = e.second.startData
|
} else {
|
if (e.second.startData?.dataTime!! < startData!!.dataTime) {
|
startData = e.second.startData
|
}
|
}
|
|
if (endData == null) {
|
endData = e.second.endData
|
} else {
|
if (e.second.endData?.dataTime!! > endData!!.dataTime) {
|
endData = e.second.endData
|
}
|
}
|
|
if (exceptionData.isEmpty()) {
|
exceptionData = e.second.exceptionData
|
} else {
|
e.second.exceptionData.forEach {
|
if (exceptionData.find { d -> d.dataTime == it.dataTime } == null) {
|
exceptionData.add(it)
|
}
|
}
|
}
|
|
if (historyData.isEmpty()) {
|
historyData = e.second.historyData
|
} else {
|
e.second.historyData.forEach {
|
if (historyData.find { d -> d.dataTime == it.dataTime } == null) {
|
historyData.add(it)
|
}
|
}
|
}
|
}
|
exceptionData.sortBy { it.dataTime }
|
historyData.sortBy { it.dataTime }
|
|
val factorList = exceptions.map { it.first }
|
pollutedData = PollutedData(
|
startData!!, endData, factorList, exceptionData, historyData, eType, windLevelCondition
|
)
|
pollutedArea = PollutedArea(historyData, exceptionData, config, windLevelCondition)
|
|
}
|
|
|
/**
|
* 6. 展示数据变化情况,上升速率等等
|
*/
|
|
/**
|
* @see [MsgType]
|
*/
|
var msgType: Int? = null
|
|
var deviceCode: String? = null
|
|
var pollutedData: PollutedData? = null
|
|
var pollutedArea: PollutedArea? = null
|
|
var pollutedSource: PollutedSource? = null
|
|
/**
|
* 查找系统内部溯源范围内的污染企业
|
*/
|
fun searchScenes(sceneInfoRep: SceneInfoRep) {
|
if (pollutedArea == null || pollutedData == null) return
|
pollutedSource = PollutedSource().also {
|
it.searchScenes(pollutedArea!!, sceneInfoRep, pollutedData!!)
|
}
|
}
|
}
|