Skip to content

Instantly share code, notes, and snippets.

@ShilGen
Last active June 16, 2023 20:30
Show Gist options
  • Save ShilGen/5590a43d980ce71e978239fc7f094125 to your computer and use it in GitHub Desktop.
Save ShilGen/5590a43d980ce71e978239fc7f094125 to your computer and use it in GitHub Desktop.
// ПБК: 4ЦК Профиль А+ (60 мин)
// Энергия А+ за 1 час
// № ПУ | Дата | Показания
//Входные параметры отчета
var workSheet = WorkbookNonExcel.Worksheets.FirstOrDefault();
var meterPoints = ReportParams.ClassifierNodes.SelectMany(x => x.GetAllChildrenOfClass(MeterPoint.GetClassInfo())).OfType<MeterPoint>().Distinct().ToArray();
var parameters = new Dictionary<DirectionBasedParameter, string>{{DirectionBasedParameter.Instances.EnergyActiveForward1hour, "A+, кВт" },};
ReportParams.StartDt = ReportParams.StartDt.AlignToDay();
ReportParams.EndDt = ReportParams.EndDt.AlignToDay();
DayIntervalData interval = new DayIntervalData{StartDt = ReportParams.StartDt,EndDt = ReportParams.EndDt.AddMinutes(60)};
TimeSpan qHours = ReportParams.EndDt.AddMinutes(60).Subtract(ReportParams.StartDt);
// Заголовок таблицы
workSheet.Cells[0, 0].Value = "Прибор учета";
workSheet.Cells[0, 1].Value = "Дата и время";
workSheet.Cells[0, 2].Value = "Показания";
workSheet.Cells.GetSubrangeAbsolute(0, 0, 0, 2).SetHeaderFormat();
// настройки выборки данных
var settings = new SettingsGetMeterPointDataData{ RequireAllIntervalsForIntervalParameters = true}; // получить все интервалы
var decimalPlaces = 4; // знаки после запятой
int SI_multiples = 1000; // для отображения значений в кВт
DateTime tmpDt; // переменная для вывода временных значений
int dataRow = 1;
int maxRowsCount = 1048500;
if ((1 + meterPoints.Length * qHours.TotalHours ) > maxRowsCount)
{
AddLogInfo("Выберите меньшее количество счетчиков или меньший период времени. ");
throw new ExecuteRegularException("Превышено максимальное количество строк для формирования отчёта");
}
// поддерживаемые параметры ТУ
var meterPointSupportedParameterInfo = new Dictionary<MeterPoint, DirectionBasedParameter[]>();
var meterPointsStartColumn = new Dictionary<MeterPoint, int>();
foreach (var meterPoint in meterPoints)
{
var meter = meterPoint.AttributeElectricityMeter;
meterPointSupportedParameterInfo[meterPoint] = parameters.Select(x => x.Key).Where(x => meter == null || meter.IsParameterSupported(x).GetValueOrDefault(true)).ToArray();
}
//формирование таблицы
using(PreloadManager.Current.RegisterCache(() => new MeterPointGetEnergyValueCache(meterPoints, parameters.Keys, interval)))
{
foreach (var meterPoint in meterPoints)
{
var meter = meterPoint.AttributeElectricityMeter;
tmpDt = ReportParams.StartDt;
meterPointSupportedParameterInfo.TryGetValue(meterPoint, out var meterParams);
if (meterParams == null) meterParams = new DirectionBasedParameter[0];
if (meterParams.Length == 1)
{
var datas = meterPoint.GetMeterPointFinalDataEx(meterParams[0], interval, settings);
foreach (var data in datas)
{
if (meter != null) { workSheet.Cells[dataRow, 0].Value = meter.AttributeSerialNumber;}
workSheet.Cells[dataRow, 1].Value = tmpDt.ToString("dd.MM.yyyy HH:mm");
workSheet.Cells[dataRow, 2].Value = "н/д";
if (!double.IsNaN(data.Value)) workSheet.Cells[dataRow, 2].Value = Math.Round(data.Value / SI_multiples, decimalPlaces);
if (tmpDt == ReportParams.StartDt)
{
workSheet.Cells.GetSubrangeAbsolute(dataRow, 0, dataRow, 2).Style.FillPattern.SetSolid(Color.FromArgb(0, 172, 225, 175));
}
tmpDt = tmpDt.AddMinutes(60);
dataRow++;
}
}
}
}
//Форматирование таблицы
var dataCells = workSheet.Cells.GetSubrangeAbsolute(0, 0, dataRow-1, 2);
dataCells.SetBorder();
dataCells.Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment