Сообщение пользователю в БП

Здравствуйте.
Коллеги, подскажите, пожалуйста, как можно в бизнес процессе выводить информационное сообщение пользователю?

Нравится

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

используйте "Вопрос пользователю"

Дело в том, что элемент "Вопрос пользователю" не совсем удачный, если пользователя нужно просто проинформировать. В случае, если пользователь не ответит на вопрос, процесс дальше не пойдет. А в нашем случае это просто информация, и процесс должен идти дальше.
Ведь можно из кода в элементе "Задание-сценарий" как-то вывести сообщение?

Стандартный способ показать информационное сообщение пользователю из скрипта страницы.
Создаем скрипт подготовки и Действие процесса "Открыть окно сообщения"

Пишем в скрипте:

InfoMessageUserTask.Page = Page;
InfoMessageUserTask.Icon = "INFORMATION";
InfoMessageUserTask.Buttons = "OK";
InfoMessageUserTask.MessageText = "Тариф успешно заведен в Bill-Master";

*не забываем использовать Localizible strings

Также можно сделать следующим образом:

InfoMessageUserTask.ResponseMessages = new Dictionary<string, string> {{"ok", "SomeMessage"}}  

Генерация сообщения SomeMessage по нажатию кнопки ok

Сделал, как написано, при публикации получаю ошибку:

The name 'Page' does not exist in the current context

Данная реализация не подойдет, та как я не учел, что в 7.х нет InfoMessageUserTask.

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

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

Так, а если все-таки хочется вывести сообщение, как это сделать ? речь о 7.3
Спасибо.

А вывести сообщение в напоминая не пойдет?

"Олейников Владимир Владимирович" написал:общение в напоминая не пойдет?

Владимир, это как ? визуально себе не представляю.

