Skip to content

Instantly share code, notes, and snippets.

@ShilGen
Last active September 27, 2023 08:03
Show Gist options
  • Save ShilGen/ac22c024fcae8cd903a8fe86df5e40c9 to your computer and use it in GitHub Desktop.
Save ShilGen/ac22c024fcae8cd903a8fe86df5e40c9 to your computer and use it in GitHub Desktop.
ПБК: шаблон импорта данных, отличие от стандартного: вместо точки учета отображаем номера счетчиков
var workSheet = WorkbookNonExcel.Worksheets.FirstOrDefault();
// выравнивание дат
ReportParams.StartDt = ReportParams.StartDt.AlignToDay();
ReportParams.EndDt = ReportParams.EndDt.AlignToDay();
//workSheet.Cells[0, 0].Value = string.Format("Сформирован: {0:dd.MM.yyyy HH:mm}", DateTime.UtcNow.AddHours(User.GetClassInfo().GetCurrentUserTimeZoneOffset()));
// исключить корневых родителей, если используется фильтрация
ReportParams.ClassifierItems = ReportParams.ClassifierItems.GetClassifierNodesWithoutParentIfFilterDetected(ReportParams.ClassifierItemsFilterDetected, ReportParams.ClassifierItemsClassifier).ToArray();
//var meterPoints = ReportParams.ClassifierItems.SelectMany(x => x.GetAllChildrenOfClass(BaseMeterPoint.GetClassInfo())).OfType<BaseMeterPoint>().Distinct().ToArray();
var meterPoints = ReportParams.ClassifierItems.SelectMany(x => x.GetAllChildrenOfClass(MeterPoint.GetClassInfo())).OfType<MeterPoint>().Distinct().ToArray();
var sourceParameters = ReportParams.Parameters.Where(x=>x != null).Distinct().ToArray();
//= new Parameter[] {TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay, TariffZoneBasedParameter.Instances.EnergyActiveReverseTotalFixDay, TariffZoneBasedParameter.Instances.EnergyReactiveForwardTotalFixDay, TariffZoneBasedParameter.Instances.EnergyReactiveReverseTotalFixDay};
//= new Parameter[] {DirectionBasedParameter.Instances.EnergyActiveForward30Min, DirectionBasedParameter.Instances.EnergyActiveReverse30Min, DirectionBasedParameter.Instances.EnergyReactiveForward30Min, DirectionBasedParameter.Instances.EnergyReactiveReverse30Min};
int tableColumnsCount = 1;
int tableRowsCount = 1;
var tableStartRow = 1;
var discrets = sourceParameters.Select(parameter => parameter.AttributeMeasureInterval ?? (parameter.AttributeFixationRules == null ? null : parameter.AttributeFixationRules.AttributeInterval)).ToArray();
if (!discrets.Any() || discrets.Any(x=>x == null)) throw new Exception("Должны использоваться параметры одной дискретности");
var discret = discrets.First();
if (discrets.Any(x=>x.AttributeDiscretType != discret.AttributeDiscretType || x.AttributeDiscretValue != discret.AttributeDiscretValue)) throw new Exception("Должны использоваться параметры одной дискретности");
var discretValue = discret.ToDiscretInterval();
var multiplier = 1.0;
var multiplierCaption = "";
if (WebApplication.OnlyInstance.AttributeCommonWebViewSettings != null && WebApplication.OnlyInstance.AttributeCommonWebViewSettings.AttributeEnergyMultiplier != null &&
WebApplication.OnlyInstance.AttributeCommonWebViewSettings.AttributeEnergyMultiplier.AttributeValue != null) {
multiplier = Math.Pow(10, WebApplication.OnlyInstance.AttributeCommonWebViewSettings.AttributeEnergyMultiplier.AttributeValue.GetValueOrDefault());
multiplierCaption = WebApplication.OnlyInstance.AttributeCommonWebViewSettings.AttributeEnergyMultiplier.Caption;
}
if (ReportParams.IsProfile) {
var interval = new DayIntervalData { StartDt = ReportParams.StartDt, EndDt = ReportParams.EndDt};
var intervals = interval.MakeIntervalPartitioning(discretValue).Where(x=>x.EndDt < ReportParams.EndDt).ToArray();
workSheet.Cells[0, 0].Value = "Идентификатор ТУ";
workSheet.Cells[0, 1].Value = "ТУ";
workSheet.Cells[0, 2].Value = "Идентификатор параметра";
workSheet.Cells[0, 3].Value = "Параметр";
var startColumn = 4;
var columns = startColumn;
foreach(var smallInterval in intervals) {
workSheet.Cells[0, columns].Value = string.Format("{0:dd.MM.yyyy HH:mm}", smallInterval.EndDt);
columns++;
}
tableColumnsCount = columns;
var index = tableStartRow;
using (PreloadManager.Current.RegisterCache(() => new MeterPointGetEnergyValueCache(meterPoints, sourceParameters, interval)))
foreach(var meterPoint in meterPoints) {
if (meterPoint == null) continue;
foreach(var parameter in sourceParameters) {
var data = meterPoint.GetBaseMeterPointFinalData(parameter, interval).Where(x=>x.ValueDt.HasValue).ToDictionary(x=>x.ValueDt, y=>y.Value);
workSheet.Cells[index, 0].Value = meterPoint.IntRefName;
//workSheet.Cells[index, 1].Value = meterPoint.AttributeDisplayedCaption;
if (meterPoint.AttributeElectricityMeter != null)
{
workSheet.Cells[index, 1].Value = meterPoint.AttributeElectricityMeter.AttributeSerialNumber;
}
else
{
workSheet.Cells[index, 1].Value = "Нет прибора";
}
workSheet.Cells[index, 2].Value = parameter.IntRefName;
var IsViewMeasureSettingsApplying = ParameterMeasureHelper.IsEnergyMeasureType(parameter.AttributeMeasureType.IntRefName);
workSheet.Cells[index, 3].Value = IsViewMeasureSettingsApplying ? string.Format("{0}, {1}{2}", parameter.Caption, multiplierCaption, parameter.AttributeMeasureType.AttributeMeasureUnit.Caption) :
string.Format("{0}, {1}", parameter.Caption, parameter.AttributeMeasureType.AttributeMeasureUnit.Caption);
var column = startColumn;
foreach(var smallInterval in intervals) {
double value;
if (data.TryGetValue(smallInterval.EndDt, out value))
workSheet.Cells[index, column].Value = IsViewMeasureSettingsApplying ? value / multiplier : value;
else workSheet.Cells[index, column].Value = "-";
column++;
}
index++;
}
}
tableRowsCount = index;
}
else {
// размеры таблицы и т.п.
tableColumnsCount = 6;
workSheet.Cells[0, 0].Value = "Идентификатор ТУ";
workSheet.Cells[0, 1].Value = "ТУ";
workSheet.Cells[0, 2].Value = "Идентификатор параметра";
workSheet.Cells[0, 3].Value = "Параметр";
workSheet.Cells[0, 4].Value = "Дата и время";
workSheet.Cells[0, 5].Value = "Значение";
var index = tableStartRow;
var dt = string.Format("{0:dd.MM.yyyy}", ReportParams.StartDt);
var interval = new DayIntervalData { StartDt = ReportParams.StartDt.AddSeconds(-1), EndDt = ReportParams.StartDt.AddSeconds(1)};
using (PreloadManager.Current.RegisterCache(() => new MeterPointGetEnergyValueCache(meterPoints, sourceParameters, interval)))
foreach(var meterPoint in meterPoints) {
if (meterPoint == null) continue;
foreach(var parameter in sourceParameters) {
var data = meterPoint.GetBaseMeterPointFinalData(parameter, interval).Where(x=>x.ValueDt.HasValue).ToDictionary(x=>x.ValueDt, y=>y.Value);
workSheet.Cells[index, 0].Value = meterPoint.IntRefName;
//workSheet.Cells[index, 1].Value = meterPoint.AttributeDisplayedCaption;
if (meterPoint.AttributeElectricityMeter != null)
{
workSheet.Cells[index, 1].Value = meterPoint.AttributeElectricityMeter.AttributeSerialNumber;
}
else
{
workSheet.Cells[index, 1].Value = "Нет прибора";
}
workSheet.Cells[index, 2].Value = parameter.IntRefName;
var IsViewMeasureSettingsApplying = ParameterMeasureHelper.IsEnergyMeasureType(parameter.AttributeMeasureType.IntRefName);
workSheet.Cells[index, 3].Value = IsViewMeasureSettingsApplying ? string.Format("{0}, {1}{2}", parameter.Caption, multiplierCaption, parameter.AttributeMeasureType.AttributeMeasureUnit.Caption) :
string.Format("{0}, {1}", parameter.Caption, parameter.AttributeMeasureType.AttributeMeasureUnit.Caption);
workSheet.Cells[index, 4].Value = dt;
double value;
if (data.TryGetValue(ReportParams.StartDt, out value))
workSheet.Cells[index, 5].Value = IsViewMeasureSettingsApplying ? value / multiplier : value;
else workSheet.Cells[index, 5].Value = "-";
index++;
}
}
tableRowsCount = index;
}
workSheet.Columns[0].Hidden = true;
workSheet.Columns[2].Hidden = true;
#if !NETCORE
var startAutoFitRow = 0;
var endAutoFitRow = tableStartRow + 5;
for (int i = 0; i < tableColumnsCount; i++)
workSheet.Columns[i].AutoFit(1, workSheet.Rows[startAutoFitRow], workSheet.Rows[endAutoFitRow]);
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment