Для изменения размера нажмите или перетащите

Паспорт ячейки подстанции

Форма паспорта ячейки подстанции принимает в качестве параметра объект НСИ, описывающий ячейку. Поэтому в свойствах подготавливаемой формы требуется добавить ссылку на объект НСИ с типом "Ячейка ПС/ТП" и назначить ей идентификатор, например, cubicle. После этого можно приступать к подготовке графической подложки, содержащей изображение таблицы отображаемых в паспорте параметров.

Пример статической svg-подложки паспорта ячейки подстанции.

XML
<svg xmlns="http://www.w3.org/2000/svg">
  <g transform="translate(50, 50)">
    <rect x="0" y="0" width="300" height="20" style="stroke:#000000;fill:#0072c6;fill-opacity:1"/>
    <text x="0" y="0">
      <tspan x="150" y="15" text-anchor="middle">Паспорт ячейки</tspan>
    </text>

    <rect x="0" y="20" width="300" height="320" style="stroke:#000000;fill-opacity:0"/>
    <text x="0" y="0">
      <tspan x="5" y="35">Наименование:</tspan>
      <tspan x="150" y="35" fill="blue">...</tspan>
      <tspan x="5" y="55">Модель ПУ:</tspan>
      <tspan x="150" y="55" fill="blue">...</tspan>
      <tspan x="5" y="75">Серийный номер:</tspan>
      <tspan x="150" y="75" fill="blue">...</tspan>
      <tspan x="5" y="95">Дата установки:</tspan>
      <tspan x="150" y="95" fill="blue">...</tspan>
      <tspan x="5" y="115">Дата поверки:</tspan>
      <tspan x="150" y="115" fill="blue">...</tspan>
      <tspan x="5" y="135">Ктт:</tspan>
      <tspan x="150" y="135" fill="blue">...</tspan>
      <tspan x="5" y="155">Ктн:</tspan>
      <tspan x="150" y="155" fill="blue">...</tspan>
      <tspan x="5" y="175">Итоговый к-т:</tspan>
      <tspan x="150" y="175" fill="blue">...</tspan>
      <tspan x="5" y="195">Маршрут:</tspan>
      <tspan x="150" y="195" fill="blue">...<title xmlns="http://www.w3.org/1999/xhtml">...</title></tspan>
      <tspan x="5" y="215">Тариф:</tspan>
      <tspan x="150" y="215" fill="blue"/>
      <tspan x="5" y="235">Абонент:</tspan>
      <tspan x="150" y="235" fill="blue"/>
      <tspan x="5" y="255">Фидер:</tspan>
      <tspan x="150" y="255" fill="blue">...</tspan>
    </text>
    <rect x="5" y="275" width="145" height="20" style="stroke:#000000;fill-opacity:0"/>
    <rect x="150" y="275" width="145" height="20" style="stroke:#000000;fill-opacity:0"/>

    <rect x="5" y="295" width="75" height="20" style="stroke:#000000;fill-opacity:0"/>
    <rect x="80" y="295" width="70" height="20" style="stroke:#000000;fill-opacity:0"/>
    <rect x="150" y="295" width="75" height="20" style="stroke:#000000;fill-opacity:0"/>
    <rect x="225" y="295" width="70" height="20" style="stroke:#000000;fill-opacity:0"/>

    <rect x="5" y="315" width="75" height="20" style="stroke:#000000;fill-opacity:0"/>
    <rect x="80" y="315" width="70" height="20" style="stroke:#000000;fill-opacity:0"/>
    <rect x="150" y="315" width="75" height="20" style="stroke:#000000;fill-opacity:0"/>
    <rect x="225" y="315" width="70" height="20" style="stroke:#000000;fill-opacity:0"/>

    <text id="fixedHintText" x="10" y="290">Показания на 01.01.01</text>
    <text x="165" y="290">
      Энергия за сутки
    </text>
    <text x="10" y="310">
      А+, кВт*ч
    </text>
    <text x="85" y="310">
      А-, кВт*ч
    </text>
    <text x="155" y="310">
      А+, кВт*ч
    </text>
    <text x="230" y="310">
      А-, кВт*ч
    </text>
  </g>
</svg>

Внешний вид графической подложки.

Passport

После подготовки фоновой подложки на форму добавляются стандартные элементы "Архивные данные по точке учета". После расстановки элементов и настройки их привязки к объектам НСИ итоговое содержимое шаблона дополнится содержимым, похожим на приведенное ниже.

