예제 #1
0
        /// <summary>
        /// 只有warnCoefficientMin,表只有下界,过界则录入
        /// 有min和max则有上下界,界内录入
        ///
        /// IsCondition1Error:上界
        /// IsCondition2Error:下界
        /// </summary>
        private IEnumerable <T> getWarnResult(WarnSettings warnSettings, TDetail detail, double warnCoefficientMin, out AnalizeResultCollection analysis)
        {
            //算法
            List <T> result = new List <T>();

            analysis = new AnalizeResultCollection();
            var d = Datas.FirstOrDefault();

            if (d == null)
            {
                return(result);
            }

            var totalHourRange = 24;
            var endTime        = detail.IssueDateTime;
            var details        = Facade.GetDetailsByTimeRange(detail.IssueType, endTime.AddHours(-totalHourRange), endTime);
            var orderedDetails = details.OrderByDescending(c => c.IssueDateTime).ToList();
            var currentDetail  = detail;
            //需预警的节点
            var maxAxle = warnSettings.STBAP_MaxAxleRate * warnSettings.STBAP_StandardAxle / 100;

            foreach (var data in Datas)
            {
                if (data.AxialForce_Float >= maxAxle * warnCoefficientMin)
                {
                    result.Add(data);
                    analysis[data.NodeCode].IsCondition1Error = true;
                }
            }
            var minAxle = warnSettings.STBAP_MinAxleRate * warnSettings.STBAP_StandardAxle / 100;

            foreach (var data in Datas)
            {
                if (data.AxialForce_Float <= minAxle / warnCoefficientMin)
                {
                    result.Add(data);
                    analysis[data.NodeCode].IsCondition2Error = true;
                }
            }
            return(result);
        }
예제 #2
0
        /// <summary>
        /// 地表沉降
        /// IsCondition1Error:累计变量
        /// IsCondition2Error:本次变量
        /// </summary>
        private IEnumerable <T> getWarnResult(WarnSettings warnSettings, TDetail detail, double warnCoefficientMin, out AnalizeResultCollection analysis)
        {
            List <T> result = new List <T>();

            analysis = new AnalizeResultCollection();
            var d = Datas.FirstOrDefault();

            if (d == null)
            {
                return(result);
            }

            var totalHourRange = warnSettings.SurfaceSubsidence_Day * 24;
            var endTime        = detail.IssueDateTime;
            var details        = Facade.GetDetailsByTimeRange(detail.IssueType, endTime.AddHours(-totalHourRange), endTime);
            var orderedDetails = details.OrderByDescending(c => c.IssueDateTime).ToList();
            var currentDetail  = detail;
            //需预警的节点
            //监测 warnSettings.SurfaceSubsidence_SumMillimeter;
            var sumMillimeter = warnSettings.SurfaceSubsidence_SumMillimeter;

            foreach (var data in Datas)
            {
                if (data.SumChanges_Float >= sumMillimeter * warnCoefficientMin)
                {
                    result.Add(data);
                    analysis[data.NodeCode].IsCondition1Error = true;
                }
            }
            //监测 warnSettings.SurfaceSubsidence_DailyMillimeter;
            //数据天数达标监测
            if (totalHourRange != 0)
            {
                var    dailyMillimeter        = warnSettings.SurfaceSubsidence_DailyMillimeter;
                double warnDailyMillimeterMin = dailyMillimeter * warnCoefficientMin;
                var    tempTotalTimeRange     = totalHourRange;
                int    detailIndex            = 0;
                while (tempTotalTimeRange > 0)
                {
                    if (detailIndex == orderedDetails.Count())
                    {
                        throw new NotImplementedException("未满足监测报警要求的天数");
                    }
                    var nextDetail       = orderedDetails[detailIndex];
                    var currentTimeRange = (int)(currentDetail.IssueDateTime.AddMinutes(currentDetail.IssueTimeRange) - nextDetail.IssueDateTime.AddMinutes(nextDetail.IssueTimeRange)).TotalHours;
                    if (currentTimeRange <= tempTotalTimeRange)
                    {
                        tempTotalTimeRange -= currentTimeRange;
                    }
                    else
                    {
                        tempTotalTimeRange -= currentTimeRange;
                    }
                    currentDetail = nextDetail;
                    detailIndex++;
                }
                foreach (var data in Datas)
                {
                    //不在已有冲突的情况下直接跳过监测处理
                    //if (result.Contains(data))
                    //    continue;

                    detailIndex   = 0;
                    currentDetail = detail;
                    int    days       = warnSettings.SurfaceSubsidence_Day;
                    double overHours  = 0;
                    double overValues = 0;
                    while (days > 0)
                    {
                        double dailyValue  = 0;
                        double hoursToDeal = 0;
                        if (overHours >= 24)
                        {
                            dailyValue  = overValues * 24 / overHours;
                            overValues -= dailyValue;
                            overHours  -= 24;
                        }
                        else
                        {
                            dailyValue  = overValues;
                            hoursToDeal = 24 - overHours;
                            while (hoursToDeal > 0)
                            {
                                var currentNodeData = currentDetail.NodeDatas.Datas.FirstOrDefault(c => c.NodeCode == data.NodeCode);
                                if (currentNodeData == null) //信息缺失,不作提醒处理  当前所需的节点数据不存在
                                {
                                    days        = -1;        //-1表信息缺失
                                    hoursToDeal = 0;
                                    break;
                                }
                                var    nextDetail       = orderedDetails[detailIndex];
                                double currentTimeRange = (currentDetail.IssueDateTime.AddMinutes(currentDetail.IssueTimeRange) - nextDetail.IssueDateTime.AddMinutes(nextDetail.IssueTimeRange)).TotalHours;
                                if (currentTimeRange <= hoursToDeal)
                                {
                                    dailyValue += (currentNodeData as T).CurrentChanges_Float;
                                }
                                else
                                {
                                    dailyValue += (currentNodeData as T).CurrentChanges_Float * (hoursToDeal / currentTimeRange);
                                    overHours   = currentTimeRange - hoursToDeal;
                                    overValues  = (currentNodeData as T).CurrentChanges_Float * (overHours / currentTimeRange);
                                }
                                hoursToDeal -= currentTimeRange;
                                detailIndex++;
                                currentDetail = nextDetail;
                            }
                        }
                        //时间已尽 检测是否到达预期值
                        if (days == -1)
                        {
                            break;
                        }
                        if (dailyValue >= warnDailyMillimeterMin)
                        {
                            days--;
                        }
                        else
                        {
                            days = -2;//-2表信息未到连续标准
                            break;
                        }
                    }
                    if (days == 0)//处理结束 认为按照标准的到达了日期0则各天检测通过
                    {
                        result.Add(data);
                        analysis[data.NodeCode].IsCondition1Error = true;
                    }
                }
            }
            return(result);
        }
예제 #3
0
 public IEnumerable <T> GetOverWarn(WarnSettings warnSettings, TDetail detail, out AnalizeResultCollection analysis)
 {
     return(getWarnResult(warnSettings, detail, WarnSettings.OverCoefficient, out analysis));
 }
예제 #4
0
        public List <ElementId> GetOverWarnNodesElementsByTNode(Document doc, WarnSettings warnSettings, out AnalizeResultCollection analysis)
        {
            List <ElementId> results = new List <ElementId>();

            foreach (var node in MemorableData.Data.NodeDatas.GetOverWarn(warnSettings, MemorableData.Data, out analysis))
            {
                results.AddRange(GetElementIds(node.NodeCode, doc));
            }
            return(results);
        }