From 344d9006faa27ea65e3eaf5e8f9173aad2266038 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期三, 23 七月 2025 17:23:53 +0800
Subject: [PATCH] 2025.7.23 1. 动态溯源模块完成,发布

---
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt         |   10 +++++
 src/main/kotlin/com/flightfeather/uav/lightshare/service/ThirdPartyService.kt          |    5 ++
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt            |    1 
 src/main/kotlin/com/flightfeather/uav/biz/datafetch/ShenXinDataFetch.kt                |   13 ++++--
 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ThirdPartyServiceImpl.kt |   49 +++++++++++++++++++++++-
 5 files changed, 72 insertions(+), 6 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/biz/datafetch/ShenXinDataFetch.kt b/src/main/kotlin/com/flightfeather/uav/biz/datafetch/ShenXinDataFetch.kt
index 98c498f..5a76f07 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/datafetch/ShenXinDataFetch.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/datafetch/ShenXinDataFetch.kt
@@ -2,6 +2,7 @@
 
 import com.flightfeather.uav.common.exception.BizException
 import com.flightfeather.uav.common.net.ShenXinService
+import com.flightfeather.uav.domain.entity.BaseRealTimeData
 import com.flightfeather.uav.domain.entity.Mission
 import com.flightfeather.uav.domain.repository.MissionRep
 import com.flightfeather.uav.domain.repository.RealTimeDataRep
@@ -25,16 +26,17 @@
     private val deviceStatusMap = ConcurrentHashMap<String, Boolean>()
     // 璧拌埅浠诲姟鏄惁姝e湪鑾峰彇鏁版嵁
     private val missionStatusMap = ConcurrentHashMap<String, Boolean>()
+
     /**
      * 鑾峰彇鏈�鏂扮殑鏁版嵁
      * @param deviceType 璁惧绫诲瀷
      * @param code 璁惧缂栧彿
      */
