|
|
@@ -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;
|
|
|
+ }
|
|
|
}
|