Преглед изворни кода

站点的监测类数据预警

andyliu пре 3 недеља
родитељ
комит
2fb74d4de7
53 измењених фајлова са 1714 додато и 37 уклоњено
  1. 342 0
      src/main/java/com/shkpr/service/warncore/bizhandler/SiteDataHandler.java
  2. 0 19
      src/main/java/com/shkpr/service/warncore/bizhandler/SiteRealDataHandler.java
  3. 92 0
      src/main/java/com/shkpr/service/warncore/bizhandler/TimeCheckWarnPlanMgr.java
  4. 1 1
      src/main/java/com/shkpr/service/warncore/bizhandler/ZoneAnalyDataHandler.java
  5. 0 7
      src/main/java/com/shkpr/service/warncore/bizhandler/ZoneRealDataHandler.java
  6. 8 0
      src/main/java/com/shkpr/service/warncore/commtools/CommTool.java
  7. 25 0
      src/main/java/com/shkpr/service/warncore/components/locks/OrdWarnPlanLockMgr.java
  8. 16 0
      src/main/java/com/shkpr/service/warncore/constants/CommFieldStatus.java
  9. 11 0
      src/main/java/com/shkpr/service/warncore/constants/FrequencyUnit.java
  10. 3 2
      src/main/java/com/shkpr/service/warncore/constants/LogFlagBusiType.java
  11. 9 0
      src/main/java/com/shkpr/service/warncore/constants/OrdWarnObjSrc.java
  12. 1 0
      src/main/java/com/shkpr/service/warncore/constants/TaskQueueDataTypeEx.java
  13. 4 0
      src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidDel.java
  14. 1 0
      src/main/java/com/shkpr/service/warncore/dbdao/DBMgrProxy.java
  15. 38 0
      src/main/java/com/shkpr/service/warncore/dbdao/mapper/OrdWarnPlanRulesMapper.java
  16. 1 1
      src/main/java/com/shkpr/service/warncore/dbdao/providers/OrdWarnPlanInfoSqlProvider.java
  17. 45 0
      src/main/java/com/shkpr/service/warncore/dbdao/providers/OrdWarnPlanRulesSqlProvider.java
  18. 54 5
      src/main/java/com/shkpr/service/warncore/dbdao/services/OrdWarnPlanInfoDBServiceImpl.java
  19. 110 0
      src/main/java/com/shkpr/service/warncore/dbdao/services/OrdWarnPlanRulesDBServiceImpl.java
  20. 12 0
      src/main/java/com/shkpr/service/warncore/dbdao/services/intef/OrdWarnPlanRulesDBService.java
  21. 11 2
      src/main/java/com/shkpr/service/warncore/dbdao/tables/OrdWarnPlanInfoTable.java
  22. 20 0
      src/main/java/com/shkpr/service/warncore/dbdao/tables/OrdWarnPlanRulesTable.java
  23. 15 0
      src/main/java/com/shkpr/service/warncore/dto/CommTotalMinMax.java
  24. 14 0
      src/main/java/com/shkpr/service/warncore/dto/KeyValue.java
  25. 25 0
      src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanCheckBean.java
  26. 37 0
      src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanDetail.java
  27. 49 0
      src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanRules.java
  28. 46 0
      src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanTempStep.java
  29. 19 0
      src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanWillDo.java
  30. 19 0
      src/main/java/com/shkpr/service/warncore/dto/OrdWarnRuleCondition.java
  31. 16 0
      src/main/java/com/shkpr/service/warncore/dto/SiteSampleDataResult.java
  32. 16 0
      src/main/java/com/shkpr/service/warncore/dto/SiteSampleGroupItem.java
  33. 17 0
      src/main/java/com/shkpr/service/warncore/dto/SiteSampleRecord.java
  34. 16 0
      src/main/java/com/shkpr/service/warncore/globalmgr/ScheduleTaskMgr.java
  35. 18 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPClockRange.java
  36. 28 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPCommUidSK.java
  37. 35 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPGetOne.java
  38. 40 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPGetOneEx.java
  39. 23 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPGetRegionData.java
  40. 18 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPIds.java
  41. 55 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPIdsSK.java
  42. 11 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPIntIdsSK.java
  43. 12 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPLongIdsSK.java
  44. 47 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPOrderBy.java
  45. 53 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPPageLO.java
  46. 40 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPPageLOEx.java
  47. 12 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPStrIdsSK.java
  48. 26 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPZoneList.java
  49. 24 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPZoneSK.java
  50. 43 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPZoneSiteLinkSK.java
  51. 23 0
      src/main/java/com/shkpr/service/warncore/jsonbean/JPZoneTrees.java
  52. 108 0
      src/main/java/com/shkpr/service/warncore/services/CloudDataQeService.java
  53. 5 0
      src/main/java/com/shkpr/service/warncore/services/ServiceMgrProxy.java

+ 342 - 0
src/main/java/com/shkpr/service/warncore/bizhandler/SiteDataHandler.java

