Skip to content

Instantly share code, notes, and snippets.

@ShilGen
Last active November 13, 2023 09:00
Show Gist options
  • Save ShilGen/c00599ac643c9fcf865042953ee01da4 to your computer and use it in GitHub Desktop.
Save ShilGen/c00599ac643c9fcf865042953ee01da4 to your computer and use it in GitHub Desktop.

 𝓞𝓫𝓳𝓮𝓬𝓽𝓢𝓽𝓾𝓭𝓲𝓸

Скрипты:

Отчёты:

Master заметка


★ Запуск ObjectStudio

➤ Windows

Путь к исполняемому файлу:

C:\Pyramid\ControlService\ObjectStudio.exe

🗁 Папка со скриптами-помощниками для отчетов:

C:\Pyramid\ControlService\RDContent\ReportHelpers\

➤ Linux

Команда запуска:

/usr/lib/pyramid-control/ObjStudioConsole -s /home/admin/1.cs -l Administrator -p 1234
Опция Значение
-s Путь к файлу сценария для запуска
-l Логин
-p Пароль
-h Удаленный сервер службы управления
-t Порт удаленного сервера

Вывод результата работы в файл:

/usr/lib/pyramid-control/ObjStudioConsole -s /home/isu/1.cs -l Administrator -p 1234 > /home/isu/1.txt

Запуск под служебной учёткой:

/usr/lib/pyramid-control/ObjStudioConsole -s /home/pyramid/backup/reset.cs -l ServiceCore

Alias для частого использования object studio:

alias os="/usr/lib/pyramid-control/ObjStudioConsole -l ServiceCore -s "
os -s /home/admin/P20/sg/1.cs  > 1.log

➤ Ссылки

Подробный справочник API и пошаговое руководство по разработке сценариев отчётов с примерами доступны по адресу:

🔗 http://psdn.sicon.ru

База знаний ОПНР

🔗 https://sitopnr.aspro.cloud/_module/knowledgebase/view/base/1

База знаний СиТ

🔗 http://support.sicon.ru/mw/index.php/%D0%9F%D0%B8%D1%80%D0%B0%D0%BC%D0%B8%D0%B4%D0%B0_2.0

🔝


★ Паспортные данные точки и прибора учёта

Проверяем наличие прибора учёта

	if (meterPoint.AttributeElectricityMeter != null)
	{
		// Вывод тип прибора учёта
		sheet.Cells[currentRow, 2].Value = meterPoint.AttributeElectricityMeter.Caption;
	}
	else
	{
		sheet.Cells[currentRow, 2].Value = "Нет прибора";
	}
 MeterPoint  mp = MeterPoint.FirstOrDefault(x =>  x.AttributeElectricityMeter != null && x.AttributeElectricityMeter.AttributeSerialNumber == "0806110284");
 var consumer = meterPoint.AttributeConsumer.FirstOrDefault() as Consumer;
//return mp.ReadValueByAttributeCaption("Адрес");
var parents = mp.GetUpperItems();
return parents.First();
return mp.AttributeMeterPointType; // Тип точки учёта
sheet.Cells[rowIndex, 8].Value =  (meterPoint.AttributeMeterPointType != null) ? meterPoint.AttributeMeterPointType.ToString()  : "н/д" ; 

Поиск ПУ по серийному номеру:

x => x.AttributeElectricityMeter.AttributeSerialNumber == "0806110284");

Название точки учёта:

return mp.Caption;

Отображаемое наименование ТУ:

return mp.AttributeDisplayedCaption;

Вывод серийного номера:

var serial= meterPoint.AttributeElectricityMeter.AttributeSerialNumber;
return allMeterPoints.FirstOrDefault().GetClassifierItemParents();//.FirstOrDefault().TransitionalItemsChain;

Класс точности:

return mp.AttributeElectricityMeter;

Абонент и лицевой счет:

MeterPoint  meterPoint = MeterPoint.FirstOrDefault(x =>  x.AttributeElectricityMeter != null && x.AttributeElectricityMeter.AttributeSerialNumber == "9546239");
Consumer consumer = meterPoint.AttributeConsumer.FirstOrDefault() as Consumer;
return consumer.AttributeCurrentAccount; // лицевой счет
return mp.AttributeConsumer; // абонент

Физическое или юридическое лицо

var consumer = mp.AttributeConsumer.FirstOrDefault() as Consumer;
		if(consumer!=null)
		{
			//var np= consumer.AttributeConsumer as NaturalPerson;
			var np= consumer as NaturalPerson;
			if(np!=null)
			{
				//workSheet.Cells[cur,3].Value=np.AttributeFirstName+" "+np.AttributeMiddleName+" "+np.AttributeLastName;
				//workSheet.Cells[cur,4].Value=np.AttributeCurrentAccount;
				cols[20]="Физическое лицо";

			}
			else
			{
				//var iu=mp.AttributeConsumer as LegalEntity;
				var iu=consumer as LegalEntity;
				//workSheet.Cells[cur,3].Value=iu.ReadValueByAttributeCaption("Юридическое лицо");
				//workSheet.Cells[cur,4].Value=iu.AttributeCurrentAccount;
				cols[20]="Юридическое лицо";
			}

		}
		else
		{
		cols[20]="-";
		}

ТУ → Отключен ( Boolean)

 meterPoint.AttributeDisabled;

ПУ → Тип ПУ:

meter.TryGetMeterModel();

ПУ → Серийный номер

meter.AttributeSerialNumber;

ПУ → Дата выпуска

meter.AttributeReleaseDate.TryGetDate();

ПУ → Дата установки

meter.AttributeInstallDate.TryGetDate();

ПУ → Дата последней поверки

meter.AttributeLastCalibrationDate.TryGetDate();

