Здравствуйте!

Кнопка сброса вызова реализована в схеме CtiPanel пакета CTIBase:

 

 

                {

                    "operation": "insert",

                    "index": 9,

                    "name": "DropButton",

                    "parentName": "ButtonsPanel",

                    "propertyName": "items",

                    "values": {

                        "id": "DropButton",

                        "itemType": Terrasoft.ViewItemType.BUTTON,

                        "click": {"bindTo": "dropCall"},

                        "visible": {"bindTo": "getCanDrop"},

                        "imageConfig": {"bindTo": "getDropButtonImageConfig"},

                        "classes": {"wrapperClass": ["call-drop-button"]},

                        "selectors": {"wrapEl": "#DropButton"},

                        "style": {"bindTo": "getDropButtonStyle"},

                        "hint": {"bindTo": "Resources.Strings.DropButtonHint"},

                        "markerValue": {"bindTo": "Resources.Strings.DropButtonHint"},

                        "tag": "DropButton"

                    }

                },

 

 

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

Код функции getCanDrop скрыт в ядре.

 

Я попробовала следующим образом:

 

               {

                    "operation": "merge",

                    "name": "DropButton",

                    "parentName": "ButtonsPanel",

                    "propertyName": "items",

                    "values": {

                        "visible": {"bindTo": "getCanDrop2"}

                    }

                },

 

И сама функция:

 

                getCanDrop2: function() {

                        if(Terrasoft.SysValue.CURRENT_USER.value !== "e0634934-6a13-482c-b5c5-16ac60404347") {

                              return false

                        } else {

                              this.getCanDrop();

                       }

                },

 

 

Но кнопка стала скрыта для всех пользователей. Я так понимаю, что при вызове функции this.getCanDrop(); нужно вместо this использовать что-то другое.

 

Скажите, как правильно вызвать эту функцию, чтобы ее код был выполнен.

Нравится

2 комментария

Добрый день,  после обновления продукта lдо версии bm online 7.12, появился инструмент "Интеграция веб Сервисов", начали интеграцию веб сервиса "Мои Звонки", регистрацию веб сервиса, настройку методов - все сделали, и бизнес процесс построили но не очень сходу понято как настроить обработку списка (массива), такой ответ возвращается:

{"results_count": 1, "results": [{"answer_time": 1527535109, "direction": 1, "src_id": 1, "event_type": 4, "client_number": "069679453", "start_time": 1527535096, "event_age": 0, "recording": "https://testimobil.moizvonki.ru/calls/recordings/YAsTbEidjZUlAqHDRnSDlwRvQnDWMsKr.mp4/", "answered": 1, "contact": {"src_id": "", "name": "Sveta Shedro", "src_url": "", "src_type_name": "mobile", "type": 1, "id": 1, "src_type_disp": "\u0421\u043c\u0430\u0440\u0442\u0444\u043e\u043d"}, "src_number": "+37368933005", "db_call_id": 1465, "event_pbx_call_id": "1.1527535096", "duration": 6, "event_grant": 1, "event_created": 1527535120, "client_name": "Sveta Shedro", "end_time": 1527535115}], "results_remains": 0}

Здесь в элементе results идет список звонков (массив)

Как в конструкторе веб сервиса в настройке ответа задать обработку такого списка (на сайте в примерах видим только обработку без массивов)? Можно на примере хотя бы одного поля (например client_number), и как потом это показать на странице при запуске бизнес процесса (для теста)?

Спасибо

Нравится

2 комментария

Если в списке по условию выборки всегда один элемент, то можно обойтись и без обработки массивов. Для получения результатов используется формат JSONPath. Например, из такого ответа:

[{"r030":840,"txt":"Долар США","rate":25.925912,"cc":"USD","exchangedate":"12.04.2018"}]

можно получить курс, указав:

$[0].['rate']

У Вас будет больше шагов до элемента, но подобным образом.

Добрый день получилось, спасибо.

 

Показать все комментарии

В обзоре пакета обновление https://academy.terrasoft.ru/documents/obzor-paketa-obnovleniy-bpmonlin… написано что есть появилась возможность как-то настроить выполнение бизнес-процесса в фоновом режиме, но на академии не нашла описание того, как это сделать.

Каким же образом все-таки это сделать?

Нравится

1 комментарий

Ксения, видимо, речь об этом:

