| Добро пожаловать, Гость |
Вам необходимо зарегистрироваться перед тем, как пытататься написать сообщение.
|
| Статистика сообществ |
» Участники: 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 ); // список сигналов шаблона
});
}
|
|
|
| Создание своей страницы |
|
Автор: 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>):
В полученном 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» укажите:
- id="mailServer.domain" value="gmail.com" вместо gmail.com укажите используемый почтовый домен (самый важный параметр при настройке почты)
- id="mail.smtp.starttls.enable" value="false или true" если используется STARTTLS на почте
- id="mail.smtp.ssl.trust" value="false или true" если используется SSL на почте
В файле «WinnumPlatform\config\appserver\standalone.xml» укажите:
- <smtp-server outbound-socket-binding-ref="mail-smtp" password="ПАРОЛЬ пользователя от которого будет отправляться почта" ssl="false или true" tls="false или true" username="почтовый ящик пользователя от которого будет отправляться почта, например admin@gmail.com" />
- <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
После завершения вызова полученный результат передаем функции, которая вставляет данные в таблицу.
По завершению мы получаем вот такой результат:
|
|
|
|