From eb3dd00b0b7fcda477229d518d250f9c842b790b Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期二, 21 十月 2025 17:45:44 +0800
Subject: [PATCH] 2025.10.21 1. 走航季度报告相关数据计算逻辑调整
---
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt | 172 ++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 132 insertions(+), 40 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 0dcbb4a..bb19140 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
@@ -23,7 +23,6 @@
import com.flightfeather.uav.socket.eunm.FactorType
import com.flightfeather.uav.socket.sender.MsgType
import org.springframework.stereotype.Service
-import tk.mybatis.mapper.entity.Example
import java.util.*
/**
@@ -43,7 +42,7 @@
private val sourceTraceRep: SourceTraceRep,
private val sceneInfoRep: SceneInfoRep,
private val satelliteGridRep: SatelliteGridRep,
- private val satelliteDataCalculateService: SatelliteDataCalculateService
+ private val satelliteDataCalculateService: SatelliteDataCalculateService,
) : DataAnalysisService {
/**
@@ -108,6 +107,18 @@
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
+ }
+
/**
* 鐢熸垚璧拌埅浠诲姟娓呭崟锛堟寜鏃堕棿鍜屽尯鍩熺瓫閫夛級
* 鏍规嵁鏃堕棿鑼冨洿鍜岃鏀垮尯鍒掓煡璇㈣蛋鑸换鍔★紝骞跺叧鑱旀薄鏌撶嚎绱㈡暟鎹敓鎴愪换鍔″垪琛�
@@ -119,34 +130,10 @@
* @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)
- }
-
- /**
- * 鐢熸垚璧拌埅浠诲姟娓呭崟锛堢洿鎺ュ鐞嗕换鍔℃暟鎹級
- * 鎺ユ敹宸插叧鑱旂殑浠诲姟-姹℃煋绾跨储鏁版嵁瀵癸紝鐢熸垚鏍煎紡鍖栫殑浠诲姟鍒楄〃
- * @param missionClues 浠诲姟-姹℃煋绾跨储鏁版嵁瀵瑰垪琛紝Pair.first涓轰换鍔″璞★紝Pair.second涓哄搴旀薄鏌撶嚎绱�
- * @return 鏍囧噯鍖栫殑璧拌埅浠诲姟淇℃伅鍒楄〃锛屽寘鍚换鍔″熀鏈睘鎬у拰姹℃煋缁熻淇℃伅
- * @see MissionInventory 浠诲姟娓呭崟鐢熸垚鍣紝灏佽鍏蜂綋鏍煎紡鍖栭�昏緫
- */
- override fun generateMissionList(missionClues: List<Pair<Mission, List<PollutedClue?>>>): List<MissionInventory.MissionInfo> {
- return MissionInventory().generateMissionList(missionClues)
- }
-
- /**
- * 鐢熸垚璧拌埅浠诲姟璇︽儏锛堟寜鏃堕棿鍜屽尯鍩熺瓫閫夛級
- * 鏍规嵁鏃堕棿鑼冨洿鍜岃鏀垮尯鍒掓煡璇换鍔★紝鏁村悎瀹炴椂鐩戞祴鏁版嵁鐢熸垚璇︾粏浠诲姟鎶ュ憡
- * @param startTime 鏌ヨ璧峰鏃堕棿锛堝寘鍚級
- * @param endTime 鏌ヨ缁撴潫鏃堕棿锛堝寘鍚級
- * @param areaVo 鍖哄煙鍙傛暟锛屽寘鍚渷銆佸競銆佸尯缂栫爜
- * @return 浠诲姟璇︽儏鍒楄〃锛屾瘡涓厓绱犲寘鍚换鍔″畬鏁翠俊鎭�佹薄鏌撶嚎绱㈠強瀹炴椂鐩戞祴鏁版嵁
- * @see MissionRep.findByAreaAndTime 鍖哄煙鏃堕棿绛涢�夋暟鎹簮
- * @see realTimeDataRep.fetchData 瀹炴椂鏁版嵁鑾峰彇鎺ュ彛
- */
- override fun generateMissionDetail(startTime: Date, endTime: Date, areaVo: AreaVo): List<MissionInventory.MissionDetail> {
+// 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)
val missionCluesData = missionRep.findByAreaAndTime(areaVo, startTime, endTime).filterNotNull().map {
Triple(
it,
@@ -161,7 +148,80 @@
SceneType.TYPE21.value
)
)
- return generateMissionDetail(keyScenes, missionCluesData)
+ return generateMissionInfo(keyScenes, missionCluesData)
+ }
+
+ /**
+ * 鐢熸垚璧拌埅浠诲姟娓呭崟锛堢洿鎺ュ鐞嗕换鍔℃暟鎹級
+ * 鎺ユ敹宸插叧鑱旂殑浠诲姟-姹℃煋绾跨储鏁版嵁瀵癸紝鐢熸垚鏍煎紡鍖栫殑浠诲姟鍒楄〃
+ * @param missionClues 浠诲姟-姹℃煋绾跨储鏁版嵁瀵瑰垪琛紝Pair.first涓轰换鍔″璞★紝Pair.second涓哄搴旀薄鏌撶嚎绱�
+ * @return 鏍囧噯鍖栫殑璧拌埅浠诲姟淇℃伅鍒楄〃锛屽寘鍚换鍔″熀鏈睘鎬у拰姹℃煋缁熻淇℃伅
+ * @see MissionInventory 浠诲姟娓呭崟鐢熸垚鍣紝灏佽鍏蜂綋鏍煎紡鍖栭�昏緫
+ */
+ override fun generateMissionList(missionClues: List<Pair<Mission, List<PollutedClue?>>>): List<MissionInventory.MissionInfo> {
+ return MissionInventory().generateMissionList(missionClues)
+ }
+
+ override fun generateMissionInfo(
+ keyScenes: List<SceneInfo?>,
+ missionCluesData: List<Triple<Mission, List<PollutedClue?>, List<BaseRealTimeData>>>,
+ ): List<MissionInventory.MissionInfo> {
+ return missionCluesData.map {
+ MissionInventory().generateMissionInfo(keyScenes, it.first, it.second, it.third)
+ }
+ }
+
+ /**
+ * 鐢熸垚璧拌埅浠诲姟璇︽儏锛堟寜鏃堕棿鍜屽尯鍩熺瓫閫夛級
+ * 鏍规嵁鏃堕棿鑼冨洿鍜岃鏀垮尯鍒掓煡璇换鍔★紝鏁村悎瀹炴椂鐩戞祴鏁版嵁鐢熸垚璇︾粏浠诲姟鎶ュ憡
+ * @param startTime 鏌ヨ璧峰鏃堕棿锛堝寘鍚級
+ * @param endTime 鏌ヨ缁撴潫鏃堕棿锛堝寘鍚級
+ * @param areaVo 鍖哄煙鍙傛暟锛屽寘鍚渷銆佸競銆佸尯缂栫爜
+ * @param granularity 鏁版嵁棰楃矑搴︼紝鍙�夊�间负SECOND, MINUTE, HOUR, 榛樿MINUTE
+ * @return 浠诲姟璇︽儏鍒楄〃锛屾瘡涓厓绱犲寘鍚换鍔″畬鏁翠俊鎭�佹薄鏌撶嚎绱㈠強瀹炴椂鐩戞祴鏁版嵁
+ * @see MissionRep.findByAreaAndTime 鍖哄煙鏃堕棿绛涢�夋暟鎹簮
+ * @see realTimeDataRep.fetchData 瀹炴椂鏁版嵁鑾峰彇鎺ュ彛
+ */
+ override fun generateMissionDetail(
+ startTime: Date,
+ endTime: Date,
+ areaVo: AreaVo,
+ granularity: String?,
+ ): 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 keyScenes = sceneInfoRep.findBySceneTypes(
+ listOf(
+ SceneType.TYPE19.value,
+ SceneType.TYPE20.value,
+ SceneType.TYPE21.value
+ )
+ )
+ return generateMissionDetail(keyScenes, missionCluesData, granularity ?: "MINUTE")
+ }
+
+ override fun generateMissionDetail(missionCode: String, granularity: 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, granularity ?: "MINUTE")
}
/**
@@ -175,9 +235,10 @@
override fun generateMissionDetail(
keyScenes: List<SceneInfo?>,
missionCluesData: List<Triple<Mission, List<PollutedClue?>, List<BaseRealTimeData>>>,
+ granularity: String,
): List<MissionInventory.MissionDetail> {
return missionCluesData.map {
- MissionInventory().generateMissionDetail(keyScenes, it.first, it.second, it.third)
+ MissionInventory().generateMissionDetail(keyScenes, it.first, it.second, it.third, granularity)
}
}
@@ -185,13 +246,43 @@
startTime: Date,
endTime: Date,
areaVo: AreaVo,
- ): List<MissionRiskArea.ClueByArea> {
+ removeOtherDistrict: Boolean,
+ removeNoPollutedSource: Boolean,
+ ): 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?>
clues.addAll(clue)
}
+ 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() }
+ }
+// val keyScenes = sceneInfoRep.findBySceneTypes(
+// listOf(
+// SceneType.TYPE19.value,
+// SceneType.TYPE20.value,
+// SceneType.TYPE21.value
+// )
+// )
+ return MissionRiskArea().generateClueByRiskArea(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,
@@ -199,14 +290,14 @@
SceneType.TYPE21.value
)
)
- return generateClueByRiskArea(keyScenes, clues)
+ return generateClueByRiskArea(keyScenes, pollutedClues)
}
override fun generateClueByRiskArea(
keyScenes: List<SceneInfo?>,
pollutedClues: List<PollutedClue?>,
): List<MissionRiskArea.ClueByArea> {
- return MissionRiskArea().generateClueByRiskArea(keyScenes, pollutedClues)
+ return MissionRiskArea().generateClueByKeyRiskScene(keyScenes, pollutedClues)
}
override fun generateGridFusion(
@@ -233,8 +324,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
@@ -256,9 +348,9 @@
SceneType.TYPE21.value
)
)
- val missionDetails = generateMissionDetail(keyScenes, missionCluesData)
+ val missionInfos = generateMissionInfo(keyScenes, missionCluesData)
- return@mapNotNull Triple(degree, missionDetails, gridDataDetailMixVos)
+ return@mapNotNull Triple(degree, missionInfos, gridDataDetailMixVos)
}.filter { it.second.isNotEmpty() }
return generateGridFusion(factorTypes, gridLen, gridCells, gridDataDetailList)
@@ -268,7 +360,7 @@
factorTypes: List<FactorType>,
gridLen: Int,
gridCells: List<GridCell>,
- dataList: List<Triple<PollutionDegree, List<MissionInventory.MissionDetail>, List<GridDataDetailMixVo>>>,
+ dataList: List<Triple<PollutionDegree, List<MissionInventory.MissionInfo>, List<GridDataDetailMixVo>>>,
): List<MissionGridFusion.GridFusionByAQI> {
return MissionGridFusion(sceneInfoRep).generateGridFusion(factorTypes, gridLen, gridCells, dataList)
}
--
Gitblit v1.9.3