feiyu02
2025-09-04 707b00a0ca6604c249a110b376ac1e44e408e624
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
@@ -1,19 +1,20 @@
package com.flightfeather.uav.lightshare.service.impl
import com.flightfeather.uav.common.exception.ResponseErrorException
import com.flightfeather.uav.common.exception.BizException
import com.flightfeather.uav.common.scaleMap
import com.flightfeather.uav.common.utils.DateUtil
import com.flightfeather.uav.common.utils.ExcelUtil
import com.flightfeather.uav.common.utils.FileExchange
import com.flightfeather.uav.common.utils.GsonUtils
import com.flightfeather.uav.dataprocess.AverageUtil
import com.flightfeather.uav.biz.dataprocess.AverageUtil
import com.flightfeather.uav.domain.entity.*
import com.flightfeather.uav.domain.mapper.*
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.lightshare.bean.*
import com.flightfeather.uav.lightshare.service.RealTimeDataService
import com.flightfeather.uav.model.epw.EPWDataPrep
import com.flightfeather.uav.repository.AirDataRepository
import com.flightfeather.uav.socket.bean.AirData
import com.flightfeather.uav.domain.repository.AirDataRep
import com.flightfeather.uav.socket.eunm.UWDeviceType
import com.github.pagehelper.PageHelper
import org.apache.poi.xssf.streaming.SXSSFWorkbook
@@ -30,19 +31,21 @@
import java.time.format.DateTimeFormatter
import java.util.*
import javax.servlet.http.HttpServletResponse
import javax.swing.text.DateFormatter
import kotlin.math.sqrt
@Service
class RealTimeDataServiceImpl(
    private val realTimeDataMapper: RealTimeDataMapper,
    private val airDataRepository: AirDataRepository,
    private val airDataRep: AirDataRep,
    private val realTimeDataVehicleMapper: RealTimeDataVehicleMapper,
    private val realTimeDataUavMapper: RealTimeDataUavMapper,
    private val realTimeDataGridMapper: RealTimeDataGridMapper,
    private val realTimeDataGridOptMapper: RealTimeDataGridOptMapper,
    private val realTimeDataGridMinMapper: RealTimeDataGridMinMapper,
    private val missionMapper: MissionMapper,
    private val missionRep: MissionRep,
    private val realTimeDataRep: RealTimeDataRep,
    private val segmentInfoRep: SegmentInfoRep,
) : RealTimeDataService {
    @Value("\${filePath}")
@@ -53,6 +56,7 @@
    private val fileExchange = FileExchange()
    override fun getSecondData(
        deviceType: String?,
        deviceCode: String?,
        startTime: String?,
        endTime: String?,
@@ -69,7 +73,12 @@
        var pages = 0
        val result = mutableListOf<DataVo>()
        when (UWDeviceType.getType(deviceCode)) {
        val _deviceType = if (deviceType != null) {
            UWDeviceType.fromValue(deviceType)
        } else {
            UWDeviceType.getType(deviceCode)
        }
        when (_deviceType) {
            UWDeviceType.VEHICLE -> {
                val pageInfo = PageHelper.startPage<RealTimeDataVehicle>(_page, _perPage)
                realTimeDataVehicleMapper.selectByExample(Example(RealTimeDataVehicle::class.java).apply {
@@ -184,6 +193,31 @@
        example.orderBy("dataTime")
    }
    override fun getSegmentData(missionCode: String): List<List<DataVo>> {
        val mission = missionRep.findOne(missionCode) ?: throw BizException("任务不存在")
        val data = realTimeDataRep.fetchData(mission)
        val segInfo = SegmentInfo().apply { this.missionCode = missionCode }
        val segList = segmentInfoRep.findList(segInfo)
//        return TrackSegment.segmentWithRoad(data).map { it.map { b -> b.toDataVo() } }
        val res = mutableListOf<MutableList<DataVo>>()
        res.add(mutableListOf())
        var index = 0
        data.forEach {
            if (it.dataTime == null) return@forEach
            if (it.dataTime!! <= segList[index]?.endTime) {
                res[index].add(it.toDataVo())
                if (it.dataTime!! == segList[index]?.endTime) {
                    index++
                    res.add(mutableListOf())
                }
            }
        }
        // 移除最后一个空集合
        if (res.last().isEmpty()) res.removeLast()
        return res
    }
    override fun importData(file: MultipartFile): BaseResponse<DataImportResult> {
        val f = ByteArrayInputStream(file.bytes)
        fileExchange.exchangeBoatData("0c0000000001", f).forEach {
@@ -194,6 +228,7 @@
    override fun importJinanData(code: String, file: MultipartFile): DataImportResult {
        val f = ByteArrayInputStream(file.bytes)
//        val result = fileExchange.exchangeVehicleData(code, f)
        val result = fileExchange.exchangeJinanData(code, f)
        if (result.isNotEmpty()) {
            val first = result.first()
@@ -205,7 +240,7 @@
                deviceType = UWDeviceType.getType(code)?.value
                deviceCode = code
            }
            missionMapper.selectOne(mission)?.run { throw ResponseErrorException("该设备该时段任务已存在,无法重复导入") }
            missionMapper.selectOne(mission)?.run { throw BizException("该设备该时段任务已存在,无法重复导入") }
            mission.apply {
                startTime = first.dataTime
                endTime = last.dataTime
@@ -360,7 +395,7 @@
            println("当前页数:$page")
            val dataList = res.data ?: emptyList()
            val result = epwDataPrep.mDataPrep2(dataList)
            count += airDataRepository.savePrepData2(result)
            count += airDataRep.savePrepData2(result).size
            page++
        }
@@ -376,7 +411,7 @@
        val averageUtil = AverageUtil<RealTimeDataGridOpt, RealTimeDataGridMin>({ d ->
            minFormatter.format(d.dataTime)
        }, { list ->
            list.avg()
            list.avg() as RealTimeDataGridMin
        })
        while (total == -1 || page <= total) {