feiyu02
2025-07-03 c56e1e74426238939f229f0005828d05089715ff
src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSummary.kt
@@ -31,11 +31,11 @@
    /**
     * 分析结果
     */
    inner class AnalysisResult{
    inner class AnalysisResult {
        // 按照被扫描次数降序排列的污染源列表
        var sortedSceneList: List<Pair<SceneInfo?, Int>>? = null
        var time: Date? = null
        var advice:String?= null
        var advice: String? = null
        var direction: AMapService.AMapDirection? = null
    }
@@ -60,7 +60,7 @@
    private var analysisTimer: Timer? = null
    // 定时污染分析任务
    private var lastAnalysisOnTimeTask:TimerTask? = null
    private var lastAnalysisOnTimeTask: TimerTask? = null
    // 定时污染分析任务运行状态
    private var analysisTaskIsRunning = false
@@ -128,8 +128,8 @@
        val statistic = AnalysisStatistic()
        // 共有多少相关污染源,哪些污染源被扫描次数较多
        val sceneMap = mutableMapOf<String?, Pair<SceneInfo?, Int>>()
        clueList.forEach {c->
            c.pollutedSource?.sceneList?.forEach { s->
        clueList.forEach { c ->
            c.pollutedSource?.sceneList?.forEach { s ->
                if (!sceneMap.containsKey(s?.guid)) {
                    sceneMap[s?.guid] = s to 1
                } else {
@@ -145,11 +145,12 @@
     * 线索分析
     */
    private fun analysis() {
        if (clueList.isEmpty()) return
        val result = AnalysisResult()
        // 共有多少相关污染源,哪些污染源被扫描次数较多
        val sceneMap = mutableMapOf<String?, Pair<SceneInfo?, Int>>()
        clueList.forEach {c->
            c.pollutedSource?.sceneList?.forEach { s->
        clueList.forEach { c ->
            c.pollutedSource?.sceneList?.forEach { s ->
                if (!sceneMap.containsKey(s?.guid)) {
                    sceneMap[s?.guid] = s to 1
                } else {
@@ -157,37 +158,41 @@
                }
            }
        }
        val res = sceneMap.entries.sortedBy { it.value.second }
        val res = sceneMap.entries.sortedByDescending { it.value.second }
        result.sortedSceneList = res.map { it.value }
        // 当前的走航数据的定位和污染源距离是否是逐渐接近,若走航远离了主要污染源,提示用户调整走航路线
        if (!result.sortedSceneList.isNullOrEmpty()) {
            val sT = clueList.first().pollutedData?.startTime
            val eT = clueList.last().pollutedData?.endTime
            val closetScene = result.sortedSceneList?.first()
            result.advice = "根据${sT}起的${clueList.size}条最新污染线索,污染源[${closetScene?.first?.name}]被多次溯源,具有较高污染风险,现提供新的走航推荐路线,可经过该污染源。"
            // 走航路线调整建议
            result.advice =
                "根据${sT}至${eT}的${clueList.size}条溯源切片,风险源【" +
                        "${closetScene?.first?.name}】被多次溯源,具有较高污染风险,现提供新的走航推荐路线,可经过该污染源。"
            val lastP = realTimeDataList.last()
            // 建议对应的数据采样时间
            result.time = lastP.dataTime
            if (lastP.longitude != null && lastP.latitude != null &&
                lastP.longitude!! > BigDecimal.ZERO && lastP.latitude!! > BigDecimal.ZERO
                && closetScene?.first?.longitude != null && closetScene.first?.latitude != null &&
                closetScene.first?.longitude!! > BigDecimal.ZERO && closetScene.first?.latitude!! > BigDecimal.ZERO) {
                closetScene.first?.longitude!! > BigDecimal.ZERO && closetScene.first?.latitude!! > BigDecimal.ZERO
            ) {
                val origin = MapUtil.wgs84ToGcj02(lastP.longitude!!.toDouble() to lastP.latitude!!.toDouble())
                val destination = closetScene.first!!.longitude.toDouble() to closetScene.first!!.latitude.toDouble()
                // 建议的走航路线
                result.direction = AMapService.directionDriving(origin, destination)
            }
            // 线索分析完成后,移动至历史线索列表
            historyClueList.addAll(clueList)
            clueList.clear()
            realTimeDataList.clear()
            callback(result)
        }
        result.time = realTimeDataList.last().dataTime
        // 线索分析完成后,移动至历史线索列表
        historyClueList.addAll(clueList)
        clueList.clear()
        realTimeDataList.clear()
        callback(result)
//        TODO()
    }