feiyu02
2025-04-11 635d762aef37b5de6cd2e34f4a076ab56d9a239d
src/main/kotlin/com/flightfeather/uav/domain/entity/ExpandFun.kt
@@ -1,9 +1,19 @@
package com.flightfeather.uav.domain.entity
import com.flightfeather.uav.biz.dataprocess.AvgPair
import com.flightfeather.uav.common.utils.DateUtil
import com.flightfeather.uav.common.utils.GsonUtils
import com.flightfeather.uav.lightshare.bean.DataVo
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
import kotlin.math.sin
/**
 * 数据库表实体扩展方法
@@ -48,6 +58,13 @@
    }
    return row.toTypedArray()
}
fun RealTimeData.toDataVo() = DataVo(
    DateUtil.instance.dateToString(dataTime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS),
    deviceCode,
    GsonUtils.parserJsonToArrayBeans(factors, AirData::class.java),
    longitude?.toDouble(), latitude?.toDouble()
)
fun ElectricMinuteValue.toAirData(): List<AirData> {
    return listOf(
@@ -97,4 +114,172 @@
            factorData = mvPowerC
        },
    )
}
}
/** GridDataDetail-start ********************************************************************/
/**
 * 根据监测因子类型赋值
 */
fun GridDataDetail.setFactorValue(type: FactorType?, value: Float) {
    when (type) {
        NO -> no = value
        NO2 -> no2 = value
        CO -> co = value
        H2S -> h2s = value
        SO2 -> so2 = value
        O3 -> o3 = value
        PM25 -> pm25 = value
        PM10 -> pm10 = value
        TEMPERATURE -> temperature = value
        HUMIDITY -> humidity = value
        VOC -> voc = value
        NOI -> noi = value
        WIND_SPEED -> windSpeed = value
        WIND_DIRECTION -> windDirection = value
        LNG -> TODO("no such factor")
        LAT -> TODO("no such factor")
        VELOCITY -> TODO("no such factor")
        TIME -> TODO("no such factor")
        HEIGHT -> TODO("no such factor")
        else -> TODO("no such factor")
    }
}
fun List<GridDataDetail>.avg(): GridDataDetail {
    //风向采用单位矢量法求取均值
    var u = .0//东西方位分量总和
    var v = .0//南北方位分量总和
    var c = 0//风向数据计数
    //除风向外的其他因子采用算术平均法求取均值
    val tmpList = mutableListOf<AvgPair>()
    repeat(18) {
        tmpList.add(AvgPair(0f, 0))
    }
    forEach { f ->
        //风向
        f.windDirection?.let { w ->
            val r = Math.toRadians(w.toDouble())
            u += sin(r)
            v += cos(r)
            c++
        }
        //其余因子
        tmpList[0].apply {
            f.no2?.let {
                t += it
                this.c++
            }
        }
        tmpList[1].apply {
            f.co?.let {
                t += it
                this.c++
            }
        }
        tmpList[2].apply {
            f.h2s?.let {
                t += it
                this.c++
            }
        }
        tmpList[3].apply {
            f.so2?.let {
                t += it
                this.c++
            }
        }
        tmpList[4].apply {
            f.o3?.let {
                t += it
                this.c++
            }
        }
        tmpList[5].apply {
            f.pm25?.let {
                t += it
                this.c++
            }
        }
        tmpList[6].apply {
            f.pm10?.let {
                t += it
                this.c++
            }
        }
        tmpList[7].apply {
            f.temperature?.let {
                t += it
                this.c++
            }
        }
        tmpList[8].apply {
            f.humidity?.let {
                t += it
                this.c++
            }
        }
        tmpList[9].apply {
            f.voc?.let {
                t += it
                this.c++
            }
        }
        tmpList[10].apply {
            f.noi?.let {
                t += it
                this.c++
            }
        }
        tmpList[11].apply {
            f.windSpeed?.let {
                t += it
                this.c++
            }
        }
        tmpList[12].apply {
            f.no?.let {
                t += it
                this.c++
            }
        }
    }
    return GridDataDetail().apply {
        no2 = tmpList[0].avg()
        co = tmpList[1].avg()
        h2s = tmpList[2].avg()
        so2 = tmpList[3].avg()
        o3 = tmpList[4].avg()
        pm25 = tmpList[5].avg()
        pm10 = tmpList[6].avg()
        temperature = tmpList[7].avg()
        humidity = tmpList[8].avg()
        voc = tmpList[9].avg()
        noi = tmpList[10].avg()
        windSpeed = tmpList[11].avg()
        no = tmpList[12].avg()
        if (c != 0) {
            val avgU = u / c
            val avgV = v / c
            var a = atan(avgU / avgV)
            a = Math.toDegrees(a)
            /**
             * avgU>0;avgV>0: 真实角度处于第一象限,修正值为+0°
             * avgU>0;avgV<0: 真实角度处于第二象限,修正值为+180°
             * avgU<0;avgV<0: 真实角度处于第三象限,修正值为+180°
             * avgU<0;avgV>0: 真实角度处于第四象限,修正值为+360°
             */
            a += if (avgV > 0) {
                if (avgU > 0) 0 else 360
            } else {
                180
            }
            windDirection = round(a.toFloat())
        }
    }
}
/** GridDataDetail-over ********************************************************************/