Добро пожаловать, Гость
Вам необходимо зарегистрироваться перед тем, как пытататься написать сообщение.

Имя пользователя
  

Пароль
  





Поиск по сообществам

(Расширенный поиск)

Статистика сообществ
» Участники: 119
» Последний участник: Michaelbum
» Темы сообществ: 42
» Сообщения сообществ: 68

Полная статистика

Пользователи в сети
Сейчас 2 пользователей в сети.
» 0 Участник(-ов) | 2 Гость(-ей)

Последние темы
Щось легке та змістовне у...
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: StacyBoape
Вчера, 09:39 AM
» Ответы: 0
» Просмотры: 2
Каталог перевірених украї...
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: Michgat
05-02-2026, 06:57 PM
» Ответы: 0
» Просмотры: 10
Добавление тега в 3D
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: Lamantur
04-30-2026, 09:51 AM
» Ответы: 0
» Просмотры: 7
Получение параметров из а...
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: Lamantur
04-21-2026, 11:53 AM
» Ответы: 0
» Просмотры: 27
Как получить документацию...
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: Lamantur
09-24-2025, 09:28 AM
» Ответы: 1
» Просмотры: 439
Панель с кнопками для 3D ...
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: nponyatov
09-19-2025, 09:32 AM
» Ответы: 0
» Просмотры: 502
Панель с кнопками для 3D ...
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: nponyatov
09-19-2025, 08:31 AM
» Ответы: 0
» Просмотры: 460
Добавление библиотеки в п...
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: Lamantur
08-22-2025, 07:18 AM
» Ответы: 0
» Просмотры: 392
WinnumAjaxAuthHandler - П...
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: Lamantur
05-27-2025, 09:15 AM
» Ответы: 0
» Просмотры: 504
Эффективность работы опер...
Сообщество: Динамические приложения в WINNUM Platform
Последнее сообщение: Сергей Борисов
04-28-2025, 01:18 PM
» Ответы: 1
» Просмотры: 567

 
  Как получить расчеты тегов за длительные периоды
Автор: Lamantur - 02-16-2024, 12:59 PM - Сообщество: Динамические приложения в WINNUM Platform - Нет ответов

Для построения отчетов за длительные периоды в WINNUM используется блокчейн. 

 Длительности тегов рассчитываются в конце каждого дня для построения длительных отчетов. 
Эти же значения можно использовать в динамических приложениях, что позволяет использовать данные вместо многочисленных запросов и сокращать время выполнения команд. 

 Так, например, для получения суммарного времени работы под нагрузкой для конкретного станка можно использовать функцию getPriorityTagDuration, в результате мы получим массив из промежутков, когда тег выполнялся с учетом приоритетности, но если временной интервал указать больше двух-трех дней, то результатом будет огромный массив и выполнятся такой запрос может достаточно долго, может даже не хватить оперативной памяти, выделенной под работу браузера и получить зависание всей страницы.

 Что же делать, если нас интересует график загрузки оборудования за год? Для этого работают роботы приложений. Рассчитанное значение тегов за каждый день уже с учетом приоритетности и календаря записано роботом. Для получения этих значений достаточно воспользоваться стандартной функцией getSignal, и указать вместо сигнала адрес в структуре блокчейн.

 Общая структура запроса:
[App ID].[Tag ID].[тип расчета].[тип значения] = значение

Типы расчета:

SCHED_PRIO – с приоритетностью по календарю
SCHED_NOPRIO - без приоритетности по календарю
REG_NOPRIO - без приоритетности без календаря

Типы значений:
PER – проценты, HOUR –
часы


Пример: 17.145.SCHED_PRIO.HOUR
17 – ID приложения
145 – ID тега
SCHED_PRIO – расчет по календарю с учетом приоритетности
HOUR – результат получить в миллисекундах суммарно по всем сменам