[Выполнять следующие элементы в фоновом режиме] — признак определяет, как будут выполняться все следующие за текущим элементом шаги процесса — автоматически в фоновом режиме или с участием пользователя.

  • Если для элемента процесса снят признак [Выполнять следующие элементы в фоновом режиме], то при переходе процесса на следующие шаги, предполагающие участие пользователя (например, заполнение страницы записи), будут открыты соответствующие страницы редактирования. Например, если элемент [Открыть страницу редактирования] расположен на диаграмме процесса после элемента, для которого снят признак [Выполнять следующие элементы в фоновом режиме], то для пользователя сразу же откроется соответствующая страница редактирования.

  • Если для элемента процесса установлен признак [Выполнять следующие элементы в фоновом режиме], то все следующие шаги, требующие участия пользователя, отобразятся на вкладке [Задачи по бизнес-процессам] коммуникационной панели. Такие задачи (например, открытие страниц) не начнут выполняться, пока пользователь не кликнет по ним на вкладке [Задачи по бизнес-процессам]. При этом все действия системы будут выполнены в фоновом режиме без отображения маски загрузки, чтобы пользователь не ожидал завершения процесса. Например, если элемент [Открыть страницу редактирования] расположен на диаграмме процесса после элемента, для которого установлен признак [Выполнять следующие элементы в фоновом режиме], то новая задача по бизнес-процессам отобразится на коммуникационной панели пользователя. Если на диаграмме процесса после такого элемента следуют требующие сложных и длительных расчетов элементы из группы [Действия системы], то такие расчеты будут выполнены в фоновом режиме, а маска загрузки отображаться не будет. Такой вариант может вызвать задержку выполнения процесса, если пользователь, ответственный за выполнение действия по процессу, в момент создания задач по бизнес-процессу не вошел в систему.

Признак [Выполнять следующие элементы в фоновом режиме] может быть установлен:

  • Для всех элементов из группы [Действия пользователя].

  • Для всех элементов из группы [Начальные события], кроме элемента [Стартовый таймер]. По умолчанию признак установлен для начального события [Сигнал].

  • Признак установлен и недоступен для редактирования для элементов [Обработка сигнала] и [Обработка таймера] группы [Промежуточные события].

 

Показать все комментарии

Добрый день, коллеги!

Столкнулся со следующей проблемой: в коде модуля, добавленного на панель инструментов, не обрабатывается событие при смене значений элементов на странице, например при добавлении в атрибутах конструкции:

"Candidate": {
	dependencies: [
		{
			columns: ["Candidate"],
			methodName: "onCandidateChanged"
		}
	]
}

, метод onCandidateChanged не вызывается. Для отслеживания изменений значения справочника помогла конструкция в массиве Diff:

                        "values": {

                            ...

                            "change": { "bindTo": "onCandidateChanged" }

                        }

Но для текстового поля такая конструкция не работает.

Подскажите, пожалуйста, как мне можно отследить изменение текстового поля в модуле на панели инструментов?

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

Нравится

12 комментариев
define("SocialMessagePublisherPage", [], function() {
	return {
		entitySchemaName: "SocialMessage",
		mixins: {},
		methods: {
			init: function() {
				this.callParent(arguments);
				this.on("change:Message", this.onMessageChanged, this);
			},
			onMessageChanged: function(model, value, event) {
				debugger;
			}
		},
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

 

Варфоломеев Данила,

Спасибо! А есть ли вариант отловить события смены текста непосредственно в момент его изменения? В приведенном Вами примере событие срабатывает при потере фокуса у текстового поля.

Небеддаг Иван Владимирович пишет:

А есть ли вариант отловить события смены текста непосредственно в момент его изменения?

Есть, но надо конкретно так упороться: 

1) Сворганить свой модуль, наследуется от Terrasoft.ESNHtmlEdit. В нём подменить функции onKeyUp. Сделать так, чтобы всегда отрабатывал fireEvent.

2) В странице SocialMessagePublisherPage переопределить SocialMessagePublisherEdit: className заменить на только что созданный модуль и забиндить свою функцию на event из функции fireEvent

3) Ну и как итог своя функция будет отрабатывать на каждый введенный/удаленный символ в поле.

Варфоломеев Данила,

забиндить свою функцию на event из функции fireEvent 

Данила, добрый вечер, а можно поподробнее что именно нужно сделать. Все предыдущие шаги выполнил! 

Не могли бы вы поподробнее рассказать (или выложить кусочек кода) о том как "забиндить свою функцию на event из функции fireEvent". Никак не  получается сделать. Предыдущие шаги выполнить удалось!

Варфоломеев Данила,

"и забиндить свою функцию на event из функции fireEvent" - не могли бы Вы подробнее объяснить, каким образом это сделать?

Иван, видимо, он имел в виду как тут, только не на onClick, а на onKeyUp:

