From db7243622e8b5f4cc23de5594b2d973562f0b2a3 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期三, 10 十一月 2021 09:54:36 +0800
Subject: [PATCH] 1. 添加网格化数据分钟均值计算逻辑

---
 src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt                             |   11 ++
 src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt                  |  155 +++++++++++++++++++++++++++++++
 src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java                |    1 
 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt |   22 +++-
 src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt                         |   53 ++++++++++
 5 files changed, 237 insertions(+), 5 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt b/src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt
new file mode 100644
index 0000000..316fe93
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt
@@ -0,0 +1,53 @@
+package com.flightfeather.uav.dataprocess
+
+/**
+ * 鍧囧�艰绠楀伐鍏凤紝灏嗕竴缁勮繛缁暟鎹浆鎹负鑷畾涔夊懆鏈熺殑鍧囧�兼暟鎹�
+ * 瑕佹眰浼犲叆鐨勬暟鎹寜鐓ф椂闂撮『搴忔帓鍒楋紝
+ * @param onTag 瀹氫箟鏁版嵁鏍囩鑾峰彇鍥炶皟鍑芥暟锛屽綋褰撳墠鏁版嵁鏍囩涓庝笂涓暟鎹爣绛句笉鍚屾椂锛屽嵆璁や负涓婁竴缁勬暟鎹负鍚屼竴缁勬暟鎹紝闇�姹傚嚭鍧囧��
+ * @param onAvg 瀹氫箟鍧囧�艰绠楁柟娉�
+ */
+class AverageUtil<T : Any>(var onTag: (d: T) -> String, var onAvg: (list: List<T>) -> T) {
+
+    // 缂撳瓨鏈�鏂扮殑tag
+    private var lastTag: String? = null
+    // 涓存椂鏁版嵁缂撳瓨
+    private val dataSet = mutableListOf<T>()
+    // 杞崲缁撴灉
+    private val result = mutableListOf<T>()
+
+    /**
+     * 灏嗘暟鎹泦杞崲涓哄潎鍊兼暟鎹�
+     * @param list 鍘熷鏁版嵁
+     * @return 鍧囧�兼暟鎹�
+     */
+    fun avg(list: List<T>): List<T> {
+        // 鍒濆鍖栨墍鏈夊彉閲�
+        clear()
+        // 璁$畻鍧囧��
+        list.forEach {
+            val tag = onTag(it)
+            // 绗竴鏉℃暟鎹拰tag鐩稿悓鏃讹紝灏嗘暟鎹斁鍏ヤ复鏃剁紦瀛樺垪琛�
+            if (lastTag == null || tag == lastTag) {
+                dataSet.add(it)
+            }
+            // 褰搕ag涓嶅悓鏃讹紝璁$畻涔嬪墠鏁版嵁鐨勫潎鍊硷紝鍚屾椂鎯呭喌涓存椂鏁版嵁缂撳瓨锛屾坊鍔犲綋鍓嶇殑鏂版暟鎹�
+            else {
+                result.add(onAvg(dataSet))
+                dataSet.clear()
+                dataSet.add(it)
+            }
+            lastTag = tag
+        }
+        // 鍒楄〃寰幆缁撴潫鍚庯紝鑻ョ紦瀛樺垪琛ㄤ腑浠嶆湁鏁版嵁锛屽垯璁$畻鏈�鍚庝竴涓潎鍊�
+        if (dataSet.isNotEmpty()) {
+            result.add(onAvg(dataSet))
+        }
+        return result
+    }
+
+    private fun clear() {
+        lastTag = null
+        dataSet.clear()
+        result.clear()
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt b/src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt
new file mode 100644
index 0000000..02daa91
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt
@@ -0,0 +1,11 @@
+package com.flightfeather.uav.dataprocess
+
+data class AvgPair(
+    var t: Float, var c: Int
+){
+    fun avg(): Float = if (c == 0) {
+        0f
+    } else {
+        t / c
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt
index a94c014..cb51649 100644
--- a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt
+++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt
@@ -1,13 +1,19 @@
 package com.flightfeather.uav.domain.entity
 
 import com.flightfeather.uav.common.utils.DateUtil
+import com.flightfeather.uav.dataprocess.AvgPair
 import com.flightfeather.uav.lightshare.bean.DataVo
 import com.flightfeather.uav.socket.bean.AirData
 import com.flightfeather.uav.socket.eunm.FactorType
 import java.math.BigDecimal
+import java.time.LocalDateTime
+import java.time.ZoneId
+import java.time.ZoneOffset
 import java.util.*
 import javax.persistence.Column
 import javax.persistence.Id
+import kotlin.math.cos
+import kotlin.math.sin
 
 /**
  * 瀹炴椂鐩戞祴鏁版嵁鍩虹被
@@ -103,4 +109,153 @@
             add(AirData().apply { setData(FactorType.HEIGHT, height) })
         }
     }
+}
+
+fun List<RealTimeDataGrid>.avg(): RealTimeDataGrid {
+    //椋庡悜閲囩敤鍗曚綅鐭㈤噺娉曟眰鍙栧潎鍊�
+    var u = 0f//涓滆タ鏂逛綅鍒嗛噺鎬诲拰
+    var v = 0f//鍗楀寳鏂逛綅鍒嗛噺鎬诲拰
+    var c = 0//椋庡悜鏁版嵁璁℃暟
+
+    //闄ら鍚戝鐨勫叾浠栧洜瀛愰噰鐢ㄧ畻鏈钩鍧囨硶姹傚彇鍧囧��
+    val tmpList = mutableListOf<AvgPair>()
+    repeat(17) {
+        tmpList.add(AvgPair(0f, 0))
+    }
+
+    forEach {
+        //椋庡悜
+        it.windDirection?.let {w ->
+            u += sin(w)
+            v += cos(w)
+            c++
+        }
+        //鍏朵綑鍥犲瓙
+        tmpList[0].apply {
+            it.latitude?.let {
+                t += it.toFloat()
+                this.c++
+            }
+        }
+        tmpList[1].apply {
+            it.longitude?.let {
+                t += it.toFloat()
+                this.c++
+            }
+        }
+        tmpList[2].apply {
+            it.altitude?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[3].apply {
+            it.no2?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[4].apply {
+            it.co?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[5].apply {
+            it.h2s?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[6].apply {
+            it.so2?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[7].apply {
+            it.o3?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[8].apply {
+            it.pm25?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[9].apply {
+            it.pm10?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[10].apply {
+            it.temperature?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[11].apply {
+            it.humidity?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[12].apply {
+            it.voc?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[13].apply {
+            it.noi?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[14].apply {
+            it.velocity?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[15].apply {
+            it.windSpeed?.let {
+                t += it
+                this.c++
+            }
+        }
+        tmpList[16].apply {
+            it.height?.let {
+                t += it
+                this.c++
+            }
+        }
+    }
+
+    return RealTimeDataGrid().apply {
+        val time = LocalDateTime.ofInstant(get(0).dataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0)
+        deviceCode = get(0).deviceCode
+        dataTime = Date.from(time.atZone(ZoneId.systemDefault()).toInstant())
+        createTime = dataTime
+        latitude = tmpList[0].avg().toBigDecimal()
+        longitude = tmpList[1].avg().toBigDecimal()
+        altitude = tmpList[2].avg()
+        no2 = tmpList[3].avg()
+        co = tmpList[4].avg()
+        h2s = tmpList[5].avg()
+        so2 = tmpList[6].avg()
+        o3 = tmpList[7].avg()
+        pm25 = tmpList[8].avg()
+        pm10 = tmpList[9].avg()
+        temperature = tmpList[10].avg()
+        humidity = tmpList[11].avg()
+        voc = tmpList[12].avg()
+        noi = tmpList[13].avg()
+        velocity = tmpList[14].avg()
+        windSpeed = tmpList[15].avg()
+        height = tmpList[16].avg()
+    }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java b/src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java
index 38cbd30..b6e5dce 100644
--- a/src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java
+++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java
@@ -6,4 +6,5 @@
 
 @Table(name = "real_time_data_grid")
 public class RealTimeDataGrid extends BaseRealTimeData {
+
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
index 718bc7a..ed3f0f2 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
@@ -4,6 +4,7 @@
 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.domain.entity.*
 import com.flightfeather.uav.domain.mapper.RealTimeDataGridMapper
 import com.flightfeather.uav.domain.mapper.RealTimeDataMapper
@@ -276,17 +277,28 @@
         var total = -1
         var count = 0
 
+        val minFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm")
+        val averageUtil = AverageUtil<RealTimeDataGrid>({d ->
+            minFormatter.format(d.dataTime)
+        },{list ->
+            list.avg()
+        })
+
         while (total == -1 || page <= total) {
             println("------start------")
-            val res = getOriginData("0d0000000001", "2021-07-05 19:47:01", "2021-11-05 00:00:00", page, 50000)
-            res.head?.let {
-                total = it.totalPage
-            }
+
+            val p = PageHelper.startPage<RealTimeDataGrid>(page, 50000)
+            val res = realTimeDataGridMapper.selectByExample(Example(RealTimeDataGrid::class.java).apply {
+                createCriteria().andBetween("dataTime", "2021-06-01 00:00:00", "2021-11-05 00:00:00")
+            })
+
+            total = p.pages
+
             if (page == 1) {
                 println("鎬婚〉鏁帮細$total")
             }
             println("褰撳墠椤垫暟锛�$page")
-            res.data?.forEach {
+            averageUtil.avg(res).forEach {
 
             }
 

--
Gitblit v1.9.3