Просмотр исходного кода

新增AI风险评估预警项逻辑

andyliu недель назад: 2
Родитель
Сommit
edd807ba45

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

@@ -145,10 +145,10 @@ public class CommToolHandler {
         return code;
     }
 
-    public static String genUnionEventRemark(String zoneName, String itemName, long sampleDataTime){
+    public static String genUnionEventRemark(String eventPrefix, String zoneName, String itemName, long sampleDataTime){
         if (StringUtils.isEmpty(zoneName) || StringUtils.isEmpty(itemName) || sampleDataTime <= 0L)
             return "";
-        StringBuilder remark = new StringBuilder(zoneName);
+        StringBuilder remark = new StringBuilder(StringUtils.isEmpty(eventPrefix)?String.format("【%s】",zoneName):eventPrefix);
         remark.append("于")
                 .append(TimeTool.convertUTC2DateStr(sampleDataTime, TimeTool.TIMESTAMP_FORMAT))
                 .append("因数据异常,触发了");

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

@@ -447,6 +447,7 @@ public class ZoneDataWarnHandler {
             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();
+            final String threshold = rules.get(0).getConditions().get(0).getThreshold();
             String[] storeTagAndBackTag = doField.split("@");
             if (storeTagAndBackTag == null || storeTagAndBackTag.length < 2){
                 step = String.format("Format param invalid in rules");
@@ -457,7 +458,7 @@ public class ZoneDataWarnHandler {
                         , planDetail.getFrequencyUnit()
                         , planDetail.getItemKey()
                         , zoneId, thisTempStep.getQueryBeginUTC(), thisTempStep.getQueryEndUTC()
-                        , metricId , planDetail.getDoDb(), doField, planDetail.getDoTime());
+                        , metricId , threshold, planDetail.getDoDb(), doField, planDetail.getDoTime());
             if (sampleRes != null && sampleRes.getCode() == ResponseCode.RESULT_NORMAL.toInt()){
                 zoneStatsData = sampleRes.getData();
             }
@@ -478,6 +479,7 @@ public class ZoneDataWarnHandler {
                 if (sampleRecordTm <= 0L)
                     continue;
 
+                final String eventPrefix = sampleItem.getRemark();
                 boolean matched = false;
                 OrdWarnPlanRules findRule = null;
                 int sampleRecordTmUnit = TimeTool.getMonthIndex(sampleRecordTm);
@@ -545,7 +547,7 @@ public class ZoneDataWarnHandler {
                         thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
                         thisTempStep.setLastCompareSampleExplain(step);
 
-                        JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
+                        JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime(), eventPrefix);
                         newEvent2Gen.put(newEvent.getUid(), newEvent);
                         thisTempStep.setLastEventId(newEvent.getUid());
                         thisTempStep.setLastEventAction(newEvent.getAction());
@@ -581,7 +583,7 @@ public class ZoneDataWarnHandler {
                         thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
                         thisTempStep.setLastCompareSampleExplain(step);
 
-                        JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
+                        JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime(), eventPrefix);
                         newEvent2Gen.put(newEvent.getUid(), newEvent);
                         thisTempStep.setLastEventId(newEvent.getUid());
                         thisTempStep.setLastEventAction(newEvent.getAction());
@@ -614,7 +616,7 @@ public class ZoneDataWarnHandler {
                             thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
                             thisTempStep.setLastCompareSampleExplain(step);
 
-                            JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
+                            JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime(), eventPrefix);
                             newEvent2Gen.put(newEvent.getUid(), newEvent);
                             thisTempStep.setLastEventId(newEvent.getUid());
                             thisTempStep.setLastEventAction(newEvent.getAction());
@@ -658,7 +660,7 @@ public class ZoneDataWarnHandler {
                                 thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
                                 thisTempStep.setLastCompareSampleExplain(step);
 
-                                JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
+                                JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime(), eventPrefix);
                                 newEvent2Gen.put(newEvent.getUid(), newEvent);
                                 thisTempStep.setLastEventId(newEvent.getUid());
                                 thisTempStep.setLastEventAction(newEvent.getAction());
@@ -681,7 +683,7 @@ public class ZoneDataWarnHandler {
                         thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
                         thisTempStep.setLastCompareSampleExplain(step);
 
-                        JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
+                        JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime(), eventPrefix);
                         newEvent2Gen.put(newEvent.getUid(), newEvent);
                         thisTempStep.setLastEventId(newEvent.getUid());
                         thisTempStep.setLastEventAction(newEvent.getAction());
@@ -709,7 +711,7 @@ public class ZoneDataWarnHandler {
                             thisTempStep.setLastEventTime(TimeTool.getCurMsUTC());
                             thisTempStep.setLastCompareSampleExplain(step);
 
-                            JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime());
+                            JPOrdWarnEventInfo newEvent = new JPOrdWarnEventInfo(planDetail, rules, thisTempStep, thisTempStep.getLastEventTime(), eventPrefix);
                             newEvent2Gen.put(newEvent.getUid(), newEvent);
                             thisTempStep.setLastEventId(newEvent.getUid());
                             thisTempStep.setLastEventAction(newEvent.getAction());
@@ -799,7 +801,7 @@ public class ZoneDataWarnHandler {
         return code;
     }
 
-    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){
+    public static TRecordRes<DateKeyValue> getSampleDataFromDB(String fieldUnit, String frequencyUnit, String itemKey, String objId, long beginTm, long endTm, String metricId, String threshold, String doDb, String doField, String doTime){
         TRecordRes<DateKeyValue> oRes = new TRecordRes<>(ResponseCode.RESULT_BAD.toInt());
         String desTable = doDb.split("@")[1];
         String storeField = doField.split("@")[0];
@@ -884,6 +886,13 @@ public class ZoneDataWarnHandler {
                         , filterExtend.toString());
             }
             break;
+            case WarnItemType.RBI:{
+                arrDbs = getMixDataDBService().batchQueryRbiRankData(desTable
+                        , objId
+                        , threshold
+                        , filterExtend.toString());
+            }
+            break;
             default:{
                 arrDbs = getMixDataDBService().batchQueryL2L3Data(desTable
                         , queryField
@@ -919,6 +928,23 @@ public class ZoneDataWarnHandler {
                                 , TimeTool.convertUTC2DateStr(thisTm, TimeTool.TIMESTAMP_FORMAT)));
                     }
                 }
+            }else if (WarnItemType.RBI.equals(itemKey)){
+                arrRecordRes = new ArrayList<>();
+                Map<String, String> date2ZoneNames = new HashMap<>();
+                for (Map<String, Object> itemDb:arrDbs){
+                    String date = (String)itemDb.get("date");
+                    String zoneName = (String)itemDb.get("zone_name");
+                    String oldZone = date2ZoneNames.getOrDefault(date,"");
+                    if (!StringUtils.isEmpty(oldZone))
+                        oldZone += "、";
+                    date2ZoneNames.put(date, oldZone+String.format("【%s】",zoneName));
+                }
+                for (Map.Entry<String,String> entry:date2ZoneNames.entrySet()){
+                    arrRecordRes.add(new DateKeyValue(backField
+                                        , threshold
+                                        , entry.getValue()
+                                        , entry.getKey()));
+                }
             }else
                 arrRecordRes = FastJsonUtil.batchMap2Obj(arrDbs, DateKeyValue.class);
         }while (false);

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

@@ -4,4 +4,5 @@ public interface WarnItemType {
     String ZONE_HWO = "analy@zwo@zhwo";//分区小时水量
     String LMNF = "analy@mnf@lmnf";
     String MNF_ADF = "analy@mnf@mnf_adf";
+    String RBI = "analy@rbi@rbi";
 }

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

@@ -53,4 +53,15 @@ public interface MixDataBizMapper {
             , @Param("zoneId") String zoneId
             , @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),
+            @Result(property = "stat_month", column = "stat_month", javaType = String.class ,jdbcType = JdbcType.DATE)
+    })
+    @SelectProvider(type = MixDataBizSqlProvider.class, method = "batchQueryRbiRankData")
+    List<Map<String, Object>> batchQueryRbiRankData(@Param("table") String table
+            , @Param("zoneId") String zoneId
+            , @Param("rankRate") String rankRate
+            , @Param("extend") String extend);
 }

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

