feiyu02
2025-07-04 9c797fa0d704ef8ffb65cd1716b8eb694b4c46c3
src/main/kotlin/com/flightfeather/uav/socket/processor/UnderwayProcessor.kt
@@ -1,18 +1,20 @@
package com.flightfeather.uav.socket.processor
import com.flightfeather.uav.biz.sourcetrace.SourceTraceController
import com.flightfeather.uav.domain.entity.BaseRealTimeData
import com.flightfeather.uav.model.epw.EPWDataPrep
import com.flightfeather.uav.domain.repository.AirDataRep
import com.flightfeather.uav.domain.repository.SceneInfoRep
import com.flightfeather.uav.domain.repository.SourceTraceRep
import com.flightfeather.uav.socket.bean.AirDataPackage
import com.flightfeather.uav.socket.decoder.AirDataDecoder
import com.flightfeather.uav.socket.decoder.DataPackageDecoder
import com.flightfeather.uav.socket.eunm.AirCommandUnit
import com.flightfeather.uav.socket.eunm.UWDeviceType
import io.netty.channel.ChannelHandlerContext
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
import java.text.SimpleDateFormat
import java.util.*
import javax.annotation.PostConstruct
/**
 * 处理socket接收的消息
@@ -21,16 +23,15 @@
 */
@Component
class UnderwayProcessor : BaseProcessor() {
class UnderwayProcessor(
    private val airDataRep: AirDataRep,
    private val sceneInfoRep: SceneInfoRep,
    private val sourceTraceRep: SourceTraceRep
) : BaseProcessor() {
    companion object {
        private lateinit var instance: UnderwayProcessor
        private const val TAG = "UAV"
    }
    @Autowired
    lateinit var airDataRep: AirDataRep
    private val airDataDecoder = AirDataDecoder.instance
    private val dataPackageDecoder = DataPackageDecoder()
@@ -38,10 +39,8 @@
    // 数据预处理函数
    private val dataProcessMap = mutableMapOf<String?, EPWDataPrep>()
    @PostConstruct
    fun init() {
        instance = this
    }
    // 实时走航污染溯源处理器
    private val sourceTraceMap = mutableMapOf<String?, SourceTraceController>()
    override var tag: String = "走航监测"
@@ -53,7 +52,15 @@
            //保存
            deviceSession.saveDevice(packageData.deviceCode, ctx)
            saveToTxt(msg)
            saveToDataBase(packageData)
            saveToDataBase(packageData)?.takeIf { it.isNotEmpty() }?.get(0)?.let {
                // 每台设备有各自单独的异常数据处理器
                if (!sourceTraceMap.containsKey(it.deviceCode)) {
                    sourceTraceMap[it.deviceCode] = SourceTraceController(sceneInfoRep, sourceTraceRep)
                }
                // 将走航数据传入异常处理器
                sourceTraceMap[it.deviceCode]?.addOneData(it)
            }
        } else {
            println("------${TAG}数据BCC校验失败,舍弃 [${SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())}]")
        }
@@ -62,21 +69,23 @@
    /**
     * 保存至数据库
     */
    fun saveToDataBase(dataPackage: AirDataPackage) {
    fun saveToDataBase(dataPackage: AirDataPackage): List<BaseRealTimeData>? {
        when (dataPackage.commandUnit) {
            AirCommandUnit.AirData.value -> {
                // 以json格式存储原始数据
                instance.airDataRep.saveAirData(dataPackage)
                airDataRep.saveAirData(dataPackage)
                // 进行预处理后,存储至对应数据表
                if (!dataProcessMap.containsKey(dataPackage.deviceCode)) {
                    // 每台设备有单独的数据预处理对象
                    dataProcessMap[dataPackage.deviceCode] = EPWDataPrep(UWDeviceType.getType(dataPackage.deviceCode))
                }
                dataProcessMap[dataPackage.deviceCode]?.run {
                return dataProcessMap[dataPackage.deviceCode]?.run {
                    val list = this.mDataPrep2(dataPackage)// 数据平滑处理
                    instance.airDataRep.savePrepData2(list)// 按照设备类型存储至对应数据表
                    airDataRep.savePrepData2(list)// 按照设备类型存储至对应数据表
                }
            }
            else -> return emptyList()
        }
    }
@@ -108,7 +117,7 @@
    fun encodeToBytes(msg: String): ByteArray {
        val list = msg.split(" ")
        val bytes = ByteArray(list.size)
        for (i in 0 until list.size) {
        for (i in list.indices) {
            bytes[i] = list[i].toInt(16).toByte()
        }