2025.9.1
1. 新增走航任务统计功能(待完成)
| | |
| | | package com.flightfeather.uav.biz.report |
| | | |
| | | import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue |
| | | import com.flightfeather.uav.domain.entity.Mission |
| | | import com.flightfeather.uav.domain.entity.SceneInfo |
| | | import com.flightfeather.uav.common.utils.MapUtil |
| | | import com.flightfeather.uav.domain.entity.* |
| | | import com.flightfeather.uav.lightshare.bean.FactorStatistics |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import com.flightfeather.uav.socket.sender.MsgType |
| | | import org.springframework.beans.BeanUtils |
| | | |
| | | /** |
| | | * èµ°èªæº¯æºæ¸
å |
| | |
| | | class MissionDetail : Mission() { |
| | | var keyScene: List<SceneInfo>? = null |
| | | var dataStatistics: List<FactorStatistics>? = null |
| | | var exceptionCount: Int = 0 |
| | | } |
| | | |
| | | /** |
| | | * è¾åºèµ°èªæ¸
å |
| | | * çæèµ°èªä»»å¡æ¸
å |
| | | * å¤çèµ°èªä»»å¡ä¸æ±¡æçº¿ç´¢æ°æ®ï¼ç»è®¡æ¯ä¸ªä»»å¡çå¼å¸¸å åãé¦è¦æ±¡æç©ååºæ¯æ°é |
| | | * @param missionClues å
å«èµ°èªä»»å¡åå¯¹åºæ±¡æçº¿ç´¢çPairå表 |
| | | * @return å
å«ç»è®¡ä¿¡æ¯çMissionInfoåè¡¨ï¼æ¯ä¸ªå
ç´ å
å«ä»»å¡åºæ¬ä¿¡æ¯åç»è®¡æ°æ® |
| | | */ |
| | | fun missionList(missionClues: List<Pair<Mission?, List<PollutedClue?>>>): List<MissionInfo> { |
| | | |
| | | val missionMap = mutableMapOf<String, MissionInfo>() |
| | | missionClues.forEach { (mission, clue) -> |
| | | mission ?: return@forEach |
| | | clue ?: return@forEach |
| | | val missionInfo = missionMap[mission.missionCode] ?: MissionInfo().apply { |
| | | missionMap[mission.missionCode] = this |
| | | } |
| | | fun generateMissionList(missionClues: List<Pair<Mission, List<PollutedClue?>>>): List<MissionInfo> { |
| | | val result = missionClues.map { (mission, clue) -> |
| | | val factorMap = mutableMapOf<FactorType, Int>() |
| | | val abnormalFactors = mutableListOf<FactorType>() |
| | | var sceneCount = 0 |
| | | clue.forEach { |
| | | if (it?.msgType == MsgType.PolClue.value) { |
| | | it.pollutedData?.statisticMap?.keys?.forEach { k-> |
| | | // è®¡ç®æ¯ä¸ªèµ°èªä»»å¡çææå¼å¸¸å å |
| | | if (!abnormalFactors.contains(k)) { |
| | | abnormalFactors.add(k) |
| | | } |
| | | // è®¡ç®æ¯ä¸ªèµ°èªä»»å¡çé¦è¦æ±¡æç© |
| | | if (!factorMap.containsKey(k)) { |
| | | factorMap[k] = 0 |
| | | } |
| | | factorMap[k] = factorMap[k]!! + 1 |
| | | } |
| | | // è®¡ç®æ¯ä¸ªèµ°èªä»»å¡ç溯æºåºæ¯æ°é |
| | | sceneCount += it.pollutedSource?.sceneList?.size ?: 0 |
| | | } |
| | | } |
| | | // è®¡ç®æ¯ä¸ªèµ°èªä»»å¡çææå¼å¸¸å å |
| | | |
| | | // è®¡ç®æ¯ä¸ªèµ°èªä»»å¡çé¦è¦æ±¡æç© |
| | | |
| | | // è®¡ç®æ¯ä¸ªèµ°èªä»»å¡ç溯æºåºæ¯æ°é |
| | | val missionInfo = MissionInfo() |
| | | BeanUtils.copyProperties(mission, missionInfo) |
| | | missionInfo.apply { |
| | | mainFactor = factorMap.maxByOrNull { it.value }?.key?.name |
| | | this.abnormalFactors = abnormalFactors |
| | | this.sceneCount = sceneCount |
| | | } |
| | | } |
| | | return mutableListOf() |
| | | return result |
| | | } |
| | | |
| | | /** |
| | | * çæèµ°èªä»»å¡è¯¦ç»ä¿¡æ¯ |
| | | * æ´åèµ°èªä»»å¡åºæ¬ä¿¡æ¯ãå
³é®åºæ¯ãæ°æ®ç»è®¡åå¼å¸¸æ°éï¼çæå®æ´çä»»å¡è¯¦æ
æ¥å |
| | | * @param keyScenes å
³é®åºæ¯å表ï¼ç¨äºåæèµ°èªæ¯å¦ç»è¿è¯¥åºå |
| | | * @param mission èµ°èªä»»å¡åºæ¬ä¿¡æ¯å¯¹è±¡ï¼å
å«ä»»å¡IDãåç§°ãæ¶é´çå
æ°æ® |
| | | * @param pollutedClues 污æçº¿ç´¢å表ï¼ç¨äºæåå
³é®åºæ¯ä¿¡æ¯ |
| | | * @param data 宿¶çæµæ°æ®å表ï¼ç¨äºè®¡ç®ç¯å¢å åç»è®¡ä¿¡æ¯ |
| | | * @param minDis æå°è·ç¦»ï¼ç¨äºå¤æèµ°èªæ¯å¦ç»è¿å
³é®åºæ¯ |
| | | * @return å
å«è¯¦ç»ä¿¡æ¯çMissionDetail对象ï¼å
æ¬ï¼ |
| | | * - ä»»å¡åºæ¬ä¿¡æ¯ï¼ç»§æ¿èªMissionç±»ï¼ |
| | | * - å
³é®åºæ¯å表ï¼TYPE19åTYPE20ç±»åçåºæ¯ï¼ |
| | | * - ç¯å¢å åç»è®¡æ°æ®ï¼å¹³åå¼ãæå°å¼ãæå¤§å¼ï¼ |
| | | * - å¼å¸¸æ°æ®ç¹æ°é |
| | | */ |
| | | fun generateMissionDetail( |
| | | keyScenes: List<SceneInfo?>, |
| | | mission: Mission, |
| | | pollutedClues: List<PollutedClue?>, |
| | | data: List<BaseRealTimeData>, |
| | | minDis:Double = 100.0 |
| | | ): MissionDetail { |
| | | // å建任å¡è¯¦æ
对象并å¤å¶åºæ¬ä¿¡æ¯ |
| | | val missionDetail = MissionDetail() |
| | | BeanUtils.copyProperties(mission, missionDetail) |
| | | |
| | | // æåéå¾å
³é®åºæ¯ä¿¡æ¯ï¼è®¡ç®èµ°èªè·¯çº¿æ¯å¦ä¸å
³é®åºæ¯è·ç¦»è¾è¿ï¼ |
| | | val relatedScenes = mutableListOf<SceneInfo>() |
| | | data.forEach { d-> |
| | | // è·³è¿ç¼ºå°ç»çº¬åº¦çæ°æ®ç¹ |
| | | if (d.longitude == null || d.latitude == null) { |
| | | return@forEach |
| | | } |
| | | // 转æ¢ä¸ºGCJ02åæ ç³» |
| | | val point = MapUtil.wgs84ToGcj02(d.longitude!!.toDouble() to d.latitude!!.toDouble()) |
| | | keyScenes.forEach ks@ { k-> |
| | | // è·³è¿ç¼ºå°ç»çº¬åº¦çåºæ¯ |
| | | if (k?.longitude == null || k.latitude == null) { |
| | | return@ks |
| | | } |
| | | // 计ç®è·ç¦» |
| | | val distance = MapUtil.getDistance(k.longitude!!.toDouble(), k.latitude!!.toDouble(), point.first, point.second) |
| | | // æ£æ¥æ¯å¦è·ç¦»å°äºéå¼ä¸æªæ·»å è¿ |
| | | if (distance < minDis && !relatedScenes.contains(k)) { |
| | | relatedScenes.add(k) |
| | | } |
| | | } |
| | | } |
| | | // åå¨ä¸ä»»å¡ç¸å
³èçå
³é®åºæ¯ä¿¡æ¯ |
| | | missionDetail.keyScene = relatedScenes |
| | | |
| | | // 计ç®ç¯å¢å åç»è®¡æ°æ®ï¼å¹³åå¼ãæå°å¼ãæå¤§å¼ï¼ |
| | | missionDetail.dataStatistics = data.calDataStatistics() |
| | | |
| | | // å¼å¸¸æ°æ®ç¹æ°éç»è®¡ |
| | | val clues = pollutedClues.filter { it?.msgType == MsgType.PolClue.value } |
| | | missionDetail.exceptionCount = clues.size |
| | | |
| | | return missionDetail |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.biz.report |
| | | |
| | | import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue |
| | | import com.flightfeather.uav.common.utils.MapUtil |
| | | import com.flightfeather.uav.domain.entity.SceneInfo |
| | | import com.flightfeather.uav.domain.entity.avg |
| | | import com.flightfeather.uav.socket.eunm.AggregatedFactorType |
| | | |
| | | /** |
| | | * èµ°èªå
¸å鿣åºå |
| | | * @date 2025/8/25 14:18 |
| | | * @author feiyu |
| | | */ |
| | | class MissionRiskArea { |
| | | |
| | | class ClueByArea { |
| | | var sceneInfo: SceneInfo? = null |
| | | var clueByFactorList: MutableList<ClueByFactor>? = null |
| | | } |
| | | |
| | | class ClueByFactor { |
| | | var factor: String? = null |
| | | var clues: MutableList<PollutedClue>? = null |
| | | } |
| | | |
| | | fun generateClueByRiskArea(keyScenes: List<SceneInfo?>, pollutedClues: List<PollutedClue?>): List<ClueByArea> { |
| | | val result = mutableListOf<ClueByArea>() |
| | | |
| | | pollutedClues.forEach { pollutedClue -> |
| | | if (pollutedClue == null) return@forEach |
| | | val dataList = pollutedClue.pollutedData?.dataList ?: emptyList() |
| | | if (dataList.isEmpty()) return@forEach |
| | | |
| | | // 计ç®å个PollutedClueçåå¼ç»çº¬åº¦ |
| | | val avgData = dataList.avg() |
| | | val wgs84Lng = avgData.longitude?.toDouble() ?: return@forEach |
| | | val wgs84Lat = avgData.latitude?.toDouble() ?: return@forEach |
| | | |
| | | // åæ è½¬æ¢ |
| | | val gcj02Point = MapUtil.wgs84ToGcj02(wgs84Lng to wgs84Lat) |
| | | |
| | | // æ¥æ¾æè¿åºæ¯ |
| | | var minDistance = Double.MAX_VALUE |
| | | var closestScene: SceneInfo? = null |
| | | keyScenes.forEach { scene -> |
| | | scene?.let { s -> |
| | | val sceneLng = s.longitude?.toDouble() ?: return@let |
| | | val sceneLat = s.latitude?.toDouble() ?: return@let |
| | | val distance = MapUtil.getDistance(gcj02Point.first, gcj02Point.second, sceneLng, sceneLat) |
| | | if (distance < minDistance) { |
| | | minDistance = distance |
| | | closestScene = s |
| | | } |
| | | } |
| | | } |
| | | |
| | | // æåºæ¯åå ååç»çº¿ç´¢ |
| | | closestScene?.let { scene -> |
| | | var clueByArea = result.find { it.sceneInfo?.guid == scene.guid } |
| | | if (clueByArea == null) { |
| | | clueByArea = ClueByArea().apply { |
| | | this.sceneInfo = scene |
| | | this.clueByFactorList = mutableListOf() |
| | | } |
| | | result.add(clueByArea) |
| | | } |
| | | |
| | | val firstFactorType = pollutedClue.pollutedData?.statisticMap?.keys?.first() |
| | | val afType = AggregatedFactorType.getAFType(firstFactorType) |
| | | val factorName = afType?.des ?: firstFactorType?.des |
| | | var clueByFactor = clueByArea.clueByFactorList?.find { it.factor == factorName } |
| | | if (clueByFactor == null) { |
| | | clueByFactor = ClueByFactor().apply { |
| | | this.factor = factorName |
| | | this.clues = mutableListOf() |
| | | } |
| | | clueByArea.clueByFactorList?.add(clueByFactor) |
| | | } |
| | | |
| | | clueByFactor.clues?.add(pollutedClue) |
| | | } |
| | | } |
| | | |
| | | return result |
| | | } |
| | | } |
| | |
| | | import com.flightfeather.uav.biz.dataprocess.AvgPair |
| | | import com.flightfeather.uav.common.utils.DateUtil |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | import com.flightfeather.uav.lightshare.bean.FactorStatistics |
| | | import com.flightfeather.uav.socket.bean.AirData |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import java.io.Serializable |
| | |
| | | |
| | | } |
| | | |
| | | fun List<BaseRealTimeData>.avg(): BaseRealTimeData { |
| | | fun List<BaseRealTimeData>.avg(onEach: (BaseRealTimeData) -> Unit = { }): BaseRealTimeData { |
| | | if (isEmpty()) { |
| | | return BaseRealTimeData() |
| | | } |
| | |
| | | } |
| | | |
| | | forEach { |
| | | onEach(it) |
| | | //é£å |
| | | it.windDirection?.let {w -> |
| | | it.windDirection?.let { w -> |
| | | val r = Math.toRadians(w.toDouble()) |
| | | u += sin(r) |
| | | v += cos(r) |
| | |
| | | windDirection = round(a.toFloat()) |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 计ç®å®æ¶çæµæ°æ®å表çç»è®¡ä¿¡æ¯ |
| | | * 为æ¯ç§ç¯å¢å åè®¡ç®æå°å¼ãæå¤§å¼åå¹³åå¼ |
| | | * |
| | | * @return å
å«åç¯å¢å åç»è®¡ä¿¡æ¯çFactorStatisticså表 |
| | | * æ¯ä¸ªFactorStatistics对象å
å«å åç±»åãæå°å¼ãæå¤§å¼åå¹³åå¼ |
| | | */ |
| | | fun List<BaseRealTimeData>.calDataStatistics(): List<FactorStatistics> { |
| | | |
| | | // åå§ååç¯å¢å åçç»è®¡å¯¹è±¡å表 |
| | | val statistics = mutableListOf<FactorStatistics>() |
| | | listOf( |
| | | FactorType.NO2, |
| | | FactorType.CO, |
| | | FactorType.H2S, |
| | | FactorType.SO2, |
| | | FactorType.O3, |
| | | FactorType.PM25, |
| | | FactorType.PM10, |
| | | FactorType.VOC, |
| | | FactorType.NOI, |
| | | FactorType.VELOCITY, |
| | | FactorType.WIND_SPEED, |
| | | FactorType.HEIGHT, |
| | | FactorType.NO |
| | | ).forEach { statistics.add(FactorStatistics(it)) } |
| | | |
| | | // 计ç®å¹³åå¼å¹¶åæ¶æ´æ°åå åçæå°å¼åæå¤§å¼ |
| | | val avgData = avg { item -> |
| | | // æ´æ°æ¯ä¸ªå åçæå°åæå¤§å¼ |
| | | statistics[0].updateMinAndMaxValue(item.no2) |
| | | statistics[1].updateMinAndMaxValue(item.co) |
| | | statistics[2].updateMinAndMaxValue(item.h2s) |
| | | statistics[3].updateMinAndMaxValue(item.so2) |
| | | statistics[4].updateMinAndMaxValue(item.o3) |
| | | statistics[5].updateMinAndMaxValue(item.pm25) |
| | | statistics[6].updateMinAndMaxValue(item.pm10) |
| | | statistics[7].updateMinAndMaxValue(item.voc) |
| | | statistics[8].updateMinAndMaxValue(item.noi) |
| | | statistics[9].updateMinAndMaxValue(item.velocity) |
| | | statistics[10].updateMinAndMaxValue(item.windSpeed) |
| | | statistics[11].updateMinAndMaxValue(item.height) |
| | | statistics[12].updateMinAndMaxValue(item.no) |
| | | } |
| | | |
| | | // å°è®¡ç®å¾å°çå¹³åå¼è®¾ç½®å°å¯¹åºçç»è®¡å¯¹è±¡ä¸ |
| | | statistics[0].avgValue = avgData.no2 ?: 0f |
| | | statistics[1].avgValue = avgData.co ?: 0f |
| | | statistics[2].avgValue = avgData.h2s ?: 0f |
| | | statistics[3].avgValue = avgData.so2 ?: 0f |
| | | statistics[4].avgValue = avgData.o3 ?: 0f |
| | | statistics[5].avgValue = avgData.pm25 ?: 0f |
| | | statistics[6].avgValue = avgData.pm10 ?: 0f |
| | | statistics[7].avgValue = avgData.voc ?: 0f |
| | | statistics[8].avgValue = avgData.noi ?: 0f |
| | | statistics[9].avgValue = avgData.velocity ?: 0f |
| | | statistics[10].avgValue = avgData.windSpeed ?: 0f |
| | | statistics[11].avgValue = avgData.height ?: 0f |
| | | statistics[12].avgValue = avgData.no ?: 0f |
| | | |
| | | return statistics |
| | | } |
| | |
| | | import com.flightfeather.uav.socket.bean.AirData |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import com.flightfeather.uav.socket.eunm.FactorType.* |
| | | import java.time.LocalDateTime |
| | | import java.time.ZoneId |
| | | import java.util.* |
| | | import kotlin.math.atan |
| | | import kotlin.math.cos |
| | | import kotlin.math.round |
| | |
| | | list.add("纬度") |
| | | val values = GsonUtils.parserJsonToArrayBeans(factors, AirData::class.java) |
| | | values.forEach { |
| | | if (FactorType.outputFactor(it.factorName)) { |
| | | if (FactorType.isOutputFactor(it.factorName)) { |
| | | val name = it.factorName ?: "" |
| | | list.add(name) |
| | | // list.add("$name(ç©çé)") |
| | |
| | | } |
| | | val values = GsonUtils.parserJsonToArrayBeans(factors, AirData::class.java) |
| | | values.forEach { |
| | | if (FactorType.outputFactor(it.factorName)) { |
| | | if (FactorType.isOutputFactor(it.factorName)) { |
| | | row.add(it.factorData ?: -1.0) |
| | | // row.add(it.physicalQuantity ?: -1.0) |
| | | } |
| | |
| | | @Column(name = "pollution_degree") |
| | | private String pollutionDegree; |
| | | |
| | | private Integer aqi; |
| | | |
| | | /** |
| | | * @return mission_code |
| | | */ |
| | |
| | | public void setPollutionDegree(String pollutionDegree) { |
| | | this.pollutionDegree = pollutionDegree == null ? null : pollutionDegree.trim(); |
| | | } |
| | | |
| | | /** |
| | | * @return aqi |
| | | */ |
| | | public Integer getAqi() { |
| | | return aqi; |
| | | } |
| | | |
| | | /** |
| | | * @param aqi |
| | | */ |
| | | public void setAqi(Integer aqi) { |
| | | this.aqi = aqi; |
| | | } |
| | | } |
| | |
| | | |
| | | import com.flightfeather.uav.domain.entity.Mission |
| | | import com.flightfeather.uav.domain.mapper.MissionMapper |
| | | import com.flightfeather.uav.lightshare.bean.AreaVo |
| | | import org.springframework.stereotype.Repository |
| | | import tk.mybatis.mapper.entity.Example |
| | | import java.util.* |
| | |
| | | .andIsNotNull("endTime") |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®åºååæ¶é´èå´æ¥è¯¢ææèµ°èªä»»å¡å表 |
| | | * çéæå®è¡æ¿åºåå
ãç¹å®æ¶é´æ®µä¸å·²å®æææéç¨è®°å½çèµ°èªä»»å¡ |
| | | * @param areaVo åºååæ°å¯¹è±¡ï¼å
å«çãå¸ãåºä¸çº§è¡æ¿åºåç¼ç |
| | | * @param startTime æ¥è¯¢èµ·å§æ¶é´ï¼å
å«ï¼ |
| | | * @param endTime æ¥è¯¢ç»ææ¶é´ï¼å
å«ï¼ |
| | | * @return ç¬¦åæ¡ä»¶çèµ°èªä»»å¡å表ï¼è¥æ å¯è¿å空å表 |
| | | * @see AreaVo åºååæ°æ°æ®ç»æ |
| | | * @see Mission èµ°èªä»»å¡å®ä½ç±» |
| | | */ |
| | | fun findByAreaAndTime(areaVo: AreaVo, startTime: Date, endTime: Date): List<Mission?> { |
| | | return missionMapper.selectByExample(Example(Mission::class.java).apply { |
| | | createCriteria().andBetween("startTime", startTime, endTime) |
| | | .andEqualTo("provinceCode", areaVo.provinceCode) |
| | | .andEqualTo("cityCode", areaVo.cityCode) |
| | | .andEqualTo("districtCode", areaVo.districtCode) |
| | | .andIsNotNull("kilometres") |
| | | .andNotEqualTo("kilometres", 0) |
| | | }) |
| | | } |
| | | } |
| | |
| | | .andLessThanOrEqualTo("latitude", range[3]) |
| | | }) |
| | | } |
| | | |
| | | fun findBySceneTypes(sceneTypes: List<Int>): List<SceneInfo?> { |
| | | if (sceneTypes.isEmpty()){ |
| | | return emptyList() |
| | | } |
| | | return sceneInfoMapper.selectByExample(Example(SceneInfo::class.java).apply { |
| | | createCriteria().andIn("typeId", sceneTypes) |
| | | }) |
| | | } |
| | | } |
| | |
| | | return if (res.isEmpty()) null else res[0] |
| | | } |
| | | |
| | | fun fetchList(deviceCode: String, startTime: Date, endTime: Date): List<BaseExceptionResult?> { |
| | | return sourceTraceMsgBlobMapper.selectWithBlob(deviceCode, startTime, endTime) |
| | | .map { stm -> |
| | | fun fetchList( |
| | | deviceCode: String, |
| | | startTime: Date, |
| | | endTime: Date, |
| | | msgType: MsgType? = null, |
| | | ): List<BaseExceptionResult?> { |
| | | var res = sourceTraceMsgBlobMapper.selectWithBlob(deviceCode, startTime, endTime) |
| | | if (msgType !== null) { |
| | | res = res.filter { it?.msgType == msgType.value } |
| | | } |
| | | |
| | | return res.map { stm -> |
| | | when (stm?.msgType) { |
| | | MsgType.PolClue.value, |
| | | MsgType.DataChange.value, |
| | |
| | | row.add(lng ?: -1.0) |
| | | row.add(lat ?: -1.0) |
| | | values?.forEach { |
| | | if (FactorType.outputFactor(it.factorName)) { |
| | | if (FactorType.isOutputFactor(it.factorName)) { |
| | | row.add(it.factorData ?: -1.0) |
| | | // row.add(it.physicalQuantity ?: -1.0) |
| | | } |
| | |
| | | list.add("ç»åº¦") |
| | | list.add("纬度") |
| | | values?.forEach { |
| | | if (FactorType.outputFactor(it.factorName)) { |
| | | if (FactorType.isOutputFactor(it.factorName)) { |
| | | val name = it.factorName ?: "" |
| | | list.add(name) |
| | | // list.add("$name(ç©çé)") |
| | |
| | | */ |
| | | data class FactorStatistics( |
| | | // çæµå åç±»å |
| | | val factor: FactorType, |
| | | var factor: FactorType, |
| | | // æå°å¼ |
| | | val minValue: Double, |
| | | var minValue: Float = Float.NaN, |
| | | // æå¤§å¼ |
| | | val maxValue: Double, |
| | | var maxValue: Float = Float.NaN, |
| | | // åå¼ |
| | | val avgValue: Double |
| | | ) |
| | | var avgValue: Float = Float.NaN, |
| | | ){ |
| | | fun updateMinAndMaxValue(value: Float?){ |
| | | minValue = if (minValue.isNaN()) { |
| | | value ?: Float.NaN |
| | | } else { |
| | | minValue.coerceAtMost(value ?: minValue) |
| | | } |
| | | maxValue = if (maxValue.isNaN()) { |
| | | value ?: Float.NaN |
| | | } else { |
| | | maxValue.coerceAtLeast(value ?: maxValue) |
| | | } |
| | | } |
| | | } |
| | |
| | | TYPE18(18, "åä¸ä½"), |
| | | TYPE19(19, "彿§ç¹"), |
| | | TYPE20(20, "叿§ç¹"), |
| | | TYPE21(21, "å°å¾®ç«"), |
| | | } |
| | |
| | | package com.flightfeather.uav.lightshare.service |
| | | |
| | | import com.flightfeather.uav.biz.dataanalysis.BaseExceptionResult |
| | | import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult |
| | | 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.BasePollutedMsg |
| | | import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue |
| | | 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.lightshare.bean.AreaVo |
| | | import java.util.* |
| | | |
| | | /** |
| | | * |
| | | * æ°æ®åææå¡æ¥å£ |
| | | * æä¾èµ°èªä»»å¡æ°æ®çç»è®¡åæãæ±¡ææº¯æºã任塿¸
åçæçæ ¸å¿åè½ |
| | | * ç¨äºæ´ååå¤çæ 人æºçæµæ°æ®ï¼çæåç±»åææ¥ååç»è®¡ç»æ |
| | | * @date 2025/5/8 |
| | | * @author feiyu02 |
| | | */ |
| | |
| | | |
| | | /** |
| | | * æ±¡ææº¯æºåæ |
| | | * @param missionCode èµ°èªä»»å¡ç¼å· |
| | | * æ ¹æ®èµ°èªä»»å¡ç¼å·åææ±¡æçº¿ç´¢ï¼è¯å«å¼å¸¸æ°æ®ç¹åæ½å¨æ±¡ææº |
| | | * @param missionCode èµ°èªä»»å¡ç¼å·ï¼ç¨äºå¯ä¸æ è¯ç¹å®çèµ°èªä»»å¡ |
| | | * @return å¼å¸¸ç»æåè¡¨ï¼æ¯ä¸ªå
ç´ å
å«å¼å¸¸ç±»åãä½ç½®å详ç»ä¿¡æ¯ |
| | | */ |
| | | fun pollutionTrace(missionCode: String): List<ExceptionResult> |
| | | |
| | | /** |
| | | * è·åå岿±¡ææº¯æºç»æ |
| | | * æ ¹æ®ä»»å¡ç¼å·æ¥è¯¢å¹¶è¿åå岿±¡ææº¯æºç»æ |
| | | * @param missionCode èµ°èªä»»å¡ç¼å· |
| | | * @return å岿±¡ææº¯æºç»æçå符串表示ï¼å
·ä½æ ¼å¼éåèå®ç°ç±»ï¼ |
| | | */ |
| | | fun fetchHistory(missionCode: String): String |
| | | |
| | | fun missionSummary(startTime: Date, endTime: Date, areaVo: AreaVo): MissionSummary.Summary |
| | | /** |
| | | * çæèµ°èªä»»å¡æ±æ»ç»è®¡ |
| | | * ææ¶é´èå´ååºåç»è®¡èµ°èªä»»å¡çå
³é®ææ 忻使
åµ |
| | | * @param startTime å¼å§æ¶é´ï¼ç¨äºçéæå®æ¶é´æ®µå
çä»»å¡ |
| | | * @param endTime ç»ææ¶é´ï¼ç¨äºçéæå®æ¶é´æ®µå
çä»»å¡ |
| | | * @param areaVo åºååæ°ï¼å
å«ç»çº¬åº¦èå´çå°çä¿¡æ¯ |
| | | * @return æ±æ»ç»è®¡å¯¹è±¡ï¼å
å«ä»»å¡æ»æ°ãå¼å¸¸çã平忰æ®çææ |
| | | */ |
| | | fun generateMissionSummary(startTime: Date, endTime: Date, areaVo: AreaVo): MissionSummary.Summary |
| | | |
| | | /** |
| | | * çæèµ°èªä»»å¡æ¸
åï¼ææ¶é´ååºåçéï¼ |
| | | * æ ¹æ®æ¶é´èå´åå°çåºåæ¥è¯¢èµ°èªä»»å¡ï¼å¹¶çæå
å«ç»è®¡ä¿¡æ¯çä»»å¡å表 |
| | | * @param startTime å¼å§æ¶é´ |
| | | * @param endTime ç»ææ¶é´ |
| | | * @param areaVo åºååæ° |
| | | * @return èµ°èªä»»å¡ä¿¡æ¯åè¡¨ï¼æ¯ä¸ªå
ç´ å
å«ä»»å¡åºæ¬ä¿¡æ¯åç»è®¡æ°æ® |
| | | */ |
| | | fun generateMissionList(startTime: Date, endTime: Date, areaVo: AreaVo): List<MissionInventory.MissionInfo> |
| | | |
| | | /** |
| | | * çæèµ°èªä»»å¡æ¸
åï¼ç´æ¥å¤çä»»å¡çº¿ç´¢ï¼ |
| | | * å¤çå·²æçèµ°èªä»»å¡å污æçº¿ç´¢æ°æ®ï¼çæä»»å¡æ¸
å |
| | | * @param missionClues å
å«èµ°èªä»»å¡åå¯¹åºæ±¡æçº¿ç´¢çPairå表 |
| | | * @return èµ°èªä»»å¡ä¿¡æ¯å表 |
| | | */ |
| | | fun generateMissionList(missionClues: List<Pair<Mission, List<PollutedClue?>>>): List<MissionInventory.MissionInfo> |
| | | |
| | | /** |
| | | * è·åèµ°èªä»»å¡è¯¦æ
ï¼ææ¶é´ååºåçéï¼ |
| | | * æ ¹æ®æ¶é´èå´ååºåæ¥è¯¢å¹¶çæè¯¦ç»ç任塿¥åï¼å
å«å
³é®åºæ¯åæ°æ®ç»è®¡ |
| | | * @param startTime å¼å§æ¶é´ |
| | | * @param endTime ç»ææ¶é´ |
| | | * @param areaVo åºååæ° |
| | | * @return ä»»å¡è¯¦æ
åè¡¨ï¼æ¯ä¸ªå
ç´ å
å«ä»»å¡å®æ´ä¿¡æ¯ãåºæ¯æ°æ®åç»è®¡ç»æ |
| | | */ |
| | | fun generateMissionDetail(startTime: Date, endTime: Date, areaVo: AreaVo): List<MissionDetail> |
| | | |
| | | /** |
| | | * è·åèµ°èªä»»å¡è¯¦æ
ï¼ç´æ¥å¤ç任塿°æ®ï¼ |
| | | * å¤çå·²æçä»»å¡ã污æçº¿ç´¢å宿¶æ°æ®ï¼çæè¯¦ç»ä»»å¡æ¥å |
| | | * @param keyScenes å
³é®åºæ¯å表ï¼ç¨äºåæèµ°èªæ¯å¦ç»è¿è¯¥åºå |
| | | * @param missionCluesData å
å«ä»»å¡ã污æçº¿ç´¢å宿¶æ°æ®çTripleå表 |
| | | * @return ä»»å¡è¯¦æ
å表 |
| | | */ |
| | | fun generateMissionDetail(keyScenes: List<SceneInfo?>, missionCluesData: List<Triple<Mission, List<PollutedClue?>, List<BaseRealTimeData>>>): List<MissionDetail> |
| | | |
| | | fun generateClueByRiskArea(startTime: Date, endTime: Date, areaVo: AreaVo): List<MissionRiskArea.ClueByArea> |
| | | |
| | | fun generateClueByRiskArea(keyScenes: List<SceneInfo?>, pollutedClues: List<PollutedClue?>): List<MissionRiskArea.ClueByArea> |
| | | } |
| | |
| | | package com.flightfeather.uav.lightshare.service.impl |
| | | |
| | | import com.flightfeather.uav.biz.FactorFilter |
| | | import com.flightfeather.uav.biz.dataanalysis.BaseExceptionResult |
| | | import com.flightfeather.uav.biz.dataanalysis.ExceptionAnalysisController |
| | | import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult |
| | | 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.biz.sourcetrace.model.BasePollutedMsg |
| | | import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue |
| | | 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.mapper.MissionMapper |
| | | import com.flightfeather.uav.domain.repository.MissionRep |
| | | import com.flightfeather.uav.domain.repository.RealTimeDataRep |
| | | import com.flightfeather.uav.domain.repository.SegmentInfoRep |
| | | import com.flightfeather.uav.domain.repository.SourceTraceRep |
| | | import com.flightfeather.uav.domain.repository.* |
| | | import com.flightfeather.uav.lightshare.bean.AreaVo |
| | | import com.flightfeather.uav.lightshare.eunm.SceneType |
| | | import com.flightfeather.uav.lightshare.service.DataAnalysisService |
| | | 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.time.LocalDateTime |
| | | import java.time.ZoneId |
| | | import java.util.* |
| | | |
| | | /** |
| | | * |
| | | * æ°æ®åææå¡æ¥å£å®ç°ç±» |
| | | * æä¾èµ°èªä»»å¡æ°æ®çç»è®¡åæãæ±¡ææº¯æºã任塿¸
åå详æ
çæçæ ¸å¿ä¸å¡åè½ |
| | | * æ´å夿°æ®æºå®ææ°æ®èåä¸åæï¼ä¸ºå端æä¾æ ååçç»è®¡ç»æ |
| | | * @date 2025/5/8 |
| | | * @author feiyu02 |
| | | */ |
| | |
| | | private val realTimeDataRep: RealTimeDataRep, |
| | | private val locationRoadNearby: LocationRoadNearby, |
| | | private val segmentInfoRep: SegmentInfoRep, |
| | | private val sourceTraceRep: SourceTraceRep |
| | | private val sourceTraceRep: SourceTraceRep, |
| | | private val sceneInfoRep: SceneInfoRep |
| | | ) : DataAnalysisService { |
| | | |
| | | /** |
| | | * æ±¡ææº¯æºåæ |
| | | * 对æå®èµ°èªä»»å¡è¿è¡å¤å åæ±¡ææ°æ®åæï¼è¯å«å¼å¸¸æ°æ®ç¹åæ½å¨æ±¡ææº |
| | | * @param missionCode èµ°èªä»»å¡ç¼ç ï¼ä¸»é®ï¼ |
| | | * @return å¼å¸¸ç»æå表ï¼å
å«å¼å¸¸ç±»åãä½ç½®ãæµåº¦å¼ç详ç»ä¿¡æ¯ |
| | | * @throws BizException å½èµ°èªä»»å¡ä¸å卿¶æåº |
| | | * @see ExceptionAnalysisController å¼å¸¸åææ§å¶å¨ï¼å¤çå
·ä½çæ°æ®åæé»è¾ |
| | | */ |
| | | override fun pollutionTrace(missionCode: String): List<ExceptionResult> { |
| | | val mission = missionRep.findOne(missionCode) ?: throw BizException("èµ°èªä»»å¡ä¸åå¨") |
| | | |
| | |
| | | ) |
| | | } |
| | | |
| | | /** |
| | | * è·åå岿±¡ææº¯æºç»æ |
| | | * æ¥è¯¢æå®ä»»å¡çå岿±¡ææº¯æºç»æå¹¶åºåå为JSONå符串 |
| | | * @param missionCode èµ°èªä»»å¡ç¼ç |
| | | * @return å岿±¡ææº¯æºç»æçJSONå符串ï¼å
·ä½æ ¼å¼ç±sourceTraceRepå®ç°å³å® |
| | | * @throws BizException å½èµ°èªä»»å¡ä¸å卿¶æåº |
| | | */ |
| | | override fun fetchHistory(missionCode: String): String { |
| | | val mission = missionRep.findOne(missionCode) ?: throw BizException("èµ°èªä»»å¡ä¸åå¨") |
| | | |
| | |
| | | return GsonUtils.gson.toJson(res) |
| | | } |
| | | |
| | | override fun missionSummary(startTime: Date, endTime: Date, areaVo: AreaVo): MissionSummary.Summary { |
| | | /** |
| | | * çæèµ°èªä»»å¡æ±æ»ç»è®¡ |
| | | * ææ¶é´èå´åè¡æ¿åºåç»è®¡èµ°èªä»»å¡çå
³é®ææ ï¼ä»»å¡æ°éãå¼å¸¸çãå¹³åéç¨çï¼ |
| | | * @param startTime ç»è®¡èµ·å§æ¶é´ï¼å
å«ï¼ |
| | | * @param endTime ç»è®¡ç»ææ¶é´ï¼å
å«ï¼ |
| | | * @param areaVo åºååæ°ï¼å
å«çãå¸ãåºä¸çº§è¡æ¿åºåç¼ç |
| | | * @return æ±æ»ç»è®¡å¯¹è±¡ï¼å
å«ä»»å¡æ»æ°ãå¼å¸¸ç¹æ°éãå¹³åéç¨çæ ¸å¿ææ |
| | | * @see MissionSummary æ±æ»ç»è®¡å¤çå¨ï¼å°è£
å
·ä½çç»è®¡é»è¾å®ç° |
| | | */ |
| | | override fun generateMissionSummary(startTime: Date, endTime: Date, areaVo: AreaVo): MissionSummary.Summary { |
| | | val clues = mutableListOf<PollutedClue?>() |
| | | val missions = missionMapper.selectByExample(Example(Mission::class.java).apply { |
| | | createCriteria().andBetween("startTime", startTime, endTime) |
| | | .andEqualTo("provinceCode", areaVo.provinceCode) |
| | | .andEqualTo("cityCode", areaVo.cityCode) |
| | | .andEqualTo("districtCode", areaVo.districtCode) |
| | | .andIsNotNull("kilometres") |
| | | .andNotEqualTo("kilometres", 0) |
| | | }).onEach { |
| | | val missions = missionRep.findByAreaAndTime(areaVo, startTime, endTime).onEach { |
| | | it ?: return@onEach |
| | | val clue = sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime).filterIsInstance<PollutedClue?>() |
| | | val clue = sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime, MsgType.PolClue) as List<PollutedClue?> |
| | | clues.addAll(clue) |
| | | } |
| | | val summary = MissionSummary().execute(startTime, endTime, missions, clues) |
| | | return summary |
| | | } |
| | | |
| | | /** |
| | | * çæèµ°èªä»»å¡æ¸
åï¼ææ¶é´ååºåçéï¼ |
| | | * æ ¹æ®æ¶é´èå´åè¡æ¿åºåæ¥è¯¢èµ°èªä»»å¡ï¼å¹¶å
³è污æçº¿ç´¢æ°æ®çæä»»å¡å表 |
| | | * @param startTime æ¥è¯¢èµ·å§æ¶é´ï¼å
å«ï¼ |
| | | * @param endTime æ¥è¯¢ç»ææ¶é´ï¼å
å«ï¼ |
| | | * @param areaVo åºååæ°ï¼å
å«çãå¸ãåºç¼ç |
| | | * @return èµ°èªä»»å¡ä¿¡æ¯åè¡¨ï¼æ¯ä¸ªå
ç´ å
å«ä»»å¡åºæ¬ä¿¡æ¯åå
³èçæ±¡æçº¿ç´¢ |
| | | * @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) |
| | | } |
| | | |
| | | /** |
| | | * çæèµ°èªä»»å¡æ¸
åï¼ç´æ¥å¤ç任塿°æ®ï¼ |
| | | * æ¥æ¶å·²å
³èçä»»å¡-污æçº¿ç´¢æ°æ®å¯¹ï¼çææ ¼å¼åçä»»å¡å表 |
| | | * @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 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) |
| | | } |
| | | |
| | | /** |
| | | * çæèµ°èªä»»å¡è¯¦æ
ï¼ç´æ¥å¤ç任塿°æ®ï¼ |
| | | * æ¥æ¶å·²å
³èçä»»å¡-污æçº¿ç´¢-宿¶æ°æ®ä¸å
ç»ï¼çæè¯¦ç»ä»»å¡æ¥å |
| | | * @param keyScenes å
³é®åºæ¯å表ï¼ç¨äºåæèµ°èªæ¯å¦ç»è¿è¯¥åºå |
| | | * @param missionCluesData 任塿°æ®ä¸å
ç»å表ï¼Tripleåå«ä¸ºä»»å¡å¯¹è±¡ã污æçº¿ç´¢å表ã宿¶æ°æ®å表 |
| | | * @return æ ååçä»»å¡è¯¦æ
å表ï¼å
å«å®æ´çä»»å¡å±æ§ã污æåæåçæµæ°æ®ç»è®¡ |
| | | * @see MissionInventory.generateMissionDetail 详æ
çææ ¸å¿é»è¾ |
| | | */ |
| | | override fun generateMissionDetail( |
| | | keyScenes: List<SceneInfo?>, |
| | | missionCluesData: List<Triple<Mission, List<PollutedClue?>, List<BaseRealTimeData>>>, |
| | | ): List<MissionInventory.MissionDetail> { |
| | | return missionCluesData.map { |
| | | MissionInventory().generateMissionDetail(keyScenes, it.first, it.second, it.third) |
| | | } |
| | | } |
| | | |
| | | override fun generateClueByRiskArea( |
| | | startTime: Date, |
| | | endTime: Date, |
| | | areaVo: AreaVo, |
| | | ): List<MissionRiskArea.ClueByArea> { |
| | | 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) |
| | | } |
| | | val keyScenes = sceneInfoRep.findBySceneTypes( |
| | | listOf( |
| | | SceneType.TYPE19.value, |
| | | SceneType.TYPE20.value, |
| | | SceneType.TYPE21.value |
| | | ) |
| | | ) |
| | | return generateClueByRiskArea(keyScenes, clues) |
| | | } |
| | | |
| | | override fun generateClueByRiskArea( |
| | | keyScenes: List<SceneInfo?>, |
| | | pollutedClues: List<PollutedClue?>, |
| | | ): List<MissionRiskArea.ClueByArea> { |
| | | return MissionRiskArea().generateClueByRiskArea(keyScenes, pollutedClues) |
| | | } |
| | | } |
| | |
| | | package com.flightfeather.uav.lightshare.web |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat |
| | | import com.flightfeather.uav.lightshare.bean.AreaVo |
| | | import com.flightfeather.uav.lightshare.service.DataAnalysisService |
| | | import io.swagger.annotations.Api |
| | | import io.swagger.annotations.ApiOperation |
| | | import io.swagger.annotations.ApiParam |
| | | import org.springframework.format.annotation.DateTimeFormat |
| | | import org.springframework.web.bind.annotation.* |
| | | import java.util.* |
| | | |
| | | /** |
| | | * èµ°èªæ°æ®åæ |
| | |
| | | @ApiParam("èµ°èªä»»å¡ç¼å·") @RequestParam missionCode: String, |
| | | ) = resPack { dataAnalysisService.fetchHistory(missionCode) } |
| | | |
| | | @ApiOperation(value = "çæèµ°èªä»»å¡æ±æ»ç»è®¡") |
| | | @PostMapping("/report/missionSummary") |
| | | fun generateMissionSummary( |
| | | @ApiParam("å¼å§æ¶é´") @RequestParam |
| | | @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | startTime: Date, |
| | | @ApiParam("ç»ææ¶é´") @RequestParam |
| | | @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | endTime: Date, |
| | | @ApiParam("åºå") @RequestBody areaVo: AreaVo, |
| | | ) = resPack { dataAnalysisService.generateMissionSummary(startTime, endTime, areaVo) } |
| | | |
| | | @ApiOperation(value = "çæèµ°èªä»»å¡æ¸
å") |
| | | @PostMapping("/report/missionList") |
| | | fun generateMissionList( |
| | | @ApiParam("å¼å§æ¶é´") @RequestParam |
| | | @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | startTime: Date, |
| | | @ApiParam("ç»ææ¶é´") @RequestParam |
| | | @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | endTime: Date, |
| | | @ApiParam("åºå") @RequestBody areaVo: AreaVo, |
| | | ) = resPack { dataAnalysisService.generateMissionList(startTime, endTime, areaVo) } |
| | | |
| | | @ApiOperation(value = "çæèµ°èªä»»å¡è¯¦æ
") |
| | | @PostMapping("/report/missionDetail") |
| | | fun generateMissionDetail( |
| | | @ApiParam("å¼å§æ¶é´") @RequestParam |
| | | @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | startTime: Date, |
| | | @ApiParam("ç»ææ¶é´") @RequestParam |
| | | @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | endTime: Date, |
| | | @ApiParam("åºå") @RequestBody areaVo: AreaVo, |
| | | ) = resPack { dataAnalysisService.generateMissionDetail(startTime, endTime, areaVo) } |
| | | |
| | | @ApiOperation(value = "èµ°èªå
¸å鿣åºåç»è®¡") |
| | | @PostMapping("/report/clueByRiskArea") |
| | | fun generateClueByRiskArea( |
| | | @ApiParam("å¼å§æ¶é´") @RequestParam |
| | | @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | startTime: Date, |
| | | @ApiParam("ç»ææ¶é´") @RequestParam |
| | | @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss") |
| | | endTime: Date, |
| | | @ApiParam("åºå") @RequestBody areaVo: AreaVo, |
| | | ) = resPack { dataAnalysisService.generateClueByRiskArea(startTime, endTime, areaVo) } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.flightfeather.uav.socket.eunm |
| | | |
| | | /** |
| | | * èåçæµå å |
| | | * @date 2025/8/29 |
| | | * @author feiyu02 |
| | | */ |
| | | enum class AggregatedFactorType(val des: String) { |
| | | PM_AF("é¢ç²ç©(PM)"), |
| | | NO_AF("氮氧åç©"); |
| | | |
| | | companion object { |
| | | /** |
| | | * æ ¹æ®å åç±»åè·åèåå åç±»å |
| | | */ |
| | | fun getAFType(factorType: FactorType?): AggregatedFactorType? { |
| | | return when (factorType) { |
| | | FactorType.PM25, FactorType.PM10 -> PM_AF |
| | | FactorType.NO, FactorType.NO2 -> NO_AF |
| | | else -> null |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | else -> 10.0 |
| | | } |
| | | |
| | | fun outputFactor(factorName: String?): Boolean { |
| | | fun isOutputFactor(factorName: String?): Boolean { |
| | | return when (factorName) { |
| | | NO2.des, |
| | | CO.des, |
| | |
| | | "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> |
| | | <generatorConfiguration> |
| | | <!-- æ°æ®åºé©±å¨:éæ©ä½ çæ¬å°ç¡¬çä¸é¢çæ°æ®åºé©±å¨å
--> |
| | | <classPathEntry location="C:\Users\feiyu\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/> |
| | | <!-- <classPathEntry location="C:\Users\feiyu02\.m2\repository\mysql\mysql-connector-java\8.0.21\mysql-connector-java-8.0.21.jar"/>--> |
| | | <!-- <classPathEntry location="C:\Users\feiyu\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/>--> |
| | | <classPathEntry location="C:\Users\feiyu02\.m2\repository\mysql\mysql-connector-java\8.0.21\mysql-connector-java-8.0.21.jar"/> |
| | | <!--defaultModelType{ |
| | | conditional:è¿ä¸ªæ¨¡åä¸hierarchical模åç¸ä¼¼,é¤äºå¦æä¸ä¸ªå®ä½ç±»åªå
å«ä¸ä¸ªå段,åä¸ä¼åç¬çææ¤å®ä½ç±»ãå æ¤,妿ä¸ä¸ªè¡¨ç主é®åªæä¸ä¸ªå段,é£ä¹ä¸ä¼ä¸ºè¯¥å段çæåç¬çå®ä½ç±»,ä¼å°è¯¥å段åå¹¶å°åºæ¬å®ä½ç±»ä¸ã |
| | | flat:该模å为æ¯ä¸å¼ 表åªçæä¸ä¸ªå®ä½ç±»ãè¿ä¸ªå®ä½ç±»å
å«è¡¨ä¸çææå段ã |
| | |
| | | <result column="kilometres" jdbcType="REAL" property="kilometres" /> |
| | | <result column="region" jdbcType="VARCHAR" property="region" /> |
| | | <result column="pollution_degree" jdbcType="VARCHAR" property="pollutionDegree" /> |
| | | <result column="aqi" jdbcType="INTEGER" property="aqi" /> |
| | | </resultMap> |
| | | <sql id="Base_Column_List"> |
| | | <!-- |
| | |
| | | --> |
| | | mission_code, device_type, device_code, start_time, end_time, data_pulled, province_code, |
| | | province_name, city_code, city_name, district_code, district_name, town_code, town_name, |
| | | kilometres, region, pollution_degree |
| | | kilometres, region, pollution_degree, aqi |
| | | </sql> |
| | | </mapper> |
| | |
| | | package com.flightfeather.uav.biz.report |
| | | |
| | | import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue |
| | | import com.flightfeather.uav.domain.entity.Mission |
| | | import com.flightfeather.uav.domain.mapper.MissionMapper |
| | | import com.flightfeather.uav.domain.repository.SourceTraceRep |
| | | import com.flightfeather.uav.lightshare.bean.AreaVo |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired |
| | | import org.springframework.boot.test.context.SpringBootTest |
| | | import org.springframework.test.context.junit4.SpringRunner |
| | | import tk.mybatis.mapper.entity.Example |
| | | import java.time.LocalDateTime |
| | | import java.time.ZoneId |
| | | import java.time.ZoneOffset |
| | | import java.util.Date |
| | | |
| | | @RunWith(SpringRunner::class) |
| | |
| | | fun testMissionSummary() { |
| | | val startTime = Date.from(LocalDateTime.of(2025,7,1,0,0,0).atZone(ZoneId.systemDefault()).toInstant()) |
| | | val endTime = Date.from(LocalDateTime.of(2025, 9, 30, 23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()) |
| | | val summary = dataAnalysisService.missionSummary(startTime, endTime, AreaVo().apply { |
| | | val summary = dataAnalysisService.generateMissionSummary(startTime, endTime, AreaVo().apply { |
| | | provinceCode = "31" |
| | | cityCode = "3100" |
| | | districtCode = "310106" |
| | |
| | | package com.flightfeather.uav.lightshare.service.impl |
| | | |
| | | import com.flightfeather.uav.lightshare.bean.AreaVo |
| | | import com.flightfeather.uav.lightshare.service.DataAnalysisService |
| | | import junit.framework.TestCase |
| | | import org.junit.Test |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired |
| | | import org.springframework.boot.test.context.SpringBootTest |
| | | import org.springframework.test.context.junit4.SpringRunner |
| | | import java.time.LocalDateTime |
| | | import java.time.ZoneId |
| | | import java.util.* |
| | | |
| | | @RunWith(SpringRunner::class) |
| | | @SpringBootTest |
| | |
| | | |
| | | @Autowired |
| | | lateinit var dataAnalysisService: DataAnalysisService |
| | | |
| | | val startTime = Date.from(LocalDateTime.of(2025,7,1,0,0,0).atZone(ZoneId.systemDefault()).toInstant()) |
| | | val endTime = Date.from(LocalDateTime.of(2025, 9, 30, 23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()) |
| | | val areaVo = AreaVo().apply { |
| | | provinceCode = "31" |
| | | cityCode = "3100" |
| | | districtCode = "310106" |
| | | } |
| | | |
| | | @Test |
| | | fun testPollutionTrace() { |
| | |
| | | fun fetchHistory() { |
| | | dataAnalysisService.fetchHistory("SH-CN-20250723(01)") |
| | | } |
| | | |
| | | @Test |
| | | fun generateMissionList() { |
| | | val res = dataAnalysisService.generateMissionList(startTime, endTime, areaVo) |
| | | println(res) |
| | | } |
| | | |
| | | @Test |
| | | fun generateMissionDetail() { |
| | | val res = dataAnalysisService.generateMissionDetail(startTime, endTime, areaVo) |
| | | println(res) |
| | | } |
| | | |
| | | @Test |
| | | fun generateClueByRiskArea() { |
| | | val res = dataAnalysisService.generateClueByRiskArea(startTime, endTime, areaVo) |
| | | println(res) |
| | | } |
| | | } |