private MeterAlarmSummaryRow CreateSummaryRow(MeterAlarmSummaryDataTable meterAlarmSummaryTable, int meterID, int alarmTypeID, DateTime date, int alarmPoints) { MeterAlarmSummaryRow row = meterAlarmSummaryTable.NewMeterAlarmSummaryRow(); row.MeterID = meterID; row.AlarmTypeID = alarmTypeID; row.Date = date; row.AlarmPoints = alarmPoints; return(row); }
private void LoadRangeLimits(MeterDataSet meterDataSet) { MeterAlarmSummaryTableAdapter meterAlarmSummaryAdapter; ChannelAlarmSummaryTableAdapter channelAlarmSummaryAdapter; HourOfWeekLimitTableAdapter hourlyLimitAdapter; MeterAlarmSummaryDataTable meterAlarmSummaryTable; ChannelAlarmSummaryDataTable channelAlarmSummaryTable; Dictionary <Channel, List <DataGroup> > trendingGroups; DateTime startTime; DateTime endTime; int days; meterAlarmSummaryAdapter = m_dbAdapterContainer.GetAdapter <MeterAlarmSummaryTableAdapter>(); channelAlarmSummaryAdapter = m_dbAdapterContainer.GetAdapter <ChannelAlarmSummaryTableAdapter>(); hourlyLimitAdapter = m_dbAdapterContainer.GetAdapter <HourOfWeekLimitTableAdapter>(); meterAlarmSummaryTable = new MeterAlarmSummaryDataTable(); channelAlarmSummaryTable = new ChannelAlarmSummaryDataTable(); trendingGroups = meterDataSet.GetResource <TrendingGroupsResource>().TrendingGroups; startTime = trendingGroups .SelectMany(kvp => kvp.Value) .Select(dataGroup => dataGroup.StartTime) .DefaultIfEmpty(DateTime.MaxValue) .Min().Date; endTime = trendingGroups .SelectMany(kvp => kvp.Value) .Select(dataGroup => dataGroup.EndTime) .DefaultIfEmpty(DateTime.MinValue) .Max(); if (endTime != endTime.Date) { endTime = endTime.Date.AddDays(1.0D); } days = (int)Math.Ceiling((endTime - startTime).TotalDays); if (days < 0) { return; } using (Historian historian = new Historian(m_historianSettings.Server, m_historianSettings.InstanceName)) { for (int i = 0; i < days; i++) { DateTime queryStart = startTime.AddDays(i); DateTime queryEnd = queryStart.AddDays(1.0D).AddTicks(-1L); List <ChannelAlarmSummaryRow> channelAlarmSummaries = historian.Read(meterDataSet.Meter.Channels.Select(channel => channel.ID), queryStart, queryEnd) .Where(trendingPoint => trendingPoint.SeriesID == SeriesID.Average) .GroupBy(trendingPoint => trendingPoint.ChannelID) .SelectMany(channelGroup => { Channel channel = m_dbAdapterContainer.GetAdapter <MeterInfoDataContext>().Channels.Single(ch => ch.ID == channelGroup.Key); AlarmRangeLimitDataTable rangeLimitTable = InitializeRangeLimitTable(channel); return(channelGroup .SelectMany(TrendingPoint => rangeLimitTable.Where(rangeLimit => rangeLimit.Enabled != 0).Select(RangeLimit => new { TrendingPoint, RangeLimit })) .Where(obj => CheckAlarm(channel, obj.TrendingPoint, obj.RangeLimit)) .GroupBy(obj => obj.RangeLimit.AlarmTypeID) .Select(alarmTypeGroup => CreateSummaryRow(channelAlarmSummaryTable, channelGroup.Key, alarmTypeGroup.Key, queryStart, alarmTypeGroup.Count()))); }) .ToList(); IEnumerable <MeterAlarmSummaryRow> meterAlarmSummaries = channelAlarmSummaries .GroupBy(channelAlarmSummary => channelAlarmSummary.AlarmTypeID) .Select(channelSummaryGroup => CreateSummaryRow(meterAlarmSummaryTable, meterDataSet.Meter.ID, channelSummaryGroup.Key, queryStart, channelSummaryGroup.Sum(channelAlarmSummary => channelAlarmSummary.AlarmPoints))); foreach (MeterAlarmSummaryRow meterAlarmSummary in meterAlarmSummaries) { meterAlarmSummaryAdapter.Upsert(meterAlarmSummary); } foreach (ChannelAlarmSummaryRow channelAlarmSummary in channelAlarmSummaries) { channelAlarmSummaryAdapter.Upsert(channelAlarmSummary); } } } }