ПУ → Класс точности

meter.AttributeAccuracyClass.TryGetCaption();

➤ Трансформатор

var ratio = meterPoint.GetMeasureTransformersInfo();

Трансформатор Ктт

sheet.Cells[startRowIndexHeader, 36].Value = ratio == null ? 1.0 : ratio.CurrentRatio.GetValueOrDefault(1.0);

Трансформатор Ктн

sheet.Cells[startRowIndexHeader, 37].Value = ratio == null ? 1.0 : ratio.VoltageRatio.GetValueOrDefault(1.0);

➤ Области видимости

var isolationLevels = meter.AttributeIsolationLevels.ToArray();
sheet.Cells[startRowIndexHeader, 50].Value = isolationLevels.Any() ? string.Join("/", isolationLevels.Select(x => x.Caption.Replace("/", "\\"))) : null;

Произвольный аттрибут точки учета

entities[MeterPoints.COL_MMP_NAME].ReadValueByAttributeCaption("Инфраструтурная компания")

Расчетная группа

mp.AttributeCalculationSettings.GetValues()

 // .AttributeMeasureTypes - это канал
var ap=DisplayedMeasurementTypesItem.Instances.Aplus;
					var am=DisplayedMeasurementTypesItem.Instances.Aminus;
					var rp=DisplayedMeasurementTypesItem.Instances.Pplus;
					var rm=DisplayedMeasurementTypesItem.Instances.Pminus;

🔝


★ Тарифы

Название тарифа

return mp.AttributeTariff;

Получение списка тарифных зон

var zones = meterPoint.AttributeTariff.GetTariffZones();
return zones;

➤ Получение массива параметров по тарифным зонам

var currentParameter = TariffZoneBasedParameter.GetInstances();
        return currentParameter;
var sourceParameters = new Dictionary<TariffZoneBasedParameter, string>
{
	{TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay, "A+, кВт*ч" },
	{TariffZoneBasedParameter.Instances.EnergyActiveReverseTotalFixDay, "A-, кВт*ч"},
	{TariffZoneBasedParameter.Instances.EnergyReactiveForwardTotalFixDay, "R+, кВАр*ч"},
	{TariffZoneBasedParameter.Instances.EnergyReactiveReverseTotalFixDay, "R-, кВАр*ч"},
};

Расширение списка параметров

TariffZoneBasedParameter[] parameters=new TariffZoneBasedParameter[1];
parameters[0]=TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;
var prms=parameters
	.Concat(TariffZoneBasedParameter
		.GetInstances()
		.Where(x => x.AttributeClonedFrom != null)
		.Where(x => parameters.Contains(x.AttributeClonedFrom)))
	.ToArray();
return prms;

➤ Получение тарифа для ТУ

MeterPoint  mp= MeterPoint.FirstOrDefault(x => x.AttributeElectricityMeter.AttributeSerialNumber == "0806110284");
MeterPoint[] meterPoints = new MeterPoint[] {mp};
Tariff tariff = null;
var meterPointToAttributeTariff = meterPoints
    .Select(x => new Tuple<MeterPoint, Tariff>(x, x.AttributeTariff))
    .Where(x => x.Item2 != null)
    .ToDictionary(x => x.Item1, x => x.Item2);
meterPointToAttributeTariff.TryGetValue(mp, out tariff);
return meterPointToAttributeTariff;
//return tariff;

➤ Вывод всех тарифов

var t = Tariff.GetInstances();
return t;

➤ Создание тарифа

var commonDir = DirectoryOfCommonUserItems.Instances.DirectoryOfCommonUserItems;
var tar=commonDir.AttributeCommonUserItems.AppendNew<Tariff>().Value;
tar.AttributeCaption="CAPTION";

🔝


★ Маршруты опроса оборудования

var elMeter = ElectricityMeter.GetInstances().Where(x => x != null && x.AttributeSerialNumber != null && x.AttributeSerialNumber.Equals(serial)).FirstOrDefault();
// var Routes= meterPoint.AttributeElectricityMeter.AttributeRoutes;
    var routes=elMeter.AttributeRoutes.GetValues();
    string elRoutes="";
    int n=1;
    foreach (var route in routes)
    {
    	elRoutes+=n+") "+route.Caption+"\n";
    	n++;
    }
    sheet.Cells[currentRow, 8].Value = elRoutes;

Cценарии опроса

var cs = CollectorScenario.GetInstances();
//return cs;
 var cs_1 = cs.Single(x => x.Caption.Contains("Энергия на начало суток"));
DateTime date1 = new DateTime(2023, 2, 1, 00, 00, 00); // год - месяц - день - час - минута - секунда
DateTime date2 = new DateTime(2023, 6, 21, 11, 30, 25); 
return cs_1.GetModificationInfo(date1, date2);	

Словарь "сценарий опроса; ПУ"

var shid=WebApplication.OnlyInstance.GetCollectorServiceShardsInfo();
//return shid;
var css=CollectorScenario.GetInstances().ToArray();
var els=ElectricityMeter.GetInstances().ToHashSet();
		
var dic=new Dictionary<CollectorScenario,HashSet<ElectricityMeter>>();
    foreach(var cs in css)
    {
    	var enels=new HashSet<ElectricityMeter>();
    	var eqs = CollectorService.OnlyInstance.
            GetEquipmentWithSupportedParametersForScenario(shid.FirstOrDefault().Id,cs).
            Select(x => x.Equipment as ElectricityMeter).
        	AsEnumerable();
        foreach(var eq in eqs)
        {
        	enels.Add(eq);	
        }
        dic.Add(cs,enels);
     }
return dic;

Искомый IP-адрес

