From d649f734c44541641158aec2d6b10d630f5a0827 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 25 十二月 2025 17:25:16 +0800
Subject: [PATCH] 2025.12.19 1. 动态溯源相关分析逻辑调整; 2. 走航报告接口参数调整;
---
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt | 168 +++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 125 insertions(+), 43 deletions(-)
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 52efc03..ad2cc21 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
@@ -42,7 +42,7 @@
private val sourceTraceRep: SourceTraceRep,
private val sceneInfoRep: SceneInfoRep,
private val satelliteGridRep: SatelliteGridRep,
- private val satelliteDataCalculateService: SatelliteDataCalculateService
+ private val satelliteDataCalculateService: SatelliteDataCalculateService,
) : DataAnalysisService {
/**
@@ -77,13 +77,14 @@
* 鑾峰彇鍘嗗彶姹℃煋婧簮缁撴灉
* 鏌ヨ鎸囧畾浠诲姟鐨勫巻鍙叉薄鏌撴函婧愮粨鏋滃苟搴忓垪鍖栦负JSON瀛楃涓�
* @param missionCode 璧拌埅浠诲姟缂栫爜
+ * @param minPer 鏈�灏忔薄鏌撶櫨鍒嗘瘮锛岀敤浜庣瓫閫夊紓甯告暟鎹偣锛堝彲閫夛級
* @return 鍘嗗彶姹℃煋婧簮缁撴灉鐨凧SON瀛楃涓诧紝鍏蜂綋鏍煎紡鐢眘ourceTraceRep瀹炵幇鍐冲畾
* @throws BizException 褰撹蛋鑸换鍔′笉瀛樺湪鏃舵姏鍑�
*/
- override fun fetchHistory(missionCode: String): String {
+ override fun fetchHistory(missionCode: String, minPer: Double?): String {
val mission = missionRep.findOne(missionCode) ?: throw BizException("璧拌埅浠诲姟涓嶅瓨鍦�")
- val res = sourceTraceRep.fetchList(mission.deviceCode, mission.startTime, mission.endTime)
+ val res = sourceTraceRep.fetchList(mission.deviceCode, mission.startTime, mission.endTime, minPer = minPer ?: 0.5)
return GsonUtils.gson.toJson(res)
}
@@ -94,22 +95,34 @@
* @param endTime 缁熻缁撴潫鏃堕棿锛堝寘鍚級
* @param areaVo 鍖哄煙鍙傛暟锛屽寘鍚渷銆佸競銆佸尯涓夌骇琛屾斂鍖哄垝缂栫爜
* @return 姹囨�荤粺璁″璞★紝鍖呭惈浠诲姟鎬绘暟銆佸紓甯哥偣鏁伴噺銆佸钩鍧囬噷绋嬬瓑鏍稿績鎸囨爣
- * @see MissionSummary 姹囨�荤粺璁″鐞嗗櫒锛屽皝瑁呭叿浣撶殑缁熻閫昏緫瀹炵幇
+ * @see MissionSummary 姹囨�荤粺璁″鐞嗗櫒锛屽皝瑁呭叿浣撶粺璁¢�昏緫鐨勫疄鐜�
*/
- override fun generateMissionSummary(startTime: Date, endTime: Date, areaVo: AreaVo): MissionSummary.Summary {
+ override fun generateMissionSummary(
+ startTime: Date, endTime: Date, areaVo: AreaVo, removeOtherDistrict: Boolean,
+ removeNoPollutedSource: Boolean, minPer: Double?,
+ ): MissionSummary.Summary {
val clues = mutableListOf<PollutedClue?>()
val missions = missionRep.findByAreaAndTime(areaVo, startTime, endTime).onEach {
it ?: return@onEach
- val clue = sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime, MsgType.PolClue) as List<PollutedClue?>
+ val clue = sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime, MsgType.PolClue, minPer ?: 0.5) as List<PollutedClue?>
clues.addAll(clue)
}
+ filterClue(areaVo, clues, removeOtherDistrict, removeNoPollutedSource)
val summary = MissionSummary().execute(startTime, endTime, missions, clues)
return summary
}
- override fun generateMissionSummary(missionCode: String): MissionSummary.Summary {
+ override fun generateMissionSummary(
+ missionCode: String, minPer: Double?,
+ ): 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 clues = sourceTraceRep.fetchList(
+ mission.deviceCode,
+ mission.startTime,
+ mission.endTime,
+ MsgType.PolClue,
+ minPer ?: 0.5,
+ ) as List<PollutedClue?>
val summary = MissionSummary().execute(mission.startTime, mission.endTime, listOf(mission), clues)
return summary
}
@@ -124,17 +137,20 @@
* @see MissionRep.findByAreaAndTime 鍖哄煙鏃堕棿绛涢�夋暟鎹簮
* @see generateMissionList 閲嶈浇鏂规硶锛屽鐞嗗凡鍏宠仈鐨勬暟鎹
*/
- override fun generateMissionList(startTime: Date, endTime: Date, areaVo: AreaVo): List<MissionInventory.MissionInfo> {
-// val missionClues = missionRep.findByAreaAndTime(areaVo, startTime, endTime).filterNotNull().map {
-// it to sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime, MsgType.PolClue) as List<PollutedClue?>
-// }
-// return generateMissionList(missionClues)
+ override fun generateMissionList(
+ startTime: Date, endTime: Date, areaVo: AreaVo, removeOtherDistrict: Boolean,
+ removeNoPollutedSource: Boolean, minPer: Double?,
+ ): List<MissionInventory.MissionInfo> {
val missionCluesData = missionRep.findByAreaAndTime(areaVo, startTime, endTime).filterNotNull().map {
- Triple(
- it,
- sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime, MsgType.PolClue) as List<PollutedClue?>,
- realTimeDataRep.fetchData(it)
- )
+ val clues = sourceTraceRep.fetchList(
+ it.deviceCode,
+ it.startTime,
+ it.endTime,
+ MsgType.PolClue,
+ minPer ?: 0.5
+ ) as List<PollutedClue?>
+ filterClue(areaVo, clues.toMutableList(), removeOtherDistrict, removeNoPollutedSource)
+ Triple(it, clues, realTimeDataRep.fetchData(it))
}
val keyScenes = sceneInfoRep.findBySceneTypes(
listOf(
@@ -182,13 +198,20 @@
endTime: Date,
areaVo: AreaVo,
granularity: String?,
+ removeOtherDistrict: Boolean,
+ removeNoPollutedSource: Boolean,
+ minPer: Double?,
): List<MissionInventory.MissionDetail> {
val missionCluesData = missionRep.findByAreaAndTime(areaVo, startTime, endTime).filterNotNull().map {
- Triple(
- it,
- sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime, MsgType.PolClue) as List<PollutedClue?>,
- realTimeDataRep.fetchData(it)
- )
+ val clues = sourceTraceRep.fetchList(
+ it.deviceCode,
+ it.startTime,
+ it.endTime,
+ MsgType.PolClue,
+ minPer ?: 0.5
+ ) as List<PollutedClue?>
+ filterClue(areaVo, clues.toMutableList(), removeOtherDistrict, removeNoPollutedSource)
+ Triple(it, clues, realTimeDataRep.fetchData(it))
}
val keyScenes = sceneInfoRep.findBySceneTypes(
listOf(
@@ -200,9 +223,19 @@
return generateMissionDetail(keyScenes, missionCluesData, granularity ?: "MINUTE")
}
- override fun generateMissionDetail(missionCode: String, granularity: String?): MissionInventory.MissionDetail {
+ override fun generateMissionDetail(
+ missionCode: String,
+ granularity: String?,
+ minPer: Double?,
+ ): 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 missionClues = sourceTraceRep.fetchList(
+ mission.deviceCode,
+ mission.startTime,
+ mission.endTime,
+ MsgType.PolClue,
+ minPer ?: 0.5
+ ) as List<PollutedClue?>
val realTimeData = realTimeDataRep.fetchData(mission)
val keyScenes = sceneInfoRep.findBySceneTypes(
listOf(
@@ -236,26 +269,45 @@
startTime: Date,
endTime: Date,
areaVo: AreaVo,
- ): List<MissionRiskArea.ClueByArea> {
+ removeOtherDistrict: Boolean,
+ removeNoPollutedSource: Boolean,
+ minPer: Double?,
+ ): List<MissionRiskArea.ClassifyClue> {
val clues = mutableListOf<PollutedClue?>()
missionRep.findByAreaAndTime(areaVo, startTime, endTime).onEach {
it ?: return@onEach
- val clue = sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime, MsgType.PolClue) as List<PollutedClue?>
+ val clue = sourceTraceRep.fetchList(
+ it.deviceCode,
+ it.startTime,
+ it.endTime,
+ MsgType.PolClue,
+ minPer ?: 0.5
+ ) as List<PollutedClue?>
clues.addAll(clue)
}
-// val keyScenes = sceneInfoRep.findBySceneTypes(
-// listOf(
-// SceneType.TYPE19.value,
-// SceneType.TYPE20.value,
-// SceneType.TYPE21.value
-// )
-// )
+// if (removeOtherDistrict) {
+// clues.removeIf {
+// !areaVo.districtName.isNullOrBlank() &&
+// (it?.pollutedArea?.address.isNullOrBlank()
+// || !it!!.pollutedArea!!.address!!.contains(areaVo.districtName!!))
+// }
+// }
+// if (removeNoPollutedSource) {
+// clues.removeIf { it?.pollutedSource?.sceneList.isNullOrEmpty() }
+// }
+ filterClue(areaVo, clues, removeOtherDistrict, removeNoPollutedSource)
return MissionRiskArea().generateClueByRiskArea(clues)
}
- override fun generateClueByRiskArea(missionCode: String): List<MissionRiskArea.ClueByArea> {
+ override fun generateClueByRiskArea(missionCode: String, minPer: Double?): 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 pollutedClues = sourceTraceRep.fetchList(
+ mission.deviceCode,
+ mission.startTime,
+ mission.endTime,
+ MsgType.PolClue,
+ minPer ?: 0.5
+ ) as List<PollutedClue?>
val keyScenes = sceneInfoRep.findBySceneTypes(
listOf(
SceneType.TYPE19.value,
@@ -278,6 +330,9 @@
startTime: Date,
endTime: Date,
areaVo: AreaVo,
+ removeOtherDistrict: Boolean,
+ removeNoPollutedSource: Boolean,
+ minPer: Double?,
): List<MissionGridFusion.GridFusionByAQI> {
val gridLen = 100
// 鏌ヨ100绫崇綉鏍肩殑鍏蜂綋缃戞牸鏁版嵁
@@ -297,8 +352,9 @@
val gridDataDetailList = missionGroups.mapNotNull { (degree, missionList) ->
// 绛涢�夊嚭鏈夌綉鏍艰瀺鍚堟暟鎹殑璧拌埅浠诲姟(鍚屾椂鑾峰彇瀵瑰簲鐨勮瀺鍚堟暟鎹甶d鍒楄〃)
val gridDataIds = mutableListOf<Int>()
- val validMissions = missionList.filter {mission ->
- val gridData = satelliteGridRep.fetchGridData(GridData().apply { missionCode = mission?.missionCode }).firstOrNull()
+ val validMissions = missionList.filter { mission ->
+ val gridData =
+ satelliteGridRep.fetchGridData(GridData().apply { missionCode = mission?.missionCode }).firstOrNull()
val res = gridData != null
if (res) gridDataIds.add(gridData?.id ?: 0)
res
@@ -307,11 +363,15 @@
val gridDataDetailMixVos = satelliteDataCalculateService.mixUnderwayGridData(gridGroup.id, gridDataIds)
// 缁熻姣忎釜璧拌埅浠诲姟鐨勮蛋鑸鎯呬俊鎭�
val missionCluesData = validMissions.filterNotNull().map {
- Triple(
- it,
- sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime, MsgType.PolClue) as List<PollutedClue?>,
- realTimeDataRep.fetchData(it)
- )
+ val clues = sourceTraceRep.fetchList(
+ it.deviceCode,
+ it.startTime,
+ it.endTime,
+ MsgType.PolClue,
+ minPer ?: 0.5
+ ) as List<PollutedClue?>
+ filterClue(areaVo, clues.toMutableList(), removeOtherDistrict, removeNoPollutedSource)
+ Triple(it, clues, realTimeDataRep.fetchData(it))
}
val keyScenes = sceneInfoRep.findBySceneTypes(
listOf(
@@ -336,4 +396,26 @@
): List<MissionGridFusion.GridFusionByAQI> {
return MissionGridFusion(sceneInfoRep).generateGridFusion(factorTypes, gridLen, gridCells, dataList)
}
+
+ private fun filterClue(
+ areaVo: AreaVo, clues: MutableList<PollutedClue?>, removeOtherDistrict: Boolean,
+ removeNoPollutedSource: Boolean,
+ ) {
+ if (removeOtherDistrict) {
+ clues.removeIf {
+ !areaVo.districtName.isNullOrBlank() &&
+ (it?.pollutedArea?.address.isNullOrBlank()
+ || !it!!.pollutedArea!!.address!!.contains(areaVo.districtName!!))
+ }
+ clues.forEach {
+ it?.pollutedSource?.sceneList = it?.pollutedSource?.sceneList?.filter { s->
+ s.districtCode == areaVo.districtCode
+ }
+ }
+ }
+ if (removeNoPollutedSource) {
+ clues.removeIf { it?.pollutedSource?.sceneList.isNullOrEmpty() }
+ }
+
+ }
}
\ No newline at end of file
--
Gitblit v1.9.3