@@ -0,0 +1,342 @@
+package com.shkpr.service.warncore.bizhandler;
+
+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.components.locks.CountDownLatchEx;
+import com.shkpr.service.warncore.components.locks.OrdWarnPlanLockMgr;
+import com.shkpr.service.warncore.constants.CommFieldStatus;
+import com.shkpr.service.warncore.dbdao.DBMgrProxy;
+import com.shkpr.service.warncore.dbdao.services.intef.OrdWarnPlanInfoDBService;
+import com.shkpr.service.warncore.dbdao.services.intef.OrdWarnPlanRulesDBService;
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnPlanInfoTable;
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnPlanRulesTable;
+import com.shkpr.service.warncore.dto.*;
+import com.shkpr.service.warncore.jsonbean.JPGetRegionData;
+import com.shkpr.service.warncore.jsonbean.JPStrIdsSK;
+import com.shkpr.service.warncore.services.ServiceMgrProxy;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+
+/**
+ * 站点数据处理
+ */
+public class SiteDataHandler {
+    private static OrdWarnPlanInfoDBService getWarnPlanInfoDBService(){
+        return DBMgrProxy.getInstance().applyXXXApi(OrdWarnPlanInfoDBService.class);
+    }
+
+    private static OrdWarnPlanRulesDBService getWarnPlanRuleDBService(){
+        return DBMgrProxy.getInstance().applyXXXApi(OrdWarnPlanRulesDBService.class);
+    }
+
+    //先获取方案信息,然后规则列表,再加锁
+    public void handlerData(String planId){
+        ResponseCode code = ResponseCode.RESULT_NORMAL;
+        String step = "Start Get Plan Info";
+        List<OrdWarnPlanRules> rules = null;
+        OrdWarnPlanDetail planDetail = null;
+        do {
+            Map<String, Object> infoDb = getWarnPlanInfoDBService().fastGetFiled("", "", planId);
+            if (infoDb == null || infoDb.size() <= 0){
+                code = ResponseCode.RESULT_BAD;
+                step = "Get Warn Plan Info Failed";
+                break;
+            }
+
+            planDetail = FastJsonUtil.map2Obj(infoDb, OrdWarnPlanDetail.class,true);
+            if (planDetail == null || planDetail.getStatus() != CommFieldStatus.ENABLE){
+                code = ResponseCode.RESULT_BAD;
+                step = "Warn Plan Info Invalid";
+                break;
+            }
+            infoDb.clear();
+            List<Map<String, Object>> rulesDb = getWarnPlanInfoDBService().batchQueryWithsEx("", ""
+                    , new HashMap<String, Object>(){{put(OrdWarnPlanRulesTable.R_INFO.PLAN_ID, planId);}}
+                    , null, OrdWarnPlanRulesTable.R_INFO.DEFAULT_ORDER, "");
+            if (CommTool.listSize(rulesDb) <= 0){
+                code = ResponseCode.RESULT_BAD;
+                step = "Warn Plan Rules Invalid";
+                break;
+            }
+
+            rules = OrdWarnPlanRules.batchFromJsonEx(rulesDb);
+            rulesDb.clear();
+        }while (false);
+
+        if (code == ResponseCode.RESULT_NORMAL){
+            CountDownLatchEx latchEx = null;
+            int nRetry = 3;
+            do {
+                try {
+                    latchEx = OrdWarnPlanLockMgr.tryLatchForPlan(planId, 2000);
+                }catch (Exception e){
+                    latchEx = null;
+                }
+
+                if (latchEx != null){
+                    handlerDataFun(planDetail, rules);
+                    break;
+                }
+            }while ((--nRetry) > 0);
+
+            if (latchEx != null){
+                latchEx.countDown();
+            }else{
+                step = "Request Lock For Analysis Failed";
+                code = ResponseCode.RESULT_BAD;
+                //handlerAnalysisForPlan(planDetail, siteDataResult);
+            }
+        }
+    }
+
+    private ResponseCode handlerDataFun(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;
+        }
+
+        final long curUTCTm = TimeTool.getCurMsUTC();
+        final int curClock = (int)((curUTCTm/1000/60/60%24+8)%24);
+        final String curDate = TimeTool.convertUTC2DateStr(curUTCTm, TimeTool.YEAR_MONTH_DAY_FORMAT);
+        long queryBeginUTC = 0L, queryEndUTC = 0L, conditionMinUTC = 0L;
+        OrdWarnPlanTempStep thisStepTempRes = new OrdWarnPlanTempStep(planDetail);
+        do {
+            if (code != ResponseCode.RESULT_NORMAL)
+                break;
+
+            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).getStart()));
+                if (curClock >= rules.get(i).getStart() && curClock <= rules.get(i).getEnd()){
+                    findStartClock = rules.get(i).getStart();
+                    queryEndUTC = Math.min(curUTCTm, TimeTool.convertDateStr2UTC(String.format("%s %2d:59:59", curDate, rules.get(i).getEnd())));
+                }
+            }
+            if (findStartClock < 0){
+                step = "Not In Time Range,Do Analysis Next Time";
+                code = ResponseCode.RESULT_BAD;
+                break;
+            }
+
+            findStartClock = findStartClock-1;
+            for (int i=rules.size()-1;i>=0;i--){
+                if (findStartClock < 0)
+                    break;
+                if (findStartClock == rules.get(i).getEnd())
+                    findStartClock = rules.get(i).getStart()-1;
+            }
+            queryBeginUTC = TimeTool.convertDateStr2UTC(String.format("%s %2d:00:00", curDate, findStartClock+1));
+
+            if (thisStepTempRes.getLastCompareSampleTime() <= 0L //从未分析过则重新计数
+                 || thisStepTempRes.getLastCompareSampleTime() < queryBeginUTC){//样本跨了时段则重新计数
+                thisStepTempRes.resetData();
+            }else if (thisStepTempRes.getLastCompareSampleTime() >= queryBeginUTC){
+                queryBeginUTC = thisStepTempRes.getLastCompareSampleTime() + 1000L;
+            }
+            thisStepTempRes.setQueryBeginUTC(queryBeginUTC);
+            thisStepTempRes.setQueryEndUTC(queryEndUTC);
+            thisStepTempRes.setConditionMinUTC(conditionMinUTC);
+            thisStepTempRes.setDayTriggerTimes(planDetail.getDayTriggerTimes());
+            if (planDetail.getLastEventTime() < conditionMinUTC)
+                thisStepTempRes.setDayTriggerTimes(0);
+            if (planDetail.getDayTriggerUpperTimes() > 0
+                    && thisStepTempRes.getDayTriggerTimes() >= planDetail.getDayTriggerUpperTimes()){//触发事件达到最大个数
+                step = "Event Arrive Max Limit,Stop Analysis For Today";
+                code = ResponseCode.RESULT_BAD;
+                break;
+            }
+
+            if (!StringUtils.isEmpty(planDetail.getLastEventId())){
+                //向数据库中快速查询事件最近处理阶段action的值
+                //并赋值给thisTempStep
+            }
+
+            if (planDetail.getItemKey().endsWith("miss")){//数据缺失
+
+            }else if (planDetail.getItemKey().endsWith("swo")){//小时水量
+
+            }else {
+                if ("set".equals(planDetail.getDoPickWay())){//时段曲线
+                    return analysisDataBySet(planDetail, rules, thisStepTempRes);
+                }
+            }
+        }while (false);
+        return code;
+    }
+
+    //处理时段样本数据
+    private ResponseCode analysisDataBySet(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules, OrdWarnPlanTempStep thisTempStep){
+        ResponseCode code = ResponseCode.RESULT_NORMAL;
+        String step = "Start To Deep Analysis";
+        long curTime = TimeTool.getCurMsUTC();
+        final String siteId = rules.get(0).getObjId();
+        SiteSampleDataResult siteSampleData = null;
+        Map<String, Long> eventId2NewEndUTC = new HashMap<>();//需要更新预警事件的样本截止时间
+        do {
+            JPGetRegionData jpParam = new JPGetRegionData();
+            jpParam.setTotal(1);
+            jpParam.setIds(new ArrayList<String>(){{add(siteId);}});
+            jpParam.setBeginTime(thisTempStep.getQueryBeginUTC());
+            jpParam.setEndTime(thisTempStep.getQueryEndUTC());
+
+            try {
+                ResponseRes<String> resHttp = ServiceMgrProxy.getInstance().applyDataQeServiceApi().siteRegionData(jpParam);
+                if (ResponseCode.RESULT_NORMAL.toStrCode().equals(resHttp.getRescode()))
+                    siteSampleData = FastJsonUtil.fromJSONByGson(resHttp.getResdata(), SiteSampleDataResult.class);
+            }catch (Exception e){}
+
+            if (siteSampleData == null){
+                step = String.format("Get Site Sample Data Failed");
+                code = ResponseCode.RESULT_BAD;
+                break;
+            }
+            if (CommTool.listSize(siteSampleData.getData()) <= 0
+                    || CommTool.listSize(siteSampleData.getData().get(0).getRecords()) <= 0){
+                step = String.format("Get Site Sample Data Empty");
+                code = ResponseCode.RESULT_BAD;
+                break;
+            }
+
+            for (SiteSampleGroupItem sampleItem:siteSampleData.getData().get(0).getRecords()){
+                if (sampleItem.getTime() <= 0L)
+                    continue;
+                if (planDetail.getDayTriggerUpperTimes() > 0
+                        && thisTempStep.getDayTriggerTimes() >= planDetail.getDayTriggerUpperTimes()){
+                    step = String.format("Event Arrive Max Limit");
+                    code = ResponseCode.RESULT_BAD;
+                    break;
+                }
+
+                boolean matched = false;
+                OrdWarnPlanRules findRule = null;
+                int dataClock = (int)((sampleItem.getTime()/1000/60/60%24+8)%24);
+                for (OrdWarnPlanRules ruleItem:rules){
+                    if (dataClock <= ruleItem.getEnd() && dataClock >= ruleItem.getStart()){
+                        findRule = ruleItem;
+                        break;
+                    }
+                }
+                if (findRule == null)
+                    continue;
+                for (OrdWarnRuleCondition condition:findRule.getConditions()){
+                    String needMatchValue = "";
+                    for (KeyValue kv:sampleItem.getFields()){
+                        if (condition.getTag().equals(kv.getKey())){
+                            needMatchValue = kv.getValue();
+                            break;
+                        }
+                    }
+                    if (StringUtils.isEmpty(needMatchValue))
+                        matched = matched || false;
+                    else {
+                        try {
+                            int nRes = CommTool.compareFloat(needMatchValue, condition.getThreshold());
+                            if (nRes == 0){
+                                if ("!=".equals(condition.getMethod())){
+                                    matched = (matched || false);
+                                }else if (condition.getMethod().contains("=")){
+                                    matched = (matched || true);
+                                }else
+                                    matched = (matched || false);
+                            }else if (nRes > 0){
+                                if ("!=".equals(condition.getMethod())){
+                                    matched = (matched || true);
+                                }else if (condition.getMethod().contains(">")){
+                                    matched = (matched || true);
+                                }else
+                                    matched = (matched || false);
+                            }else {
+                                if ("!=".equals(condition.getMethod())){
+                                    matched = (matched || true);
+                                }else if (condition.getMethod().contains("<")){
+                                    matched = (matched || true);
+                                }else
+                                    matched = (matched || false);
+                            }
+                        }catch (Exception e){}
+                    }
+                }
+                if (!matched){//本次没有匹配成功
+                    thisTempStep.setLastCompareSampleTime(sampleItem.getTime());
+                    thisTempStep.setLastCompareSampleResult(0);
+                    thisTempStep.setFirstMatchSampleTime(0L);
+                    thisTempStep.setLastEventId("");
+                    thisTempStep.setLastEventTime(0L);
+                    continue;
+                }
+
+                if (thisTempStep.getLastCompareSampleResult() <= 0){//上一次没有匹配成功
+                    thisTempStep.setLastCompareSampleTime(sampleItem.getTime());
+                    thisTempStep.setLastCompareSampleResult(1);
+                    thisTempStep.setFirstMatchSampleTime(sampleItem.getTime());
+                    continue;
+                }
+
+                long diffMatch = sampleItem.getTime()-thisTempStep.getLastCompareSampleTime();//两个最近匹配样本之间的时间差(单位:毫秒)
+                if (diffMatch > planDetail.getThresholdPeriod()*TimeTool.MS_ONE_MIN){//两个最近匹配样本间缺失的数据太多、或跨了天、或跨了时段,可重新计数
+                    thisTempStep.setLastCompareSampleTime(sampleItem.getTime());
+                    thisTempStep.setLastCompareSampleResult(1);
+                    thisTempStep.setFirstMatchSampleTime(sampleItem.getTime());
+                    thisTempStep.setLastEventId("");
+                    thisTempStep.setLastEventTime(0L);
+                    continue;
+                }else {
+                    //两个最近匹配样本间隔很近,可认为是持续匹配
+                }
+
+                if (thisTempStep.getLastCompareSampleTime() < thisTempStep.getConditionMinUTC()){//上一个匹配样本是昨天的,可重新计数
+                    thisTempStep.setLastCompareSampleTime(sampleItem.getTime());
+                    thisTempStep.setLastCompareSampleResult(1);
+                    thisTempStep.setFirstMatchSampleTime(sampleItem.getTime());
+                    thisTempStep.setLastEventId("");
+                    thisTempStep.setLastEventTime(0L);
+                    continue;
+                }
+
+                long matchLen = (thisTempStep.getFirstMatchSampleTime()<=0)?0:(sampleItem.getTime()-thisTempStep.getFirstMatchSampleTime());//样本匹配的持续时长(单位:毫秒)
+                if (StringUtils.isEmpty(thisTempStep.getLastEventId())){//之前无预警事件
+                    if (matchLen < planDetail.getThresholdPeriod()*TimeTool.MS_ONE_MIN){//还有持续等待
+                        thisTempStep.setLastCompareSampleTime(sampleItem.getTime());
+                        thisTempStep.setLastCompareSampleResult(1);
+                        if (thisTempStep.getFirstMatchSampleTime() <= 0)
+                            thisTempStep.setFirstMatchSampleTime(sampleItem.getTime());
+                    }else {//触发一个新的事件
+                        thisTempStep.setLastCompareSampleTime(sampleItem.getTime());
+                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setLastEventId("新事件ID");
+                        thisTempStep.setLastEventTime(curTime);
+                        thisTempStep.setLastEventAction(1);
+                        thisTempStep.setDayTriggerTimes(thisTempStep.getDayTriggerTimes()+1);
+                    }
+                }else {//之前有预警事件
+                    if (thisTempStep.getLastEventAction() >= 2){//之前的预警事件已处理,则可认为进行重新计数
+                        thisTempStep.setLastCompareSampleTime(sampleItem.getTime());
+                        thisTempStep.setLastCompareSampleResult(1);
+                        thisTempStep.setFirstMatchSampleTime(sampleItem.getTime());
+                        thisTempStep.setLastEventId("");
+                        thisTempStep.setLastEventTime(0L);
+                    }else {//之前的预警事件未处理,则更新预警事件的样本截止时刻
+                        thisTempStep.setLastCompareSampleTime(sampleItem.getTime());
+                        thisTempStep.setLastCompareSampleResult(1);
+                        eventId2NewEndUTC.put(thisTempStep.getLastEventId(), sampleItem.getTime());
+                    }
+                }
+            }
+        }while (false);
+        return code;
+    }
+
+    //处理时段差值数据
+    private void handleDataByDiff(){
+
+    }
+}

