feiyu02
2025-05-08 9a9a27f185bc0cf9dc0001cfc6839e6d13dbccd9
src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt
@@ -1,7 +1,6 @@
package com.flightfeather.uav.biz.dataanalysis
import com.flightfeather.uav.biz.FactorFilter
import com.flightfeather.uav.biz.dataanalysis.exceptiontype.ExceptionDataExceed
import com.flightfeather.uav.biz.dataanalysis.exceptiontype.ExceptionSlideAverage
import com.flightfeather.uav.biz.dataanalysis.exceptiontype.ExceptionValueMutation
import com.flightfeather.uav.biz.dataanalysis.model.DataAnalysisConfig
@@ -10,15 +9,18 @@
import com.flightfeather.uav.common.location.LocationRoadNearby
import com.flightfeather.uav.domain.entity.Mission
import com.flightfeather.uav.domain.repository.RealTimeDataRep
import org.springframework.stereotype.Component
import com.flightfeather.uav.domain.repository.SegmentInfoRep
import com.flightfeather.uav.socket.eunm.UWDeviceType
import java.time.LocalDateTime
import java.time.ZoneId
/**
 * 数据异常分析控制器
 */
@Component
class ExceptionAnalysisController(
class  ExceptionAnalysisController(
    private val realTimeDataRep: RealTimeDataRep,
    private val locationRoadNearby: LocationRoadNearby,
    private val segmentInfoRep: SegmentInfoRep,
) {
    var running = false
@@ -28,13 +30,13 @@
    private fun initTask(config: DataAnalysisConfig) {
        taskList.clear()
        taskList.apply {
            add(ExceptionDataExceed(config))
//            add(ExceptionDataExceed(config))
            add(ExceptionValueMutation(config))
            add(ExceptionSlideAverage(config))
        }
    }
    fun run(mission: Mission, factorFilter: FactorFilter): List<ExceptionResult> {
    fun execute(mission: Mission, factorFilter: FactorFilter): List<ExceptionResult> {
        running = true
        val config = DataAnalysisConfig(mission, ExceptionSetting(), factorFilter)
        initTask(config)
@@ -42,29 +44,24 @@
        val result = mutableListOf<ExceptionResult>()
        taskList.forEach { it.init() }
        // 轮询数据,计算各个异常
        realTimeDataRep.fetchData(mission.deviceCode, mission.startTime, mission.endTime).forEach { d ->
        realTimeDataRep.fetchData(UWDeviceType.fromValue(mission.deviceType),
            mission.deviceCode,
            mission.startTime,
            mission.endTime
        ).forEach { d ->
            taskList.forEach { it.onNextData(d) }
        }
        // 各个异常分析分别结束
        taskList.forEach { it.onDone() }
        taskList.forEach {
            // 查询异常周边可能污染源
            it.resultList.forEach { r->
                if (r.longitude != null && r.latitude != null) {
                    val sceneList = locationRoadNearby.searchByRadius(
                        r.longitude!!.toDouble() to r.latitude!!.toDouble(), config.radius)
                    if (sceneList.isNotEmpty()) {
                        val idList = mutableListOf<String>()
                        val nameList = mutableListOf<String>()
                        sceneList.forEach { s->
                            idList.add(s?.guid?:"")
                            nameList.add(s?.name ?: "")
                        }
                        r.relatedSceneId = idList
                        r.relatedSceneName = nameList
                    }
                }
                // 查询异常周边可能污染源
                nearBy(r, config)
                // 查询时段所在路段
//                road(r)
                // 将数据转换为通用格式
                r.dataVoList = r.dataList.map { e-> e.toDataVo() }
            }
            // 存储分析结果
            result.addAll(it.resultList)
@@ -72,4 +69,50 @@
        running = false
        return result
    }
//    private fun
    private fun nearBy(r: ExceptionResult, config: DataAnalysisConfig) {
        if (r.longitude != null && r.latitude != null) {
            val sceneList = locationRoadNearby.searchByRadius(
                r.longitude!!.toDouble() to r.latitude!!.toDouble(), config.radius)
            if (sceneList.isNotEmpty()) {
                val idList = mutableListOf<String>()
                val nameList = mutableListOf<String>()
                sceneList.forEach { s->
                    idList.add(s?.guid?:"")
                    nameList.add(s?.name ?: "")
                }
                r.relatedSceneId = idList
                r.relatedSceneName = nameList
                r.relatedSceneList = sceneList
            }
        }
    }
    private fun road(r: ExceptionResult) {
        val sT = LocalDateTime.ofInstant(r.startDate?.toInstant(), ZoneId.systemDefault())
        val eT = LocalDateTime.ofInstant(r.endDate?.toInstant(), ZoneId.systemDefault())
        val segments = segmentInfoRep.findPeriod(r.missionCode, sT, eT)
        var txt = ""
        val size = segments.size
        segments.forEachIndexed { i, s ->
            txt += if (i == 0) {
                if (size == 1) {
                    "在${s?.street}"
                } else {
                    "从${s?.street}"
                }
            } else if (i == size - 1 && i >= 2) {
                ",至${s?.street}"
            } else {
                if (i == 1) {
                    ",经${s?.street}"
                } else {
                    "、${s?.street}"
                }
            }
        }
        r.road = txt
    }
}