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
|
|
/**
|
* 数据库表实体扩展方法
|
*/
|
fun RealTimeData.toRowTitle(): Array<String> {
|
val list = mutableListOf<String>()
|
list.add("编号")
|
list.add("采样时间")
|
list.add("经度")
|
list.add("纬度")
|
val values = GsonUtils.parserJsonToArrayBeans(factors, AirData::class.java)
|
values.forEach {
|
if (FactorType.outputFactor(it.factorName)) {
|
val name = it.factorName ?: ""
|
list.add(name)
|
// list.add("$name(物理量)")
|
}
|
}
|
return list.toTypedArray()
|
}
|
|
fun RealTimeData.toRowContent(): Array<Any> {
|
val row = mutableListOf<Any>()
|
row.add(deviceCode ?: "")
|
row.add(DateUtil.instance.dateToString(dataTime, "yyyy-MM-dd HH:mm:ss") ?: "")
|
if (longitude == null) {
|
row.add(-1.0)
|
} else {
|
row.add(longitude.toDouble())
|
}
|
if (latitude == null) {
|
row.add(-1.0)
|
} else {
|
row.add(latitude.toDouble())
|
}
|
val values = GsonUtils.parserJsonToArrayBeans(factors, AirData::class.java)
|
values.forEach {
|
if (FactorType.outputFactor(it.factorName)) {
|
row.add(it.factorData ?: -1.0)
|
// row.add(it.physicalQuantity ?: -1.0)
|
}
|
}
|
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(
|
AirData().apply {
|
factorId = "1"
|
factorName = "EA"
|
factorData = mvElectricityA
|
},
|
AirData().apply {
|
factorId = "2"
|
factorName = "EB"
|
factorData = mvElectricityB
|
},
|
AirData().apply {
|
factorId = "3"
|
factorName = "EC"
|
factorData = mvElectricityC
|
},
|
AirData().apply {
|
factorId = "4"
|
factorName = "VA"
|
factorData = mvVoltageA
|
},
|
AirData().apply {
|
factorId = "5"
|
factorName = "VB"
|
factorData = mvVoltageB
|
},
|
AirData().apply {
|
factorId = "6"
|
factorName = "VC"
|
factorData = mvVoltageC
|
},
|
AirData().apply {
|
factorId = "7"
|
factorName = "PA"
|
factorData = mvPowerA
|
},
|
AirData().apply {
|
factorId = "8"
|
factorName = "PB"
|
factorData = mvPowerB
|
},
|
AirData().apply {
|
factorId = "9"
|
factorName = "PC"
|
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 ********************************************************************/
|