From 8fc27dba6719041402e3e3c099e2f3e01d9d52c7 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期三, 16 七月 2025 17:30:56 +0800
Subject: [PATCH] 2025.7.16 1. 修改动态溯源异常判断逻辑

---
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSource.kt |  159 ++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 109 insertions(+), 50 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSource.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSource.kt
index 1543d33..6d7b8f0 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSource.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSource.kt
@@ -1,5 +1,6 @@
 package com.flightfeather.uav.biz.sourcetrace.model
 
+import com.flightfeather.uav.common.utils.DateUtil
 import com.flightfeather.uav.common.utils.MapUtil
 import com.flightfeather.uav.domain.entity.SceneInfo
 import com.flightfeather.uav.domain.repository.SceneInfoRep
@@ -25,7 +26,7 @@
      */
 
     // 婧簮浼佷笟
-    var sceneList: List<SceneInfoVo?>? = null
+    var sceneList: List<SceneInfoVo>? = null
 
     // 婧簮鎺ㄧ悊缁撹
     var conclusion: String? = null
@@ -69,7 +70,7 @@
         // 鏍规嵁姹℃煋鍥犲瓙鐨勯噺绾э紝璁$畻涓昏鐨勬薄鏌撳満鏅被鍨嬶紝绛涢�夌粨鏋�
         val mainSceneType = calSceneType(pollutedData)
         if (mainSceneType != null) {
-            this.conclusion = mainSceneType.first
+//            this.conclusion = mainSceneType.first
             result = result.filter {
                 val r = mainSceneType.second.find { s->
                     s.value == it.typeId.toInt()
@@ -80,6 +81,8 @@
 
         this.sceneList = findClosestStation(sceneInfoRep, result)
 
+        val txt = summaryTxt(pollutedData, this.sceneList!!)
+        this.conclusion = txt
     }
 
     /**
@@ -87,57 +90,82 @@
      */
     @Throws(Exception::class)
     private fun calSceneType(pollutedData: PollutedData): Pair<String, List<SceneType>>? {
-        when (pollutedData.selectedFactor?.main) {
-            // 姘哀鍖栧悎鐗╋紝涓�鑸敱浜庢満鍔ㄨ溅灏炬皵锛屽悓姝ヨ绠桟O
-            FactorType.NO2 -> {
-                val coAvg = round(pollutedData.dataList.map { it.co!! }.average()) / 1000
-                return "姘哀鍖栧悎鐗╁亸楂橈紝CO鐨勯噺绾т负${coAvg}mg/m鲁锛屼竴鑸敱浜庢満鍔ㄨ溅灏炬皵閫犳垚锛屾薄鏌撴簮浠ユ苯淇�佸姞娌圭珯涓轰富" to
-                        listOf(SceneType.TYPE6, SceneType.TYPE10, SceneType.TYPE17)
-            }
-
-            FactorType.CO -> return null
-
-            FactorType.H2S -> return null
-
-            FactorType.SO2 -> return null
-
-            FactorType.O3 -> return null
-            // a) pm2.5銆乸m10鐗瑰埆楂橈紝涓よ�呭湪鍚勬儏鍐典笅鍚屾灞曠ず锛宲m2.5鍗爌m10鐨勬瘮閲嶅彉鍖栵紝姣旈噸瓒婇珮锛岃秺鏈夊彲鑳芥槸椁愰ギ
-            // b) pm10鐗瑰埆楂樸�乸m2.5杈冮珮锛屽ぇ棰楃矑鎵皹姹℃煋锛屽彧灞曠ずpm10锛宲m2.5鍗爌m10鐨勬瘮閲嶅彉鍖栵紝宸ュ湴涓轰富
-            FactorType.PM25,
-            FactorType.PM10,
-                -> {
-                val pm25Avg = round(pollutedData.dataList.map { it.pm25!! }.average() * 10) / 10
-                val pm10Avg = round(pollutedData.dataList.map { it.pm10!! }.average() * 10) / 10
-                // 璁$畻寮傚父鏁版嵁鐨刾m2.5鍗爌m10姣旈噸鐨勫潎鍊�
-                val percentageAvg = pollutedData.dataList.map {
-                    it.pm25!! / it.pm10!!
-                }.average()
-                val str =
-                    "PM2.5閲忕骇涓�${pm25Avg}渭g/m鲁锛孭M10閲忕骇涓�${pm25Avg}渭g/m鲁锛孭M2.5鍗燩M10鐨勬瘮閲嶄负${round(percentageAvg * 100)}%"
-                return if (percentageAvg > 0.666) {
-                    "${str}锛屾瘮閲嶈緝澶э紝姹℃煋婧愪互椁愰ギ涓轰富锛屽伐鍦版涔�" to
-                            listOf(SceneType.TYPE1, SceneType.TYPE2, SceneType.TYPE3, SceneType.TYPE14, SceneType.TYPE5)
-                } else if (percentageAvg < 0.333) {
-                    "${str}锛屾瘮閲嶈緝灏忥紝灞炰簬澶ч绮掓壃灏樻薄鏌擄紝姹℃煋婧愪互宸ュ湴涓轰富" to
-                            listOf(SceneType.TYPE1, SceneType.TYPE2, SceneType.TYPE3, SceneType.TYPE14, SceneType.TYPE5)
-                } else {
-                    "${str}锛屾薄鏌撴簮浠ラ楗�佸伐鍦颁负涓�" to
-                            listOf(SceneType.TYPE1, SceneType.TYPE2, SceneType.TYPE3, SceneType.TYPE14, SceneType.TYPE5)
+        var des: String? = null
+        val sceneTypes = mutableListOf<SceneType>()
+        pollutedData.statisticMap.entries.forEach { s ->
+            val res = when (s.key) {
+                // 姘哀鍖栧悎鐗╋紝涓�鑸敱浜庢満鍔ㄨ溅灏炬皵锛屽悓姝ヨ绠桟O
+                FactorType.NO2 -> {
+                    val coAvg = round(pollutedData.dataList.map { it.co!! }.average()) / 1000
+                     "姘哀鍖栧悎鐗╁亸楂橈紝CO鐨勯噺绾т负${coAvg}mg/m鲁锛屼竴鑸敱浜庢満鍔ㄨ溅灏炬皵閫犳垚锛屾薄鏌撴簮浠ユ苯淇�佸姞娌圭珯涓轰富" to
+                            listOf(SceneType.TYPE6, SceneType.TYPE10, SceneType.TYPE17)
                 }
-            }
-            // c) VOC杈冮珮锛屽悓姣旇绠梡m2.5鐨勯噺绾э紝鍙兘瀛樺湪鍚屾鍋忛珮锛堟苯淇�佸姞娌圭珯锛�, 鍚屾璁$畻O3鏄惁鏈夐珮鍊�
-            // d) VOC杈冮珮锛屽浜庡姞娌圭珯锛堣溅杈嗘嫢鍫垫儏鍐碉級锛孋O涓�鑸緝楂�, 鍚屾璁$畻O3鏄惁鏈夐珮鍊�
-            FactorType.VOC -> {
-                val pm25Avg = round(pollutedData.dataList.map { it.pm25!! }.average() * 10) / 10
-                val coAvg = round(pollutedData.dataList.map { it.co!! }.average()) / 1000
-                val o3Avg = round(pollutedData.dataList.map { it.o3!! }.average() * 10) / 10
-                return "VOC鍋忛珮锛屽悓鏃禤M2.5閲忕骇涓�${pm25Avg}渭g/m鲁锛孋O閲忕骇涓�${coAvg}mg/m鲁锛孫3閲忕骇涓�${o3Avg}渭g/m鲁锛屾薄鏌撴簮浠ユ苯淇�佸姞娌圭珯涓轰富" to
-                        listOf(SceneType.TYPE6, SceneType.TYPE17, SceneType.TYPE12)
-            }
 
-            else -> return null
+                FactorType.CO ->  null
+
+                FactorType.H2S ->  null
+
+                FactorType.SO2 ->  null
+
+                FactorType.O3 ->  null
+                // a) pm2.5銆乸m10鐗瑰埆楂橈紝涓よ�呭湪鍚勬儏鍐典笅鍚屾灞曠ず锛宲m2.5鍗爌m10鐨勬瘮閲嶅彉鍖栵紝姣旈噸瓒婇珮锛岃秺鏈夊彲鑳芥槸椁愰ギ
+                // b) pm10鐗瑰埆楂樸�乸m2.5杈冮珮锛屽ぇ棰楃矑鎵皹姹℃煋锛屽彧灞曠ずpm10锛宲m2.5鍗爌m10鐨勬瘮閲嶅彉鍖栵紝宸ュ湴涓轰富
+                FactorType.PM25,
+                FactorType.PM10,
+                    -> {
+                    val pm25Avg = round(pollutedData.dataList.map { it.pm25!! }.average() * 10) / 10
+                    val pm10Avg = round(pollutedData.dataList.map { it.pm10!! }.average() * 10) / 10
+                    // 璁$畻寮傚父鏁版嵁鐨刾m2.5鍗爌m10姣旈噸鐨勫潎鍊�
+                    val percentageAvg = pollutedData.dataList.map {
+                        it.pm25!! / it.pm10!!
+                    }.average()
+                    val str =
+                        "PM2.5閲忕骇涓�${pm25Avg}渭g/m鲁锛孭M10閲忕骇涓�${pm10Avg}渭g/m鲁锛孭M2.5鍗燩M10鐨勬瘮閲嶄负${round(percentageAvg * 100)}%"
+                     if (percentageAvg > 0.666) {
+                        "${str}锛屾瘮閲嶈緝澶э紝姹℃煋婧愪互椁愰ギ涓轰富锛屽伐鍦版涔�" to
+                                listOf(
+                                    SceneType.TYPE1,
+                                    SceneType.TYPE2,
+                                    SceneType.TYPE3,
+                                    SceneType.TYPE14,
+                                    SceneType.TYPE5
+                                )
+                    } else if (percentageAvg < 0.333) {
+                        "${str}锛屾瘮閲嶈緝灏忥紝灞炰簬澶ч绮掓壃灏樻薄鏌擄紝姹℃煋婧愪互宸ュ湴涓轰富" to
+                                listOf(
+                                    SceneType.TYPE1,
+                                    SceneType.TYPE2,
+                                    SceneType.TYPE3,
+                                    SceneType.TYPE14,
+                                    SceneType.TYPE5
+                                )
+                    } else {
+                        "${str}锛屾薄鏌撴簮浠ラ楗�佸伐鍦颁负涓�" to
+                                listOf(
+                                    SceneType.TYPE1,
+                                    SceneType.TYPE2,
+                                    SceneType.TYPE3,
+                                    SceneType.TYPE14,
+                                    SceneType.TYPE5
+                                )
+                    }
+                }
+                // c) VOC杈冮珮锛屽悓姣旇绠梡m2.5鐨勯噺绾э紝鍙兘瀛樺湪鍚屾鍋忛珮锛堟苯淇�佸姞娌圭珯锛�, 鍚屾璁$畻O3鏄惁鏈夐珮鍊�
+                // d) VOC杈冮珮锛屽浜庡姞娌圭珯锛堣溅杈嗘嫢鍫垫儏鍐碉級锛孋O涓�鑸緝楂�, 鍚屾璁$畻O3鏄惁鏈夐珮鍊�
+                FactorType.VOC -> {
+                    val pm25Avg = round(pollutedData.dataList.map { it.pm25!! }.average() * 10) / 10
+                    val coAvg = round(pollutedData.dataList.map { it.co!! }.average()) / 1000
+                    val o3Avg = round(pollutedData.dataList.map { it.o3!! }.average() * 10) / 10
+                     "VOC鍋忛珮锛屽悓鏃禤M2.5閲忕骇涓�${pm25Avg}渭g/m鲁锛孋O閲忕骇涓�${coAvg}mg/m鲁锛孫3閲忕骇涓�${o3Avg}渭g/m鲁锛屾薄鏌撴簮浠ユ苯淇�佸姞娌圭珯涓轰富" to
+                            listOf(SceneType.TYPE6, SceneType.TYPE17, SceneType.TYPE12)
+                }
+
+                else ->  null
+            }
+            des = res?.first
+            res?.second?.let { sceneTypes.addAll(it) }
         }
+        return (des ?: "") to sceneTypes
     }
 
     /**
@@ -176,4 +204,35 @@
             return@map vo
         }
     }
+
+    private fun summaryTxt(pollutedData: PollutedData, sceneList: List<SceneInfoVo>): String {
+//        pollutedData.exception
+//        pollutedData.selectedFactor?.main
+        val st = DateUtil.instance.getTime(pollutedData.startTime)
+        val et = DateUtil.instance.getTime(pollutedData.endTime)
+        var txt =
+            "鍦�${st}鑷�${et}涔嬮棿锛屽嚭鐜�${pollutedData.exception}"
+        pollutedData.statisticMap.entries.forEach {s ->
+            txt += "锛�${s.key.des}鏈�浣庡�间负${s.value.min}渭g/m鲁锛屾渶楂樺�间负${s.value.max}渭g/m鲁锛屽潎鍊间负${s.value.avg}渭g/m鲁"
+        }
+        if (sceneList.isEmpty()) {
+            txt += ("锛屽彲鑳藉瓨鍦ㄩ殣钘忛闄╂簮銆�")
+        } else {
+            txt += ("锛屽彂鐜�${sceneList.size}涓闄╂簮锛屽寘鍚�")
+
+            val sizeMap = mutableMapOf<String, Int>()
+            sceneList.forEach {
+                if (!sizeMap.containsKey(it.type)) {
+                    sizeMap[it.type] = 0
+                }
+                sizeMap[it.type] = sizeMap[it.type]!! + 1
+            }
+            sizeMap.forEach { (t, u) ->
+                txt += ("${u}涓�${t}锛�")
+            }
+            txt = txt.replaceRange(txt.length - 1, txt.length, "銆�")
+        }
+
+        return txt
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3