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

存储触发规则的历史样本数据

andyliu пре 1 месец
родитељ
комит
a6300fbe6d

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

@@ -91,7 +91,7 @@ public class CommToolHandler {
             , List<Map<String, Object>> newEvents
             , List<Map<String, Object>> oldEvents){
         ResponseCode code = ResponseCode.RESULT_BAD;
-        if (getOrdWarnPlanDBService().updatePlanForTrigger(planWhere, planData, newEvents, oldEvents) > 0){
+        if (getOrdWarnPlanDBService().updatePlanForTrigger(planWhere, planData, newEvents, oldEvents, null, false, "") > 0){
             code = ResponseCode.RESULT_NORMAL;
         }
         return code;

+ 145 - 6
src/main/java/com/shkpr/service/warncore/bizhandler/SiteDataWarnHandler.java

@@ -15,6 +15,7 @@ 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;
 import com.shkpr.service.warncore.dbdao.tables.OrdWarnPlanInfoTable;
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnTriggerSampleHisTable;
 import com.shkpr.service.warncore.dto.*;
 import com.shkpr.service.warncore.jsonbean.JPGetRegionData;
 import com.shkpr.service.warncore.jsonbean.JPGetRegionReport;
@@ -185,7 +186,7 @@ public class SiteDataWarnHandler {
             if (getWarnPlanInfoDBService().updatePlanForTrigger(new HashMap<String, Object>(){{
                         put(OrdWarnPlanInfoTable.W_INFO.UNIQUE_ID, planDetail.getUid());
                         put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion());
-                    }}, updatePlan, null, null) <= 0){
+                    }}, updatePlan, null, null, null, false, "") <= 0){
                 step = "Update warn plan trigger result to db failed.";
                 code = ResponseCode.RESULT_BAD;
             }
@@ -204,7 +205,9 @@ public class SiteDataWarnHandler {
         SiteSampleDataResult siteSampleData = null;
         Map<String, Long> oldEvent2EndUTC = new HashMap<>();//需要更新预警事件的样本截止时间
         Map<String, JPOrdWarnEventInfo> newEvent2Gen = new HashMap<>();
-
+        Map<String, List<SiteSampleGroupItem>> ownerId2TriggerSample = new HashMap<>();//触发规则的样本数据
+        String eventIdAcceptPlanHisTriggerSam = "";//将预案的历史触发样本数据迁移到该事件
+        boolean clearPlanHisTriggerSam = false;//是否需要清空预案的历史触发样本数据
         do {
             JPGetRegionData jpParam = new JPGetRegionData();
             jpParam.setTotal(1);
@@ -279,6 +282,12 @@ public class SiteDataWarnHandler {
                 }
                 if (code != ResponseCode.RESULT_NORMAL)
                     break;
+
+                List<SiteSampleGroupItem> planOfSample = ownerId2TriggerSample.get(planDetail.getUid());
+                if (planOfSample == null){
+                    planOfSample = new ArrayList<>();
+                    ownerId2TriggerSample.put(planDetail.getUid(), planOfSample);
+                }
                 if (!matched){//本次没有匹配成功
                     step = "This is not matched.";
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
@@ -287,8 +296,14 @@ public class SiteDataWarnHandler {
                     thisTempStep.setFirstMatchSampleTime(0L);
                     thisTempStep.setLastEventId("");
                     thisTempStep.setLastEventTime(0L);
+
+                    planOfSample.clear();
+                    if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                        clearPlanHisTriggerSam = true;
                     continue;
-                }//本次匹配成功进入下一步
+                }else{
+                    planOfSample.add(sampleItem);
+                }
 
                 if (thisTempStep.getLastCompareSampleResult() <= COMPARE_FALSE){//上一次没有匹配成功
                     step = "This is matched, but last is not matched.";
@@ -345,6 +360,15 @@ public class SiteDataWarnHandler {
                         thisTempStep.setLastEventAction(newEvent.getAction());
                         thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
                         //[!!!]do not change the FirstMatchSampleTime[!!!]
+
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                        List<SiteSampleGroupItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }
                 }else {//之前有预警事件
                     if (planDetail.getMergeToEvent() == 0 || thisTempStep.getLastEventAction() >= EventAction.DONE){//之前的预警事件已处理,则可认为进行重新计数
@@ -364,6 +388,16 @@ public class SiteDataWarnHandler {
                         }else
                             oldEvent2EndUTC.put(thisTempStep.getLastEventId(), sampleRecordTm);
                         thisTempStep.setLastCompareSampleExplain(step);
+
+                        final String lastEventID = thisTempStep.getLastEventId();
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = lastEventID;
+                        List<SiteSampleGroupItem> eventSampleHis = ownerId2TriggerSample.get(lastEventID);
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(lastEventID, eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }
                 }
             }
@@ -389,10 +423,24 @@ public class SiteDataWarnHandler {
                 }});
             }
         }