var ip = "169.254.200.200";
// Поиск в коллекции каналообразующего оборудования первого устройства с упоминанием искомого IP в маршрутах
var rtu = ChannelizingEquipment.GetInstances().FirstOrDefault(x => x.AttributeRoutes.GetValues().Any(y => y.Caption.Contains(ip)));
return rtu.Caption;

★ Работа с классификаторами

Классификатор географических регионов:

return ClassifierOfMeterPointsByGeoLocationClassInfo.Get();

Получение списка точек учёта в классификаторе

//return mp.GetRoutesMassEnableOrDisableMeterPoints();

Населенный пункт:

return CenterOfPopulationClassInfo.Get();

Поиск ТУ на ул. Лакина

Street  street = Street.GetInstances().Single(x => x.AttributeCaption == "Лакина");
// Получение всех ТУ, упомянутых на этой улице
var allMeterPoints = street.GetAllChildrenOfClass(MeterPoint.GetClassInfo()).OfType<MeterPoint>();
return allMeterPoints;

Получение родителей

var meterPoint = MeterPoint.FirstOrDefault(x => x.AttributeElectricityMeter.AttributeSerialNumber == "0806110284");
  ClassifierItemParentItemsInfoData[] parrents = meterPoint.GetClassifierItemParents().ToArray();
  return parrents;

Все ТУ в городе

var classifier = ClassifierOfMeterPointsByGeoLocation.GetInstances().FirstOrDefault();
var city_nci =classifier.AttributeGeographicAreas.GetValues().OfType<CenterOfPopulation>();
//return city.FirstOrDefault(); // Первый город в классификаторе
var city = city_nci.FirstOrDefault();
var allMeterPoints = city.GetAllChildrenOfClass(MeterPoint.GetClassInfo()).OfType<MeterPoint>();
return allMeterPoints;

Получить номер квартиры из AttributeCaption точки учета /Аметов 10.11.2020/

public static string TryGetFlatNum(this string value)
{
    if (string.IsNullOrEmpty(value))
        return string.Empty;
	//Исходим из того, что AttributeCaption ТУ, формируется в ОЛ по следующему шаблону [Номер квартиры],Тип прибора учета, серийный номер. Где номера квартиры может и не быть
	var parts = value.Split(',');
	if (parts.Length > 2) return parts[0];
	    return string.Empty;
}
string parts = MPAddressBook.Last().ToString();
var part = parts.Split(',');
var flat = new String(part[1].Where(Char.IsDigit).ToArray());
return flat;
return part[1];
if (parts.Split(',').Length > 2) return parts;
else return "na";

Получение иерархии классификатора. Рекурсивный проход по содержимому произвольного классификатора.

🔗 http://psdn.sicon.ru/html/b1cf14bc-c3ba-4a5d-b39e-78842dd61ee3.htm

Получение списка точек учета в классификаторе

🔗 http://psdn.sicon.ru/html/0d9ac39d-8f22-4468-9945-abc153817dc1.htm

Street - класс

🔗 http://psdn.sicon.ru/html/T_RDMetadataClasses_Street.htm

🔝


★ Сбор показаний

потребление TariffZoneBasedParameter.Instances.EnergyActiveForwardDay "Энергия А+ за сутки"

показания EnergyActiveForwardTotalFixDay Энергия А+ на начало суток"

Получение текущей энергии

var allFixParameters = meterPointWithParameters.Select(x => x.Item2).Distinct();
var currentParametersByFix = new Dictionary<TariffZoneBasedParameter, TariffZoneBasedParameter>();
foreach(var fixParameter in allFixParameters) {
	var currentParameter = TariffZoneBasedParameter
	.GetInstances()
	.FirstOrDefault(x=>x.AttributeFixationRules == null
	              && x.AttributeMeasureInterval == null
				  && x.AttributeFlowDirection == fixParameter.AttributeFlowDirection
				  && x.AttributeMeasureType == fixParameter.AttributeMeasureType
				  && x.AttributePhase == fixParameter.AttributePhase
				  && x.AttributeTariffZone == fixParameter.AttributeTariffZone);
			if (currentParameter != null)
				currentParametersByFix[fixParameter] = currentParameter;
		}

Получение показаний

EnergyActiveForwardDay - Энергия А+ за сутки

	
TariffZoneBasedParameter GetDaySumParametr(TariffZoneBasedParameter p)
{
	TariffZoneBasedParameter r =   TariffZoneBasedParameter.GetInstances()
	    .Where(x =>x.AttributeMeasureType == p.AttributeMeasureType)
	    .Where(x =>x.AttributeTariffZone == p.AttributeTariffZone)
	    .Where(x => x.AttributeFlowDirection == p.AttributeFlowDirection)
	    .Where(x =>  x.AttributePhase == p.AttributePhase)
	    .Where(x => x.AttributeFixationRules == null)
	    .Where(x => x.AttributeMeasureInterval.ToString() ==  "Сутки, 1")
	    .FirstOrDefault();
    return r;
}
	

EnergyActiveForwardTotalFixDay - Энергия А+ на начало суток

EnergyActiveForwardTotal - Энергия А+ текущая

TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay - свойство

Экземпляр класса "Параметр по тарифной зоне" Экземпляр "Энергия А+ на начало суток"

var meterPoint = MeterPoint.FirstOrDefault(x => x.AttributeElectricityMeter.AttributeSerialNumber == "0806110284");
DateTime stopDate  = new DateTime();
stopDate  = DateTime.Now;
var parametr = TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;
var lastData = meterPoint.GetBaseMeterPointLastFinalData(parametr, stopDate);
return lastData;

от текущей даты минус 30 дней

