From 88ae069fcf657c1790bb04b444e150c06f04e5f6 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 30 十二月 2021 11:50:46 +0800
Subject: [PATCH] 1. 网格化风向权重分析完善

---
 src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt |   87 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 77 insertions(+), 10 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt b/src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt
index aca6e91..e6e9ebc 100644
--- a/src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt
+++ b/src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt
@@ -6,6 +6,7 @@
 import com.flightfeather.uav.lightshare.bean.ElectricDailyInfo
 import java.time.LocalDateTime
 import java.time.ZoneId
+import kotlin.math.round
 
 /**
  * 鐢ㄧ數閲忔棩鍒嗘瀽
@@ -18,11 +19,11 @@
         // 杩斿洖缁撴灉
         val result = mutableListOf<ElectricDailyInfo>()
         // 姣忔棩缁熻淇℃伅
-        val dailyInfoMap = mutableMapOf<String, ElectricDailyInfo>()
+        val dailyInfoMap = mutableMapOf<Int, ElectricDailyInfo>()
 
         // 1.鏁版嵁鍑嗗
         val deviceMap = mutableMapOf<String, CompanyDevice>()
-        val dataMap = mutableMapOf<String, MutableMap<String, MutableList<ElectricMinuteValue>>>()
+        val dataMap = mutableMapOf<String, MutableMap<Int, MutableList<ElectricMinuteValue>>>()
         deviceList.forEach {
             // 鐩戞祴鏁版嵁
             if (!dataMap.containsKey(it.cdDeviceCode)) {
@@ -34,36 +35,102 @@
         // 2.杞鏁版嵁锛岀粺璁℃瘡鏃ョ殑鍚勯」鐗瑰緛
         dataList.forEach {
             // 鑾峰彇鏃ユ湡
-            val day = DateUtil.instance.dateToString(it.mvDataTime, DateUtil.DateStyle.YYYY_MM_DD) ?: ""
+            val date = DateUtil.instance.dateToString(it.mvDataTime, DateUtil.DateStyle.YYYYMMDD) ?: ""
+            val day = date.toIntOrNull() ?: 0
             // 姣忔棩瀵瑰簲涓�缁勬暟鎹�
             if (dataMap[it.mvStatCode]?.containsKey(day) != true) dataMap[it.mvStatCode]?.put(day, mutableListOf())
             val dayList = dataMap[it.mvStatCode]?.get(day)!!
             dayList.add(it)
+            // 鏁版嵁瀵瑰簲鐘舵��
+            val device = deviceMap[it.mvStatCode]
+            val status = getStatus(it, device)
 
             // 2.1 鏍规嵁鏁版嵁鍒囨崲褰撳墠璁惧绫诲瀷
             if (!dailyInfoMap.containsKey(day)) dailyInfoMap[day] = ElectricDailyInfo()
             val dayResult = dailyInfoMap[day]!!
-            dayResult.day = day
-            dayResult.changeType(deviceMap[it.mvStatCode])
+            dayResult.day = DateUtil.instance.dateToString(it.mvDataTime, DateUtil.DateStyle.YYYY_MM_DD) ?: ""
+            dayResult.dayIndex = day
+            dayResult.changeType(device)
             // 2.2 姣忔棩鑾峰彇鐨勯涓暟鎹紝鍗充负褰撴棩璇ヨ澶囧紑鍚椂闂�
             if (dayList.size == 1) dayResult.setStartTime(it.mvDataTime)
-            // 2.3 姣忎釜鏁版嵁涓哄垎閽熷潎鍊硷紝鎬绘暟浠h〃寮�鍚椂闀�
-            dayResult.addRunTime(1)
-            // 2.4 缁熻褰撴棩璁惧杩愯鏃舵锛堝皬鏃讹級
+            // 2.3 姣忔棩鑾峰彇鐨勯涓负杩愯鐘舵�佺殑鏁版嵁锛屽嵆涓哄綋鏃ヨ璁惧姝e紡杩愯寮�濮嬫椂闂�
+            dayResult.setRunningTime(status, it)
+            // 2.4 姣忎釜鏁版嵁涓哄垎閽熷潎鍊硷紝鎬绘暟浠h〃寮�鍚椂闀�
+            dayResult.addRunTime(status)
+            // 2.5 缁熻褰撴棩璁惧杩愯鏃舵锛堝皬鏃讹級
             val hour = LocalDateTime.ofInstant(it.mvDataTime.toInstant(), ZoneId.systemDefault()).hour
             dayResult.addRunPeriod(hour)
+            // 2.6 绱鐢ㄧ數閲�
+            dayResult.addPower(it)
+            // 2.7 璁惧棣栨浠庤繍琛屽彉涓哄緟鏈烘垨鍏抽棴鐘舵�佹椂锛岃涓烘槸璁惧鐨勫叧闂椂闂�
+            dayResult.setEndTime(status, it)
         }
-        // 2.5 缁熻鍚勫彴璁惧姣忔棩缁撴潫鏃堕棿鍙婂垎鏋愮粨鏋�
+        // 2.6 缁熻鍚勫彴璁惧鍒嗘瀽缁撴灉
         dataMap.forEach { (dCode, dayMap) ->
             dayMap.forEach { (day, list) ->
                 dailyInfoMap[day]?.apply {
                     changeType(deviceMap[dCode])
-                    setEndTime(list.last().mvDataTime)
+                    setEndTime2(list.last().mvDataTime)
+                    getResult()
                 }
             }
         }
         dailyInfoMap.forEach { (_,v)-> result += v }
+        result.sortBy { it.dayIndex }
+        for (i in result.indices) {
+            if (i > 0) {
+                val last = result[i - 1]
+                val d = result[i]
+
+                // 閽堝涓ょ璁惧锛屽綋鏄ㄥぉ鐨勮澶囨湭鍏抽棴锛屼笖浠婂ぉ鐨勫紑鍚椂闂翠负0鐐�0鍒嗗唴鏃讹紝璁や负璁惧璺ㄦ棩杩愯
+                if (last.plETimeStr == null && d.plRTimeStr?.substring(11, 16) == "00:00") {
+                    d.plRTimeStr = null
+                    d.rTimeDiff = null
+                    d.sResult = true
+                }
+                if (last.pfETimeStr == null && d.pfRTimeStr?.substring(11, 16) == "00:00") {
+                    d.pfRTimeStr = null
+                    d.rTimeDiff = null
+                    d.sResult = true
+                }
+            }
+        }
 
         return result
     }
+
+    /**
+     * 鑾峰彇璁惧褰撳墠杩愯鐘舵��
+     * @param e 璁惧鐢ㄧ數閲忕洃娴嬫暟鎹�
+     * @param d 浼佷笟璁惧淇℃伅
+     * @return 鏁版嵁瀵瑰簲缁撴灉淇℃伅锛�<鐘舵�佺紪鍙凤紝鐘舵�佹弿杩帮紝鐢垫祦鍧囧��>
+     */
+    fun getStatus(e: ElectricMinuteValue?, d: CompanyDevice?): Triple<String, String, Double> {
+        var values = mutableListOf<Int>().apply {
+            d?.cdLimits?.split(";")?.forEach {
+                it.toIntOrNull()?.let { i -> add(i) }
+            }
+        }
+        var status = d?.cdStatus?.split(";") ?: emptyList()
+        var statusNames = d?.cdStatusName?.split(";") ?: emptyList()
+        if (values.isEmpty()) values = mutableListOf(1, 100)
+        if (status.isEmpty()) status = listOf("0", "2", "3")
+        if (statusNames.isEmpty()) statusNames = listOf("寰呮満", "杩愯", "瓒呰礋鑽�")
+        if (e == null) {
+            return Triple(status.first(), statusNames.first(), .0)
+        }
+
+        val electricityList = mutableListOf<Double>()
+        electricityList.add(e.mvElectricityA)
+        electricityList.add(e.mvElectricityB)
+        electricityList.add(e.mvElectricityC)
+
+        val avg = round(electricityList.average() * 100) / 100
+        for (i in values.indices) {
+            if (avg < values[i]) {
+                return Triple(status[i], statusNames[i], avg)
+            }
+        }
+        return Triple(status.last(), statusNames.last(), avg)
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3