+        List<Map<String, Object>> triggerSampleHisObj = null;
+        if (CommTool.mapSize(ownerId2TriggerSample) > 0){
+            triggerSampleHisObj = new ArrayList<>();
+            for (Map.Entry<String, List<SiteSampleGroupItem>> entry:ownerId2TriggerSample.entrySet()){
+                if (CommTool.listSize(entry.getValue()) > 0){
+                    triggerSampleHisObj.add(new HashMap<String, Object>(){{
+                        put(OrdWarnTriggerSampleHisTable.W_INFO.OWNER_ID, entry.getKey());
+                        put(OrdWarnTriggerSampleHisTable.W_INFO.SAMPLE, FastJsonUtil.toJSON(entry.getValue()));
+                    }});
+                }
+            }
+            ownerId2TriggerSample.clear();
+        }
+
         if (getWarnPlanInfoDBService().updatePlanForTrigger(new HashMap<String, Object>(){{
                         put(OrdWarnPlanInfoTable.W_INFO.UNIQUE_ID, planDetail.getUid());
                         put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion());
-                    }}, updatePlan, genNewEventObj, genOldEventObj) <= 0){
+                    }}, updatePlan, genNewEventObj, genOldEventObj, triggerSampleHisObj, clearPlanHisTriggerSam, eventIdAcceptPlanHisTriggerSam) <= 0){
             step = "Update warn plan trigger result to db failed.";
             code = ResponseCode.RESULT_BAD;
         }