+ 0 - 19
src/main/java/com/shkpr/service/warncore/bizhandler/SiteRealDataHandler.java

@@ -1,19 +0,0 @@
-package com.shkpr.service.warncore.bizhandler;
-
-/**
- * 站点实时采集数据处理
- */
-public class SiteRealDataHandler {
-    public void handleData(String planId){
-
-    }
-    //处理时段样本数据
-    private void handleDataBySet(){
-
-    }
-
-    //处理时段差值数据
-    private void handleDataByDiff(){
-
-    }
-}

+ 92 - 0
src/main/java/com/shkpr/service/warncore/bizhandler/TimeCheckWarnPlanMgr.java

@@ -1,7 +1,99 @@
 package com.shkpr.service.warncore.bizhandler;
 
+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.FrequencyUnit;
+import com.shkpr.service.warncore.constants.OrdWarnObjSrc;
+import com.shkpr.service.warncore.constants.TaskQueueDataTypeEx;
+import com.shkpr.service.warncore.dbdao.DBMgrProxy;
+import com.shkpr.service.warncore.dbdao.services.intef.OrdWarnPlanInfoDBService;
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnPlanInfoTable;
+import com.shkpr.service.warncore.dto.CommTotalMinMax;
+import com.shkpr.service.warncore.dto.OrdWarnPlanCheckBean;
+import com.shkpr.service.warncore.dto.OrdWarnPlanWillDo;
+import com.shkpr.service.warncore.globalmgr.AsyncTaskQueueMgr;
+
+import java.util.*;
+
 public class TimeCheckWarnPlanMgr {
+    private static OrdWarnPlanInfoDBService getThisDBService(){
+        return DBMgrProxy.getInstance().applyXXXApi(OrdWarnPlanInfoDBService.class);
+    }
+
     public static void checkWarnPlanByMinute(int curClock, int curMinute){
+        long thisDayBegin = TimeTool.getTodayBeginUTC();
+        Map<String, Object> mapSel = getThisDBService().totalWillAnalysisCounts(new HashMap<String, Object>(){{
+                    put(OrdWarnPlanInfoTable.W_INFO.STATUS, CommFieldStatus.ENABLE);
+                    put(OrdWarnPlanInfoTable.W_INFO.DISUSED, 0);
+                    put(OrdWarnPlanInfoTable.W_INFO.FREQUENCY_UNIT, FrequencyUnit.MIN);
+                }}
+                , null
+                , ""
+                , String.format("and %s <= %d "
+                        , OrdWarnPlanInfoTable.W_INFO.FREQUENCY
+                        , curMinute));
+
+        if (mapSel != null && mapSel.size() > 0){
+            CommTotalMinMax oTotal = FastJsonUtil.map2Obj(mapSel, CommTotalMinMax.class, true);
+            if (oTotal != null && oTotal.getTotal() > 0){
+                long curIndex = -1L;
+                int limit = 200, offset = 0, realTotal = 0;
+                while (curIndex < oTotal.getMaxIndex()){
+                    List<Map<String, Object>> arrDbTmp = getThisDBService().listAllWithsEx(OrdWarnPlanInfoTable.R_INFO.TABLE
+                            , OrdWarnPlanInfoTable.R_INFO.TOTAL_ANALYSIS_FILED
+                            , limit
+                            , offset
+                            ,null
+                            ,null
+                            , OrdWarnPlanInfoTable.R_INFO.TOTAL_ANALYSIS_ORDER
+                            , String.format("and %s = %d and %s = %d and (%s between %d and %d)"
+                                    ,OrdWarnPlanInfoTable.R_INFO.DISUSED
+                                    ,0
+                                    ,OrdWarnPlanInfoTable.R_INFO.STATUS
+                                    ,CommFieldStatus.ENABLE
+                                    ,OrdWarnPlanInfoTable.R_INFO.ID
+                                    ,oTotal.getMinIndex()
+                                    ,oTotal.getMaxIndex()));
+                    if (CommTool.listSize(arrDbTmp) <= 0)
+                        break;
+
+                    realTotal += arrDbTmp.size();
+                    offset = realTotal;
+
+                    List<OrdWarnPlanCheckBean> arrRes = FastJsonUtil.batchMap2Obj(arrDbTmp, OrdWarnPlanCheckBean.class, true);
+                    if (CommTool.listSize(arrRes) <= 0)
+                        continue;
+
+                    for (OrdWarnPlanCheckBean oItem:arrRes){
+                        if (oItem.getId() > curIndex)
+                            curIndex = oItem.getId();
+
+                        if (oItem.getStatus() != CommFieldStatus.ENABLE
+                                || oItem.getFrequency() <= 0
+                                || FrequencyUnit.MIN.equals(oItem.getFrequencyUnit())
+                                || oItem.getFrequency() > curMinute
+                                || (curMinute%oItem.getFrequency() != 0))
+                            continue;
+
+                        if ("hour".equals(oItem.getDoPeriodUnit())){
+                            if (oItem.getDayTriggerUpperTimes() >= 0){
+                                if (oItem.getDayTriggerUpperTimes() == 0)
+                                    continue;
+                                if (oItem.getLastEventTime() >= thisDayBegin
+                                        && oItem.getDayTriggerTimes() >= oItem.getDayTriggerUpperTimes()){
+                                    continue;
+                                }
+                            }
 
+                            if (curClock < oItem.getMinStart())
+                                continue;
+                        }
+                        AsyncTaskQueueMgr.getInstance().postTaskData(TaskQueueDataTypeEx.ASYNC_ANALY_WARN_PLAN, new OrdWarnPlanWillDo(oItem.getUid(), oItem.getObjSrc()));
+                    }
+                }
+            }
+        }
     }
 }

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

@@ -3,5 +3,5 @@ package com.shkpr.service.warncore.bizhandler;
 /**
  * 分区分析统计数据处理
  */
-public class ZoneAnalyDataHandler {
+public class ZoneDataHandler {
 }

+ 0 - 7
src/main/java/com/shkpr/service/warncore/bizhandler/ZoneRealDataHandler.java

@@ -1,7 +0,0 @@
-package com.shkpr.service.warncore.bizhandler;
-
-/**
- * 分区实时采集数据处理
- */
-public class ZoneRealDataHandler {
-}

+ 8 - 0
src/main/java/com/shkpr/service/warncore/commtools/CommTool.java

@@ -243,4 +243,12 @@ public class CommTool {
         return CommDefine.ADMIN_ROLE_ID.equals(roleId)
                 || CommDefine.INTERNAL_OPERATOR_ROLE_ID.equals(roleId);
     }
+
+    public static int compareFloat(String oneValue, String twoValue) throws Exception{
+        try {
+            return new BigDecimal(oneValue).compareTo(new BigDecimal(twoValue));
+        }catch (Exception e){
+            throw e;
+        }
+    }
 }