Код:
var UUID = "GHIKFKGL-IR85-85JR-JGHUTKOL" ;// UUID - это ключ идентификатор продукта (станка)
var  tagsPriorityID = '6.1.SHED_PRIO.HOUR'; //Из приложение 6 получаем тег NC_WIP с учетом приоритетности по календарю в миллисекундах
var  dateFrom = "2022-12-12 00:00:00";
var dateTo = "2024-02-26 15:40:00";
var wipResult; // Результат за все время положим сюда

baseSdkUtils.service.WNConnectorHelper.getSignal(UUID, tagsPriorityID, false, false, dateFrom, dateTo,'',function(data){
  if (baseSdkUtils.isSuccess(data) ){
    for (var t = 0; t < data.getElementsByTagName('item').length; t++){

                  var itemT = data.getElementsByTagName('item')[t];
                        var valueT = Math.round((((parseFloat(itemT.getAttribute('value'))/3600000);      //Получаем отдельно значение в округленном виде, в часах
                        wipResult +=  valueT; // находим сумму за все время
    }
  }
});

Еще быстрее можно посчитать значения за несколько месяцев, если нас интересуют все дни месяца:
Тогда нужно просто добавить "m", значения появляются в первый день следующего месяца, поэтому его нужно тоже захватить во временной промежуток
Код:
var tagsPriorityID = '6.1.m.SHED_PRIO.HOUR';
var dateFrom = "2022-12-01 00:00:00";
var dateTo = "2024-02-01 15:40:00";

Разница во времени выполнения ощущается даже при построения отчета за несколько дней.

Распечатать этот элемент

  Как получить список всех сигналов изделия
Автор: Сергей Соловьев - 02-09-2024, 01:17 PM - Сообщество: Динамические приложения в WINNUM Platform - Нет ответов

Пример получения списка сигналов изделия (сначала получить по class:id изделия шаблон, затем по class:id шаблона сигналы):

Код:
function thisGetProductTemplate(){
    var pid = 'winnum.org.product.WNProduct:48'; // class:id изделия
    baseSdkUtils.service.WNProductHelper.getProductTemplate(
        pid,
        function( data ){
            var item = data.getElementsByTagName('item')[0];
            var oid = baseSdkUtils.decode(item.getAttribute('id')); // class:id шаблона
            thisGetSignalsByProductTemplate( oid );
    });
}

function thisGetSignalsByProductTemplate( oid ){
    baseSdkUtils.service.WNProductHelper.getSignalsByProductTemplate(
        oid,
        function( data ){
            console.log( data ); // список сигналов шаблона
    });
}

Распечатать этот элемент

  Как получить список сигналов тега визуализации
Автор: Сергей Соловьев - 02-09-2024, 12:59 PM - Сообщество: Динамические приложения в WINNUM Platform - Нет ответов

Пример функции для получения списка сигналов тега визуализации:

Код:
function thisGetSignals(){
    var pid = 'winnum.org.product.WNProduct:48';
    var tid = 'winnum.org.tag.WNTag:182';
    baseSdkUtils.service.WNModelingHelper.getSignals(
        pid,
        tid,
        function( data ){
            console.log( data );
    });
}

Распечатать этот элемент

  Создание своей страницы
Автор: wnadmin - 02-08-2024, 02:59 PM - Сообщество: Разработка собственных приложений в WINNUM Platform - Ответы (1)

Для создания своих приложений первое, что нужно научиться делать - это создавать свои страницы.

Создание страниц происходит в Java с использованием WINNUM SDK. SDK содержит кучу всего полезного, включая элементы пользовательского интерфейса (меню, формы, кнопки и тд). Все для того, чтобы максимально ускорить и упросить разработку своих приложений.

Созданные страницы на Java компилируются и копируются в специальные папки (в зависимости от назначения). Отрисовка страниц (написанных на Java) выполняется с помощью т.н. agw (application gateway), который с сумасшедшей скоростью печатает страницы в браузере.

Давайте создадим первую страницу на Java в WINNUM Platform. Для этого создадим новый класс, назовем его MaPage, в пакете winnum.views.my_app, пример:

Код:
package winnum.views.my_app;

import io.undertow.servlet.spec.*;
import winnum.system.config.ConfigHelper;
import winnum.system.exception.WNException;
import winnum.web.base.*;

public class MyPage {
//----------------------------------------------------------------------------------------
public static void processPage(HttpServletRequestImpl request, HttpServletResponseImpl response) throws WNException {
            
  PageMeta.streamHead(request, response, "Page Title", null);
  UIHelper.streamOut(response, "<body>", false);        
  PageHeader.streamAuthorizedHeader(request, response, true);

  UIHelper.streamOut(response, "Hello World!", false);
  UIHelper.streamOut(response, "</body></html>", true);
}
//----------------------------------------------------------------------------------------
}

Для компиляции нам потребуются следующие библиотеки:
  • winnum-platform.system-5.0.0.jar
  • winnum-platform.web-5.0.0.jar
  • undertow-servlet-1.3.15.Final.jar

Эти и другие библиотеки можно найти в <WINNUM Platform>/srclib.

После того, как наша первая страница готова, скомпилируем ее и скопируем в папку <WINNUM Platform>/views/winnum/views/my_app.

Все, на этом создание нашей страницы закончено, проще не бывает)

Для просмотра страницы в браузере вызываем ее через agw:
http://localhost/Winnum/views/pages/app/agw.jsp?rpc=winnum.views.my_app.MyPage&men=processPage&mode=yes

Распечатать этот элемент

  Как получить значение дополнительного параметра
Автор: Сергей Соловьев - 02-08-2024, 08:56 AM - Сообщество: Динамические приложения в WINNUM Platform - Нет ответов

Ниже пример кода получения значения дополнительного параметра  cost_per_hour_WNNCMachine. Результат будет выведен через alert

Код:
/****************** Получение дополнительного параметра объекта ******/
function _GetAttribute_(){
    var product_oid = 'winnum.org.product.WNProduct:40'; // класс и id изделия
    var attr_name = 'cost_per_hour_WNNCMachine'; // наименование параметра
    baseSdkUtils.service.WNAttributeHelper.getAttribute(product_oid, attr_name,  function(data){
        if ( baseSdkUtils.isSuccess(data) ){
            var _attr_ = '';
            if(data.getElementsByTagName('item').length > 0){
                var item = data.getElementsByTagName('item')[0];
                _attr_ = baseSdkUtils.decode(item.getAttribute('value1'));
            }
            alert ( _attr_ ); // значение параметра
        }
    });
}

Распечатать этот элемент

  Как получить список изделий приложения
Автор: Сергей Соловьев - 02-08-2024, 08:35 AM - Сообщество: Динамические приложения в WINNUM Platform - Нет ответов

Чтобы получить список изделий приложения, нужно выполнить функцию baseSdkUtils.service.WNApplicationHelper.getProduct. На вход дать идентификатор приложения в формате  'winnum.org.app.WNApplicationInstance:1'. Основные параметры вернутся в ответе для каждого изделия в атрибутах каждого item.

Код:
function startFunction( appid ){
    // appid в формате 'winnum.org.app.WNApplicationInstance:1'
    getProduct( appid, function (data){
           console.log ( data );
           // делаем что то с массивом изделий data
     });
}

/****************** Получение изделий и создание структуры их хранения ******/
function getProduct(appid, callBackFunc){
    var products = [];
    baseSdkUtils.service.WNApplicationHelper.getProduct(appid, function(data){
        if ( baseSdkUtils.isSuccess(data) ){
            for(var i = 0; i < data.getElementsByTagName('item').length ; i++ ) {
                var item = data.getElementsByTagName('item')[i];
                var attributes = {};
                attributes.product_class = item.getAttribute('id'); // класс и id изделия, например, winnum.org.product.WNProduct:47"
                attributes.product_id = item.getAttribute('PersistInfo__idA2');     // id изделия, например,   "47"          
                attributes.product_serial = baseSdkUtils.decode(item.getAttribute('SerialNumber')); // серийный номер
                attributes.product_name = baseSdkUtils.decode(item.getAttribute('name')); // наименование изделия
                attributes.product_UUID = baseSdkUtils.decode(item.getAttribute('ProductUUID')); // uuid изделия, например, "73DFAF61-DCD0-47F6-A38B-57A2707423DD"         
                attributes.connector_id = item.getAttribute('connectorId'); // id коннектора, например,   "47" 
                attributes.org_id= item.getAttribute('OrganizationInfo__idA3'); // id организации
                attributes.folder_name = baseSdkUtils.decode(item.getAttribute('FolderInfo__folderName'));  // имя папки
                attributes.folder_id = baseSdkUtils.decode(item.getAttribute('FolderInfo__idA6')); // id папки
                products[i] = attributes;
            }
            if ( callBackFunc ){
                callBackFunc.call( this, products);
            } 
        }
    });
}

В результате в консоли увидите массив data, в каждом из элементов которого список основных параметров

Распечатать этот элемент

  Настройка уведомлений в Telegram
Автор: wnadmin - 02-06-2024, 09:32 AM - Сообщество: Интеграция WINNUM Platform с другими информационными системами - Нет ответов

Очень эффектно смотрятся уведомления из WINNUM Platform в Telegram. В зависимости от тематики уведомления, его можно направлять в разные каналы, что вдвойне полезно.

Для настройки, нужно выполнить ряд подготовительных действий в Telegram, а потом настроить интеграцию в WINNUM Platform. 

Подготовка Telegram
Получаем идентификатор нового бота (далее <Bot_token>): 

  • через бот @BotFather создаем нового бота (команда /newbot)

Получаем идентификатор беседы с ботом (далее <chat_id>):
  •  Откройте диалог со своим созданным ботом и напишите ему произвольное сообщение
  •  Откройте в браузере ссылку, заменив <Bot_token> на полученный идентификатор от @BotFather https://api.telegram.org/bot<Bot_token>/getUpdates
В полученном json-ответе найдите значение в параметре result->message->chat->id, это и есть <chat-id>.

Откройте браузер и перейдите по ссылке, заменив <Bot_token> и <chat_id> на свои данные
https://api.telegram.org/bot<Bot_token>/...ивет%20мир

Настройка WINNUM Platform
Настраиваем интеграцию с Telegram в файле smsgateway/standalone.xml

Пример standalone.xml в Winnum
<?xml version="1.0" encoding="UTF-8"?>
<items>
                <item id="smsGateway.targetURL" value="https://api.telegram.org/bot<Bot_token>/sendMessage?chat_id=<chat_id>" description="Sms gateway target url, for example: http://smspilot.ru/api.php note: use & for ampersand" />
                <item id="smsGateway.apiKey" value="foo" description="Sms gateway api key" />
                <item id="smsGateway.fromId" value="Winnum" description="Registered sender ID" />
                <item id="smsGateway.fromTextURL" value="from" description="From send text URL parameter" />
                <item id="smsGateway.toTextURL" value="to" description="To send text URL parameter" />
                <item id="smsGateway.forwardOnTextURL" value="" description="Forward on send text URL parameter" />
                <item id="smsGateway.sendTextURL" value="text" description="Send URL parameter name" />
                <item id="smsGateway.textEncoding" value="UTF-8" description="Sms gateway default text output encoding. By default - UTF-8" />
                <item id="smsGateway.enable" value="true" description="Enable - disable sms gateway" />
                <item id="smsGateway.authType" value="Url" description="Sms gateway authentication type (Bearer, Url). By default - Url" />
</items>

Как-то так) незабываем указать у пользователя мобильный телефон в профиле)

