Browse Source

对接分析类预警逻辑

andyliu 3 weeks ago
parent
commit
fc1ba0b049

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

@@ -10,10 +10,53 @@ import com.shkpr.service.warncore.dto.OrdWarnRuleCondition;
 import com.shkpr.service.warncore.dto.ResponseCode;
 import org.springframework.util.StringUtils;
 
+import java.text.NumberFormat;
 import java.util.List;
 import java.util.Map;
 
 public class CommToolHandler {
+    public static NumberFormat NF_DOUBLE;
+    public static NumberFormat NF_DOUBLE_FOR_REPORT;
+    static {
+        NF_DOUBLE = NumberFormat.getInstance();
+        NF_DOUBLE.setMaximumFractionDigits(4);//最大保留4位小数
+        NF_DOUBLE.setMinimumFractionDigits(1);//最小保留1位小数
+        NF_DOUBLE.setGroupingUsed(false);   // 取消科学计数法
+
+        NF_DOUBLE_FOR_REPORT = NumberFormat.getInstance();
+        NF_DOUBLE_FOR_REPORT.setMaximumFractionDigits(2);//最大保留2位小数
+        NF_DOUBLE_FOR_REPORT.setMinimumFractionDigits(1);//最小保留1位小数
+        NF_DOUBLE_FOR_REPORT.setGroupingUsed(false);   // 取消科学计数法
+    }
+
+    public static String toShortStrDataForReport(double data){//double默认总是为科学计数法,而BigDecimal因存储为字符串,故可避免此情况
+        try {
+            return NF_DOUBLE_FOR_REPORT.format(data);
+        }catch (Exception e){}
+        return String.valueOf(data);
+    }
+
+    public static double toShortDataForReport(double data){
+        try {
+            return Double.valueOf(NF_DOUBLE_FOR_REPORT.format(data));
+        }catch (Exception e){}
+        return data;
+    }
+
+    public static String toShortStrData(double data){//double默认总是为科学计数法,而BigDecimal因存储为字符串,故可避免此情况
+        try {
+            return NF_DOUBLE.format(data);
+        }catch (Exception e){}
+        return String.valueOf(data);
+    }
+
+    public static double toShortData(double data){
+        try {
+            return Double.valueOf(NF_DOUBLE.format(data));
+        }catch (Exception e){}
+        return data;
+    }
+
     private static OrdWarnEventInfoDBService getOrdWarnEventDBService(){
         return DBMgrProxy.getInstance().applyXXXApi(OrdWarnEventInfoDBService.class);
     }
@@ -33,7 +76,13 @@ public class CommToolHandler {
             return 0;
         int matched = -1;
         try {
-            int nRes = CommTool.compareFloat(originValue, condition.getThreshold());
+            int nRes = 0;
+            if ("int".equals(condition.getType())
+                    || "integer".equals(condition.getType())
+                    || "long".equals(condition.getType()))
+                nRes = CommTool.compareNumber(originValue, condition.getThreshold());
+            else
+                nRes = CommTool.compareFloat(originValue, condition.getThreshold());
             if (nRes == 0){
                 if ("!=".equals(condition.getMethod())){
                     matched = 0;

+ 103 - 10
src/main/java/com/shkpr/service/warncore/bizhandler/ZoneDataWarnHandler.java

@@ -2,14 +2,13 @@ package com.shkpr.service.warncore.bizhandler;
 
 import com.global.base.log.LogLevelFlag;
 import com.global.base.log.LogPrintMgr;
+import com.global.base.tools.CastUtil;
 import com.global.base.tools.FastJsonUtil;
 import com.shkpr.service.warncore.commtools.CommTool;
 import com.shkpr.service.warncore.commtools.TimeTool;
-import com.shkpr.service.warncore.constants.CommFieldStatus;
-import com.shkpr.service.warncore.constants.EventAction;
-import com.shkpr.service.warncore.constants.FrequencyUnit;
-import com.shkpr.service.warncore.constants.LogFlagBusiType;
+import com.shkpr.service.warncore.constants.*;
 import com.shkpr.service.warncore.dbdao.DBMgrProxy;
+import com.shkpr.service.warncore.dbdao.services.intef.MixDataBizDBService;
 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.OrdWarnEventInfoTable;
@@ -19,6 +18,7 @@ import com.shkpr.service.warncore.dto.*;
 import com.shkpr.service.warncore.jsonbean.JPOrdWarnEventInfo;
 import org.springframework.util.StringUtils;
 
+import java.sql.Timestamp;
 import java.util.*;
 
 /**
@@ -37,6 +37,10 @@ public class ZoneDataWarnHandler {
         return DBMgrProxy.getInstance().applyXXXApi(OrdWarnPlanRulesDBService.class);
     }
 
+    private static MixDataBizDBService getMixDataDBService(){
+        return DBMgrProxy.getInstance().applyXXXApi(MixDataBizDBService.class);
+    }
+
     public static ResponseCode handlerDataFun(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules){
         ResponseCode code = ResponseCode.RESULT_NORMAL;
         switch (planDetail.getFrequencyUnit()){
@@ -188,6 +192,7 @@ public class ZoneDataWarnHandler {
         return code;
     }
 
+    //当月只分析前一月的数据
     private static ResponseCode pickWarnByMonth(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules){
         ResponseCode code = ResponseCode.RESULT_NORMAL;
         String step = "Start to pre analysis.";
@@ -205,7 +210,7 @@ public class ZoneDataWarnHandler {
         final int preMonth = TimeTool.getMonthIndex(lastMonthThisTm);//月分析时,分析前一月
         final int preMonthInYear = TimeTool.getYearIndex(lastMonthThisTm);//月分析时,分析前一月所在的年份
         long queryBeginUTC = 0L, conditionMinUTC = 0L;
-        long queryEndUTC = TimeTool.getMonthBeginUTC(curUTCTm);
+        long queryEndUTC = TimeTool.getMonthBeginUTC(curUTCTm)-TimeTool.MS_ONE_SEC;
         OrdWarnPlanTempStep thisStepTempRes = new OrdWarnPlanTempStep(planDetail);
         thisStepTempRes.setLastAnalyTime(curUTCTm);
         thisStepTempRes.setCompareTimes(planDetail.getCompareTimes()+1);
@@ -304,6 +309,7 @@ public class ZoneDataWarnHandler {
         return code;
     }
 
+    //当日只分析前一日的数据
     public static ResponseCode pickWarnByDay(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules){
         ResponseCode code = ResponseCode.RESULT_NORMAL;
         String step = "Start to pre analysis.";
@@ -320,7 +326,7 @@ public class ZoneDataWarnHandler {
         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 = TimeTool.getTodayBeginUTC();
+        long queryEndUTC = TimeTool.getTodayBeginUTC()-TimeTool.MS_ONE_SEC;
         OrdWarnPlanTempStep thisStepTempRes = new OrdWarnPlanTempStep(planDetail);
         thisStepTempRes.setLastAnalyTime(curUTCTm);
         thisStepTempRes.setCompareTimes(planDetail.getCompareTimes()+1);
@@ -438,15 +444,19 @@ public class ZoneDataWarnHandler {
 
         do {
             final String doField = rules.get(0).getConditions().get(0).getFormat();
+            final String metricId = rules.get(0).getConditions().get(0).getKey();
+            final String fieldUnit = rules.get(0).getConditions().get(0).getUnit();
             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()
+            TRecordRes<DateKeyValue> sampleRes = getSampleDataFromDB(fieldUnit
+                        , planDetail.getFrequencyUnit()
+                        , planDetail.getItemKey()
                         , zoneId, thisTempStep.getQueryBeginUTC(), thisTempStep.getQueryEndUTC()
-                        , planDetail.getDoDb(), doField, planDetail.getDoTime());
+                        , metricId , planDetail.getDoDb(), doField, planDetail.getDoTime());
             if (sampleRes != null && sampleRes.getCode() == ResponseCode.RESULT_NORMAL.toInt()){
                 zoneStatsData = sampleRes.getData();
             }
@@ -788,9 +798,88 @@ public class ZoneDataWarnHandler {
         return code;
     }
 
-    private static TRecordRes<DateKeyValue> getSampleDataFromDB(String itemKey, String objId, long beginTm, long endTm, String doDb, String doField, String doTime){
+    public static TRecordRes<DateKeyValue> getSampleDataFromDB(String fieldUnit, String frequencyUnit, String itemKey, String objId, long beginTm, long endTm, String metricId, String doDb, String doField, String doTime){
+        TRecordRes<DateKeyValue> oRes = new TRecordRes<>(ResponseCode.RESULT_BAD.toInt());
         String[] storeDbAndTable = doDb.split("@");
         String[] storeFieldAndBackField = doField.split("@");
+        String doTimeFunction = doTime.replaceAll("\\(.*\\)", "");
+        String doTimeField = doTime.replaceAll("^.*\\(|\\)", "");
+
+        String orderBy = String.format(" %s asc", doTimeField);
+        String queryField = String.format("zone_id,'%s' as key,%s as date"
+                , storeFieldAndBackField[1]
+                , doTimeField);
+        if ("%".equals(fieldUnit)){
+            queryField += String.format(",COALESCE(%s, 0)*100 as value", storeFieldAndBackField[0]);
+        }else
+            queryField += String.format(",COALESCE(%s, 0) as value", storeFieldAndBackField[0]);
+
+        StringBuilder filterExtend = new StringBuilder("");
+        switch (itemKey){
+            case WarnItemType.ZONE_HWO:{//小时水量,存储的是累计流量:(n+1)点-(n)点=(n)点水量,故分区水量要将endTm += TimeTool.MS_ONE_HOUR;然后再查询
+                endTm = TimeTool.getNextRoundHourUTCTm(endTm);
+                filterExtend.append(String.format(" AND EXTRACT(MINUTE FROM %s) = 0 AND EXTRACT(SECOND FROM %s) = 0 ", doTimeField, doTimeField));
+            }
+            break;
+            default:
+                break;
+        }
+
+        switch (doTimeFunction){
+            case "timestamp":{
+                filterExtend.append(String.format(" AND %s >= to_timestamp(%d) AND %s <= to_timestamp(%d)"
+                        , doTimeField, beginTm/1000
+                        , doTimeField, endTm/1000));
+            }
+            break;
+            case "date":{
+                filterExtend.append(String.format(" AND %s >= '%s' AND %s <= '%s'"
+                        , doTimeField, TimeTool.convertUTC2DateStr(beginTm, TimeTool.YEAR_MONTH_DAY_FORMAT)
+                        , doTimeField, TimeTool.convertUTC2DateStr(endTm, TimeTool.YEAR_MONTH_DAY_FORMAT)));
+            }
+            break;
+            default:{
+                filterExtend.append(String.format(" AND %s >= '%s' AND %s <= '%s'"
+                                    , doTimeField, TimeTool.convertUTC2DateStr(beginTm, TimeTool.YEAR_MONTH_DAY_FORMAT)
+                                    , doTimeField, TimeTool.convertUTC2DateStr(endTm, TimeTool.YEAR_MONTH_DAY_FORMAT)));
+            }
+            break;
+        }
+
+        List<Map<String, Object>> arrDbs = getMixDataDBService().batchQueryL2L3Data(storeDbAndTable[1]
+                                , queryField
+                                , new HashMap<String, Object>(){{
+                                    put("zone_id", objId);
+                                    put("metric_id", metricId);}}
+                                , null, orderBy, filterExtend.toString());
+        if (arrDbs == null) {
+            oRes.setCode(ResponseCode.BUSINESS_DB_ERROR.toInt());
+            return oRes;
+        }
+
+        List<DateKeyValue> arrRecordRes = null;
+        do {
+            if (arrDbs.size() <= 0)
+                break;
+
+            if (WarnItemType.ZONE_HWO.equals(itemKey)){
+                if (CommTool.listSize(arrDbs) < 2)
+                    break;
+
+                arrRecordRes =  new ArrayList<>();
+                for (int i=0;i<arrDbs.size()-1;i++){
+                    long thisTm = ((Timestamp)(arrDbs.get(i).get("date"))).getTime();
+                    long nextTm = ((Timestamp)(arrDbs.get(i+1).get("date"))).getTime();
+                    double thisValue = CastUtil.castDouble(arrDbs.get(i).get("value"), 0.0);
+                    double nextValue = CastUtil.castDouble(arrDbs.get(i+1).get("value"), 0.0);
+                    if (thisTm == (nextTm-TimeTool.MS_ONE_HOUR)){
+                        arrRecordRes.add(new DateKeyValue(storeFieldAndBackField[1], CommToolHandler.toShortStrData(nextValue-thisValue)
+                                , TimeTool.convertUTC2DateStr(thisTm, TimeTool.TIMESTAMP_FORMAT)));
+                    }
+                }
+            }else
+                arrRecordRes = FastJsonUtil.batchMap2Obj(arrDbs, DateKeyValue.class);
+        }while (false);
 
         /**小时水量,存储的是累计流量:(n+1)点-(n)点=(n)点水量,故分区水量要将endTm += TimeTool.MS_ONE_HOUR;然后再查询
          * SELECT
@@ -806,6 +895,10 @@ public class ZoneDataWarnHandler {
          * 		  AND EXTRACT(SECOND FROM ts) = 0
          * 		ORDER BY zone_id, ts
          */
-        return null;
+        arrDbs.clear();
+        oRes.setData(arrRecordRes);
+        oRes.setCode(ResponseCode.RESULT_NORMAL.toInt());
+        oRes.checkRes();
+        return oRes;
     }
 }

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

@@ -245,6 +245,14 @@ public class CommTool {
                 || CommDefine.INTERNAL_OPERATOR_ROLE_ID.equals(roleId);
     }
 
+    public static int compareNumber(String oneValue, String twoValue) throws Exception{
+        try {
+            return Integer.compare(Integer.parseInt(oneValue), Integer.parseInt(twoValue));
+        }catch (Exception e){
+            throw e;
+        }
+    }
+
     public static int compareFloat(String oneValue, String twoValue) throws Exception{
         try {
             return new BigDecimal(oneValue).compareTo(new BigDecimal(twoValue));

+ 56 - 0
src/main/java/com/shkpr/service/warncore/commtools/TimeTool.java

@@ -581,4 +581,60 @@ public class TimeTool {
                 .atZone(ZoneId.of("UTC"));
         return Math.abs(ChronoUnit.MONTHS.between(date1, date2));
     }
+
+    //08:00:01-->07:00:00
+    //08:00:00-->07:00:00
+    public static long getLastRoundHourUTCTm(long timeMs){
+        if (!isMsUTC(timeMs))
+            return timeMs;
+
+        return Instant.ofEpochMilli(timeMs)
+                .atZone(ZoneId.systemDefault())
+                .truncatedTo(ChronoUnit.HOURS)
+                .minusHours(1)
+                .toInstant()
+                .toEpochMilli();
+    }
+
+    //08:00:01-->09:00:00
+    //08:00:00-->09:00:00
+    public static long getNextRoundHourUTCTm(long timeMs){
+        if (!isMsUTC(timeMs))
+            return timeMs;
+
+        return Instant.ofEpochMilli(timeMs)
+                .atZone(ZoneId.systemDefault())
+                .truncatedTo(ChronoUnit.HOURS)
+                .plusHours(1)
+                .toInstant()
+                .toEpochMilli();
+    }
+
+    //2012-12-12 08:00:01-->2012-12-13 00:00:00
+    //2012-12-12 00:00:00-->2012-12-13 00:00:00
+    public static long getNextDayStartUTCTm(long timeMs) {
+        if (!isMsUTC(timeMs))
+            return timeMs;
+
+        return Instant.ofEpochMilli(timeMs)
+                .atZone(ZoneId.systemDefault())
+                .truncatedTo(ChronoUnit.DAYS)
+                .plusDays(1)
+                .toInstant()
+                .toEpochMilli();
+    }
+
+    //2012-12-12 08:00:01-->2012-12-11 00:00:00
+    //2012-12-12 00:00:00-->2012-12-11 00:00:00
+    public static long getLastDayStartUTCTm(long timeMs) {
+        if (!isMsUTC(timeMs))
+            return timeMs;
+
+        return Instant.ofEpochMilli(timeMs)
+                .atZone(ZoneId.systemDefault())
+                .truncatedTo(ChronoUnit.DAYS)
+                .minusDays(1)
+                .toInstant()
+                .toEpochMilli();
+    }
 }

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

@@ -27,6 +27,7 @@ public enum  LogFlagBusiType {
     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_DB_ORD_WARN_EVENT_INFO(105,"DB Ord Warn Event Info"),
+    BUSI_DB_MIX_DATA(106,"DB Mix Data"),
 
     BUSI_INFLUX_DB_DEV_RECORD(200,"Influx DB Dev Record"),
 

+ 5 - 0
src/main/java/com/shkpr/service/warncore/constants/WarnItemType.java

@@ -0,0 +1,5 @@
+package com.shkpr.service.warncore.constants;
+
+public interface WarnItemType {
+    String ZONE_HWO = "analy@zwo@zhwo";//分区小时水量
+}

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

@@ -12,6 +12,7 @@ public class DBMgrProxy {
         add(OrdWarnPlanInfoDBService.class);
         add(OrdWarnPlanRulesDBService.class);
         add(OrdWarnEventInfoDBService.class);
+        add(MixDataBizDBService.class);
     }};
     private Map<Class<?>, Object> mapClass2Instance = new ConcurrentHashMap<>();
 

+ 31 - 0
src/main/java/com/shkpr/service/warncore/dbdao/mapper/MixDataBizMapper.java

@@ -0,0 +1,31 @@
+package com.shkpr.service.warncore.dbdao.mapper;
+
+import com.shkpr.service.warncore.dbdao.providers.MixDataBizSqlProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Result;
+import org.apache.ibatis.annotations.Results;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.apache.ibatis.type.JdbcType;
+
+import java.util.List;
+import java.util.Map;
+
+public interface MixDataBizMapper {
+    @SelectProvider(type = MixDataBizSqlProvider.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);
+
+    @Results({
+            @Result(property = "date", column = "date", javaType = String.class ,jdbcType = JdbcType.DATE),
+            @Result(property = "stat_date", column = "stat_date", javaType = String.class ,jdbcType = JdbcType.DATE)
+    })
+    @SelectProvider(type = MixDataBizSqlProvider.class, method = "batchQueryWiths")
+    List<Map<String, Object>> batchQueryL2L3Data(@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);
+}

+ 50 - 0
src/main/java/com/shkpr/service/warncore/dbdao/providers/MixDataBizSqlProvider.java

@@ -0,0 +1,50 @@
+package com.shkpr.service.warncore.dbdao.providers;
+
+public class MixDataBizSqlProvider extends BaseSqlProvider{
+    @Override
+    public String getRTableName() {
+        return "";
+    }
+
+    @Override
+    public String getWTableName() {
+        return "";
+    }
+
+    @Override
+    public String getRUniqueId() {
+        return "id";
+    }
+
+    @Override
+    public String getWUniqueId() {
+        return "id";
+    }
+
+    @Override
+    public String getSAllFiled() {
+        return "*";
+    }
+
+    @Override
+    public String getRPrimaryKey() {
+        return "id";
+    }
+
+    @Override
+    public String getWPrimaryKey() {
+        return "id";
+    }
+
+    @Override
+    public boolean isWJsonForFiled(String filedName) {
+        return false;
+    }
+
+    @Override
+    protected boolean isWTimeForFiled(String filedName) {
+        if (filedName.endsWith("time") || "ts".equalsIgnoreCase(filedName))
+            return true;
+        return super.isWTimeForFiled(filedName);
+    }
+}

+ 122 - 0
src/main/java/com/shkpr/service/warncore/dbdao/services/MixDataBizDBServiceImpl.java

@@ -0,0 +1,122 @@
+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.MixDataBizMapper;
+import com.shkpr.service.warncore.dbdao.services.intef.MixDataBizDBService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class MixDataBizDBServiceImpl implements MixDataBizDBService {
+    private String mStrClassName = "";
+    private String mBusinessType = "";
+    private String logTag = "";
+    public MixDataBizDBServiceImpl() {
+        mStrClassName = this.getClass().getSimpleName();
+        mBusinessType = LogFlagBusiType.BUSI_DB_MIX_DATA.toStrValue();
+        logTag = "Mix Data Biz";
+    }
+
+    @SuppressWarnings("all")
+    @Autowired
+    MixDataBizMapper mixDataBizMapper;
+
+    @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 List<Map<String, Object>> batchQueryWithsEx(String table, String filed, 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 = mixDataBizMapper.batchQueryWiths(table, filed, 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;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryL2L3Data(String table, String filed, 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 = mixDataBizMapper.batchQueryL2L3Data(table, filed, 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 L2L3 Data Lines:{andWhere.size=%d, orWhere.size=%d, orderBy=%s, extend=%s, back.size=%d} from database, code:{%d} msg:{%s} ..."
+                            , CommTool.mapSize(andWheres)
+                            , CommTool.mapSize(orWheres)
+                            , orderBy, extend
+                            , CommTool.listSize(arrRes)
+                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+}

+ 18 - 0
src/main/java/com/shkpr/service/warncore/dbdao/services/intef/MixDataBizDBService.java

@@ -0,0 +1,18 @@
+package com.shkpr.service.warncore.dbdao.services.intef;
+
+import java.util.List;
+import java.util.Map;
+
+public interface MixDataBizDBService extends BaseDBService{
+    List<Map<String, Object>> batchQueryWithsEx(String table, String filed
+            , Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String orderBy
+            , String extend);
+
+    List<Map<String, Object>> batchQueryL2L3Data(String table, String filed
+            , Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String orderBy
+            , String extend);
+}

+ 5 - 0
src/main/java/com/shkpr/service/warncore/dto/DateKeyValue.java

@@ -11,4 +11,9 @@ public class DateKeyValue extends KeyValue{
     public DateKeyValue() {
         super();
     }
+
+    public DateKeyValue(String key, String value, String date) {
+        super(key, value);
+        this.date = date;
+    }
 }

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

@@ -11,4 +11,9 @@ public class KeyValue {
 
     public KeyValue() {
     }
+
+    public KeyValue(String key, String value) {
+        this.key = key;
+        this.value = value;
+    }
 }