+ 25 - 0
src/main/java/com/shkpr/service/warncore/components/locks/OrdWarnPlanLockMgr.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.warncore.components.locks;
+
+public class OrdWarnPlanLockMgr extends BaseLockMgr{
+    private static volatile OrdWarnPlanLockMgr msInstance = null;
+    private static OrdWarnPlanLockMgr getInstance(){
+        if (msInstance == null){
+            synchronized (OrdWarnPlanLockMgr.class){
+                if (msInstance == null)
+                    msInstance = new OrdWarnPlanLockMgr();
+            }
+        }
+        return msInstance;
+    }
+
+    private OrdWarnPlanLockMgr() {
+    }
+
+    public static void releaseResource(){
+        getInstance().timerReleaseLatch();
+    }
+
+    public static CountDownLatchEx tryLatchForPlan(String planId, long waitMsTm) throws Exception{
+        return getInstance().tryLatchForXXX("WARN_PN_"+planId, waitMsTm);
+    }
+}

+ 16 - 0
src/main/java/com/shkpr/service/warncore/constants/CommFieldStatus.java

@@ -0,0 +1,16 @@
+package com.shkpr.service.warncore.constants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public interface CommFieldStatus {
+    int DESTROY = -1;
+    int DISABLE = 0;
+    int ENABLE = 1;
+
+    List<Integer> ALL_DEFINE = new ArrayList<Integer>(){{
+        add(DESTROY);
+        add(DISABLE);
+        add(ENABLE);
+    }};
+}

+ 11 - 0
src/main/java/com/shkpr/service/warncore/constants/FrequencyUnit.java

@@ -0,0 +1,11 @@
+package com.shkpr.service.warncore.constants;
+
+public interface FrequencyUnit {
+    String SEC = "s";//秒
+    String MIN = "m";//分
+    String HOUR = "h";//小时
+    String DAY = "d";//天
+    String WEEK = "w";//星期
+    String MONTH = "n";//月
+    String YEAR = "y";//年
+}

+ 3 - 2
src/main/java/com/shkpr/service/warncore/constants/LogFlagBusiType.java

