From 94fee0b511279679b43e210878d3d36e5a14384b Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期二, 30 九月 2025 09:14:10 +0800
Subject: [PATCH] 2025.9.30 1. 新增走航任务统计功能

---
 src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java                         |   79 ++++++++++++++-
 src/main/resources/generator/generatorConfig.xml                                         |   16 +-
 src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRep.kt               |    4 
 src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt                         |   33 ++++++
 src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt          |   12 ++
 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt |   34 ++++++
 src/main/resources/mapper/MissionMapper.xml                                              |    4 
 src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRepDelegate.kt       |   26 +++++
 src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt       |    9 +
 src/main/kotlin/com/flightfeather/uav/lightshare/web/DataAnalysisController.kt           |   18 +++
 src/test/kotlin/com/flightfeather/uav/biz/mission/MissionUtilTest.kt                     |   32 ++++--
 src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt                     |    6 
 12 files changed, 237 insertions(+), 36 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt b/src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt
index be6523c..2b49150 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt
@@ -56,4 +56,37 @@
         // 杩斿洖涔¢晣鍜岃閬撳悕绉扮粍鍚�
         return address.township
     }
+
+    /**
+     * 鏁版嵁娓呮礂
+     * 1. 淇鐢变簬纭欢璁惧鍗¢】瀵艰嚧鐨勬暟鎹噰鏍锋椂闂翠笉鍙橀棶棰橈紝閲囩敤鑷姩绱姞鏁版嵁鍛ㄦ湡鐨勬柟寮忎慨鏀归噰鏍锋椂闂�
+     * @param data 鍘熷鏁版嵁鍒楄〃
+     * @param period 鏁版嵁鍛ㄦ湡锛屽崟浣嶏細绉�
+     * @return 娓呮礂鍚庨渶瑕佷慨鏀圭殑鏁版嵁鍒楄〃
+     */
+    fun dataClean(dataList: List<BaseRealTimeData>, period: Long): List<BaseRealTimeData> {
+        val cleanedData = mutableListOf<BaseRealTimeData>()
+        var errorData: BaseRealTimeData? = null
+        dataList.forEachIndexed { index, data ->
+            if (index == 0) {
+                return@forEachIndexed
+            }
+            val lastOne = dataList[index - 1]
+            if (errorData == null) {
+                if (data.dataTime!!.time == lastOne.dataTime!!.time) {
+                    data.dataTime?.time = lastOne.dataTime?.time!!.plus(period * 1000)
+                    cleanedData.add(data)
+                    errorData = lastOne
+                }
+            } else {
+                if (data.dataTime!!.time == errorData!!.dataTime!!.time) {
+                    data.dataTime?.time = lastOne.dataTime?.time!!.plus(period * 1000)
+                    cleanedData.add(data)
+                } else {
+                    errorData = null
+                }
+            }
+        }
+        return cleanedData
+    }
 }
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 f6700d7..7f0fb2e 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt
@@ -19,7 +19,7 @@
     // 璧拌埅娓呭崟淇℃伅
     class MissionInfo : Mission() {
         // 棣栬姹℃煋鐗�
-        var mainFactor: String? = null
+//        var mainFactor: String? = null
 
         // 鐩戞祴寮傚父鍥犲瓙
         var abnormalFactors: List<FactorType>? = null
@@ -74,7 +74,7 @@
             val missionInfo = MissionInfo()
             BeanUtils.copyProperties(mission, missionInfo)
             missionInfo.apply {
-                mainFactor = factorMap.maxByOrNull { it.value }?.key?.name
+//                mainFactor = factorMap.maxByOrNull { it.value }?.key?.name
                 this.abnormalFactors = abnormalFactors
                 this.sceneCount = sceneCount
             }
@@ -152,7 +152,7 @@
         val missionInfo = MissionInfo()
         BeanUtils.copyProperties(mission, missionInfo)
         missionInfo.apply {
-            mainFactor = factorMap.maxByOrNull { it.value }?.key?.name
+//            mainFactor = factorMap.maxByOrNull { it.value }?.key?.name
             this.abnormalFactors = abnormalFactors
             this.sceneCount = sceneCount
             this.scenes = scenes
diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java b/src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java
index e4367b9..9d045ab 100644
--- a/src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java
+++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/Mission.java
@@ -20,6 +20,9 @@
     @Column(name = "end_time")
     private Date endTime;
 
+    /**
+     * 鏁版嵁鏄惁宸茬粡鎷夊彇鍏ュ簱
+     */
     @Column(name = "data_pulled")
     private Boolean dataPulled;
 
@@ -53,9 +56,14 @@
     private Float kilometres;
 
     /**
-     * 鎵�灞炲尯鍩�
+     * 璧拌埅鍥寸粫涓昏鍖哄煙
      */
     private String region;
+
+    /**
+     * 璧拌埅鍥寸粫涓績鍖哄煙鍗婂緞锛屽叕閲�
+     */
+    private Float radius;
 
     /**
      * 绌烘皵璐ㄩ噺绛夌骇
@@ -63,7 +71,16 @@
     @Column(name = "pollution_degree")
     private String pollutionDegree;
 
+    /**
+     * 绌烘皵璐ㄩ噺绛夌骇鎸囨暟AQI
+     */
     private Integer aqi;
+
+    /**
+     * 棣栬姹℃煋鍥犲瓙
+     */
+    @Column(name = "main_factor")
+    private String mainFactor;
 
     /**
      * @return mission_code
@@ -136,14 +153,18 @@
     }
 
     /**
-     * @return data_pulled
+     * 鑾峰彇鏁版嵁鏄惁宸茬粡鎷夊彇鍏ュ簱
+     *
+     * @return data_pulled - 鏁版嵁鏄惁宸茬粡鎷夊彇鍏ュ簱
      */
     public Boolean getDataPulled() {
         return dataPulled;
     }
 
     /**
-     * @param dataPulled
+     * 璁剧疆鏁版嵁鏄惁宸茬粡鎷夊彇鍏ュ簱
+     *
+     * @param dataPulled 鏁版嵁鏄惁宸茬粡鎷夊彇鍏ュ簱
      */
     public void setDataPulled(Boolean dataPulled) {
         this.dataPulled = dataPulled;
@@ -280,21 +301,39 @@
     }
 
     /**
-     * 鑾峰彇鎵�灞炲尯鍩�
+     * 鑾峰彇璧拌埅鍥寸粫涓昏鍖哄煙
      *
-     * @return region - 鎵�灞炲尯鍩�
+     * @return region - 璧拌埅鍥寸粫涓昏鍖哄煙
      */
     public String getRegion() {
         return region;
     }
 
     /**
-     * 璁剧疆鎵�灞炲尯鍩�
+     * 璁剧疆璧拌埅鍥寸粫涓昏鍖哄煙
      *
-     * @param region 鎵�灞炲尯鍩�
+     * @param region 璧拌埅鍥寸粫涓昏鍖哄煙
      */
     public void setRegion(String region) {
         this.region = region == null ? null : region.trim();
+    }
+
+    /**
+     * 鑾峰彇璧拌埅鍥寸粫涓績鍖哄煙鍗婂緞锛屽叕閲�
+     *
+     * @return radius - 璧拌埅鍥寸粫涓績鍖哄煙鍗婂緞锛屽叕閲�
+     */
+    public Float getRadius() {
+        return radius;
+    }
+
+    /**
+     * 璁剧疆璧拌埅鍥寸粫涓績鍖哄煙鍗婂緞锛屽叕閲�
+     *
+     * @param radius 璧拌埅鍥寸粫涓績鍖哄煙鍗婂緞锛屽叕閲�
+     */
+    public void setRadius(Float radius) {
+        this.radius = radius;
     }
 
     /**
@@ -316,16 +355,38 @@
     }
 
     /**
-     * @return aqi
+     * 鑾峰彇绌烘皵璐ㄩ噺绛夌骇鎸囨暟AQI
+     *
+     * @return aqi - 绌烘皵璐ㄩ噺绛夌骇鎸囨暟AQI
      */
     public Integer getAqi() {
         return aqi;
     }
 
     /**
-     * @param aqi
+     * 璁剧疆绌烘皵璐ㄩ噺绛夌骇鎸囨暟AQI
+     *
+     * @param aqi 绌烘皵璐ㄩ噺绛夌骇鎸囨暟AQI
      */
     public void setAqi(Integer aqi) {
         this.aqi = aqi;
     }
+
+    /**
+     * 鑾峰彇棣栬姹℃煋鍥犲瓙
+     *
+     * @return main_factor - 棣栬姹℃煋鍥犲瓙
+     */
+    public String getMainFactor() {
+        return mainFactor;
+    }
+
+    /**
+     * 璁剧疆棣栬姹℃煋鍥犲瓙
+     *
+     * @param mainFactor 棣栬姹℃煋鍥犲瓙
+     */
+    public void setMainFactor(String mainFactor) {
+        this.mainFactor = mainFactor == null ? null : mainFactor.trim();
+    }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRep.kt b/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRep.kt
index b7163b7..1c21daf 100644
--- a/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRep.kt
+++ b/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRep.kt
@@ -58,6 +58,10 @@
         return delegate.insertByDeviceType(deviceType, type, data)
     }
 
+    fun updateData(deviceType: UWDeviceType?, data: List<BaseRealTimeData>, type: Int? = 0): Int {
+        return delegate.updateByDeviceType(deviceType, type, data)
+    }
+
     fun deleteData(mission: Mission, type: Int? = 0): Int {
         if (mission.deviceCode == null || mission.startTime == null || mission.endTime == null) {
             throw BizException("瑕佸垹闄ょ殑璧拌埅浠诲姟缂哄け璁惧缂栧彿鎴栭噰鏍锋椂闂磋寖鍥达紝鏃犳硶鍒犻櫎瀵瑰簲鐩戞祴鏁版嵁")
diff --git a/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRepDelegate.kt b/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRepDelegate.kt
index 8ce8813..3628b1b 100644
--- a/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRepDelegate.kt
+++ b/src/main/kotlin/com/flightfeather/uav/domain/repository/RealTimeDataRepDelegate.kt
@@ -89,6 +89,32 @@
     }
 
     /**
+     * 缁熶竴鐨剈pdate鏂规硶
+     * @param deviceType 璁惧绫诲瀷
+     * @param type 鏁版嵁缁熻鍛ㄦ湡锛�0锛氱绾у�硷紱1锛氬垎閽熷��
+     * @param data 鏁版嵁
+     */
+    fun updateByDeviceType(deviceType: UWDeviceType?, type: Int? = 0, data: List<BaseRealTimeData>): Int {
+        return byDeviceType(deviceType, type, {
+            var count = 0
+            data.forEach { count += realTimeDataVehicleMapper.updateByPrimaryKeySelective(it as RealTimeDataVehicle) }
+            count
+        }, {
+            var count = 0
+            data.forEach { count += realTimeDataUavMapper.updateByPrimaryKeySelective(it as RealTimeDataUav) }
+            count
+        }, {
+            var count = 0
+            data.forEach { count += realTimeDataGridMapper.updateByPrimaryKeySelective(it as RealTimeDataGrid) }
+            count
+        }, {
+            var count = 0
+            data.forEach { count += realTimeDataGridMinMapper.updateByPrimaryKeySelective(it as RealTimeDataGridMin) }
+            count
+        }) ?: 0
+    }
+
+    /**
      * 缁熶竴鐨刣elete鏂规硶
      * @param deviceType 璁惧绫诲瀷
      * @param type 鏁版嵁缁熻鍛ㄦ湡锛�0锛氱绾у�硷紱1锛氬垎閽熷��
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt
index 2fa37ca..2c5081e 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt
@@ -52,6 +52,8 @@
      */
     fun generateMissionSummary(startTime: Date, endTime: Date, areaVo: AreaVo): MissionSummary.Summary
 
+    fun generateMissionSummary(missionCode: String): MissionSummary.Summary
+
     /**
      * 鐢熸垚璧拌埅浠诲姟娓呭崟锛堟寜鏃堕棿鍜屽尯鍩熺瓫閫夛級
      * 鏍规嵁鏃堕棿鑼冨洿鍜屽湴鐞嗗尯鍩熸煡璇㈣蛋鑸换鍔★紝骞剁敓鎴愬寘鍚粺璁′俊鎭殑浠诲姟鍒楄〃
@@ -86,6 +88,14 @@
     fun generateMissionDetail(startTime: Date, endTime: Date, areaVo: AreaVo): List<MissionDetail>
 
     /**
+     * 鐢熸垚璧拌埅浠诲姟璇︽儏锛堟寜浠诲姟缂栧彿绛涢�夛級
+     * 鏍规嵁浠诲姟缂栧彿鏌ヨ骞剁敓鎴愯缁嗙殑浠诲姟鎶ュ憡锛屽寘鍚换鍔″畬鏁翠俊鎭�佸満鏅暟鎹拰缁熻缁撴灉
+     * @param missionCode 浠诲姟缂栧彿锛岀敤浜庡敮涓�鏍囪瘑鐗瑰畾鐨勮蛋鑸换鍔�
+     * @return 浠诲姟璇︽儏瀵硅薄锛屽寘鍚换鍔″畬鏁翠俊鎭�佸満鏅暟鎹拰缁熻缁撴灉
+     */
+    fun generateMissionDetail(missionCode: String): MissionDetail
+
+    /**
      * 鑾峰彇璧拌埅浠诲姟璇︽儏锛堢洿鎺ュ鐞嗕换鍔℃暟鎹級
      * 澶勭悊宸叉湁鐨勪换鍔°�佹薄鏌撶嚎绱㈠拰瀹炴椂鏁版嵁锛岀敓鎴愯缁嗕换鍔℃姤鍛�
      * @param keyScenes 鍏抽敭鍦烘櫙鍒楄〃锛岀敤浜庡垎鏋愯蛋鑸槸鍚︾粡杩囪鍖哄煙
@@ -96,6 +106,8 @@
 
     fun generateClueByRiskArea(startTime: Date, endTime: Date, areaVo: AreaVo): List<MissionRiskArea.ClueByArea>
 
+    fun generateClueByRiskArea(missionCode: String): List<MissionRiskArea.ClueByArea>
+
     fun generateClueByRiskArea(keyScenes: List<SceneInfo?>, pollutedClues: List<PollutedClue?>): List<MissionRiskArea.ClueByArea>
 
     fun generateGridFusion(factorTypes: List<FactorType>, startTime: Date, endTime: Date, areaVo: AreaVo):
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt
index 3e20de7..abdba09 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt
@@ -108,6 +108,13 @@
         return summary
     }
 
+    override fun generateMissionSummary(missionCode: String): MissionSummary.Summary {
+        val mission = missionRep.findOne(missionCode) ?: throw BizException("璧拌埅浠诲姟涓嶅瓨鍦�")
+        val clues = sourceTraceRep.fetchList(mission.deviceCode, mission.startTime, mission.endTime, MsgType.PolClue) as List<PollutedClue?>
+        val summary = MissionSummary().execute(mission.startTime, mission.endTime, listOf(mission), clues)
+        return summary
+    }
+
     /**
      * 鐢熸垚璧拌埅浠诲姟娓呭崟锛堟寜鏃堕棿鍜屽尯鍩熺瓫閫夛級
      * 鏍规嵁鏃堕棿鑼冨洿鍜岃鏀垮尯鍒掓煡璇㈣蛋鑸换鍔★紝骞跺叧鑱旀薄鏌撶嚎绱㈡暟鎹敓鎴愪换鍔″垪琛�
@@ -188,6 +195,20 @@
         return generateMissionDetail(keyScenes, missionCluesData)
     }
 
+    override fun generateMissionDetail(missionCode: String): MissionInventory.MissionDetail {
+        val mission = missionRep.findOne(missionCode) ?: throw BizException("浠诲姟涓嶅瓨鍦�")
+        val missionClues = sourceTraceRep.fetchList(mission.deviceCode, mission.startTime, mission.endTime, MsgType.PolClue) as List<PollutedClue?>
+        val realTimeData = realTimeDataRep.fetchData(mission)
+        val keyScenes = sceneInfoRep.findBySceneTypes(
+            listOf(
+                SceneType.TYPE19.value,
+                SceneType.TYPE20.value,
+                SceneType.TYPE21.value
+            )
+        )
+        return MissionInventory().generateMissionDetail(keyScenes, mission, missionClues, realTimeData)
+    }
+
     /**
      * 鐢熸垚璧拌埅浠诲姟璇︽儏锛堢洿鎺ュ鐞嗕换鍔℃暟鎹級
      * 鎺ユ敹宸插叧鑱旂殑浠诲姟-姹℃煋绾跨储-瀹炴椂鏁版嵁涓夊厓缁勶紝鐢熸垚璇︾粏浠诲姟鎶ュ憡
@@ -226,6 +247,19 @@
         return generateClueByRiskArea(keyScenes, clues)
     }
 
+    override fun generateClueByRiskArea(missionCode: String): List<MissionRiskArea.ClueByArea> {
+        val mission = missionRep.findOne(missionCode) ?: throw BizException("浠诲姟涓嶅瓨鍦�")
+        val pollutedClues = sourceTraceRep.fetchList(mission.deviceCode, mission.startTime, mission.endTime, MsgType.PolClue) as List<PollutedClue?>
+        val keyScenes = sceneInfoRep.findBySceneTypes(
+            listOf(
+                SceneType.TYPE19.value,
+                SceneType.TYPE20.value,
+                SceneType.TYPE21.value
+            )
+        )
+        return generateClueByRiskArea(keyScenes, pollutedClues)
+    }
+
     override fun generateClueByRiskArea(
         keyScenes: List<SceneInfo?>,
         pollutedClues: List<PollutedClue?>,
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/web/DataAnalysisController.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/web/DataAnalysisController.kt
index d6057bb..5bd3414 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/web/DataAnalysisController.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/web/DataAnalysisController.kt
@@ -57,6 +57,12 @@
         )
     }
 
+    @ApiOperation(value = "鐢熸垚璧拌埅浠诲姟姹囨�荤粺璁�")
+    @GetMapping("/report/missionSummary/one")
+    fun generateOneMissionSummary(
+        @ApiParam("浠诲姟缂栧彿") @RequestParam missionCode: String,
+    ) = resPack { dataAnalysisService.generateMissionSummary(missionCode) }
+
     @ApiOperation(value = "鐢熸垚璧拌埅浠诲姟娓呭崟")
     @PostMapping("/report/missionList")
     fun generateMissionList(
@@ -97,6 +103,12 @@
         )
     }
 
+    @ApiOperation(value = "鐢熸垚璧拌埅浠诲姟璇︽儏")
+    @GetMapping("/report/missionDetail/one")
+    fun generateOneMissionDetail(
+        @ApiParam("浠诲姟缂栧彿") @RequestParam missionCode: String,
+    ) = resPack { dataAnalysisService.generateMissionDetail(missionCode) }
+
     @ApiOperation(value = "璧拌埅鍏稿瀷闅愭偅鍖哄煙缁熻")
     @PostMapping("/report/clueByRiskArea")
     fun generateClueByRiskArea(
@@ -117,6 +129,12 @@
         )
     }
 
+    @ApiOperation(value = "璧拌埅鍏稿瀷闅愭偅鍖哄煙缁熻")
+    @GetMapping("/report/clueByRiskArea/one")
+    fun generateOneClueByRiskArea(
+        @ApiParam("浠诲姟缂栧彿") @RequestParam missionCode: String,
+    ) = resPack { dataAnalysisService.generateClueByRiskArea(missionCode) }
+
     @ApiOperation(value = "鍙犲姞铻嶅悎鍒嗘瀽")
     @PostMapping("/report/gridFusion")
     fun generateGridFusion(
diff --git a/src/main/resources/generator/generatorConfig.xml b/src/main/resources/generator/generatorConfig.xml
index df72831..1520d14 100644
--- a/src/main/resources/generator/generatorConfig.xml
+++ b/src/main/resources/generator/generatorConfig.xml
@@ -25,15 +25,15 @@
             <property name="suppressAllComments" value="true"/>
         </commentGenerator>
         <!--鏁版嵁搴撻摼鎺RL锛岀敤鎴峰悕銆佸瘑鐮� -->
-<!--        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://47.100.191.150:3306/dronemonitor?serverTimezone=Asia/Shanghai"-->
-<!--						userId="remoteU1"-->
-<!--						password="eSoF8DnzfGTlhAjE">-->
-<!--        </jdbcConnection>-->
-        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
-                        connectionURL="jdbc:mysql://localhost:3306/dronemonitor?serverTimezone=Asia/Shanghai"
-                        userId="root"
-                        password="123456">
+        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://47.100.191.150:3306/dronemonitor?serverTimezone=Asia/Shanghai"
+						userId="remoteU1"
+						password="eSoF8DnzfGTlhAjE">
         </jdbcConnection>
+<!--        <jdbcConnection driverClass="com.mysql.jdbc.Driver"-->
+<!--                        connectionURL="jdbc:mysql://localhost:3306/dronemonitor?serverTimezone=Asia/Shanghai"-->
+<!--                        userId="root"-->
+<!--                        password="123456">-->
+<!--        </jdbcConnection>-->
         <javaTypeResolver>
             <property name="forceBigDecimals" value="false"/>
         </javaTypeResolver>
diff --git a/src/main/resources/mapper/MissionMapper.xml b/src/main/resources/mapper/MissionMapper.xml
index 0a10c92..d7f4f69 100644
--- a/src/main/resources/mapper/MissionMapper.xml
+++ b/src/main/resources/mapper/MissionMapper.xml
@@ -21,8 +21,10 @@
     <result column="town_name" jdbcType="VARCHAR" property="townName" />
     <result column="kilometres" jdbcType="REAL" property="kilometres" />
     <result column="region" jdbcType="VARCHAR" property="region" />
+    <result column="radius" jdbcType="REAL" property="radius" />
     <result column="pollution_degree" jdbcType="VARCHAR" property="pollutionDegree" />
     <result column="aqi" jdbcType="INTEGER" property="aqi" />
+    <result column="main_factor" jdbcType="VARCHAR" property="mainFactor" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
@@ -30,6 +32,6 @@
     -->
     mission_code, device_type, device_code, start_time, end_time, data_pulled, province_code, 
     province_name, city_code, city_name, district_code, district_name, town_code, town_name, 
-    kilometres, region, pollution_degree, aqi
+    kilometres, region, radius, pollution_degree, aqi, main_factor
   </sql>
 </mapper>
\ No newline at end of file
diff --git a/src/test/kotlin/com/flightfeather/uav/biz/mission/MissionUtilTest.kt b/src/test/kotlin/com/flightfeather/uav/biz/mission/MissionUtilTest.kt
index f7264a7..ce27a1a 100644
--- a/src/test/kotlin/com/flightfeather/uav/biz/mission/MissionUtilTest.kt
+++ b/src/test/kotlin/com/flightfeather/uav/biz/mission/MissionUtilTest.kt
@@ -3,30 +3,40 @@
 import com.flightfeather.uav.common.utils.MapUtil
 import com.flightfeather.uav.domain.repository.MissionRep
 import com.flightfeather.uav.domain.repository.RealTimeDataRep
+import com.flightfeather.uav.socket.eunm.UWDeviceType
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.boot.test.context.SpringBootTest
 import org.springframework.test.context.junit4.SpringRunner
 
-//@RunWith(SpringRunner::class)
-//@SpringBootTest
+@RunWith(SpringRunner::class)
+@SpringBootTest
 class MissionUtilTest {
 
-//    @Autowired
+    @Autowired
     lateinit var missionRep: MissionRep
 
-//    @Autowired
+    @Autowired
     lateinit var realTimeDataRep: RealTimeDataRep
 
     @Test
     fun calKilometres() {
-//        val m = missionRep.findOne("20250819") ?: return
-//        val data = realTimeDataRep.fetchData(m)
-//        MissionUtil.calKilometres(data)
-        val d = MapUtil.getDistance(121.425187, 31.225907, 121.425196, 31.225892)
-        println(d)
-        val d1 = MapUtil.getDistance(121.425196, 31.225892, 121.425187, 31.225907)
-        println(d1)
+        val m = missionRep.findOne("20250819") ?: return
+        val data = realTimeDataRep.fetchData(m)
+        MissionUtil.calKilometres(data)
+//        val d = MapUtil.getDistance(121.425187, 31.225907, 121.425196, 31.225892)
+//        println(d)
+//        val d1 = MapUtil.getDistance(121.425196, 31.225892, 121.425187, 31.225907)
+//        println(d1)
+    }
+
+    @Test
+    fun dataClean() {
+        val m = missionRep.findOne("SH-CN-20250411") ?: return
+        val data = realTimeDataRep.fetchData(m)
+        val cleanedData = MissionUtil.dataClean(data, 4)
+        realTimeDataRep.updateData(UWDeviceType.fromValue(m.deviceType), cleanedData)
+        println(cleanedData.size)
     }
 }
\ No newline at end of file
diff --git a/src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt b/src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt
index 8210d7f..51db22d 100644
--- a/src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt
+++ b/src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt
@@ -45,8 +45,9 @@
 //            "SH-CN-20240723(02)",
 ////            "SH-CN-20250723(01)"
 //        )
-        val startTime = LocalDateTime.of(2025, 7, 1, 0, 0, 0).atZone(ZoneId.systemDefault()).toInstant()
-        val endTime = LocalDateTime.of(2025, 9, 30, 23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()
+//        val startTime = LocalDateTime.of(2024, 12, 31, 0, 0, 0).atZone(ZoneId.systemDefault()).toInstant()
+        val startTime = LocalDateTime.of(2024, 12, 4, 0, 0, 0).atZone(ZoneId.systemDefault()).toInstant()
+        val endTime = LocalDateTime.of(2025, 4, 11, 23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()
         val missions = missionMapper.selectByExample(Example(Mission::class.java).apply {
             createCriteria().andBetween("startTime", startTime, endTime)
         })
@@ -114,8 +115,8 @@
 //            "SH-CN-20240723(02)",
 ////            "SH-CN-20250723(01)"
 //        )
-        val startTime = LocalDateTime.of(2025, 7, 1, 0, 0, 0).atZone(ZoneId.systemDefault()).toInstant()
-        val endTime = LocalDateTime.of(2025, 9, 30, 23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()
+        val startTime = LocalDateTime.of(2024, 12, 4, 0, 0, 0).atZone(ZoneId.systemDefault()).toInstant()
+        val endTime = LocalDateTime.of(2025, 4, 11, 23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()
         val missions = missionMapper.selectByExample(Example(Mission::class.java).apply {
             createCriteria().andBetween("startTime", startTime, endTime)
         })

--
Gitblit v1.9.3