var meterPoint = MeterPoint.FirstOrDefault(x => x.AttributeElectricityMeter.AttributeSerialNumber == "0806110284");
DateTime stopDate  = new DateTime();
stopDate  = DateTime.Now;
DateTime startDate = stopDate.AddDays(-30);
DayIntervalData interval = new DayIntervalData(){ StartDt = startDate, EndDt = stopDate };
var parametr = TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;
var data = meterPoint.GetMeterPointFinalData(parametr, interval);
return data;

ручная установка временных интервалов

var meterPoint = MeterPoint.FirstOrDefault(x => x.AttributeElectricityMeter.AttributeSerialNumber == "0806110284");
DateTime startDate = new DateTime(2022, 10, 01, 00, 00, 00);
DateTime stopDate  = new DateTime(2022, 10, 26, 10, 00, 00);
DayIntervalData interval = new DayIntervalData(){ StartDt = startDate, EndDt = stopDate };

var parametr = TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;
var data = meterPoint.GetMeterPointFinalData(parametr, interval);
return data;

Получение текущей энергии

// TariffZoneBasedParameter.Instances.EnergyActiveForwardTotal - свойство
// Экземпляр класса "Параметр по тарифной зоне"
// Экземпляр "Энергия А+ текущая"

var parametr = TariffZoneBasedParameter.Instances.EnergyActiveForwardTotal;
var data = meterPoint.GetMeterPointFinalData(parametr, interval);
return data;
//return data.Last();
//return data.Last().ValueDt;
//return data.Last().Value;
//return data.Last().RegisterDt;
//return data.Last().SourceInfo.UsedPersonalizedDataSources[0]; // источник данных

➤ Получение показанией с потерями

     SettingsGetMeterPointDataData L = new SettingsGetMeterPointDataData {AnalyticLosses = new GetMeterPointDataAnalyticSettingsLossesData {Require = false}};
	   var  dataL = meterPoint.GetMeterPointFinalDataEx(parametr, interval, L);

	var startValueL = dataL.FirstOrDefault(x => x.ValueDt != null && x.ValueDt == ReportParams.StartDt);
    var stopValueL = dataL.FirstOrDefault(x => x.ValueDt != null && x.ValueDt == ReportParams.EndDt);

    // Заполнение ячеек с данными
    if (startValue != null)
        sheet.Cells[rowIndex, 5].Value = startValueL.Value / 1000.0;
    if (stopValue != null)
        sheet.Cells[rowIndex, 6].Value = stopValueL.Value / 1000.0;

Список данных с меткой времени

var lastData = new List<MeterPointValueWithSourceInfoData>();
int i = 1;
foreach(var parameter in prms)
{
   lastData.Add(meterPoint.GetBaseMeterPointLastFinalData(parameter, stopDate));
   i++;
}
return lastData;

🔝


★ События

➤ все события

	// временной интервал, (сейчас, -30 дней)
    DateTime stopDate = new DateTime();
	stopDate = DateTime.Now;
	DateTime startDate = stopDate.AddDays(-30);
	DayIntervalData interval = new DayIntervalData() {StartDt = startDate, EndDt = stopDate};

	// Получение оборудования, по которому необходимо получить список событий
	var meter = ElectricityMeter.GetInstances().Where(x => x.AttributeSerialNumber.Equals("0806110284")).FirstOrDefault();

	// Получение всех событий с описанием
	var eventWithDescription = meter.ReceiveEventsWithDescription(null, interval);
	return eventWithDescription;
	var events = eventWithDescription.ToArray();
	return events;
	//return events[99];

	//вывод в консоль
	foreach (var eachEvent in eventWithDescription)
	{
    	Console.WriteLine(eachEvent.EventInfo.EventDt.ToString());
		Console.WriteLine(eachEvent.EventInfo.EventType.Class.Caption);
		Console.WriteLine(eachEvent.EventInfo.EventType.Caption);
		Console.WriteLine(eachEvent.Description);
	}

	var meterPoints = ReportParams.ClassifierNodes.SelectMany(x => x.GetAllChildrenOfClass(MeterPoint.GetClassInfo())).OfType<MeterPoint>().Distinct().ToArray();
	var meterPointsEquipments = ControlService.Instances.ControlService.GetMeterPointsTotalEquipment(meterPoints)
		.SelectMany(x=>x.Equpments)
		.Distinct()
		.OfType<IEventsSource>()
		.ToArray();
	foreach(var meterPointEquipment in meterPointsEquipments)
	{
		var timeEvent = TimeEvent.GetInstances().ToArray();
		var _timeEvents = meterPointEquipment.ReceiveEventsWithDescription(timeEvent, interval);
		return _timeEvents;
	}
	foreach(var ev in events.OrderBy(x => x.EventInfo.EventDt))
	{
		workSheet.Cells[rowIndex, 0].Value = ev.EventInfo.EventDt.ToString("dd.MM.yyyy HH:mm:ss");
		workSheet.Cells[rowIndex, 1].Value = ev.EventInfo.EventType.Class.Caption;
		workSheet.Cells[rowIndex, 2].Value = ev.EventInfo.EventType.Caption;
		workSheet.Cells[rowIndex, 3].Value = ev.Description;
		rowIndex++;

	}

➤ Объект: "Ведение точного времени"

var timeEvent = TimeEvent.GetInstances();
var _timeEvents = meterPointEquipment == null ? new EventsWithDescriptionRequestResultData[0]: meterPointEquipment.ReceiveEventsWithDescription(timeEvent, interval).ToArray();