Распечатать этот элемент

  Использование Медиа Библиотеки
Автор: Lamantur - 02-05-2024, 03:07 PM - Сообщество: Динамические приложения в WINNUM Platform - Ответы (1)

Поскольку стандартные элементы в редакторе имеют ограничение в 1000 символов по коду, а так же для удобства создания более сложных приложений - в редакторе предусмотрена медиабиблиотека.
   
Благодаря этому инструменту можно добавить файлы неограниченного объема и использовать их в своем динамическом приложении.
Для того чтобы элементы из библиотеки начали работать на странице, добавим событие при загрузке:
Настройка страницы => События  => Добавить событие  => При загрузке (On Load)
В событие добавляем следующий код:

Код:
var appid = ''; baseSdkUtils.the = {};
document.getElementById('9F740F6C-1E4D-4821-8B2F-C8E0586B7935').style.zIndex = '19999';
baseSdkUtils.service.WNFactory.getPersistable(baseApplicationDesignerUtils.getAppid(),   
  function(data){
   if ( baseSdkUtils.isSuccess(data) ){
    appid = data.getElementsByTagName('item')[0].getAttribute('ApplicationInfo__idA15');
    baseSdkUtils.the.appid = appid;
    baseSdkUtils.the.media_url = '/' + baseSdkUtils.appId + '/resources/themes/current/images/app/ui/designer/media/' + appid + '/';
     jQuery.ajax({ url: baseSdkUtils.the.media_url + 'manifest.js',
      dataType: 'script',
      success: function(){ loadResoursesProcessor(); }, async: true });
    }
  });
