| | |
| | | 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(ExceptionValidRate(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)) |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | fun debugRun() { |
| | | val result = mutableListOf<DustExceptionData>() |
| | | val date = LocalDate.of(2023, 7, 2) |
| | | val date = LocalDate.of(2023, 11, 22) |
| | | taskList.forEach { it.init() } |
| | | // 轮询数据,计算各个异常 |
| | | val list = dustSiteDataRep.select("YZT0JS0150043", date) |
| | | val list = dustSiteDataRep.select("SHKJ0JS0150917", date) |
| | | list.takeIf { it.isNotEmpty() }?.forEach { d -> |
| | | d?.let { taskList[0].onNextData(d) } |
| | | d?.let { taskList.forEach { it.onNextData(d) } } |
| | | } |
| | | // 各个异常分析分别结束 |
| | | taskList[0].onDone() |
| | | taskList.forEach { it.onDone() } |
| | | // 存储分析结果 |
| | | taskList.forEach { result.addAll(it.resultList) } |
| | | println(result) |
| | |
| | | |
| | | override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean { |
| | | // 判断数据临近超标数量是否连续超过限定个数 |
| | | return (eIndex - sIndex) >= config.nearExceedNum |
| | | return (eIndex - 1 - sIndex) >= config.nearExceedNum |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean { |
| | | return (eIndex - sIndex) >= config.longTimeNoChange |
| | | return (eIndex - 1 - sIndex) >= config.longTimeNoChange |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | override fun onDone() { |
| | | val rate = count / total |
| | | val rate = count.toDouble() / total |
| | | if (rate < 0.9) { |
| | | startData?.let { |
| | | val eType = getExceptionType() |
| | |
| | | } |
| | | |
| | | override fun judgeDuration(sIndex: Int, eIndex: Int): Boolean { |
| | | val b1 = special && (eIndex - sIndex) >= (config.mutationNum / 2) |
| | | val b2 = (eIndex - sIndex) >= config.mutationNum |
| | | val b1 = special && (eIndex - 1 - sIndex) >= (config.mutationNum / 2) |
| | | val b2 = (eIndex - 1 - sIndex) >= config.mutationNum |
| | | special = false |
| | | return b1 || b2 |
| | | } |
| | |
| | | import java.time.LocalDate |
| | | import java.time.ZoneId |
| | | import java.util.* |
| | | import kotlin.math.round |
| | | |
| | | /** |
| | | * 扬尘监测数据风险分析基类 |
| | |
| | | * 在线率风险值 |
| | | */ |
| | | 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 |
| | | } |
| | | |
| | | /** |
| | |
| | | private Date lst; |
| | | |
| | | @Column(name = "day_avg") |
| | | private String dayAvg; |
| | | private Double dayAvg; |
| | | |
| | | private String min; |
| | | private Double min; |
| | | |
| | | private String max; |
| | | private Double max; |
| | | |
| | | @Column(name = "day_online") |
| | | private String dayOnline; |
| | | private Double dayOnline; |
| | | |
| | | @Column(name = "day_valid") |
| | | private String dayValid; |
| | | private Double dayValid; |
| | | |
| | | @Column(name = "day_exceeding") |
| | | private String dayExceeding; |
| | | private Double dayExceeding; |
| | | |
| | | private String type; |
| | | |
| | |
| | | /** |
| | | * @return day_avg |
| | | */ |
| | | public String getDayAvg() { |
| | | public Double getDayAvg() { |
| | | return dayAvg; |
| | | } |
| | | |
| | | /** |
| | | * @param dayAvg |
| | | */ |
| | | public void setDayAvg(String dayAvg) { |
| | | this.dayAvg = dayAvg == null ? null : dayAvg.trim(); |
| | | public void setDayAvg(Double dayAvg) { |
| | | this.dayAvg = dayAvg; |
| | | } |
| | | |
| | | /** |
| | | * @return min |
| | | */ |
| | | public String getMin() { |
| | | public Double getMin() { |
| | | return min; |
| | | } |
| | | |
| | | /** |
| | | * @param min |
| | | */ |
| | | public void setMin(String min) { |
| | | this.min = min == null ? null : min.trim(); |
| | | public void setMin(Double min) { |
| | | this.min = min; |
| | | } |
| | | |
| | | /** |
| | | * @return max |
| | | */ |
| | | public String getMax() { |
| | | public Double getMax() { |
| | | return max; |
| | | } |
| | | |
| | | /** |
| | | * @param max |
| | | */ |
| | | public void setMax(String max) { |
| | | this.max = max == null ? null : max.trim(); |
| | | public void setMax(Double max) { |
| | | this.max = max; |
| | | } |
| | | |
| | | /** |
| | | * @return day_online |
| | | */ |
| | | public String getDayOnline() { |
| | | public Double getDayOnline() { |
| | | return dayOnline; |
| | | } |
| | | |
| | | /** |
| | | * @param dayOnline |
| | | */ |
| | | public void setDayOnline(String dayOnline) { |
| | | this.dayOnline = dayOnline == null ? null : dayOnline.trim(); |
| | | public void setDayOnline(Double dayOnline) { |
| | | this.dayOnline = dayOnline; |
| | | } |
| | | |
| | | /** |
| | | * @return day_valid |
| | | */ |
| | | public String getDayValid() { |
| | | public Double getDayValid() { |
| | | return dayValid; |
| | | } |
| | | |
| | | /** |
| | | * @param dayValid |
| | | */ |
| | | public void setDayValid(String dayValid) { |
| | | this.dayValid = dayValid == null ? null : dayValid.trim(); |
| | | public void setDayValid(Double dayValid) { |
| | | this.dayValid = dayValid; |
| | | } |
| | | |
| | | /** |
| | | * @return day_exceeding |
| | | */ |
| | | public String getDayExceeding() { |
| | | public Double getDayExceeding() { |
| | | return dayExceeding; |
| | | } |
| | | |
| | | /** |
| | | * @param dayExceeding |
| | | */ |
| | | public void setDayExceeding(String dayExceeding) { |
| | | this.dayExceeding = dayExceeding == null ? null : dayExceeding.trim(); |
| | | public void setDayExceeding(Double dayExceeding) { |
| | | this.dayExceeding = dayExceeding; |
| | | } |
| | | |
| | | /** |
| | |
| | | ) : BaseDustTimingTask(requestTaskRep) { |
| | | |
| | | override fun doTask(localtime: LocalDateTime) { |
| | | if (taskDelay || (localtime.dayOfMonth == 1 && localtime.hour == 11 && localtime.minute == 0)) { |
| | | if (taskDelay || (localtime.hour == 11 && localtime.minute == 0)) { |
| | | taskDelay = isTaskDelay(localtime) |
| | | if (!taskDelay) { |
| | | log.info("月风险分析执行") |
| | |
| | | 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; |
| | |
| | | |
| | | 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 |
| | |
| | | <!-- enableCountByExample="false"--> |
| | | <!-- enableUpdateByExample="false" enableDeleteByExample="false"--> |
| | | <!-- enableSelectByExample="false" selectByExampleQueryId="false"/>--> |
| | | <!-- <table tableName="dust_statistics_value" domainObjectName="DustStatisticsValue"--> |
| | | <!-- enableCountByExample="false"--> |
| | | <!-- enableUpdateByExample="false" enableDeleteByExample="false"--> |
| | | <!-- enableSelectByExample="false" selectByExampleQueryId="false"/>--> |
| | | <table tableName="dust_statistics_value" domainObjectName="DustStatisticsValue" |
| | | enableCountByExample="false" |
| | | enableUpdateByExample="false" enableDeleteByExample="false" |
| | | enableSelectByExample="false" selectByExampleQueryId="false"/> |
| | | <!-- <table tableName="ja_t_dust_site_data_info" domainObjectName="DustSiteData"--> |
| | | <!-- enableCountByExample="false"--> |
| | | <!-- enableUpdateByExample="false" enableDeleteByExample="false"--> |
| | |
| | | <!-- enableCountByExample="false"--> |
| | | <!-- enableUpdateByExample="false" enableDeleteByExample="false"--> |
| | | <!-- enableSelectByExample="false" selectByExampleQueryId="false"/>--> |
| | | <table tableName="du_js_t_risk_value" domainObjectName="RiskValue" |
| | | enableCountByExample="false" |
| | | enableUpdateByExample="false" enableDeleteByExample="false" |
| | | enableSelectByExample="false" selectByExampleQueryId="false"/> |
| | | <!-- <table tableName="du_js_t_risk_value" domainObjectName="RiskValue"--> |
| | | <!-- enableCountByExample="false"--> |
| | | <!-- enableUpdateByExample="false" enableDeleteByExample="false"--> |
| | | <!-- enableSelectByExample="false" selectByExampleQueryId="false"/>--> |
| | | </context> |
| | | </generatorConfiguration> |
| | |
| | | <?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="DOUBLE" property="dayAvg" /> |
| | | <result column="min" jdbcType="DOUBLE" property="min" /> |
| | | <result column="max" jdbcType="DOUBLE" property="max" /> |
| | | <result column="day_online" jdbcType="DOUBLE" property="dayOnline" /> |
| | | <result column="day_valid" jdbcType="DOUBLE" property="dayValid" /> |
| | | <result column="day_exceeding" jdbcType="DOUBLE" 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) |
| | |
| | | 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, |
| | | 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} |
| | |
| | | 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, |
| | | 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} |
| | |
| | | @Test |
| | | fun run() { |
| | | exceptionAnalysisController.init() |
| | | var d1 = LocalDate.of(2023, 7, 1) |
| | | val d2 = LocalDate.of(2023, 11, 21) |
| | | var d1 = LocalDate.of(2023, 11, 27) |
| | | val d2 = LocalDate.of(2023, 11, 27) |
| | | while (d1.isEqual(d2) || d1.isBefore(d2)) { |
| | | exceptionAnalysisController.run(d1) |
| | | d1 = d1.plusDays(1) |
| | |
| | | package com.flightfeather.monitor.analysis.dust |
| | | |
| | | import com.flightfeather.monitor.utils.DateUtil |
| | | import org.junit.Test |
| | | import org.junit.jupiter.api.extension.ExtendWith |
| | | import org.junit.runner.RunWith |
| | |
| | | import org.springframework.boot.test.context.SpringBootTest |
| | | import org.springframework.test.context.junit.jupiter.SpringExtension |
| | | import org.springframework.test.context.junit4.SpringRunner |
| | | import java.time.LocalDate |
| | | |
| | | @RunWith(SpringRunner::class) |
| | | @ExtendWith(SpringExtension::class) |
| | |
| | | @Test |
| | | fun autoRunDaily() { |
| | | riskAnalysisController.init() |
| | | // val s = LocalDate.of(2023, 10, 1) |
| | | // val e = LocalDate.of(2023, 10, 31) |
| | | // val du = DateUtil.findDurationDate(s, e) |
| | | // du.forEach { |
| | | // riskAnalysisController.runDaily(it) |
| | | // } |
| | | riskAnalysisController.autoRunDaily() |
| | | val s = LocalDate.of(2023, 10, 1) |
| | | val e = LocalDate.of(2023, 10, 31) |
| | | val du = DateUtil.findDurationDate(s, e) |
| | | du.forEach { |
| | | riskAnalysisController.runDaily(it) |
| | | } |
| | | // riskAnalysisController.autoRunDaily() |
| | | } |
| | | |
| | | @Test |
| | | fun autoRunMonthly() { |
| | | riskAnalysisController.init() |
| | | riskAnalysisController.autoRunMonthly() |
| | | val s = LocalDate.of(2023, 10, 1) |
| | | riskAnalysisController.runMonthly(s) |
| | | // riskAnalysisController.autoRunMonthly() |
| | | } |
| | | } |
| | |
| | | |
| | | @Test |
| | | fun dailyStatics() { |
| | | val d = LocalDate.of(2023, 7, 2) |
| | | val d = LocalDate.of(2023, 11, 27) |
| | | statisticAnalysisController.dailyStatics(d) |
| | | } |
| | | |
| | | @Test |
| | | fun monthlyStatics() { |
| | | val d = LocalDate.of(2023, 7, 1) |
| | | val d = LocalDate.of(2023, 11, 1) |
| | | statisticAnalysisController.monthlyStatics(d) |
| | | } |
| | | |