@@ -411,6 +459,9 @@ public class SiteDataWarnHandler {
         SiteStatsDataResult siteStatsData = null;
         Map<String, Long> oldEvent2EndUTC = new HashMap<>();//需要更新预警事件的样本截止时间
         Map<String, JPOrdWarnEventInfo> newEvent2Gen = new HashMap<>();
+        Map<String, List<SiteStatsDataItem>> ownerId2TriggerSample = new HashMap<>();//触发规则的样本数据
+        String eventIdAcceptPlanHisTriggerSam = "";//将预案的历史触发样本数据迁移到该事件
+        boolean clearPlanHisTriggerSam = false;//是否需要清空预案的历史触发样本数据
 
         List<Long> tagTime = new ArrayList<>();//每个整点时刻,用于查询站点的统计数据
         long tmpStepToStep = thisTempStep.getQueryBeginUTC();
@@ -507,6 +558,11 @@ public class SiteDataWarnHandler {
                 if (code != ResponseCode.RESULT_NORMAL)
                     break;
 
+                List<SiteStatsDataItem> planOfSample = ownerId2TriggerSample.get(planDetail.getUid());
+                if (planOfSample == null){
+                    planOfSample = new ArrayList<>();
+                    ownerId2TriggerSample.put(planDetail.getUid(), planOfSample);
+                }
                 if (!matched){//本次没有匹配成功
                     step = "This is not matched.";
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
@@ -515,8 +571,14 @@ public class SiteDataWarnHandler {
                     thisTempStep.setLastEventId("");
                     thisTempStep.setLastEventTime(0L);
                     thisTempStep.setLastCompareSampleExplain(step);
+
+                    planOfSample.clear();
+                    if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                        clearPlanHisTriggerSam = true;
                     continue;
-                }//本次匹配成功进入下一步
+                }else {
+                    planOfSample.add(sampleItem);
+                }
 
                 long triggerEventPeriodSwitch = planDetail.getFrequency()*planDetail.getThreshold();//触发预警事件的最小时长(单位:小时)
                 if (thisTempStep.getLastCompareSampleResult() <= COMPARE_FALSE){//上一次没有匹配成功
@@ -535,6 +597,15 @@ public class SiteDataWarnHandler {
                         thisTempStep.setLastEventId(newEvent.getUid());
                         thisTempStep.setLastEventAction(newEvent.getAction());
                         thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                        List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }
                     continue;
                 }//上一次匹配成功了进入下一步
@@ -556,6 +627,15 @@ public class SiteDataWarnHandler {
                         thisTempStep.setLastEventId(newEvent.getUid());
                         thisTempStep.setLastEventAction(newEvent.getAction());
                         thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                        List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }else {
                         thisTempStep.setLastEventId("");
                         thisTempStep.setLastEventTime(0L);
@@ -579,6 +659,15 @@ public class SiteDataWarnHandler {
                         thisTempStep.setLastEventId(newEvent.getUid());
                         thisTempStep.setLastEventAction(newEvent.getAction());
                         thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                        List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }else {
                         thisTempStep.setLastEventId("");
                         thisTempStep.setLastEventTime(0L);
@@ -605,6 +694,15 @@ public class SiteDataWarnHandler {
                                 thisTempStep.setLastEventId(newEvent.getUid());
                                 thisTempStep.setLastEventAction(newEvent.getAction());
                                 thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                                if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                                    eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                                List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                                if (eventSampleHis == null){
+                                    eventSampleHis = new ArrayList<>();
+                                    ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                                }
+                                eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                             }
                         }
                     }else {//触发一个新的事件
@@ -620,6 +718,15 @@ public class SiteDataWarnHandler {
                         thisTempStep.setLastEventAction(newEvent.getAction());
                         thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
                         //[!!!]do not change the FirstMatchSampleTime[!!!]
+
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                        List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }
                 }else {//之前有预警事件
                     if (planDetail.getMergeToEvent() == 0 || thisTempStep.getLastEventAction() >= EventAction.DONE){//之前的预警事件已处理,则可认为进行重新计数
@@ -638,6 +745,15 @@ public class SiteDataWarnHandler {
                             thisTempStep.setLastEventId(newEvent.getUid());
                             thisTempStep.setLastEventAction(newEvent.getAction());
                             thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                            if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                                eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                            List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                            if (eventSampleHis == null){
+                                eventSampleHis = new ArrayList<>();
+                                ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                            }
+                            eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                         }else {
                             thisTempStep.setLastEventId("");
                             thisTempStep.setLastEventTime(0L);
@@ -651,6 +767,16 @@ public class SiteDataWarnHandler {
                         }else
                             oldEvent2EndUTC.put(thisTempStep.getLastEventId(), sampleRecordTm);
                         thisTempStep.setLastCompareSampleExplain(step);
+
+                        final String lastEventID = thisTempStep.getLastEventId();
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = lastEventID;
+                        List<SiteStatsDataItem> eventSampleHis = ownerId2TriggerSample.get(lastEventID);
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(lastEventID, eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }
                 }
             }
@@ -677,10 +803,23 @@ public class SiteDataWarnHandler {
                 }});
             }
         }
+        List<Map<String, Object>> triggerSampleHisObj = null;
+        if (CommTool.mapSize(ownerId2TriggerSample) > 0){
+            triggerSampleHisObj = new ArrayList<>();
+            for (Map.Entry<String, List<SiteStatsDataItem>> entry:ownerId2TriggerSample.entrySet()){
+                if (CommTool.listSize(entry.getValue()) > 0){
+                    triggerSampleHisObj.add(new HashMap<String, Object>(){{
+                        put(OrdWarnTriggerSampleHisTable.W_INFO.OWNER_ID, entry.getKey());
+                        put(OrdWarnTriggerSampleHisTable.W_INFO.SAMPLE, FastJsonUtil.toJSON(entry.getValue()));
+                    }});
+                }
+            }
+            ownerId2TriggerSample.clear();
+        }
         if (getWarnPlanInfoDBService().updatePlanForTrigger(new HashMap<String, Object>(){{
             put(OrdWarnPlanInfoTable.W_INFO.UNIQUE_ID, planDetail.getUid());
             put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion());
-        }}, updatePlan, genNewEventObj, genOldEventObj) <= 0){
+        }}, updatePlan, genNewEventObj, genOldEventObj, triggerSampleHisObj, clearPlanHisTriggerSam, eventIdAcceptPlanHisTriggerSam) <= 0){
             step = "Update warn plan trigger result to db failed.";
             code = ResponseCode.RESULT_BAD;
         }

+ 98 - 5
src/main/java/com/shkpr/service/warncore/bizhandler/ZoneDataWarnHandler.java