@@ -91,4 +91,41 @@ public class MixDataBizSqlProvider extends BaseSqlProvider{
             sql.append(" ORDER BY " + orderBy);
         return sql.toString();
     }
+
+    public String batchQueryRbiRankData(Map<String, Object> mapParams){
+        String table = (String)mapParams.get("table");
+        String zoneId = (String)mapParams.get("zoneId");
+        String extend = safePickParam(mapParams, "extend", "");
+        String rankRate = (String)mapParams.get("rankRate");
+
+        StringBuilder zoneInfo = new StringBuilder("zone_info AS(select uid,name from k2_zone_info where type = 'all' and sub_type = 'dma')");
+        StringBuilder rank1 = new StringBuilder("rank1 AS(SELECT stat_month,zone_id,final_value," +
+                " ROW_NUMBER() OVER (PARTITION BY stat_month ORDER BY final_value DESC) as rank_pos" +
+                " FROM " + table);
+        rank1.append(" where metric_id = 'wb_mnf_monthly_avg' ");
+        if (!StringUtils.isEmpty(extend))
+            rank1.append(" " + extend);
+        rank1.append(")");
+
+        StringBuilder rank2 = new StringBuilder("rank2 AS(SELECT stat_month,zone_id,final_value," +
+                " ROW_NUMBER() OVER (PARTITION BY stat_month ORDER BY final_value DESC) as rank_pos" +
+                " FROM " + table);
+        rank2.append(" where metric_id = 'wb_no_rev_diff' ");
+        if (!StringUtils.isEmpty(extend))
+            rank2.append(" " + extend);
+        rank2.append(")");
+
+        StringBuilder sql = new StringBuilder(String.format(" WITH %s,%s,%s ",zoneInfo,rank1,rank2));
+        sql.append("select aa.zone_id,");
+        sql.append("COALESCE(cc.name, '未知'::character varying) AS zone_name,");
+        sql.append("aa.stat_month as date,");
+        sql.append(String.format("'%s' as value",rankRate));
+        sql.append(" from rank1 aa join rank2 bb on ");
+        sql.append(" aa.stat_month = bb.stat_month and aa.zone_id = bb.zone_id");
+        sql.append(" join zone_info cc ON aa.zone_id = cc.uid");
+        sql.append(" where aa.rank_pos <= (SELECT CEIL((count(*)*"+rankRate+"*1.0)/100)::INT FROM zone_info)");
+        sql.append(" and bb.rank_pos <= (SELECT CEIL((count(*)*"+rankRate+"*1.0)/100)::INT FROM zone_info)");
+        sql.append(" ORDER BY aa.stat_month asc");
+        return sql.toString();
+    }
 }

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

