feiyu02
2025-03-28 8cf331411ea79c0d83e00657ed1374b29b09f4d7
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
@@ -108,14 +108,15 @@
    }
    @Transactional
    override fun splitData(groupId: Int, dataId:Int): List<GridDataDetail?> {
    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: 此处根据现有的网格信息设计方式,使用临时的参数,后续将网格通过二维坐标形式表示,此处参数去除
@@ -208,8 +256,8 @@
        val resMap = mutableMapOf<Int, MutableList<GridDataDetail>>()
        // 循环计算每个网格的周边扩散网格结果
        gridDataDetailList.forEach {gdd ->
            SatelliteGridManage.heatMap(gdd, gridCellList, option, searchLength).forEach {r ->
        gridDataDetailList.forEach { gdd ->
            SatelliteGridManage.heatMap(gdd, gridCellList, option, searchLength).forEach { r ->
                if (!originCellIdList.contains(r.cellId)) {
                    if (!resMap.containsKey(r.cellId)) {
                        resMap[r.cellId] = mutableListOf()