@@ -14,6 +14,7 @@ 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;
 import com.shkpr.service.warncore.dbdao.tables.OrdWarnPlanInfoTable;
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnTriggerSampleHisTable;
 import com.shkpr.service.warncore.dto.*;
 import com.shkpr.service.warncore.jsonbean.JPOrdWarnEventInfo;
 import org.springframework.util.StringUtils;
@@ -168,7 +169,7 @@ public class ZoneDataWarnHandler {
             if (getWarnPlanInfoDBService().updatePlanForTrigger(new HashMap<String, Object>(){{
                 put(OrdWarnPlanInfoTable.W_INFO.UNIQUE_ID, planDetail.getUid());
                 put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion());
-            }}, updatePlan, null, null) <= 0){
+            }}, updatePlan, null, null, null, false, "") <= 0){
                 step = "Update warn plan trigger result to db failed.";
                 code = ResponseCode.RESULT_BAD;
             }
@@ -284,7 +285,7 @@ public class ZoneDataWarnHandler {
             if (getWarnPlanInfoDBService().updatePlanForTrigger(new HashMap<String, Object>(){{
                 put(OrdWarnPlanInfoTable.W_INFO.UNIQUE_ID, planDetail.getUid());
                 put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion());
-            }}, updatePlan, null, null) <= 0){
+            }}, updatePlan, null, null, null, false, "") <= 0){
                 step = "Update warn plan trigger result to db failed.";
                 code = ResponseCode.RESULT_BAD;
             }
@@ -400,7 +401,7 @@ public class ZoneDataWarnHandler {
             if (getWarnPlanInfoDBService().updatePlanForTrigger(new HashMap<String, Object>(){{
                 put(OrdWarnPlanInfoTable.W_INFO.UNIQUE_ID, planDetail.getUid());
                 put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion());
-            }}, updatePlan, null, null) <= 0){
+            }}, updatePlan, null, null, null, false, "") <= 0){
                 step = "Update warn plan trigger result to db failed.";
                 code = ResponseCode.RESULT_BAD;
             }
