public List<Model.TN_AlarmItem> GetRecentAlarm()
        {
            List<Model.TN_AlarmItem> alarmList = null;
            DataTable dt = dal.GetRecentAlarm();

            if (dt != null)
            {
                TN_Coal CoalsInstance = new TN_Coal();
                Dictionary<string, string> coalsDefine = CoalsInstance.GetCoalList();
                string coalName = string.Empty;
                alarmList = new List<Model.TN_AlarmItem>();
                foreach (DataRow dr in dt.Rows)
                {
                    coalName = coalsDefine[dr["CoalCode"].ToString()];
                    Model.TN_AlarmItem aitem = new Model.TN_AlarmItem
                    {
                        CoalCode=dr["CoalCode"].ToString(),
                        CoalName = coalName,
                        DevCode = dr["DevCode"].ToString(),
                        DevName = dr["DevName"].ToString(),
                        DevType = dr["DevType"].ToString(),
                        DevAddress = dr["DevAddress"].ToString(),
                        DevUnit = dr["DevUnit"].ToString(),
                        StartTime = Convert.ToDateTime(dr["AlarmSTime"].ToString()),
                        EndTime = Convert.ToDateTime(dr["AlarmETime"].ToString()),
                        AlarmLRV = dr["AlarmLRV"].ToString(),
                        AlarmURV = dr["AlarmURV"].ToString(),
                        Duration =(Int32)Convert.ToDecimal(dr["Duration"].ToString()),
                        DevMaxValue = Convert.ToDecimal(dr["DevMaxValue"].ToString()),
                       DevMaxTime=Convert.ToDateTime(dr["DevMaxTime"].ToString()),
                        DevState = statusList[Convert.ToInt32(dr["DevState"].ToString())]//传感器状态

                       // UploadState = dr["UploadState"].ToString()
                       // SendedCounter = Int32.Parse(dr["UploadState"].ToString()),
                        //DevValue = "0",
                       // AlarmGrade = dr["AlarmGrade"].ToString(),
                       //AlarmType = dr["AlarmType"].ToString()
                        //DevState = dr["DevState"].ToString(),

                    };
                    if (aitem.EndTime.Year != 2000)
                    {
                        alarmList.Add(aitem);
                    }
                }
            }

            DALFactory.DataCache.SetCache("RecentAlarm", alarmList, DateTime.Now.AddMinutes(1),TimeSpan.Zero);
            return alarmList;
        }
        /// <summary>
        /// 更新报警信息报警级别
        /// </summary>
        /// <param name="rtm">实时数据</param>
        /// <param name="define">报警短信定义</param>
        /// <param name="item">原始报警信息</param>
        /// <returns>报警信息</returns>
        private Model.TN_AlarmItem UpdateAlarmGrade(Model.TN_Rtm rtm, Model.TN_AlarmSendDefine define, Model.TN_AlarmItem item)
        {
            Model.TN_AlarmItem newItem = new Model.TN_AlarmItem();

            //截止到当前时间点的报警结束时间
               // int duration = (int)(Convert.ToDateTime(rtm.RealTime) - item.StartTime).TotalSeconds;
            int duration = (int)(Convert.ToDateTime(rtm.RealTime) - Convert.ToDateTime(rtm.ChageStateTime)).TotalSeconds;
            //判断实时数据的状态是否已经升级n多种条件判定,慢慢写吧,不要着急

            if (item.AlarmGrade == "预警" && rtm.DevState == "1")//条件1:报警状态直接由“预警”升级到“轻警”
            {
                newItem.AlarmGrade = "轻警";
                newItem.AlarmType = "模拟量超限";                                           //报警类型
                newItem.SendedCounter = 0;
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            else if ((item.AlarmGrade == "预警" && rtm.DevState == "2") || (item.AlarmGrade == "预警" && rtm.DevState == "3"))//条件2:报警状态直接由“预警”升级到“重警”
            {
                newItem.AlarmGrade = "重警";
                newItem.AlarmType = "超限断电";                                             //报警类型
                newItem.SendedCounter = 0;
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;//0;                                                       //持续时长
            }
            else if ((item.AlarmGrade == "轻警" && rtm.DevState == "2") || (item.AlarmGrade == "轻警" && rtm.DevState == "3"))//条件3:报警状态直接由“轻警”升级到“重警”
            {
                newItem.AlarmGrade = "重警";
                newItem.AlarmType = "超限断电";                                             //报警类型
                newItem.SendedCounter = 0;
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            else if ((item.AlarmGrade == "特重" && rtm.DevState == "2") || (item.AlarmGrade == "特重" && rtm.DevState == "3"))//条件4:报警状态直接由“特重”下降到“重警”
            {
                newItem.AlarmGrade = "重警";
                newItem.AlarmType = "超限断电";                                             //报警类型
                newItem.SendedCounter = 0;
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            //else if (item.AlarmGrade == "特重" && rtm.DevState == "1")//条件5:报警状态直接由“特重”下降到“轻警”
            //{
            //    newItem.AlarmGrade = "轻警";
            //    newItem.AlarmType = "模拟量超限";                                             //报警类型
            //    newItem.SendedCounter = 0;
            //    newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
            //    newItem.Duration = 0;                                                       //持续时长
            //}
            else if (item.AlarmGrade == "特重" && IsEarlyWarning(Convert.ToDecimal(rtm.AlarmURV), define.ShiftRange, rtm.DevValue, rtm.DevState) && rtm.DevState == "0" && item.AlarmType != "预警")//条件6:报警状态直接由“特重”下降到“预警”
            {
                newItem.AlarmGrade = "预警";
                newItem.AlarmType = "预警";                                                 //报警类型
                newItem.SendedCounter = 0;
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            //else if (item.AlarmGrade == "重警" && rtm.DevState == "1")//条件7:报警状态直接由“重警”下降到“轻警”
            //{
            //    newItem.AlarmGrade = "轻警";
            //    newItem.AlarmType = "模拟量超限";                                             //报警类型
            //    newItem.SendedCounter = 0;
            //    newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
            //    newItem.Duration = 0;                                                       //持续时长
            //}
            else if (item.AlarmGrade == "重警" && IsEarlyWarning(Convert.ToDecimal(rtm.AlarmURV), define.ShiftRange, rtm.DevValue, rtm.DevState) && rtm.DevState == "0" && item.AlarmType != "预警")//条件8:报警状态直接由“重警”下降到“预警”
            {
                newItem.AlarmGrade = "预警";
                newItem.AlarmType = "预警";                                                 //报警类型
                newItem.SendedCounter = 0;
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration; //0;                                                       //持续时长
            }
            else if (item.AlarmGrade == "轻警" && IsEarlyWarning(Convert.ToDecimal(rtm.AlarmURV), define.ShiftRange, rtm.DevValue, rtm.DevState) && rtm.DevState == "0" && item.AlarmType != "预警")//条件9:报警状态直接由“轻警”下降到“预警”
            {
                newItem.AlarmGrade = "预警";
                newItem.SendedCounter = 0;
                newItem.AlarmType = "预警";                                                 //报警类型
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            else if (item.AlarmGrade == "预警" && Convert.ToInt32(rtm.DevState) > 4)//条件13:报警状态直接由“预警”升级到“重警” 类型:传感器故障
            {
                newItem.AlarmGrade = "重警";
                newItem.SendedCounter = 0;
                newItem.AlarmType = "传感器故障";                                           //报警类型
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration; //0;                                                       //持续时长
            }
            else if (item.AlarmGrade == "轻警" && Convert.ToInt32(rtm.DevState) > 4)//条件14:报警状态直接由“轻警”升级到“重警” 类型:传感器故障
            {
                newItem.AlarmGrade = "重警";
                newItem.SendedCounter = 0;
                newItem.AlarmType = "传感器故障";                                           //报警类型
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            else if (item.AlarmGrade == "特重" && Convert.ToInt32(rtm.DevState) > 4 && item.AlarmType != "传感器故障")//条件15:报警状态直接由“特重”下降到“重警” 类型:传感器故障
            {
                newItem.AlarmGrade = "重警";
                newItem.SendedCounter = 0;
                newItem.AlarmType = "传感器故障";                                           //报警类型
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            else if (item.AlarmGrade == "预警" && rtm.DevState == "0" && rtm.DevType == "开关量" && rtm.DevValue == 0)//条件16:报警状态直接由“预警”升级到“轻警” 类型:双风门开
            {
                newItem.AlarmGrade = "轻警";
                newItem.SendedCounter = 0;
                newItem.AlarmType = "双风门开";                                             //报警类型
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            else if (item.AlarmGrade == "重警" && rtm.DevState == "0" && rtm.DevType == "开关量" && rtm.DevValue == 0 && item.AlarmType != "双风门开")//条件17:报警状态直接由“重警”下降到“轻警” 类型:双风门开
            {
                newItem.AlarmGrade = "轻警";
                newItem.SendedCounter = 0;
                newItem.AlarmType = "双风门开";                                             //报警类型
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            else if (item.AlarmGrade == "特重" && rtm.DevState == "0" && rtm.DevType == "开关量" && rtm.DevValue == 0 && item.AlarmType != "双风门开")//条件17:报警状态直接由“特重”下降到“轻警” 类型:双风门开
            {
                newItem.AlarmGrade = "轻警";
                newItem.SendedCounter = 0;
                newItem.AlarmType = "双风门开";                                             //报警类型
                newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                newItem.Duration = duration;// 0;                                                       //持续时长
            }
            else if (item.AlarmGrade == "预警" && IsEarlyWarning(Convert.ToDecimal(rtm.AlarmURV), define.ShiftRange, rtm.DevValue, rtm.DevState) && rtm.DevState == "0")//条件10:报警状态由“预警”升级到“轻警”
            {
                if (define.AutoUpdate)
                {
                    //升级的间隔时间
                    int spanTime = Convert.ToInt32(define.GUModel.Split(',')[0]) * 60;

                    if (duration >= spanTime)
                    {
                        newItem.AlarmGrade = "轻警";
                        newItem.AlarmType = item.AlarmType;
                        newItem.SendedCounter = 0;
                        newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                        newItem.Duration = duration;// 0;                                                       //持续时长
                    }
                    else
                    {
                        newItem.AlarmGrade = "预警";
                        newItem.AlarmType = item.AlarmType;
                        newItem.SendedCounter = item.SendedCounter;
                        newItem.StartTime = item.StartTime;                         //开始报警时间
                        newItem.Duration = duration;                                //持续时长
                    }
                }
                else
                {
                    newItem.AlarmGrade = "预警";
                    newItem.AlarmType = item.AlarmType;
                    newItem.SendedCounter = item.SendedCounter;
                    newItem.StartTime = item.StartTime;                         //开始报警时间
                    newItem.Duration = duration;                                //持续时长
                }
            }
            else if (item.AlarmGrade == "轻警")//条件11:报警状态由“轻警”升级到“重警”
            {
                if (define.AutoUpdate)
                {
                    if (item.AlarmType == "预警" || item.AlarmType == "模拟量超限" || item.AlarmType == "双风门开")
                    {
                        //升级的间隔时间
                        int spanTime = Convert.ToInt32(define.GUModel.Split(',')[1]) * 60;
                        if (duration >= spanTime)
                        {
                            newItem.AlarmGrade = "重警";
                            newItem.AlarmType = item.AlarmType;
                            newItem.SendedCounter = 0;
                            newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                            newItem.Duration = duration;// 0;                       //持续时长
                        }
                        else
                        {
                            newItem.AlarmGrade = "轻警";
                            newItem.AlarmType = item.AlarmType;
                            newItem.SendedCounter = item.SendedCounter;
                            newItem.StartTime = item.StartTime;                         //开始报警时间
                            newItem.Duration = duration;                                //持续时长
                        }
                    }
                }
                else
                {
                    newItem.AlarmGrade = "轻警";
                    newItem.AlarmType = item.AlarmType;
                    newItem.SendedCounter = item.SendedCounter;
                    newItem.StartTime = item.StartTime;                         //开始报警时间
                    newItem.Duration = duration;                                //持续时长
                }
            }
            else if (item.AlarmGrade == "重警")//条件12:报警状态由“重警”升级到“特重”
            {
                if (define.AutoUpdate)
                {
                    if (item.AlarmType == "预警" || item.AlarmType == "模拟量超限" || item.AlarmType == "双风门开" || item.AlarmType == "超限断电" || item.AlarmType == "传感器故障")
                    {
                        //升级的间隔时间
                        int spanTime = Convert.ToInt32(define.GUModel.Split(',')[2]) * 60;
                        if (duration >= spanTime)
                        {
                            newItem.AlarmGrade = "特重";
                            newItem.AlarmType = item.AlarmType;
                            newItem.SendedCounter = 0;
                            newItem.StartTime = Convert.ToDateTime(rtm.RealTime);                       //开始报警时间
                            newItem.Duration = duration;// 0;                                                       //持续时长
                        }
                        else
                        {
                            newItem.AlarmGrade = "重警";
                            newItem.AlarmType = item.AlarmType;
                            newItem.SendedCounter = item.SendedCounter;
                            newItem.StartTime = item.StartTime;                                         //开始报警时间
                            newItem.Duration = duration;                                                //持续时长
                        }
                    }
                }
                else
                {
                    newItem.AlarmGrade = "重警";
                    newItem.AlarmType = item.AlarmType;
                    newItem.SendedCounter = item.SendedCounter;
                    newItem.StartTime = item.StartTime;                                         //开始报警时间
                    newItem.Duration = duration;                                                //持续时长
                }
            }
            else
            {
                newItem.AlarmGrade = item.AlarmGrade;
                newItem.AlarmType = item.AlarmType;
                newItem.SendedCounter = item.SendedCounter;
                newItem.StartTime = item.StartTime;                         //开始报警时间
                newItem.Duration = duration;                                //持续时长
            }

            #region  bulid alarm item object
            newItem.AlarmLRV = rtm.AlarmLRV;                             //报警下限
            //newItem.AlarmType = define.AlarmType;                         //报警类型
            newItem.AlarmURV = rtm.AlarmURV;                             //报警上限
            newItem.CoalCode = rtm.CoalCode;                             //煤矿编号
            newItem.CoalName = rtm.CoalName;                             //煤矿名称

            newItem.DevAddress = rtm.DevAddress;                           //传感器地址
            newItem.DevCode = rtm.DevCode;                              //传感器编号
            newItem.DevName = rtm.DevName;                              //传感器名称
            newItem.DevState = rtm.DevState;                             //传感器状态
            newItem.DevType = rtm.DevType;                              //传感器类型

            newItem.DevUnit = rtm.DevUnit;                              //传感器测量值单位
            newItem.DevValue = rtm.DevValue.ToString();                  //传感器测量值
            newItem.EndTime = Convert.ToDateTime(rtm.RealTime);         //结束时间
            newItem.UploadState = "正常";                                   //上传状态(此添加操作是设备级别的上传状态为正常)
            newItem.IsFinished = false;
            #endregion

            return newItem;
        }
        /// <summary>
        /// 添加上传中断报警信息
        /// </summary>
        /// <param name="state">数据上传状态实体</param>
        /// <param name="define">报警短信定义</param>
        private void AddState(Model.TN_UpLoadState state)
        {
            //删除操作(删除有可能在报警缓存中存在的该煤矿编号对应的其他报警信息)
            alarmItemList.RemoveAll(a => a.CoalCode == state.CoalCode);

            #region bulid alarm item object
            Model.TN_AlarmItem item = new Model.TN_AlarmItem();
            item.AlarmLRV = string.Empty;                                 //报警下限
            item.AlarmType = "数据上传中断";                               //报警类型
            item.AlarmGrade = "重警";                                       //报警级别
            item.AlarmURV = string.Empty;                                 //报警上限
            item.CoalCode = state.CoalCode;                               //煤矿编号
            item.CoalName = state.CoalName;                               //煤矿名称
            item.DevAddress = string.Empty;                                 //传感器地址
            item.DevCode = string.Empty;                                 //传感器编号
            item.DevName = "数据上传";                                   //传感器名称(此处为“数据上传”)
            item.DevState = string.Empty;                                 //传感器状态
            item.DevType = string.Empty;                                 //传感器类型
            item.DevUnit = string.Empty;                                 //传感器测量值单位
            item.DevValue = string.Empty;                                 //传感器测量值
            item.Duration = 0;                                            //持续时间(因为是添加操作持续时间为零)
            item.EndTime = Convert.ToDateTime(state.RealTime);           //结束时间
            item.SendedCounter = 0;                                            //已发送短信息次数(因为是添加操作没有短信发送操作)
            item.StartTime = Convert.ToDateTime(state.StartTime);          //开始报警时间
            item.UploadState = "中断";                                       //上传状态(此添加操作是设备级别的上传状态为正常)
            item.IsFinished = false;                                        //报警是否结束(添加操作报警没有结束)
            #endregion

            alarmItemList.Add(item);
        }
        /// <summary>
        /// 更新数据上传报警信息报警级别
        /// </summary>
        /// <param name="state">数据上传状态</param>
        /// <param name="define">报警短信息定义</param>
        /// <param name="item">原始报警信息</param>
        /// <returns>报警信息</returns>
        private Model.TN_AlarmItem UpdateAlalrmGradeForUpload(Model.TN_UpLoadState state, Model.TN_AlarmSendDefine define, Model.TN_AlarmItem item)
        {
            Model.TN_AlarmItem newItem = new Model.TN_AlarmItem();
            //截止到当前时间点的报警结束时间
            int duration = (int)(Convert.ToDateTime(state.RealTime) - item.StartTime).TotalSeconds;
            if (define.AutoUpdate)
            {
                //升级的间隔时间
                int spanTime = Convert.ToInt32(define.GUModel.Split(',')[2]) * 60;
                if (item.AlarmGrade == "重警" && (duration >= spanTime))
                {
                    newItem.AlarmGrade = "特重";                                  //报警级别
                    newItem.StartTime = Convert.ToDateTime(state.RealTime);       //开始报警时间
                    newItem.SendedCounter = 0;                                    //已发送短信息次数(因为是添加操作没有短信发送操作)
                    newItem.Duration = 0;                                         //持续时间(因为是添加操作持续时间为零)

                }
                else
                {
                    newItem.AlarmGrade = item.AlarmGrade;
                    newItem.StartTime = item.StartTime;
                    newItem.SendedCounter = item.SendedCounter;                   //已发送短信息次数(因为是添加操作没有短信发送操作)
                    newItem.Duration = duration;                                  //持续时间(因为是添加操作持续时间为零)
                }
            }
            else
            {
                newItem.AlarmGrade = item.AlarmGrade;
                newItem.StartTime = item.StartTime;
                newItem.SendedCounter = item.SendedCounter;                       //已发送短信息次数(因为是添加操作没有短信发送操作)
                newItem.Duration = duration;                                      //持续时间(因为是添加操作持续时间为零)
            }

            #region rebulid object
            newItem.AlarmLRV = string.Empty;                                 //报警下限
            newItem.AlarmType = "数据上传中断";                               //报警类型
            newItem.AlarmURV = string.Empty;                                 //报警上限
            newItem.CoalCode = state.CoalCode;                               //煤矿编号
            newItem.CoalName = state.CoalName;                               //煤矿名称

            newItem.DevAddress = string.Empty;                                 //传感器地址
            newItem.DevCode = string.Empty;                                 //传感器编号
            newItem.DevName = "数据上传";                                   //传感器名称(此处为“数据上传”)
            newItem.DevState = string.Empty;                                 //传感器状态
            newItem.DevType = string.Empty;                                 //传感器类型

            newItem.DevUnit = string.Empty;                                 //传感器测量值单位
            newItem.DevValue = string.Empty;                                 //传感器测量值
            newItem.EndTime = Convert.ToDateTime(state.RealTime);           //结束时间
            newItem.UploadState = "中断";                                       //上传状态(此添加操作是设备级别的上传状态为正常)
            newItem.IsFinished = false;                                        //报警是否结束(添加操作报警没有结束)
            #endregion
            return newItem;
        }
        /// <summary>
        /// 添加传感器报警信息
        /// </summary>
        /// <param name="rtm">实时数据</param>
        /// <param name="define">短信报警定义</param>
        private void AddItem(Model.TN_Rtm rtm, Model.TN_AlarmSendDefine define)
        {
            #region  bulid alarm item object
            Model.TN_AlarmItem item = new Model.TN_AlarmItem();
            item.AlarmLRV = rtm.AlarmLRV;                             //报警下限
            item.AlarmType = define.AlarmType;                         //报警类型
            item.AlarmGrade = define.AlarmGrade;                        //报警级别
            item.AlarmURV = rtm.AlarmURV;                             //报警上限
            item.CoalCode = rtm.CoalCode;                             //煤矿编号
            item.CoalName = rtm.CoalName;                             //煤矿名称
            item.DevAddress = rtm.DevAddress;                           //传感器地址
            item.DevCode = rtm.DevCode;                              //传感器编号
            item.DevName = rtm.DevName;                              //传感器名称
            item.DevState = rtm.DevState;                             //传感器状态
            item.DevType = rtm.DevType;                              //传感器类型
            item.DevUnit = rtm.DevUnit;                              //传感器测量值单位
            item.DevValue = rtm.DevValue.ToString();                  //传感器测量值
            item.Duration = (int)(Convert.ToDateTime(rtm.RealTime) - Convert.ToDateTime(rtm.ChageStateTime)).TotalSeconds;// 0;                                        //持续时间(因为是添加操作持续时间为零)
            item.EndTime = Convert.ToDateTime(rtm.RealTime);         //结束时间
            item.SendedCounter = 0;                                        //已发送短信息次数(因为是添加操作没有短信发送操作)
            item.StartTime = Convert.ToDateTime(rtm.ChageStateTime);         //开始报警时间
            item.UploadState = "正常";                                   //上传状态(此添加操作是设备级别的上传状态为正常)
            item.IsFinished = false;                                    //报警是否结束(添加操作报警没有结束)
            #endregion

            alarmItemList.Add(item);
        }