XML
...
<meterpointarchivevalue xmlns="http://www.w3.org/1999/xhtml" scada-id="value1" x="56" y="365" height="19" width="73" meterpoint="{&quot;id&quot;:3975986,&quot;caption&quot;:&quot;Владимирэнерго\\Собинский РЭС\\ТП 0,4 кВ\\ТП-2321 (д. Семёновское)\\РУ-0,4 кВ\\СШ-1\\яч. 2\\ТУ яч. 2&quot;}" valuedt="&quot;2021-04-06T21:00:00.000Z&quot;" parameter="[{&quot;measureType&quot;:{&quot;id&quot;:-1892,&quot;caption&quot;:&quot;Активная энергия&quot;},&quot;measureUnit&quot;:&quot;Вт*ч&quot;,&quot;tariff&quot;:null,&quot;fixationRule&quot;:{&quot;id&quot;:-2163,&quot;caption&quot;:&quot;Сутки, 1&quot;},&quot;discret&quot;:{&quot;type&quot;:-1147,&quot;value&quot;:1,&quot;id&quot;:-2164,&quot;caption&quot;:&quot;Сутки, 1&quot;},&quot;resources&quot;:[{&quot;id&quot;:-30154,&quot;caption&quot;:&quot;Электроэнергия&quot;}],&quot;isViewMeasureSettingsApplying&quot;:true,&quot;id&quot;:-2161,&quot;caption&quot;:&quot;Энергия А+ на начало суток&quot;}]" horalign="&quot;По центру&quot;"></meterpointarchivevalue>
<meterpointarchivevalue xmlns="http://www.w3.org/1999/xhtml" scada-id="value2" x="131" y="365" height="19" width="68" meterpoint="{&quot;id&quot;:3975986,&quot;caption&quot;:&quot;Владимирэнерго\\Собинский РЭС\\ТП 0,4 кВ\\ТП-2321 (д. Семёновское)\\РУ-0,4 кВ\\СШ-1\\яч. 2\\ТУ яч. 2&quot;}" valuedt="&quot;2021-04-06T21:00:00.000Z&quot;" parameter="[{&quot;measureType&quot;:{&quot;id&quot;:-1892,&quot;caption&quot;:&quot;Активная энергия&quot;},&quot;measureUnit&quot;:&quot;Вт*ч&quot;,&quot;tariff&quot;:null,&quot;fixationRule&quot;:{&quot;id&quot;:-2167,&quot;caption&quot;:&quot;Сутки, 1&quot;},&quot;discret&quot;:{&quot;type&quot;:-1147,&quot;value&quot;:1,&quot;id&quot;:-2168,&quot;caption&quot;:&quot;Сутки, 1&quot;},&quot;resources&quot;:[{&quot;id&quot;:-30154,&quot;caption&quot;:&quot;Электроэнергия&quot;}],&quot;isViewMeasureSettingsApplying&quot;:true,&quot;id&quot;:-2165,&quot;caption&quot;:&quot;Энергия А- на начало суток&quot;}]" horalign="&quot;По центру&quot;"></meterpointarchivevalue>
<meterpointarchivevalue xmlns="http://www.w3.org/1999/xhtml" scada-id="value3" x="201" y="365" height="19" width="73" meterpoint="{&quot;id&quot;:3975986,&quot;caption&quot;:&quot;Владимирэнерго\\Собинский РЭС\\ТП 0,4 кВ\\ТП-2321 (д. Семёновское)\\РУ-0,4 кВ\\СШ-1\\яч. 2\\ТУ яч. 2&quot;}" valuedt="&quot;2021-04-06T21:00:00.000Z&quot;" parameter="[{&quot;measureType&quot;:{&quot;id&quot;:-1892,&quot;caption&quot;:&quot;Активная энергия&quot;},&quot;measureUnit&quot;:&quot;Вт*ч&quot;,&quot;tariff&quot;:null,&quot;fixationRule&quot;:null,&quot;discret&quot;:{&quot;type&quot;:-1147,&quot;value&quot;:1,&quot;id&quot;:-6600,&quot;caption&quot;:&quot;Сутки, 1&quot;},&quot;resources&quot;:[{&quot;id&quot;:-30154,&quot;caption&quot;:&quot;Электроэнергия&quot;}],&quot;isViewMeasureSettingsApplying&quot;:true,&quot;id&quot;:-6592,&quot;caption&quot;:&quot;Энергия А+ за сутки&quot;}]" horalign="&quot;По центру&quot;"></meterpointarchivevalue>
<meterpointarchivevalue xmlns="http://www.w3.org/1999/xhtml" scada-id="value4" x="276" y="365" height="19" width="68" meterpoint="{&quot;id&quot;:3975986,&quot;caption&quot;:&quot;Владимирэнерго\\Собинский РЭС\\ТП 0,4 кВ\\ТП-2321 (д. Семёновское)\\РУ-0,4 кВ\\СШ-1\\яч. 2\\ТУ яч. 2&quot;}" valuedt="&quot;2021-04-06T21:00:00.000Z&quot;" parameter="[{&quot;measureType&quot;:{&quot;id&quot;:-1892,&quot;caption&quot;:&quot;Активная энергия&quot;},&quot;measureUnit&quot;:&quot;Вт*ч&quot;,&quot;tariff&quot;:null,&quot;fixationRule&quot;:null,&quot;discret&quot;:{&quot;type&quot;:-1147,&quot;value&quot;:1,&quot;id&quot;:-6601,&quot;caption&quot;:&quot;Сутки, 1&quot;},&quot;resources&quot;:[{&quot;id&quot;:-30154,&quot;caption&quot;:&quot;Электроэнергия&quot;}],&quot;isViewMeasureSettingsApplying&quot;:true,&quot;id&quot;:-6594,&quot;caption&quot;:&quot;Энергия А- за сутки&quot;}]" horalign="&quot;По центру&quot;"></meterpointarchivevalue>
...