@@ -419,6 +420,9 @@ public class ZoneDataWarnHandler {
         List<DateKeyValue> zoneStatsData = null;//要求数据按date升序
         Map<String, Long> oldEvent2EndUTC = new HashMap<>();//需要更新预警事件的样本截止时间
         Map<String, JPOrdWarnEventInfo> newEvent2Gen = new HashMap<>();
+        Map<String, List<DateKeyValue>> ownerId2TriggerSample = new HashMap<>();//触发规则的样本数据
+        String eventIdAcceptPlanHisTriggerSam = "";//将预案的历史触发样本数据迁移到该事件
+        boolean clearPlanHisTriggerSam = false;//是否需要清空预案的历史触发样本数据
 
         do {
             String[] storeTagAndBackTag = rules.get(0).getConditions().get(0).getFormat().split("@");
@@ -475,6 +479,11 @@ public class ZoneDataWarnHandler {
                 if (code != ResponseCode.RESULT_NORMAL)
                     break;
 
+                List<DateKeyValue> planOfSample = ownerId2TriggerSample.get(planDetail.getUid());
+                if (planOfSample == null){
+                    planOfSample = new ArrayList<>();
+                    ownerId2TriggerSample.put(planDetail.getUid(), planOfSample);
+                }
                 if (!matched){//本次没有匹配成功
                     step = "This is not matched.";
                     thisTempStep.setLastCompareSampleTime(sampleRecordTm);
@@ -483,8 +492,14 @@ public class ZoneDataWarnHandler {
                     thisTempStep.setLastEventId("");
                     thisTempStep.setLastEventTime(0L);
                     thisTempStep.setLastCompareSampleExplain(step);
+
+                    planOfSample.clear();
+                    if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                        clearPlanHisTriggerSam = true;
                     continue;
-                }//本次匹配成功进入下一步
+                }else {//本次匹配成功进入下一步
+                    planOfSample.add(sampleItem);
+                }
 
                 long triggerEventPeriodSwitch = planDetail.getFrequency()*planDetail.getThreshold();//触发预警事件的最小时长(单位:时/天/月)
                 if (thisTempStep.getLastCompareSampleResult() <= COMPARE_FALSE){//上一次没有匹配成功
@@ -503,6 +518,15 @@ public class ZoneDataWarnHandler {
                         thisTempStep.setLastEventId(newEvent.getUid());
                         thisTempStep.setLastEventAction(newEvent.getAction());
                         thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                        List<DateKeyValue> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }
                     continue;
                 }//上一次匹配成功了进入下一步
@@ -530,6 +554,15 @@ public class ZoneDataWarnHandler {
                         thisTempStep.setLastEventId(newEvent.getUid());
                         thisTempStep.setLastEventAction(newEvent.getAction());
                         thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                        List<DateKeyValue> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }else {
                         thisTempStep.setLastEventId("");
                         thisTempStep.setLastEventTime(0L);
@@ -554,6 +587,15 @@ public class ZoneDataWarnHandler {
                             thisTempStep.setLastEventId(newEvent.getUid());
                             thisTempStep.setLastEventAction(newEvent.getAction());
                             thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                            if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                                eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                            List<DateKeyValue> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                            if (eventSampleHis == null){
+                                eventSampleHis = new ArrayList<>();
+                                ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                            }
+                            eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                         }else {
                             thisTempStep.setLastEventId("");
                             thisTempStep.setLastEventTime(0L);
@@ -589,6 +631,15 @@ public class ZoneDataWarnHandler {
                                 thisTempStep.setLastEventId(newEvent.getUid());
                                 thisTempStep.setLastEventAction(newEvent.getAction());
                                 thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                                if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                                    eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                                List<DateKeyValue> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                                if (eventSampleHis == null){
+                                    eventSampleHis = new ArrayList<>();
+                                    ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                                }
+                                eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                             }
                         }
                     }else {//触发一个新的事件
@@ -604,6 +655,15 @@ public class ZoneDataWarnHandler {
                         thisTempStep.setLastEventAction(newEvent.getAction());
                         thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
                         //[!!!]do not change the FirstMatchSampleTime[!!!]
+
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                        List<DateKeyValue> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }
                 }else {//之前有预警事件
                     if (planDetail.getMergeToEvent() == 0 || thisTempStep.getLastEventAction() >= EventAction.DONE){//之前的预警事件已处理,则可认为进行重新计数
@@ -622,6 +682,15 @@ public class ZoneDataWarnHandler {
                             thisTempStep.setLastEventId(newEvent.getUid());
                             thisTempStep.setLastEventAction(newEvent.getAction());
                             thisTempStep.setCycleTriggerTimes(thisTempStep.getCycleTriggerTimes()+1);
+
+                            if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                                eventIdAcceptPlanHisTriggerSam = newEvent.getUid();
+                            List<DateKeyValue> eventSampleHis = ownerId2TriggerSample.get(newEvent.getUid());
+                            if (eventSampleHis == null){
+                                eventSampleHis = new ArrayList<>();
+                                ownerId2TriggerSample.put(newEvent.getUid(), eventSampleHis);
+                            }
+                            eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                         }else {
                             thisTempStep.setLastEventId("");
                             thisTempStep.setLastEventTime(0L);
@@ -635,6 +704,16 @@ public class ZoneDataWarnHandler {
                         }else
                             oldEvent2EndUTC.put(thisTempStep.getLastEventId(), sampleRecordTm);
                         thisTempStep.setLastCompareSampleExplain(step);
+
+                        final String lastEventID = thisTempStep.getLastEventId();
+                        if (StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam))
+                            eventIdAcceptPlanHisTriggerSam = lastEventID;
+                        List<DateKeyValue> eventSampleHis = ownerId2TriggerSample.get(lastEventID);
+                        if (eventSampleHis == null){
+                            eventSampleHis = new ArrayList<>();
+                            ownerId2TriggerSample.put(lastEventID, eventSampleHis);
+                        }
+                        eventSampleHis.addAll(ownerId2TriggerSample.remove(planDetail.getUid()));
                     }
                 }
             }
@@ -661,10 +740,24 @@ public class ZoneDataWarnHandler {
                 }});
             }
         }
