/// <summary>
        /// 从内存中获取到该测点已有的报警信息
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        private JC_MbInfo GetAlarmInfo(string point)
        {
            JC_MbInfo alarmInfo = null;

            try
            {
                List <JC_MbInfo> alarmInfoItems = null;
                RatioAlarmCacheGetByConditonRequest ratioAlarmCacheGetByConditonRequest = new RatioAlarmCacheGetByConditonRequest();
                ratioAlarmCacheGetByConditonRequest.Predicate = a => a.Point == point;
                var result = ratioAlarmCacheService.GetAlarmCache(ratioAlarmCacheGetByConditonRequest);
                if (result.Data != null && result.IsSuccess)
                {
                    alarmInfoItems = result.Data;
                    if (alarmInfoItems.Count == 0)
                    {
                        alarmInfo = null;
                    }
                    else if (alarmInfoItems.Count > 1)
                    {
                        alarmInfo = alarmInfoItems[0];
                        LogHelper.Error("RatioAlarmProcHandle GetAlarmInfo 发现异常," + point + "同时存在多个倍数报警记录!");
                    }
                    else
                    {
                        alarmInfo = alarmInfoItems[0];
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("RatioAlarmProcHandle GetAlarmInfo Error" + ex.Message);
            }

            return(alarmInfo);
        }
        /// <summary>
        /// 跨天处理,结束旧报警,生成新报警
        /// </summary>
        private void CrossDay(List <Jc_DefInfo> pointItems, List <JC_MultiplesettingInfo> multiplesettingInfotems, DateTime etime, DateTime stime)
        {
            JC_MbInfo                   jcmb       = null;
            JC_MbInfo                   tempJcmb   = null;
            double                      basicValue = 0;
            double                      ssz        = 0;
            List <JC_MbInfo>            delItems   = new List <JC_MbInfo>();
            List <JC_MbInfo>            addItems   = new List <JC_MbInfo>();
            JC_MultiplesettingInfo      multiplesettingInfotem;
            RatioAlarmConditions        ratioAlarmConditionItem;
            List <RatioAlarmConditions> ratioAlarmConditionItems = null;

            foreach (Jc_DefInfo def in pointItems)
            {
                jcmb = GetAlarmInfo(def.Point);
                if (jcmb != null)
                {
                    jcmb.Etime = etime;
                    delItems.Add(jcmb);

                    multiplesettingInfotem = multiplesettingInfotems.FirstOrDefault(a => a.Devid == def.Devid);
                    if (multiplesettingInfotem == null)
                    {
                        continue;
                    }                                                 //未定义该设备类型的倍率报警
                    ratioAlarmConditionItems = GetRatioAlarmConditionsFromStr(multiplesettingInfotem);
                    if (ratioAlarmConditionItems == null)
                    {
                        continue;
                    }                                                   //提取倍率报警定义出错,不继续计算
                    basicValue = GetBasicValueByDef(def);
                    if (basicValue == 0)
                    {
                        continue;
                    }                                    //没有基础值,不计算
                    ratioAlarmConditionItem = ratioAlarmConditionItems[Convert.ToInt32(jcmb.Type) - 1];
                    double.TryParse(def.Ssz, out ssz);
                    tempJcmb = JCMB_Copy(jcmb, ratioAlarmConditionItem, stime, ssz, basicValue);

                    addItems.Add(tempJcmb);
                }
            }
            EndAlarmItems(delItems);
            StartAlarms(addItems);
        }
        private JC_MbInfo JCMB_Copy(JC_MbInfo jcmb, RatioAlarmConditions ratioAlarmConditionItem, DateTime stime, double ssz, double basicValue)
        {
            JC_MbInfo newJcmb = new JC_MbInfo();

            newJcmb.Id      = IdHelper.CreateLongId().ToString();
            newJcmb.Point   = jcmb.Point;
            newJcmb.PointID = jcmb.PointID;
            newJcmb.Fzh     = jcmb.Fzh;
            newJcmb.Kh      = jcmb.Kh;
            newJcmb.Dzh     = jcmb.Dzh;
            newJcmb.Devid   = jcmb.Devid;
            newJcmb.Wzid    = jcmb.Wzid;
            newJcmb.Type    = jcmb.Type;
            newJcmb.Bstj    = "[" + ratioAlarmConditionItem.minValue + "," + ratioAlarmConditionItem.maxValue + "," + ratioAlarmConditionItem.ratioValue + "]";
            newJcmb.Bsz     = ratioAlarmConditionItem.ratioValue;
            newJcmb.Stime   = stime;
            newJcmb.Etime   = new DateTime(1900, 1, 1, 0, 0, 0);
            newJcmb.Ssz     = ssz;
            newJcmb.Zdz     = ssz;
            newJcmb.Pjz     = basicValue;
            newJcmb.Zdzs    = stime;
            return(newJcmb);
        }
        private void DataProc()
        {
            List <Jc_DefInfo>             pointDefineItems         = null;
            SettingInfo                   settingInfo              = null;
            string                        settingTime              = ""; //上次加载倍率报警配置时间
            List <JC_MultiplesettingInfo> multiplesettingInfotems  = null;
            JC_MultiplesettingInfo        multiplesettingInfotem   = null;
            List <RatioAlarmConditions>   ratioAlarmConditionItems = null;
            RatioAlarmConditions          ratioAlarmConditionItem  = null;
            double                        sszValue   = 0;
            double                        basicValue = 0;
            int              alarmType         = 0;
            JC_MbInfo        ratioAlarm        = null;
            DateTime         getBasicValueDate = DateTime.Now.AddDays(-1); //上次获取周平均值的时间
            List <JC_MbInfo> alarm_AddItems    = new List <JC_MbInfo>();
            List <JC_MbInfo> alarm_DelItems    = new List <JC_MbInfo>();
            List <JC_MbInfo> alarm_UpdateItems = new List <JC_MbInfo>();

            DateTime lastProcData = DateTime.Now; //最后一次处理数据的日期
            DateTime nowTime      = DateTime.Now; //本次处理时间

            for (; ;)
            {
                try
                {
                    nowTime = DateTime.Now;
                    if (isStop)
                    {
                        break;
                    }
                    //获取定义信息
                    pointDefineItems = CacheDataHelper.GetKJPointDefineItems();

                    //判断是否重载倍率报警定义
                    settingInfo = CacheDataHelper.GetSettingByKeyStr("MultipleSettingUpdateTime");
                    if (settingInfo != null)
                    {
                        if (settingTime != settingInfo.StrValue)
                        {
                            //重新加载倍率报警定义信息
                            multiplesettingInfotems = GetAllMultiplesettingInfo();
                            settingTime             = settingInfo.StrValue;
                        }
                    }
                    else
                    {
                        Thread.Sleep(timeSpan * 1000);
                        continue;
                    }

                    //筛选模拟量
                    pointDefineItems = pointDefineItems.Where(a => (a.DevPropertyID == (int)DeviceProperty.Analog) &&
                                                              (multiplesettingInfotems.FirstOrDefault(b => b.Devid == a.Devid) != null)).ToList();

                    if (pointDefineItems.Count == 0)
                    {
                        Thread.Sleep(timeSpan * 1000); continue;
                    }


                    //重载周平均值
                    if (getBasicValueDate.Date != nowTime.Date)
                    {
                        ReloadBasicValues(pointDefineItems);
                        getBasicValueDate = nowTime;
                    }

                    if (pointDefineItems == null)
                    {
                        Thread.Sleep(timeSpan * 1000); continue;
                    }
                    if (pointDefineItems.Count == 0)
                    {
                        Thread.Sleep(timeSpan * 1000); continue;
                    }



                    alarm_AddItems    = new List <JC_MbInfo>();
                    alarm_DelItems    = new List <JC_MbInfo>();
                    alarm_UpdateItems = new List <JC_MbInfo>();

                    if (lastProcData.Date != nowTime.Date)
                    {
                        //结束报警重新生成
                        CrossDay(pointDefineItems, multiplesettingInfotems, new DateTime(lastProcData.Year, lastProcData.Month, lastProcData.Day, 23, 59, 59), new DateTime(nowTime.Year, nowTime.Month, nowTime.Day, 0, 0, 0));
                        lastProcData = nowTime;
                    }

                    foreach (Jc_DefInfo def in pointDefineItems)
                    {
                        if (isStop)
                        {
                            break;
                        }
                        if (double.TryParse(def.Ssz, out sszValue))
                        {
                            multiplesettingInfotem = multiplesettingInfotems.FirstOrDefault(a => a.Devid == def.Devid);
                            if (multiplesettingInfotem == null)
                            {
                                continue;
                            }                                                                                  //未定义该设备类型的倍率报警
                            ratioAlarmConditionItems = GetRatioAlarmConditionsFromStr(multiplesettingInfotem); //解析倍率报警配置
                            if (ratioAlarmConditionItems == null)
                            {
                                continue;
                            }                                       //提取倍率报警定义出错,不继续计算
                            basicValue = GetBasicValueByDef(def);   //获取周平均值
                            if (basicValue == 0)
                            {
                                continue;
                            }                                   //没有基础值,不计算
                            //计算报警等级
                            alarmType = JudgeAlarmType(sszValue, ratioAlarmConditionItems, basicValue);
                            if (alarmType != 0)
                            {
                                ratioAlarmConditionItem = ratioAlarmConditionItems[alarmType - 1];  //获取当前报警的倍率信息配置
                            }
                            ratioAlarm = GetAlarmInfo(def.Point);
                            #region ----报警处理----

                            if (ratioAlarm == null)
                            {
                                if (alarmType > 0)
                                {
                                    //之前没有报警 现在有报警(新增报警)
                                    ratioAlarm         = new JC_MbInfo();
                                    ratioAlarm.Id      = IdHelper.CreateLongId().ToString();
                                    ratioAlarm.Point   = def.Point;
                                    ratioAlarm.PointID = def.PointID;
                                    ratioAlarm.Fzh     = def.Fzh.ToString();
                                    ratioAlarm.Kh      = def.Kh.ToString();
                                    ratioAlarm.Dzh     = def.Dzh.ToString();
                                    ratioAlarm.Devid   = def.Devid;
                                    ratioAlarm.Wzid    = def.Wzid;
                                    ratioAlarm.Type    = alarmType.ToString();
                                    ratioAlarm.Bstj    = "[" + ratioAlarmConditionItem.minValue + "," + ratioAlarmConditionItem.maxValue + "," + ratioAlarmConditionItem.ratioValue + "]";
                                    ratioAlarm.Bsz     = ratioAlarmConditionItem.ratioValue;
                                    ratioAlarm.Stime   = nowTime;
                                    ratioAlarm.Ssz     = Convert.ToDouble(def.Ssz);
                                    ratioAlarm.Pjz     = basicValue;
                                    ratioAlarm.Zdz     = sszValue;
                                    ratioAlarm.Zdzs    = nowTime;

                                    alarm_AddItems.Add(ratioAlarm);
                                }
                            }
                            else
                            {
                                if (alarmType == 0)
                                {
                                    //之前有报警 现在没有报警(结束报警)
                                    ratioAlarm.Etime = nowTime;
                                    alarm_DelItems.Add(ratioAlarm);
                                }
                                else
                                {
                                    if (alarmType.ToString() != ratioAlarm.Type)
                                    {
                                        //之前有报警 报警切换(结束旧报警,生成新报警)
                                        ratioAlarm.Etime = nowTime;
                                        alarm_DelItems.Add(ratioAlarm);

                                        //生成新报警
                                        ratioAlarm         = new JC_MbInfo();
                                        ratioAlarm.Id      = IdHelper.CreateLongId().ToString();
                                        ratioAlarm.Point   = def.Point;
                                        ratioAlarm.PointID = def.PointID;
                                        ratioAlarm.Fzh     = def.Fzh.ToString();
                                        ratioAlarm.Kh      = def.Kh.ToString();
                                        ratioAlarm.Dzh     = def.Dzh.ToString();
                                        ratioAlarm.Devid   = def.Devid;
                                        ratioAlarm.Wzid    = def.Wzid;
                                        ratioAlarm.Type    = alarmType.ToString();
                                        ratioAlarm.Bstj    = "[" + ratioAlarmConditionItem.minValue + "," + ratioAlarmConditionItem.maxValue + "," + ratioAlarmConditionItem.ratioValue + "]";
                                        ratioAlarm.Bsz     = ratioAlarmConditionItem.ratioValue;
                                        ratioAlarm.Stime   = nowTime;
                                        ratioAlarm.Ssz     = Convert.ToDouble(def.Ssz);
                                        ratioAlarm.Pjz     = basicValue;
                                        ratioAlarm.Zdz     = sszValue;
                                        ratioAlarm.Zdzs    = nowTime;

                                        alarm_AddItems.Add(ratioAlarm);
                                    }
                                    else
                                    {
                                        //报警状态持续,更新报警期间最大值
                                        if (sszValue > ratioAlarm.Zdz)
                                        {
                                            ratioAlarm.Zdz  = sszValue;
                                            ratioAlarm.Zdzs = nowTime;
                                            //更新报警
                                            alarm_UpdateItems.Add(ratioAlarm);
                                        }
                                    }
                                }
                            }

                            #endregion
                        }
                    }
                    if (alarm_DelItems.Count > 0)
                    {
                        EndAlarmItems(alarm_DelItems);
                    }
                    if (alarm_AddItems.Count > 0)
                    {
                        StartAlarms(alarm_AddItems);
                    }
                    if (alarm_UpdateItems.Count > 0)
                    {
                        UpdateAlarm(alarm_UpdateItems);
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Error("RatioAlarmProcHandle DataProc Error" + ex.Message);
                }
                Thread.Sleep(timeSpan * 1000);
            }
        }