|
|
@@ -44,6 +44,150 @@ public class SiteDataWarnHandler {
|
|
|
|
|
|
public static ResponseCode handlerDataFun(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules){
|
|
|
ResponseCode code = ResponseCode.RESULT_NORMAL;
|
|
|
+ switch (planDetail.getFrequencyUnit()){
|
|
|
+ case FrequencyUnit.DAY:
|
|
|
+ code = pickWarnByDay(planDetail, rules);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ code = pickWarnByOther(planDetail, rules);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return code;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static ResponseCode pickWarnByDay(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules){
|
|
|
+ ResponseCode code = ResponseCode.RESULT_NORMAL;
|
|
|
+ String step = "Start to pre analysis.";
|
|
|
+ if (getWarnPlanInfoDBService().existsLineEx(OrdWarnPlanInfoTable.R_INFO.TABLE
|
|
|
+ , new HashMap<String, Object>(){{put(OrdWarnPlanInfoTable.R_INFO.STATUS, CommFieldStatus.ENABLE);
|
|
|
+ put(OrdWarnPlanInfoTable.R_INFO.UNIQUE_ID, planDetail.getUid());
|
|
|
+ put(OrdWarnPlanInfoTable.R_INFO.VERSION, planDetail.getVersion());
|
|
|
+ }}, null, "") <= 0){
|
|
|
+ step = "Plan is changed,do analysis next time";
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean noBindDev = true;
|
|
|
+ for (OrdWarnPlanRules ruleItem:rules){
|
|
|
+ if (!StringUtils.isEmpty(ruleItem.getDevId())){
|
|
|
+ noBindDev = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (noBindDev){
|
|
|
+ step = "No binder device,do analysis next time";
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ }
|
|
|
+
|
|
|
+ final long curUTCTm = TimeTool.getCurMsUTC();
|
|
|
+ final long thisTodayBegin = TimeTool.getTodayBeginUTC();
|
|
|
+ final int preDayInYear = TimeTool.getYearIndex(curUTCTm-TimeTool.MS_ONE_DAY);//日分析时,分析前一日所在的年份
|
|
|
+ final int preDayInMonth = TimeTool.getMonthIndex(curUTCTm-TimeTool.MS_ONE_DAY);//日分析时,分析前一日所在的月份
|
|
|
+ long queryBeginUTC = 0L, conditionMinUTC = 0L;
|
|
|
+ long queryEndUTC = thisTodayBegin-TimeTool.MS_ONE_SEC;
|
|
|
+ OrdWarnPlanTempStep thisStepTempRes = new OrdWarnPlanTempStep(planDetail);
|
|
|
+ thisStepTempRes.setLastAnalyTime(curUTCTm);
|
|
|
+ thisStepTempRes.setCompareTimes(planDetail.getCompareTimes()+1);
|
|
|
+ do {
|
|
|
+ if (code != ResponseCode.RESULT_NORMAL)
|
|
|
+ break;
|
|
|
+
|
|
|
+ int findStartRange = -1;
|
|
|
+ for (int i=rules.size()-1;i>=0;i--){
|
|
|
+ if (preDayInMonth >= rules.get(i).getStarts() && preDayInMonth <= rules.get(i).getEnds()){
|
|
|
+ findStartRange = rules.get(i).getStarts();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (findStartRange < 0){
|
|
|
+ step = "Not in time range,do analysis next time";
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ //寻找和当前时刻连续时段的起始月
|
|
|
+ findStartRange = findStartRange-1;
|
|
|
+ for (int i=rules.size()-1;i>=0;i--){
|
|
|
+ if (findStartRange <= 0)
|
|
|
+ break;
|
|
|
+ if (findStartRange == rules.get(i).getEnds())
|
|
|
+ findStartRange = rules.get(i).getStarts()-1;
|
|
|
+ }
|
|
|
+
|
|
|
+ queryBeginUTC = TimeTool.convertDateStr2BeginUTC(String.format("%d-%02d-01 00:00:00", preDayInYear, findStartRange+1));
|
|
|
+ conditionMinUTC = queryBeginUTC;
|
|
|
+ long before3DayUTC = thisTodayBegin-TimeTool.MS_ONE_DAY*7;//最多只往前分析7天
|
|
|
+ if (before3DayUTC > queryBeginUTC)
|
|
|
+ queryBeginUTC = before3DayUTC;
|
|
|
+
|
|
|
+ if (thisStepTempRes.getLastCompareSampleTime() <= 0L
|
|
|
+ || thisStepTempRes.getLastCompareSampleTime() < queryBeginUTC) {//从未分析过则重新计数)
|
|
|
+ thisStepTempRes.resetData();
|
|
|
+ }else if (thisStepTempRes.getLastCompareSampleTime() >= queryBeginUTC) {
|
|
|
+ queryBeginUTC = thisStepTempRes.getLastCompareSampleTime() + TimeTool.MS_ONE_DAY;
|
|
|
+ }
|
|
|
+ if (queryBeginUTC >= queryEndUTC){
|
|
|
+ step = "Time is invalid,do analysis next time";
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ thisStepTempRes.setDoForTodayBefore(true);
|
|
|
+ thisStepTempRes.setQueryBeginUTC(queryBeginUTC);
|
|
|
+ thisStepTempRes.setQueryEndUTC(queryEndUTC);
|
|
|
+ thisStepTempRes.setConditionMinUTC(conditionMinUTC);
|
|
|
+ thisStepTempRes.setCycleTriggerTimes(planDetail.getCycleTriggerTimes());
|
|
|
+ if (thisStepTempRes.getLastEventTime() > 0L){//日分析时,比较每月的事件数上限数
|
|
|
+ int lastEventTmInMonth = TimeTool.getMonthIndex(thisStepTempRes.getLastEventTime());
|
|
|
+ if (lastEventTmInMonth == preDayInMonth){
|
|
|
+ if (planDetail.getCycleTriggerUpperTimes() > 0
|
|
|
+ && thisStepTempRes.getCycleTriggerTimes() >= planDetail.getCycleTriggerUpperTimes()){//触发事件达到最大个数
|
|
|
+ step = "Event arrive at max limit,stop analysis for today.";
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }else
|
|
|
+ thisStepTempRes.setCycleTriggerTimes(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!StringUtils.isEmpty(planDetail.getLastEventId())){
|
|
|
+ int action = CommToolHandler.checkOrdWarnEventAction(planDetail.getLastEventId());
|
|
|
+ if (action < 0){
|
|
|
+ step = "Last event check error,do analysis next time.";
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ break;
|
|
|
+ }else if (action == 0){//lastEvent事件被手动意外删除
|
|
|
+ thisStepTempRes.setLastEventId("");
|
|
|
+ thisStepTempRes.setLastEventTime(0L);
|
|
|
+ thisStepTempRes.setLastEventAction(1);
|
|
|
+ }else
|
|
|
+ thisStepTempRes.setLastEventAction(action);
|
|
|
+ }
|
|
|
+ }while (false);
|
|
|
+
|
|
|
+ if (code == ResponseCode.RESULT_NORMAL){
|
|
|
+ code = analysisDataForReportByDay(planDetail, rules, thisStepTempRes);
|
|
|
+ }else {//单独更新预警方案的分析时间、次数、说明
|
|
|
+ thisStepTempRes.setLastAnalyExplain(step);
|
|
|
+ Map<String, Object> updatePlan = thisStepTempRes.genUpdatePlan();
|
|
|
+ updatePlan.put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion()+1);
|
|
|
+ updatePlan.put(OrdWarnPlanInfoTable.W_INFO.UPDATE_TIME, System.currentTimeMillis());
|
|
|
+ if (getWarnPlanInfoDBService().updatePlanForTrigger(new HashMap<String, Object>(){{
|
|
|
+ put(OrdWarnPlanInfoTable.W_INFO.UNIQUE_ID, planDetail.getUid());
|
|
|
+ put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion());
|
|
|
+ }}, updatePlan, null, null, null, false, "") <= 0){
|
|
|
+ step = "Update warn plan trigger result to db failed.";
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBusinessType, mStrClassName
|
|
|
+ , String.format("Pick Site Data By Day:{planId=%s} {step=%s} {%s}...",
|
|
|
+ planDetail.getUid(), step, code.toString()));
|
|
|
+ return code;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static ResponseCode pickWarnByOther(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules){
|
|
|
+ ResponseCode code = ResponseCode.RESULT_NORMAL;
|
|
|
String step = "Start to pre analysis.";
|
|
|
if (getWarnPlanInfoDBService().existsLineEx(OrdWarnPlanInfoTable.R_INFO.TABLE
|
|
|
, new HashMap<String, Object>(){{put(OrdWarnPlanInfoTable.R_INFO.STATUS, CommFieldStatus.ENABLE);
|
|
|
@@ -837,4 +981,355 @@ public class SiteDataWarnHandler {
|
|
|
planDetail.getUid(), siteId, step, clearPlanHisTriggerSam, eventIdAcceptPlanHisTriggerSam, code.toString()));
|
|
|
return code;
|
|
|
}
|
|
|
+
|
|
|
+ //按日分析时,支持跨天的事件合并
|
|
|
+ private static ResponseCode analysisDataForReportByDay(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules, OrdWarnPlanTempStep thisTempStep){
|
|
|
+ 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;
|
|
|
+ Map<String, Long> oldEvent2EndUTC = new HashMap<>();//需要更新预警事件的样本截止时间
|
|
|
+ Map<String, JPOrdWarnEventInfo> newEvent2Gen = new HashMap<>();
|
|
|
+ Map<String, List<SiteStatsDataItem>> ownerId2TriggerSample = new HashMap<>();//触发规则的样本数据
|
|
|
+ String eventIdAcceptPlanHisTriggerSam = "";//将预案的历史触发样本数据迁移到该事件
|
|
|
+ boolean clearPlanHisTriggerSam = false;//是否需要清空预案的历史触发样本数据
|
|
|
+
|
|
|
+ List<Long> tagTime = new ArrayList<>();//每天整点时刻,用于查询站点的统计数据
|
|
|
+ long tmpStepToStep = thisTempStep.getQueryBeginUTC();
|
|
|
+ do {
|
|
|
+ tagTime.add(tmpStepToStep);
|
|
|
+ tmpStepToStep += TimeTool.MS_ONE_DAY;
|
|
|
+ }while (tmpStepToStep < thisTempStep.getQueryEndUTC());
|
|
|
+
|
|
|
+ do {
|
|
|
+ String[] storeTagAndBackTag = rules.get(0).getConditions().get(0).getFormat().split("@");
|
|
|
+ if (storeTagAndBackTag == null || storeTagAndBackTag.length < 2){
|
|
|
+ step = String.format("Format param invalid in rules");
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ JPGetRegionReport queryJP = new JPGetRegionReport();
|
|
|
+ queryJP.setData(new ArrayList<>());
|
|
|
+ for (Long beginTm:tagTime){
|
|
|
+ JPGetRegionReportItem item = new JPGetRegionReportItem();
|
|
|
+ item.setUid(siteId);
|
|
|
+ item.setField(storeTagAndBackTag[0]);
|
|
|
+ item.setTag(String.valueOf(beginTm));
|
|
|
+ item.setBeginTime(beginTm);
|
|
|
+ item.setEndTime(beginTm+TimeTool.MS_ONE_DAY);
|
|
|
+ queryJP.getData().add(item);
|
|
|
+ }
|
|
|
+ queryJP.setTotal(queryJP.getData().size());
|
|
|
+ try {
|
|
|
+ ResponseRes<String> resHttp = ServiceMgrProxy.getInstance().applyDataQeServiceApi().siteRegionReport(queryJP);
|
|
|
+ if (ResponseCode.RESULT_NORMAL.toStrCode().equals(resHttp.getRescode()))
|
|
|
+ siteStatsData = FastJsonUtil.fromJSONByGson(resHttp.getResdata(), SiteStatsDataResult.class);
|
|
|
+ }catch (Exception e){}
|
|
|
+
|
|
|
+ if (siteStatsData == null){
|
|
|
+ step = String.format("Get site stats data failed");
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (CommTool.listSize(siteStatsData.getData()) <= 0){
|
|
|
+ step = String.format("Get site stats data empty");
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //要求getReport()中的数据为按tag升序排列,注:tag为每个整点时刻的UTC时间
|
|
|
+ Collections.sort(siteStatsData.getData(), new Comparator<SiteStatsDataItem>() {
|
|
|
+ @Override
|
|
|
+ public int compare(SiteStatsDataItem o1, SiteStatsDataItem o2) {
|
|
|
+ return o1.getTag().compareTo(o2.getTag());
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ for (SiteStatsDataItem sampleItem:siteStatsData.getData()){
|
|
|
+ long sampleRecordTm = CastUtil.castLong(sampleItem.getTag(), 0L);
|
|
|
+ if (sampleRecordTm <= 0L
|
|
|
+ || sampleItem.getCode() != 0
|
|
|
+ || CommTool.listSize(sampleItem.getReport()) <= 0)
|
|
|
+ continue;//数据条目缺失可认为,还在等待录入则跳过
|
|
|
+
|
|
|
+ boolean matched = false;
|
|
|
+ OrdWarnPlanRules findRule = null;
|
|
|
+ int sampleRecordTmUnit = TimeTool.getMonthIndex(sampleRecordTm);
|
|
|
+ for (OrdWarnPlanRules ruleItem:rules){
|
|
|
+ if (sampleRecordTmUnit <= ruleItem.getEnds() && sampleRecordTmUnit >= ruleItem.getStarts()){
|
|
|
+ findRule = ruleItem;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (findRule == null)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ for (OrdWarnRuleCondition condition:findRule.getConditions()){
|
|
|
+ String originValue = "";
|
|
|
+ String backTag = storeTagAndBackTag[1];
|
|
|
+ for (KeyValue kv:sampleItem.getReport()){
|
|
|
+ if (backTag.equals(kv.getKey())){
|
|
|
+ originValue = kv.getValue();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ int needLines = (int)(TimeTool.SEC_ONE_DAY/findRule.getDevCycle());//理论采集条数
|
|
|
+ int offsetLines = (int)Math.ceil(needLines*0.01);//容错率为1%对应的条数
|
|
|
+ int realLines = CastUtil.castInt(originValue, 0);//实际采集条数
|
|
|
+ int diffLines = needLines-realLines;//缺失条数(实际条数比理论条数大时为负)
|
|
|
+ double diffRate = diffLines<=offsetLines?0.0:(diffLines*100)/needLines;
|
|
|
+ int pkRes = CommToolHandler.matchedToRuleItem(String.valueOf(diffRate), condition);
|
|
|
+ if (pkRes == -1){
|
|
|
+ step = String.format("Compare value exception error");
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ break;
|
|
|
+ }else {
|
|
|
+ matched = matched || (pkRes==COMPARE_TURE?true:false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (code != ResponseCode.RESULT_NORMAL)
|
|
|
+ break;
|
|
|
+
|
|
|
+ List<SiteStatsDataItem> planOfSample = ownerId2TriggerSample.get(planDetail.getUid());
|
|
|
+ if (planOfSample == null){
|
|
|
+ planOfSample = new ArrayList<>();
|
|
|
+ ownerId2TriggerSample.put(planDetail.getUid(), planOfSample);
|
|
|
+ }
|
|
|
+ if (!matched){//本次没有匹配成功
|
|
|
+ step = "This is not matched.";
|
|
|
+ thisTempStep.setLastCompareSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleResult(COMPARE_FALSE);
|
|
|
+ thisTempStep.setFirstMatchSampleTime(0L);
|
|
|
+ thisTempStep.setLastEventId("");
|
|
|
+ thisTempStep.setLastEventTime(0L);
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+
|
|
|
+ planOfSample.clear();
|
|
|
+ if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
|
|
|
+ clearPlanHisTriggerSam = true;
|
|
|
+ continue;
|
|
|
+ }else {//本次匹配成功进入下一步
|
|
|
+ planOfSample.add(sampleItem);
|
|
|
+ }
|
|
|
+
|
|
|
+ long triggerEventPeriodSwitch = planDetail.getFrequency()*planDetail.getThreshold();//触发预警事件的最小时长(单位:时/天/月)
|
|
|
+ if (thisTempStep.getLastCompareSampleResult() <= COMPARE_FALSE){//上一次没有匹配成功
|
|
|
+ step = "This is matched, but last is not matched.";
|
|
|
+ thisTempStep.setLastCompareSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
|
|
|
+ thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+ if (triggerEventPeriodSwitch <= 1){//触发事件
|
|
|
+ step = "This is matched and trigger short period, it will gen event.";
|
|
|
+ thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+
|
|
|
+ JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
|
|
|
+ newEvent2Gen.put(newEvent.getUid(), newEvent);
|
|
|
+ thisTempStep.setLastEventId(newEvent.getUid());
|
|
|
+ thisTempStep.setLastEventAction(newEvent.getAction());
|
|
|
+ thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
|
|
|
+ eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
|
|
|
+ List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
|
|
|
+ if (eventSampleHis == null){
|
|
|
+ eventSampleHis = new ArrayList<>();
|
|
|
+ ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
|
|
|
+ }
|
|
|
+ eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
|
|
|
+ }
|
|
|
+ continue;
|
|
|
+ }//上一次匹配成功了进入下一步
|
|
|
+
|
|
|
+ long diffMatch = (sampleRecordTm-thisTempStep.getLastCompareSampleTime())/TimeTool.MS_ONE_DAY;//换算成天
|
|
|
+ if (diffMatch > triggerEventPeriodSwitch){//两个最近匹配样本间缺失的数据太多、或跨了天/月、或跨了时段,可认为重新计数
|
|
|
+ step = "This is matched, but two matched sample is too distance.";
|
|
|
+ thisTempStep.setLastCompareSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
|
|
|
+ thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+ if (triggerEventPeriodSwitch <= 1){//触发事件
|
|
|
+ step = "This is matched and trigger short period, it will gen event.";
|
|
|
+ thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+
|
|
|
+ JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
|
|
|
+ newEvent2Gen.put(newEvent.getUid(), newEvent);
|
|
|
+ thisTempStep.setLastEventId(newEvent.getUid());
|
|
|
+ thisTempStep.setLastEventAction(newEvent.getAction());
|
|
|
+ thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
|
|
|
+ eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
|
|
|
+ List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
|
|
|
+ if (eventSampleHis == null){
|
|
|
+ eventSampleHis = new ArrayList<>();
|
|
|
+ ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
|
|
|
+ }
|
|
|
+ eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
|
|
|
+ }else {
|
|
|
+ thisTempStep.setLastEventId("");
|
|
|
+ thisTempStep.setLastEventTime(0L);
|
|
|
+ }
|
|
|
+ continue;
|
|
|
+ }//两个最近匹配样本间隔很近,可认为是持续匹配,则进入下一步
|
|
|
+
|
|
|
+ long matchLen = 0L;//样本匹配的持续时长
|
|
|
+ if (thisTempStep.getFirstMatchSampleTime() > 0L)
|
|
|
+ matchLen = ((sampleRecordTm-thisTempStep.getFirstMatchSampleTime())/TimeTool.MS_ONE_DAY)+1;//换算成天
|
|
|
+ if (StringUtils.isEmpty(thisTempStep.getLastEventId())){//之前无预警事件
|
|
|
+ if (matchLen < triggerEventPeriodSwitch){//还得持续等待,达不到触发事件的累计时长
|
|
|
+ step = "This is matched, but need wait the next matched.";
|
|
|
+ thisTempStep.setLastCompareSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+ if (thisTempStep.getFirstMatchSampleTime() <= 0){
|
|
|
+ thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
|
|
|
+ if (triggerEventPeriodSwitch <= 1){//补充触发事件
|
|
|
+ step = "This is matched and trigger short period, it will gen event.";
|
|
|
+ thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+
|
|
|
+ JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
|
|
|
+ newEvent2Gen.put(newEvent.getUid(), newEvent);
|
|
|
+ thisTempStep.setLastEventId(newEvent.getUid());
|
|
|
+ thisTempStep.setLastEventAction(newEvent.getAction());
|
|
|
+ thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
|
|
|
+ eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
|
|
|
+ List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
|
|
|
+ if (eventSampleHis == null){
|
|
|
+ eventSampleHis = new ArrayList<>();
|
|
|
+ ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
|
|
|
+ }
|
|
|
+ eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else {//触发一个新的事件
|
|
|
+ step = "This is matched, and will gen event.";
|
|
|
+ thisTempStep.setLastCompareSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
|
|
|
+ thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+
|
|
|
+ JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
|
|
|
+ newEvent2Gen.put(newEvent.getUid(), newEvent);
|
|
|
+ thisTempStep.setLastEventId(newEvent.getUid());
|
|
|
+ thisTempStep.setLastEventAction(newEvent.getAction());
|
|
|
+ thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
|
|
|
+ //[!!!]do not change the FirstMatchSampleTime[!!!]
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
|
|
|
+ eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
|
|
|
+ List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
|
|
|
+ if (eventSampleHis == null){
|
|
|
+ eventSampleHis = new ArrayList<>();
|
|
|
+ ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
|
|
|
+ }
|
|
|
+ eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
|
|
|
+ }
|
|
|
+ }else {//之前有预警事件
|
|
|
+ if (planDetail.getMergeToEvent() == 0 || thisTempStep.getLastEventAction() >= EventAction.DONE){//之前的预警事件已处理,则可认为进行重新计数
|
|
|
+ step = "This is matched, but need to wait the next matched.";
|
|
|
+ thisTempStep.setLastCompareSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
|
|
|
+ thisTempStep.setFirstMatchSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+ if (triggerEventPeriodSwitch <= 1){//触发事件
|
|
|
+ step = "This is matched and trigger short period, it will gen event.";
|
|
|
+ thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+
|
|
|
+ JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
|
|
|
+ newEvent2Gen.put(newEvent.getUid(), newEvent);
|
|
|
+ thisTempStep.setLastEventId(newEvent.getUid());
|
|
|
+ thisTempStep.setLastEventAction(newEvent.getAction());
|
|
|
+ thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
|
|
|
+ eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
|
|
|
+ List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
|
|
|
+ if (eventSampleHis == null){
|
|
|
+ eventSampleHis = new ArrayList<>();
|
|
|
+ ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
|
|
|
+ }
|
|
|
+ eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
|
|
|
+ }else {
|
|
|
+ thisTempStep.setLastEventId("");
|
|
|
+ thisTempStep.setLastEventTime(0L);
|
|
|
+ }
|
|
|
+ }else {//之前的预警事件未处理,则更新预警事件的样本截止时刻
|
|
|
+ step = "This is matched, but need to merge the last event.";
|
|
|
+ thisTempStep.setLastCompareSampleTime(sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleResult(COMPARE_TURE);
|
|
|
+ if (newEvent2Gen.containsKey(thisTempStep.getLastEventId())){
|
|
|
+ newEvent2Gen.get(thisTempStep.getLastEventId()).setToTime(sampleRecordTm);
|
|
|
+ }else
|
|
|
+ oldEvent2EndUTC.put(thisTempStep.getLastEventId(), sampleRecordTm);
|
|
|
+ thisTempStep.setLastCompareSampleExplain(step);
|
|
|
+
|
|
|
+ final String lastEventID = thisTempStep.getLastEventId();
|
|
|
+ if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
|
|
|
+ eventIdAcceptPlanHisTriggerSam = lastEventID;
|
|
|
+ List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(lastEventID);
|
|
|
+ if (eventSampleHis == null){
|
|
|
+ eventSampleHis = new ArrayList<>();
|
|
|
+ ownerId2TriggerSample.put(lastEventID, eventSampleHis);
|
|
|
+ }
|
|
|
+ eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }while (false);
|
|
|
+
|
|
|
+ thisTempStep.setLastAnalyExplain(step);
|
|
|
+ Map<String, Object> updatePlan = thisTempStep.genUpdatePlan();
|
|
|
+ updatePlan.put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion()+1);
|
|
|
+ updatePlan.put(OrdWarnPlanInfoTable.W_INFO.UPDATE_TIME, System.currentTimeMillis());
|
|
|
+ List<Map<String, Object>> genNewEventObj = null;
|
|
|
+ if (CommTool.mapSize(newEvent2Gen) > 0){
|
|
|
+ genNewEventObj = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, JPOrdWarnEventInfo> entry:newEvent2Gen.entrySet())
|
|
|
+ genNewEventObj.add(FastJsonUtil.obj2Map(entry.getValue(), true));
|
|
|
+ }
|
|
|
+ List<Map<String, Object>> genOldEventObj = null;
|
|
|
+ if (CommTool.mapSize(oldEvent2EndUTC) > 0){
|
|
|
+ genOldEventObj = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, Long> entry:oldEvent2EndUTC.entrySet()){
|
|
|
+ genOldEventObj.add(new HashMap<String, Object>(){{
|
|
|
+ put(OrdWarnEventInfoTable.W_INFO.UNIQUE_ID, entry.getKey());
|
|
|
+ put(OrdWarnEventInfoTable.W_INFO.TO_TIME, entry.getValue());
|
|
|
+ put(OrdWarnEventInfoTable.W_INFO.UPDATE_TIME, TimeTool.getCurMsUTC());
|
|
|
+ }});
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<Map<String, Object>> triggerSampleHisObj = null;
|
|
|
+ if (CommTool.mapSize(ownerId2TriggerSample) > 0){
|
|
|
+ triggerSampleHisObj = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, List<SiteStatsDataItem>> entry:ownerId2TriggerSample.entrySet()){
|
|
|
+ if (CommTool.listSize(entry.getValue()) > 0){
|
|
|
+ triggerSampleHisObj.add(new HashMap<String, Object>(){{
|
|
|
+ put(OrdWarnTriggerSampleHisTable.W_INFO.OWNER_ID, entry.getKey());
|
|
|
+ put(OrdWarnTriggerSampleHisTable.W_INFO.SAMPLE, FastJsonUtil.toJSON(entry.getValue()));
|
|
|
+ }});
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ownerId2TriggerSample.clear();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (getWarnPlanInfoDBService().updatePlanForTrigger(new HashMap<String, Object>(){{
|
|
|
+ put(OrdWarnPlanInfoTable.W_INFO.UNIQUE_ID, planDetail.getUid());
|
|
|
+ put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion());
|
|
|
+ }}, updatePlan, genNewEventObj, genOldEventObj, triggerSampleHisObj, clearPlanHisTriggerSam, eventIdAcceptPlanHisTriggerSam) <= 0){
|
|
|
+ step = "Update warn plan trigger result to db failed.";
|
|
|
+ code = ResponseCode.RESULT_BAD;
|
|
|
+ }
|
|
|
+ LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBusinessType, mStrClassName
|
|
|
+ , String.format("Analysis Data For Report By Day:{planId=%s,siteId=%s} {step=%s} {clearPlanHisTrigSam=%b,eventAcceptPlanHisTrigSam=%s} {%s}...",
|
|
|
+ planDetail.getUid(), siteId, step, clearPlanHisTriggerSam, eventIdAcceptPlanHisTriggerSam, code.toString()));
|
|
|
+ return code;
|
|
|
+ }
|
|
|
}
|