+        List<Map<String, Object>> triggerSampleHisObj = null;
+        if (CommTool.mapSize(ownerId2TriggerSample) > 0){
+            triggerSampleHisObj = new ArrayList<>();
+            for (Map.Entry<String, List<DateKeyValue>> entry:ownerId2TriggerSample.entrySet()){
+                if (CommTool.listSize(entry.getValue()) > 0){
+                    triggerSampleHisObj.add(new HashMap<String, Object>(){{
+                        put(OrdWarnTriggerSampleHisTable.W_INFO.OWNER_ID, entry.getKey());
+                        put(OrdWarnTriggerSampleHisTable.W_INFO.SAMPLE, FastJsonUtil.toJSON(entry.getValue()));
+                    }});
+                }
+            }
+            ownerId2TriggerSample.clear();
+        }
+
         if (getWarnPlanInfoDBService().updatePlanForTrigger(new HashMap<String, Object>(){{
                     put(OrdWarnPlanInfoTable.W_INFO.UNIQUE_ID, planDetail.getUid());
                     put(OrdWarnPlanInfoTable.W_INFO.VERSION, planDetail.getVersion());
-                }}, updatePlan, genNewEventObj, genOldEventObj) <= 0){
+                }}, updatePlan, genNewEventObj, genOldEventObj, triggerSampleHisObj, clearPlanHisTriggerSam, eventIdAcceptPlanHisTriggerSam) <= 0){
             step = "Update warn plan trigger result to db failed.";
             code = ResponseCode.RESULT_BAD;
         }

+ 35 - 0
src/main/java/com/shkpr/service/warncore/dbdao/mapper/OrdWarnTriggerSampleHisMapper.java

