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

 

Может кто нибудь сможет подсказать где капать и как исправить проблему..

Документооборот, маршрут согласования. 

Когда на согласующего падает задача, то планированная дата завершения задачи не соответствует установленному сроку (в часах)

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

 

Может кто нибудь сталкивался с такой проблемой

Заранее спасибо!

Нравится

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

Алевтина, добрый день!

 

Рекомендуем создать обращение для нашей команды поддержки, написав письмо на адрес support@creatio.com.

Так мы сможем получить больше информации и провести полный анализ Вашей проблемы.

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

Добрый день.

Есть некий процесс. На развилке "ИЛИ" надо направить на разные ветки в зависимости от роли ответственного.

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

Пользователь может состоять в нескольких ролях. По трассировке я их получаю.

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

Как мне написать формулу в условном потоке чтобы выбрать роль и процесс пошел в определенную ветку?

Нравится

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

Доброе утро.

 

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

 

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

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

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

В старых вебинарах я рассказывал о реализации функции “звонк на ответственного” через разработку дополнительного web-сервиса без авторизации в bpm’online. Данный сервис позволяет определить контакта по номеру телефона, найти внутренний номер сотрудника, закрепленного за этим контактом и направить звонок непосредственно на него. Только если он не ответил на протяжение n-секунд, отправить по общему правилу.

В представленной мною реализации было несколько проблем:

  1. Сервис без авторизации, а значит, к нему легко получить доступ. Ничего, кроме внутреннего номера ответственного по заданному номеру клиента не увидят. Но, это все же не безопасный метод.
  2. Есть основание полагать, что после очередного обновления bpm’online, этот сервис перестанет работать и нужна будет повторная его установка.

В документации по разработке bpm’online 7.8 появилось описание интеграции с помощью веб-службы DataService. Как уверяют меня коллеги, этот функционал был давно, но, описание появилось только начиная с 7.8 :wink: Вот на него и будем переводить нашу функцию “Звонок на ответственного”.

Для реализации поставленной задачи, нужна сборка ACR от 27.06.2016 или старше (начиная с релиза webitel v3.3.0), где была добавлена функция реверса строки и работы с Cookie. Так же, нам понадобиться логин и пароль пользователя bpm’online, у которого есть доступ на чтение в разделе Контакты.

В public маршруте проходим авторизацию с помощью httpRequest и получаем cookies в переменную:

{
    "httpRequest": {
        "exportCookie": "my_cookie",
        "url": "https://my.bpmonline.com/ServiceModel/AuthService.svc/Login",
        "method": "POST",
        "headers": {
            "Content-Type": "application/json"
        },
        "data": {
            "UserName": "Supervisor",
            "UserPassword": "Supervisor"
        }
    }
}

Дальше, имея cookie, мы можем получить доступ к DataService. Номера телефонов контактов хранятся в bpm’online в колонке Number таблицы ContactCommunication. И мы бы могли написать запрос, если бы не одно НО – как быть с символами, пробелами и другими знаками, что вносит пользователь в поле номера телефона? Для этого в bpm’online имеется скрытая колонка SearchNumber, где хранятся только цифры в обратном порядке (для более быстрого поиска). Этим мы и воспользуемся. Но, для начала обернем наш номер с помощью строковой функции reverse:

{
    "string": {
        "fn": "reverse",
        "data": "${caller_id_number}",
        "setVar": "reverted_caller_id_number"
    }
}

В переменной reverted_caller_id_number у нас будет обернутое значение номера телефона. Отправляем запрос на получение имени контакта по номеру и его ответственного:

{
    "httpRequest": {
        "url": "https://my.bpmonline.com/0/dataservice/json/reply/SelectQuery",
        "method": "POST",
        "headers": {
            "Cookie": "${my_cookie}",
            "Accept": "application/json;odata=verbose"
        },
        "exportVariables": {
            "effective_caller_id_name": "rows.0.Name",
            "owner_caller_id_number": "rows.0.OwnerLogin"
        },
        "data": {
            "QueryType": 0,
            "Columns": {
                "Items": {
                    "Name": {
                        "OrderDirection": 0,
                        "OrderPosition": 0,
                        "Caption": null,
                        "Expression": {
                            "ExpressionType": 0,
                            "ColumnPath": "Name"
                        }
                    },
                    "OwnerLogin": {
                        "OrderDirection": 0,
                        "OrderPosition": 0,
                        "Caption": null,
                        "Expression": {
                            "ExpressionType": 0,
                            "ColumnPath": "[WSysAccount:Contact:Owner].Login"
                        }
                    }
                }
            },
            "AllColumns": false,
            "IsDistinct": false,
            "RowCount": 1,
            "Filters": {
                "FilterType": 6,
                "ComparisonType": 0,
                "LogicalOperation": 0,
                "IsNull": true,
                "IsEnabled": true,
                "IsNot": false,
                "Items": {
                    "FilterByPhone": {
                        "FilterType": 1,
                        "ComparisonType": 9,
                        "LogicalOperation": 0,
                        "IsNull": true,
                        "IsEnabled": true,
                        "IsNot": false,
                        "LeftExpression": {
                            "ExpressionType": 0,
                            "ColumnPath": "[ContactCommunication:Contact].SearchNumber"
                        },
                        "RightExpression": {
                            "ExpressionType": 2,
                            "ColumnPath": null,
                            "Parameter": {
                                "DataValueType": 1,
                                "Value": "${reverted_caller_id_number}"
                            }
                        }
                    }
                }
            },
            "RootSchemaName": "Contact",
            "OperationType": 0
        }
    }
}

Результат мы сохраняем в 2-х переменных:

effective_caller_id_name – webitel подставит значение из этой переменной в SIP From.
owner_caller_id_number – а здесь у нас храниться внутренний номер ответственного по контакту. Теперь достаточно выполнить звонок на этот номер.
Ответственный получает входящий звонок с именем контакта:

Звонок на ответственного

Полный пример маршрута Вы найдете на страницах базы знаний webitel.

Нравится

Поделиться

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

Есть такая штука, как маршрут в контрагенте http://joxi.ru/LnCNU_3JTJBCYyC35sk

Допустим я делаю карточку заказа из точки А в точку Б надо перевести заказ и хочу карту вывести, какой код на кнопку мне надо добавлять?

В контрагенте вижу следующее:
http://joxi.ru/lXCNUxjKTJBdHyuCgow
и всего лишь такой код http://joxi.ru/qHCNU_3JTJA4Y8mrjtY

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

Нравится

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

Добрый день, Илья.
В бизнес-процессе карточки контрагента, на дорожке «Кнопки карт», есть три обработчика событий нажатия кнопок карт, смотрите Рис.1.
Логика построения маршрута реализована в блоке отмеченном на Рис. 2.
Скрипт содержит подготовку параметров для открытия страницы с картой нужного маршрута.

var recordUId = Page.DataSource.ActiveRow.PrimaryColumnValue;
 
OpenMapsPageTask.OpenerInstanceId = InstanceUId;
OpenMapsPageTask.PageUId = ContactAccountGoogleMapsPageSysSchemaUId;  
 
OpenMapsPageTask.PageParameters =  
                new Dictionary<string, string> {
                               {"entityName", "Account"},
                               {"entityUId", recordUId.ToString()},
                               {"routeMode", IsMapsRouteMode.ToString()}
                };
return true;
Показать все комментарии