diff --git a/README.md b/README.md index 79eeadd..592f0b8 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ 14. [Entity Relationship диаграммы и диаграммы классов](src/DynamicEntityRelationshipDiagrams) 15. [Динамическое изменение группировки компонент в представлении контекста](src/DynamicChangeOfContextGrouping) 16. [Репозиторий чатбота корпоративного ИИ](src/aichatbot) +17. [BPMN нотация описания бизнес-процессов с использованием bpmnjs](src/bpmn) ## Разворачивание diff --git a/src/bpmn/README.md b/src/bpmn/README.md new file mode 100644 index 0000000..09d4c55 --- /dev/null +++ b/src/bpmn/README.md @@ -0,0 +1,76 @@ +## Пример использования возможностей плагина описания бизнес-процессов в BPMN нотации с использованием bpmnjs. + +### Цели примера +- Создание модели бизнес-процессов в нотации BPMN (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.bpmn); +- Автоматизированная обработка файлов XML, содержащих описание бизнес-процессов с целью: + - Формирования реестра бизнес-процессов; + - Формирования реестра функциональных дорожек и объектов бизнес-процессов; + - Контроля замкнутости бизнес-процессов с детализацией до объектов бизнес-процессов; +- Использование множественных зависимостей источников данных (datasets) (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.datasets). +- Использование механизма функций (functions) (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.functions). + +### Чего нет в примере +- Архитектурных валидаторов (validators) (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.rules.validators), но реализован специализированный отчет для проверки замкнутости; +- Специализированных сущностей (entities) (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.flex_metamodel.entities), расширяющих стандартную метамодель, например, "Функциональныве дорожки" и "Объекты данных" бизнес-процессов. + +### Файловая структура примера + +``` +|- examples - Каталог с файлами бизнес-процессов +| |- test10_1.xml - Описание бизнес-процесса 10.1 +| |- test10_2.xml - Описание бизнес-процесса 10.2 +| |- test10_3.xml - Описание бизнес-процесса 10.3 +|- templates - Шаблоны контекстов +| |- bpmn.md - Описание отчета "20. Контроль заполнения бизнес-процессов" +| |- business_processes_card.md - Расширенная карточка бизнес-процесса со схемой, входящими и исхоящими процессами +|- business_processes.yaml - Расширение атрибутного состава бизнес-процесса, чтобы была возможность использовать дополнительные свойства, которых нет в XML файлах +|- business_processes_extended_card.yaml - Расширенная карточка бизнес-процесса, созданная через entities +|- datasets.yaml - Используемые наборы данных +|- docs.yaml - Используемые документы +|- functions.yam - Используемые документы +|- README.md - Описание репозитория +``` +### Особенности реализации в текущей версии плагина +- В качестве уникального идентификатора используется текстовое представление бизнес-процессов, функциональных дорожек и объектов бизнес-процессов, т.к. файлы с описанием бизнес-процессов между собой никак не связаны, соответственно отсутствует возможность использовать идентификаторы, генерируемые плагином (они гарантировано уникальные только в пределах одного файла); +- Описание бизнес-процессов из XML файла напрямую не подключается к озеру данных, а предварительно преобразуется в источник данных (dataset) единого вида, используя универсальный подход (см. `datasets.yaml`): + - `business_processes.dataset.bp_10_1` + - `business_processes.dataset.bp_10_2` + - `business_processes.dataset.bp_10_3` +- Источники данных (dataset) каждого бизнес-процесса объединяются в единый источник данных `business_processes.dataset.main_dataset` через механизм множественных зависимостей (https://dochub.info/entities/docs/blank?dh-doc-id=dochub.datasets) и уже он используется во всех «запросах», в том числе подключатеся к озеру данных; +- Для просмотра карточки бизнес-процесса создана отдельная сущность (entities); +- Во всех отчетах реализованы гиперссылки на расширенную карточку бизнес-процесса. + +### Примеры + +#### Реестр бизнес-процессов + +![business_processes_extended_card.png](images%2Fbusiness_processes_extended_card.png) + +#### Расширенная карчтока бизнес-процесса с возможностью редактирования + +![business_processes_extended_card.png](images%2Fbusiness_processes_extended_card.png) + +#### Реестр объектов бизнес-процессов + +![business_processes_objects.png](images%2Fbusiness_processes_objects.png) + +#### Отчет по ошибкам замкнуточти бизнес-процессов + +![business_processes_errors.png](images%2Fbusiness_processes_errors.png) + +Описание ошибок "Замкнутость бизнес-процессов" + +| № строки | Ошибка | Способ устранения | +|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------| +| 1 | В бизнес-процессе "УД.10.2" указан входящий бизнес-процесс "УД.10.два", который не определен | Добавить новый бизнес-процесс, в котором указать связь с 10.2 | +| 2 | В бизнес-процессе "УД.10.1" указан исходящий бизнес-процесс "УД.10.2" с объектом "Рамочный договор депозита в статусе «Утвержден»", НО, в "УД.10.2" нет соответствующего входа | В бизнес-процесс "УД.10.2" добавить вход "УД.10.1" с объектом "Рамочный договор депозита в статусе «Утвержден»" | + +Описание ошибок "Входящие или исходящие процессы без объектов или связей с шагами основного процесса" + +| № строки | Ошибка | Способ устранения | +|----------|-----------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------| +| 1 | В бизнес-процессе "УД.10.3" есть входящий бизнес-процесс "БП без объектов" без указания объекта | Добавить объект входящего бизнес-процесса по аналогии с "УД.10.1" | +| 2 | В бизнес-процессе "УД.10.3" есть входящий бизнес-процесс "БП без связей" без указания связи (зашисший) | Добавить объект входящего бизнес-процесса и указать шаг процесса, с которым связан | + +## Авторские права +- Автор примера: https://t.me/SultanovStanislav diff --git a/src/bpmn/business_processes.yaml b/src/bpmn/business_processes.yaml new file mode 100644 index 0000000..e43c1ea --- /dev/null +++ b/src/bpmn/business_processes.yaml @@ -0,0 +1,38 @@ +docs: + + test1: + source: examples/test10_1.xml + type: bpmnjs + extension: + isgroup: false + code: УД.10.1 + description: "Процесс «Регистрация рамочного договора депозита» представляет собой последовательность действий, + направленных на оформление и учёт договора о депозите между банком и клиентом" + state: Используется + state_update_date: 2024.03.01 + division_owner: Финансовый департамент + + test2: + source: examples/test10_2.xml + type: bpmnjs + extension: + isgroup: false + code: УД.10.2 + description: "Процесс «Регистрация спецификации рамочного договора депозита» представляет собой последовательность действий, + направленных на оформление и учёт подчиненных рамочному договору договоров депозита банком и клиентом" + state: Используется + state_update_date: 2024.03.01 + division_owner: Финансовый департамент + + test3: + source: examples/test10_3.xml + type: bpmnjs + extension: + isgroup: false + code: УД.10.3 + description: "Корректировка рамочного договора депозита — это процесс внесения изменений и дополнений в ранее + заключённый договор о депозите между банком и клиентом. Целью корректировки может быть изменение условий депозита, + срока его действия, процентной ставки, порядка начисления процентов и других параметров." + state: Используется + state_update_date: 2022.03.01 + division_owner: Юридический департамент \ No newline at end of file diff --git a/src/bpmn/business_processes_extended_card.yaml b/src/bpmn/business_processes_extended_card.yaml new file mode 100644 index 0000000..8ec3cfc --- /dev/null +++ b/src/bpmn/business_processes_extended_card.yaml @@ -0,0 +1,32 @@ +entities: + + extended_business_processes_card: + title: Расширенная карточка бизнес-процесса + description: "Расширенная карточка бизнес-процесса" + presentations: + blank: + title: Расширенная карточка бизнес-процесса + type: markdown + template: templates/business_processes_card.md + source: > + ( + $id := $params.id; + $name := $params.name; + + /* Документа с описанием бизнес-процесса выполянется по ключу, чтобы не использовать docs.$spread() + [отбор по ID], */ + /* так как на большом объеме озера данных будут наблюдаться задржки обработки данных */ + + $business_processes_obj := $lookup(docs, $id).extension; + + /* Итоговая выборака набора данных */ + + { + "doc_id": $id, + "title": $name, + "description": $business_processes_obj.description, + "state": $business_processes_obj.state, + "state_update_date": $business_processes_obj.state_update_date, + "division_owner": $business_processes_obj.division_owner + } + + ) \ No newline at end of file diff --git a/src/bpmn/datasets.yaml b/src/bpmn/datasets.yaml new file mode 100644 index 0000000..379519c --- /dev/null +++ b/src/bpmn/datasets.yaml @@ -0,0 +1,147 @@ +datasets: + + # Получение описания бизнес-процесса 10.1 в виде объекта + business_processes.dataset.bp_10_1: + origin: + bpmnjs: examples/test10_1.xml + datalake: "($)" + origin1: + source: > + ( + $GetBusinessProcessEntities(bpmnjs.$, $GetBusinessProcessLink(datalake, $self)); + ) + + # Получение описания бизнес-процесса 10.2 в виде объекта + business_processes.dataset.bp_10_2: + origin: + bpmnjs: examples/test10_2.xml + datalake: "($)" + source: > + ( + $GetBusinessProcessEntities(bpmnjs.$, $GetBusinessProcessLink(datalake, $self)); + ) + + # Получение описания бизнес-процесса 10.3 в виде объекта + business_processes.dataset.bp_10_3: + origin: + bpmnjs: examples/test10_3.xml + datalake: "($)" + source: > + ( + $GetBusinessProcessEntities(bpmnjs.$, $GetBusinessProcessLink(datalake, $self)); + ) + + # Основной набор данных с бизнес-процессами, используемый во всх прочих наборах данных и документах. Внути origin + # определяются (перечисляются) наборы с описанием бизнес-процессов + business_processes.dataset.main_dataset: + origin: + bp_10_1: business_processes.dataset.bp_10_1 + bp_10_2: business_processes.dataset.bp_10_2 + bp_10_3: business_processes.dataset.bp_10_3 + source: > + ( + [bp_10_1, bp_10_2, bp_10_3]; + ) + + # Ошибки замкнутости бизнес-процессов + business_processes.dataset.business_process_closure_errors: + origin: + datalake: business_processes.dataset.main_dataset + source: > + ( + /* Бизнес-процессы */ + $datalake := datalake; + + $sub_process_data_objects := $datalake.subProcess.data_objects.( + { + "business_process_id": %.%.business_process_id, /* ID процесса */ + "business_process_name": %.%.business_process_name, /* Имя процесса */ + "business_process_link": %.%.business_process_link, /* Ссылка на документ (бизнес-процесс) */ + "sub_process_id": %.id, /* ID связанного процесса (входящего или исходящего) */ + "sub_process_name": %.name, /* Имя связанного процесса (входящего или исходящего) */ + "sub_process_is_incoming": %.is_incoming, /* Признак, что связанных процесс входящий */ + "data_object_id": data_object_id, /* ID объекта связанного процесса */ + "data_object_name": data_object_name /* Имя объекта связанного процесса */ + } + )^(business_process_id); + + /* Поиск связанного процесса, при этом поиск выполняется по следущему принципу: + - Имя связанного процесса (sub_process_name) используется для поиска в имени основного (business_process_name) и наоборот + - Имя объекта данных (data_object_name) должно совпадать + - Если связанный процесса входящий, то выполняется поиск исходящего процесса (sub_process_is_incoming) */ + $FindLinkedProcess := function($sub_process_name, $business_process_name, $data_object_name, $sub_process_is_incoming) + {( + + $exists($sub_process_data_objects[business_process_name=$sub_process_name + and sub_process_is_incoming = $sub_process_is_incoming + and data_object_name = $data_object_name + and sub_process_name = $business_process_name]) + + )}; + + /* Итоговая выборака набора данных */ + [$sub_process_data_objects.( + { + "business_process_id": business_process_id, /* ID процесса */ + "business_process_name": business_process_name, /* Имя процесса */ + "business_process_link": business_process_link, /* Ссылка на документ (бизнес-процесс) */ + "sub_process_id": sub_process_id, /* ID связанного процесса (входящего или исходящего) */ + "sub_process_name": sub_process_name, /* Имя связанного процесса (входящего или исходящего) */ + "sub_process_is_incoming": sub_process_is_incoming, /* Признак, что связанных процесс входящий */ + "data_object_id": data_object_id, /* ID объекта связанного процесса */ + "data_object_name": data_object_name, /* Имя объекта связанного процесса */ + "is_valid": $FindLinkedProcess(sub_process_name, business_process_name, data_object_name, (sub_process_is_incoming=true ? false : true)) + }[is_valid=false] + + )]; + + ) + + # Входящие или исходящие процессы без объектов или связей с шагами основного процесса + business_processes.dataset.business_processes_without_objects_or_links: + origin: + datalake: business_processes.dataset.main_dataset + source: > + ( + /* Бизнес-процессы */ + $datalake := datalake; + + /* Итоговая выборака набора данных */ + [$sub_process_data_objects := $datalake.subProcess.( + { + "business_process_id": %.business_process_id, /* ID процесса */ + "business_process_name": %.business_process_name, /* Имя процесса */ + "business_process_link": %.business_process_link, /* Ссылка на документ (бизнес-процесс) */ + "sub_process_id": id, /* ID связанного процесса (входящего или исходящего) */ + "sub_process_name": name, /* Имя связанного процесса (входящего или исходящего) */ + "sub_process_is_incoming": is_incoming, /* Признак, что связанных процесс входящий */ + "is_valid": $exists(data_objects) + }[is_valid=false] + )^(business_process_id)]; + + ) + + # Реестр (плоский список) бизнес-процессов + business_processes.dataset.business_processes_list: + origin: + datalake: business_processes.dataset.main_dataset + source: > + ( + /* Бизнес-процессы */ + $datalake := datalake; + + /* Путь к расширенной карточке бизнес-процесса */ + $path_of_extended_card := "/entities/extended_business_processes_card/blank?id="; + + /* Итоговая выборака набора данных */ + [$business_processes_list := $datalake.( + { + "business_process_id": business_process_id, /* ID процесса */ + "business_process_name": business_process_name, /* Имя процесса */ + "business_process_link": business_process_link, /* Ссылка на документ (бизнес-процесс) */ + "business_process_card": $path_of_extended_card & $replace(business_process_link, "/docs/", "") /* Ссылка расширенную карточку (бизнес-процесс) */ + & "&name=" & business_process_name + } + )^(business_process_name)]; + + ) \ No newline at end of file diff --git a/src/bpmn/dochub.yaml b/src/bpmn/dochub.yaml new file mode 100644 index 0000000..3019f50 --- /dev/null +++ b/src/bpmn/dochub.yaml @@ -0,0 +1,6 @@ +imports: + - docs.yaml + - datasets.yaml + - functions.yaml + - business_processes.yaml + - business_processes_extended_card.yaml \ No newline at end of file diff --git a/src/bpmn/docs.yaml b/src/bpmn/docs.yaml new file mode 100644 index 0000000..e799aaf --- /dev/null +++ b/src/bpmn/docs.yaml @@ -0,0 +1,117 @@ +docs: + + # Реестр бизнес-процессов + business_processes_list: + source: business_processes.dataset.business_processes_list + location: "10. Реестр бизнес-процессов" + type: table + headers: + - value: business_process_name + text: Бизнес-процесс + link: business_process_card + + # Контроль заполнения бизнес-процессов + business_process_main_card: + source: templates/business_processes_card.md + type: markdown + + # Контроль заполнения бизнес-процессов + business_process_control_of_filling: + source: templates/bpmn.md + type: markdown + location: "20. Контроль заполнения бизнес-процессов" + + # Ошибки замкнутости бизнес-процессов + business_process_closure_errors: + source: business_processes.dataset.business_process_closure_errors + type: table + headers: + - value: business_process_name + text: Исходный бизнес-процесс + link: business_process_link + - value: sub_process_name + text: Связанный бизнес-процесс + - value: data_object_name + text: Объект связанного бизнес-процесс + - value: sub_process_is_incoming + text: Это входящий + + # Входящие или исходящие процессы без объектов или связей с шагами основного процесса + business_process_without_objects_or_links: + source: business_processes.dataset.business_processes_without_objects_or_links + type: table + headers: + - value: business_process_name + text: Исходный бизнес-процесс + link: business_process_link + - value: sub_process_name + text: Связанный бизнес-процесс + - value: sub_process_is_incoming + text: Это входящий + + # Входящие или исходящие процессы без объектов или связей с шагами основного процесса + business_processes.doc.sub_process: + origin: + datalake: business_processes.dataset.main_dataset + type: table + headers: + - value: sub_process_name + text: Бизнес-процесс + link: sub_process_link + source: > + ( + /* Входящие параметры */ + $doc_id := $params.doc_id; + $incoming := $params.incoming = "true" ? true : false; + + /* Бизнес-процессы */ + $datalake := datalake; + + /* Получение ссылки расширенную карточку (бизнес-процесс) */ + $GetSubBusinessProcessLink := function($name) {( + $link := $datalake[business_process_name=$name].business_process_link; + $link := "/entities/extended_business_processes_card/blank?id=" & $replace($link, "/docs/", "") & "&name=" & $name + )}; + + /* Итоговая выборака набора данных */ + [$distinct($datalake.subProcess.( + { + "doc_id": $replace(%.business_process_link, "/docs/", ""), + "sub_process_link": $GetSubBusinessProcessLink(name), /* Ссылка расширенную карточку (бизнес-процесс) */ + "sub_process_name": name, /* Имя связанного процесса (входящего или исходящего) */ + "sub_process_is_incoming": is_incoming /* Признак, что связанных процесс входящий */ + } + )[doc_id=$doc_id and sub_process_is_incoming = $incoming])]; + + ) + + # Функциональные дорожки (роли) + business_processes.doc.lanes: + origin: + datalake: business_processes.dataset.main_dataset + type: table + location: "30. Функциональные дорожки (роли)" + headers: + - value: item_name + text: Функциональная дорожка + source: > + ( + /* Итоговая выборака набора данных */ + [$distinct(datalake.lanes.( {"item_name": item_name} ))]; + ) + + # Функциональные дорожки (роли) + business_processes.doc.data_objects: + origin: + datalake: business_processes.dataset.main_dataset + type: table + location: "40. Объекты данных бизнес-процессов" + headers: + - value: item_name + text: Объекты данных + source: > + ( + /* Итоговая выборака набора данных */ + [$distinct(datalake.data_objects.( {"item_name": item_name} ))]; + + ) \ No newline at end of file diff --git a/src/bpmn/examples/test10_1.xml b/src/bpmn/examples/test10_1.xml new file mode 100644 index 0000000..0a73f9b --- /dev/null +++ b/src/bpmn/examples/test10_1.xml @@ -0,0 +1,385 @@ + + + + + + Создан новый рамочный договор + + + + При отправке на согласование выполнется: + - Контроль заполнения обязательных атрибутов: +-  Контроль лимитов финансовой ответственности; +-  Лимит суммы размещения.  + +В случае не прохождения контролей версия договора отправляется на доработку инициатору договора. + + + + + + + Activity_0jid41e + Activity_1bagvz5 + Gateway_1ots68n + Activity_0l7y9fe + + + Activity_0sy26oi + Gateway_0ltuexa + Activity_1vwxjm7 + + + Activity_0aak9i9 + Event_1m8d26s + Activity_006i7ta + + + + Flow_159gfnp + Flow_0bezxko + + DataObjectReference_1v62kk1 + + + + Flow_159gfnp + + + + + + + + + + Flow_0bezxko + Flow_0aqejrl + + + DataObjectReference_1v62kk1 + Property_1h1dlcu + + + DataObjectReference_0w0aoh3 + + + + + + Flow_0aqejrl + Flow_1vmdee8 + + + DataObjectReference_0w0aoh3 + Property_0xfl8dq + + + DataObjectReference_1u5vmk8 + + + DataObjectReference_0dnesef + + + + + + Flow_1vmdee8 + Flow_0lj7izl + Flow_0t7b0pe + + + + + + Flow_0lj7izl + + + DataObjectReference_1u5vmk8 + Property_0scepk3 + + + + Flow_0t7b0pe + Flow_050n0nx + + + DataObjectReference_0dnesef + Property_13y8hp4 + + + DataObjectReference_08hl2bj + + + DataObjectReference_07evml4 + + + + Flow_0y3wyl4 + + + DataObjectReference_08hl2bj + Property_15tw7xn + + + + + + Flow_050n0nx + Flow_0y3wyl4 + Flow_0xuoejs + + + + + Flow_0xuoejs + + + DataObjectReference_07evml4 + Property_0d30xbo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/bpmn/examples/test10_2.xml b/src/bpmn/examples/test10_2.xml new file mode 100644 index 0000000..aa18670 --- /dev/null +++ b/src/bpmn/examples/test10_2.xml @@ -0,0 +1,106 @@ + + + + + + + + + Event_0fze5kl + Activity_1r1hy24 + Event_0ghl5gj + Activity_1a0oabv + + + + + + Flow_0epoivd + + DataObjectReference_0haxmco + + + + + Flow_0vtyd38 + + + Flow_0vtyd38 + Flow_0epoivd + Flow_1fio0n3 + + + DataObjectReference_0haxmco + Property_1hbmsuc + + + + Flow_1fio0n3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/bpmn/examples/test10_3.xml b/src/bpmn/examples/test10_3.xml new file mode 100644 index 0000000..42b7199 --- /dev/null +++ b/src/bpmn/examples/test10_3.xml @@ -0,0 +1,486 @@ + + + + + + + + + Activity_0aak9i9 + Event_1m8d26s + Activity_006i7ta + Activity_1jw29gt + Activity_1oyje4z + Activity_1q0ohjp + Activity_1pcu61v + + + Activity_0sy26oi + Gateway_0ltuexa + Activity_1vwxjm7 + + + Activity_0jid41e + Activity_1bagvz5 + Gateway_1ots68n + Activity_0l7y9fe + + + + Flow_159gfnp + Flow_0fsm8od + Flow_08yxbmz + Flow_0bezxko + + + DataObjectReference_1k2zjks + Property_0lrj6sk + + + DataObjectReference_0ta3q4c + Property_0lrj6sk + + + DataObjectReference_1v62kk1 + + + + Flow_159gfnp + + + + + + + Flow_0aqejrl + Flow_1vmdee8 + + + DataObjectReference_0w0aoh3 + Property_0xfl8dq + + + DataObjectReference_1u5vmk8 + + + DataObjectReference_0dnesef + + + + + + Flow_1vmdee8 + Flow_0lj7izl + Flow_0t7b0pe + + + + + Flow_0bezxko + Flow_1ib7y07 + Flow_0aqejrl + + + DataObjectReference_1v62kk1 + Property_1h1dlcu + + + DataObjectReference_0w0aoh3 + + + + + + + + + + Flow_0lj7izl + + + DataObjectReference_1u5vmk8 + Property_0scepk3 + + + + Flow_0t7b0pe + Flow_050n0nx + + + DataObjectReference_0dnesef + Property_13y8hp4 + + + DataObjectReference_08hl2bj + + + DataObjectReference_07evml4 + + + + Flow_0y3wyl4 + + + DataObjectReference_08hl2bj + Property_15tw7xn + + + + + + Flow_050n0nx + Flow_0y3wyl4 + Flow_0xuoejs + + + + + Flow_0xuoejs + + + DataObjectReference_07evml4 + Property_0d30xbo + + + + + + + Flow_0fsm8od + + DataObjectReference_1k2zjks + + + + + + + + Flow_08yxbmz + + DataObjectReference_0ta3q4c + + + + + + + Flow_1ib7y07 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/bpmn/functions.yaml b/src/bpmn/functions.yaml new file mode 100644 index 0000000..181bedb --- /dev/null +++ b/src/bpmn/functions.yaml @@ -0,0 +1,83 @@ +functions: + + GetBusinessProcessLink: + title: Получение ссылки на документ с бизнес-процессом bpmnjs + params: + - alias: datalake + title: $ + required: true + - alias: self + title: $self + required: true + result: + type: string + code: > + ( + $doc_id := self.origin.bpmnjs; + $result := "/docs/" & datalake.docs.$spread().({"id": $keys()[0], "source": *.source})[source=$doc_id].id; + ) + + GetBusinessProcessEntities: + title: Получение описание бизнес-процесса как объекта + params: + - alias: business_processes + title: Бизнес-процесс + required: true + - alias: doc_link + title: Ссылка на бизнес-процесс как объект архитектурного репозитория, "/docs/[ключ]" для возможности отображение гиперссылки + required: true + result: + type: object + code: > + ( + $doc_link := doc_link; + $definitions := business_processes."definitions".*; + + /* Универсальный метед получения описания сущностей схемы, имеющий структуру id и name например, + - + - */ + $GetEntities := function($data) {( + $data.({ "item_id": id, "item_name": $replace(name, "\n", " ") }) + )}; + + /* Входящие и исходящие процессы только с ID объектов данных */ + $sub_processes := $definitions."subProcess".( + { + "id": *.$.id, + "name": $replace(*.$.name, "\n", " "), + "is_incoming": $exists(outgoing), + "data_objects": $exists(outgoing) ? dataOutputAssociation.targetRef.({"data_object_id": $}) : dataInputAssociation.sourceRef.({"data_object_id": $}) + }); + + /* Объекты данных входящих и исходящих процессов */ + $sub_process_data_objects := $definitions.dataObjectReference.*.$.( {"id": id, "name": name, "ref": dataObjectRef }); + + /* Получение наименование объекта данных входящих и исходящих процессов */ + $GetSubProcessDataObjectName := function($id) {( $sub_process_data_objects[id=$id].name )}; + + /* Входящие и исходящие процессы с ID и наименованием объектов данных */ + $sub_processes_total := $sub_processes.( + { + "id": id, + "name": name, + "is_incoming": is_incoming, + "data_objects": data_objects.( + { + "data_object_id": data_object_id, + "data_object_name": $GetSubProcessDataObjectName(data_object_id) + }) + }); + + /* Итоговая выборака набора данных */ + $definitions."participant"."$".( + { + "business_process_id": id, /* Идентификатор процесса */ + "business_process_name": name, /* Наименование процесса */ + "business_process_link": $doc_link, + "lanes": $GetEntities($definitions."laneSet"."lane"."$"), /* Роли (функциональые дорожки) */ + "tasks": $GetEntities($definitions."task"."$"), /* Шаги процесса */ + "data_objects": $GetEntities($definitions."dataObjectReference"."$"), /* Объекты данных */ + "subProcess": $sub_processes_total /* Входящие и исходящие процессы */ + }); + + ) \ No newline at end of file diff --git a/src/bpmn/images/business_processes_errors.png b/src/bpmn/images/business_processes_errors.png new file mode 100644 index 0000000..8d827e8 Binary files /dev/null and b/src/bpmn/images/business_processes_errors.png differ diff --git a/src/bpmn/images/business_processes_extended_card.png b/src/bpmn/images/business_processes_extended_card.png new file mode 100644 index 0000000..e13bf31 Binary files /dev/null and b/src/bpmn/images/business_processes_extended_card.png differ diff --git a/src/bpmn/images/business_processes_list.png b/src/bpmn/images/business_processes_list.png new file mode 100644 index 0000000..9f5e30d Binary files /dev/null and b/src/bpmn/images/business_processes_list.png differ diff --git a/src/bpmn/images/business_processes_objects.png b/src/bpmn/images/business_processes_objects.png new file mode 100644 index 0000000..449e44d Binary files /dev/null and b/src/bpmn/images/business_processes_objects.png differ diff --git a/src/bpmn/templates/bpmn.md b/src/bpmn/templates/bpmn.md new file mode 100644 index 0000000..e929440 --- /dev/null +++ b/src/bpmn/templates/bpmn.md @@ -0,0 +1,7 @@ +Замкнутость бизнес-процессов + +![BPMN](@document/business_process_closure_errors) + +Входящие или исходящие процессы без объектов или связей с шагами основного процесса + +![BPMN](@document/business_process_without_objects_or_links) diff --git a/src/bpmn/templates/business_processes_card.md b/src/bpmn/templates/business_processes_card.md new file mode 100644 index 0000000..38b6af2 --- /dev/null +++ b/src/bpmn/templates/business_processes_card.md @@ -0,0 +1,17 @@ +# Бизнес-процесс "{{title}}" +- **ID**: {{doc_id}} +- **Описание:** {{description}} + +# Характеристики +- **Статус:** {{state}} +- **Дата актуализации:** {{state_update_date}} +- **Ответственный за ведение:** {{division_owner}} + +## Схема бизнес-процесса +![Схема процесса](@document/{{doc_id}}) + +## Входящие бизнес-процессы +![Входящие процессы](@document/business_processes.doc.sub_process?doc_id={{doc_id}}&incoming=true) + +## Исходящие бизнес-процессы +![Исходящие процессы](@document/business_processes.doc.sub_process?doc_id={{doc_id}}&incoming=false)