Завершающим этапом является добавление серверного сценария, возвращающего всю необходимую информацию по переданной в качестве параметра ячейке, а также клиентский сценарий жизненного цикла scOnInit (при инициализации), реализующий визуализацию полученных от сервера данных.

Пример серверного сценария предоставления данных по ячейке (с наименованием getData).

C#
// Получение ячейки из входных параметров
var cubicle = Cubicle.Find((int)args["cubicle"]);

// Подготовка массива данных по ячейке для отправки на сторону клиента
var mp = cubicle?.AttributeMeterPoint;
var meter = mp?.AttributeElectricityMeter;
var installDt = meter?.AttributeInstallDate;
var installDtStr = installDt?.ToString("dd.MM.yyyy") ;
var calibrateDt = meter?.AttributeLastCalibrationDate;
var calibrateDtStr = calibrateDt?.ToString("dd.MM.yyyy");
var scaleInfo = mp?.GetMeasureTransformersInfo();
var totalScale = scaleInfo == null ? 1 : scaleInfo.CurrentRatio.GetValueOrDefault(1) * scaleInfo.VoltageRatio.GetValueOrDefault(1);
var route = meter?.AttributeRoutes.GetValues().FirstOrDefault(x => !x.AttributeDisabled.GetValueOrDefault());
var routeStr = route?.Caption;
var routeStrCutted = routeStr == null ? null : CommonTools.StringHelpers.TruncateLongString(routeStr, 22);
var tariffStr = mp?.AttributeTariff?.Caption;
var consumerStr = mp?.AttributeConsumer?.Caption;
var asCubiclePowerLine = cubicle as CubiclePowerLine;
var powerLineStr = asCubiclePowerLine == null ? null : asCubiclePowerLine.AttributePowerLine?.Caption;

if (string.IsNullOrEmpty(consumerStr))
{
    var line = asCubiclePowerLine.AttributePowerLine;
    var connections = line.RelationsIPowerLineConnectionAttributePowerLine.OfType<IPowerLineConnectionWithConsumerMeterPoints>().ToArray();
    if (connections.Length == 1)
    {
        var con = connections[0];
        var consumerPoints = con.GetMeterPoints().ToArray();
        if (consumerPoints.Length == 1)
        {
            consumerStr = consumerPoints[0]?.AttributeConsumer?.Caption;
        }
    }
}

var stringValues = new []
{
    cubicle?.AttributeCaption,
    meter?.Class.Caption,
    meter?.AttributeSerialNumber,
    installDtStr, 
    calibrateDtStr, 
    mp?.AttributeCurrentScale,
    mp?.AttributeVoltageScale,
    ((int)totalScale).ToString(),
    routeStrCutted,
    tariffStr,
    consumerStr,
    powerLineStr
};

return new 
{
    values = stringValues, 
    fixesText = string.Format("Показания на {0:dd.MM.yy}", DateTime.Today),     
    mp = new 
    {
        id = mp == null ? 0 : mp.IntRefName,
        caption = mp?.Caption
    },
    dt = DateTime.Today,
    routeFull = routeStrCutted == routeStr ? null : routeStr
};

Пример сценария жизненного цикла scOnInit (при инициализации), выполняющего подготовку внешнего вида паспорта ячейки.

JavaScript
// Запрос данных о ячейке на сервер
this.getData(
{ 
    cubicle: this.cubicle ? this.cubicle.id : 0
}, 
rs => {
    // Перебор всех элементов tspan, в которые будут заноситься значения
    let textNodes = this._node.querySelectorAll('tspan[fill="blue"');
    let index = 0;
    textNodes.forEach(x => {
        // Вставка значения из полученного со стороны сервера массива
        x.textContent = rs.values[index++];
          // Для маршрутов отдельно добавляется подсказка
          if (index == 9 && rs.routeFull) // Маршрут
        {
              var routeTitleNode = x.ownerDocument.createElement('title');
              x.appendChild(routeTitleNode);
              routeTitleNode.textContent = rs.routeFull;
        }
    });
    // Настройка элементов отображения показаний
    this._node.querySelector('#fixedHintText').textContent = rs.fixesText;
    this.value1.meterPoint = rs.mp;
    this.value1.valueDt = rs.dt;
    this.value2.meterPoint = rs.mp;
    this.value2.valueDt = rs.dt;
    this.value3.meterPoint = rs.mp;
    this.value3.valueDt = rs.dt;
    this.value4.meterPoint = rs.mp;
    this.value4.valueDt = rs.dt;
},
err => {
    console.error(err);    
});

Пример итогового внешнего вида формы паспорта ячейки подстанции.

Passport 2
См. также