Этот код открывает файл  'manifest.js', который находится в библиотеке и запускает в нем функцию  loadResoursesProcessor()
Аналогичным образом можно загрузить другие файлы:
Пример:
Код:
$('#B1EA5CF6-A3D8-4118-A591-0D8AC29B3E39').ready(function(event){
    //place code here
    do__loadResources();
   
});
function do__loadResources(){
var appid = ''; baseSdkUtils.the = {};
document.getElementById('9F740F6C-1E4D-4821-8B2F-C8E0586B7935').style.zIndex = '19999';
baseSdkUtils.service.WNFactory.getPersistable(baseApplicationDesignerUtils.getAppid(),   
  function(data){
   if ( baseSdkUtils.isSuccess(data) ){
    appid = data.getElementsByTagName('item')[0].getAttribute('ApplicationInfo__idA15');
    baseSdkUtils.the.appid = appid;
    baseSdkUtils.the.media_url = '/' + baseSdkUtils.appId + '/resources/themes/current/images/app/ui/designer/media/' + appid + '/';
    $('#navtop').load(baseSdkUtils.the.media_url + '/navtop.html');
     jQuery.ajax({ url: baseSdkUtils.the.media_url + 'manifest.js',
      dataType: 'script',
      success: function(){ loadResoursesProcessor(); }, async: true });
    }
  });
}
 
