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