- Запуск ObjectStudio
- Паспортные данные точки и прибора учёта
- Тарифы
- Маршруты опроса оборудования
- Работа с классификаторами
- Сбор показаний
- События
- Теги
- Excel
- Схема импорта
- Полнота сбора данных
- Неразобранное
Скрипты:
- 🔗 Set fix value
- 🔗 Разблокировка пользователя и смена пароля
- 🔗 Фиксация текущих значений в Энергию на начало суток
- 🔗 Словарь соответствия точек учёта и сценариев сбора
- 🔗 Получение всех событий в csv файл
- Повышение приоритетов классификатора
- 🔗 ПБК: Получение всех ТУ в csv файл, словарь с разбивкой по слешу
- 🔗 Пример реализации отчета с отдельным листом для каждой точки учёта
- 🔗 Скрипт добавления аттрибута для Точек учёта
Отчёты:
- 🔗 ПБК: 4ЦК Профиль А+ (60 мин)
- 🔗 ПБК: шаблон импорта данных 27.09.2023
- 🔗 ПБК: Даты поверки приборов учёта абонента
- 🔗 ПБК: Профиль А+ (60 мин) и потребление
- 🔗 Диагностика сбора данных
- 🔗 Карта синхронизации приборов учета
- ПБК: ГорМО
Путь к исполняемому файлу:
C:\Pyramid\ControlService\ObjectStudio.exe
🗁 Папка со скриптами-помощниками для отчетов:
C:\Pyramid\ControlService\RDContent\ReportHelpers\
Команда запуска:
/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 и пошаговое руководство по разработке сценариев отчётов с примерами доступны по адресу:
База знаний ОПНР
🔗 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;
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 - класс
потребление 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();
Лист по умолчанию
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();
- прелоадменеджер для ТУ
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
- Потери site:http://psdn.sicon.ru/
- GetRelation site:http://psdn.sicon.ru/
- AttributeFixationRules site:http://psdn.sicon.ru/
- Parameters site:http://psdn.sicon.ru/
- профиль параметров site:http://psdn.sicon.ru/
- AttributeRoutes site:http://psdn.sicon.ru/
- GetBaseMeterPointLastFinalData site:http://psdn.sicon.ru/
- getinstance site:http://psdn.sicon.ru/
- Getlastdata site:http://psdn.sicon.ru/
- GetMeterPointFinalData site:http://psdn.sicon.ru/
- ReceiveEventsWithDescription site:http://psdn.sicon.ru/
- TransitionalItemsChain site:http://psdn.sicon.ru/
- LegalEntity site:http://psdn.sicon.ru/
- TransitionalItemsChain site:http://psdn.sicon.ru/
- MeterPointType site:http://psdn.sicon.ru/
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;
Инструкция
- сверить/обновить файлы из ControlService\Data\ImportSheets\Helpers\ в ControlService\RDContent\ImportSheets\Helpers\
- если не помогло тоудалить файлы в 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 "Приоритет уже установлен!";
}
}
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)));
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();
// 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;
Выводимый параметр
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)))
{
}
var data = meterPoint.GetMeterPointFinalData(parameters[0], interval).OrderBy(x => x.ValueDt);
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++;
}
}
// Выводимый параметр
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);
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++;
}