ソースを参照

1) 预警事件新增预警来源(专用/通用)
2) 分区未构建完成的预警方案不予分析
3) 预警方案调整分析时段

andyliu 1 ヶ月 前
コミット
46428f112f

+ 21 - 14
src/main/java/com/shkpr/service/warncore/bizhandler/SiteDataWarnHandler.java

@@ -69,8 +69,11 @@ public class SiteDataWarnHandler {
         boolean doForTodayBefore = false;//是否只分析今日之前的数据(针对小时/日分析有用)
         final long curUTCTm = TimeTool.getCurMsUTC();
         int curClock = (int)((curUTCTm/1000/60/60%24+8)%24);
-        long queryBeginUTC = 0L, queryEndUTC = 0L, conditionMinUTC = 0L;
+        long queryBeginUTC = 0L, queryEndUTC = 0L;
         final String curDate = TimeTool.convertUTC2DateStr(curUTCTm, TimeTool.YEAR_MONTH_DAY_FORMAT);
+        long conditionMinUTC = TimeTool.convertDateStr2UTC(String.format("%s %2d:00:00"
+                , curDate
+                , rules.get(0).getStarts()));//触发规则列表中第一个时段的起始时刻
         if (FrequencyUnit.MIN.equals(planDetail.getFrequencyUnit())){//以分钟为单位进行分析
         }else{//以小时或其他单位进行分析
             curClock = curClock - 1;
@@ -89,8 +92,6 @@ public class SiteDataWarnHandler {
 
             int findStartClock = -1;
             for (int i=rules.size()-1;i>=0;i--){
-                if (i == 0)
-                    conditionMinUTC = TimeTool.convertDateStr2UTC(String.format("%s %2d:00:00", curDate, rules.get(i).getStarts()));
                 if (curClock >= rules.get(i).getStarts() && curClock <= rules.get(i).getEnds()){
                     findStartClock = rules.get(i).getStarts();
                     if (FrequencyUnit.MIN.equals(planDetail.getFrequencyUnit())){//以分钟为单位进行分析
@@ -109,19 +110,25 @@ public class SiteDataWarnHandler {
                 break;
             }
 
-            if (doForTodayBefore){//只分析昨日23:00:00-23:59:59的数据
-                queryBeginUTC = TimeTool.getTodayBeginUTC()-TimeTool.MS_ONE_HOUR;
+            //寻找和当前时刻连续时段的起始点
+            findStartClock = findStartClock-1;
+            for (int i=rules.size()-1;i>=0;i--){
+                if (findStartClock < 0)
+                    break;
+                if (findStartClock == rules.get(i).getEnds())
+                    findStartClock = rules.get(i).getStarts()-1;
+            }
+            queryBeginUTC = TimeTool.convertDateStr2UTC(String.format("%s %2d:00:00", curDate, findStartClock+1));
+
+            if (doForTodayBefore){//只分析昨日
+                queryBeginUTC = queryBeginUTC - TimeTool.MS_ONE_DAY;
                 queryEndUTC = TimeTool.getTodayBeginUTC()-TimeTool.MS_ONE_SEC;
                 conditionMinUTC = Math.min(conditionMinUTC-TimeTool.MS_ONE_DAY, queryBeginUTC);//针对昨日:触发规则列表中第一个时段的起始时刻
-            }else {
-                findStartClock = findStartClock-1;
-                for (int i=rules.size()-1;i>=0;i--){
-                    if (findStartClock < 0)
-                        break;
-                    if (findStartClock == rules.get(i).getEnds())
-                        findStartClock = rules.get(i).getStarts()-1;
-                }
-                queryBeginUTC = TimeTool.convertDateStr2UTC(String.format("%s %2d:00:00", curDate, findStartClock+1));
+
+                /*queryBeginUTC = TimeTool.getTodayBeginUTC()-TimeTool.MS_ONE_HOUR;
+                queryEndUTC = TimeTool.getTodayBeginUTC()-TimeTool.MS_ONE_SEC;
+                conditionMinUTC = Math.min(conditionMinUTC-TimeTool.MS_ONE_DAY, queryBeginUTC);//针对昨日:触发规则列表中第一个时段的起始时刻
+                */
             }
 
             if (thisStepTempRes.getLastCompareSampleTime() <= 0L //从未分析过则重新计数

+ 4 - 1
src/main/java/com/shkpr/service/warncore/bizhandler/TimerCheckWarnPlanMgr.java

@@ -50,6 +50,7 @@ public class TimerCheckWarnPlanMgr {
         Map<String, Object> mapSel = getThisDBService().totalWillAnalysisCounts(new HashMap<String, Object>(){{
                     put(OrdWarnPlanInfoTable.R_INFO.STATUS, CommFieldStatus.ENABLE);
                     put(OrdWarnPlanInfoTable.R_INFO.DISUSED, 0);
+                    put(OrdWarnPlanInfoTable.R_INFO.OWNER_STATUS, 1);
                     put(OrdWarnPlanInfoTable.R_INFO.FREQUENCY_UNIT, frequencyUnit);
                 }}
                 , null
@@ -157,7 +158,9 @@ public class TimerCheckWarnPlanMgr {
             }
 
             planDetail = FastJsonUtil.map2Obj(infoDb, OrdWarnPlanDetail.class,true);
-            if (planDetail == null || planDetail.getStatus() != CommFieldStatus.ENABLE){
+            if (planDetail == null
+                    || planDetail.getStatus() != CommFieldStatus.ENABLE
+                    || planDetail.getOwnerStatus() != CommFieldStatus.ENABLE){
                 code = ResponseCode.RESULT_BAD;
                 step = "Warn plan info invalid";
                 break;

+ 60 - 20
src/main/java/com/shkpr/service/warncore/bizhandler/ZoneDataWarnHandler.java

@@ -71,8 +71,11 @@ public class ZoneDataWarnHandler {
         boolean doForTodayBefore = false;//是否只分析今日之前的数据
         final long curUTCTm = TimeTool.getCurMsUTC();
         int curClock = (int)((curUTCTm/1000/60/60%24+8)%24);
-        long queryBeginUTC = 0L, queryEndUTC = 0L, conditionMinUTC = 0L;
+        long queryBeginUTC = 0L, queryEndUTC = 0L;
         final String curDate = TimeTool.convertUTC2DateStr(curUTCTm, TimeTool.YEAR_MONTH_DAY_FORMAT);
+        long conditionMinUTC = TimeTool.convertDateStr2UTC(String.format("%s %2d:00:00"
+                , curDate
+                , rules.get(0).getStarts()));//触发规则列表中第一个时段的起始时刻
         curClock = curClock - 1;
         if (curClock < 0){
             curClock = 23;
@@ -88,8 +91,6 @@ public class ZoneDataWarnHandler {
 
             int findStartClock = -1;
             for (int i=rules.size()-1;i>=0;i--){
-                if (i == 0)
-                    conditionMinUTC = TimeTool.convertDateStr2UTC(String.format("%s %2d:00:00", curDate, rules.get(i).getStarts()));
                 if (curClock >= rules.get(i).getStarts() && curClock <= rules.get(i).getEnds()){
                     findStartClock = rules.get(i).getStarts();
                     queryEndUTC = Math.min(TimeTool.convertDateStr2UTC(String.format("%s %2d:59:59", curDate, curClock))
@@ -102,19 +103,26 @@ public class ZoneDataWarnHandler {
                 code = ResponseCode.RESULT_BAD;
                 break;
             }
-            if (doForTodayBefore){//只分析昨日23:00:00-23:59:59的数据
-                queryBeginUTC = TimeTool.getTodayBeginUTC()-TimeTool.MS_ONE_HOUR;
+
+            //寻找和当前时刻连续时段的起始点
+            findStartClock = findStartClock-1;
+            for (int i=rules.size()-1;i>=0;i--){
+                if (findStartClock < 0)
+                    break;
+                if (findStartClock == rules.get(i).getEnds())
+                    findStartClock = rules.get(i).getStarts()-1;
+            }
+            queryBeginUTC = TimeTool.convertDateStr2UTC(String.format("%s %2d:00:00", curDate, findStartClock+1));
+
+            if (doForTodayBefore){//只分析昨日
+                queryBeginUTC = queryBeginUTC - TimeTool.MS_ONE_DAY;
                 queryEndUTC = TimeTool.getTodayBeginUTC()-TimeTool.MS_ONE_SEC;
                 conditionMinUTC = Math.min(conditionMinUTC-TimeTool.MS_ONE_DAY, queryBeginUTC);//针对昨日:触发规则列表中第一个时段的起始时刻
-            }else {
-                findStartClock = findStartClock-1;
-                for (int i=rules.size()-1;i>=0;i--){
-                    if (findStartClock < 0)
-                        break;
-                    if (findStartClock == rules.get(i).getEnds())
-                        findStartClock = rules.get(i).getStarts()-1;
-                }
-                queryBeginUTC = TimeTool.convertDateStr2UTC(String.format("%s %2d:00:00", curDate, findStartClock+1));
+
+                /*queryBeginUTC = TimeTool.getTodayBeginUTC()-TimeTool.MS_ONE_HOUR;
+                queryEndUTC = TimeTool.getTodayBeginUTC()-TimeTool.MS_ONE_SEC;
+                conditionMinUTC = Math.min(conditionMinUTC-TimeTool.MS_ONE_DAY, queryBeginUTC);//针对昨日:触发规则列表中第一个时段的起始时刻
+                */
             }
 
             if (thisStepTempRes.getLastCompareSampleTime() <= 0L //从未分析过则重新计数
@@ -332,6 +340,8 @@ public class ZoneDataWarnHandler {
                 code = ResponseCode.RESULT_BAD;
                 break;
             }
+
+            //寻找和当前时刻连续时段的起始月
             findStartRange = findStartRange-1;
             for (int i=rules.size()-1;i>=0;i--){
                 if (findStartRange <= 0)
@@ -342,7 +352,7 @@ public class ZoneDataWarnHandler {
 
             queryBeginUTC = TimeTool.convertDateStr2BeginUTC(String.format("%d-%2d-01 00:00:00", preDayInYear, findStartRange+1));
             conditionMinUTC = queryBeginUTC;
-            long before3DayUTC = queryEndUTC-TimeTool.MS_ONE_DAY*3;//最多只往前分析3
+            long before3DayUTC = queryEndUTC-TimeTool.MS_ONE_DAY*7;//最多只往前分析7
             if (before3DayUTC > queryBeginUTC)
                 queryBeginUTC = before3DayUTC;
 
@@ -427,13 +437,19 @@ public class ZoneDataWarnHandler {
         boolean clearPlanHisTriggerSam = false;//是否需要清空预案的历史触发样本数据
 
         do {
-            String[] storeTagAndBackTag = rules.get(0).getConditions().get(0).getFormat().split("@");
+            final String doField = rules.get(0).getConditions().get(0).getFormat();
+            String[] storeTagAndBackTag = doField.split("@");
             if (storeTagAndBackTag == null || storeTagAndBackTag.length < 2){
                 step = String.format("Format param invalid in rules");
                 code = ResponseCode.RESULT_BAD;
                 break;
             }
-            //数据库获取数据
+            TRecordRes<DateKeyValue> sampleRes = getSampleDataFromDB(planDetail.getItemKey()
+                        , zoneId, thisTempStep.getQueryBeginUTC(), thisTempStep.getQueryEndUTC()
+                        , planDetail.getDoDb(), doField, planDetail.getDoTime());
+            if (sampleRes != null && sampleRes.getCode() == ResponseCode.RESULT_NORMAL.toInt()){
+                zoneStatsData = sampleRes.getData();
+            }
 
             if (zoneStatsData == null){
                 step = String.format("Get zone stats data failed");
@@ -453,9 +469,12 @@ public class ZoneDataWarnHandler {
 
                 boolean matched = false;
                 OrdWarnPlanRules findRule = null;
-                int sampleTmInMonth = TimeTool.getMonthIndex(sampleRecordTm);
+                int sampleRecordTmUnit = TimeTool.getMonthIndex(sampleRecordTm);
+                if (FrequencyUnit.HOUR.equals(planDetail.getFrequencyUnit())){
+                    sampleRecordTmUnit = (int)((sampleRecordTm/1000/60/60%24+8)%24);
+                }
                 for (OrdWarnPlanRules ruleItem:rules){
-                    if (sampleTmInMonth <= ruleItem.getEnds() && sampleTmInMonth >= ruleItem.getStarts()){
+                    if (sampleRecordTmUnit <= ruleItem.getEnds() && sampleRecordTmUnit >= ruleItem.getStarts()){
                         findRule = ruleItem;
                         break;
                     }
@@ -475,7 +494,7 @@ public class ZoneDataWarnHandler {
                         code = ResponseCode.RESULT_BAD;
                         break;
                     }else {
-                        matched = matched || (pkRes==1?true:false);
+                        matched = matched || (pkRes==COMPARE_TURE?true:false);
                     }
                 }
                 if (code != ResponseCode.RESULT_NORMAL)
@@ -768,4 +787,25 @@ public class ZoneDataWarnHandler {
                         planDetail.getUid(), zoneId, step, clearPlanHisTriggerSam, eventIdAcceptPlanHisTriggerSam, code.toString()));
         return code;
     }
+
+    private static TRecordRes<DateKeyValue> getSampleDataFromDB(String itemKey, String objId, long beginTm, long endTm, String doDb, String doField, String doTime){
+        String[] storeDbAndTable = doDb.split("@");
+        String[] storeFieldAndBackField = doField.split("@");
+
+        /**小时水量,存储的是累计流量:(n+1)点-(n)点=(n)点水量,故分区水量要将endTm += TimeTool.MS_ONE_HOUR;然后再查询
+         * SELECT
+         * 			ts,
+         * 			zone_id,
+         * 			final_value
+         * 		FROM v_metric_l2op_final
+         * 		WHERE zone_id = ANY($1)
+         * 		  AND metric_id = 'supply_volume'
+         * 		  AND ts >= $2
+         * 		  AND ts <= $3
+         * 		  AND EXTRACT(MINUTE FROM ts) = 0
+         * 		  AND EXTRACT(SECOND FROM ts) = 0
+         * 		ORDER BY zone_id, ts
+         */
+        return null;
+    }
 }

+ 1 - 0
src/main/java/com/shkpr/service/warncore/dbdao/tables/OrdWarnPlanInfoTable.java

@@ -15,6 +15,7 @@ public interface OrdWarnPlanInfoTable {
         String FREQUENCY_UNIT = "frequency_unit";
         String DISUSED = "disused";
         String TOTAL_ANALYSIS_ORDER = "create_time ASC,frequency ASC,id ASC";
+        String OWNER_STATUS = "owner_status";
     }
 
     interface W_INFO{

+ 1 - 0
src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanDetail.java

@@ -16,6 +16,7 @@ public class OrdWarnPlanDetail {
     private String ownerSubType = "";
     private String owner = "";
     private String ownerGis = "";
+    private int ownerStatus = 1;
     private int level = 0;
     private int threshold = 0;//连续x次触发就报警(单位:次数)
     private int frequency = 0;//分析频率

+ 1 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPOrdWarnEventInfo.java

@@ -45,6 +45,7 @@ public class JPOrdWarnEventInfo {
     private long updateTime = 0L;
     private int sendway = 3;
     private String planBatch = "";
+    private String planSrc = "private";//private--专用;public--通用
     private String remark = "";
     private String objId = "";