-    private fun fetchLatestData(deviceType: UWDeviceType, code: String) {
+    private fun fetchLatestData(deviceType: UWDeviceType, code: String): List<BaseRealTimeData> {
         if (deviceStatusMap.containsKey(code)) {
             // 璁惧姝e湪鑾峰彇瀹炴椂鏁版嵁锛屽垯鐩存帴杩斿洖锛屾斁寮冩湰娆¤姹�
             if (deviceStatusMap[code] == true) {
-                return
+                return emptyList()
             }
             // 鍚﹀垯寮�濮嬭幏鍙栨暟鎹紝淇敼鐘舵�佷负true
             else {
@@ -57,6 +59,7 @@
             if (data.isNotEmpty()) {
                 realTimeDataRep.saveData(deviceType, data)
             }
+            return data
         } finally {
             // 璁惧瀹屾垚鏁版嵁鑾峰彇鍚庯紝淇敼鐘舵�佷负false
             deviceStatusMap[code] = false
@@ -66,13 +69,15 @@
     /**
      * 鑾峰彇缁欏畾鏃堕棿鑼冨洿鍐呯殑鏁版嵁
      */
-    fun fetchLatestData(deviceType: UWDeviceType, code: String, sTime: LocalDateTime?, eTime: LocalDateTime?) {
+    fun fetchLatestData(deviceType: UWDeviceType, code: String, sTime: LocalDateTime?, eTime: LocalDateTime?)
+            : List<BaseRealTimeData> {
         if (sTime != null && eTime != null) {
             val data = ShenXinService.fetchData(code, sTime, eTime)
             realTimeDataRep.deleteData(deviceType, code, sTime, eTime)
             realTimeDataRep.saveData(deviceType, data)
+            return data
         } else if (sTime == null && eTime == null) {
-            fetchLatestData(deviceType, code)
+            return fetchLatestData(deviceType, code)
         } else {
             throw BizException("寮�濮嬪拰缁撴潫鏃堕棿闇�瑕侀兘鐪佺暐鎴栬�呴兘濉啓")
         }
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt
index 83bb5c7..81aef67 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt
@@ -102,6 +102,16 @@
         dealOnTimeout()
     }
 
+    fun addDataList(dataList: List<BaseRealTimeData>) {
+        // 璁$畻寮傚父
+        dataList.forEach { data ->
+            taskList.forEach { it.onNextData(data) }
+            pollutedSummary.refreshLatestMonitorData(data)
+        }
+        // 闄愬畾鏃堕棿鍐呮病鏈夋柊鏁版嵁浼犲叆锛屽垯缁撴潫褰撳墠鐨勮绠�
+        dealOnTimeout()
+    }
+
     /**
      * 瓒呮椂澶勭悊锛岃緝闀挎椂闂存病鏈夋柊鏁版嵁杩涘叆锛岃繘琛屽垵濮嬪寲鎿嶄綔
      */
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt
index 9375913..fe2e325 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt
@@ -77,6 +77,7 @@
         try {
             val address = AMapService.reGeo(pair)
             this.address = address.district + address.township + address.street
+            Thread.sleep(100)
         } catch (e: Exception) {
             e.printStackTrace()
         }
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/ThirdPartyService.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/ThirdPartyService.kt
index 58a8b7d..2ee944a 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/ThirdPartyService.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/ThirdPartyService.kt
@@ -27,4 +27,9 @@
     fun fetchLatestData(
         label: String, type: UWDeviceType, deviceCode: String, startTime: LocalDateTime?, endTime: LocalDateTime?,
     ): Boolean
+
+    /**
+     * 瀵瑰巻鍙茶蛋鑸换鍔¤繘琛屽揩閫熷姩鎬佹函婧�
+     */
+    fun sourceTrace(label: String, missionCode: String): Boolean
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ThirdPartyServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ThirdPartyServiceImpl.kt
index a2cf978..b8288c6 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ThirdPartyServiceImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ThirdPartyServiceImpl.kt
@@ -1,12 +1,18 @@
 package com.flightfeather.uav.lightshare.service.impl
 
 import com.flightfeather.uav.biz.datafetch.ShenXinDataFetch
+import com.flightfeather.uav.biz.sourcetrace.SourceTraceController
 import com.flightfeather.uav.common.exception.BizException
+import com.flightfeather.uav.domain.repository.MissionRep
+import com.flightfeather.uav.domain.repository.RealTimeDataRep
+import com.flightfeather.uav.domain.repository.SceneInfoRep
+import com.flightfeather.uav.domain.repository.SourceTraceRep
 import com.flightfeather.uav.lightshare.eunm.ThirdPartyLabel
 import com.flightfeather.uav.lightshare.service.ThirdPartyService
 import com.flightfeather.uav.socket.eunm.UWDeviceType
 import org.springframework.stereotype.Service
 import java.time.LocalDateTime
+import java.util.concurrent.ConcurrentHashMap
 
 /**
  *
@@ -14,7 +20,17 @@
  * @author feiyu02
  */
 @Service
-class ThirdPartyServiceImpl(private val shenXinDataFetch: ShenXinDataFetch) : ThirdPartyService {
+class ThirdPartyServiceImpl(
+    private val shenXinDataFetch: ShenXinDataFetch,
+    private val sceneInfoRep: SceneInfoRep,
+    private val sourceTraceRep: SourceTraceRep,
+    private val missionRep: MissionRep,
+    private val realTimeDataRep: RealTimeDataRep,
+) : ThirdPartyService {
+
+    // 瀹炴椂璧拌埅姹℃煋婧簮澶勭悊鍣�
+    private val sourceTraceMap = ConcurrentHashMap<String?, SourceTraceController>()
+    private val historySourceTraceTask = ConcurrentHashMap<String, Boolean>()
 
     override fun fetchMissionData(label: String, missionCode: String): Boolean {
         when (label) {
@@ -31,10 +47,39 @@
     ): Boolean {
         when (label) {
             ThirdPartyLabel.ShenXin.value -> {
-                shenXinDataFetch.fetchLatestData(type, deviceCode, startTime, endTime)
+                val data = shenXinDataFetch.fetchLatestData(type, deviceCode, startTime, endTime)
+                getSourceTraceCtrl(deviceCode)?.addDataList(data)
                 return true
             }
             else -> throw BizException("绗笁鏂规帴鍙f爣璇嗕笉瀛樺湪")
         }
     }
+
+    override fun sourceTrace(label: String, missionCode: String): Boolean {
+        when (label) {
+            ThirdPartyLabel.ShenXin.value -> {
+                if (!historySourceTraceTask.containsKey(missionCode)) {
+                    historySourceTraceTask[missionCode] = false
+                }
+                if (historySourceTraceTask[missionCode] != true) {
+                    historySourceTraceTask[missionCode] = true
+                    val stc = SourceTraceController(sceneInfoRep, sourceTraceRep)
+                    val mission = missionRep.findOne(missionCode) ?: throw BizException("璧拌埅浠诲姟涓嶅瓨鍦�")
+                    val data = realTimeDataRep.fetchData(mission)
+                    stc.addDataList(data)
+                }
+                return true
+            }
+            else -> throw BizException("绗笁鏂规帴鍙f爣璇嗕笉瀛樺湪")
+        }
+    }
+
+    private fun getSourceTraceCtrl(key: String): SourceTraceController? {
+        // 姣忓彴璁惧鏈夊悇鑷崟鐙殑寮傚父鏁版嵁澶勭悊鍣�
+        if (!sourceTraceMap.containsKey(key)) {
+            sourceTraceMap[key] = SourceTraceController(sceneInfoRep, sourceTraceRep)
+        }
+        // 灏嗚蛋鑸暟鎹紶鍏ュ紓甯稿鐞嗗櫒
+        return sourceTraceMap[key]
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3