Процесс - сущность, позволяющая учитывать различные протекающие в организации процессы. Процесс обладает встроенными параметрами:
тип;
текущий статус и время его установки;
время начала;
время завершения;
исполнители и группы решения;
описание;
Остальные параметры назначаются с помощью системы параметров для разных типов процессов.
В большинстве ERP систем ближайшим родственным понятием процессу выступает понятие "Задача". Однако, с помощью системы связывания процессов между собой, возможна настройка полноценных бизнес-процессов с подчинёнными задачами.
Новый процесс можно создать в:
очереди процессов;
на вкладке "Процессы" объекта;
как привязанный;
при обработке сообщений.
Правка статусов производится в оснастке Администрирование / Процессы / Статусы процессов. Статус определяет текущее состояние процесса. Позиция статуса определяет порядок его в списке статусов.
Кнопка Показать отображает типы процессов, в которых используется статус.
Правка выполняется в оснастке Администрирование / Процессы / Типы процессов. Типы процессов организованы в древовидный список.
При редактирование типа может быть указано его название и признак наследования либо не наследования свойств от родительского типа.
В свойствах типа указываются следующие параметры:
разрешённые статусы, их порядок в редакторе и возможные переходы между ними;
допустимые параметры процесса, их порядок;
код (ID) начального и конечных статусов;
начальные группы решения, устанавливаемые в процесс с указанием их ролей (не обязательно) ;
допустимые для установки в процесс группы решения с указанием их ролей;
конфигурация (не обязательно).
Не следует без необходимости порождать большое количество типов процессов, наследованных от общего предка и различающихся только наименованием. Тип - главный классифицирующий признак для очереди процессов и в случае их большого количества эффективность фильтрации сильно падает. Пользуйтесь списковым параметром для разделения таких процессов. |
В конфигурацию типа процесса могут быть включены блоки основной конфигурации.
Параметры конфигурации типа процесса, поддержанные ядром.
# скрытие в редакторе процесса ссылки полной правки описания
hideDescriptionChange=1
# 0 - hide, 1 (default) - show on tab process messages
#show.tab.messages=1
# отображение в процессе сообщений также и дочерних привязанных процессов
#show.messages.link.process=processMade, processDepend
# empty (default) or 0 - hide, 1 - show on tab process links
#show.tab.links=1
# требования указания обязательного комментария при переводы в статусы
requireChangeCommentStatusIds=<status_ids>
# коды групп исполнителей через запятую, которые можно указать при создании процесса
onCreateSelectGroup=<groupIds>
# шаблон текста при добавлении в описание процесса текста кнопкой "Добавить"
descriptionAddPattern=(${description}\n)[(${time}) (${user})]\t(${text})
# произвольный шаблон времени для добавляемого текста
descriptionAddPattern.timePattern=dd.MM HH:mm
# JSP шаблон для отображения карточки процесса вместо стандартного /WEB-INF/jspf/user/process/process/process.jsp
#processCardJsp=/WEB-INF/jspf/user/process/process/custom/process_jur/zayavka.jsp
# HTML стиль левого и правого блока карточки процесса, по-умолчанию они делятся поровну
#style.processCardLeftBlock=min-width: 500px;
#style.processCardRightBlock=width: 100%
Где:
<status_ids> - коды статусов через запятую;
<groupIds> - коды групп через запятую.
# при ошибке правки параметров - обновление таблицы с параметрами, необходимо в случае, если при этом другие параметры изменяются динамическим кодом onErrorChangeParamsReload=1 # требование заполненности параметров перед установкой статуса, одна или несколько записей вида requireFillParamIdsBeforeStatusSet.<status_to_code>=<param_codes> # сокрытие параметров в том или ином статусе, одна или несколько записей вида hideParamIdsInStatus.<status_code>=<param_codes> # параметры, редактор для которых скрыт в данном типе процесса (заполняются программно) readonlyParamIds=<param_codes>
Где:
<param_code> - код параметра процесса, который должен быть указан при его закрытии, при этом редактор открывается под переключением статуса процесса;
<status_to_code> - код статуса, в который переводится процесс;
<param_codes> - коды параметров процесса через запятую;
<status_code> - код текущего статуса процесса.
Для настройки отображения параметра в зависимости от гибкой проверки условия одно или несколько правил:
# отображение параметра, только если выполняется JEXL выражение showParam.<paramId>.checkExpression=<JEXL_EXPR>
Где:
<paramId> - код параметра;
<JEXL_EXPR> - JEXL выражение.
В JEXL процессор передаются следующие объекты для вызова функций:
user - объект класса ru.bgcrm.model.user.User - текущий пользователь;
process - объект класс ru.bgcrm.model.process.Process - изменяющийся процесс;
processParam - объект класса ru.bgcrm.dao.expression.ParamValueFunction - параметры изменяющегося процесса.
Одно или несколько правил вида:
executorRestriction.<n>.groupId=<groupId> executorRestriction.<n>.maxCount=<maxCount>
Где:
<n> - порядковый числовой номер правила;
<groupId> - код группы пользователей;
<maxCount> - максимальное число исполнителей из данной группы на процессе.
Просматриваются все правила в порядке их номеров.
Для настройки отображения левой области карточки процесса в конфигурацию типа добавляются одна или несколько конструкций вида:
processCard.<id>.mode=<modes> processCard.<id>.components=<components>
Где:
<id> - порядковый номер правила;
<modes> - список через запятую режимов отображения карточки процесса, допустимые значения:
card - просмотр карточки с открытием в буфере,
linked - просмотр карточки процесса, привязанного к другому процессу с открытием в правой области первого процесса;
<components> - через запятую компоненты левого блока, допустимые стандартные блоки: header, description, executors, links, params; or custom JSP filed prefixied by jsp:.
Example:
// PzdcDoc snippet of: 'Kernel Process Card type configuration', lines: 1 - 2
processCard.{@inc:cnt}.mode=card
processCard.{@cnt}.components=description,params,links,header,executors
How does the configured card look like.
You can see the feature enabled and sample configurations in Demo System, the process description is Kernel Process Create In. |
Ro restricting areas where the process type can be created, add:
create.in.areas=<areas>
Where <areas> is comma separated list of areas, where process can be created:
message - message processing;
queue - process queues;
linked - Processes tab for an object like customer.
Empty key value denies process creation for all areas, for the last area linked can be additionally configured:
# * (default) - allow creation as linked in any object #create.in.objectTypes=<типы объектов через запятую> create.in.copyParams=перечень пар <с параметра>:<на параметр>, разделённых точкой с запятой # # open the created process #create.in.<тип объекта>.openCreated=1
Разрешает создание процесса с привязанным данным объектом во вкладке Процессы объекта (ниже на скриншоте). Копирование параметров поддерживается только для объектов, использующих стандартную систему параметров системы. Типы объектов ядра:
customer - customer
Типы объектов плагинов описаны в документации плагинов:
Пример. Возможность создания процесса с привязкой контрагента, копированием параметра с кодами 1 и 5 в контрагента в параметры процесса с кодами 3 и 6 соответственно:
create.in.objectTypes=customer create.in.copyParams=1:3;5:6
Processe reference macros allows to generate dynamically a description text for a process. To define a reference add the following block to process type configuration.
processReference.<n>.objectTypes=<objectTypes> processReference.<n>.stringExpression=<macros>
Where:
<n> - порядковый номер записи;
<objectTypes> - areas, there the macros is applicable, see the possible values below;
<macros> - JEXL expression, passed objects see below.
Areas:
customer - Tab Processes in a customer;
processCard - title of process' card;
linkedProcessList - table with parent related processes;
linkProcessList - table with child related processes;
messagePossibleProcess - table with possible processes for a message;
open.processCard - process card in open interface.
В JEXL процессор передаются объекты:
process - объект класса ru.bgcrm.model.process.Process - процесс;
processParam - объект класса ru.bgcrm.dao.expression.ParamValueFunction - параметры процесса.
processLink - объект класса ru.bgcrm.dao.expression.ProcessLinkFunction - для работы с привязками процесса.
Кроме того доступны переменные устанавливаемые в ru.bgcrm.servlet.filter.SetRequestParamsFilter.
Retrieving parameters may be quite expensive. |
Here is a simple example from our Demo System, type configuration of process Kernel Process Reference.
// PzdcDoc snippet of: 'Process Type Config Sample', lines: 1 - 4
processReference.{@inc:cnt}.objectTypes=customer,processCard
processReference.{@cnt}.stringExpression=<<END
return "Reference 1: " + processParam.getValue({@PARAM_LIST_ID});
END
How does it look in UI like.
Some more examples with different retrieved data:
processReference.{@inc:cnt}.objectTypes=customer processReference.{@cnt}.stringExpression=u.toString(processParam.addressValues(90, 'fromStreet')) + " : " + processParam.getValue(238) processReference.{@inc:cnt}.objectTypes=processCard processReference.{@cnt}.stringExpression="Request: " + u.escapeXml(u.toString(processLink.linkTitles("customer"))) + "<br/>" + u.escapeXml(u.toString(processParam.addressValues(90, 'fromStreet'))) + " "
How you could notice, HTML markup can be used in expressions. It is also possible to separate some buffer shown text like that.
Here is the process configuration for that.
processReference.{@inc:cnt}.objectTypes=processCard processReference.{@cnt}.stringExpression="<span class='title'>#" + process.getId() + " " + process.getTypeTitle() + " " + "</span><span>" + u.escapeXml(process.getDescription()) + "</span>"
Process relatinons are ordered.
To distinguish those, we name sometimes a Parent process as Linked and a Child as Link.
Relations might have three types.
Where:
Link - simple reference from one process to another, no additional logic has been added;
Made - processes C is part of process A that can be closed only after C;
Depend - process C depends on process B and can be closed only ater closing B.
You can change change this default closing linked processes logic in type configuration.
# on process closing checking of being closed related child processes - 'down', or parents - 'up', 0 - do not check at all process.close.check.processDepend=up process.close.check.processMade=down
Such complex character of relations is hidden from the end-user, operating on Related Processes tab. The tab is shown by default for any process type, it can be however disabled using properties configuration.
# 0 - hide, 1 (default) - show on tab linked processes show.tab.links.process=0
Once the tab is shown, any type of linked processes have to be shown in a separated sub-tab, so named Category.
For every category of linked processes add the following record in process type configuration.
process.link.category.<n>=<title> # optional keys process.link.category.<n>.link=<link> process.link.category.<n>.link.type=<relationType> process.link.category.<n>.process.types=<processTypes> process.link.category.<n>.add=<add> process.link.category.<n>.add.process.statuses=<addProcessStatuses>
Where:
<n> - unique record’s numeric ID;
<title> - meaningful title for the category of linked processes;
<link> - 1 (default) for child relations, or 0 for parent;
<relationType> - process relation type: processLink (default), processMade, processDepend;
<processTypes> - comma separted process type IDs of linked processes;
<add> - 1 for ability to add linked processes in the category;
<addProcessStatuses> - comma separated process statuses for filtering available for adding; the order of statuses is used for sorting them.
For every item in creating and linking process combo box has to be added a record in process type configuration.
processCreateLink.<n>.title=<title> processCreateLink.<n>.processTypeId=<typeId> processCreateLink.<n>.linkType=<linkType> # optionally #processCreateLink.<n>.checkExpression=<expression> #processCreateLink.<n>.checkErrorMessage=<expressionError> # copy process parameters #processCreateLink.<n>.copyParams=<copyRules> # copy process links #processCreateLink.<n>.copyLinks=<copyLinks>
Where:
<n> - unique numeric ID;
<title> - title for the combo;
<linkType> - process relation type: processLink, processMade, processDepend;
<typeId> - created process type ID;
<expression> - JEXL expression, when returns false - the combo-box item is displayed strikethrough;
<exressionError> - error message shown on attempt to use a disabled item;
<copyRules> - comma separated parameter IDs to be copied in each newly created process, or mapping pairs <from_id>:<to_id> for copying between different parameters but with a same type;
<copyLinks> - copy links to a created process, 1 - copy all links, but also possible to limit them by type, e.g.: contract%, customer%.
To JEXL processor for <expression> are passed objects:
processParam - object of class ru.bgcrm.dao.expression.ParamValueFunction, process parameters.
Only child related processes can be created in a this way. |
Использование связанных процессов рекомендуется в случае, когда существующие иные разделения не позволяют учитывать всю информацию.
Существующие методы организации данных о бизнес-процессах:
Долгоживущая сущность, у неё есть параметры, исполнители, группы решения, статусы меняются. В перспективе в нём же будет учёт затраченного времени и оценка оставшегося. Запланированные даты. Процесс и его параметры постоянно изменяются.
Любой информационный обмен в рамках процесса. Параметров мало: тип, направление, адрес противоположной стороны. Входящие - исходящие звонки, письма, сообщения форума, HelpDesk а. Здесь же в дальнейшем будут сохраняться и встречи (как в классическом календаре Outlook). Это протокол обмена информацией, сообщения не изменяются после отправки.
Отложенное действие по процессу. Например, напомнить менеджеру сделать звонок. Или дублировать периодический процесс.
В рамках текущего процесса порождается новый. Исполнители у него совершенно другие и не связаны с основным процессом. Статусы тоже. В основном процессе должна отображаться лишь краткая сводка о текущем статусе дочернего процесса. Порождать дочерние процессы следует экономно, иначе можно запутаться.
Разделять процессы следует в случае, если вложенные процессы:
Исполняются параллельно с другими дочерними либо с основным процессом. Если процесс просто последовательно меняет состояния - лучше добавить статусов. Исполняется несколькими исполнителями или группами - добавить групп решения либо ролей.
Исполняется множество на один родительский процесс. Подключения по разным адресам, например. В этом случае текущее состояние можно отобразить только множеством статусом.
Карточка процесса открывается в буфере объектов и позволяет редактировать свойства уже созданного процесса.
В левой области расположены блоки редактирования свойства процесса и ссылки для их редактирования, настроенные для типа процесса параметры. Вид левого блока можно настроить в конфигурации типа процесса.
Строка с описанием процесса (по-умолчанию содержит код процесса и наименование его типа) может быть настроена в конфигурации. Эта же строка отображается в буфере закрытых объектов, позволяя вернуться на недавно открытый процесс.
В правой области отображаются связанные с процессом данные, например связанные процессы, либо различные расширения, предоставляемые плагинами.
The link […] left of process type calls a popup menu.
That allows the following operations:
Clone - the process is copied with all its parameter values;
Merge - the process is deleted, all its messages and description are moved to a merging target process;
Delete - the process is just deleted.
Каждый процесс может выполняться одним или несколькими подразделениями (группами). При этом группа выступает в процессе в той или иной роли. По-умолчанию в системе определена одна роль с кодом 0 - "Выполнение" процесса. Список ролей может быть дополнен в конфигурации. Примерами ролей могут быть: "Инициация", "Продажа", "Согласование" и т.п. У каждой роли должен быть свой уникальный код.
На снимке ниже одна группа выполняет процесс в роли "Выполнение", другая "Инициация".
Для каждой группы выполнения процесса могут быть установлены исполнители один или несколько.
Отображение привязок в карточке процесса задаётся переменной в конфигурации типа процесса. К процессу могут быть привязаны различные объекты. Например: контрагенты, договоры.
Привязываемый к процессу объект должен бть доступен в буфере интерфейса. Контрагент может быть привязан с несколькими ролями. По-умолчанию в системе доступна лишь роль "Контрагент", это изменяется в конфигурации.
У привязанных объектов процессы к ним относящиеся отображаются на вкладке Процессы.
По-умолчанию отображаются несколько обязательных полей процессов, возможна настройка описания в конфигурации типа для области customer.
Данный способ, однако, вызывает значительную дополнительную нагрузку на БД при выводе списка и не позволяет гибко настраивать отображаемые столбцы. Вместо стандартного списка может быть отображена очередь процессов с фильтром по данному объекту. В конфигурации очереди могут быть определены столбцы и сортировки с явным значением value.
Данная функция включается в конфигурации:
<objectType>.processes.queue=<queueId>
Где:
<objectType> - тип привязанного объекта, например customer или contract:<billingId>;
<queueId> - код очереди процессов.
Например:
customer.processes.queue=12 contract:bitel.processes.queue=11
С помощью настройки в конфигурации типа процесса возможно разрешение создания процессов определённого типа прямо из данной вкладки.
You can see the feature enabled and sample configurations in Demo System, the process description is Kernel Process Link. |
The Related Processes tab shows all the processes, related to the current one. Counters in the tab title (2) show total counts of parent / child relations for the current process.
Normally all of those related processes have to be shown in categories tabs (read after about them). |
Open / Close filter on the top applied to all the shown below processes, seprated on configured Categories tabs. The filters' value is also used when adding (button 1) exising processes inside a tab.
The last choosen filters' value is persisted for the current user. |
After pressing the 1 button, the Link existing process editor is opened.
There are suggested to be linked already existing processes, matching to the selected category and not related there yet. Prior to horizintal black line are shown processes opened in buffer. Needed processes can be quickly filtered out by description of ID, checked and linked by pressing OK button.
Is is not allowed to make cyclic relations with type Link or Made. On attempt to do that you get the Cyclic dependency error. |
When clicking in a process ID within categories table, a separated process card would be opened. Clicking on any other place in a process row except ID opens a left area of the process card direct in the table place.
For creating and linking processes there is a button placed right from the filter (3). Pressing it calls an editor with a drop-down list of preconfigured values.
The strikethrough item in the list mark a blocked item, the blocking reason is shown when you try to use it.