События в классификаторе Информобмен по ТУ

  // временной интервал, (сейчас, -30 дней)
    DateTime stopDate = new DateTime();
	stopDate = DateTime.Now;
	DateTime startDate = stopDate.AddDays(-120);
	DayIntervalData interval = new DayIntervalData() {StartDt = startDate, EndDt = stopDate};

     var classifier = ClassifierOfMeterPointsFree.GetInstances().Where(x => x.Caption == "Информобмен").FirstOrDefault();
     var events = classifier.ReceiveEventsWithDescription(null, interval).Where(y=> y.Description.Contains("32359444"));
     int a = 0;
     foreach (var e in events) {
        Logger.AddInfo(a + ""+ e.Description);
        Logger.AddInfo(" RegisterDt → "+ e.EventInfo.RegisterDt);
        Logger.AddInfo( "Source → "+ e.EventInfo.Source);
        Logger.AddInfo( "EventDt → "+ e.EventInfo.EventDt);
        Logger.AddInfo("EventType → "+ e.EventInfo.EventType);
        a = a + 1;
     }
        //return events;
        return "Смотри в журнал запроса";

Получение событий по ФИО абонента

  var user = HumanUser.GetInstances().Where(x => x.Caption == "Скопинцева Мария Александровна").FirstOrDefault();
        return user.ReceiveEventsWithDescription(null, interval);
		var events =  user.ReceiveEventsWithDescription(null, interval);

Метод "Получить события с описанием"

🔗 http://psdn.sicon.ru/html/M_RDMetadataClasses_IEventsSource_ReceiveEventsWithDescription.htm

🔝


Теги

Установка метки

ControlService.OnlyInstance.AttributeActiveTags.SetValues( new [] { SystemTagsGroupItem.Instances.TatarstanNetworkCompanyTags });        
return 0;

Сброс метки

ControlService.OnlyInstance.AttributeActiveTags.SetValues( new SystemTagsGroupItem[] { });
 return 0;

Проверка метки

return ControlService.OnlyInstance.AttributeActiveTags.GetValues();   

🔝


★ Excel

Лист по умолчанию

var worksheet = WorkbookNonExcel.Worksheets.FirstOrDefault();

Создать лист с именем D1

var sheet1 = WorkbookNonExcel.Worksheets.Add("D1") ;

Выбор листа по его имени

var sheet2 = WorkbookNonExcel.Worksheets.First(x => x.Name == "Сбор");

🔗 Пример реализации отчета с отдельным листом для каждой точки учёта

Диапозон ячеек

var worksheet = WorkbookNonExcel.Worksheets.FirstOrDefault();
var range = worksheet.Cells.GetSubrange("A1", "C3");
var rangeAbsolute = worksheet.Cells.GetSubrangeAbsolute(1, 1, 1, 2);
//Вывод значения в первую ячейку диапазона
rangeAbsolute[0, 0].Value = 123.45;

➤ Входные параметры отчета

Временной интервал выборки данных

ReportParams.StartDt = ReportParams.StartDt.AlignToDay();
ReportParams.EndDt = ReportParams.EndDt.AlignToDay();
DayIntervalData interval = new DayIntervalData() { 
StartDt = ReportParams.StartDt, 
EndDt = ReportParams.EndDt};

Вывод в шапку отчета "за период с ... по ..."

workSheet.Cells[1, 0].Value = string.Format("за период с {0} г. по {1} г.", ReportParams.StartDt.ToShortDateString(), ReportParams.EndDt.ToShortDateString());

Точки учёта

 MeterPoint[] meterPoints = ReportParams
.ClassifierNodes
.SelectMany(x => x.GetAllChildrenOfClass(MeterPoint.GetClassInfo()))
.OfType<MeterPoint>().Distinct().ToArray();

Параметры учёта

var sourceParameters = ReportParams.Parameters.Where(x=>x != null).Distinct().ToArray();	

➤ Формулы

Вставка формулы

sheet.Cells[rowIndex, 25].Value = .Formula = string.Format("=IFERROR((SUM(B{0}:Y{0})),\"н/д\")", rowIndex);
workSheet.Cells[index, dataStartColumn + 4].Formula = string.Format("=IFERROR((I{0}-G{0}),\"н/д\")", index + 1, startMeterPointIndex + 1);