В этом примере мы добавили загрузку файла  navtop.html в контейнер  с id =  navtop, при этом делаем это после формирования адреса страницы, таким образом мы уверены, что запрос выполнится.

Так же можно загружать и использовать изображения и другие файлы, например из функций, описанных в файле  manifest.js в зависимости от ваших потребностей.

Распечатать этот элемент

  Пример интеграции с почтовым сервисом GMAIL
Автор: wnadmin - 02-04-2024, 09:55 AM - Сообщество: Интеграция WINNUM Platform с другими информационными системами - Нет ответов

Для настройки интеграции с почтовым сервисом GMAIL нужно указать параметры соединения и параметры пользователя (от которого будут отправляться письма) в конфигурационных файлах WINNUM Platform.

В файле «WinnumPlatform\config\mailserver\standalone.xml» укажите:

  1. id="mailServer.domain" value="gmail.com" вместо gmail.com укажите используемый почтовый домен (самый важный параметр при настройке почты)
  2. id="mail.smtp.starttls.enable" value="false или true" если используется STARTTLS на почте
  3. id="mail.smtp.ssl.trust" value="false или true" если используется SSL на почте

В файле «WinnumPlatform\config\appserver\standalone.xml» укажите:
  1. <smtp-server outbound-socket-binding-ref="mail-smtp" password="ПАРОЛЬ пользователя от которого будет отправляться почта" ssl="false или true" tls="false или true" username="почтовый ящик пользователя от которого будет отправляться почта, например admin@gmail.com" />
  2. <remote-destination host="адрес почтового сервера, например exchange2013.winnum.io" port="порт почтового сервера, например 587"/>

