2025.9.4
1. 新增走航任务统计功能(待完成)
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.biz.report |
| | | |
| | | import com.flightfeather.uav.common.net.AMapService |
| | | import com.flightfeather.uav.common.utils.MapUtil |
| | | import com.flightfeather.uav.domain.entity.GridCell |
| | | import com.flightfeather.uav.domain.entity.SceneInfo |
| | | import com.flightfeather.uav.domain.entity.getByFactorType |
| | | import com.flightfeather.uav.domain.repository.SceneInfoRep |
| | | import com.flightfeather.uav.lightshare.bean.GridDataDetailMixVo |
| | | import com.flightfeather.uav.lightshare.eunm.PollutionDegree |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | |
| | | /** |
| | | * èµ°èªç½æ ¼å å |
| | | * @date 2025/9/4 |
| | | * @author feiyu02 |
| | | */ |
| | | class MissionGridFusion(private val sceneInfoRep: SceneInfoRep) { |
| | | |
| | | /** |
| | | * æAQIç级å å ç½æ ¼ |
| | | */ |
| | | class GridFusionByAQI { |
| | | var pollutionDegree: String? = null |
| | | var gridLen:Int? = null |
| | | var missionList: MutableList<MissionInventory.MissionDetail> = mutableListOf() |
| | | var gridFusionList: MutableList<FusionGrid> = mutableListOf() |
| | | var highRiskGridList: MutableList<HighRiskGridByFactor> = mutableListOf() |
| | | } |
| | | |
| | | /** |
| | | * å å ç½æ ¼ |
| | | */ |
| | | class FusionGrid( |
| | | val cell: GridCell, |
| | | val data: GridDataDetailMixVo, |
| | | ) |
| | | |
| | | /** |
| | | * çæµå åçé«é£é©å å ç½æ ¼ |
| | | */ |
| | | class HighRiskGridByFactor{ |
| | | // å åç±»å |
| | | var factorType: FactorType? = null |
| | | // é«é£é©ç½æ ¼ä¿¡æ¯ |
| | | var highRiskGrid: FusionGrid? = null |
| | | // å åå¼ |
| | | var factorValue: Float? = null |
| | | // æ¶åçè¡é |
| | | var town: String? = null |
| | | // åè³èå´ï¼é¡ºåºä¸ºæå°ç»åº¦ï¼æå¤§ç»åº¦, æå°çº¬åº¦ï¼æå¤§çº¬åº¦ |
| | | var bounds: List<Double>? = null |
| | | // é«é£é©åºæ¯å表 |
| | | var highRiskScenes:List<SceneInfo?>? = null |
| | | } |
| | | |
| | | /** |
| | | * çæç½æ ¼èåæ°æ®ï¼æAQIç级åç»å¹¶è®¡ç®åçæµå åçé«é£é©åºå |
| | | * |
| | | * @param factorTypes éè¦åæççæµå åç±»åå表 |
| | | * @param gridLen ç½æ ¼è¾¹é¿(ç±³) |
| | | * @param gridCells ç½æ ¼åå
å表ï¼å
å«ç½æ ¼çå°çä¿¡æ¯åç´¢å¼ |
| | | * @param dataList ä¸å
ç»åè¡¨ï¼æ¯ä¸ªå
ç´ å
å«ï¼ |
| | | * - 污æç级(PollutionDegree) |
| | | * - èµ°èªä»»å¡è¯¦æ
å表(MissionDetail) |
| | | * - ç½æ ¼æ°æ®è¯¦æ
å表(GridDataDetailMixVo) |
| | | * @return æAQIç级åç»çç½æ ¼èåç»æåè¡¨ï¼æ¯ä¸ªå
ç´ å
å«è¯¥ç级ä¸çææç½æ ¼æ°æ®åé«é£é©åæ |
| | | */ |
| | | fun generateGridFusion( |
| | | factorTypes: List<FactorType>, |
| | | gridLen: Int, |
| | | gridCells: List<GridCell>, |
| | | dataList: List<Triple<PollutionDegree, List<MissionInventory.MissionDetail>, List<GridDataDetailMixVo>>>, |
| | | ): List<GridFusionByAQI> { |
| | | return dataList.map { |
| | | GridFusionByAQI().apply { |
| | | pollutionDegree = it.first.des |
| | | this.gridLen = gridLen |
| | | missionList.addAll(it.second) |
| | | gridFusionList.addAll(it.third.map { gdm -> |
| | | val grid = gridCells.find { it.cellIndex == gdm.cellId } |
| | | ?: throw IllegalArgumentException("ç½æ ¼ç»${gdm.groupId}ä¸ï¼åå
ID: ${gdm.cellId} ä¸åå¨") |
| | | FusionGrid(grid, gdm) |
| | | }) |
| | | highRiskGridList.addAll(factorTypes.map { f-> |
| | | HighRiskGridByFactor().apply { |
| | | factorType = f |
| | | highRiskGrid = gridFusionList.sortedBy { gf->gf.data.rank }.firstOrNull() |
| | | if (highRiskGrid != null) { |
| | | factorValue = highRiskGrid!!.data.getByFactorType(f) |
| | | if (highRiskGrid!!.cell.longitude != null && highRiskGrid!!.cell.latitude != null) { |
| | | Thread.sleep(50) |
| | | val address = AMapService.reGeo(MapUtil.wgs84ToGcj02( |
| | | highRiskGrid!!.cell.longitude.toDouble() |
| | | to highRiskGrid!!.cell.latitude.toDouble() |
| | | )) |
| | | town = address.township + address.street |
| | | } |
| | | val polygon = listOf( |
| | | highRiskGrid!!.cell.point1Lon.toDouble() to highRiskGrid!!.cell.point1Lat.toDouble(), |
| | | highRiskGrid!!.cell.point2Lon.toDouble() to highRiskGrid!!.cell.point2Lat.toDouble(), |
| | | highRiskGrid!!.cell.point3Lon.toDouble() to highRiskGrid!!.cell.point3Lat.toDouble(), |
| | | highRiskGrid!!.cell.point4Lon.toDouble() to highRiskGrid!!.cell.point4Lat.toDouble(), |
| | | ) |
| | | bounds = MapUtil.calFourBoundaries(polygon) |
| | | highRiskScenes = sceneInfoRep.findByPolygon(polygon) |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | Triple(degree, count, count.toDouble() / totalCount) |
| | | } |
| | | |
| | | // 6. é®é¢ç¸å
³ç»è®¡ï¼ç¤ºä¾ï¼æ¤å¤å设éå
³èå
¶ä»è¡¨ï¼æè¿å0ï¼å®é
éæ ¹æ®ä¸å¡è¡¥å
ï¼ |
| | | // 6. é®é¢ç¸å
³ç»è®¡ |
| | | val clueRes = calClue(clues) |
| | | val probCount = clueRes.first // éå
³èé®é¢è¡¨ç»è®¡ |
| | | val highRiskSceneCount = clueRes.second // éå
³èåºæ¯è¡¨ç»è®¡ |
| | |
| | | } |
| | | |
| | | private fun calClue(clues: List<PollutedClue?>): Triple<Int, Int, List<Triple<String, Int, Double>>> { |
| | | var probCount = 0 // éå
³èé®é¢è¡¨ç»è®¡ |
| | | var highRiskSceneCount = 0 // éå
³èåºæ¯è¡¨ç»è®¡ |
| | | val probByFactorMap = mutableMapOf<FactorType, Int>() // éå
³èå å表ç»è®¡ |
| | | var probCount = 0 |
| | | var highRiskSceneCount = 0 |
| | | val probByFactorMap = mutableMapOf<FactorType, Int>() |
| | | clues.forEach { c -> |
| | | if (c?.msgType == MsgType.PolClue.value) { |
| | | c.pollutedSource?.sceneList?.size?.let { s -> highRiskSceneCount += s } |
| | |
| | | } |
| | | } |
| | | |
| | | fun GridDataDetail.getByFactorType(type: FactorType?): Float? { |
| | | return when (type) { |
| | | NO2 -> no2 |
| | | CO -> co |
| | | H2S -> h2s |
| | | SO2 -> so2 |
| | | O3 -> o3 |
| | | PM25 -> pm25 |
| | | PM10 -> pm10 |
| | | TEMPERATURE -> temperature |
| | | HUMIDITY -> humidity |
| | | VOC -> voc |
| | | NOI -> noi |
| | | WIND_SPEED -> windSpeed |
| | | WIND_DIRECTION -> windDirection |
| | | NO -> no |
| | | else -> null |
| | | } |
| | | } |
| | | |
| | | fun List<GridDataDetail>.avg(): GridDataDetail { |
| | | //é£åéç¨åä½ç¢éæ³æ±ååå¼ |
| | | var u = .0//ä¸è¥¿æ¹ä½åéæ»å |
| | |
| | | package com.flightfeather.uav.domain.repository |
| | | |
| | | import com.flightfeather.uav.common.utils.MapUtil |
| | | import com.flightfeather.uav.domain.entity.SceneInfo |
| | | import com.flightfeather.uav.domain.mapper.SceneInfoMapper |
| | | import com.flightfeather.uav.lightshare.bean.AreaVo |
| | |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®å¤è¾¹å½¢çéåºæ¯ |
| | | * @param polygon å¤è¾¹å½¢åæ å表ï¼é¡ºåºä¸ºé¡ºæ¶éæéæ¶é(è¦æ±ä½¿ç¨ç«æåæ ç³») |
| | | * @return å¤è¾¹å½¢å
çåºæ¯å表 |
| | | */ |
| | | fun findByPolygon(polygon: List<Pair<Double, Double>>): List<SceneInfo?> { |
| | | // 计ç®å¤è¾¹å½¢åè³èå´ |
| | | val bounds = MapUtil.calFourBoundaries(polygon) |
| | | val sceneList = findByCoordinateRange(bounds) |
| | | // ç鿝å¦å¨ååæº¯æºåºåå¤è¾¹å½¢å
é¨ |
| | | return sceneList.filter { scene -> |
| | | scene ?: false |
| | | val point = scene!!.longitude.toDouble() to scene.latitude.toDouble() |
| | | MapUtil.isPointInPolygon(point, polygon) |
| | | } |
| | | } |
| | | |
| | | fun findBySceneTypes(sceneTypes: List<Int>): List<SceneInfo?> { |
| | | if (sceneTypes.isEmpty()){ |
| | | return emptyList() |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.lightshare.eunm |
| | | |
| | | /** |
| | | * 空æ°è´¨éç级 |
| | | * @date 2025/9/4 |
| | | * @author feiyu02 |
| | | */ |
| | | enum class PollutionDegree(val des: String, val value: Int, val minAqi: Int) { |
| | | AQI_1("ä¼", 1, 0), |
| | | AQI_2("è¯", 2, 51), |
| | | AQI_3("轻度污æ", 3, 101), |
| | | AQI_4("ä¸åº¦æ±¡æ", 4, 151), |
| | | AQI_5("é度污æ", 5, 201), |
| | | AQI_6("䏥鿱¡æ", 6, 301); |
| | | |
| | | companion object { |
| | | fun getByValue(value: Int): PollutionDegree { |
| | | return values().firstOrNull { it.value == value } ?: AQI_1 |
| | | } |
| | | |
| | | fun getByAqi(aqi: Int): PollutionDegree { |
| | | return values().reversed().firstOrNull { it.minAqi <= aqi } ?: AQI_1 |
| | | } |
| | | |
| | | fun getByDes(des: String): PollutionDegree { |
| | | return values().firstOrNull { it.des == des } ?: AQI_1 |
| | | } |
| | | } |
| | | } |
| | |
| | | package com.flightfeather.uav.lightshare.eunm |
| | | |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | |
| | | /** |
| | | * åºæ¯ç±»å |
| | | * @date 2025/6/2 |
| | |
| | | TYPE18(18, "åä¸ä½"), |
| | | TYPE19(19, "彿§ç¹"), |
| | | TYPE20(20, "叿§ç¹"), |
| | | TYPE21(21, "å°å¾®ç«"), |
| | | TYPE21(21, "å°å¾®ç«"); |
| | | |
| | | companion object { |
| | | fun getByFactorType(factorType: FactorType): List<SceneType> { |
| | | return when (factorType) { |
| | | // 氮氧ååç©ï¼ä¸è¬ç±äºæºå¨è½¦å°¾æ°ï¼åæ¥è®¡ç®CO |
| | | FactorType.NO, |
| | | FactorType.NO2 -> { |
| | | listOf(TYPE6, TYPE10, TYPE17) |
| | | } |
| | | |
| | | FactorType.CO -> listOf(TYPE6, TYPE10, TYPE17) |
| | | |
| | | FactorType.H2S -> emptyList() |
| | | |
| | | FactorType.SO2 -> emptyList() |
| | | |
| | | FactorType.O3 -> emptyList() |
| | | // a) pm2.5ãpm10ç¹å«é«ï¼ä¸¤è
å¨åæ
åµä¸åæ¥å±ç¤ºï¼pm2.5å pm10çæ¯éååï¼æ¯éè¶é«ï¼è¶æå¯è½æ¯é¤é¥® |
| | | // b) pm10ç¹å«é«ãpm2.5è¾é«ï¼å¤§é¢ç²æ¬å°æ±¡æï¼åªå±ç¤ºpm10ï¼pm2.5å pm10çæ¯éååï¼å·¥å°ä¸ºä¸» |
| | | FactorType.PM25, |
| | | FactorType.PM10, |
| | | -> { |
| | | listOf( |
| | | TYPE1, |
| | | TYPE2, |
| | | TYPE3, |
| | | TYPE14, |
| | | TYPE5 |
| | | ) |
| | | } |
| | | // c) VOCè¾é«ï¼åæ¯è®¡ç®pm2.5çé级ï¼å¯è½åå¨åæ¥åé«ï¼æ±½ä¿®ãå æ²¹ç«ï¼, åæ¥è®¡ç®O3æ¯å¦æé«å¼ |
| | | // d) VOCè¾é«ï¼å¤äºå æ²¹ç«ï¼è½¦è¾æ¥å µæ
åµï¼ï¼COä¸è¬è¾é«, åæ¥è®¡ç®O3æ¯å¦æé«å¼ |
| | | FactorType.VOC -> { |
| | | listOf(TYPE6, TYPE17, TYPE12) |
| | | } |
| | | |
| | | else -> emptyList() |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | package com.flightfeather.uav.lightshare.service |
| | | |
| | | import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult |
| | | import com.flightfeather.uav.biz.report.MissionGridFusion |
| | | import com.flightfeather.uav.biz.report.MissionInventory |
| | | import com.flightfeather.uav.biz.report.MissionInventory.MissionDetail |
| | | import com.flightfeather.uav.biz.report.MissionRiskArea |
| | | import com.flightfeather.uav.biz.report.MissionSummary |
| | | import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue |
| | | import com.flightfeather.uav.domain.entity.BaseRealTimeData |
| | | import com.flightfeather.uav.domain.entity.GridCell |
| | | import com.flightfeather.uav.domain.entity.Mission |
| | | import com.flightfeather.uav.domain.entity.SceneInfo |
| | | import com.flightfeather.uav.lightshare.bean.AreaVo |
| | | import com.flightfeather.uav.lightshare.bean.GridDataDetailMixVo |
| | | import com.flightfeather.uav.lightshare.eunm.PollutionDegree |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import java.util.* |
| | | |
| | | /** |
| | |
| | | fun generateClueByRiskArea(startTime: Date, endTime: Date, areaVo: AreaVo): List<MissionRiskArea.ClueByArea> |
| | | |
| | | fun generateClueByRiskArea(keyScenes: List<SceneInfo?>, pollutedClues: List<PollutedClue?>): List<MissionRiskArea.ClueByArea> |
| | | |
| | | fun generateGridFusion(factorTypes: List<FactorType>, startTime: Date, endTime: Date, areaVo: AreaVo): |
| | | List<MissionGridFusion.GridFusionByAQI> |
| | | |
| | | fun generateGridFusion( |
| | | factorTypes: List<FactorType>, |
| | | gridLen: Int, |
| | | gridCells: List<GridCell>, |
| | | dataList: List<Triple<PollutionDegree, List<MissionInventory.MissionDetail>, List<GridDataDetailMixVo>>>, |
| | | ): List<MissionGridFusion.GridFusionByAQI> |
| | | } |
| | |
| | | import com.flightfeather.uav.biz.FactorFilter |
| | | import com.flightfeather.uav.biz.dataanalysis.ExceptionAnalysisController |
| | | import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult |
| | | import com.flightfeather.uav.biz.report.MissionGridFusion |
| | | import com.flightfeather.uav.biz.report.MissionInventory |
| | | import com.flightfeather.uav.biz.report.MissionRiskArea |
| | | import com.flightfeather.uav.biz.report.MissionSummary |
| | |
| | | import com.flightfeather.uav.common.exception.BizException |
| | | import com.flightfeather.uav.common.location.LocationRoadNearby |
| | | import com.flightfeather.uav.common.utils.GsonUtils |
| | | import com.flightfeather.uav.domain.entity.BaseRealTimeData |
| | | import com.flightfeather.uav.domain.entity.Mission |
| | | import com.flightfeather.uav.domain.entity.SceneInfo |
| | | import com.flightfeather.uav.domain.entity.* |
| | | import com.flightfeather.uav.domain.mapper.MissionMapper |
| | | import com.flightfeather.uav.domain.repository.* |
| | | import com.flightfeather.uav.lightshare.bean.AreaVo |
| | | import com.flightfeather.uav.lightshare.bean.GridDataDetailMixVo |
| | | import com.flightfeather.uav.lightshare.eunm.PollutionDegree |
| | | import com.flightfeather.uav.lightshare.eunm.SceneType |
| | | import com.flightfeather.uav.lightshare.service.DataAnalysisService |
| | | import com.flightfeather.uav.lightshare.service.SatelliteDataCalculateService |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import com.flightfeather.uav.socket.sender.MsgType |
| | | import org.springframework.stereotype.Service |
| | |
| | | private val locationRoadNearby: LocationRoadNearby, |
| | | private val segmentInfoRep: SegmentInfoRep, |
| | | private val sourceTraceRep: SourceTraceRep, |
| | | private val sceneInfoRep: SceneInfoRep |
| | | private val sceneInfoRep: SceneInfoRep, |
| | | private val satelliteGridRep: SatelliteGridRep, |
| | | private val satelliteDataCalculateService: SatelliteDataCalculateService |
| | | ) : DataAnalysisService { |
| | | |
| | | /** |
| | |
| | | ): List<MissionRiskArea.ClueByArea> { |
| | | return MissionRiskArea().generateClueByRiskArea(keyScenes, pollutedClues) |
| | | } |
| | | |
| | | override fun generateGridFusion( |
| | | factorTypes: List<FactorType>, |
| | | startTime: Date, |
| | | endTime: Date, |
| | | areaVo: AreaVo, |
| | | ): List<MissionGridFusion.GridFusionByAQI> { |
| | | val gridLen = 100 |
| | | // æ¥è¯¢100ç±³ç½æ ¼çå
·ä½ç½æ ¼æ°æ® |
| | | val gridGroup = satelliteGridRep.fetchGridGroup(GridGroup().apply { |
| | | type = "sub" |
| | | length = gridLen.toDouble() |
| | | provinceCode = areaVo.provinceCode |
| | | cityCode = areaVo.cityCode |
| | | districtCode = areaVo.districtCode |
| | | }).firstOrNull() ?: throw BizException("æªæ¥è¯¢å°100ç±³ç½æ ¼") |
| | | val gridCells = satelliteGridRep.fetchGridCell(gridGroup.id).filterNotNull() |
| | | // æ¥è¯¢èå´å
çææèµ°èªä»»å¡ |
| | | val missions = missionRep.findByAreaAndTime(areaVo, startTime, endTime) |
| | | // æ ¹æ®ç©ºæ°è´¨éç级åç±» |
| | | val missionGroups = missions.groupBy { PollutionDegree.getByDes(it?.pollutionDegree ?: "") } |
| | | // æ¥è¯¢æ¯ä¸ªç级ä¸çèµ°èªä»»å¡å¯¹åºçç½æ ¼æ°æ®ï¼å¦ææ²¡ææ°æ®ååé¤è¯¥ä»»å¡ï¼ |
| | | val gridDataDetailList = missionGroups.mapNotNull { (degree, missionList) -> |
| | | // çéåºæç½æ ¼èåæ°æ®çèµ°èªä»»å¡(åæ¶è·å对åºçèåæ°æ®idå表) |
| | | val gridDataIds = mutableListOf<Int>() |
| | | 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 |
| | | } |
| | | // åå¹¶æ¯ä¸ªç级ä¸çç½æ ¼æ°æ® |
| | | 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 keyScenes = sceneInfoRep.findBySceneTypes( |
| | | listOf( |
| | | SceneType.TYPE19.value, |
| | | SceneType.TYPE20.value, |
| | | SceneType.TYPE21.value |
| | | ) |
| | | ) |
| | | val missionDetails = generateMissionDetail(keyScenes, missionCluesData) |
| | | |
| | | return@mapNotNull Triple(degree, missionDetails, gridDataDetailMixVos) |
| | | }.filter { it.second.isNotEmpty() } |
| | | |
| | | return generateGridFusion(factorTypes, gridLen, gridCells, gridDataDetailList) |
| | | } |
| | | |
| | | override fun generateGridFusion( |
| | | factorTypes: List<FactorType>, |
| | | gridLen: Int, |
| | | gridCells: List<GridCell>, |
| | | dataList: List<Triple<PollutionDegree, List<MissionInventory.MissionDetail>, List<GridDataDetailMixVo>>>, |
| | | ): List<MissionGridFusion.GridFusionByAQI> { |
| | | return MissionGridFusion(sceneInfoRep).generateGridFusion(factorTypes, gridLen, gridCells, dataList) |
| | | } |
| | | } |
| | |
| | | import com.fasterxml.jackson.annotation.JsonFormat |
| | | import com.flightfeather.uav.lightshare.bean.AreaVo |
| | | import com.flightfeather.uav.lightshare.service.DataAnalysisService |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import io.swagger.annotations.Api |
| | | import io.swagger.annotations.ApiOperation |
| | | import io.swagger.annotations.ApiParam |
| | |
| | | areaVo |
| | | ) |
| | | } |
| | | |
| | | @ApiOperation(value = "å å èååæ") |
| | | @PostMapping("/report/gridFusion") |
| | | fun generateGridFusion( |
| | | @ApiParam("å¼å§æ¶é´") @RequestParam |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | startTime: LocalDateTime, |
| | | @ApiParam("ç»ææ¶é´") @RequestParam |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | endTime: LocalDateTime, |
| | | @ApiParam("éè¦ç»è®¡ççæµå å", example = "NO2, CO") @RequestParam |
| | | factorTypes: String, |
| | | @ApiParam("åºå") @RequestBody areaVo: AreaVo, |
| | | ) = resPack { |
| | | dataAnalysisService.generateGridFusion( |
| | | factorTypes.split(",").map { FactorType.valueOf(it) }, |
| | | Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()), |
| | | Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()), |
| | | areaVo |
| | | ) |
| | | } |
| | | } |