From 61871594dfa0a5ac2c4d895d9ec4034feba57094 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期五, 12 九月 2025 17:20:53 +0800 Subject: [PATCH] 2025.9.5 1. 新增走航任务统计功能 --- src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt | 205 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 202 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt b/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt index fe910c4..f6700d7 100644 --- a/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt @@ -1,9 +1,12 @@ package com.flightfeather.uav.biz.report -import com.flightfeather.uav.domain.entity.Mission -import com.flightfeather.uav.domain.entity.SceneInfo +import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue +import com.flightfeather.uav.common.utils.MapUtil +import com.flightfeather.uav.domain.entity.* import com.flightfeather.uav.lightshare.bean.FactorStatistics import com.flightfeather.uav.socket.eunm.FactorType +import com.flightfeather.uav.socket.sender.MsgType +import org.springframework.beans.BeanUtils /** * 璧拌埅婧簮娓呭崟 @@ -23,12 +26,208 @@ // 婧簮闂鍦烘櫙鏁� var sceneCount: Int = 0 + + // 婧簮闂鍦烘櫙 + var scenes: List<SceneInfo>? = null + + // 璧拌埅娑夊強鍖哄煙 + var keyScene: List<SceneInfo>? = null + + var exceptionCount: Int = 0 } // 璧拌埅璇︽儏淇℃伅 class MissionDetail : Mission() { - var keyScene: List<SceneInfo>? = null +// var keyScene: List<SceneInfo>? = null var dataStatistics: List<FactorStatistics>? = null +// var exceptionCount: Int = 0 + } + /** + * 鐢熸垚璧拌埅浠诲姟娓呭崟 + * 澶勭悊璧拌埅浠诲姟涓庢薄鏌撶嚎绱㈡暟鎹紝缁熻姣忎釜浠诲姟鐨勫紓甯稿洜瀛愩�侀瑕佹薄鏌撶墿鍜屽満鏅暟閲� + * @param missionClues 鍖呭惈璧拌埅浠诲姟鍜屽搴旀薄鏌撶嚎绱㈢殑Pair鍒楄〃 + * @return 鍖呭惈缁熻淇℃伅鐨凪issionInfo鍒楄〃锛屾瘡涓厓绱犲寘鍚换鍔″熀鏈俊鎭強缁熻鏁版嵁 + */ + fun generateMissionList(missionClues: List<Pair<Mission, List<PollutedClue?>>>): List<MissionInfo> { + val result = missionClues.map { (mission, clue) -> + val factorMap = mutableMapOf<FactorType, Int>() + val abnormalFactors = mutableListOf<FactorType>() + var sceneCount = 0 + clue.forEach { + if (it?.msgType == MsgType.PolClue.value) { + it.pollutedData?.statisticMap?.keys?.forEach { k -> + // 璁$畻姣忎釜璧拌埅浠诲姟鐨勬墍鏈夊紓甯稿洜瀛� + if (!abnormalFactors.contains(k)) { + abnormalFactors.add(k) + } + // 璁$畻姣忎釜璧拌埅浠诲姟鐨勯瑕佹薄鏌撶墿 + if (!factorMap.containsKey(k)) { + factorMap[k] = 0 + } + factorMap[k] = factorMap[k]!! + 1 + } + // 璁$畻姣忎釜璧拌埅浠诲姟鐨勬函婧愬満鏅暟閲� + sceneCount += it.pollutedSource?.sceneList?.size ?: 0 + } + } + val missionInfo = MissionInfo() + BeanUtils.copyProperties(mission, missionInfo) + missionInfo.apply { + mainFactor = factorMap.maxByOrNull { it.value }?.key?.name + this.abnormalFactors = abnormalFactors + this.sceneCount = sceneCount + } + } + return result + } + + fun generateMissionInfo( + keyScenes: List<SceneInfo?>, + mission: Mission, + pollutedClues: List<PollutedClue?>, + data: List<BaseRealTimeData>, + minDis: Double = 100.0, + ): MissionInfo { + val factorMap = mutableMapOf<FactorType, Int>() + val abnormalFactors = mutableListOf<FactorType>() + var sceneCount = 0 + val scenes = mutableListOf<SceneInfo>() + // 鎻愬彇閫斿緞鍏抽敭鍦烘櫙淇℃伅锛堣绠楄蛋鑸矾绾挎槸鍚︿笌鍏抽敭鍦烘櫙璺濈杈冭繎锛� + val relatedScenes = mutableListOf<SceneInfo>() + data.forEach { d -> + // 璺宠繃缂哄皯缁忕含搴︾殑鏁版嵁鐐� + if (d.longitude == null || d.latitude == null) { + return@forEach + } + // 杞崲涓篏CJ02鍧愭爣绯� + val point = MapUtil.wgs84ToGcj02(d.longitude!!.toDouble() to d.latitude!!.toDouble()) + keyScenes.forEach ks@{ k -> + // 璺宠繃缂哄皯缁忕含搴︾殑鍦烘櫙 + if (k?.longitude == null || k.latitude == null) { + return@ks + } + // 妫�鏌ユ槸鍚︽湭娣诲姞杩� + if (!relatedScenes.contains(k)) { + // 璁$畻璺濈 + val distance = MapUtil.getDistance( + k.longitude!!.toDouble(), + k.latitude!!.toDouble(), + point.first, + point.second + ) + // 妫�鏌ユ槸鍚﹁窛绂诲皬浜庨槇鍊� + if (distance < minDis) { + relatedScenes.add(k) + } + } + } + } + pollutedClues.forEach { + if (it?.msgType == MsgType.PolClue.value) { + it.pollutedData?.statisticMap?.keys?.forEach { k -> + // 璁$畻姣忎釜璧拌埅浠诲姟鐨勬墍鏈夊紓甯稿洜瀛� + if (!abnormalFactors.contains(k)) { + abnormalFactors.add(k) + } + // 璁$畻姣忎釜璧拌埅浠诲姟鐨勯瑕佹薄鏌撶墿 + if (!factorMap.containsKey(k)) { + factorMap[k] = 0 + } + factorMap[k] = factorMap[k]!! + 1 + } + // 璁$畻姣忎釜璧拌埅浠诲姟鐨勬函婧愬満鏅暟閲� + sceneCount += it.pollutedSource?.sceneList?.size ?: 0 + it.pollutedSource?.sceneList?.forEach { s-> + if (scenes.find { s1 -> s1.guid == s.guid } == null) { + scenes.add(s) + } + } + } + } + + // 寮傚父鏁版嵁鐐规暟閲忕粺璁� + val clues = pollutedClues.filter { it?.msgType == MsgType.PolClue.value } + + val missionInfo = MissionInfo() + BeanUtils.copyProperties(mission, missionInfo) + missionInfo.apply { + mainFactor = factorMap.maxByOrNull { it.value }?.key?.name + this.abnormalFactors = abnormalFactors + this.sceneCount = sceneCount + this.scenes = scenes + keyScene = relatedScenes + exceptionCount = clues.size + } + + return missionInfo + } + + /** + * 鐢熸垚璧拌埅浠诲姟璇︾粏淇℃伅 + * 鏁村悎璧拌埅浠诲姟鍩烘湰淇℃伅銆佸叧閿満鏅�佹暟鎹粺璁″拰寮傚父鏁伴噺锛岀敓鎴愬畬鏁寸殑浠诲姟璇︽儏鎶ュ憡 + * @param keyScenes 鍏抽敭鍦烘櫙鍒楄〃锛岀敤浜庡垎鏋愯蛋鑸槸鍚︾粡杩囪鍖哄煙 + * @param mission 璧拌埅浠诲姟鍩烘湰淇℃伅瀵硅薄锛屽寘鍚换鍔D銆佸悕绉般�佹椂闂寸瓑鍏冩暟鎹� + * @param pollutedClues 姹℃煋绾跨储鍒楄〃锛岀敤浜庢彁鍙栧叧閿満鏅俊鎭� + * @param data 瀹炴椂鐩戞祴鏁版嵁鍒楄〃锛岀敤浜庤绠楃幆澧冨洜瀛愮粺璁′俊鎭� + * @param minDis 鏈�灏忚窛绂伙紝鐢ㄤ簬鍒ゆ柇璧拌埅鏄惁缁忚繃鍏抽敭鍦烘櫙 + * @return 鍖呭惈璇︾粏淇℃伅鐨凪issionDetail瀵硅薄锛屽寘鎷細 + * - 浠诲姟鍩烘湰淇℃伅锛堢户鎵胯嚜Mission绫伙級 + * - 鍏抽敭鍦烘櫙鍒楄〃锛圱YPE19鍜孴YPE20绫诲瀷鐨勫満鏅級 + * - 鐜鍥犲瓙缁熻鏁版嵁锛堝钩鍧囧�笺�佹渶灏忓�笺�佹渶澶у�硷級 + * - 寮傚父鏁版嵁鐐规暟閲� + */ + fun generateMissionDetail( + keyScenes: List<SceneInfo?>, + mission: Mission, + pollutedClues: List<PollutedClue?>, + data: List<BaseRealTimeData>, + minDis: Double = 100.0, + ): MissionDetail { + // 鍒涘缓浠诲姟璇︽儏瀵硅薄骞跺鍒跺熀鏈俊鎭� + val missionDetail = MissionDetail() + BeanUtils.copyProperties(mission, missionDetail) + + // 鎻愬彇閫斿緞鍏抽敭鍦烘櫙淇℃伅锛堣绠楄蛋鑸矾绾挎槸鍚︿笌鍏抽敭鍦烘櫙璺濈杈冭繎锛� +// val relatedScenes = mutableListOf<SceneInfo>() +// data.forEach { d -> +// // 璺宠繃缂哄皯缁忕含搴︾殑鏁版嵁鐐� +// if (d.longitude == null || d.latitude == null) { +// return@forEach +// } +// // 杞崲涓篏CJ02鍧愭爣绯� +// val point = MapUtil.wgs84ToGcj02(d.longitude!!.toDouble() to d.latitude!!.toDouble()) +// keyScenes.forEach ks@{ k -> +// // 璺宠繃缂哄皯缁忕含搴︾殑鍦烘櫙 +// if (k?.longitude == null || k.latitude == null) { +// return@ks +// } +// // 妫�鏌ユ槸鍚︽湭娣诲姞杩� +// if (!relatedScenes.contains(k)) { +// // 璁$畻璺濈 +// val distance = MapUtil.getDistance( +// k.longitude!!.toDouble(), +// k.latitude!!.toDouble(), +// point.first, +// point.second +// ) +// // 妫�鏌ユ槸鍚﹁窛绂诲皬浜庨槇鍊� +// if (distance < minDis) { +// relatedScenes.add(k) +// } +// } +// } +// } + // 瀛樺偍涓庝换鍔$浉鍏宠仈鐨勫叧閿満鏅俊鎭� +// missionDetail.keyScene = relatedScenes + + // 璁$畻鐜鍥犲瓙缁熻鏁版嵁锛堝钩鍧囧�笺�佹渶灏忓�笺�佹渶澶у�硷級 + missionDetail.dataStatistics = data.calDataStatistics() + + // 寮傚父鏁版嵁鐐规暟閲忕粺璁� +// val clues = pollutedClues.filter { it?.msgType == MsgType.PolClue.value } +// missionDetail.exceptionCount = clues.size + + return missionDetail } } \ No newline at end of file -- Gitblit v1.9.3