@@ -165,4 +165,27 @@ public class MixDataBizDBServiceImpl implements MixDataBizDBService {
         }
         return arrRes;
     }
+
+    @Override
+    public List<Map<String, Object>> batchQueryRbiRankData(String table, String zoneId, String rankRate, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = mixDataBizMapper.batchQueryRbiRankData(table, zoneId, rankRate, 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 Rbi Rank Data Lines:{zoneId=%s, extend=%s, back.size=%d} from database, code:{%d} msg:{%s} ..."
+                            , zoneId
+                            , extend
+                            , CommTool.listSize(arrRes)
+                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
 }

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

@@ -25,4 +25,9 @@ public interface MixDataBizDBService extends BaseDBService{
             , String zoneId
             , String orderBy
             , String extend);
+
+    List<Map<String, Object>> batchQueryRbiRankData(String table
+            , String zoneId
+            , String rankRate
+            , String extend);
 }

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

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

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

@@ -8,6 +8,7 @@ import lombok.Setter;
 public class KeyValue {
     protected String key = "";
     protected String value = "";
+    protected String remark = "";
 
     public KeyValue() {
     }
@@ -16,4 +17,10 @@ public class KeyValue {
         this.key = key;
         this.value = value;
     }
+
+    public KeyValue(String key, String value, String remark) {
+        this.key = key;
+        this.value = value;
+        this.remark = remark;
+    }
 }

+ 5 - 1
src/main/java/com/shkpr/service/warncore/jsonbean/JPOrdWarnEventInfo.java

@@ -53,6 +53,10 @@ public class JPOrdWarnEventInfo {
     }
 
     public JPOrdWarnEventInfo(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules, OrdWarnPlanTempStep thisTempStep, long eventTime){
+        this(planDetail, rules, thisTempStep, eventTime, "");
+    }
+
+    public JPOrdWarnEventInfo(OrdWarnPlanDetail planDetail, List<OrdWarnPlanRules> rules, OrdWarnPlanTempStep thisTempStep, long eventTime, String eventPrefix){
         this.itemKey = planDetail.getItemKey();
         this.planId = planDetail.getUid();
         this.ownerSrc = planDetail.getOwnerSrc();
@@ -80,7 +84,7 @@ public class JPOrdWarnEventInfo {
         this.updateTime = eventTime;
         this.uid = CommTool.genWarnEventId(eventTime, "");
         this.title = String.format("%s--%s--%s事件", planDetail.getTitle(), this.uid.substring(5,15), RandomUtil.getDigitalRandomStr(4));
-        this.remark = CommToolHandler.genUnionEventRemark(planDetail.getOwner(), planDetail.getItemName(), this.fromTime);
+        this.remark = CommToolHandler.genUnionEventRemark(eventPrefix, planDetail.getOwner(), planDetail.getItemName(), this.fromTime);
     }
 
     private String formatRule(List<OrdWarnPlanRules> rules){