From 707b00a0ca6604c249a110b376ac1e44e408e624 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 04 九月 2025 18:24:39 +0800
Subject: [PATCH] 2025.9.4 1. 新增走航任务统计功能(待完成)

---
 src/main/kotlin/com/flightfeather/uav/domain/entity/ExpandFun.kt |  208 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 205 insertions(+), 3 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/ExpandFun.kt b/src/main/kotlin/com/flightfeather/uav/domain/entity/ExpandFun.kt
index 46d5633..0fa5483 100644
--- a/src/main/kotlin/com/flightfeather/uav/domain/entity/ExpandFun.kt
+++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/ExpandFun.kt
@@ -1,9 +1,16 @@
 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 kotlin.math.atan
+import kotlin.math.cos
+import kotlin.math.round
+import kotlin.math.sin
 
 /**
  * 鏁版嵁搴撹〃瀹炰綋鎵╁睍鏂规硶
@@ -16,7 +23,7 @@
     list.add("绾害")
     val values = GsonUtils.parserJsonToArrayBeans(factors, AirData::class.java)
     values.forEach {
-        if (FactorType.outputFactor(it.factorName)) {
+        if (FactorType.isOutputFactor(it.factorName)) {
             val name = it.factorName ?: ""
             list.add(name)
 //            list.add("$name(鐗╃悊閲�)")
@@ -41,13 +48,20 @@
     }
     val values = GsonUtils.parserJsonToArrayBeans(factors, AirData::class.java)
     values.forEach {
-        if (FactorType.outputFactor(it.factorName)) {
+        if (FactorType.isOutputFactor(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(
@@ -97,4 +111,192 @@
             factorData = mvPowerC
         },
     )
-}
\ No newline at end of file
+}
+
+
+/** 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 GridDataDetail.getByFactorType(type: FactorType?): Float? {
+    return when (type) {
+        NO2 -> no2
+        CO -> co
+        H2S -> h2s
+        SO2 -> so2
+        O3 -> o3
+        PM25 -> pm25
+        PM10 -> pm10
+        TEMPERATURE -> temperature
+        HUMIDITY -> humidity
+        VOC -> voc
+        NOI -> noi
+        WIND_SPEED -> windSpeed
+        WIND_DIRECTION -> windDirection
+        NO -> no
+        else -> null
+    }
+}
+
+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: 鐪熷疄瑙掑害澶勪簬绗竴璞¢檺锛屼慨姝e�间负+0掳
+             * avgU>0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗簩璞¢檺锛屼慨姝e�间负+180掳
+             * avgU<0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗笁璞¢檺锛屼慨姝e�间负+180掳
+             * avgU<0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗洓璞¢檺锛屼慨姝e�间负+360掳
+             */
+            a += if (avgV > 0) {
+                if (avgU > 0) 0 else 360
+            } else {
+                180
+            }
+            windDirection = round(a.toFloat())
+        }
+    }
+}
+/** GridDataDetail-over ********************************************************************/
\ No newline at end of file

--
Gitblit v1.9.3