From eb3dd00b0b7fcda477229d518d250f9c842b790b Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期二, 21 十月 2025 17:45:44 +0800
Subject: [PATCH] 2025.10.21 1. 走航季度报告相关数据计算逻辑调整
---
src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt | 212 +++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 206 insertions(+), 6 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 701526e..302871e 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
/**
* 璧拌埅婧簮娓呭崟
@@ -14,21 +17,218 @@
class MissionInventory {
// 璧拌埅娓呭崟淇℃伅
- inner class MissionInfo : Mission() {
+ class MissionInfo : Mission() {
// 棣栬姹℃煋鐗�
- var mainFactor: String? = null
+// var mainFactor: String? = null
// 鐩戞祴寮傚父鍥犲瓙
var abnormalFactors: List<FactorType>? = null
// 婧簮闂鍦烘櫙鏁�
var sceneCount: Int = 0
+
+ // 婧簮闂鍦烘櫙
+ var scenes: List<SceneInfo>? = null
+
+ // 璧拌埅娑夊強鍖哄煙
+ var keyScene: List<SceneInfo>? = null
+
+ var exceptionCount: Int = 0
}
// 璧拌埅璇︽儏淇℃伅
- inner class MissionDetail : Mission() {
- var keyScene: List<SceneInfo>? = null
+ class MissionDetail : Mission() {
+// 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>,
+ granularity: String,
+ 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(granularity)
+
+ // 寮傚父鏁版嵁鐐规暟閲忕粺璁�
+// 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