From 29383149f7040d89ae00ad48dc48bbcf46587946 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期一, 01 九月 2025 17:32:53 +0800
Subject: [PATCH] 2025.9.1 1. 新增走航任务统计功能(待完成)

---
 src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt |  110 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 106 insertions(+), 4 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..cd8f696 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,7 +17,7 @@
 class MissionInventory {
 
     // 璧拌埅娓呭崟淇℃伅
-    inner class MissionInfo : Mission() {
+    class MissionInfo : Mission() {
         // 棣栬姹℃煋鐗�
         var mainFactor: String? = null
 
@@ -26,9 +29,108 @@
     }
 
     // 璧拌埅璇︽儏淇℃伅
-    inner class MissionDetail : Mission() {
+    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
+    }
+
+    /**
+     * 鐢熸垚璧拌埅浠诲姟璇︾粏淇℃伅
+     * 鏁村悎璧拌埅浠诲姟鍩烘湰淇℃伅銆佸叧閿満鏅�佹暟鎹粺璁″拰寮傚父鏁伴噺锛岀敓鎴愬畬鏁寸殑浠诲姟璇︽儏鎶ュ憡
+     * @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
+                }
+                // 璁$畻璺濈
+                val distance = MapUtil.getDistance(k.longitude!!.toDouble(), k.latitude!!.toDouble(), point.first, point.second)
+                // 妫�鏌ユ槸鍚﹁窛绂诲皬浜庨槇鍊间笖鏈坊鍔犺繃
+                if (distance < minDis && !relatedScenes.contains(k)) {
+                    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