// Генерирует событие canExecute.
// Возвращает true, если можно продолжить выполнение метода onClick().
canExecute: function(config) {
    var args = config.args;
    var event = args[args.length - 1];
    // Если метод onClick() был вызван из миксина CheckModuleDestroyMixin как callback-функция,
    // то в него последним параметром передается событие, которое сигнализирует о прерывании выполнения.
    if (event && event.isComeBack) {
        return true;
    }
    // Добавление в аргументы события прерывания выполнения метода.
    // Необходимо для остановки выполнения метода при вызове onСlick из callback-функции.
    Array.prototype.push.call(config.args, {
        isComeBack: true
    });
    // Применение текущего контекста.
    Ext.apply(config, { scope: this });
    // Генерация события canExecute.
    var canExecute = this.fireEvent("canExecute", config);
    return canExecute;
},

Небеддаг Иван Владимирович,

mcNosferatum,

Извиняюсь за длительный ответ. В принципе да, Илья правильно объяснил. Если вы откроете ESNHtmlEditModule и посмотрите на функцию onKeyUp, то конкретно этот кусок кода 

this.fireEvent("keyUp", keyboardEvent, this);

отрабатывает только по условию (заключен в if). Конкретно для вашего случая нужно, чтобы сигнал посылался на каждое нажатие клавиши, поэтому fireEvent нужно вынести из под всех условий.

Upd. по быстрому набросал

Код модуля

define("UsrHtmlEditModule", ["ESNHtmlEditModule"],
	function() {
 
	//Ext.ns("Terrasoft.controls.UsrHtmlEditModule");
	/**
	 * @class Terrasoft.controls.HtmlEdit
	 * Html editor control class.
	 */
	Ext.define("Terrasoft.controls.UsrHtmlEditModule", {
		extend: "Terrasoft.ESNHtmlEdit",
		alternateClassName: "Terrasoft.UsrHtmlEditModule",
 
		onKeyUp: function(keyboardEvent) {
			this.callParent(arguments);
			this.fireEvent("keyPressed", keyboardEvent, this);
		},
 
		setInitConfig: function() {
			this.callParent(arguments);
			this.addEvents("keyPressed");
		},
 
	});
	return Terrasoft.UsrHtmlEditModule;
});

Код страницы

define("SocialMessagePublisherPage", ["UsrHtmlEditModule"], function() {
	return {
		entitySchemaName: "SocialMessage",
		mixins: {},
		methods: {
			userPressedKey: function(event) {
				debugger;
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "SocialMessagePublisherEdit",
				"values": {
					"className": "Terrasoft.UsrHtmlEditModule",
					"keyPressed": {bindTo: "userPressedKey"}
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

 

Событие keyPressed действительно теперь отрабатывает при нажатии на каждую кнопку, но почему то this.Get("SocialMessagePublisherEdit") присылает не обновленное значение!

Сложно сказать наверняка. Вы можете провести отладку в браузере и посмотреть, возможно в свойстве хранится старое значение и меняется в какой-то другой момент. Либо же актуальное значение элемента находится в другом месте.

mcNosferatum пишет:

присылает не обновленное значение!

Видимо обновленное проставляется при unFocus событии элемента. Ну что ж. Можно тогда прокидывать введённое значение.

//в модуле:
this.fireEvent("keyPressed", keyboardEvent, this.getTypedValue(), this);
 
в странице:
userPressedKey: function(event, typedValue) {
	var message = this.get("Message");
	debugger;
}

 

Данила, спасибо! Все получилось, как хотел. Использовал :

var message = typedValue; - для получения текущего значения
var message = this.get("Message"); - теперь постоянно возвращает "undefined".
Показать все комментарии

Можно ли каким-то образом построить такой запрос на клиенте:

update KitTrackingInformation

set

    TrackingNumber = @TrackingNumber

from KitTrackingInformation

        join BTSample on BTSample.BTKitIDLookupId = KitTrackingInformation.KitId

            join BTSampInShipment on BTSampInShipment.BTSampleIDId = BTSample.Id

where SampInShipment.BTShipmentId = @ShipmentId

Понятно, что это будет выглядеть приблизительно так:

                    var updateTrackingInfo = Ext.create("Terrasoft.UpdateQuery", {

                        rootSchemaName: "KitTrackingInformation"

                    });

                    updateTrackingInfo.setParameterValue("TrackingNumber", trackingNumber,

                        Terrasoft.DataValueType.SHORT_TEXT);

                                       updateTrackingInfo.filters.addItem(updateTrackingInfo.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL,

                        "<путь по связям для фильтрации>", shipmentId));

                    updateTrackingInfo.execute(function(response) {

                        if (response.success) {

                            debugger;

                        }

                    }, this);

Из всего вышеописанного следует 2 вопроса:

1) каким образом построить путь для фильтрации

2) можно ли вообще реализовать UpdateQuery с фильтрацией по полю связанной таблицы

Нравится

3 комментария

Алла, скорее всего, такое условие можно получить по обратным связям, когда пишется три поля через двоеточие в квадратных скобках. В этом случае две обратных связи подряд, то есть будет [::].[::].

Вот пример даже тройного join-а:

[SysAdminUnit:Contact:Owner].[SysUserInRole:SysUser:Id].[SysAdminUnit:Id:SysRole].Id

Ещё один:

[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole

Сработает ли для update, нужно тестировать, глядя на получающиеся запросы в SQL-профайлере.

Зверев Александр,

Спасибо за ответ.

А какие sql-запросы получаются в итоге по этим примерам?

К сожалению, нет возможности посмотреть в профайлере код запросов.

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

Показать все комментарии

На клиенте нужно вставить запись в некоторую таблицу, одним из значений параметров есть Id записи контакта, его нужно получить из таблицы Contact запросом.

Например, вот так:

            setLoggerActivatorParameter: function(clinic) {

                var loggerActivatedById;

                if (this.Ext.isEmpty(clinic)) {

                    return loggerActivatedById;

                }

                var esqContact = Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "Contact"

                });

                var esqAccountFilter = esqContact.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,

                    "Account", clinic.value);

                var esqDataLoggerActivatorFilter =

                    esqContact.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,

                    "DataLoggerActivator", true);

                esqContact.filters.add("esqAccountFilter", esqAccountFilter);

                esqContact.filters.add("esqDataLoggerActivatorFilter", esqDataLoggerActivatorFilter);

                esqContact.getEntityCollection(function(result) {

                    if (result.success && result.collection.getCount()) {

                        loggerActivatedById = result.collection.first().get("Id");

                        return loggerActivatedById;

                    }

                }, this);

            }

