src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt
@@ -50,6 +50,8 @@ subFactorId = factor.subs.map { it.value } subFactorName = factor.subs.map { it.des } selectedFactor = factor startDate = start.dataTime endDate = end?.dataTime startTime = DateUtil.instance.dateToString(start.dataTime, DateUtil.DateStyle.HH_MM_SS) endTime = DateUtil.instance.dateToString(end?.dataTime, DateUtil.DateStyle.HH_MM_SS) ?: startTime startData = start.getByFactorType(factor.main) src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt
@@ -10,7 +10,11 @@ import com.flightfeather.uav.common.location.LocationRoadNearby import com.flightfeather.uav.domain.entity.Mission import com.flightfeather.uav.domain.repository.RealTimeDataRep import com.flightfeather.uav.domain.repository.SegmentInfoRep import org.springframework.stereotype.Component import java.time.LocalDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter /** * 数据异常分析控制器 @@ -19,6 +23,7 @@ class ExceptionAnalysisController( private val realTimeDataRep: RealTimeDataRep, private val locationRoadNearby: LocationRoadNearby, private val segmentInfoRep: SegmentInfoRep, ) { var running = false @@ -49,22 +54,11 @@ taskList.forEach { it.onDone() } taskList.forEach { // 查询异常周边可能污染源 it.resultList.forEach { r-> if (r.longitude != null && r.latitude != null) { val sceneList = locationRoadNearby.searchByRadius( r.longitude!!.toDouble() to r.latitude!!.toDouble(), config.radius) if (sceneList.isNotEmpty()) { val idList = mutableListOf<String>() val nameList = mutableListOf<String>() sceneList.forEach { s-> idList.add(s?.guid?:"") nameList.add(s?.name ?: "") } r.relatedSceneId = idList r.relatedSceneName = nameList } } // 查询异常周边可能污染源 nearBy(r, config) // 查询时段所在路段 road(r) } // 存储分析结果 result.addAll(it.resultList) @@ -72,4 +66,47 @@ running = false return result } private fun nearBy(r: ExceptionResult, config: DataAnalysisConfig) { if (r.longitude != null && r.latitude != null) { val sceneList = locationRoadNearby.searchByRadius( r.longitude!!.toDouble() to r.latitude!!.toDouble(), config.radius) if (sceneList.isNotEmpty()) { val idList = mutableListOf<String>() val nameList = mutableListOf<String>() sceneList.forEach { s-> idList.add(s?.guid?:"") nameList.add(s?.name ?: "") } r.relatedSceneId = idList r.relatedSceneName = nameList } } } private fun road(r: ExceptionResult) { val sT = LocalDateTime.ofInstant(r.startDate?.toInstant(), ZoneId.systemDefault()) val eT = LocalDateTime.ofInstant(r.endDate?.toInstant(), ZoneId.systemDefault()) val segments = segmentInfoRep.findPeriod(sT, eT) var txt = "" val size = segments.size segments.forEachIndexed { i, s -> txt += if (i == 0) { if (size == 1) { "在${s?.street}" } else { "从${s?.street}" } } else if (i == size - 1 && i >= 2) { ",至${s?.street}" } else { if (i == 1) { ",经${s?.street}" } else { "、${s?.street}" } } } r.road = txt } } src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/ExceptionResult.kt
@@ -3,6 +3,7 @@ import com.flightfeather.uav.biz.FactorFilter import com.flightfeather.uav.domain.entity.BaseRealTimeData import java.math.BigDecimal import java.util.* /** * 异常结果 @@ -18,6 +19,8 @@ var subFactorId: List<Int>? = null var subFactorName: List<String>? = null var selectedFactor: FactorFilter.SelectedFactor? = null var startDate: Date? = null var endDate: Date? = null var startTime: String? = null var endTime: String? = null var startData: Float? = null @@ -25,6 +28,8 @@ var avg: Float? = null var min: Float? = null var max: Float? = null // 途经路段 var road: String? = null // 中心点经纬度 var longitude: BigDecimal? = null var latitude: BigDecimal? = null src/main/kotlin/com/flightfeather/uav/domain/repository/SegmentInfoRep.kt
@@ -3,6 +3,8 @@ import com.flightfeather.uav.domain.entity.SegmentInfo import com.flightfeather.uav.domain.mapper.SegmentInfoMapper import org.springframework.stereotype.Repository import tk.mybatis.mapper.entity.Example import java.time.LocalDateTime /** * 轨迹分隔数据库操作 @@ -19,4 +21,24 @@ fun findList(segmentInfo: SegmentInfo): List<SegmentInfo?> { return segmentInfoMapper.select(segmentInfo) } /** * 查询时段所涉及的所有路段 * */ fun findPeriod(sTime: LocalDateTime?, eTime: LocalDateTime?): List<SegmentInfo?> { return segmentInfoMapper.selectByExample((Example(SegmentInfo::class.java).apply { createCriteria().andLessThanOrEqualTo("startTime", sTime) .andGreaterThanOrEqualTo("endTime", sTime) or( createCriteria().andLessThanOrEqualTo("startTime", eTime) .andGreaterThanOrEqualTo("endTime", eTime) ) or( createCriteria().andGreaterThanOrEqualTo("startTime", sTime) .andLessThanOrEqualTo("endTime", eTime) ) orderBy("startTime") })) } } src/main/resources/templates/report-underway.ftl
@@ -1252,7 +1252,7 @@ <w:szCs w:val="28" /> <w:lang w:val="en-US" w:eastAsia="zh-CN" /> </w:rPr> <w:t>${item_index + 1}. 从${item.startTime}至${item.endTime},${item.factorName}出现${item.exception}<#if item.relatedSceneName??>,结合监测数据变化和受点反向溯源,<#list item.relatedSceneName as scene><#if (scene_index > 0)>、</#if>${scene}</#list>等可能存在污染风险。<#else>。</#if></w:t> <w:t>${item_index + 1}. 从${item.startTime}至${item.endTime},${item.road},${item.factorName}出现${item.exception}<#if item.relatedSceneName??>,结合监测数据变化和受点反向溯源,<#list item.relatedSceneName as scene><#if (scene_index > 0)>、</#if>${scene}</#list>等可能存在污染风险。<#else>。</#if></w:t> </w:r> </w:p> <w:p>