From 3ba74e7692143fd6dcf4dd885f80f95dfef8387e Mon Sep 17 00:00:00 2001
From: zmc <zmc_li@foxmail.com>
Date: 星期四, 23 十一月 2023 16:09:41 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/feature-risk_analysis' into feature-risk_analysis

---
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataMissing.kt          |   67 +++-
 src/test/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisControllerTest.kt         |    6 
 src/main/java/com/flightfeather/monitor/pojo/AnalysisDustData.java                               |    6 
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionValueMutation.kt        |   19 +
 src/main/java/com/flightfeather/monitor/domain/ds1/mapper/DustStatisticsValueMapper.kt           |    7 
 src/main/java/com/flightfeather/monitor/controller/FugitiveDustController.java                   |  125 ++++----
 src/main/java/com/flightfeather/monitor/enumration/dust/ExceptionType.kt                         |    3 
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionExceedingTimes.kt       |    3 
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataLowValue.kt         |   20 -
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionValidRate.kt            |   58 ++++
 src/main/java/com/flightfeather/monitor/domain/ds1/repository/RiskValueRep.kt                    |   31 ++
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/BaseExceptionContinuousSingle.kt |   35 ++
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/BaseExceptionContinuous.kt       |   14 
 src/main/java/com/flightfeather/monitor/enumration/dust/DataStatus.kt                            |   16 +
 src/main/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisController.kt             |   15 
 src/main/java/com/flightfeather/monitor/analysis/dust/RiskAnalysisController.kt                  |   15 
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionNoFluctuation.kt        |    6 
 src/main/java/com/flightfeather/monitor/service/impl/FugitiveDustServiceImpl.java                |   88 +++--
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataMissing_BackUp.kt   |   37 ++
 src/main/resources/mapper/ds1/DustStatisticsValueMapper.xml                                      |  158 +++++++----
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataExceed.kt           |    5 
 src/main/java/com/flightfeather/monitor/service/FugitiveDustService.java                         |   15 
 src/main/java/com/flightfeather/monitor/utils/StringUtil.kt                                      |   27 +
 src/main/resources/application.yml                                                               |    4 
 src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionSlideAverage.kt         |   26 +
 25 files changed, 571 insertions(+), 235 deletions(-)

diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisController.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisController.kt
index d2bb044..fe53e75 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisController.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisController.kt
@@ -33,13 +33,14 @@
             taskList.clear()
             taskList.apply {
                 add(ExceptionDataMissing(it))
-                add(ExceptionNoFluctuation(it))
-                add(ExceptionApproachExceeding(it))
-                add(ExceptionExceedingTimes(it))
-                add(ExceptionSlideAverage(it))
-                add(ExceptionValueMutation(it))
-                add(ExceptionDataLowValue(it))
-                add(ExceptionDataExceed(it))
+//                add(ExceptionNoFluctuation(it))
+//                add(ExceptionApproachExceeding(it))
+//                add(ExceptionExceedingTimes(it))
+//                add(ExceptionSlideAverage(it))
+//                add(ExceptionValueMutation(it))
+//                add(ExceptionDataLowValue(it))
+//                add(ExceptionDataExceed(it))
+//                add(ExceptionValidRate(it))
             }
         }
     }
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/RiskAnalysisController.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/RiskAnalysisController.kt
index d43c341..61fe986 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/RiskAnalysisController.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/RiskAnalysisController.kt
@@ -35,6 +35,9 @@
         }
     }
 
+    /**
+     * 鏃ラ闄╃粺璁�,榛樿缁熻鏄ㄥぉ鐨勯闄╁��
+     */
     fun autoRunDaily() {
         val data = riskValueRep.findLatestData("day")
         val yesterday = LocalDate.now().minusDays(1)
@@ -54,15 +57,21 @@
         }
     }
 
