Переглянути джерело

修正部分潜在问题逻辑

andyliu 2 тижнів тому
батько
коміт
8087d2b112

+ 45 - 39
src/main/java/com/shkpr/service/warncore/bizhandler/SiteDataWarnHandler.java

@@ -5,6 +5,7 @@ import com.global.base.tools.FastJsonUtil;
 import com.shkpr.service.warncore.commtools.CommTool;
 import com.shkpr.service.warncore.commtools.TimeTool;
 import com.shkpr.service.warncore.constants.CommFieldStatus;
+import com.shkpr.service.warncore.constants.EventAction;
 import com.shkpr.service.warncore.constants.FrequencyUnit;
 import com.shkpr.service.warncore.dbdao.DBMgrProxy;
 import com.shkpr.service.warncore.dbdao.services.intef.OrdWarnPlanInfoDBService;
@@ -23,6 +24,8 @@ import java.util.*;
  * 站点数据处理
  */
 public class SiteDataWarnHandler {
+    private static int COMPARE_TURE = 1;
+    private static int COMPARE_FALSE = 0;
     private static OrdWarnPlanInfoDBService getWarnPlanInfoDBService(){
         return DBMgrProxy.getInstance().applyXXXApi(OrdWarnPlanInfoDBService.class);
     }
@@ -43,7 +46,7 @@ public class SiteDataWarnHandler {
             code = ResponseCode.RESULT_BAD;
         }
 
-        boolean doForTodayBefore = false;//是否只分析今日之前的数据
+        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;
@@ -75,6 +78,7 @@ public class SiteDataWarnHandler {
                         queryEndUTC = Math.min(TimeTool.convertDateStr2UTC(String.format("%s %2d:59:59", curDate, curClock))
                                 , TimeTool.convertDateStr2UTC(String.format("%s %2d:59:59", curDate, rules.get(i).getEnd())));
                     }
+                    break;
                 }
             }
             if (findStartClock < 0){
@@ -130,26 +134,28 @@ public class SiteDataWarnHandler {
 
             if (!StringUtils.isEmpty(planDetail.getLastEventId())){
                 //向数据库中快速查询事件最近处理阶段action的值
-                //并赋值给thisTempStep
+                //并赋值给thisStepTempRes
             }
-
+        }while (false);
+        if (code == ResponseCode.RESULT_NORMAL){
             if (planDetail.getItemKey().endsWith("empty")){//无数据
-                return analysisDataForReportByHour(planDetail, rules, thisStepTempRes);
+                code = analysisDataForReportByHour(planDetail, rules, thisStepTempRes);
             }else if (planDetail.getItemKey().endsWith("swo")){//小时水量
-                return analysisDataForReportByHour(planDetail, rules, thisStepTempRes);
+                code = analysisDataForReportByHour(planDetail, rules, thisStepTempRes);
             }else {
                 if ("set".equals(planDetail.getDoPickWay())){//时段曲线
-                    return analysisDataForRealBySet(planDetail, rules, thisStepTempRes);
+                    code = analysisDataForRealBySet(planDetail, rules, thisStepTempRes);
                 }
             }
-        }while (false);
+        }else {//单独更新预警方案的分析时间、次数、说明
+        }
         return code;
     }
 
     //处理站点的实时样本曲线
     private static ResponseCode analysisDataForRealBySet(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules, OrdWarnPlanTempStep thisTempStep){
-        ResponseCode code = ResponseCode.RESULT_NORMAL;
         String step = "Start to deep analysis";
+        ResponseCode code = ResponseCode.RESULT_NORMAL;
         long curTime = TimeTool.getCurMsUTC();
         final String siteId = rules.get(0).getObjId();
         SiteSampleDataResult siteSampleData = null;
@@ -182,7 +188,7 @@ public class SiteDataWarnHandler {
             Collections.sort(siteSampleData.getData().get(0).getRecords(), new Comparator<SiteSampleGroupItem>() {
                 @Override
                 public int compare(SiteSampleGroupItem o1, SiteSampleGroupItem o2) {
-                    return Long.compare(o1.getTime(),o2.getTime());//按时间升序排列
+                    return Long.compare(o1.getTime(), o2.getTime());
                 }
             });
 
@@ -223,7 +229,7 @@ public class SiteDataWarnHandler {
                         code = ResponseCode.RESULT_BAD;
                         break;
                     }else {
-                        matched = matched || (pkRes==1?true:false);
+                        matched = matched || (pkRes==COMPARE_TURE?true:false);
                     }
                 }
                 if (code != ResponseCode.RESULT_NORMAL)
@@ -231,16 +237,16 @@ public class SiteDataWarnHandler {
 
                 if (!matched){//本次没有匹配成功
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                    thisTempStep.setLastCompareSampleResult(0);
+                    thisTempStep.setLastCompareSampleResult(COMPARE_FALSE);
                     thisTempStep.setFirstMatchSampleTime(0L);
                     thisTempStep.setLastEventId("");
                     thisTempStep.setLastEventTime(0L);
                     continue;
                 }//本次匹配成功进入下一步
 
-                if (thisTempStep.getLastCompareSampleResult() <= 0){//上一次没有匹配成功
+                if (thisTempStep.getLastCompareSampleResult() <= COMPARE_FALSE){//上一次没有匹配成功
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                    thisTempStep.setLastCompareSampleResult(1);
+                    thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                     thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                     continue;
                 }//上一次匹配成功了进入下一步
@@ -249,7 +255,7 @@ public class SiteDataWarnHandler {
                 long diffMatch = sampleRecordTm-thisTempStep.getLastCompareSampleTime();//两个最近匹配样本之间的采集时间差(单位:毫秒)
                 if (diffMatch > triggerEventPeriodSwitch){//两个最近匹配样本间缺失的数据太多、或跨了天、或跨了时段,可认为重新计数
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                    thisTempStep.setLastCompareSampleResult(1);
+                    thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                     thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                     thisTempStep.setLastEventId("");
                     thisTempStep.setLastEventTime(0L);
@@ -258,7 +264,7 @@ public class SiteDataWarnHandler {
 
                 if (thisTempStep.getLastCompareSampleTime() < thisTempStep.getConditionMinUTC()){//上一个匹配样本是非当前天的,可认为重新计数
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                    thisTempStep.setLastCompareSampleResult(1);
+                    thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                     thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                     thisTempStep.setLastEventId("");
                     thisTempStep.setLastEventTime(0L);
@@ -269,28 +275,28 @@ public class SiteDataWarnHandler {
                 if (StringUtils.isEmpty(thisTempStep.getLastEventId())){//之前无预警事件
                     if (matchLen < triggerEventPeriodSwitch){//还得持续等待,达不到触发事件的累计时长
                         thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                         if (thisTempStep.getFirstMatchSampleTime() <= 0)
                             thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                     }else {//触发一个新的事件
                         thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                         thisTempStep.setLastEventId("新事件ID");
                         thisTempStep.setLastEventTime(curTime);
-                        thisTempStep.setLastEventAction(1);
+                        thisTempStep.setLastEventAction(EventAction.DOING);
                         thisTempStep.setDayTriggerTimes(thisTempStep.getDayTriggerTimes()+1);
                         //[!!!]do not change the FirstMatchSampleTime[!!!]
                     }
                 }else {//之前有预警事件
-                    if (planDetail.getMergeToEvent() == 0 || thisTempStep.getLastEventAction() >= 2){//之前的预警事件已处理,则可认为进行重新计数
+                    if (planDetail.getMergeToEvent() == 0 || thisTempStep.getLastEventAction() >= EventAction.DONE){//之前的预警事件已处理,则可认为进行重新计数
                         thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                         thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                         thisTempStep.setLastEventId("");
                         thisTempStep.setLastEventTime(0L);
                     }else {//之前的预警事件未处理,则更新预警事件的样本截止时刻
                         thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                         eventId2NewEndUTC.put(thisTempStep.getLastEventId(), sampleRecordTm);
                     }
                 }
@@ -301,8 +307,8 @@ public class SiteDataWarnHandler {
 
     //处理站点时段的小时统计数据
     private static ResponseCode analysisDataForReportByHour(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules, OrdWarnPlanTempStep thisTempStep){
-        ResponseCode code = ResponseCode.RESULT_NORMAL;
         String step = "Start to deep analysis";
+        ResponseCode code = ResponseCode.RESULT_NORMAL;
         long curTime = TimeTool.getCurMsUTC();
         final String siteId = rules.get(0).getObjId();
         SiteStatsDataResult siteStatsData = null;
@@ -317,7 +323,7 @@ public class SiteDataWarnHandler {
         do {
             String[] storeTagAndBackTag = rules.get(0).getConditions().get(0).getFormat().split("@");
             if (storeTagAndBackTag == null || storeTagAndBackTag.length < 2){
-                step = String.format("Format param valid in rules");
+                step = String.format("Format param invalid in rules");
                 code = ResponseCode.RESULT_BAD;
                 break;
             }
@@ -396,7 +402,7 @@ public class SiteDataWarnHandler {
                         code = ResponseCode.RESULT_BAD;
                         break;
                     }else {
-                        matched = matched || (pkRes==1?true:false);
+                        matched = matched || (pkRes==COMPARE_TURE?true:false);
                     }
                 }
                 if (code != ResponseCode.RESULT_NORMAL)
@@ -404,7 +410,7 @@ public class SiteDataWarnHandler {
 
                 if (!matched){//本次没有匹配成功
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                    thisTempStep.setLastCompareSampleResult(0);
+                    thisTempStep.setLastCompareSampleResult(COMPARE_FALSE);
                     thisTempStep.setFirstMatchSampleTime(0L);
                     thisTempStep.setLastEventId("");
                     thisTempStep.setLastEventTime(0L);
@@ -412,14 +418,14 @@ public class SiteDataWarnHandler {
                 }//本次匹配成功进入下一步
 
                 long triggerEventPeriodSwitch = planDetail.getFrequency()*planDetail.getThreshold();//触发预警事件的最小时长(单位:小时)
-                if (thisTempStep.getLastCompareSampleResult() <= 0){//上一次没有匹配成功
+                if (thisTempStep.getLastCompareSampleResult() <= COMPARE_FALSE){//上一次没有匹配成功
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                    thisTempStep.setLastCompareSampleResult(1);
+                    thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                     thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                     if (triggerEventPeriodSwitch <= 1){//触发事件
                         thisTempStep.setLastEventId("新事件ID");
                         thisTempStep.setLastEventTime(curTime);
-                        thisTempStep.setLastEventAction(1);
+                        thisTempStep.setLastEventAction(EventAction.DOING);
                         thisTempStep.setDayTriggerTimes(thisTempStep.getDayTriggerTimes()+1);
                     }
                     continue;
@@ -428,12 +434,12 @@ public class SiteDataWarnHandler {
                 long diffMatch = (sampleRecordTm-thisTempStep.getLastCompareSampleTime())/TimeTool.MS_ONE_HOUR;//两个最近匹配样本之间的采集时间差(单位:小时)
                 if (diffMatch > triggerEventPeriodSwitch){//两个最近匹配样本间缺失的数据太多、或跨了天、或跨了时段,可认为重新计数
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                    thisTempStep.setLastCompareSampleResult(1);
+                    thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                     thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                     if (triggerEventPeriodSwitch <= 1){//触发事件
                         thisTempStep.setLastEventId("新事件ID");
                         thisTempStep.setLastEventTime(curTime);
-                        thisTempStep.setLastEventAction(1);
+                        thisTempStep.setLastEventAction(EventAction.DOING);
                         thisTempStep.setDayTriggerTimes(thisTempStep.getDayTriggerTimes()+1);
                     }else {
                         thisTempStep.setLastEventId("");
@@ -444,12 +450,12 @@ public class SiteDataWarnHandler {
 
                 if (thisTempStep.getLastCompareSampleTime() < thisTempStep.getConditionMinUTC()){//上一个匹配样本是非当前天的,可认为重新计数
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                    thisTempStep.setLastCompareSampleResult(1);
+                    thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                     thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                     if (triggerEventPeriodSwitch <= 1){//触发事件
                         thisTempStep.setLastEventId("新事件ID");
                         thisTempStep.setLastEventTime(curTime);
-                        thisTempStep.setLastEventAction(1);
+                        thisTempStep.setLastEventAction(EventAction.DOING);
                         thisTempStep.setDayTriggerTimes(thisTempStep.getDayTriggerTimes()+1);
                     }else {
                         thisTempStep.setLastEventId("");
@@ -462,34 +468,34 @@ public class SiteDataWarnHandler {
                 if (StringUtils.isEmpty(thisTempStep.getLastEventId())){//之前无预警事件
                     if (matchLen < triggerEventPeriodSwitch){//还得持续等待,达不到触发事件的累计时长
                         thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                         if (thisTempStep.getFirstMatchSampleTime() <= 0){
                             thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                             if (triggerEventPeriodSwitch <= 1){//补充触发事件
                                 thisTempStep.setLastEventId("新事件ID");
                                 thisTempStep.setLastEventTime(curTime);
-                                thisTempStep.setLastEventAction(1);
+                                thisTempStep.setLastEventAction(EventAction.DOING);
                                 thisTempStep.setDayTriggerTimes(thisTempStep.getDayTriggerTimes()+1);
                             }
                         }
                     }else {//触发一个新的事件
                         thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                         thisTempStep.setLastEventId("新事件ID");
                         thisTempStep.setLastEventTime(curTime);
-                        thisTempStep.setLastEventAction(1);
+                        thisTempStep.setLastEventAction(EventAction.DOING);
                         thisTempStep.setDayTriggerTimes(thisTempStep.getDayTriggerTimes()+1);
                         //[!!!]do not change the FirstMatchSampleTime[!!!]
                     }
                 }else {//之前有预警事件
                     if (planDetail.getMergeToEvent() == 0 || thisTempStep.getLastEventAction() >= 2){//之前的预警事件已处理,则可认为进行重新计数
                         thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                         thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
                         if (triggerEventPeriodSwitch <= 1){//触发事件
                             thisTempStep.setLastEventId("新事件ID");
                             thisTempStep.setLastEventTime(curTime);
-                            thisTempStep.setLastEventAction(1);
+                            thisTempStep.setLastEventAction(EventAction.DOING);
                             thisTempStep.setDayTriggerTimes(thisTempStep.getDayTriggerTimes()+1);
                         }else {
                             thisTempStep.setLastEventId("");
@@ -497,7 +503,7 @@ public class SiteDataWarnHandler {
                         }
                     }else {//之前的预警事件未处理,则更新预警事件的样本截止时刻
                         thisTempStep.setLastCompareSampleTime(sampleRecordTm);
-                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
                         eventId2NewEndUTC.put(thisTempStep.getLastEventId(), sampleRecordTm);
                     }
                 }

+ 8 - 0
src/main/java/com/shkpr/service/warncore/bizhandler/ZoneDataWarnHandler.java

@@ -45,10 +45,14 @@ public class ZoneDataWarnHandler {
         long queryEndUTC = TimeTool.getMonthBeginUTC(curUTCTm);
         OrdWarnPlanTempStep thisStepTempRes = new OrdWarnPlanTempStep(planDetail);
         do {
+            if (code != ResponseCode.RESULT_NORMAL)
+                break;
+
             int findStartRange = -1;
             for (int i=rules.size()-1;i>=0;i--){
                 if (preMonth >= rules.get(i).getStart() && preMonth <= rules.get(i).getEnd()){
                     findStartRange = rules.get(i).getStart();
+                    break;
                 }
             }
             if (findStartRange < 0){
@@ -118,10 +122,14 @@ public class ZoneDataWarnHandler {
         long queryEndUTC = TimeTool.getTodayBeginUTC();
         OrdWarnPlanTempStep thisStepTempRes = new OrdWarnPlanTempStep(planDetail);
         do {
+            if (code != ResponseCode.RESULT_NORMAL)
+                break;
+
             int findStartRange = -1;
             for (int i=rules.size()-1;i>=0;i--){
                 if (preDayInMonth >= rules.get(i).getStart() && preDayInMonth <= rules.get(i).getEnd()){
                     findStartRange = rules.get(i).getStart();
+                    break;
                 }
             }
             if (findStartRange < 0){

+ 6 - 0
src/main/java/com/shkpr/service/warncore/constants/EventAction.java

@@ -0,0 +1,6 @@
+package com.shkpr.service.warncore.constants;
+
+public interface EventAction {
+    int DOING = 1;//处理中
+    int DONE = 2;//已处理
+}