@@ -14,14 +14,15 @@ public enum  LogFlagBusiType {
     BUSI_CALL_SX_WARN_AS(10, "Call SX Warn As Biz"),
 
 
+    BUSI_CALL_DATA_QE_AS(98, "Call Data Qe Service"),
     BUSI_INTERNAL(99,"Internal Busi"),
 
 
     BUSI_DB_USER(100,"DB User Busi"),
     BUSI_DB_PUSH_TASK(101,"DB Push Task Busi"),
     BUSI_DB_SMS(102,"DB SMS Busi"),
-    BUSI_DB_ORD_WARN_PLAN(103,"DB Ord Warn Plan"),
-
+    BUSI_DB_ORD_WARN_PLAN_INFO(103,"DB Ord Warn Plan Info"),
+    BUSI_DB_ORD_WARN_PLAN_RULE(104,"DB Ord Warn Plan Rule"),
 
     BUSI_INFLUX_DB_DEV_RECORD(200,"Influx DB Dev Record"),
 

+ 9 - 0
src/main/java/com/shkpr/service/warncore/constants/OrdWarnObjSrc.java

@@ -0,0 +1,9 @@
+package com.shkpr.service.warncore.constants;
+
+public interface OrdWarnObjSrc {
+    String SITE = "site";//作用对象为站点
+    String ZONE = "zone";//作用对象为分区
+    String ZTYPE = "ztype";//作用对象为分区主类型
+    String X3TH = "3th";//第三方平台
+    String TANK = "tank";//水箱设施
+}

+ 1 - 0
src/main/java/com/shkpr/service/warncore/constants/TaskQueueDataTypeEx.java

@@ -5,6 +5,7 @@ import com.global.base.taskqueue.TaskQueueDataType;
 public class TaskQueueDataTypeEx extends TaskQueueDataType {
     public static final int ASYNC_TASK_BEGIN = 1000;
     public static final int ASYNC_CALC_DEV_DATA_TASK = ASYNC_TASK_BEGIN+1;
+    public static final int ASYNC_ANALY_WARN_PLAN = ASYNC_CALC_DEV_DATA_TASK+1;
     public static final int ASYNC_TASK_END = 1010;
 
     public static final int DELAY_TASK_BEGIN = 2000;

+ 4 - 0
src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidDel.java

@@ -0,0 +1,4 @@
+package com.shkpr.service.warncore.controllervalid;
+
+public interface CommonParamValidDel {
+}

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

@@ -10,6 +10,7 @@ public class DBMgrProxy {
     final static Set<Class<?>> INIT_CLASS = new HashSet<Class<?>>(){{
         add(UserDBService.class);
         add(OrdWarnPlanInfoDBService.class);
+        add(OrdWarnPlanRulesDBService.class);
     }};
     private Map<Class<?>, Object> mapClass2Instance = new ConcurrentHashMap<>();
 

+ 38 - 0
src/main/java/com/shkpr/service/warncore/dbdao/mapper/OrdWarnPlanRulesMapper.java

@@ -0,0 +1,38 @@
+package com.shkpr.service.warncore.dbdao.mapper;
+
+import com.shkpr.service.warncore.dbdao.providers.OrdWarnPlanRulesSqlProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.SelectProvider;
+
+import java.util.List;
+import java.util.Map;
+
+public interface OrdWarnPlanRulesMapper {
+    @SelectProvider(type = OrdWarnPlanRulesSqlProvider.class, method = "totalCounts")
+    int totalCounts(@Param("table") String table
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = OrdWarnPlanRulesSqlProvider.class, method = "listAllWiths")
+    List<Map<String, Object>> listAllWiths(@Param("table") String table, @Param("filed") String filed
+            , @Param("limit") int limit
+            , @Param("offset") int offset
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = OrdWarnPlanRulesSqlProvider.class, method = "batchQueryIn")
+    List<Map<String, Object>> batchQueryIn(@Param("table") String table, @Param("filed") String filed
+            , @Param("ids") List<? extends Object> ids
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = OrdWarnPlanRulesSqlProvider.class, method = "batchQueryWiths")
+    List<Map<String, Object>> batchQueryWiths(@Param("table") String table, @Param("filed") String filed
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+}

+ 1 - 1
src/main/java/com/shkpr/service/warncore/dbdao/providers/OrdWarnPlanInfoSqlProvider.java

@@ -69,7 +69,7 @@ public class OrdWarnPlanInfoSqlProvider extends BaseSqlProvider implements OrdWa
         String extend = (String)mapParams.get("extend");
 
         StringBuilder sql = new StringBuilder("");
-        sql.append("select count(*) AS total, min("+W_INFO.ID+") AS min_index, max("+R_INFO.ID+") AS max_index from " + getRTableName() + " where 1=1 ");
+        sql.append("select count(*) AS total, min("+W_INFO.ID+") AS min_index, max("+W_INFO.ID+") AS max_index from " + getWTableName() + " where 1=1 ");
 
         String strAndWheres = genWheres(andWheres, "andWheres", "and");
         String strOrWheres = genWheres(orWheres, "orWheres", "or");

+ 45 - 0
src/main/java/com/shkpr/service/warncore/dbdao/providers/OrdWarnPlanRulesSqlProvider.java

@@ -0,0 +1,45 @@
+package com.shkpr.service.warncore.dbdao.providers;
+
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnPlanRulesTable;
+
+public class OrdWarnPlanRulesSqlProvider extends BaseSqlProvider implements OrdWarnPlanRulesTable {
+    @Override
+    public String getRTableName() {
+        return R_INFO.TABLE;
+    }
+
+    @Override
+    public String getWTableName() {
+        return W_INFO.TABLE;
+    }
+
+    @Override
+    public String getRUniqueId() {
+        return R_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getWUniqueId() {
+        return W_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getSAllFiled() {
+        return R_INFO.ALL_FILED;
+    }
+
+    @Override
+    public String getRPrimaryKey() {
+        return R_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public String getWPrimaryKey() {
+        return W_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public boolean isWJsonForFiled(String filedName) {
+        return false;
+    }
+}

+ 54 - 5
src/main/java/com/shkpr/service/warncore/dbdao/services/OrdWarnPlanInfoDBServiceImpl.java

@@ -2,6 +2,7 @@ package com.shkpr.service.warncore.dbdao.services;
 
 import com.global.base.log.LogLevelFlag;
 import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.warncore.commtools.CommTool;
 import com.shkpr.service.warncore.constants.LogFlagBusiType;
 import com.shkpr.service.warncore.dbdao.mapper.OrdWarnPlanInfoMapper;
 import com.shkpr.service.warncore.dbdao.services.intef.OrdWarnPlanInfoDBService;
@@ -20,7 +21,7 @@ public class OrdWarnPlanInfoDBServiceImpl implements OrdWarnPlanInfoDBService, O
     private String logTag = "";
     public OrdWarnPlanInfoDBServiceImpl() {
         mStrClassName = this.getClass().getSimpleName();
-        mBusinessType = LogFlagBusiType.BUSI_DB_ORD_WARN_PLAN.toStrValue();
+        mBusinessType = LogFlagBusiType.BUSI_DB_ORD_WARN_PLAN_INFO.toStrValue();
         logTag = "Ord Warn Plan";
     }
 
@@ -30,7 +31,7 @@ public class OrdWarnPlanInfoDBServiceImpl implements OrdWarnPlanInfoDBService, O
 
     @Override
     public List<Map<String, Object>> listAllWiths(int limit, int offset, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
-        return null;
+        return listAllWithsEx("", "", limit, offset, andWheres, orWheres, orderBy, extend);
     }
 
     @Override
@@ -75,12 +76,42 @@ public class OrdWarnPlanInfoDBServiceImpl implements OrdWarnPlanInfoDBService, O
 
     @Override
     public int existsLineEx(String table, Map<String, Object> andWheres, Map<String, Object> orWheres, String extend) {
-        return 0;
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return (ordWarnPlanInfoMapper.existLine(table, andWheres, orWheres, extend)?1:0);
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+            return -1;
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , mBusinessType
+                    , mStrClassName
+                    , String.format("Exists The %s Line from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
     }
 
     @Override
     public Map<String, Object> fastGetFiled(String table, String filed, Object id) {
-        return null;
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            Map<String, Object> mapRes = ordWarnPlanInfoMapper.getOne(table, filed, id);//查询不到时也会返回null
+            if (mapRes == null)
+                return new HashMap<>();
+            else
+                return mapRes;
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+            return null;
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , mBusinessType
+                    , mStrClassName
+                    , String.format("Fast Get %s Filed from database, id:{%s} code:{%d} msg:{%s} ...", logTag, String.valueOf(id), nCode, strMsg));
+        }
     }
 
     @Override
@@ -115,7 +146,25 @@ public class OrdWarnPlanInfoDBServiceImpl implements OrdWarnPlanInfoDBService, O
 
     @Override
     public List<Map<String, Object>> listAllWithsEx(String table, String filed, int limit, int offset, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
-        return null;
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = ordWarnPlanInfoMapper.listAllWiths(table, filed, limit, offset, andWheres, orWheres, orderBy, extend);
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , mBusinessType
+                    , mStrClassName
+                    , String.format("List All %s lines(limit=%d, offset=%d, orderBy=%s, back.size=%d) from database, code:{%d} msg:{%s} ..."
+                            , logTag ,limit ,offset
+                            , orderBy
+                            , CommTool.listSize(arrRes)
+                            , nCode, strMsg));
+        }
+        return arrRes;
     }
 
     @Override

+ 110 - 0
src/main/java/com/shkpr/service/warncore/dbdao/services/OrdWarnPlanRulesDBServiceImpl.java

@@ -0,0 +1,110 @@
+package com.shkpr.service.warncore.dbdao.services;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.warncore.commtools.CommTool;
+import com.shkpr.service.warncore.constants.LogFlagBusiType;
+import com.shkpr.service.warncore.dbdao.mapper.OrdWarnPlanRulesMapper;
+import com.shkpr.service.warncore.dbdao.services.intef.OrdWarnPlanRulesDBService;
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnPlanRulesTable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class OrdWarnPlanRulesDBServiceImpl implements OrdWarnPlanRulesDBService, OrdWarnPlanRulesTable {
+    private String mStrClassName = "";
+    private String mBusinessType = "";
+    private String logTag = "";
+    public OrdWarnPlanRulesDBServiceImpl() {
+        mStrClassName = this.getClass().getSimpleName();
+        mBusinessType = LogFlagBusiType.BUSI_DB_ORD_WARN_PLAN_RULE.toStrValue();
+        logTag = "Ord Warn Plan Rule";
+    }
+
+    @SuppressWarnings("all")
+    @Autowired
+    OrdWarnPlanRulesMapper ordWarnPlanRulesMapper;
+
+    @Override
+    public List<Map<String, Object>> listAllWiths(int limit, int offset, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryIn(List<?> ids, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryWiths(Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        return batchQueryWithsEx("", "", andWheres, orWheres, orderBy, extend);
+    }
+
+    @Override
+    public int totalCounts(Map<String, Object> andWheres, Map<String, Object> orWheres) {
+        return 0;
+    }
+
+    @Override
+    public Map<String, Object> getOne(Object id) {
+        return null;
+    }
+
+    @Override
+    public int insertByMap(Map<String, Object> maps) {
+        return 0;
+    }
+
+    @Override
+    public int updateWiths(Map<String, Object> datas, Map<String, Object> andWheres) {
+        return 0;
+    }
+
+    @Override
+    public int delete(Object id) {
+        return 0;
+    }
+
+    @Override
+    public int batchDeleteIn(List<?> ids, String extend) {
+        return 0;
+    }
+
+    @Override
+    public int existsLine(Map<String, Object> andWheres, Map<String, Object> orWheres, String extend) {
+        return 0;
+    }
+
+    @Override
+    public int totalCountsEx(Map<String, Object> andWheres, Map<String, Object> orWheres, String extend) {
+        return 0;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryWithsEx(String table, String fields, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = ordWarnPlanRulesMapper.batchQueryWiths(table, fields, andWheres, orWheres, orderBy, extend);
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , mBusinessType
+                    , mStrClassName
+                    , String.format("Batch Query %s Lines:{andWhere.size=%d, orWhere.size=%d, orderBy=%s, extend=%s, back.size=%d} from database, code:{%d} msg:{%s} ..."
+                            , logTag
+                            , CommTool.mapSize(andWheres)
+                            , CommTool.mapSize(orWheres)
+                            , orderBy, extend
+                            , CommTool.listSize(arrRes)
+                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+}

+ 12 - 0
src/main/java/com/shkpr/service/warncore/dbdao/services/intef/OrdWarnPlanRulesDBService.java

@@ -0,0 +1,12 @@
+package com.shkpr.service.warncore.dbdao.services.intef;
+
+import java.util.List;
+import java.util.Map;
+
+public interface OrdWarnPlanRulesDBService extends BaseDBService{
+    int existsLine(Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String extend);
+    int totalCountsEx(Map<String, Object> andWheres, Map<String, Object> orWheres, String extend);
+    List<Map<String, Object>> batchQueryWithsEx(String table, String fields, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend);
+}

+ 11 - 2
src/main/java/com/shkpr/service/warncore/dbdao/tables/OrdWarnPlanInfoTable.java

@@ -10,18 +10,23 @@ public interface OrdWarnPlanInfoTable {
         String DEFAULT_EXTEND = "";
         String ID = "id";
         String VERSION = "version";
-
+        String STATUS = "status";
+        String FREQUENCY = "frequency";
+        String FREQUENCY_UNIT = "frequency_unit";
+        String DISUSED = "disused";
         String TOTAL_ANALYSIS_FILED = new StringBuilder("id")
                 .append(",").append("uid")
                 .append(",").append("status")
                 .append(",").append("frequency")
+                .append(",").append("frequency_unit")
                 .append(",").append("day_trigger_times")
                 .append(",").append("day_trigger_upper_times")
                 .append(",").append("last_analy_time")
                 .append(",").append("last_event_time")
+                .append(",").append("do_period_unit")
                 .append(",").append("owner_src")
                 .append(",").append("obj_src").toString();
-        String TOTAL_ANALYSIS_ORDER = "create_time ASC,id ASC";
+        String TOTAL_ANALYSIS_ORDER = "create_time ASC,frequency ASC,id ASC";
     }
 
     interface W_INFO{
@@ -34,5 +39,9 @@ public interface OrdWarnPlanInfoTable {
         String FIRST_MATCH_SAMPLE_TIME = "first_match_sample_time";
         String LAST_EVENT_TIME = "last_event_time";
         String CREATE_TIME = "create_time";
+        String STATUS = "status";
+        String FREQUENCY = "frequency";
+        String FREQUENCY_UNIT = "frequency_unit";
+        String DISUSED = "disused";
     }
 }

+ 20 - 0
src/main/java/com/shkpr/service/warncore/dbdao/tables/OrdWarnPlanRulesTable.java

@@ -0,0 +1,20 @@
+package com.shkpr.service.warncore.dbdao.tables;
+
+public interface OrdWarnPlanRulesTable {
+    interface R_INFO{
+        String TABLE = "v_k4_ord_warn_plan_rules";
+        String PRIMARY_KEY = "id";
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "id";
+        String DEFAULT_ORDER = "start ASC, id ASC";
+        String DEFAULT_EXTEND = "";
+        String PLAN_ID = "plan_id";
+        String CONDITIONS = "conditions";
+    }
+
+    interface W_INFO{
+        String TABLE = "k4_ord_warn_plan_rules";
+        String PRIMARY_KEY = "id";
+        String UNIQUE_ID = "id";
+    }
+}

+ 15 - 0
src/main/java/com/shkpr/service/warncore/dto/CommTotalMinMax.java

@@ -0,0 +1,15 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommTotalMinMax {
+    protected int total = 0;
+    protected long minIndex = 0L;//最小重试索引位置
+    protected long maxIndex = 0L;//最大重试索引位置
+
+    public CommTotalMinMax() {
+    }
+}

+ 14 - 0
src/main/java/com/shkpr/service/warncore/dto/KeyValue.java

@@ -0,0 +1,14 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class KeyValue {
+    protected String key = "";
+    protected String value = "";
+
+    public KeyValue() {
+    }
+}

+ 25 - 0
src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanCheckBean.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class OrdWarnPlanCheckBean {
+    private long id = 0L;
+    private String uid = "";
+    private int status = -1;
+    private int frequency = 0;
+    private String frequencyUnit = "";
+    private int dayTriggerTimes = 0;
+    private int dayTriggerUpperTimes = -1;
+    private long lastAnalyTime = 0L;
+    private long lastEventTime = 0L;
+    private String ownerSrc = "";
+    private String objSrc = "";
+    private String doPeriodUnit = "";
+    private int minStart = 0;
+
+    public OrdWarnPlanCheckBean() {
+    }
+}

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

@@ -0,0 +1,37 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class OrdWarnPlanDetail {
+    private String uid = "";
+    private String itemKey = "";
+    private String title ="";
+    private String ownerSrc = "";
+    private String ownerId = "";
+    private String ownerMainType = "";
+    private String ownerSubType = "";
+    private int level = 0;
+    private int thresholdPeriod = 0;
+    private int sendway = 3;
+    private long lastCompareSampleTime = 0L;
+    private int lastCompareSampleResult = 0;
+    private long firstMatchSampleTime = 0L;
+    private long lastEventTime = 0L;
+    private String lastEventId = "";
+    private int status = 0;
+    private int version = 0;
+    private String objSrc = "";
+    private String doPeriodUnit = "";
+    private String doPickWay = "";
+    private String doDb = "";
+    private String doTable = "";
+    private String ending = "";
+    private int dayTriggerTimes = 0;
+    private int dayTriggerUpperTimes = -1;
+
+    public OrdWarnPlanDetail() {
+    }
+}

+ 49 - 0
src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanRules.java

@@ -0,0 +1,49 @@
+package com.shkpr.service.warncore.dto;
+
+import com.global.base.tools.FastJsonUtil;
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnPlanRulesTable;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Getter
+@Setter
+public class OrdWarnPlanRules {
+    private String objId = "";
+    private String objName = "";
+    private String objSrc = "";
+    private int start = 0;
+    private int end = 0;
+    private String restrict = "any";
+    private int devCycle = 0;//设备采集周期(单位:秒)
+    private List<OrdWarnRuleCondition> conditions = null;
+
+    public OrdWarnPlanRules() {
+    }
+
+    public static OrdWarnPlanRules fromJsonEx(final Map<String, Object> mapKeyValue){
+        String strConditions = (String) mapKeyValue.remove(OrdWarnPlanRulesTable.R_INFO.CONDITIONS);
+        OrdWarnPlanRules baseData = FastJsonUtil.map2Obj(mapKeyValue, OrdWarnPlanRules.class, true);
+        if (baseData != null){
+            baseData.setConditions(StringUtils.isEmpty(strConditions)
+                    ?new ArrayList<>(): FastJsonUtil.fromJSON2List(strConditions, OrdWarnRuleCondition.class));
+        }
+        return baseData;
+    }
+
+    public static List<OrdWarnPlanRules> batchFromJsonEx(final List<Map<String, Object>> arrMapKeyValue){
+        List<OrdWarnPlanRules> arrRes = new ArrayList<>();
+        if (arrMapKeyValue != null && arrMapKeyValue.size() > 0){
+            for (Map<String, Object> mapObj: arrMapKeyValue) {
+                OrdWarnPlanRules oBean = fromJsonEx(mapObj);
+                if (oBean != null)
+                    arrRes.add(oBean);
+            }
+        }
+        return arrRes;
+    }
+}

+ 46 - 0
src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanTempStep.java

@@ -0,0 +1,46 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 预警方案临时分析结果
+ */
+@Getter
+@Setter
+public class OrdWarnPlanTempStep {
+    private long queryBeginUTC = 0L;//样本数据的查询起始时刻
+    private long queryEndUTC = 0L;//样本数据的查询终止时刻
+    private long firstMatchSampleTime = 0L; //匹配上规则的第一个样本数据的时间
+    private long lastCompareSampleTime = 0L;//最近一次样本数据的时间
+    private int lastCompareSampleResult = -1;//最近一次样本对比的结果值(-1:待匹配;0:未匹配上;1:已匹配上)
+    private String lastCompareSampleExplain = "";//最近一次样本对比的结果说明
+    private long lastEventTime = 0L;//最近一次触发产生事件的时间
+    private String lastEventId = "";//最近一次触发产生事件的id
+    private int lastEventAction = 1;//最近一次触发产生事件的处理阶段(1--待处理;2--已处理)
+    private long conditionMinUTC = 0L;//触发规则列表中第一个时段的起始时刻
+    private int dayTriggerTimes = 0;//今日触发事件的个数
+
+    public OrdWarnPlanTempStep() {
+    }
+
+    public OrdWarnPlanTempStep(OrdWarnPlanDetail planDetail){
+        if (planDetail != null){
+            firstMatchSampleTime = planDetail.getFirstMatchSampleTime();
+            lastCompareSampleTime = planDetail.getLastCompareSampleTime();
+            lastCompareSampleResult = planDetail.getLastCompareSampleResult();
+            lastCompareSampleExplain = "";
+            lastEventTime = planDetail.getLastEventTime();
+            lastEventId = planDetail.getLastEventId();
+        }
+    }
+
+    public void resetData(){
+        firstMatchSampleTime = 0L;
+        lastCompareSampleTime = 0L;
+        lastCompareSampleResult = -1;
+        lastCompareSampleExplain = "";
+        lastEventTime = 0L;
+        lastEventId = "";
+    }
+}

+ 19 - 0
src/main/java/com/shkpr/service/warncore/dto/OrdWarnPlanWillDo.java

@@ -0,0 +1,19 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class OrdWarnPlanWillDo {
+    private String objSrc = "";
+    private String planId = "";
+
+    public OrdWarnPlanWillDo() {
+    }
+
+    public OrdWarnPlanWillDo(String planId, String objSrc) {
+        this.objSrc = objSrc;
+        this.planId = planId;
+    }
+}

+ 19 - 0
src/main/java/com/shkpr/service/warncore/dto/OrdWarnRuleCondition.java

@@ -0,0 +1,19 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class OrdWarnRuleCondition {
+    private String key = "";//对比字段标识符
+    private String name = "";//对比字段名称
+    private String unit = "";//对比字段单位
+    private String method = "";//对比字段方法
+    private String threshold = "";//对比字段待对比阀值
+    private String type = "";//对比字段的取值类型
+    private String tag = "";//对比字段的数据返回标签
+
+    public OrdWarnRuleCondition() {
+    }
+}

+ 16 - 0
src/main/java/com/shkpr/service/warncore/dto/SiteSampleDataResult.java

@@ -0,0 +1,16 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+
+@Getter
+@Setter
+public class SiteSampleDataResult {
+    private int total = 0;
+    private ArrayList<SiteSampleRecord> data = null;
+
+    public SiteSampleDataResult() {
+    }
+}

+ 16 - 0
src/main/java/com/shkpr/service/warncore/dto/SiteSampleGroupItem.java

@@ -0,0 +1,16 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+
+@Getter
+@Setter
+public class SiteSampleGroupItem {
+    private long time = 0L;
+    private ArrayList<KeyValue> fields = null;
+
+    public SiteSampleGroupItem() {
+    }
+}

+ 17 - 0
src/main/java/com/shkpr/service/warncore/dto/SiteSampleRecord.java

@@ -0,0 +1,17 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+
+@Getter
+@Setter
+public class SiteSampleRecord {
+    private String uid = "";
+    private int total = 0;
+    private ArrayList<SiteSampleGroupItem> records = null;
+
+    public SiteSampleRecord() {
+    }
+}

+ 16 - 0
src/main/java/com/shkpr/service/warncore/globalmgr/ScheduleTaskMgr.java

@@ -2,9 +2,12 @@ package com.shkpr.service.warncore.globalmgr;
 
 import com.global.base.log.LogLevelFlag;
 import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.warncore.bizhandler.TimeCheckWarnPlanMgr;
 import com.shkpr.service.warncore.commtools.TimeTool;
 import com.shkpr.service.warncore.components.LocalDynamicDataSource;
+import com.shkpr.service.warncore.components.locks.OrdWarnPlanLockMgr;
 import com.shkpr.service.warncore.constants.LogFlagBusiType;
+import com.shkpr.service.warncore.dto.TraceRunnable;
 import com.zaxxer.hikari.HikariDataSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -45,6 +48,12 @@ public class ScheduleTaskMgr {
     @Scheduled(cron = "${cron.refresh.timer.clock}")
     public void taskRefreshTimeRes() {
         TimeTool.refreshUTCTimeRes();
+        ThreadTaskMgr.runTask(new Runnable() {
+            @Override
+            public void run() {
+                OrdWarnPlanLockMgr.releaseResource();
+            }
+        });
     }
 
     /*@Scheduled(initialDelay = 30000, fixedRate = 600000) //延迟30秒后第一次调用该方法,此后每隔10分钟再执行一次
@@ -56,6 +65,13 @@ public class ScheduleTaskMgr {
         final long curTm = System.currentTimeMillis();
         final int curMinute = (int)(curTm/1000/60%60);//获取当前分钟数
         final int curClock = (int)((curTm/1000/60/60%24+8)%24);//获取当前小时数
+
+        ThreadTaskMgr.runTask(new TraceRunnable("S.CHECK.WARN.PLAN.BY.MIN") {
+            @Override
+            public void function() {
+                TimeCheckWarnPlanMgr.checkWarnPlanByMinute(curClock, curMinute==0?60:curMinute);
+            }
+        });
     }
 
     @Scheduled(cron = "${cron.check.hour.warn}")

+ 18 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPClockRange.java

@@ -0,0 +1,18 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class JPClockRange {
+    private int start = 0;
+    private int end = 0;
+
+    public JPClockRange() {
+    }
+
+    public boolean checkValid(){
+        return start <= end && start >= 0 && end <= 23;
+    }
+}

+ 28 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPCommUidSK.java

@@ -0,0 +1,28 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+
+public class JPCommUidSK extends JPStrIdsSK{
+    private int base = 0;// 1-- 表只查询基础信息; 0 -- 表查询详细信息
+    public JPCommUidSK() {
+        super();
+    }
+
+    public int getBase() {
+        return base;
+    }
+
+    public void setBase(int base) {
+        this.base = base;
+    }
+
+    @Override
+    public String toJsonStr() {
+        return FastJsonUtil.toJSON(this);
+    }
+
+    @Override
+    public boolean checkValid() {
+        return super.checkValid();
+    }
+}

+ 35 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPGetOne.java

@@ -0,0 +1,35 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.shkpr.service.warncore.controllervalid.CommonParamValidSK;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+@Getter
+@Setter
+public class JPGetOne {
+    @NotBlank(groups = { CommonParamValidSK.class})
+    @Size(min = 1, max = 64, groups = { CommonParamValidSK.class})
+    private String uid = "";
+
+    @Range(min = 0, max = 1, groups = {CommonParamValidSK.class})
+    private int base = 0;
+
+    public JPGetOne() {
+    }
+
+    public boolean checkValid(){
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "{" +
+                "uid='" + uid + '\'' +
+                ", base=" + base +
+                '}';
+    }
+}

+ 40 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPGetOneEx.java

@@ -0,0 +1,40 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.shkpr.service.warncore.controllervalid.CommonParamValidSK;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+@Getter
+@Setter
+public class JPGetOneEx {
+    @NotBlank(groups = { CommonParamValidSK.class})
+    @Size(min = 1, max = 64, groups = { CommonParamValidSK.class})
+    private String pid = "";
+
+    @Range(min = 0, max = 1, groups = {CommonParamValidSK.class})
+    private int base = 0;
+
+    @NotBlank(groups = { CommonParamValidSK.class})
+    @Size(min = 1, max = 64, groups = { CommonParamValidSK.class})
+    private String uid = "";
+
+    public JPGetOneEx() {
+    }
+
+    public boolean checkValid(){
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "{" +
+                "pid='" + pid + '\'' +
+                ", base=" + base +
+                ", uid='" + uid + '\'' +
+                '}';
+    }
+}

+ 23 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPGetRegionData.java

@@ -0,0 +1,23 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class JPGetRegionData {
+    private int total = 0;
+    private List<String> ids = null;
+    private long beginTime = 0L;
+    private long endTime = 0L;
+
+    public JPGetRegionData() {
+    }
+
+    public String toJsonStr(){
+        return FastJsonUtil.toJSON(this);
+    }
+}

+ 18 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPIds.java

@@ -0,0 +1,18 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import java.util.ArrayList;
+
+public class JPIds<T> {
+    protected ArrayList<T> ids = null;
+
+    public JPIds() {
+    }
+
+    public ArrayList<T> getIds() {
+        return ids;
+    }
+
+    public void setIds(ArrayList<T> ids) {
+        this.ids = ids;
+    }
+}

+ 55 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPIdsSK.java

@@ -0,0 +1,55 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.shkpr.service.warncore.controllervalid.CommonParamValidDel;
+import com.shkpr.service.warncore.controllervalid.CommonParamValidSK;
+import org.hibernate.validator.constraints.Range;
+
+public class JPIdsSK<T> extends JPIds<T> {
+    @Range(min = 0, max = 65535, groups = {CommonParamValidSK.class, CommonParamValidDel.class})
+    protected int total = -1;        //取值范围[0,65535]
+
+    private int maxLimit = 200;
+
+    public JPIdsSK() {
+        super();
+    }
+
+    public JPIdsSK(int maxLimit) {
+        super();
+        this.maxLimit = maxLimit;
+    }
+
+    public int getTotal() {
+        return total;
+    }
+
+    public void setTotal(int total) {
+        this.total = total;
+    }
+
+    public int getMaxLimit() {
+        return maxLimit;
+    }
+
+    public void setMaxLimit(int maxLimit) {
+        this.maxLimit = maxLimit;
+    }
+
+    public void clearData(){
+        if (ids != null)
+            ids.clear();
+        ids = null;
+    }
+
+    public boolean checkValid(){
+        if (!(total >= 0 && total <= getMaxLimit()))
+            return false;
+
+        if (total >= 0){
+            if (ids == null || total != ids.size()){
+                return false;
+            }
+        }
+        return true;
+    }
+}

+ 11 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPIntIdsSK.java

@@ -0,0 +1,11 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+
+public class JPIntIdsSK extends JPIdsSK<Integer> {
+    public JPIntIdsSK() {
+    }
+    public String toJsonStr(){
+        return FastJsonUtil.toJSON(this);
+    }
+}

+ 12 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPLongIdsSK.java

@@ -0,0 +1,12 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+
+public class JPLongIdsSK extends JPIdsSK<Long> {
+    public JPLongIdsSK() {
+    }
+    public String toJsonStr(){
+        return FastJsonUtil.toJSON(this);
+    }
+}
+

+ 47 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPOrderBy.java

@@ -0,0 +1,47 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.google.common.base.CaseFormat;
+import com.shkpr.service.warncore.commtools.CommTool;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+@Setter
+public class JPOrderBy {
+    private String sort = "";//desc或asc
+    private ArrayList<String> fields = null;
+
+    public JPOrderBy() {
+    }
+
+    public boolean checkValid(){
+        if (!StringUtils.isEmpty(sort)){
+            if (!"desc".equalsIgnoreCase(sort) && !"asc".equalsIgnoreCase(sort))
+                return false;
+            if (CommTool.listSize(fields) <= 0)
+                return false;
+        }
+        return true;
+    }
+
+    public String genOrderByStr(List<String> filter, String defaultValue){
+        StringBuilder result = new StringBuilder("");
+        if (!StringUtils.isEmpty(sort) && CommTool.listSize(filter) > 0){
+            int index = 0;
+            for (String temp:fields){
+                String changeField = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, temp);
+                if (!filter.contains(changeField))
+                    continue;
+
+                if (index++ > 0)
+                    result.append(",");
+                result.append(String.format("%s %s", changeField, sort));
+            }
+        }
+        return result.length()<=0?defaultValue:result.toString();
+    }
+}

+ 53 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPPageLO.java

@@ -0,0 +1,53 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+import com.shkpr.service.warncore.constants.CommDefine;
+import com.shkpr.service.warncore.controllervalid.CommonParamValidList;
+import com.shkpr.service.warncore.dto.TRecordRes;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.Range;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+@Getter
+@Setter
+public class JPPageLO {
+    @Range(min = 0, max = CommDefine.LIMIT_MAX, groups = {CommonParamValidList.class})
+    protected int limit = 20;
+
+    @Range(min = 0, max = Integer.MAX_VALUE, groups = {CommonParamValidList.class})
+    protected int offset = 0;
+
+    public JPPageLO() {
+    }
+
+    public String toJsonStr(){
+        return FastJsonUtil.toJSON(this);
+    }
+
+    public boolean checkValid(){
+        return true;
+    }
+
+    public String genJsonStrForResponse(TRecordRes<? extends Object> oRes){
+        String strResult = "";
+        Map<String, Object> mapData = new HashMap<>(16);
+        if (oRes != null && oRes.getCode() == 0){
+            mapData.put("total", oRes.getTotal());
+            mapData.put("limit", oRes.getData()!=null?oRes.getData().size():0);
+            mapData.put("data", oRes.getData()!=null?oRes.getData():(new ArrayList<Object>()));
+        }else{
+            mapData.put("total", 0);
+            mapData.put("limit", 0);
+            mapData.put("data", new ArrayList<Object>());
+        }
+
+        mapData.put("offset", offset);
+        strResult = FastJsonUtil.toJSON(mapData);
+        mapData.clear();
+        return strResult;
+    }
+}

+ 40 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPPageLOEx.java

@@ -0,0 +1,40 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+import com.shkpr.service.warncore.controllervalid.CommonParamValidList;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+@Getter
+@Setter
+public class JPPageLOEx extends JPPageLO {
+    @NotBlank(groups = { CommonParamValidList.class})
+    @Size(min = 1, max = 64, groups = { CommonParamValidList.class})
+    private String selfUser = "";
+
+    public JPPageLOEx() {
+        super();
+    }
+
+    @Override
+    public String toJsonStr(){
+        return FastJsonUtil.toJSON(this);
+    }
+
+    @Override
+    public boolean checkValid(){
+        return super.checkValid();
+    }
+
+    @Override
+    public String toString() {
+        return "{" +
+                "selfUser='" + selfUser + '\'' +
+                ", limit=" + limit +
+                ", offset=" + offset +
+                '}';
+    }
+}

+ 12 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPStrIdsSK.java

@@ -0,0 +1,12 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+
+public class JPStrIdsSK extends JPIdsSK<String> {
+    public JPStrIdsSK() {
+        super();
+    }
+    public String toJsonStr(){
+        return FastJsonUtil.toJSON(this);
+    }
+}

+ 26 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPZoneList.java

@@ -0,0 +1,26 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+
+@Setter
+@Getter
+public class JPZoneList {
+    private String userid = "0";
+    private String roleid = "";
+    private int base = 1;
+    private int withSite = 0; //是否获取相关联的站点基础信息列表
+    private int withOwn = 0; //是否获取自身的关注分区
+    private List<String> types = null;
+
+    public JPZoneList() {
+    }
+
+    public String toJsonStr() {
+        return FastJsonUtil.toJSON(this);
+    }
+}

+ 24 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPZoneSK.java

@@ -0,0 +1,24 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class JPZoneSK {
+    private String type = "";
+    private int total = 0;
+    private List<String> ids = null;
+    private int base = 1;
+    private int withSite = 0;
+
+    public JPZoneSK() {
+    }
+
+    public String toJsonStr() {
+        return FastJsonUtil.toJSON(this);
+    }
+}

+ 43 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPZoneSiteLinkSK.java

@@ -0,0 +1,43 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Getter
+@Setter
+public class JPZoneSiteLinkSK {
+    private String zoneType = "";   //分区主类型
+    private int byMode = -1;        //0 -- 通过分区获取站点;1 -- 通过站点获取分区
+    private String byUid = "";      //分区uid或站点uid
+    private int forBase = 0;        //0 -- 返回关联站点或分区的详情;1 -- 返回关联站点或分区的简要信息
+    private int withChild = 0;      //0 -- 不包括子节点;1 -- 包括子节点
+    private int fromLevel = 1;     //需要搜索的起始逻辑层级,取值范围可为[1, 65535]
+    private int toLevel = 65535;   //需要搜索的终止逻辑层级,取值范围可为[1, 65535]
+    private List<String> filterSubZoneType = null; //搜索结果中的子类型过滤条件
+    private List<String> filterUsage = null;
+    private String roleid = "";
+
+    public JPZoneSiteLinkSK() {
+    }
+
+    public Map<String, Object> toMapObj(){
+        if (filterSubZoneType == null)
+            filterSubZoneType = new ArrayList<>();
+        if (filterUsage == null)
+            filterUsage = new ArrayList<>();
+        return FastJsonUtil.obj2Map(this);
+    }
+
+    public String toJsonStr() {
+        if (filterSubZoneType == null)
+            filterSubZoneType = new ArrayList<>();
+        if (filterUsage == null)
+            filterUsage = new ArrayList<>();
+        return FastJsonUtil.toJSON(this);
+    }
+}

+ 23 - 0
src/main/java/com/shkpr/service/warncore/jsonbean/JPZoneTrees.java

@@ -0,0 +1,23 @@
+package com.shkpr.service.warncore.jsonbean;
+
+import com.global.base.tools.FastJsonUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class JPZoneTrees {
+    private String type = "";
+    private int byMode = 0;
+    private String uid = "";
+    private String roleid = "";
+    private int withSelf = 0;
+    private int onlyLeaf = 0;
+
+    public JPZoneTrees() {
+    }
+
+    public String toJsonStr() {
+        return FastJsonUtil.toJSON(this);
+    }
+}

+ 108 - 0
src/main/java/com/shkpr/service/warncore/services/CloudDataQeService.java

@@ -0,0 +1,108 @@
+package com.shkpr.service.warncore.services;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.global.base.tools.EncryptionUtil;
+import com.global.base.tools.FastJsonUtil;
+import com.global.base.tools.RandomUtil;
+import com.shkpr.service.warncore.constants.ApiURI;
+import com.shkpr.service.warncore.constants.LogFlagBusiType;
+import com.shkpr.service.warncore.dto.ResponseCode;
+import com.shkpr.service.warncore.dto.ResponseRes;
+import com.shkpr.service.warncore.globalcache.GlobalData;
+import com.shkpr.service.warncore.jsonbean.JPGetRegionData;
+import com.shkpr.service.warncore.jsonbean.JPStrIdsSK;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.remoting.RemoteAccessException;
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.PostConstruct;
+
+@Service
+public class CloudDataQeService {
+    final String MSG_SUCCESS = "success.";
+    final String MSG_FAILED = "failed.";
+    private String strClassName = "";
+
+    @SuppressWarnings("all")
+    @Autowired
+    @Qualifier("RestTemplateEx")
+    RestTemplate restTemplate;
+
+    @Value("${cloud.data.service.call.password:}")
+    private String mStrCallPassword = "";
+
+    @Value("${cloud.data.service.address:127.0.0.1}")
+    private String mStrAddress;
+
+    private String mSiteLastMapDataPath = "";
+    private String mSiteRegionDataPath = "";
+    private HttpHeaders headers = null;
+
+    @PostConstruct
+    public void init(){
+        strClassName = this.getClass().getSimpleName();
+        mStrCallPassword = EncryptionUtil.MD5Hash(StringUtils.isEmpty(mStrCallPassword)? RandomUtil.getRandomStr(8):mStrCallPassword);
+        if (!mStrAddress.endsWith("/"))
+            mStrAddress += "/";
+        mSiteLastMapDataPath = String.format("%s%s", mStrAddress, "v3/stats/site-data/last-map-show-group");
+        mSiteRegionDataPath = String.format("%s%s", mStrAddress, "v3/stats/site-data/regions-group");
+
+        headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
+        headers.add(ApiURI.HEADER_CLIENT_TYPE, GlobalData.getInstance().getServerId());
+        headers.add(ApiURI.HEADER_USER_AGENT, "Linux");
+        headers.add(ApiURI.HEADER_AUTH_VERIFY,mStrCallPassword);
+    }
+
+    @Retryable(value = {RemoteAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 200L, multiplier = 1))
+    public ResponseRes<String> siteLastMapData(final JPStrIdsSK jsonParam) throws Exception{
+        ResponseRes<String> resResult = new ResponseRes<String>();
+        resResult.setRescode(ResponseCode.RESULT_BAD.toStrCode());
+        resResult.setResmsg(MSG_FAILED);
+        resResult.setResdata("");
+
+        HttpEntity<String> request = new HttpEntity<>(jsonParam.toJsonStr(), headers);
+        try {
+            ResponseEntity<String> response = restTemplate.postForEntity(mSiteLastMapDataPath, request, String.class);
+            if (response.getStatusCode() == HttpStatus.OK){
+                String strBody = response.getBody();
+                return FastJsonUtil.fromJSONByGson(strBody, ResponseRes.class);
+            }
+        }catch (Exception e){
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, LogFlagBusiType.BUSI_CALL_DATA_QE_AS.toStrValue(), strClassName, String.format("siteLastMapData from CloudDataQeService(url:%s) failed(%s)...", mSiteLastMapDataPath, e.getMessage()));
+            //达到maxAttempts次数将返回RemoteAccessException
+            throw new RemoteAccessException("Retry...");
+        }
+        return resResult;
+    }
+
+    @Retryable(value = {RemoteAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 200L, multiplier = 1))
+    public ResponseRes<String> siteRegionData(final JPGetRegionData jsonParam) throws Exception{
+        ResponseRes<String> resResult = new ResponseRes<String>();
+        resResult.setRescode(ResponseCode.RESULT_BAD.toStrCode());
+        resResult.setResmsg(MSG_FAILED);
+        resResult.setResdata("");
+
+        HttpEntity<String> request = new HttpEntity<>(jsonParam.toJsonStr(), headers);
+        try {
+            ResponseEntity<String> response = restTemplate.postForEntity(mSiteRegionDataPath, request, String.class);
+            if (response.getStatusCode() == HttpStatus.OK){
+                String strBody = response.getBody();
+                return FastJsonUtil.fromJSONByGson(strBody, ResponseRes.class);
+            }
+        }catch (Exception e){
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, LogFlagBusiType.BUSI_CALL_DATA_QE_AS.toStrValue(), strClassName, String.format("siteRegionData from CloudDataQeService(url:%s) failed(%s)...", mSiteRegionDataPath, e.getMessage()));
+            //达到maxAttempts次数将返回RemoteAccessException
+            throw new RemoteAccessException("Retry...");
+        }
+        return resResult;
+    }
+}

+ 5 - 0
src/main/java/com/shkpr/service/warncore/services/ServiceMgrProxy.java

@@ -4,6 +4,7 @@ import com.shkpr.service.warncore.SpringContextUtil;
 
 public class ServiceMgrProxy {
     private volatile CloudBaseService baseService = null;
+    private volatile CloudDataQeService dataQeService = null;
     private static volatile ServiceMgrProxy msInstance = null;
     public static ServiceMgrProxy getInstance(){
         if (msInstance == null){
@@ -21,7 +22,11 @@ public class ServiceMgrProxy {
     public void init(){
         if (baseService == null)
             baseService = (CloudBaseService) SpringContextUtil.getBean(CloudBaseService.class);
+        if (dataQeService == null)
+            dataQeService = (CloudDataQeService) SpringContextUtil.getBean(CloudDataQeService.class);
     }
 
     public CloudBaseService applyBaseServiceApi() { return baseService; }
+
+    public CloudDataQeService applyDataQeServiceApi() { return dataQeService; }
 }