feiyu02
2023-12-01 c6842e8498c2d9b469890b38cd9f0d714392c445
src/main/java/com/flightfeather/monitor/analysis/dust/risk/DustRiskAnalysis.kt
@@ -2,6 +2,10 @@
import com.flightfeather.monitor.domain.ds1.entity.*
import com.flightfeather.monitor.enumration.dust.ExceptionType
import java.time.LocalDate
import java.time.ZoneId
import java.util.*
import kotlin.math.round
/**
 * 扬尘监测数据风险分析基类
@@ -21,8 +25,12 @@
    /**
     * 每轮次的初始化
     */
    fun roundInit() {
        resultList.add(RiskValue())
    fun roundInit(mnCode: String, date: LocalDate) {
        resultList.add(RiskValue().apply {
            this.mnCode = mnCode
            lst = Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())
            type = "day"
        })
    }
    /**
@@ -37,23 +45,22 @@
        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
        val dayOnline = data.dayOnline
        riskValue.onlineRisk = round((1 - dayOnline) * 10000) / 10000
    }
    /**
     * 有效率风险值
     */
    fun riskValidRate(riskValue: RiskValue, data: DustStatisticsValue) {
        val dayValid = data.dayValid.substring(0, data.dayValid.lastIndex).toDouble() / 100
        riskValue.validRisk = 1 - dayValid
        val dayValid = data.dayValid
        riskValue.validRisk = round((1 - dayValid) * 10000) / 10000
    }
    /**
@@ -66,7 +73,7 @@
        var v2 = 0
        // 日临近超标次数/7
        var v3 = 0
        list.forEach {d ->
        list.forEach { d ->
            if (d == null) return@forEach
            when {
                d.dustValue >= 2.0 -> v2++
@@ -92,7 +99,7 @@
        var v1 = 0
        var v2 = 0
        var v3 = 0
        list.forEach { d->
        list.forEach { d ->
            if (d == null) return@forEach
            when (d.exceptionType) {
                ExceptionType.TYPE4.value -> v1++
@@ -100,10 +107,10 @@
                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)
        val e1 = settingRange((v1 - 1) / 4.0)
        val e2 = settingRange((v2 - 1) / 3.0)
        val e3 = settingRange((v3 - 1) / 2.0)
        riskValue.typicalExceptionRepetitionRate = settingRange(e1 + e2 + e3)
    }
    /**
@@ -125,9 +132,5 @@
        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
    private fun settingRange(d: Double): Double = if (d > 1) 1.0 else if (d < 0) .0 else d
}