+    /**
+     * 鏈堥闄╃粺璁�,鏍规嵁鏄ㄦ棩鏈�鏂版暟鎹墍鍦ㄦ湀浠�,缁熻璇ユ湀鐨勭患鍚堥闄�,鎴嚦鏄ㄥぉ
+     */
     fun autoRunMonthly() {
         val data = riskValueRep.findLatestData("month")
         val lastMonth = LocalDate.now().minusMonths(1).withDayOfMonth(1)
         if (data == null) {
             runMonthly(lastMonth)
         } else {
+            // 鑾峰彇闇�瑕佺粺璁$殑鏈�鏂版湀浠�,鏄槰澶╂墍鍦ㄧ殑鏈堜唤(鍥犱负鐩戞祴鏁版嵁鏄粖澶╄幏鍙栨槰澶╀竴鏁村ぉ鐨勬暟鎹�)
+            val thisMonth = LocalDate.now().minusDays(1)
+            // 鏈�鏂版湀缁熻璁板綍鐨勬椂闂�
             val date = LocalDateTime.ofInstant(data.lst.toInstant(), ZoneId.systemDefault())
-            val sT = date.plusMonths(1).toLocalDate()
-            val du = DateUtil.findDurationMonth(sT, lastMonth)
+            val sT = date.toLocalDate()
+            val du = DateUtil.findDurationMonth(sT, thisMonth)
             du.forEach {
                 runMonthly(it)
             }
@@ -102,7 +111,7 @@
         }
         // 鎵�鏈夊垎鏋愮粨鏋滃叆搴�
         if (taskMonthly?.resultList?.isNotEmpty() == true) {
-            riskValueRep.insert(taskMonthly?.resultList!!)
+            riskValueRep.insertOrUpdate(taskMonthly?.resultList!!)
         }
         running2 = false
     }
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/BaseExceptionContinuous.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/BaseExceptionContinuous.kt
index 59964e3..5f7d1f6 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/BaseExceptionContinuous.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/BaseExceptionContinuous.kt
@@ -4,21 +4,21 @@
 import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
 
 /**
- * 杩炵画绫诲瀷鐨勫紓甯稿垎鏋愬熀绫�
+ * 杩炵画绫诲瀷鐨勫紓甯稿垎鏋愬熀绫�,閫傜敤浜庡綋鍓嶆暟鎹笌鐩搁偦鏁版嵁涔嬮棿鏈夊叧鑱斿叧绯荤殑鎯呭喌
  */
 abstract class BaseExceptionContinuous(config: DustExceptionSetting) : BaseDustExceptionAnalysis(config) {
 
     // 璧峰鏁版嵁涓嬫爣
-    private var sIndex = 0
+    protected var sIndex = 0
     // 璧峰鏁版嵁瀵硅薄
-    private var startData: DustSiteData? = null
+    protected var startData: DustSiteData? = null
     // 鏈熬鏁版嵁涓嬫爣
-    private var eIndex = -1
+    protected var eIndex = -1
     // 鏈熬鏁版嵁瀵硅薄
-    private var lastData: DustSiteData? = null
+    protected var lastData: DustSiteData? = null
     // 璧峰鏁版嵁涓庢湯灏炬暟鎹棿闅�
     open var durationCount = 1
-    private var existException = false
+    protected var existException = false
 
     /**
      * 鍒ゆ柇鏄惁婊¤冻寮傚父鏉′欢
@@ -75,7 +75,7 @@
     /**
      * 妫�鏌ヨ繛缁紓甯哥粨鏉熸椂锛屾槸鍚︾鍚堝紓甯稿瓨鍌ㄦ潯浠�
      */
-    private fun checkResult() {
+    open fun checkResult() {
         if (existException && judgeDuration(sIndex, eIndex)) {
             startData?.let {
                 resultList.add(newResult(it, lastData))
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/BaseExceptionContinuousSingle.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/BaseExceptionContinuousSingle.kt
new file mode 100644
index 0000000..16d89a9
--- /dev/null
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/BaseExceptionContinuousSingle.kt
@@ -0,0 +1,35 @@
+package com.flightfeather.monitor.analysis.dust.exception
+
+import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
+import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+
+/**
+ * 杩炵画绫诲瀷鐨勫紓甯稿垎鏋愬熀绫�,鍖哄埆浜庣埗绫荤殑鍦版柟鍦ㄤ簬姝ょ寮傚父鍙拰鍗曚釜鏁版嵁鏈韩鏈夊叧,浜庣浉閭绘暟鎹棤鍏�
+ */
+abstract class BaseExceptionContinuousSingle(config: DustExceptionSetting) : BaseExceptionContinuous(config) {
+
+    override fun onNextData(data: DustSiteData) {
+        eIndex++
+        if (lastData == null) {
+            startData = data
+        }
+        // 鍒ゆ柇鐩搁偦鏁版嵁鏄惁杩炵画骞朵笖鏄惁婊¤冻寮傚父鍒ゆ柇
+        if (!isContinuous(lastData, data)) {
+            checkResult()
+            sIndex = eIndex
+            startData = data
+        } else {
+            if (judgeException(lastData, data)) {
+                // 淇敼浜嗚捣濮嬫暟鎹殑浣嶇疆,鍙樻洿涓哄嚭鐜板紓甯哥殑璇ュ��,鑰屼笉鏄師鏉ョ殑鍑虹幇寮傚父鐨勬暟鎹殑鍓嶄竴涓��
+                if (!existException) {
+                    sIndex = eIndex
+                    startData = data
+                }
+                existException = true
+            } else {
+                checkResult()
+            }
+        }
+        lastData = data
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataExceed.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataExceed.kt
index 3dd3c6b..7efde9c 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataExceed.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataExceed.kt
@@ -2,17 +2,18 @@
 
 import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
 import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+import com.flightfeather.monitor.enumration.dust.DataStatus
 import com.flightfeather.monitor.enumration.dust.ExceptionType
 
 /**
  * 鏁版嵁瓒呮爣寮傚父鍒嗘瀽
  */
-class ExceptionDataExceed(config: DustExceptionSetting) : BaseExceptionContinuous(config) {
+class ExceptionDataExceed(config: DustExceptionSetting) : BaseExceptionContinuousSingle(config) {
 
     override fun getExceptionType(): ExceptionType = ExceptionType.TYPE2
 
     override fun judgeException(p: DustSiteData?, n: DustSiteData): Boolean {
-        return n.dustValue >= config.exceedingStandard
+        return n.dustValue >= config.exceedingStandard && n.flag == DataStatus.N.value
     }
 
     override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean {
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataLowValue.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataLowValue.kt
index 353b7fe..acc2917 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataLowValue.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataLowValue.kt
@@ -3,32 +3,24 @@
 import com.flightfeather.monitor.domain.ds1.entity.DustExceptionData
 import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
 import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+import com.flightfeather.monitor.enumration.dust.DataStatus
 import com.flightfeather.monitor.enumration.dust.ExceptionType
 
 /**
  * 鏁版嵁瓒呬綆寮傚父鍒嗘瀽
  */
-class ExceptionDataLowValue(config: DustExceptionSetting) : BaseExceptionContinuous(config) {
+class ExceptionDataLowValue(config: DustExceptionSetting) : BaseExceptionContinuousSingle(config) {
 
     override fun getExceptionType(): ExceptionType = ExceptionType.TYPE1
 
     override fun judgeException(p: DustSiteData?, n: DustSiteData): Boolean {
-        return n.dustValue <= config.dataLow
+        val b1 = n.flag == DataStatus.OUT_MIN.value
+        val b2 = n.dustValue <= config.dataLow && n.flag == DataStatus.N.value
+        val b3 = n.flag == DataStatus.Q.value
+        return b1 || b2 || b3
     }
 
     override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean {
         return true
-    }
-
-    override fun newResult(p: DustSiteData, n: DustSiteData?): DustExceptionData {
-        val eType = getExceptionType()
-        return DustExceptionData().apply {
-            mnCode = p.mnCode
-            exception = eType.des
-            exceptionType = eType.value
-            region = config.region
-            beginTime = n?.lst
-            endTime = n?.lst
-        }
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataMissing.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataMissing.kt
index e47ae04..e85aa12 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataMissing.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataMissing.kt
@@ -2,35 +2,68 @@
 
 import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
 import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+import com.flightfeather.monitor.enumration.dust.DataStatus
 import com.flightfeather.monitor.enumration.dust.ExceptionType
 import java.time.Duration
+import java.time.LocalDateTime
+import java.time.ZoneId
+import java.util.*
 
 /**
  * 鏁版嵁缂哄け寮傚父鍒嗘瀽
  */
-class ExceptionDataMissing(config: DustExceptionSetting) : BaseDustExceptionAnalysis(config) {
-
-    private var lastData: DustSiteData? = null
-
-    override fun init() {
-        super.init()
-        lastData = null
-    }
+class ExceptionDataMissing(config: DustExceptionSetting) : BaseExceptionContinuous(config) {
 
     override fun getExceptionType(): ExceptionType = ExceptionType.TYPE0
 
-    override fun onNextData(data: DustSiteData) {
-        lastData?.let {
-            val t1 = it.lst
-            val t2 = data.lst
-            if (Duration.between(t1?.toInstant(), t2.toInstant()).toMinutes() > config.missDataMinutes) {
-                resultList.add(newResult(it, data))
+//    override fun onNextData(data: DustSiteData) {
+//        lastData?.let {
+//            val t1 = it.lst
+//            val t2 = data.lst
+//            val b1 = Duration.between(t1?.toInstant(), t2.toInstant()).toMinutes() >= config.missDataMinutes
+//            if (b1) {
+//                resultList.add(newResult(it, data))
+//            }
+//        }
+//        lastData = data
+//    }
+
+    override fun judgeException(p: DustSiteData?, n: DustSiteData): Boolean {
+        // 鏁版嵁缂哄け寮傚父涓嶅悓浜庡叾浠栧紓甯哥殑鐐瑰湪浜庡綋鏃ラ涓暟鎹鏋滀笉瀛樺湪锛岄渶瑕佸仛涓�娆″垽鏂�
+        var pData: DustSiteData? = null
+        if (p == null) {
+            //褰撻涓暟鎹繘鍏ユ椂锛岄渶瑕佸垽鏂槸鍚︿负褰撴棩鐨勭涓�涓暟鎹�
+            val time = LocalDateTime.ofInstant(n.lst.toInstant(), ZoneId.systemDefault())
+            if (time.hour == 0 && time.minute == 0) {
+                return false
+            }
+            // 濡傛灉缂哄け褰撴棩棣栦釜鏁版嵁锛屽垯闇�瑕佸皢褰撳墠鏁版嵁n鍜屽綋鏃�0鐐硅繘琛屾瘮杈冿紝璁板綍鏁版嵁缂哄け寮傚父
+            else {
+                startData = DustSiteData().apply {
+                    mnCode = n.mnCode
+                    lst = Date.from(time.withHour(0).withMinute(0).withSecond(0).atZone(ZoneId.systemDefault())
+                        .toInstant())
+                    flag = DataStatus.A.value
+                }
+                pData = startData
             }
         }
-        lastData = data
+        if (pData == null) return false
+        val t1 = pData.lst
+        val t2 = n.lst
+        val b1 = Duration.between(t1?.toInstant(), t2.toInstant()).toMinutes() >= config.missDataMinutes
+        val b2 = n.flag == DataStatus.A.value || n.flag == DataStatus.D.value
+        return b1 || b2
     }
 
-    override fun onDone() {
-        //do noting
+    override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean {
+        return true
+    }
+
+    /**
+     * 閽堝鏁版嵁缂哄け寮傚父, 瀵规暟鎹殑杩炵画鎬т笉鍋氬垽鏂�
+     */
+    override fun isContinuous(d1: DustSiteData?, d2: DustSiteData): Boolean {
+        return true
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataMissing_BackUp.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataMissing_BackUp.kt
new file mode 100644
index 0000000..fe872d1
--- /dev/null
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionDataMissing_BackUp.kt
@@ -0,0 +1,37 @@
+package com.flightfeather.monitor.analysis.dust.exception
+
+import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
+import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+import com.flightfeather.monitor.enumration.dust.ExceptionType
+import java.time.Duration
+
+/**
+ * 鏁版嵁缂哄け寮傚父鍒嗘瀽
+ */
+class ExceptionDataMissing_BackUp(config: DustExceptionSetting) : BaseDustExceptionAnalysis(config) {
+
+    private var lastData: DustSiteData? = null
+
+    override fun init() {
+        super.init()
+        lastData = null
+    }
+
+    override fun getExceptionType(): ExceptionType = ExceptionType.TYPE0
+
+    override fun onNextData(data: DustSiteData) {
+        lastData?.let {
+            val t1 = it.lst
+            val t2 = data.lst
+            val b1 = Duration.between(t1?.toInstant(), t2.toInstant()).toMinutes() >= config.missDataMinutes
+            if (b1) {
+                resultList.add(newResult(it, data))
+            }
+        }
+        lastData = data
+    }
+
+    override fun onDone() {
+        //do noting
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionExceedingTimes.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionExceedingTimes.kt
index b67ecd9..0646ca8 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionExceedingTimes.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionExceedingTimes.kt
@@ -3,6 +3,7 @@
 import com.flightfeather.monitor.domain.ds1.entity.DustExceptionData
 import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
 import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+import com.flightfeather.monitor.enumration.dust.DataStatus
 import com.flightfeather.monitor.enumration.dust.ExceptionType
 import java.time.LocalDateTime
 import java.time.ZoneId
@@ -27,7 +28,7 @@
     override fun onNextData(data: DustSiteData) {
         if (startData == null) startData = data
 
-        if (data.dustValue >= config.exceedingStandard) {
+        if (data.dustValue >= config.exceedingStandard && data.flag == DataStatus.N.value) {
             exceedingCount++
         }
     }
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionNoFluctuation.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionNoFluctuation.kt
index c83b49e..a6d0e4f 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionNoFluctuation.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionNoFluctuation.kt
@@ -2,6 +2,7 @@
 
 import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
 import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+import com.flightfeather.monitor.enumration.dust.DataStatus
 import com.flightfeather.monitor.enumration.dust.ExceptionType
 
 /**
@@ -13,7 +14,10 @@
 
     override fun judgeException(p: DustSiteData?, n: DustSiteData): Boolean {
         if (p == null) return false
-        return p.dustValue == n.dustValue
+        val b1 = p.dustValue == n.dustValue
+        val b2 = p.flag != DataStatus.A.value && p.flag != DataStatus.D.value
+        val b3 = n.flag != DataStatus.A.value && n.flag != DataStatus.D.value
+        return b1 && b2 && b3
     }
 
     override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean {
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionSlideAverage.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionSlideAverage.kt
index fa5ff5a..fe7f1f9 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionSlideAverage.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionSlideAverage.kt
@@ -2,6 +2,7 @@
 
 import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
 import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+import com.flightfeather.monitor.enumration.dust.DataStatus
 import com.flightfeather.monitor.enumration.dust.ExceptionType
 import kotlin.math.abs
 
@@ -12,7 +13,7 @@
 
     private val historyDataList = mutableListOf<DustSiteData>()
     private val tempDataList = mutableListOf<DustSiteData>()
-    private val avgListReverse = mutableListOf<Double>()
+    private val avgListReverse = mutableListOf<Pair<Double, Boolean>>()
     private var startData: DustSiteData? = null
     private var lastData: DustSiteData? = null
     private var sIndex = 0
@@ -67,11 +68,17 @@
      */
     private fun calAvg(list: List<DustSiteData>) {
         var total = .0
+        var valid = true
         val count = list.size
         if (count == 0) return
-        list.forEach { total += it.dustValue }
+        list.forEach {
+            total += it.dustValue
+            if (it.flag != DataStatus.N.value) {
+                valid = false
+            }
+        }
         val avg = total / count
-        avgListReverse.add(0, avg)
+        avgListReverse.add(0, Pair(avg, valid))
     }
 
     /**
@@ -84,14 +91,14 @@
             return false
         } else {
             // 婊戝姩鍧囧�兼弧瓒虫暟閲忔椂锛岃绠楀潎鍊间箣闂存槸鍚﹁繛缁秴杩囬檺瀹氭瘮鐜�
-            val rateList = mutableListOf<Double>()
+            val rateList = mutableListOf<Pair<Double, Boolean>>()
             for (i in avgListReverse.indices) {
                 if (i >= config.changeTrendTimes) break
                 val r = calAvgChangeRate(avgListReverse[i], avgListReverse[i + config.changeTrendInterval])
                 rateList.add(r)
             }
             for (y in rateList) {
-                if (y < config.changeTrendRate) {
+                if (!y.second || y.first < config.changeTrendRate) {
                     return false
                 }
             }
@@ -102,11 +109,12 @@
     /**
      * 璁$畻婊戝姩鍧囧�煎彉鍖栫巼
      */
-    private fun calAvgChangeRate(a1: Double, a2: Double): Double {
-        return if (a2 == .0) {
-            1.0
+    private fun calAvgChangeRate(a1: Pair<Double, Boolean>, a2: Pair<Double, Boolean>): Pair<Double, Boolean> {
+        val valid = a1.second && a2.second
+        return if (a2.first == .0) {
+            Pair(1.0, valid)
         } else {
-            abs(a1 - a2) / a2
+            Pair(abs(a1.first - a2.first) / a2.first, valid)
         }
     }
 
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionValidRate.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionValidRate.kt
new file mode 100644
index 0000000..447574f
--- /dev/null
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionValidRate.kt
@@ -0,0 +1,58 @@
+package com.flightfeather.monitor.analysis.dust.exception
+
+import com.flightfeather.monitor.domain.ds1.entity.DustExceptionData
+import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
+import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+import com.flightfeather.monitor.enumration.dust.DataStatus
+import com.flightfeather.monitor.enumration.dust.ExceptionType
+import java.time.LocalDateTime
+import java.time.ZoneId
+import java.util.*
+
+/**
+ * 鏁版嵁鏈夋晥鐜囧紓甯�
+ */
+class ExceptionValidRate(config: DustExceptionSetting) : BaseDustExceptionAnalysis(config) {
+
+    private var count = 0
+    private val total = 96
+    private var startData: DustSiteData? = null
+
+    override fun init() {
+        super.init()
+        count = 0
+        startData = null
+    }
+
+    override fun getExceptionType(): ExceptionType = ExceptionType.TYPE8
+
+    override fun onNextData(data: DustSiteData) {
+        if (startData == null) startData = data
+
+        if (data.flag == DataStatus.N.value) {
+            count++
+        }
+    }
+
+    override fun onDone() {
+        val rate = count / total
+        if (rate < 0.9) {
+            startData?.let {
+                val eType = getExceptionType()
+                val t = LocalDateTime.ofInstant(it.lst.toInstant(), ZoneId.systemDefault())
+                    .withHour(0).withMinute(0).withSecond(0)
+                val sT = Date.from(t.atZone(ZoneId.systemDefault()).toInstant())
+                val n = t.plusDays(1).minusSeconds(1)
+                val eT = Date.from(n.atZone(ZoneId.systemDefault()).toInstant())
+                resultList.add(DustExceptionData().apply {
+                    mnCode = it.mnCode
+                    exception = eType.des
+                    exceptionType = eType.value
+                    region = config.region
+                    beginTime = sT
+                    endTime = eT
+                })
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionValueMutation.kt b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionValueMutation.kt
index 1695904..2501601 100644
--- a/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionValueMutation.kt
+++ b/src/main/java/com/flightfeather/monitor/analysis/dust/exception/ExceptionValueMutation.kt
@@ -2,6 +2,7 @@
 
 import com.flightfeather.monitor.domain.ds1.entity.DustExceptionSetting
 import com.flightfeather.monitor.domain.ds1.entity.DustSiteData
+import com.flightfeather.monitor.enumration.dust.DataStatus
 import com.flightfeather.monitor.enumration.dust.ExceptionType
 import kotlin.math.abs
 
@@ -10,14 +11,28 @@
  */
 class ExceptionValueMutation(config: DustExceptionSetting) : BaseExceptionContinuous(config) {
 
+    /**
+     * 鏈紓甯哥殑杩炵画鍙戠敓娆℃暟浼氭牴鎹紓甯哥殑绋嬪害鍙樺寲
+     * 褰撶獊鍙樼殑閲忕骇瓒呰繃璁惧畾鍊�1鍊嶆槸,杩炵画鍙戠敓娆℃暟瑕佹眰鍑忓皯1鍊�
+     */
+    private var special = false
+
     override fun getExceptionType(): ExceptionType = ExceptionType.TYPE4
 
     override fun judgeException(p: DustSiteData?, n: DustSiteData): Boolean {
         if (p == null) return false
-        return abs((p.dustValue - n.dustValue) / p.dustValue) >= config.mutationRate
+        val r = abs((p.dustValue - n.dustValue) / p.dustValue)
+        val b1 = r >= (2 * config.mutationRate) && n.flag == DataStatus.N.value
+        val b2 = r >= config.mutationRate && n.flag == DataStatus.N.value
+        val b3 = n.flag == DataStatus.OUT_MAX.value
+        if (b1) special = true
+        return b1 || b2 || b3
     }
 
     override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean {
-        return (eIndex - sIndex + 1) >= config.mutationNum
+        val b1 = special && (eIndex - sIndex) >= (config.mutationNum / 2)
+        val b2 = (eIndex - sIndex) >= config.mutationNum
+        special = false
+        return b1 || b2
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/flightfeather/monitor/controller/FugitiveDustController.java b/src/main/java/com/flightfeather/monitor/controller/FugitiveDustController.java
index 545c595..a380aba 100644
--- a/src/main/java/com/flightfeather/monitor/controller/FugitiveDustController.java
+++ b/src/main/java/com/flightfeather/monitor/controller/FugitiveDustController.java
@@ -19,58 +19,68 @@
     private FugitiveDustService fugitiveDustService;
 
 
-
     //鎵皹 鐩戞祴鐐瑰巻鍙叉暟鎹�  鍚庣鍒嗛〉
     @GetMapping("/history1")
     public Result conditonQueryAbnormalData3(@RequestParam(defaultValue = "1") Integer page,
-                                             @RequestParam(defaultValue = "20")Integer pageSize,
-                                             String siteName,String mnCode,String beginTime, String endTime,String[] scenarioType ){
-        PageBean pageBean = fugitiveDustService.page(page,pageSize,siteName,mnCode, beginTime,endTime,scenarioType);
+                                             @RequestParam(defaultValue = "20") Integer pageSize,
+                                             String siteName, String mnCode, String beginTime, String endTime, String[] scenarioType) {
+        PageBean pageBean = fugitiveDustService.page(page, pageSize, siteName, mnCode, beginTime, endTime, scenarioType);
         return Result.success(pageBean);
     }
 
-//    杩斿洖鏌ヨ鐨勬墍鏈夊巻鍙叉暟鎹�
+    //    杩斿洖鏌ヨ鐨勬墍鏈夊巻鍙叉暟鎹�
     @GetMapping("/historyall")
-    public Result conditonQueryhistoryallData(String siteName,String mnCode,String beginTime, String endTime,String[] scenarioType ){
-       List<DustSiteData> list= fugitiveDustService.conditonQueryhistoryallData(siteName,mnCode, beginTime,endTime,scenarioType);
+    public Result conditonQueryhistoryallData(String siteName, String mnCode, String beginTime, String endTime, String[] scenarioType) {
+        List<DustSiteData> list = fugitiveDustService.conditonQueryhistoryallData(siteName, mnCode, beginTime, endTime, scenarioType);
         return Result.success(list);
     }
-//    杩斿洖鐩戞祴鐐规暟鎹腑鐨勪笉鍚岀殑鍦烘櫙
+
+    //    杩斿洖鐩戞祴鐐规暟鎹腑鐨勪笉鍚岀殑鍦烘櫙
     @GetMapping("/scenario")
-    public Result conditonQueryHistoryData(){
+    public Result conditonQueryHistoryData() {
         List<DustSiteData> list = fugitiveDustService.scenarioData();
         return Result.success(list);
     }
-// 杩斿洖鎵�鏈夌珯鐐瑰悕瀛�
+
+    // 杩斿洖鎵�鏈夌珯鐐瑰悕瀛�
     @GetMapping("/sitename")
-    public Result allSiteName(){
+    public Result allSiteName() {
         List<DustSiteData> list = fugitiveDustService.allSiteName();
         return Result.success(list);
     }
 
-//    鏍规嵁绔欑偣鍚嶅瓧鍜屾椂闂存鏌ヨ鍧囧�煎拰
+    //    鏍规嵁绔欑偣鍚嶅瓧鍜屾椂闂存鏌ヨ鍧囧�煎拰
     @GetMapping("/analysisdata")
-    public Result analysisdata( String siteName,String beginTime, String endTime,String type){
-        List<AnalysisDustData> list = fugitiveDustService.analysisdata(siteName,beginTime,endTime,type);
+    public Result analysisdata(String siteName, String beginTime, String endTime, String type) {
+        List<AnalysisDustData> list = fugitiveDustService.analysisdata(siteName, beginTime, endTime, type);
         return Result.success(list);
     }
 
-//    鏍规嵁绔欑偣鍚嶅瓧鍜屾椂娈佃繘琛岀粺璁″垎鏋� 鍚庣鍒嗛〉
+    //    鏍规嵁绔欑偣鍚嶅瓧鍜屾椂娈佃繘琛岀粺璁″垎鏋� 鍚庣鍒嗛〉
     @GetMapping("/analysistime")
-    public Result analysisByTime( @RequestParam(defaultValue = "1") Integer page,
-                                  @RequestParam(defaultValue = "20")Integer pageSize,String siteName,String beginTime, String endTime){
-    PageBean pageBean = fugitiveDustService.pageAnalysisTime(page,pageSize,siteName,beginTime,endTime);
-    return Result.success(pageBean);
-}
+    public Result analysisByTime(
+            @RequestParam(defaultValue = "1") Integer page,
+            @RequestParam(defaultValue = "20") Integer pageSize,
+            String siteName,
+            String beginTime,
+            String endTime,
+            String orderProp,
+            Boolean asc) {
+        PageBean pageBean = fugitiveDustService.pageAnalysisTime(page, pageSize, siteName, beginTime, endTime,
+                orderProp, asc);
+        return Result.success(pageBean);
+    }
+
     //鍔ㄦ�佽绠楀垎鏋愭暟鎹�  涓嶅垎椤�
     @GetMapping("/analysisall")
-    public Result analysisAll(String siteName,String beginTime, String endTime){
-        List<AnalysisDustData> list = fugitiveDustService.analysisAll(siteName,beginTime,endTime);
+    public Result analysisAll(String siteName, String beginTime, String endTime) {
+        List<AnalysisDustData> list = fugitiveDustService.analysisAll(siteName, beginTime, endTime);
         return Result.success(list);
     }
-//鑾峰緱涓嶅悓鐨勫紓甯哥被鍨�
+
+    //鑾峰緱涓嶅悓鐨勫紓甯哥被鍨�
     @GetMapping("/exceptiontype")
-    public Result getExceptionType(){
+    public Result getExceptionType() {
         List<DustExceptionType> list = fugitiveDustService.getExceptionType();
         return Result.success(list);
     }
@@ -79,113 +89,112 @@
     //鏉′欢鏌ヨ寮傚父鏁版嵁
     @GetMapping("/exceptiondata")
     public Result getExceptionData(@RequestParam(defaultValue = "1") Integer page,
-                               @RequestParam(defaultValue = "20")Integer pageSize,String siteName,String [] exceptionType,String beginTime, String endTime){
-    PageBean pageBean =  fugitiveDustService.getExceptionData(page,pageSize,siteName,exceptionType,beginTime,endTime);
-    return Result.success(pageBean);
-}
-
+                                   @RequestParam(defaultValue = "20") Integer pageSize, String siteName, String[] exceptionType, String beginTime, String endTime) {
+        PageBean pageBean = fugitiveDustService.getExceptionData(page, pageSize, siteName, exceptionType, beginTime, endTime);
+        return Result.success(pageBean);
+    }
 
 
     //鏉′欢鏌ヨ寮傚父鏁版嵁 涓嶅垎椤�
     @GetMapping("/exceptiondata1")
-    public Result getExceptionAllData(String siteName,String [] exceptionType,String beginTime, String endTime){
-        List<DustExceptionData> list =  fugitiveDustService.getExceptionAllData(siteName,exceptionType,beginTime,endTime);
+    public Result getExceptionAllData(String siteName, String[] exceptionType, String beginTime, String endTime) {
+        List<DustExceptionData> list = fugitiveDustService.getExceptionAllData(siteName, exceptionType, beginTime, endTime);
         return Result.success(list);
     }
 
     //澧炲姞琛楅亾鍜岃繍缁村晢 鏉′欢鏌ヨ寮傚父鏁版嵁
     @GetMapping("/exceptiondata2")
     public Result getExceptionData2(@RequestParam(defaultValue = "1") Integer page,
-                                    @RequestParam(defaultValue = "20")Integer pageSize,String siteName,String [] exceptionType,String beginTime, String endTime,String [] street,String [] dutyCompany){
-        PageBean pageBean =  fugitiveDustService.getExceptionData2(page,pageSize,siteName,exceptionType,beginTime,endTime,street,dutyCompany);
+                                    @RequestParam(defaultValue = "20") Integer pageSize, String siteName, String[] exceptionType, String beginTime, String endTime, String[] street, String[] dutyCompany) {
+        PageBean pageBean = fugitiveDustService.getExceptionData2(page, pageSize, siteName, exceptionType, beginTime, endTime, street, dutyCompany);
         return Result.success(pageBean);
     }
 
     //鏍规嵁鏌愭鏃堕棿鍐呮煇涓紓甯哥被鍨�,鍦板潃锛岃繍缁村晢锛岀偣浣嶅悕绉�  锛屾煡璇㈠搴旂殑搴楅摵鍚嶇О鍜岃澶囩紪鍙�
     @GetMapping("/sitenamecode")
-    public Result getExceptionSitenameAndCode(String exceptionType,String beginTime, String endTime,String [] street,String [] dutyCompany,String siteName){
-        List<DustExceptionData> list = fugitiveDustService.getExceptionSitenameAndCode(exceptionType,beginTime,endTime,street,dutyCompany,siteName);
+    public Result getExceptionSitenameAndCode(String exceptionType, String beginTime, String endTime, String[] street, String[] dutyCompany, String siteName) {
+        List<DustExceptionData> list = fugitiveDustService.getExceptionSitenameAndCode(exceptionType, beginTime, endTime, street, dutyCompany, siteName);
         return Result.success(list);
     }
-
 
 
     //   鏍规嵁鏃堕棿,鍦板潃锛岃繍缁村晢锛岀偣浣嶅悕绉帮紝杩斿洖璇ュ紓甯哥被鍨嬬殑涓暟
     @GetMapping("/exceptionnum")
-    public Result exceptionNum(String exceptionType,String beginTime,String endTime,String [] street,String [] dutyCompany,String siteName){
-        Integer list = fugitiveDustService.exceptionNum( exceptionType, beginTime, endTime,street,dutyCompany,siteName);
+    public Result exceptionNum(String exceptionType, String beginTime, String endTime, String[] street, String[] dutyCompany, String siteName) {
+        Integer list = fugitiveDustService.exceptionNum(exceptionType, beginTime, endTime, street, dutyCompany, siteName);
         return Result.success(list);
     }
 
 
-//    鏌ヨ鍘嗗彶鏁版嵁 涓嶅垎椤�
-@GetMapping("/history")
-public Result conditonQueryHistoryData(String siteName,String beginTime, String endTime ){
-    List<DustSiteData> list= fugitiveDustService.conditonQueryHistoryData(siteName,beginTime,endTime);
-    return Result.success(list);
-}
+    //    鏌ヨ鍘嗗彶鏁版嵁 涓嶅垎椤�
+    @GetMapping("/history")
+    public Result conditonQueryHistoryData(String siteName, String beginTime, String endTime) {
+        List<DustSiteData> list = fugitiveDustService.conditonQueryHistoryData(siteName, beginTime, endTime);
+        return Result.success(list);
+    }
 
     //   杩斿洖寮傚父鐨勫簵閾烘�绘暟
 
     @GetMapping("/exceptionsitenum")
-    public Result exceptionSiteNum(){
+    public Result exceptionSiteNum() {
         List<DustExceptionData> list = fugitiveDustService.exceptionSiteNum();
         return Result.success(list);
     }
 
     /*鏂板瀹¤鍐呭*/
     @PostMapping("/audit")
-    public Result addAuditNotes(@RequestBody AuditInfo auditInfo){
+    public Result addAuditNotes(@RequestBody AuditInfo auditInfo) {
         fugitiveDustService.addAuditNotes(auditInfo);
         return Result.success();
     }
+
     /*杩斿洖瀹℃牳琛ㄦ墍鏈夋暟鎹�*/
     @PostMapping("/auditAllData")
-    public Result getAuditAllData(){
+    public Result getAuditAllData() {
         List<AuditInfo> list = fugitiveDustService.getAuditAllData();
         return Result.success(list);
     }
 
     /*鏇存柊寮傚父琛ㄦ牸*/
     @PutMapping("/auditUpdate")
-    public Result getAuditAllData(@RequestBody AuditInfo auditInfo){
+    public Result getAuditAllData(@RequestBody AuditInfo auditInfo) {
         fugitiveDustService.update(auditInfo);
         return Result.success();
     }
 
     /*鏍规嵁寮傚父鏃堕棿杩斿洖鏃堕棿鍐呭凡瀹℃牳鐨勫紓甯�*/
     @GetMapping("/auditnum")
-    public Result getHasAuditedData(String beginTime, String endTime){
-        List<DustExceptionData> list = fugitiveDustService.getHasAuditedData(beginTime,endTime);
+    public Result getHasAuditedData(String beginTime, String endTime) {
+        List<DustExceptionData> list = fugitiveDustService.getHasAuditedData(beginTime, endTime);
         return Result.success(list);
     }
 
     /*鍐欏叆鐢ㄦ埛鐨勫叏灞�閰嶇疆*/
     @PostMapping("setting")
-    public Result setting(@RequestBody DustDataAccessSetting dustDataAccessSetting){
-       fugitiveDustService.setting(dustDataAccessSetting);
+    public Result setting(@RequestBody DustDataAccessSetting dustDataAccessSetting) {
+        fugitiveDustService.setting(dustDataAccessSetting);
         return Result.success();
     }
 
 
     /*鏍规嵁寮傚父绫诲瀷鍜屾椂娈� 杩斿洖绔欑偣鍚嶅瓧*/
     @GetMapping("/exceptionsSiteName")
-    public Result getSiteNameByTimeAndExceptionType(String [] exceptionType, String beginTime, String endTime){
-        List<DustExceptionData> list = fugitiveDustService.getSiteNameByTimeAndExceptionType(exceptionType,beginTime,endTime);
+    public Result getSiteNameByTimeAndExceptionType(String[] exceptionType, String beginTime, String endTime) {
+        List<DustExceptionData> list = fugitiveDustService.getSiteNameByTimeAndExceptionType(exceptionType, beginTime, endTime);
         return Result.success(list);
     }
 
 
     @GetMapping("/analysisdataByType")
-    public Result analysisdataByType( String month,String type){
-        List<AnalysisDustData> list = fugitiveDustService.analysisdataByType(month,type);
+    public Result analysisdataByType(String month, String type) {
+        List<AnalysisDustData> list = fugitiveDustService.analysisdataByType(month, type);
         return Result.success(list);
     }
 
 
     @GetMapping("/analysisdataByTimeAndType")
-    public Result analysisdataByTimeAndType( String beginTime,String endTime,String type){
-        List<AnalysisDustData> list = fugitiveDustService.analysisdataByTimeAndType(beginTime,endTime,type);
+    public Result analysisdataByTimeAndType(String beginTime, String endTime, String type) {
+        List<AnalysisDustData> list = fugitiveDustService.analysisdataByTimeAndType(beginTime, endTime, type);
         return Result.success(list);
     }
 
diff --git a/src/main/java/com/flightfeather/monitor/domain/ds1/mapper/DustStatisticsValueMapper.kt b/src/main/java/com/flightfeather/monitor/domain/ds1/mapper/DustStatisticsValueMapper.kt
index 683641e..6fc5abe 100644
--- a/src/main/java/com/flightfeather/monitor/domain/ds1/mapper/DustStatisticsValueMapper.kt
+++ b/src/main/java/com/flightfeather/monitor/domain/ds1/mapper/DustStatisticsValueMapper.kt
@@ -2,6 +2,7 @@
 
 import com.flightfeather.monitor.domain.ds1.entity.DustStatisticsValue
 import com.flightfeather.monitor.domain.util.MyMapper
+import com.flightfeather.monitor.pojo.AnalysisDustData
 import org.apache.ibatis.annotations.Mapper
 import java.time.LocalDateTime
 
@@ -11,4 +12,10 @@
     fun dailyStatics(beginTime: LocalDateTime, endTime: LocalDateTime)
 
     fun monthlyStatics(beginTime: LocalDateTime, endTime: LocalDateTime, count: Int)
+
+    /**
+     * 鏍规嵁鏉′欢鎺掑簭鏌ヨ
+     */
+    fun selectByOrder(siteName: String, beginTime: String, endTime: String, orderProp: String?, asc: Boolean):
+            List<AnalysisDustData?>
 }
\ No newline at end of file
diff --git a/src/main/java/com/flightfeather/monitor/domain/ds1/repository/RiskValueRep.kt b/src/main/java/com/flightfeather/monitor/domain/ds1/repository/RiskValueRep.kt
index 338db81..c63fd50 100644
--- a/src/main/java/com/flightfeather/monitor/domain/ds1/repository/RiskValueRep.kt
+++ b/src/main/java/com/flightfeather/monitor/domain/ds1/repository/RiskValueRep.kt
@@ -35,6 +35,37 @@
     }
 
     /**
+     * 鎵归噺鎻掑叆鎴栨洿鏂�,浠呴檺鍚屼竴鏃ョ殑鎴栧悓涓�鏈堢殑鎵归噺鏁版嵁
+     * @param list
+     */
+    fun insertOrUpdate(list: List<RiskValue>): Int {
+        if (list.isEmpty()) return 0
+        val newDataList = mutableListOf<RiskValue>()
+        val oldDataList = mutableListOf<RiskValue>()
+        val dataList = riskValueMapper.selectByExample(Example(RiskValue::class.java).apply {
+            createCriteria().andEqualTo("lst", list[0].lst)
+                .andEqualTo("type", list[0].type)
+        })
+        list.forEach { l ->
+            val r = dataList.find { d ->
+                d?.mnCode == l.mnCode
+            }
+            if (r != null) {
+                l.id = r.id
+                oldDataList.add(l)
+            } else {
+                newDataList.add(l)
+            }
+        }
+        val r1 = riskValueMapper.insertList(newDataList)
+        var r2 = 0
+        oldDataList.forEach {
+            r2 += riskValueMapper.updateByPrimaryKey(it)
+        }
+        return r1 + r2
+    }
+
+    /**
      * 鏌ヨ
      * @param mnCode
      * @param date
diff --git a/src/main/java/com/flightfeather/monitor/enumration/dust/DataStatus.kt b/src/main/java/com/flightfeather/monitor/enumration/dust/DataStatus.kt
new file mode 100644
index 0000000..d9d06ec
--- /dev/null
+++ b/src/main/java/com/flightfeather/monitor/enumration/dust/DataStatus.kt
@@ -0,0 +1,16 @@
+package com.flightfeather.monitor.enumration.dust
+
+enum class DataStatus(val value: String, val des: String) {
+    N("N", "姝e父"),
+    C("C", "璁惧鏍″噯"),
+    D("D", "璁惧鏂紑"),
+    P("P", "涓�璧风數婧愭晠闅�"),
+    OUT_MIN("-", "瓒呰繃鏁版嵁璁惧畾鑼冨洿涓嬮檺"),
+    OUT_MAX("+", "瓒呰繃鏁版嵁璁惧畾鑼冨洿涓婇檺"),
+    Q("Q", "浣庝簬鍏ㄥ競鍥芥帶鐐筆M2.5骞冲潎娴撳害浜屽垎涔嬩竴"),
+    VALID(">", "棰楃矑鐗╂湁鏁堟暟鎹ぇ浜�90%"),
+    INVALID("<", "棰楃矑鐗╂湁鏁堟暟鎹皬浜�90%"),
+    R("R", "椋庨�熷ぇ浜�8m/s鍜岄洦銆侀洩绛夊ぉ姘旀潯浠�"),
+    J("J", "寮�灞曡閲忔瀹氭垨姣斿娴嬭瘯"),
+    A("A", "琛ヤ紶"),
+}
\ No newline at end of file
diff --git a/src/main/java/com/flightfeather/monitor/enumration/dust/ExceptionType.kt b/src/main/java/com/flightfeather/monitor/enumration/dust/ExceptionType.kt
index 1551ec3..fa2aae6 100644
--- a/src/main/java/com/flightfeather/monitor/enumration/dust/ExceptionType.kt
+++ b/src/main/java/com/flightfeather/monitor/enumration/dust/ExceptionType.kt
@@ -1,7 +1,7 @@
 package com.flightfeather.monitor.enumration.dust
 
 enum class ExceptionType(val value:Int, val des:String) {
-    TYPE0(0, "鏂綉鎴栨帀绾�"),
+    TYPE0(0, "鏁版嵁缂哄け寮傚父"),
     TYPE1(1, "鏁版嵁瓒呬綆寮傚父"),
     TYPE2(2, "鏁版嵁瓒呮爣"),
     TYPE3(3, "鏁版嵁闀挎椂娈垫棤娉㈠姩"),
@@ -9,4 +9,5 @@
     TYPE5(5, "涓磋繎瓒呮爣寮傚父"),
     TYPE6(6, "鍗曟棩瓒呮爣娆℃暟涓磋繎澶勭綒寮傚父"),
     TYPE7(7, "婊戝姩骞冲潎鍊肩獊鍙樺紓甯�"),
+    TYPE8(8, "鏈夋晥鐜囧紓甯�"),
 }
\ No newline at end of file
diff --git a/src/main/java/com/flightfeather/monitor/pojo/AnalysisDustData.java b/src/main/java/com/flightfeather/monitor/pojo/AnalysisDustData.java
index c69dd89..5c27053 100644
--- a/src/main/java/com/flightfeather/monitor/pojo/AnalysisDustData.java
+++ b/src/main/java/com/flightfeather/monitor/pojo/AnalysisDustData.java
@@ -21,8 +21,8 @@
     private Double dayAvg;
     private Double min;
     private Double max;
-    private String dayOnline;
-    private String dayValid;
-    private String  dayExceeding;
+    private Double dayOnline;
+    private Double dayValid;
+    private Double  dayExceeding;
     private String  type;
 }
diff --git a/src/main/java/com/flightfeather/monitor/service/FugitiveDustService.java b/src/main/java/com/flightfeather/monitor/service/FugitiveDustService.java
index 6c54d41..764847c 100644
--- a/src/main/java/com/flightfeather/monitor/service/FugitiveDustService.java
+++ b/src/main/java/com/flightfeather/monitor/service/FugitiveDustService.java
@@ -1,31 +1,33 @@
 package com.flightfeather.monitor.service;
 
 import com.flightfeather.monitor.pojo.*;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
 public interface FugitiveDustService {
 
-    PageBean page(Integer page, Integer pageSize, String siteName, String mnCode, String beginTime, String endTime,String[] scenarioType);
+    PageBean page(Integer page, Integer pageSize, String siteName, String mnCode, String beginTime, String endTime, String[] scenarioType);
 
     List<DustSiteData> scenarioData();
 
     List<DustSiteData> allSiteName();
 
-    List<AnalysisDustData> analysisdata( String siteName,String beginTime, String endTime,String type);
+    List<AnalysisDustData> analysisdata(String siteName, String beginTime, String endTime, String type);
 
     List<AnalysisDustData> analysisByTime(String siteName, String beginTime, String endTime);
 
-    PageBean pageAnalysisTime(Integer page, Integer pageSize, String siteName, String beginTime, String endTime);
+    PageBean pageAnalysisTime(Integer page, Integer pageSize, String siteName, String beginTime, String endTime, String orderProp,
+                              Boolean asc);
 
     List<DustExceptionType> getExceptionType();
 
 
     PageBean getExceptionData(Integer page, Integer pageSize, String siteName, String[] exceptionType, String beginTime, String endTime);
 
-    List<DustExceptionData> getExceptionSitenameAndCode(String exceptionType, String beginTime, String endTime,String [] street,String [] dutyCompany,String siteName);
+    List<DustExceptionData> getExceptionSitenameAndCode(String exceptionType, String beginTime, String endTime, String[] street, String[] dutyCompany, String siteName);
 
-    Integer exceptionNum(String exceptionType, String beginTime, String endTime,String [] street,String [] dutyCompany,String siteName);
+    Integer exceptionNum(String exceptionType, String beginTime, String endTime, String[] street, String[] dutyCompany, String siteName);
 
     List<DustSiteData> conditonQueryHistoryData(String siteName, String beginTime, String endTime);
 
@@ -36,6 +38,7 @@
     List<AnalysisDustData> analysisAll(String siteName, String beginTime, String endTime);
 
     List<DustSiteData> conditonQueryhistoryallData(String siteName, String mnCode, String beginTime, String endTime, String[] scenarioType);
+
     /*鏂板瀹¤淇℃伅*/
     void addAuditNotes(AuditInfo auditInfo);
 
@@ -50,7 +53,7 @@
 
     List<DustExceptionData> getSiteNameByTimeAndExceptionType(String[] exceptionType, String beginTime, String endTime);
 
-    List<AnalysisDustData> analysisdataByType(String month,String type);
+    List<AnalysisDustData> analysisdataByType(String month, String type);
 
     List<AnalysisDustData> analysisdataByTimeAndType(String beginTime, String endTime, String type);
 
diff --git a/src/main/java/com/flightfeather/monitor/service/impl/FugitiveDustServiceImpl.java b/src/main/java/com/flightfeather/monitor/service/impl/FugitiveDustServiceImpl.java
index 25e7885..aafa6d7 100644
--- a/src/main/java/com/flightfeather/monitor/service/impl/FugitiveDustServiceImpl.java
+++ b/src/main/java/com/flightfeather/monitor/service/impl/FugitiveDustServiceImpl.java
@@ -1,13 +1,16 @@
 package com.flightfeather.monitor.service.impl;
 
+import com.flightfeather.monitor.domain.ds1.mapper.DustStatisticsValueMapper;
 import com.flightfeather.monitor.mapper.FugitiveDustMapper;
 import com.flightfeather.monitor.pojo.*;
 import com.flightfeather.monitor.service.FugitiveDustService;
+import com.flightfeather.monitor.utils.StringUtil;
 import com.github.pagehelper.Page;
 import com.github.pagehelper.PageHelper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.time.LocalDateTime;
 import java.util.List;
@@ -19,18 +22,21 @@
     @Autowired
     private FugitiveDustMapper fugitiveDustMapper;
 
+    @Autowired
+    private DustStatisticsValueMapper dustStatisticsValueMapper;
+
     @Override
-    public PageBean page(Integer page, Integer pageSize, String siteName, String mnCode, String beginTime, String endTime,String[] scenarioType) {
+    public PageBean page(Integer page, Integer pageSize, String siteName, String mnCode, String beginTime, String endTime, String[] scenarioType) {
         //璁剧疆鍒嗛〉鍙傛暟
-        PageHelper.startPage(page,pageSize);
+        PageHelper.startPage(page, pageSize);
         //鎵ц鏌ヨ
-        List<DustSiteData> infoList=fugitiveDustMapper.conditonQueryDustHistoryData(siteName,mnCode,beginTime,endTime,scenarioType);
+        List<DustSiteData> infoList = fugitiveDustMapper.conditonQueryDustHistoryData(siteName, mnCode, beginTime, endTime, scenarioType);
         //鑾峰彇鏌ヨ缁撴灉
-        Page<DustSiteData> p=(Page<DustSiteData>)infoList;
+        Page<DustSiteData> p = (Page<DustSiteData>) infoList;
 
         //灏佽PageBean瀵硅薄*/
-        PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
-        return  pageBean;
+        PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
+        return pageBean;
     }
 
     @Override
@@ -46,29 +52,29 @@
     }
 
     @Override
-    public List<AnalysisDustData> analysisdata( String siteName,String beginTime, String endTime,String type) {
-        List<AnalysisDustData> list = fugitiveDustMapper.analysisdata(siteName,beginTime,endTime,type);
+    public List<AnalysisDustData> analysisdata(String siteName, String beginTime, String endTime, String type) {
+        List<AnalysisDustData> list = fugitiveDustMapper.analysisdata(siteName, beginTime, endTime, type);
         return list;
     }
 
     @Override
     public List<AnalysisDustData> analysisByTime(String siteName, String beginTime, String endTime) {
-        List<AnalysisDustData> list = fugitiveDustMapper.analysisByTime(siteName,beginTime,endTime);
+        List<AnalysisDustData> list = fugitiveDustMapper.analysisByTime(siteName, beginTime, endTime);
         return list;
     }
 
     @Override
-    public PageBean pageAnalysisTime(Integer page, Integer pageSize, String siteName, String beginTime, String endTime) {
+    public PageBean pageAnalysisTime(Integer page, Integer pageSize, String siteName, String beginTime,
+                                     String endTime, String orderProp,
+                                     Boolean asc) {
         //璁剧疆鍒嗛〉鍙傛暟
-        PageHelper.startPage(page,pageSize);
-        //鎵ц鏌ヨ
-        List<AnalysisDustData> infoList=fugitiveDustMapper.analysisByTime(siteName,beginTime,endTime);
+        Page<AnalysisDustData> p = PageHelper.startPage(page, pageSize);
         //鑾峰彇鏌ヨ缁撴灉
-        Page<AnalysisDustData> p=(Page<AnalysisDustData>)infoList;
+        String prop = StringUtil.INSTANCE.camelCaseToUnderline(orderProp);
+        dustStatisticsValueMapper.selectByOrder(siteName, beginTime, endTime, prop, asc);
 
-        //灏佽PageBean瀵硅薄*/
-        PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
-        return  pageBean;
+        //灏佽PageBean瀵硅薄
+        return new PageBean(p.getTotal(), p.getResult());
     }
 
     @Override
@@ -80,39 +86,39 @@
     @Override
     public PageBean getExceptionData(Integer page, Integer pageSize, String siteName, String[] exceptionType, String beginTime, String endTime) {
         //璁剧疆鍒嗛〉鍙傛暟
-        PageHelper.startPage(page,pageSize);
+        PageHelper.startPage(page, pageSize);
 
-        List<DustExceptionData> infoList = fugitiveDustMapper.getExceptionData(siteName,exceptionType,beginTime,endTime);
+        List<DustExceptionData> infoList = fugitiveDustMapper.getExceptionData(siteName, exceptionType, beginTime, endTime);
         //鑾峰彇鏌ヨ缁撴灉
-        Page<DustExceptionData> p=(Page<DustExceptionData>)infoList;
+        Page<DustExceptionData> p = (Page<DustExceptionData>) infoList;
 
         //灏佽PageBean瀵硅薄*/
-        PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
+        PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
 
-        return  pageBean;
+        return pageBean;
     }
 
     @Override
-    public List<DustExceptionData> getExceptionSitenameAndCode(String exceptionType, String beginTime, String endTime,String [] street,String [] dutyCompany,String siteName) {
-        List<DustExceptionData> list = fugitiveDustMapper.getExceptionSitenameAndCode(exceptionType,beginTime,endTime,street,dutyCompany,siteName);
+    public List<DustExceptionData> getExceptionSitenameAndCode(String exceptionType, String beginTime, String endTime, String[] street, String[] dutyCompany, String siteName) {
+        List<DustExceptionData> list = fugitiveDustMapper.getExceptionSitenameAndCode(exceptionType, beginTime, endTime, street, dutyCompany, siteName);
         return list;
     }
 
     @Override
-    public Integer exceptionNum(String exceptionType, String beginTime, String endTime,String [] street,String [] dutyCompany,String siteName) {
-        Integer list = fugitiveDustMapper.exceptionNum(exceptionType,beginTime,endTime,street,dutyCompany,siteName);
+    public Integer exceptionNum(String exceptionType, String beginTime, String endTime, String[] street, String[] dutyCompany, String siteName) {
+        Integer list = fugitiveDustMapper.exceptionNum(exceptionType, beginTime, endTime, street, dutyCompany, siteName);
         return list;
     }
 
     @Override
     public List<DustSiteData> conditonQueryHistoryData(String siteName, String beginTime, String endTime) {
-        List<DustSiteData> list = fugitiveDustMapper.conditonQueryHistoryData(siteName,beginTime,endTime);
+        List<DustSiteData> list = fugitiveDustMapper.conditonQueryHistoryData(siteName, beginTime, endTime);
         return list;
     }
 
     @Override
     public List<DustExceptionData> getExceptionAllData(String siteName, String[] exceptionType, String beginTime, String endTime) {
-        List<DustExceptionData> list = fugitiveDustMapper.getExceptionData(siteName,exceptionType,beginTime,endTime);
+        List<DustExceptionData> list = fugitiveDustMapper.getExceptionData(siteName, exceptionType, beginTime, endTime);
         return list;
     }
 
@@ -124,22 +130,22 @@
 
     @Override
     public List<AnalysisDustData> analysisAll(String siteName, String beginTime, String endTime) {
-        List<AnalysisDustData> list = fugitiveDustMapper.analysisByTime(siteName,beginTime,endTime);
+        List<AnalysisDustData> list = fugitiveDustMapper.analysisByTime(siteName, beginTime, endTime);
         return list;
     }
 
     @Override
     public List<DustSiteData> conditonQueryhistoryallData(String siteName, String mnCode, String beginTime, String endTime, String[] scenarioType) {
-        List<DustSiteData> list = fugitiveDustMapper.conditonQueryDustHistoryData(siteName,mnCode,beginTime,endTime,scenarioType);
+        List<DustSiteData> list = fugitiveDustMapper.conditonQueryDustHistoryData(siteName, mnCode, beginTime, endTime, scenarioType);
         return list;
     }
 
     @Override
     public void addAuditNotes(AuditInfo auditInfo) {
-        if(auditInfo.getAuditStatus()==3){
+        if (auditInfo.getAuditStatus() == 3) {
             auditInfo.setUpdateTime(LocalDateTime.now());
             auditInfo.setCreateTime(LocalDateTime.now());
-        }else{
+        } else {
             auditInfo.setCreateTime(LocalDateTime.now());
 
         }
@@ -161,7 +167,7 @@
 
     @Override
     public List<DustExceptionData> getHasAuditedData(String beginTime, String endTime) {
-        List<DustExceptionData> list = fugitiveDustMapper.getHasAuditedData(beginTime,endTime);
+        List<DustExceptionData> list = fugitiveDustMapper.getHasAuditedData(beginTime, endTime);
         return list;
     }
 
@@ -173,35 +179,35 @@
 
     @Override
     public List<DustExceptionData> getSiteNameByTimeAndExceptionType(String[] exceptionType, String beginTime, String endTime) {
-        List<DustExceptionData> list = fugitiveDustMapper.getSiteNameByTimeAndExceptionType(exceptionType,beginTime,endTime);
+        List<DustExceptionData> list = fugitiveDustMapper.getSiteNameByTimeAndExceptionType(exceptionType, beginTime, endTime);
         return list;
     }
 
     @Override
     public List<AnalysisDustData> analysisdataByType(String month, String type) {
-        List<AnalysisDustData> list = fugitiveDustMapper.analysisdataByType(month,type);
+        List<AnalysisDustData> list = fugitiveDustMapper.analysisdataByType(month, type);
         return list;
     }
 
     @Override
     public List<AnalysisDustData> analysisdataByTimeAndType(String beginTime, String endTime, String type) {
-        List<AnalysisDustData> list = fugitiveDustMapper.analysisdataByTimeAndType(beginTime,endTime,type);
+        List<AnalysisDustData> list = fugitiveDustMapper.analysisdataByTimeAndType(beginTime, endTime, type);
         return list;
     }
 
     @Override
     public PageBean getExceptionData2(Integer page, Integer pageSize, String siteName, String[] exceptionType, String beginTime, String endTime, String[] street, String[] dutyCompany) {
         //璁剧疆鍒嗛〉鍙傛暟
-        PageHelper.startPage(page,pageSize);
+        PageHelper.startPage(page, pageSize);
 
-        List<DustExceptionData> infoList = fugitiveDustMapper.getExceptionData2(siteName,exceptionType,beginTime,endTime,street,dutyCompany);
+        List<DustExceptionData> infoList = fugitiveDustMapper.getExceptionData2(siteName, exceptionType, beginTime, endTime, street, dutyCompany);
         //鑾峰彇鏌ヨ缁撴灉
-        Page<DustExceptionData> p=(Page<DustExceptionData>)infoList;
+        Page<DustExceptionData> p = (Page<DustExceptionData>) infoList;
 
         //灏佽PageBean瀵硅薄*/
-        PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
+        PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
 
-        return  pageBean;
+        return pageBean;
     }
 
 
diff --git a/src/main/java/com/flightfeather/monitor/utils/StringUtil.kt b/src/main/java/com/flightfeather/monitor/utils/StringUtil.kt
new file mode 100644
index 0000000..507328c
--- /dev/null
+++ b/src/main/java/com/flightfeather/monitor/utils/StringUtil.kt
@@ -0,0 +1,27 @@
+package com.flightfeather.monitor.utils
+
+/**
+ * 鏂囨湰宸ュ叿
+ */
+object StringUtil {
+
+    /**
+     * 椹煎嘲鍛藉悕娉曟枃鏈浆涓嬪垝绾挎枃鏈�
+     * @param t
+     * @return
+     */
+    fun camelCaseToUnderline(t: String?): String? {
+        t ?: return null
+
+        val result = StringBuilder()
+        t.forEach {
+            if (it.isUpperCase()) {
+                result.append('_')
+                result.append(it.lowercaseChar())
+            } else {
+                result.append(it)
+            }
+        }
+        return result.toString()
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 358ae74..15597db 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -21,8 +21,8 @@
 
 mybatis:
   configuration:
-#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
     map-underscore-to-camel-case: true
   type-aliases-package: com.flightfeather.monitor.domain.ds1.entity
   mapper-locations: classpath*:mapper/**/*.xml
diff --git a/src/main/resources/mapper/ds1/DustStatisticsValueMapper.xml b/src/main/resources/mapper/ds1/DustStatisticsValueMapper.xml
index 4726f1b..a19b0b5 100644
--- a/src/main/resources/mapper/ds1/DustStatisticsValueMapper.xml
+++ b/src/main/resources/mapper/ds1/DustStatisticsValueMapper.xml
@@ -1,63 +1,105 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.flightfeather.monitor.domain.ds1.mapper.DustStatisticsValueMapper">
-  <resultMap id="BaseResultMap" type="com.flightfeather.monitor.domain.ds1.entity.DustStatisticsValue">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <id column="id" jdbcType="INTEGER" property="id" />
-    <result column="mn_code" jdbcType="VARCHAR" property="mnCode" />
-    <result column="lst" jdbcType="DATE" property="lst" />
-    <result column="day_avg" jdbcType="VARCHAR" property="dayAvg" />
-    <result column="min" jdbcType="VARCHAR" property="min" />
-    <result column="max" jdbcType="VARCHAR" property="max" />
-    <result column="day_online" jdbcType="VARCHAR" property="dayOnline" />
-    <result column="day_valid" jdbcType="VARCHAR" property="dayValid" />
-    <result column="day_exceeding" jdbcType="VARCHAR" property="dayExceeding" />
-    <result column="type" jdbcType="VARCHAR" property="type" />
-  </resultMap>
-  <sql id="Base_Column_List">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    id, mn_code, lst, day_avg, min, max, day_online, day_valid, day_exceeding, type
-  </sql>
+    <resultMap id="BaseResultMap" type="com.flightfeather.monitor.domain.ds1.entity.DustStatisticsValue">
+        <!--
+          WARNING - @mbg.generated
+        -->
+        <id column="id" jdbcType="INTEGER" property="id"/>
+        <result column="mn_code" jdbcType="VARCHAR" property="mnCode"/>
+        <result column="lst" jdbcType="DATE" property="lst"/>
+        <result column="day_avg" jdbcType="VARCHAR" property="dayAvg"/>
+        <result column="min" jdbcType="VARCHAR" property="min"/>
+        <result column="max" jdbcType="VARCHAR" property="max"/>
+        <result column="day_online" jdbcType="VARCHAR" property="dayOnline"/>
+        <result column="day_valid" jdbcType="VARCHAR" property="dayValid"/>
+        <result column="day_exceeding" jdbcType="VARCHAR" property="dayExceeding"/>
+        <result column="type" jdbcType="VARCHAR" property="type"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        <!--
+          WARNING - @mbg.generated
+        -->
+        id, mn_code, lst, day_avg, min, max, day_online, day_valid, day_exceeding, type
+    </sql>
 
-  <insert id="dailyStatics">
-    insert into  dust_statistics_value(mn_code,lst,day_avg,min,max,day_online,day_valid,day_exceeding,type)
-    select  a.*
-    from  (select
-    mn_code as mn_code,
-    DATE(lst) as lst,
-    ROUND(AVG(dust_value),3)  as day_avg,
-    min(dust_value) as min,
-    max(dust_value) as max,
-    CONCAT(ROUND(COUNT(*)/96*100, 2), '%')  as day_online,
-    CONCAT(ROUND(SUM(CASE WHEN dust_value >0 THEN 1 ELSE 0 END)/96 *100, 2), '%') as day_valid,
-    CONCAT(ROUND(SUM(CASE WHEN dust_value >= 1  THEN 1 ELSE 0 END)/96*100,2),'%') as  day_exceeding,
-    'day' as type
-    from ja_t_dust_site_data_info
-    where  lst between #{beginTime} and #{endTime}
-    GROUP BY mn_code,DATE(lst)
-    ) as a
-  </insert>
-  <insert id="monthlyStatics">
-    insert into  dust_statistics_value(mn_code,lst,day_avg,min,max,day_online,day_valid,day_exceeding,type)
-    select  a.*
-    from  (
-    SELECT
-    mn_code AS mn_code,
-    DATE_FORMAT(lst, '%Y-%m-01') AS month,
-    ROUND(AVG(dust_value), 3) AS month_avg,
-    MIN(dust_value) AS min,
-    MAX(dust_value) AS max,
-    CONCAT(ROUND(COUNT(*) / #{count} * 100, 2), '%') AS month_online,
-    CONCAT(ROUND(SUM(CASE WHEN flag = 'N' OR flag = 'A' THEN 1 ELSE 0 END) / #{count} * 100, 2), '%') AS month_valid,
-    CONCAT(ROUND(SUM(CASE WHEN dust_value >= 1 THEN 1 ELSE 0 END) / #{count} * 100, 2), '%') AS month_exceeding,
-    'month' as type
-    FROM ja_t_dust_site_data_info
-    WHERE lst BETWEEN #{beginTime} and #{endTime}
-    GROUP BY mn_code, DATE_FORMAT(lst, '%Y-%m-01')
-    ) as a
-  </insert>
+    <insert id="dailyStatics">
+        insert into dust_statistics_value(mn_code,lst,day_avg,min,max,day_online,day_valid,day_exceeding,type)
+        select a.*
+        from (select
+        mn_code as mn_code,
+        DATE(lst) as lst,
+        ROUND(AVG(dust_value),3) as day_avg,
+        min(dust_value) as min,
+        max(dust_value) as max,
+        ROUND(COUNT(*)/96, 4) as day_online,
+        ROUND(SUM(CASE WHEN dust_value >0 THEN 1 ELSE 0 END)/96, 4) as day_valid,
+        ROUND(SUM(CASE WHEN dust_value >= 1 THEN 1 ELSE 0 END)/96, 4) as day_exceeding,
+        'day' as type
+        from ja_t_dust_site_data_info
+        where lst between #{beginTime} and #{endTime}
+        GROUP BY mn_code,DATE(lst)
+        ) as a
+    </insert>
+    <insert id="monthlyStatics">
+        insert into dust_statistics_value(mn_code,lst,day_avg,min,max,day_online,day_valid,day_exceeding,type)
+        select a.*
+        from (
+        SELECT
+        mn_code AS mn_code,
+        DATE_FORMAT(lst, '%Y-%m-01') AS month,
+        ROUND(AVG(dust_value), 3) AS month_avg,
+        MIN(dust_value) AS min,
+        MAX(dust_value) AS max,
+        ROUND(COUNT(*) / #{count}, 4) AS month_online,
+        ROUND(SUM(CASE WHEN flag = 'N' OR flag = 'A' THEN 1 ELSE 0 END) / #{count}, 4) AS month_valid,
+        ROUND(SUM(CASE WHEN dust_value >= 1 THEN 1 ELSE 0 END) / #{count}, 4) AS month_exceeding,
+        'month' as type
+        FROM ja_t_dust_site_data_info
+        WHERE lst BETWEEN #{beginTime} and #{endTime}
+        GROUP BY mn_code, DATE_FORMAT(lst, '%Y-%m-01')
+        ) as a
+    </insert>
+
+    <!--    鏍规嵁绔欑偣鍚嶅瓧鍜屾椂娈佃繘琛岀粺璁″垎鏋�-->
+    <select id="selectByOrder" resultType="com.flightfeather.monitor.pojo.AnalysisDustData">
+        select c.name,d.*
+        from dust_statistics_value as d
+        left join ja_t_dust_site_info as c on c.mn_code = d.mn_code
+        <where>
+            <if test="siteName != null and siteName != ''">
+                and c.name = #{siteName}
+            </if>
+            <if test="beginTime != null and endTime != null">
+                and d.lst between #{beginTime} and #{endTime} and d.type = 'day'
+            </if>
+        </where>
+        <if test="orderProp == 'lst'">
+            order by d.lst
+        </if>
+        <if test="orderProp == 'day_avg'">
+            order by d.day_avg
+        </if>
+        <if test="orderProp == 'min'">
+            order by d.min
+        </if>
+        <if test="orderProp == 'max'">
+            order by d.max
+        </if>
+        <if test="orderProp == 'day_online'">
+            order by d.day_online
+        </if>
+        <if test="orderProp == 'day_valid'">
+            order by d.day_valid
+        </if>
+        <if test="orderProp == 'day_exceeding'">
+            order by d.day_exceeding
+        </if>
+        <if test="orderProp != null and asc">
+            asc
+        </if>
+        <if test="orderProp != null and !asc">
+            desc
+        </if>
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/test/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisControllerTest.kt b/src/test/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisControllerTest.kt
index 6c31c13..99cde34 100644
--- a/src/test/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisControllerTest.kt
+++ b/src/test/java/com/flightfeather/monitor/analysis/dust/ExceptionAnalysisControllerTest.kt
@@ -27,9 +27,9 @@
     @Test
     fun run() {
         exceptionAnalysisController.init()
-        var d1 = LocalDate.of(2023, 10, 26)
-        val d2 = LocalDate.of(2023, 10, 26)
-        while (Duration.between(d1.atStartOfDay(), d2.atStartOfDay()).toDays() >= 0L) {
+        var d1 = LocalDate.of(2023, 7, 1)
+        val d2 = LocalDate.of(2023, 11, 21)
+        while (d1.isEqual(d2) || d1.isBefore(d2)) {
             exceptionAnalysisController.run(d1)
             d1 = d1.plusDays(1)
         }

--
Gitblit v1.9.3