/// <summary> /// 掉线进行插入表逻辑判断-> /// 判断如果某个设备不进行广播,则在十分钟后进行进一步逻辑判断-> /// 1. 如果这个设备record 已经在db_event中& status 为‘未处理’,则不做处理; /// 2. 如果这个设备record 已经在db_event中& status 为‘已处理’,则insert; /// 3. 如果这个设备record不在db_event中, 则insert. /// </summary> public void judgeBroadcastDeviceBreakdown(Int16 BroadcastDeviceId) { if (BroadcastDeviceId != 0) { m_broadcastDeviceOnlineList[BroadcastDeviceId] = DateTime.Now; } foreach (var item in m_broadcastDeviceOnlineList) { DataRow[] dr = StaticData.g_dtBroadcastDevice.Select("编号='" + (Int32)item.Key + "'"); string theone = dr[0]["theone"].ToString(); // 计算两个dateTime 的时间戳,单位s long timeSpan = StaticUtils.GetCurrentTimeUnix(DateTime.Now) - StaticUtils.GetCurrentTimeUnix(item.Value); // 未上报时长 > 阈值 if (timeSpan > StaticData.g_intBroadcastBreakdownTime) { if (StaticData.g_msBroadcastgDBC.State == System.Data.ConnectionState.Closed) { StaticData.g_msBroadcastgDBC.Open(); } string strCMD = "select * from event_assemble where target_theone='" + theone + "';"; MySqlCommand cmd = new MySqlCommand(strCMD, StaticData.g_msBroadcastgDBC); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { if (sqlReader.Read()) { // record 在设备表中 if (sqlReader["event_status"].ToString().Contains("已读")) { sqlReader.Close(); StaticData.g_msBroadcastgDBC.Close(); insertBrokenRecordToEventDb(item.Key, theone); // 将record作为新的event record进行插入 } else { sqlReader.Close(); StaticData.g_msBroadcastgDBC.Close(); // record 状态未处理 ,更新DB device_broadcast表 和 界面 updateBreakdownInfor(item.Key); } } else { sqlReader.Close(); StaticData.g_msBroadcastgDBC.Close(); insertBrokenRecordToEventDb(item.Key, theone); } } } // 未上报时长 <= 阈值时,就算event_assemble中显示未处理,仍更新状态为连接 } }
/// <summary> /// 将异常record作为新的event record插入event_assemble & event_gate /// 判断数据库是否存在该事件,且时间是否x seconds以上才再次触发,存在且是的话插入新事件 /// x为StaticData中的全局变量 /// </summary> /// <param name="gateName"> 闸机名称 </param> /// <param name="strLevel"> 事件等级判断 </param> /// public string insertPersonTooMuchRecordToEventDb(string gateName, string strLevel) { if (StaticData.g_msGateDBC.State == System.Data.ConnectionState.Closed) { StaticData.g_msGateDBC.Open(); } //生成eventtheon string strEventTheOne = Guid.NewGuid().ToString(); DataRow[] dr = StaticData.g_dtGate.Select("闸机名称='" + gateName + "'"); string theone = dr[0]["theone"].ToString(); string strGatePosition = dr[0]["坐标"].ToString(); string strCMD = "select * from event_assemble where target_theone='" + theone + "' ORDER BY id DESC LIMIT 1;"; if (StaticData.g_msEventAssembleDBC.State == System.Data.ConnectionState.Closed) { StaticData.g_msEventAssembleDBC.Open(); } MySqlCommand cmd = new MySqlCommand(strCMD, StaticData.g_msEventAssembleDBC); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { if (sqlReader.Read()) { // 计算两个dateTime 的时间戳,单位s long timeSpan = StaticUtils.GetCurrentTimeUnix(DateTime.Now) - StaticUtils.GetCurrentTimeUnix(Convert.ToDateTime(sqlReader["end_time"])); if (timeSpan < StaticData.g_intGateWarningIntervalTime) { sqlReader.Close(); return(""); // 返回\"\"代表无需后续步骤,eg step: web端上传 } else if (sqlReader["event_status"].ToString().Equals("已读")) { sqlReader.Close(); return(""); // 返回\"\"代表无需后续步骤,eg step: web端上传 } } sqlReader.Close(); } else { return(""); } // 将record作为新的event record进行插入 DataRow[] dr_abnormal_super = StaticData.g_dtAbnormalInfor.Select("故障父类名称='event_gate'"); DataRow[] dr_abnormal_sub = StaticData.g_dtAbnormalInfor.Select("父ID='" + dr_abnormal_super[0]["ID"] + "'"); string event_name = ""; //故障二级名称 string strInsert_assemble = ""; string strInsert_gate = ""; if (strLevel.Equals("一般情况")) { // 数据库存储按照等级进行存储, 级别越低,id越低 event_name = dr_abnormal_sub[0]["故障子类名称"].ToString(); strInsert_assemble = "INSERT INTO event_assemble (event_name,event_theone,event_type,start_time,end_time,event_status,position,event_level,target_theone) values" + "('" + event_name + "','" + strEventTheOne + "','event_gate','" + DateTime.Now.ToString().Replace('/', '-') + "','" + DateTime.Now.ToString().Replace('/', '-') + "','未读','" + strGatePosition + "','" + strLevel + "','" + theone + "');"; strInsert_gate = "INSERT INTO event_gate (event_theone,device_event_type,device_theone) values" + "('" + strEventTheOne + "','" + event_name + "','" + theone + "');"; } else { event_name = dr_abnormal_sub[1]["故障子类名称"].ToString(); strInsert_assemble = "INSERT INTO event_assemble (event_name,event_theone,event_type,start_time,end_time,event_status,position,event_level,target_theone) values" + "('" + event_name + "','" + strEventTheOne + "','event_gate','" + DateTime.Now.ToString().Replace('/', '-') + "','" + DateTime.Now.ToString().Replace('/', '-') + "','未读','" + strGatePosition + "','" + strLevel + "','" + theone + "');"; strInsert_gate = "INSERT INTO event_gate (event_theone,device_event_type,device_theone) values" + "('" + strEventTheOne + "','" + event_name + "','" + theone + "');"; } MySqlCommand insertAssembleCmd = new MySqlCommand(strInsert_assemble, StaticData.g_msGateDBC); MySqlCommand insertGateCmd = new MySqlCommand(strInsert_gate, StaticData.g_msGateDBC); StaticUtils.DBNonQueryOperationException(ref insertAssembleCmd, currentClassName, currentMethodName); StaticUtils.DBNonQueryOperationException(ref insertGateCmd, currentClassName, currentMethodName); return(strEventTheOne); }
//读取事件数据库,判断数据库是否存在该事件,且时间是否2分钟以上才再次触发,存在且是的话插入新事件 //不是的话更新endtime字段为当前时间 //不存在的话直接插入数据 private void CheckEvent(string strDevice, string strTarget_theone, string strEvent, string strTime, string strPosition, string srtCameraName, string[] paras, string channelName) { //事件比较特殊,可有可能同时都会调用,所以这里每次调用的时候,都新建一个数据库的conn DBConnect dbCheck = new DBConnect(); DBConnect dbInsORUp = new DBConnect(); string[] strReadDB = new string[] { }; try { //判断数据库状态并打开数据库连接 if (dbCheck.msConn.State == System.Data.ConnectionState.Closed) { dbCheck.msConn.Open(); } if (dbInsORUp.msConn.State == System.Data.ConnectionState.Closed) { dbInsORUp.msConn.Open(); } // string strCMD = "select theone,event,endtime from event;"; string strCMD = "select end_time from event_assemble where target_theone='" + strTarget_theone + "' ORDER BY id DESC LIMIT 1;"; MySqlCommand cmd = new MySqlCommand(strCMD, dbCheck.msConn); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { while (sqlReader.Read()) { strReadDB = new string[] { sqlReader.GetString(0) }; //逐条数据判断 //判断数据库中是否存在数据 if (strReadDB != null) { //比较endtime的时间和当前时间 //传入时间 DateTime data_create = Convert.ToDateTime(strTime); DateTime data_db = Convert.ToDateTime(strReadDB[0]); // 相同报警间隔time unit: s long time_interval = StaticUtils.GetCurrentTimeUnix(data_create) - StaticUtils.GetCurrentTimeUnix(data_db); if (time_interval < 120) { string strUpdate = "UPDATE event_assemble SET end_time='" + strTime + "' WHERE target_theone='" + strTarget_theone + "' AND end_time='" + strReadDB[0] + "';"; MySqlCommand cmdUpdate = new MySqlCommand(strUpdate, dbInsORUp.msConn); StaticUtils.DBNonQueryOperationException(ref cmd, currentClassName, currentMethodName); //跳出 goto here; } } } } string event_name = ""; //故障二级名称 //事件等级判断 string strLevel = ""; if (strEvent.Contains("信号丢失")) { strLevel = "一般情况"; event_name = "监控设备掉线"; } else if (strEvent.Contains("移动侦测")) { strLevel = "一般情况"; event_name = "监控移动侦测"; } else if (strEvent.Contains("穿越警戒面")) { strLevel = "重要情况"; event_name = "监控越界侦测"; } //生成eventtheon string strEventTheOne = Guid.NewGuid().ToString(); //插入数据 //往总表跟字表里面都插入数据 DataRow[] dr_abnormal_super = StaticData.g_dtAbnormalInfor.Select("故障父类名称='event_camera'"); DataRow[] dr_abnormal_sub = StaticData.g_dtAbnormalInfor.Select("父ID='" + dr_abnormal_super[0]["ID"] + "'"); string strInsert1 = "INSERT INTO event_assemble (event_name,event_theone,event_type,start_time,end_time,event_status,position,event_level,target_theone) values" + "('" + event_name + "','" + strEventTheOne + "','event_camera','" + DateTime.Now.ToString().Replace('/', '-') + "','" + DateTime.Now.ToString().Replace('/', '-') + "','未读','" + strPosition + "','" + strLevel + "','" + strTarget_theone + "');"; string strInsert2 = "INSERT INTO event_camera (event_theone,device_event_type,device_theone) values" + "('" + strEventTheOne + "','" + event_name + "','" + strTarget_theone + "');"; MySqlCommand cmdInsert = new MySqlCommand(strInsert1, dbInsORUp.msConn); StaticUtils.DBNonQueryOperationException(ref cmdInsert, currentClassName, currentMethodName); MySqlCommand cmdInsert2 = new MySqlCommand(strInsert2, dbInsORUp.msConn); StaticUtils.DBNonQueryOperationException(ref cmdInsert2, currentClassName, currentMethodName); //向web上报事件 string strSendMSG = jscontrol.EventJson(strEventTheOne); Mainform.form1.SendMsgToWebSocketClients(strSendMSG); //更新UI界面 StaticUtils.ShowEventMsg("报警时间:" + paras[0] + " NVRIP:" + paras[1] + " 事件类型:" + event_name + " 通道号:" + channelName + " 摄像机名称:" + strDevice + "\n"); //计数加一 StaticData.g_inAlarmNum++; here: dbInsORUp.msConn.Close(); sqlReader.Close(); dbCheck.msConn.Close(); } catch (Exception e) { StaticUtils.ShowEventMsg("HikvisionAlarmCallBackFun.class-CheckEvent : 插入摄像头报警事件出现异常!!\n"); } }