@@ -0,0 +1,35 @@
+package com.shkpr.service.warncore.dbdao.mapper;
+
+import com.shkpr.service.warncore.dbdao.providers.OrdWarnTriggerSampleHisSqlProvider;
+import org.apache.ibatis.annotations.DeleteProvider;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.UpdateProvider;
+
+import java.util.List;
+import java.util.Map;
+
+public interface OrdWarnTriggerSampleHisMapper {
+    @InsertProvider(type = OrdWarnTriggerSampleHisSqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = OrdWarnTriggerSampleHisSqlProvider.class, method = "updateWiths")
+    int updateWiths(@Param("datas") Map<String, Object> datas
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @InsertProvider(type = OrdWarnTriggerSampleHisSqlProvider.class, method = "batchInserts")
+    int batchInserts(@Param("inserts") List<Map<String, Object>> inserts);
+
+    @DeleteProvider(type = OrdWarnTriggerSampleHisSqlProvider.class, method = "deleteWiths")
+    int deleteWithsEx(@Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+}

+ 51 - 0
src/main/java/com/shkpr/service/warncore/dbdao/providers/OrdWarnTriggerSampleHisSqlProvider.java

@@ -0,0 +1,51 @@
+package com.shkpr.service.warncore.dbdao.providers;
+
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnTriggerSampleHisTable;
+
+public class OrdWarnTriggerSampleHisSqlProvider extends BaseSqlProvider implements OrdWarnTriggerSampleHisTable {
+    @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;
+    }
+
+    @Override
+    protected boolean isWTimeForFiled(String filedName) {
+        return (filedName.endsWith("time"));
+    }
+}
+

+ 28 - 1
src/main/java/com/shkpr/service/warncore/dbdao/services/OrdWarnPlanInfoDBServiceImpl.java

@@ -6,13 +6,16 @@ import com.shkpr.service.warncore.commtools.CommTool;
 import com.shkpr.service.warncore.constants.LogFlagBusiType;
 import com.shkpr.service.warncore.dbdao.mapper.OrdWarnEventInfoMapper;
 import com.shkpr.service.warncore.dbdao.mapper.OrdWarnPlanInfoMapper;
+import com.shkpr.service.warncore.dbdao.mapper.OrdWarnTriggerSampleHisMapper;
 import com.shkpr.service.warncore.dbdao.services.intef.OrdWarnPlanInfoDBService;
 import com.shkpr.service.warncore.dbdao.tables.OrdWarnEventInfoTable;
 import com.shkpr.service.warncore.dbdao.tables.OrdWarnPlanInfoTable;
+import com.shkpr.service.warncore.dbdao.tables.OrdWarnTriggerSampleHisTable;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -38,6 +41,10 @@ public class OrdWarnPlanInfoDBServiceImpl implements OrdWarnPlanInfoDBService, O
     @Autowired
     OrdWarnEventInfoMapper ordWarnEventInfoMapper;
 
+    @SuppressWarnings("all")
+    @Autowired
+    OrdWarnTriggerSampleHisMapper ordWarnTriggerSampleHisMapper;
+
     @Override
     public List<Map<String, Object>> listAllWiths(int limit, int offset, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
         return listAllWithsEx("", "", limit, offset, andWheres, orWheres, orderBy, extend);
@@ -200,7 +207,13 @@ public class OrdWarnPlanInfoDBServiceImpl implements OrdWarnPlanInfoDBService, O
 
     @Transactional(transactionManager = "mainDbTransactionManager")
     @Override
-    public int updatePlanForTrigger(Map<String, Object> planWhere, Map<String, Object> updatePlan, List<Map<String, Object>> newEvents, List<Map<String, Object>> oldEvents) {
+    public int updatePlanForTrigger(Map<String, Object> planWhere
+            , Map<String, Object> updatePlan
+            , List<Map<String, Object>> newEvents
+            , List<Map<String, Object>> oldEvents
+            , List<Map<String, Object>> triggerSampleHis
+            , boolean clearPlanHisTriggerSam
+            , String eventIdAcceptPlanHisTriggerSam) {
         int nCode = 0;
         String strMsg = "Success";
         try {
@@ -219,6 +232,20 @@ public class OrdWarnPlanInfoDBServiceImpl implements OrdWarnPlanInfoDBService, O
                     ordWarnEventInfoMapper.batchUpdateWiths(wheres, oldEvents);
                 }
                 nRes = ordWarnPlanInfoMapper.updateWiths(updatePlan, planWhere, null, "");
+                final String planId = (String)planWhere.get(W_INFO.UNIQUE_ID);
+                if (!StringUtils.isEmpty(eventIdAcceptPlanHisTriggerSam)){
+                    ordWarnTriggerSampleHisMapper.updateWiths(new HashMap<String, Object>(){{
+                        put(OrdWarnTriggerSampleHisTable.W_INFO.OWNER_ID, eventIdAcceptPlanHisTriggerSam);
+                    }}, new HashMap<String, Object>(){{
+                        put(OrdWarnTriggerSampleHisTable.W_INFO.OWNER_ID, planId);
+                    }}, null, "");
+                }else if (clearPlanHisTriggerSam){
+                    ordWarnTriggerSampleHisMapper.deleteWithsEx(new HashMap<String, Object>(){{
+                        put(OrdWarnTriggerSampleHisTable.W_INFO.OWNER_ID, planId);
+                    }}, null, "");
+                }
+                if (CommTool.listSize(triggerSampleHis) > 0)
+                    ordWarnTriggerSampleHisMapper.batchInserts(triggerSampleHis);
             }while (false);
 
             if (nRes <= 0){

+ 4 - 1
src/main/java/com/shkpr/service/warncore/dbdao/services/intef/OrdWarnPlanInfoDBService.java

@@ -36,7 +36,10 @@ public interface OrdWarnPlanInfoDBService extends BaseDBService {
     int updatePlanForTrigger(Map<String, Object> planWhere
             , Map<String, Object> updatePlan
             , List<Map<String, Object>> newEvents
-            , List<Map<String, Object>> oldEvents);
+            , List<Map<String, Object>> oldEvents
+            , List<Map<String, Object>> triggerSampleHis
+            , boolean clearPlanHisTriggerSam
+            , String eventIdAcceptPlanHisTriggerSam);
 }
 
 

+ 26 - 0
src/main/java/com/shkpr/service/warncore/dbdao/tables/OrdWarnTriggerSampleHisTable.java

@@ -0,0 +1,26 @@
+package com.shkpr.service.warncore.dbdao.tables;
+
+public interface OrdWarnTriggerSampleHisTable {
+    interface R_INFO{
+        String TABLE = "k4_ord_warn_trigger_sample_history";
+        String PRIMARY_KEY = "id";
+        String UNIQUE_ID = "id";
+        String ALL_FILED = "*";
+        String DEFAULT_ORDER = "create_time DESC,id DESC";
+        String DEFAULT_EXTEND = "";
+        String ID = "id";
+        String CREATE_TIME = "create_time";
+        String OWNER_ID = "owner_id";
+        String SAMPLE = "sample";
+    }
+
+    interface W_INFO{
+        String ID = "id";
+        String TABLE = "k4_ord_warn_trigger_sample_history";
+        String PRIMARY_KEY = "id";
+        String UNIQUE_ID = "id";
+        String CREATE_TIME = "create_time";
+        String OWNER_ID = "owner_id";
+        String SAMPLE = "sample";
+    }
+}