/// <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");
            }
        }