На этом все, незабываем перезапустить WINNUM Platform для применения новых настроек.

Распечатать этот элемент

  Создание простого дашборда
Автор: wnadmin - 02-03-2024, 10:03 AM - Сообщество: Динамические приложения в WINNUM Platform - Нет ответов

Создание простого дашборда, который в табличном виде выводит несколько последних значений сигналов из BigData.

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

Далее добавим таблицу в пустой контейнер. Для этого откроем свойства контейнера и в поле «Данные» укажем:

Код:
<table class="table table-bordered table-hover" style="background-color: #f7f7f9;">
<thead>
<tr>
  <th>#</th>
  <th>ID</th>
  <th>Время</th>
  <th>Значение</th>
</tr>
</thead>
<tbody id="t-body"></tbody></table>

Получится, что-то вроде этого:
   

Визуальная часть нового дашборда готова. Остается получить данных из BigData и поместить их в таблицу. Для получения данных будем использовать Restful API, в поле "Скрипт" у контейнера укажем:
Код:
baseSdkUtils.service.WNConnectorHelper.getSignal(
'1738AF55-BAAC-49B9-B3EA-400D58B5136E', //uuid
'A01', //signal
true,  //typeByCount
'asc', // orderByDesc
'',    //startTime
'',    //endTime
10,    //count
function(data){
  if (baseSdkUtils.isSuccess(data) ){
   for(var i = 0 ; i < data.getElementsByTagName('item').length ; i++ ){
    var signal = data.getElementsByTagName('item')[i];
    var newElement = document.createElement('tr');
    newElement.innerHTML = '<td>' + (i+1) + '</td><td>' + baseSdkUtils.decode(signal.getAttribute('signal_id')) + '</td>';
    newElement.innerHTML += '<td>' + baseSdkUtils.decode(signal.getAttribute('event_time')) + '</td>';
    newElement.innerHTML += '<td>' + baseSdkUtils.decode(signal.getAttribute('value')) + '</td>';
    document.getElementById('t-body').appendChild(newElement);
   }
}
});

Вот и все, наш новый дашборд готов!

Давайте разберем вызов поподробнее. Функция baseSdkUtils.service.WNConnectorHelper.getSignal - получает нужные сигналы согласно заданным параметрам. Используется WINNUM Javascript SDK, а значит нам не нужно ничего дополнительно подключать и не нужно выбирать какие-либо библиотеки. В нашем случае мы просто указываем какой вызов мы хотим выполнить и с какими параметрами. В примере выше в вызове мы указываем:
  • UUID продукта
  • Код сигнала, значения которого мы хотим получить
  • Указываем, что мы хотим получить по количеству ( typeByCount = true ), если false - это по дате
  • Указываем порядок сортировки (asc / desc ) - от нового к позднему или наоборот
  • Поля даты начала и даты завершения пропускаем, указывая в них пустую строку
  • Указываем количество сигналов, которые хотим получить - в нашем случае 10

После завершения вызова полученный результат передаем функции, которая вставляет данные в таблицу.

По завершению мы получаем вот такой результат:
   

Распечатать этот элемент