В bpm`online есть таблица Reminding. Туда записываются все напоминания. BPM считывает от туда записи и выводит их на главной странице справа

Как вариант, конечно, можно рассмотреть. Просто эффект от появившегося окна и от молча созданного сообщения в напоминании несколько разный. Особенно, когда там много записей.

Ну туда обычно смотрят, что за напоминания там появляются

Правильно я понял, что сообщение вывести нельзя каким-то простым способом ? Почему сразу об этом не сказать :-)

В БД есть элемент "Вопрос пользователю", но, как я понял, он вас не устраивает

"Олейников Владимир Владимирович" написал:"Вопрос пользователю"

Хороший элемент. В определенных ситуациях.
В определенных моментах не удобен. Оставляет следы в виде активностей(которые смущают пользователей иногда), его можно отложить.
А сообщение вылетает в середине. Закрыть его можно по нажатию ОК.

Точно утверждать не буду, но в указанной таблице есть поле ContactId. Думаю что оно отвечает за то кому из пользователей оно будет адресовано.

Добрый день!
Есть вариант передать сообщение по каналу Web-socket.
На клиенте необходимо подписаться на получение сообщения от определенного адресата следующим образром:

subscriptionFunction: function() {
		            Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
		                    this.onMyProcessMessage, this);
},
 
onMyProcessMessage: function(scope, message) {
		            if (!message || message.Header.Sender !== "MyProcess") {
			            return;
		            }
		            var message = message.Body;
		            if (!this.Ext.isEmpty(message)) {
		                this.Terrasoft.showInformation(message);
		            }
	            }

А на сервере, то есть в БП, кидать сообщение следующим образом:

			Terrasoft.Configuration.MsgChannelUtilities.PostMessage(UserConnection, "MyProcess", "MyMessage");

"Андрей Каспаревич" написал:вариант передать сообщение по каналу Web-socket

Слава Ктулху!
спасибо)

"Андрей Каспаревич" написал:На клиенте необходимо подписаться на получение сообщения от определенного адресата следующим образром

Подскажите, а где это надо подписаться? В конкретной карточке или где-то глобально?

Владимир, данную задачу можно реализовать следующим кодом в элементе "Задание-сценарий":

throw new Exception("Сообщение пользователю")

"Демьяник Алексей Олегович" написал:

Владимир, данную задачу можно реализовать следующим кодом в элементе "Задание-сценарий":

throw new Exception("Сообщение пользователю")

1) Идёт только запись в Process Log
2) На этом выполнение процесса останавливается

Здравствуйте, Владимир!

Все-таки, необходимо воспользоваться решением в комментарии №16:
http://www.community.terrasoft.ru/forum/topic/11784#comment-52515

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

define("ContactSectionV2", ["ContactSectionV2Resources"],
	function(resources) {
		return {
			entitySchemaName: "Contact",
			diff: [],
			methods: {
				init: function() {
					this.callParent(arguments);
					this.subscriptionFunction();
				},
				subscriptionFunction: function() {
					Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
					this.onMyProcessMessage, this);
				},
 
				onMyProcessMessage: function(scope, message) {
					if (!message || message.Header.Sender !== "MyProcess") {
						return;
					}
					var message2 = message.Body;
					if (!this.Ext.isEmpty(message2)) {
						this.Terrasoft.showInformation(message2);
					}
				}
			}
		};
	});

Элемент бизнес процесс выглядит так:

Terrasoft.Configuration.MsgChannelUtilities.PostMessage(UserConnection, "MyProcess", "MyMessage");
return true;

Так же, если необходимо- можете этот метод подтянуть на более глобальном уровне.

После такого варианта сообщение, конечно, выводится, но после нажатия кнопки "ОК" начинается бесконечная загрузка в рабочем представлении...

"Чкалов Евгений Валерьевич" написал:

После такого варианта сообщение, конечно, выводится, но после нажатия кнопки "ОК" начинается бесконечная загрузка в рабочем представлении...


Комментарий как-то вырван из контекста, сообщение вызванное кодом:
this.Terrasoft.showInformation("текст сообщения");
не может вызывать зависания после нажатия "ОК". Скорее всего Ваша проблема заключается в чем-то другом, что Вы делаете на странице где произведён вызов сообщения.

Максим, да в том то и дело, что в остальном страница почти пустая - пока только тренируемся подобные задачи выполнять. Прикладываю код замещающий страницы - там ничего лишнего, вроде...
Сам БП состоит из одного элемента, помимо начала и конца - задание-сценарий с кодом: Terrasoft.Configuration.MsgChannelUtilities.PostMessage(UserConnection, "Process1", "My message");
В любом случае, в саппорт уже описал проблему - но с ответом пока молчат

entitySchemaName: "Contact",
         methods: {
          init: function() {
                          this.callParent(arguments);
                          this.subscriptionFunction();
                         },
          subscriptionFunction: function() {
                          Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
                          this.onMyProcessMessage, this);
                         },
          onMyProcessMessage: function(scope, message) {
                          if (!message || message.Header.Sender !== "Process1") {
                           return;
                          }
                          var message2 = message.Body;
                          if (!this.Ext.isEmpty(message2)) {
                           this.Terrasoft.showInformation(message2);
                          }
                         },
          getLabel: function() {
             var args = {
              sysProcessName: "Process1",
              parameters: {
               InjParam: "SchemeParam"
              }
             };
             ProcessModuleUtilities.runProcess(args.sysProcessName, args.parameters, this);
            }

Вызов БП по его UId решит проблему "зависания":

var args = {
sysProcessUId: "a3e69695-52fe-49ac-95e5-81cb2f24f877",
parameters: {
InjParam: this.get("Name").displayValue
}
};

ProcessModuleUtilities.executeProcess({
sysProcessId: args.sysProcessUId,
parameters: args.parameters
});

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

ProcessModuleUtilities.executeProcess({sysProcessName: args.sysProcessName,
                         sysProcessId: args.sysProcessUId,
                         parameters: args.parameters});

Здравствуйте.
Интересует вопрос по отображению елемента "Вопрос пользователю".
Создал админом бизнес процесс который после завершения звонка клиенту создает активность "Вопрос пользователю" из вариантамы ответов как дальше двигаться по процессу. Если же админ совершал звонок - все отрабатывает нормально, вопрос всплывает и процес идет дальше. Если же я совершаю звонок менеджером, то активность "Вопрос пользователю" создается, но почемуто не всплывает карточка активности. В чем может быть причина токого поведения?
Причем ответственный в этой активности именно тот кто звонит.
А в Журнале процессов ответственный за процес - стоит админ, а не тот кто создал звонок.
Спасибо.

И еще такой момент. Когда я нахожусь во время завершения звонка в разделе активности, то карточка не всплывает даже у админа. Можна что-то с этим поделать?

Добрый день!

Проверьте, чтобы все лишние вкладки в браузере были закрыты. Вопрос пользователю мог открыться в другом окне.
Создал процесс, который открывает вопрос пользователю после завершения звонка. Добавил 2 пользователей – один с правами сис. админа, второй обычный пользователь.
Выполнил звонок:
User1 - > User2
User2 -> User1
В обоих случая открылась страница редактирования.

Вкладка открыта только одна. Зашел и через третего пользователя - то же самое. Активность создается, но не всплывает после завершения звонка. Не знаю что делать. Можете подключиться и посмотреть?

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

Для подключения рекомендую написать на support@terrasoft.ru.

Добрый день!

"Андрей Каспаревич" написал:Есть вариант передать сообщение по каналу Web-socket.

Успешно использовал данный метод в версии 7.7. После обновления на 7.8 перестало работать.
От других процессов сообщения ловятся, а от моих нет.
Ниже код:
Подписка и ожидание сообщения на клиенте:

 init:function(){
                    this.callParent(arguments);
                    this.sandbox.subscribe("UsrGetOpportunityInfo", function(){
                        return {
                            ContactId: this.get("Contact") ? this.get("Contact").value : null,
                            OpportunityId: this.get("Id")
                        }
                    }, this);
                    //subsribe on Web-socket channel
                    this.subscriptionFunction();
                },
                subscriptionFunction: function() {
                    Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
                        this.onMyProcessMessage, this);
                },
                /**
                 * Show message to user, that sms already exists in database
                 */
                onMyProcessMessage: function(scope, message) {
                    if (!message ||
                        (message.Header.Sender !== "UsrIncomingSMSParseProcess"&&
                        message.Header.Sender !=="UsrOutgoingSMSParseProcess")) {
                        return;
                    }
                    var message2 = message.Body;
                    if (!this.Ext.isEmpty(message2)) {
                        this.Terrasoft.showInformation(message2);
                    }
                },

Отправка сообщения с сервера:

Terrasoft.Configuration.MsgChannelUtilities.PostMessage(userConnection, "UsrOutgoingSMSParseProcess", String.Format("This SMS already imported: [{0}]",smsId));

Подскажите, в чем может быть проблема?

Разобрался. Не было приведения к формату JSON

Если что, получить переменную коннекшена можно так:

var userConnection = Get<UserConnection>("UserConnection");

"Липатов Юрий Сергеевич" написал:Terrasoft.Configuration.MsgChannelUtilities.PostMessage(UserConnection, "MyProcess", "MyMessage");
return true;

Так что в обычных бп код отправки сообщения будет:

var userConnection = Get<UserConnection>("UserConnection");
Terrasoft.Configuration.MsgChannelUtilities.PostMessage(userConnection, "MyProcess", "MyMessage");
return true;
Показать все комментарии