Но из-за ассинхроности, пока отработает функция setLoggerActivatorParameter, то запись уже добавится в таблицу без значения поля loggerActivatedById.

Вопрос в том, каким образом можно реализовать такую функциональность, чтобы получать значение поля loggerActivatedById до того, как будет добавлена новая запись в таблицу.

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

Нравится

1 комментарий

Из других вариантов:

1) сервис

2) использовать chain на клиенте (реализация гуглится по форуму или тут)

3) кривой, но рабочий (более-менее) способ — делать тот же самый esq только при загрузке страницы, где-нибудь в init-е. Ну и складировать результат в переменную. Потом в обработчике уже к переменной обращаться.

Показать все комментарии

Коллеги, добрый день!

Регулярно сталкиваемся со следующей проблемой с svn. Есть локальная среда разработки, в ней идет работа с пакетом из svn(сам svn размещен в Azure). И у нас регулярно происходит ситуация что bpm не отмечает файлы пакета как измененные, соотвественно они и не фиксируются в svn.

Пример: создаем страницы редактирования для разных типов продуктов через мастер, настраиваем страницы, сохраняем в svn. Все пока ок. НО если мы зайдем через мастер и изменим эти страницы, то в конфигурации они не заблокируются и при фиксации никакие изменения в svn не зафиксируются. 

И такое может происходить не только со схемами, но и с объектами. Что значительно усложняет настройку, особенно для аналитиков.

Кто-нибудь сталкивался с таким поведением системы? Взываем к помощи коллективного разума!)

Нравится

14 комментариев

Добрый день!

Можете уточнить характер проблемы?

После внесения изменений в страничку через мастер у вас отображается страничка с учетом изменений? (когда файл пакета не отмечен как измененный)

Код старнички до и после точно отличается? Не может ли быть такое, что изменения ушли например в Custom?

Какая версия системы?

В догонку - у вас одна конфигурация системы? Может изменения вносяться в другую?

Золотарев Артем Андреевич,

Артем, добрый день!

После внесения изменений через мастер в первый раз - все корректно сохраняется в пакете и элемент блокируется(зеленый замок). А вот если редактировать 2-ой раз, то элемент выделяется черным шрифтом, но замок не вешается. И при отправке в свн изменения не уходят. Нужно заходить в схему и нажимать сохранить, после чего вешается замок и изменения уходят.

Код странички отличается до и после, в Custom изменения не уходят. Версии - мы сталкивались с это проблемой начиная, на сколько я помню, с 7.10 и до 7.12.0

 

