feiyu02
2024-07-02 bf3bf9ff25ac106b556b2427cc382c8fcca63bff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult
import com.flightfeather.uav.biz.dataanalysis.model.ExceptionSetting
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
 
/**
 * 数据异常分析控制器
 */
@Component
class ExceptionAnalysisController(
    private val realTimeDataRep: RealTimeDataRep,
    private val locationRoadNearby: LocationRoadNearby,
) {
 
    var running = false
 
    private val taskList = mutableListOf<BaseExceptionAnalysis>()
 
    private fun initTask(config: DataAnalysisConfig) {
        taskList.clear()
        taskList.apply {
            add(ExceptionDataExceed(config))
            add(ExceptionValueMutation(config))
            add(ExceptionSlideAverage(config))
        }
    }
 
    fun run(mission: Mission, factorFilter: FactorFilter): List<ExceptionResult> {
        running = true
        val config = DataAnalysisConfig(mission, ExceptionSetting(), factorFilter)
        initTask(config)
 
        val result = mutableListOf<ExceptionResult>()
        taskList.forEach { it.init() }
        // 轮询数据,计算各个异常
        realTimeDataRep.fetchData(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
                    }
                }
            }
            // 存储分析结果
            result.addAll(it.resultList)
        }
        running = false
        return result
    }
}