src/main/kotlin/com/flightfeather/uav/domain/repository/SatelliteGridRep.kt
@@ -114,7 +114,7 @@ return res } fun fetchGridDataDetail(dataId: Int?, groupId: Int?, cellId: Int?): List<GridDataDetail?> { fun fetchGridDataDetail(dataId: Int? = null, groupId: Int? = null, cellId: Int? = null): List<GridDataDetail?> { return gridDataDetailMapper.selectByExample(Example(GridDataDetail::class.java).apply { createCriteria().andEqualTo("dataId", dataId) .andEqualTo("groupId", groupId) src/main/kotlin/com/flightfeather/uav/lightshare/bean/GridDataDetailMixVo.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.flightfeather.uav.lightshare.bean import com.flightfeather.uav.domain.entity.GridDataDetail /** * ç½æ ¼æ°æ®èåç»æ * @date 2025/3/28 * @author feiyu02 */ class GridDataDetailMixVo : GridDataDetail() { // æ¯å¦æ¯èååçç½æ ¼çæµæ°æ® var mixData: Boolean = false var originDataList: MutableList<GridDataDetail> = mutableListOf() } src/main/kotlin/com/flightfeather/uav/lightshare/service/SatelliteDataCalculateService.kt
@@ -2,6 +2,7 @@ import com.flightfeather.uav.domain.entity.GridCell import com.flightfeather.uav.domain.entity.GridDataDetail import com.flightfeather.uav.lightshare.bean.GridDataDetailMixVo /** * @@ -38,6 +39,14 @@ fun dataFusion(missionCode: String, groupId: Int): List<GridDataDetail?> /** * èµ°èªæ°æ®èå * @param groupId 使ç¨çç½æ ¼ç»id * @param dataIdList èåçæ°æ®idç´¢å¼æ°ç» */ // Fixme 2025.3.28: éè¦å[SatelliteTelemetryService.mixGridData]彿°åå¹¶ fun mixGridData(groupId: Int, dataIdList: List<Int>): List<GridDataDetailMixVo> /** * å°èµ°èªç½æ ¼æ°æ®çæå¯¹åºççåç½æ ¼å¾ * @param groupId 使ç¨çç½æ ¼ç»id * @param gridDataDetailList 使ç¨çèµ°èªç½æ ¼æ°æ® src/main/kotlin/com/flightfeather/uav/lightshare/service/SatelliteTelemetryService.kt
@@ -40,6 +40,7 @@ /** * æ°æ®èå */ // Fixme 2025.3.28: éè¦å[SatelliteDataCalculateService.mixGridData]彿°åå¹¶ fun mixGridData(dataIdList: List<Int>): List<GridData?> @Throws(BizException::class) src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt
@@ -2,13 +2,13 @@ import com.flightfeather.uav.biz.satellite.GridGroupOption import com.flightfeather.uav.biz.satellite.SatelliteGridManage import com.flightfeather.uav.biz.satellite.SatelliteGridUtil import com.flightfeather.uav.common.exception.BizException import com.flightfeather.uav.common.utils.TimeUtil import com.flightfeather.uav.domain.entity.* import com.flightfeather.uav.domain.repository.MissionRep import com.flightfeather.uav.domain.repository.RealTimeDataRep import com.flightfeather.uav.domain.repository.SatelliteGridRep import com.flightfeather.uav.lightshare.bean.GridDataDetailMixVo import com.flightfeather.uav.lightshare.eunm.GridType import com.flightfeather.uav.lightshare.eunm.SatelliteDataType import com.flightfeather.uav.lightshare.service.SatelliteDataCalculateService @@ -110,12 +110,13 @@ @Transactional override fun splitData(groupId: Int, dataId:Int): List<GridDataDetail?> { // æ£æ¥æ¯å¦æ¯ç»åç½æ ¼ç±»å val gridGroup = satelliteGridRep.fetchGridGroup(groupId) ?: throw BizException("è¯¥ç½æ ¼ç»ä¸åå¨ï¼æ æ³è¿è¡ç»åç½æ ¼æ°æ®æ å°") val gridGroup = satelliteGridRep.fetchGridGroup(groupId) ?: throw BizException("è¯¥ç½æ ¼ç»ä¸åå¨ï¼æ æ³è¿è¡ç»åç½æ ¼æ°æ®æ å°") if (gridGroup.type != GridType.Sub.name.lowercase()) throw BizException("è¯¥ç½æ ¼ç»ä¸æ¯ç»åç½æ ¼ç±»ååå¨ï¼æ æ³è¿è¡ç»åç½æ ¼æ°æ®æ å°") val subGridCellList = satelliteGridRep.fetchGridCell(groupId) val originGridData = satelliteGridRep.fetchGridData(dataId) val originGridDataDetailList = satelliteGridRep.fetchGridDataDetail(dataId, null, null) val originGridDataDetailList = satelliteGridRep.fetchGridDataDetail(dataId) val subGridData = GridData().apply { this.groupId = groupId @@ -181,8 +182,7 @@ return gridDataDetailList } else { val oldGridData = oldGridDataList.first() val oldGridDataDetailList = satelliteGridRep.fetchGridDataDetail(oldGridData?.id, oldGridData?.groupId, null) val oldGridDataDetailList = satelliteGridRep.fetchGridDataDetail(oldGridData?.id, oldGridData?.groupId) // æ¥è¯¢ç½æ ¼åå æ ¼ä¿¡æ¯ val gridCellList = satelliteGridRep.fetchGridCell(groupId) // å°èµ°èªæ°æ®åå«æç½æ ¼è¿è¡èåè®¡ç® @@ -199,7 +199,55 @@ } } override fun buildHeatmap(groupId: Int, gridDataDetailList: List<GridDataDetail>, searchLength:Int): List<GridDataDetail> { override fun mixGridData(groupId: Int, dataIdList: List<Int>): List<GridDataDetailMixVo> { // è·åæä½¿ç¨çç½æ ¼ç»ç½æ ¼ä¿¡æ¯ val gridCellList = satelliteGridRep.fetchGridCell(groupId) val gridDataDetailMap = mutableMapOf<Int?, MutableList<GridDataDetail>>() // å½éææç¸ååå ç½æ ¼çæ°æ® dataIdList.forEach { id -> satelliteGridRep.fetchGridDataDetail(id, groupId).forEach gdd@{ gdd -> if (gdd == null) return@gdd if (!gridDataDetailMap.containsKey(gdd.cellId)) { gridDataDetailMap[gdd.cellId] = mutableListOf() } gridDataDetailMap[gdd.cellId]?.add(gdd) } } // å°ææç»ææ ¼å¼åï¼åæ¶éå ç½æ ¼è¿è¡çæµæ°æ®åå¼è®¡ç® val result = mutableListOf<GridDataDetailMixVo>() gridDataDetailMap.forEach { (_, v) -> val target = GridDataDetailMixVo() if (v.size == 1) { BeanUtils.copyProperties(v[0], target) } else { BeanUtils.copyProperties(v.avg(), target) target.mixData = true target.originDataList = v } target.apply { this.dataId = v.first().dataId this.groupId = v.first().groupId this.cellId = v.first().cellId } result.add(target) } result.sortBy { it.pm25 } result.forEachIndexed { index, d -> d.rank = index + 1 } result.sortBy { it.cellId } return result } override fun buildHeatmap( groupId: Int, gridDataDetailList: List<GridDataDetail>, searchLength: Int, ): List<GridDataDetail> { val gridCellList = satelliteGridRep.fetchGridCell(groupId) val originCellIdList = gridDataDetailList.map { it.cellId } // Fixme 2025.3.24: æ¤å¤æ ¹æ®ç°æçç½æ ¼ä¿¡æ¯è®¾è®¡æ¹å¼ï¼ä½¿ç¨ä¸´æ¶çåæ°ï¼åç»å°ç½æ ¼éè¿äºç»´åæ å½¢å¼è¡¨ç¤ºï¼æ¤å¤åæ°å»é¤ src/main/kotlin/com/flightfeather/uav/lightshare/web/SatelliteTelemetryController.kt
@@ -24,7 +24,7 @@ @RequestMapping("air/satellite") class SatelliteTelemetryController( private val satelliteTelemetryService: SatelliteTelemetryService, private val satelliteDataCalculateService: SatelliteDataCalculateService private val satelliteDataCalculateService: SatelliteDataCalculateService, ) { @ApiOperation(value = "è·åç½æ ¼ç»ä¿¡æ¯") @@ -33,7 +33,7 @@ @RequestBody areaVo: AreaVo, @RequestParam(required = false) type: String?, @RequestParam("page", required = false) page: Int?, @RequestParam("per_page", required = false) perPage: Int? @RequestParam("per_page", required = false) perPage: Int?, ) = resPack { satelliteTelemetryService.fetchGridGroup(areaVo, type, page, perPage) } @ApiOperation(value = "è·åç½æ ¼ç»å å ·ä½ç½æ ¼ä¿¡æ¯") @@ -48,7 +48,10 @@ @ApiParam("ç½æ ¼ç»id") @RequestParam groupId: Int, @ApiParam("饿µæ°æ®æ¶é´") @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") dataTime: LocalDateTime?, @ApiParam("饿µæ°æ®ç±»å", allowableValues = "0ï¼åå§å«æé¥æµæ°æ®ï¼1ï¼èåæ°æ®") @RequestParam(required = false) type: Int?, @ApiParam( "饿µæ°æ®ç±»å", allowableValues = "0ï¼åå§å«æé¥æµæ°æ®ï¼1ï¼èåæ°æ®" ) @RequestParam(required = false) type: Int?, ) = resPack { satelliteTelemetryService.fetchGridData(groupId, dataTime, type) } @ApiOperation(value = "è·åç½æ ¼ç»ä¸ç嫿饿µå ·ä½æ°æ®") @@ -65,7 +68,7 @@ @ApiParam("ç½æ ¼ç»id") @RequestParam groupId: Int, @ApiParam("饿µæ°æ®æ¶é´") @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") dateTime: LocalDateTime, @RequestBody gridDataDetail: List<GridDataDetail> @RequestBody gridDataDetail: List<GridDataDetail>, ) = resPack { satelliteTelemetryService.createGridDataAndDataDetail(groupId, dateTime, gridDataDetail) } @@ -74,7 +77,7 @@ @ApiOperation(value = "夿¬¡èµ°èªæ°æ®è¿è¡èå计ç®") @PostMapping("/grid/data/mix") fun mixGridData( @ApiParam("åå§æ°æ®idæ°ç»") @RequestBody dataIdList: List<Int> @ApiParam("åå§æ°æ®idæ°ç»") @RequestBody dataIdList: List<Int>, ) = resPack { satelliteTelemetryService.mixGridData(dataIdList) } @@ -92,7 +95,8 @@ @ApiOperation(value = "ä¸è½½å«æé¥æµPM2.5ç»ææ°æ®å¯¼å ¥æ¨¡æ¿") @GetMapping("/import/grid/data/download/template") fun downloadTemplate(@ApiIgnore response: HttpServletResponse) = satelliteTelemetryService.downloadTemplate(response) fun downloadTemplate(@ApiIgnore response: HttpServletResponse) = satelliteTelemetryService.downloadTemplate(response) @ApiOperation(value = "å¯¼å ¥å«æé¥æµAodç»ææ°æ®") @PostMapping("/import/grid/aod") @@ -108,7 +112,8 @@ @ApiOperation(value = "ä¸è½½å«æé¥æµAodç»ææ°æ®å¯¼å ¥æ¨¡æ¿") @GetMapping("/import/grid/aod/download/template") fun downloadAODTemplate(@ApiIgnore response: HttpServletResponse) = satelliteTelemetryService.downloadAODTemplate(response) fun downloadAODTemplate(@ApiIgnore response: HttpServletResponse) = satelliteTelemetryService.downloadAODTemplate(response) /**AODæ°æ®ç¸å ³**************************************************************/ @@ -145,11 +150,18 @@ @ApiParam("ç½æ ¼ç»id") @RequestParam groupId: Int, ) = resPack { satelliteDataCalculateService.dataFusion(missionCode, groupId) } @ApiOperation(value = "è¿è¡èµ°èªèå产åçèååæ") @PostMapping("/product/underway/mix") fun mixGridData( @ApiParam("ç½æ ¼ç»id") @RequestParam groupId: Int, @ApiParam("éè¦èåçæ°æ®id") @RequestBody dataIdList: List<Int>, ) = resPack { satelliteDataCalculateService.mixGridData(groupId, dataIdList) } @ApiOperation(value = "çæèµ°èªçåå¾") @PostMapping("/product/underway/heatmap/build") fun buildUnderwayHeatmap( @ApiParam("使ç¨çç½æ ¼ç»id") @RequestParam groupId: Int, @ApiParam("æç´¢ç½æ ¼è·ç¦»") @RequestParam searchLength:Int, @ApiParam("使ç¨çèµ°èªç½æ ¼æ°æ®") @RequestBody gridDataDetailList: List<GridDataDetail> @ApiParam("使ç¨çèµ°èªç½æ ¼æ°æ®") @RequestBody gridDataDetailList: List<GridDataDetail>, ) = resPack { satelliteDataCalculateService.buildHeatmap(groupId, gridDataDetailList, searchLength) } }