Формула расчёта потребления за период

 string formula = string.Format("=ROUND(("+DtEnd_l+"{0}-"+DtStart_l+"{0})*"+Ktt_l+Kt_row+"*"+Ktn_l+Kt_row+",2), rowIndex + 1); 

➤ Формат ячеек

Установка дат в ячейках заголовка

sheet.Cells[5, 6].Value = startDate.ToShortDateString();
sheet.Cells[5, 7].Value = stopDate.ToShortDateString();

➤ Preload Manager

  • прелоадменеджер для ТУ
using (PreloadManager.Current.RegisterCache(() => new MeterPointGetEnergyValueCache(mpList,prms,dInterval2)))
  • прелоадменеджер для ПУ
using (PreloadManager.Current.RegisterCache(() => new DataSourceReceiveDataBatchCache(emList,prms,dInterval2)))
using(RegisterMeterPointCache(mpListFinal, dInterval2))
  • прелоадменеджер для событий
//eventSources - это массив MeterPoint или ElectricityMeter
using (PreloadEventsManager.Preload(() => new EventsCache(eventSources, interval)))

➤ Форматирование

  • Установить рамки вокруг всех ячеек
var dataCells = sheet.Cells.GetSubrangeAbsolute(dataRow, 0, currentRow - 1, 8);
dataCells.SetBorder();
dataCells.SetBorders(MultipleBorders.All, Color.Black, LineStyle.Thin);
  • Разрешить перенос по словам
dataCells.Style.WrapText = true;
  • Вертикальное выравнивание "По центру"
dataCells.Style.VerticalAlignment = VerticalAlignmentStyle.Center;
  • Горизонтальное выравнивание "По левому краю"
dataCells.Style.HorizontalAlignment = HorizontalAlignmentStyle.Left;
  • Для ячеек с данными горизонтальное выравнивание "По центру"
var digitRange = sheet.Cells.GetSubrangeAbsolute(startRow, 4, currentRow - 1, 8);
digitRange.Style.HorizontalAlignment = HorizontalAlignmentStyle.Center;
  • Для ячеек с порядковым номером горизонтальное выравнивание "По центру"
sheet.Cells.GetSubrangeAbsolute(dataRow, 0, currentRow - 1, 0).Style.HorizontalAlignment = HorizontalAlignmentStyle.Center;
  • В заголовке таблицы установить жирный шрифт и устанавливаем цвет ячеек
var header = sheet.Cells.GetSubrangeAbsolute(startRow, 0, startRow + 1, 8);
header.Style.Font.Weight = ExcelFont.BoldWeight;
header.Style.FillPattern.SetSolid(Color.FromArgb(0, 189, 215, 238));

Подготовка к печати

// книжный формат
workSheet.PrintOptions.Portrait = true;
//область печати по ширине листа
workSheet.PrintOptions.FitWorksheetWidthToPages = 1;	
workSheet.PrintOptions.FitWorksheetHeightToPages = 999999;

🔗 colorscheme.ru конвертер цветов RGB

🔝


Поиск в Яндексе

https://yandex.ru/search/?text=get+instance+site%3Ahttp%3A%2F%2Fpsdn.sicon.ru%2F

Схема импорта

Удаление схемы импорта

var schema = QuestionnaireImportScheme.GetInstances();//.FirstOrDefault(x=> x.Caption == "Схема импорта Оборонэнерго");
//schema.Remove();
return schema;

Инструкция

  1. сверить/обновить файлы из ControlService\Data\ImportSheets\Helpers\ в ControlService\RDContent\ImportSheets\Helpers\
  2. если не помогло тоудалить файлы в RDContent\ImportSheets\SchemaCsAssemblies, перезапустить контрол

Пути к журналам ошибок во время работы схем импорта:

C:\Pyramid\ControlService\DebugLogs\TL ImportSheets
C:\Pyramid\ControlService\DebugLogs\TL Exceptions

🔝


Полнота сбора данных

//Получение значения полноты сбора
DataCompletenessCalculatorService sr = DataCompletenessCalculatorService.OnlyInstance;
        
// Выбор объекта анализа
MeterPoint  meterPoint = MeterPoint.FirstOrDefault(x =>  x.AttributeElectricityMeter != null && x.AttributeElectricityMeter.AttributeSerialNumber == "36710259");
ClassifierOfAnyItems classifier =ClassifierOfAnyItems.GetInstances().FirstOrDefault(x => x.Caption == "Субъекты РФ"); // для ПБК
// var classifier = ClassifierOfMeterPointsByGeoLocation.GetInstances().FirstOrDefault();
        
//Интервал
DateTime stopDate  = new DateTime();
stopDate  = DateTime.Today.AddDays(-1);
DateTime startDate = stopDate.AddDays(-31);
DayIntervalData interval = new DayIntervalData(){ StartDt = startDate, EndDt = stopDate };
		
//Предрасчетная схема импорта
PresettedDataCompletenessCalculationSchemaData _defaultCalcSchema = new PresettedDataCompletenessCalculationSchemaData();
        
//Расчёт процента сбора
 DataCompletenessInfoData DataCount =  sr.GetDataCompletenessForClassifierItem(classifier as CustomClassifierNode,  _defaultCalcSchema, interval );
 //DataCompletenessInfoData DataCount = sr.GetDataCompletenessForClassifierItem(meterPoint as CustomClassifierNode,  _defaultCalcSchema, interval ); //для ТУ
double percent = (double) DataCount.RealDataCount / DataCount.WantedDataCount ;
return percent;

🔝


Скрипт повышения приоритетов классификаторов

using ObjStudioClasses;
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Threading.Tasks;
using GemBox.Spreadsheet;

public class Script
{
    public static object Execute()
    {
        var CAPTION_CL = "Географические объекты";
        var topCl = Classifier.Single(x => x.Caption.Contains(CAPTION_CL));
        if ( !Classifier.GetClassInfo().GetClassifiersWithPriorities().Any() )
        {
            Logger.AddInfo($"Повышен приоритет {topCl.Caption}");
            return Classifier.GetClassInfo().ChangePriorityUp(topCl);
	}
	return "Приоритет уже установлен!";
    }
}

🔝


Неразобранное

№1

 var data2 = meterPoints.ToDictionary(
 meterPoint => meterPoint,
meterPoint =>parameters.Keys.ToDictionary<DirectionBasedParameter, Parameter, Dictionary<DateTime, double>>(
                        parameter => parameter,
                        parameter =>meterPoint.GetMeterPointFinalDataEx(
       						parameter, new DayIntervalData
                            {
                                StartDt = ReportParams.StartDt.AddMinutes(-30),
                                EndDt = ReportParams.EndDt
                            },
        			new SettingsGetMeterPointDataData
       					 {
            			AnalyticLosses = new GetMeterPointDataAnalyticSettingsLossesData
            				{
                			Require = false
           					 },
        				})
                                .Where(x => x.ValueDt.HasValue)
                                .ToDictionary(y => y.ValueDt.Value, y => y.Value)));


№2

       SettingsGetMeterPointDataData L = new SettingsGetMeterPointDataData {AnalyticLosses = new GetMeterPointDataAnalyticSettingsLossesData {Require = false}};
       DateTime stopDate = new DateTime();
	   stopDate = DateTime.Now;
	   DateTime startDate = stopDate.AddDays(-120);
	   DayIntervalData interval = new DayIntervalData() {StartDt = startDate, EndDt = stopDate};
	   TariffZoneBasedParameter parametr = TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;
	   var  data = mp.GetMeterPointFinalDataEx(parametr, interval, L);
	//   return data;//.GetType();

№3

    // MeterPoint  mp = MeterPoint.FirstOrDefault(x =>  x.AttributeElectricityMeter != null && x.AttributeElectricityMeter.AttributeSerialNumber == "011095104365099");
     MeterPoint  mp = MeterPoint.FirstOrDefault(x =>  x.AttributeElectricityMeter != null && x.AttributeElectricityMeter.AttributeSerialNumber == "0806110284");
     //  return mp.AttributeMeterPointToMeterLinkSettings ;
// return mp.FindRelations();
//return mp.RelationsGetControlStateHistoryResultAttributeMeterPoint;
//GetMeterPointControlStateValues
//return mp.GetMeterPointControlStateResult(mp);
return mp.AttributeCheckingMeterPointsSettings;
//return mp.AttributeMeterPointToMeterLinkSettings;

        MeterPoint  mp= MeterPoint.FirstOrDefault(x => x.AttributeElectricityMeter.AttributeSerialNumber == "0806110284");
        return mp;

         MeterPoint  mp= MeterPoint.FirstOrDefault(x => x.AttributeElectricityMeter.AttributeSerialNumber == "19102908");

         //return mp.ReadValueByAttributeCaption("Адрес");

         Console.WriteLine(mp.Caption);

         return mp.AttributeTariff;

№4

Выводимый параметр

TariffZoneBasedParameter[] parameters=new TariffZoneBasedParameter[1];
parameters[0]=TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;

using (PreloadManager.Current.RegisterCache(() => new DataSourceReceiveDataBatchCache(meterPoints, parameters, new DayIntervalData{ StartDt = ReportParams.StartDt.AddSeconds(-10), EndDt =ReportParams.EndDt.AddSeconds(10) })));

parameters[0]


    var dataCells = sheet.Cells.GetSubrangeAbsolute(startTableRowIndex, 0, rowIndex+1, 12);
    dataCells.Style.WrapText = true;
    dataCells.SetBorders(MultipleBorders.All, Color.Black, LineStyle.Thin);


	var dataCells = sheet.Cells.GetSubrangeAbsolute(startRowIndex, 0, rowIndex-1, 11);
dataCells.SetBorders(MultipleBorders.All, Color.Black, LineStyle.Thin);


using(PreloadManager.Current.RegisterCache(() => new MeterPointGetEnergyValueCache(meterPoints, parameters, interval)))
{

}

№5

  var data = meterPoint.GetMeterPointFinalData(parameters[0], interval).OrderBy(x => x.ValueDt);

№6

foreach(var meter in abonent){
    sheet.Cells[rowIndex, 0].Value =  meterPointIndex;
    var meterPoint = meter.AttributeMeterPointPlacement;
    var parents = meterPoint.GetUpperItems();
    var mmp =  parents.OfType<SmallPowerConsumerBoundary>().FirstOrDefault();
    if (mmp != null){
        sheet.Cells[rowIndex, 2].Value = mmp.ReadValueByAttributeCaption("Адрес");
        sheet.Cells[rowIndex, 1].Value = (mmp.ReadValueByAttributeCaption("Внутренний код") != null) ? mmp.ReadValueByAttributeCaption("Внутренний код") : "н/д" ;
    }
    sheet.Cells[rowIndex, 4].Value = (meter.AttributeSerialNumber ?? "н/д").ToString();

    // Получение данных по точке учёта
    var data = meterPoint.GetMeterPointFinalData(parametr, interval);
    var startValue = data.FirstOrDefault();
    var stopValue =  meterPoint.GetBaseMeterPointLastFinalData(parametr, ReportParams.EndDt);

	// Первичное заполнение ячеек с данными
    sheet.Cells[rowIndex, 5].Value = "н/д";
    sheet.Cells[rowIndex, 6].Value = "н/д";

    // Заполнение ячеек с данными
    if (startValue != null){sheet.Cells[rowIndex, 5].Value = startValue.Value / SI_multiples;}
    if (stopValue != null){sheet.Cells[rowIndex,6].Value = stopValue.Value / SI_multiples;}
    sheet.Cells[rowIndex, 7].Formula = string.Format("=IFERROR((G{0}-F{0}),\"н/д\")", rowIndex + 1, rowIndex + 1);

    meterPointIndex++;
    rowIndex++;

 }

 // Выводимый параметр
TariffZoneBasedParameter[] parameters=new TariffZoneBasedParameter[1];
parameters[0]=TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;

var mp_list = new List<MeterPoint>();
foreach(var meter in ReportParams.Abonent.AttributeMeters){
    mp_list.Add(meter.AttributeMeterPointPlacement);
}


 using(PreloadManager.Current.RegisterCache(() => new MeterPointGetEnergyValueCache(mp_list, parameters, interval)))
{
    foreach(var meterPoint in mp_list){
        sheet.Cells[rowIndex, 0].Value =  meterPointIndex;
        var parents = meterPoint.GetUpperItems();
        var mmp =  parents.OfType<SmallPowerConsumerBoundary>().FirstOrDefault();
        if (mmp != null){
            sheet.Cells[rowIndex, 2].Value = mmp.ReadValueByAttributeCaption("Адрес");
            sheet.Cells[rowIndex, 1].Value = (mmp.ReadValueByAttributeCaption("Внутренний код") != null) ? mmp.ReadValueByAttributeCaption("Внутренний код") : "н/д" ;
        }
	    sheet.Cells[rowIndex, 4].Value = meterPoint.AttributeElectricityMeter.AttributeSerialNumber;
        // Получение данных по точке учёта
        var data = meterPoint.GetMeterPointFinalData(parameters[0], interval).OrderBy(x => x.ValueDt);
        var startValue = data.FirstOrDefault();
        var stopValue =  meterPoint.GetBaseMeterPointLastFinalData(parameters[0], ReportParams.EndDt);
	    // Первичное заполнение ячеек с данными
        sheet.Cells[rowIndex, 5].Value = "н/д";
        sheet.Cells[rowIndex, 6].Value = "н/д";
        // Заполнение ячеек с данными
        if (startValue != null){sheet.Cells[rowIndex, 5].Value = startValue.Value / SI_multiples;}
        if (stopValue != null){sheet.Cells[rowIndex,6].Value = stopValue.Value / SI_multiples;}
        sheet.Cells[rowIndex, 7].Formula = string.Format("=IFERROR((G{0}-F{0}),\"н/д\")", rowIndex + 1, rowIndex + 1);

        meterPointIndex++;
        rowIndex++;
    }
}

№7

AKT для ПБК

// Выводимый параметр
TariffZoneBasedParameter[] parameters=new TariffZoneBasedParameter[1];
parameters[0]=TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;
parameters[1]=TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;
parameters[2]=TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;

var mp_list = new List<MeterPoint>();
foreach(var meter in ReportParams.Abonent.AttributeMeters){
    mp_list.Add(meter.AttributeMeterPointPlacement);
}

 using(PreloadManager.Current.RegisterCache(() => new MeterPointGetEnergyValueCache(mp_list, parameters, interval)))
{
    foreach(var meterPoint in mp_list){
        sheet.Cells[rowIndex, 0].Value =  meterPointIndex;
        var parents = meterPoint.GetUpperItems();
        var mmp =  parents.OfType<SmallPowerConsumerBoundary>().FirstOrDefault();
        if (mmp != null){
            sheet.Cells[rowIndex, 2].Value = mmp.ReadValueByAttributeCaption("Адрес");
            sheet.Cells[rowIndex, 1].Value = (mmp.ReadValueByAttributeCaption("Внутренний код") != null) ? mmp.ReadValueByAttributeCaption("Внутренний код") : "н/д" ;
        }
       // sheet.Cells[rowIndex, 4].Value = (meter.AttributeSerialNumber ?? "н/д").ToString();
	    sheet.Cells[rowIndex, 4].Value = meterPoint.AttributeElectricityMeter.AttributeSerialNumber;
        // Получение данных по точке учёта
        var data = meterPoint.GetMeterPointFinalData(parameters[0], interval).OrderBy(x => x.ValueDt);
        var startValue = data.FirstOrDefault();
        var stopValue =  meterPoint.GetBaseMeterPointLastFinalData(parameters[0], ReportParams.EndDt);
	    // Первичное заполнение ячеек с данными
        sheet.Cells[rowIndex, 5].Value = "н/д";
        sheet.Cells[rowIndex, 6].Value = "н/д";
        // Заполнение ячеек с данными
        if (startValue != null){sheet.Cells[rowIndex, 5].Value = startValue.Value / SI_multiples;}
        if (stopValue != null){sheet.Cells[rowIndex,6].Value = stopValue.Value / SI_multiples;}
        sheet.Cells[rowIndex, 7].Formula = string.Format("=IFERROR((G{0}-F{0}),\"н/д\")", rowIndex + 1, rowIndex + 1);

        meterPointIndex++;
        rowIndex++;
    }
}

var dataCells = sheet.Cells.GetSubrangeAbsolute(startRowIndex, 0, rowIndex-1, 15);
dataCells.SetBorders(MultipleBorders.All, Color.Black, LineStyle.Thin);

№8

old from просмотр показаний

foreach(var meter in ab){
    var meterPoint = meter.AttributeMeterPointPlacement;
    var parents = meterPoint.GetUpperItems();
    var mmp =  parents.OfType<SmallPowerConsumerBoundary>().FirstOrDefault();
    if (mmp != null){
        sheet.Cells[rowIndex, 0].Value = mmp.ReadValueByAttributeCaption("Адрес");
    }
        string[] mp_name = Regex.Split(meterPoint.Caption, @"\\"); 
    sheet.Cells[rowIndex, 1].Value =  mp_name[1];
    sheet.Cells[rowIndex, 2].Value = (meter.AttributeSerialNumber ?? "н/д").ToString();

    // Получение данных по точке учёта
    var data = meterPoint.GetMeterPointFinalData(parametr, interval);
    var startValue = data.FirstOrDefault();//OrDefault(x => x.ValueDt != null && x.ValueDt == ReportParams.StartDt);
    var stopValue =  meterPoint.GetBaseMeterPointLastFinalData(parametr, ReportParams.EndDt);

	// Первичное заполнение ячеек с данными
    sheet.Cells[rowIndex, 9].Value = "н/д";
    sheet.Cells[rowIndex, 14].Value = "н/д";

    // Заполнение ячеек с данными
    if (startValue != null){
        sheet.Cells[rowIndex, 9].Value = startValue.Value / SI_multiples;
        sheet.Cells[rowIndex, 7].Value = (startValue.ValueDt != null) ? startValue.ValueDt :  ReportParams.StartDt;
    }
    if (stopValue != null){
        sheet.Cells[rowIndex,14].Value = stopValue.Value / SI_multiples;
        sheet.Cells[rowIndex, 13].Value = (stopValue.ValueDt != null) ? stopValue.ValueDt  : ReportParams.EndDt;
    }
    sheet.Cells[rowIndex, 15].Formula = string.Format("=IFERROR((O{0}-J{0}),\"н/д\")", rowIndex + 1, rowIndex + 1);

    meterPointIndex++;
    rowIndex++;
 }

🔝 Master заметка

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment