/// <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); }
/// <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); }
public IEnumerable <T> GetOverWarn(WarnSettings warnSettings, TDetail detail, out AnalizeResultCollection analysis) { return(getWarnResult(warnSettings, detail, WarnSettings.OverCoefficient, out analysis)); }
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); }