From 7ecdc67dfb92b63bdc742e5c95d62bf9774cbd7f Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期一, 13 十一月 2023 16:06:24 +0800
Subject: [PATCH] 1. 新增风险值的计算逻辑;

---
 src/main/java/com/flightfeather/monitor/analysis/dust/risk/DustRiskAnalysis.kt |  133 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 133 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/risk/DustRiskAnalysis.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/risk/DustRiskAnalysis.kt
new file mode 100644
index 0000000..df364e2
--- /dev/null
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/risk/DustRiskAnalysis.kt
@@ -0,0 +1,133 @@
+package com.flightfeather.monitor.analysis.dust.risk
+
+import com.flightfeather.monitor.domain.ds1.entity.*
+import com.flightfeather.monitor.enumration.dust.ExceptionType
+
+/**
+ * 鎵皹鐩戞祴鏁版嵁椋庨櫓鍒嗘瀽鍩虹被
+ */
+class DustRiskAnalysis(val config: DustExceptionSetting) {
+
+    //鍒嗘瀽缁撴灉
+    val resultList = mutableListOf<RiskValue>()
+
+    /**
+     * 鍒濆鍖�
+     */
+    fun init() {
+        resultList.clear()
+    }
+
+    /**
+     * 姣忚疆娆$殑鍒濆鍖�
+     */
+    fun roundInit() {
+        resultList.add(RiskValue())
+    }
+
+    /**
+     * 姣忚疆娆$殑椋庨櫓鍊艰绠�
+     */
+    fun roundCal(data: DustStatisticsValue, list: List<DustSiteData?>, dList: List<DustExceptionData?>) {
+        if (resultList.isEmpty()) throw IllegalStateException("缁撴灉闆唕esultList涓嶈兘涓虹┖锛�")
+
+        val res = resultList.last()
+        riskOnlineRate(res, data)
+        riskValidRate(res, data)
+        riskExceedRate(res, list)
+        riskExceptionRepetitionRate(res, dList)
+        riskExceptionType(res, dList)
+        onDone(res)
+    }
+
+    /**
+     * 鍦ㄧ嚎鐜囬闄╁��
+     */
+    fun riskOnlineRate(riskValue: RiskValue, data: DustStatisticsValue) {
+        val dayOnline = data.dayOnline.substring(0, data.dayOnline.lastIndex).toDouble() / 100
+        riskValue.onlineRisk = 1 - dayOnline
+    }
+
+    /**
+     * 鏈夋晥鐜囬闄╁��
+     */
+    fun riskValidRate(riskValue: RiskValue, data: DustStatisticsValue) {
+        val dayValid = data.dayValid.substring(0, data.dayValid.lastIndex).toDouble() / 100
+        riskValue.validRisk = 1 - dayValid
+    }
+
+    /**
+     * 瓒呮爣椋庨櫓鍊�
+     */
+    fun riskExceedRate(riskValue: RiskValue, list: List<DustSiteData?>) {
+        // 鏃ヨ秴鏍囨鏁�/7锛堝ぇ浜�1mg/m鲁锛屽皬浜�2mg/m鲁锛�
+        var v1 = 0
+        // 鏃ヨ秴鏍囨鏁�/2锛堝ぇ浜�2mg/m鲁锛�
+        var v2 = 0
+        // 鏃ヤ复杩戣秴鏍囨鏁�/7
+        var v3 = 0
+        list.forEach {d ->
+            if (d == null) return@forEach
+            when {
+                d.dustValue >= 2.0 -> v2++
+                d.dustValue >= 1.0 && d.dustValue < 2.0 -> v1++
+                d.dustValue >= config.nearExceedLowValue && d.dustValue < config.nearExceedHighValue -> v3++
+            }
+        }
+        // 鍜岀殑鏈�澶у�间负3鏈�灏忓�间负0锛屼笂杩颁箣鍜岄櫎浠�3锛岀粨鏋滄渶澶у�间负1鏈�灏忓�间负0锛屽嵆涓烘棩瓒呮爣椋庨櫓鍊�
+        val r = (v1 + v2 + v3) / 3.0
+        riskValue.exceedRisk = if (r > 1) 1.0 else r
+    }
+
+    /**
+     * 鍏稿瀷寮傚父澶嶇幇鐜�
+     */
+    fun riskExceptionRepetitionRate(riskValue: RiskValue, list: List<DustExceptionData?>) {
+        //1銆侀拡瀵归噺绾х獊鍙樺紓甯搞�佷复杩戣秴鏍囧紓甯搞�佸崟鏃ヨ秴鏍囨鏁颁复鐣屽紓甯哥殑鎸囧畾鏃舵锛堝24灏忔椂鍐咃級閲嶅鍑虹幇姒傜巼鏉ョ患鍚堝垽瀹氬吀鍨嬪紓甯稿鐜扮巼锛�
+        //2銆佹棩閲忕骇绐佸彉寮傚父澶嶇幇鐜囷紙E4锛夛細锛圢4-1锛�/4锛� 鏈�澶т负1锛屾渶灏忎负0
+        //3銆佹棩涓磋繎瓒呮爣寮傚父澶嶇幇鐜囷紙E5锛夛細锛圢5-1锛�/3锛� 鏈�澶т负1锛屾渶灏忎负0
+        //4銆佹棩瓒呮爣娆℃暟涓寸晫寮傚父澶嶇幇鐜囷紙E6锛夛細锛圢6-1锛�/2锛� 鏈�澶т负1锛屾渶灏忎负0
+        //5銆佹棩鍏稿瀷寮傚父澶嶇幇鐜�: 鍙朎4銆丒5銆丒6鐨勫拰锛屾渶澶т负1锛屾渶灏忎负0
+        //6銆佹湀鍏稿瀷寮傚父澶嶇幇鐜囷細褰撴湀鍐呭悇鏃ュ吀鍨嬪紓甯稿鐜扮巼鐨勫拰/褰撴湀澶╂暟锛屾渶澶т负1锛屾渶灏忎负0
+        var v1 = 0
+        var v2 = 0
+        var v3 = 0
+        list.forEach { d->
+            if (d == null) return@forEach
+            when (d.exceptionType) {
+                ExceptionType.TYPE4.value -> v1++
+                ExceptionType.TYPE5.value -> v2++
+                ExceptionType.TYPE6.value -> v3++
+            }
+        }
+        val e1 = upperLimit((v1 - 1) / 4.0)
+        val e2 = upperLimit((v2 - 1) / 3.0)
+        val e3 = upperLimit((v3 - 1) / 2.0)
+        riskValue.typicalExceptionRepetitionRate = upperLimit(e1 + e2 + e3)
+    }
+
+    /**
+     * 寮傚父绫诲瀷鑱氶泦鐜�
+     */
+    fun riskExceptionType(riskValue: RiskValue, list: List<DustExceptionData?>) {
+        // 鏃ュ紓甯哥被鍨嬭仛闆嗙巼锛氬綋鏃ュ嚭鐜扮殑涓嶅悓寮傚父绫诲瀷涓暟/6锛屾渶澶т负1锛屾渶灏忎负0
+        //2銆佹湀寮傚父绫诲瀷鑱氶泦鐜囷細褰撴湀鍐呭悇鏃ュ紓甯哥被鍨嬭仛闆嗙巼鐨勫拰/褰撴湀澶╂暟锛屾渶澶т负1锛屾渶灏忎负0
+        // 鍏朵粬鏃舵浠ユ绫绘帹锛屾暟鎹秴浣庛�侀暱鏃堕棿鏃犳尝鍔ㄧ瓑涓ょ被寮傚父鏆備笉绾冲叆鍒嗘瀽锛岃嫢绾冲叆鍒嗘瀽鍒欏垎姣嶄负8
+        val exceptionTypes = mutableListOf<Int>()
+        list.forEach { d ->
+            if (d == null) return@forEach
+            if (!exceptionTypes.contains(d.exceptionType)) {
+                if (d.exceptionType != ExceptionType.TYPE1.value && d.exceptionType != ExceptionType.TYPE3.value) {
+                    exceptionTypes.add(d.exceptionType)
+                }
+            }
+        }
+        riskValue.exceptionTypeAggregation = exceptionTypes.size / 6.0
+    }
+
+    fun onDone(riskValue: RiskValue) {
+        riskValue.type = "day"
+    }
+
+    private fun upperLimit(d:Double):Double = if (d > 1) 1.0  else d
+}
\ No newline at end of file

--
Gitblit v1.9.3