Конфигурация - конечно одна) 

А есть пример какие изменения через мастер на зафиксировались?

Золотарев Артем Андреевич,

Артем, как правило не фиксировались изменения типа:

1. Добавление текстового/целочисленного поля в карточку продукта (для продукта было создано несколько страниц редактирования)

2. Изменение расположения поля на странице редактирования.

Это то, что было из последнего. Причем при попытке фиксации изменений в логе комета мы видим что изменения в файлах ресурсов (en_EN, например) для схемы уходят в свн, а сама схема - нет.

 

Подобное поведение при работе с SVN и мастером разделов раньше встречалось в более старых версиях, дело было в разных символах конца строки в сохраняемом файле, то как в Windows, то как в Linux. Но тогда починили в версии 7.8.4. Если у Вас система ещё с тех времён, возможно, обновление прошло не полностью и неверная логика осталась. Если же начинали с 7.10, тогда странно.

В любом случае можно попробовать развернуть с нуля последнюю версию и попробовать воспроизвести в ней. Если там работает нормально, то на рабочей базе что-то недоустановилось при одном из обновлений.

Либо же неверно настроено на самом сервере SVN (возможно, те же концы строк).

Зверев Александр,

Александр, спасибо за мысль - передам своим разработчикам. Вместе с тем, с этой проблемой мы сталкиваемся на средах разработки последних версий системы для разных клиентов. Так что это точно не наследие от 7.8. Попробуем посмотреть по строкам. Грешим на на то, что SVN у нас в Azure.

Если наблюдается массово на разных сайтах, но при этом только у Вас, может, действительно в специфической настройке SVN или её конкретной реализации на Azure.

Если такое на многих сайтах, лучше обратиться в поддержку.

Зверев Александр,

Александр, спасибо за попытку разобраться! Понятно, что "доктор по фотографии не лечит") В саппорт уже обращались и там ответили, что о проблеме знают. Вместе с тем она явно редкая, т.к. о проблеме парализующей работу разработчиков уже кричали бы во всех темах. Будем ковырять azure и svn, но идей пока все равно нет(

Если обращались в 2016-17 гг., то тогда это исправляли в 7.8.4.

Зверев Александр,

месяц назад) Но вообще у меня появилась мысль, почему это происходит

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

Зверев Александр,

Ларчик открылся просто - на стендах некоторых сотрудников пути в ConnectionString были оставлены по умолчанию в Temp. Ну и соответственно затирались ОС. 

Александр, спасибо за информацию!

Показать все комментарии

 

День добрый!

На странице редактирования при переходе на вкладку не отображается деталь. Данная проблема происходит примерно в 1 из 5 случаев. Чтобы деталь отразилась на странице необходимо перезагрузить страницу с очисткой кэша.

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

Изображение удалено.

Нравится

1 комментарий

"мы террасофт и мы решили хранить ресурсы на hdd сервера" - вот где проблема :)  

1) Проверьте папку #папка_с_bpm#\Terrasoft.WebApp\conf\content. Поищите там файл ITProductReportDetailResources.js. 

2) Проверьте права на папку conf (должны стоять полные права IIS-юзеру)

3) Если нет файла/прав, то действительно надо перегенерировать и скомпилировать конфигурацию.

Ну и если файлы есть, а проблема воспроизводится - то прямой дорогой в ТП. Мб в загрузчике ресурсов накосячили. 

Показать все комментарии

Где-то это можно сделать? Вместо "Новая запись" добавить свой текст. Менять нужно в параметрах элемента, или на самой странице?

Изображение удалено.

Версия 7.11.

Нравится

1 комментарий

Обычно название можно менять в разделе «Перевод». Главное не перепутать и изменить именно нужное место с этим текстом.

Но для преднастроенной, насколько понял, заголовок можно менять в её дизайнере

Показать все комментарии

Всем доброго времени суток. Версия 7.11.

При выполнении элементов бизнес-процессов "Открытие страницы редактирования" и "Вопрос пользователю" в системе создаются технические активности. По ним удобно отслеживать движение по процессу и отправлять уведомления (главная задача).

Вопрос - можно ли как-то отследить аналогичным образом элементы "Автогенерируемая" и "Преднастроенная страница"? Ведь эти страницы имеют GUID, должны где-то сохраняться..

Нравится

1 комментарий

Дмитрий, добрый вечер!



Активности типа "Автогенерируемая страница" и "Преднастроеная страница" хранятся в 2 таблицах: SysProcessData и  SysProcessLog. В первой таблице они сохраняются пока находятся в работе, во второй они сохраняются всё время.

Показать все комментарии