Моделювання бізнес-процесу з формування витягів у форматі csv та docx

🌐 Цей документ доступний українською та англійською мовами. Використовуйте перемикач у правому верхньому куті, щоб змінити версію.

Опис механізму моделювання бізнес-процесу наведений на прикладі Реєстру атестованих лабораторій, а саме формування витягу "Звіт по лабораторіях у форматі csv". Моделювання бізнес-процесу з витягом у форматі docx є аналогічним, за винятком кроку, де зазначається формат файлу.

Виконайте необхідні передумови для створення бізнес-процесу, інструкція за посиланням.

1. Початкові кроки створення бізнес-процесу

  1. Створіть нову BPMN-діаграму.

    bp 1

  2. Додайте елемент Create pool/Participant.

    У правому вікні з параметрами необхідно заповнити поля відповідними значеннями:

    • в полі Participant Name введіть назву пулу Формування звіту по лабораторіям в форматі csv;

    • в полі Process id введіть ідентифікатор бізнес-процесу zvit-csv-bp;

    • в полі Process name вкажіть бізнес-назву процесу Формування звіту по лабораторіям в форматі csv.

    bp modeling excerpt csv docx 01

  3. Створіть початкову подію для запуску бізнес-процесу користувачем.

    На панелі налаштувань справа заповніть наступні параметри відповідними значеннями:

    • на вкладці General:

      • в полі Id введіть значення StartEvent_lab1;

      • в полі Name введіть назву початкової події Стартова форма;

      • в полі Initiator введіть значення initiator.

        initiator — спеціальна змінна, що встановлюється для користувача, який розпочав процес.

        bp modeling excerpt csv docx 02

    • на вкладці Form:

      • в полі FormKey введіть ідентифікатор форми add-startform-zvit.

        В полі FormKey зазначається службова назва створеної UI-форми в Кабінеті адміністратора регламентів.

        bp modeling excerpt csv docx 02.1 На подальших кроках буде розглянуто моделювання стартової форми.

2. Підготування даних та їх підписання

  1. Створіть сервісну задачу "Читання даних по laboratoryId".

    Оберіть налаштований шаблон (Template) Read entity from data factory.

    Детальніше ознайомитися з описом делегата Читання сутності із фабрики даних (Read entity from data factory) ви можете за посиланням.

    На панелі налаштувань вкажіть наступні значення:

    • в полі Name вкажіть назву задачі Читання даних по laboratoryId;

    • в полі Resource вкажіть ресурс laboratory;

    • в полі Resource id введіть ідентифікатор ресурсу ${submission('StartEvent_lab1').formData.prop('laboratory').prop('laboratoryId').value()};

      В нашому випадку ми передаємо ідентифікатор ресурсу StartEvent_lab1 за допомогою функції submission() зі стартової форми бізнес-процесу.

    • в полі X-Access-Token вкажіть токен доступу до системи користувача, під яким виконується операція ${initiator().accessToken};

    • в полі Result Variable вкажіть назву для вихідного параметра — labResponse.

    bp modeling excerpt csv docx 03

  2. Створіть сервісну задачу "Пошук даних про співробітників".

    Оберіть налаштований шаблон (Template) Search for entities in data factory.

    Детальніше ознайомитися з описом делегата Пошук сутностей у фабриці даних (Search for entities in data factory) ви можете за посиланням.

    На панелі налаштувань вкажіть наступні значення:

    • У полі Name вкажіть назву задачі Пошук даних про співробітників;

    • У розділі Input Parameters:

      • Розгорніть блок Resource:

        • Local Variable Assigment має значення on, це дозволить створити локальну змінну для тіла запита;

        • Variable Assignment Type оберіть з випадного списку тип призначення змінної String of Expression;

        • Variable Assignment Value введіть staff-equal-laboratory-id.

          staff-equal-laboratory-id — це назва ендпоінту для критерію пошуку куди здійснюється запит для пошуку сутностей.

      • Розгорніть блок Search variable:

        • Local Variable Assigment має значення on;

        • Variable Assignment Type виберіть Map;

        • Add Entry → в Key зазначте laboratoryId, в Value зазначте ${submission('StartEvent_lab1').formData.prop('laboratory').prop('laboratoryId').value()}.

      • Розгорніть блок X-Access-Token:

        • Local Variable Assigment має значення on;

        • Variable Assignment Type оберіть String of Expression;

        • Variable Assignment Value введіть значення ${initiator().accessToken}.

    • У розділі Output Parameters:

      • Розгорніть блок Result variable:

        • Local Variable Assigment має значення on;

        • Assign to Process Variable введіть значення змінної до якої буде записано результат запита — staffResponse.

    bp modeling excerpt csv docx 04

  3. Створіть задачу скриптування "Підготовка даних для показу".

    На панелі налаштувань вкажіть наступні значення:

    • в полі Name вкажіть назву Підготовка даних для показу;

    • в полі Script Format вкажіть тип (мову) скриптування — groovy;

    • в полі Script Type вкажіть тип скрипту Inline Script;

    • в полі Script вставте безпосередньо groovy-скрипт:

      def labResponseBody = labResponse.responseBody
      def payload = [:]
      def personnelGrid = []
      
      def addPersonPropClosure = { person, staffIt, key ->
      if (staffIt.hasProp(key)) {
      if (!staffIt.prop(key).isNull()) {
      person[key] = staffIt.prop(key).value()
      }
      }
      }
      
      staffResponse.responseBody.elements().each {
      def person = [:]
      
          addPersonPropClosure(person, it, 'fullName')
          addPersonPropClosure(person, it, 'specializationDate')
          addPersonPropClosure(person, it, 'salary')
          addPersonPropClosure(person, it, 'hygienistFlag')
          addPersonPropClosure(person, it, 'fullTimeFlag')
      
          personnelGrid.add(person)
      }
      
      payload['name'] = labResponseBody .prop('name').value()
      payload['edrpou'] = labResponseBody .prop('edrpou').value()
      payload['address'] = labResponseBody .prop('address').value()
      payload['headName'] = labResponseBody .prop('headName').value()
      payload['personnelGrid'] = personnelGrid
      
      execution.removeVariable('payload')
      set_transient_variable('payload', S(payload, 'application/json'))

    bp modeling excerpt csv docx 05

  4. Створіть користувацьку задачу "Відобразити дані про персонал".

    На панелі налаштувань вкажіть наступні значення:

    • в полі Id введіть значення personnelDataZvitForm;

    • в полі Name вкажіть назву Відобразити дані про персонал;

    • в полі Form key введіть значення read-personnel-data-zvit;

      В полі FormKey зазначається службова назва створеної UI-форми в Кабінеті адміністратора регламентів.

      На подальших кроках буде розглянуто моделювання форми відображення даних про персонал.

    • в полі Assignee введіть значення ${initiator};

      ${initiator} вказує на те, що бізнес-процес буде призначено користувачеві, що ініціював бізнес-процес.

    • в полі Form data pre-population введіть значення ${payload}.

    bp modeling excerpt csv docx 06

  5. Створіть задачу скриптування "Підготовка даних для запису (transient var)".

    На панелі налаштувань вкажіть наступні значення:

    • в полі Name введіть значення Підготовка даних для запису (transient var);

    • в полі Script Format вкажіть тип (мову) скриптування — groovy;

    • в полі Script Type вкажіть тип скрипту Inline Script;

    • в полі Script вставте безпосередньо groovy-скрипт:

      def personnelFormData = submission('personnelDataZvitForm').formData
      
      def excerptInputData = [:]
      def requests = []
      
      def prepopulatedDataMap = [:]
      prepopulatedDataMap['name'] = personnelFormData.prop('name').value()
      prepopulatedDataMap['address'] = personnelFormData.prop('address').value()
      prepopulatedDataMap['headName'] = personnelFormData.prop('headName').value()
      prepopulatedDataMap['edrpou'] = personnelFormData.prop('edrpou').value()
      
      personnelFormData.prop('personnelGrid').elements().each {
          def request = [:]
          request.putAll(prepopulatedDataMap)
          it.fieldNames().each { fieldName ->
              request[fieldName] = it.prop(fieldName).value()
          }
          request['hygienistFlag'] = it.prop('hygienistFlag').boolValue() ? '1' : '0'
          request['fullTimeFlag'] = it.prop('fullTimeFlag').boolValue() ? '1' : '0'
      
          requests.add(request)
      }
      
      excerptInputData['requests'] = requests
      
      def request = [:]
      request['recordId'] = null
      request['excerptType'] = 'lab-staff-excerpt-csv'
      request['excerptInputData'] = excerptInputData
      request['requiresSystemSignature'] = false
      
      def payload = S(request, 'application/json')
      execution.removeVariable('payload')
      set_transient_variable('payload', payload)
      
      execution.removeVariable('excerpt')
      set_transient_variable('excerpt', excerptInputData)

    bp modeling excerpt csv docx 07

  6. Додайте сервісну задачу для підпису даних системним ключем.

    Детальніше ознайомитися з описом делегата для підпису даних системним ключем ви можете за посиланням.

    Оберіть налаштований шаблон (Template) Digital signature by DSO service.

    На панелі налаштувань вкажіть наступні значення:

    • У полі Name вкажіть назву задачі Підпис даних системним ключем.

    • У полі Payload введіть дані для підпису — ${payload}.

    • У полі X-Access-Token source вкажіть токен доступу користувача, під яким виконується операція — ${initiator().accessToken}.

    • У полі Result variable вкажіть назву змінної system_signature_ceph_key, до якої необхідно зберегти системний ключ для підпису.

3. Формування звіту

  1. Створіть сервісну задачу "Запит на формування витягу-звіту".

    Оберіть налаштований шаблон (Template) Generate Excerpt.

    • в полі Name введіть назву Запит на формування витягу-звіту;

    • в полі Excerpt Type введіть назву файлу, яким визначено формат lab-staff-excerpt-csv;

    • в полі Excerpt Input Data введіть значення ${excerpt};

    • в полі Requires System Signature введіть значення false;

      Можливість підписання даних витягів у форматі .csv і .docx системним ключем відсутня, тому за замовчуванням параметр Requires System Signature має містити значення false. Якщо буде вказано значення true, бізнес-процес не буде працювати. Підписання системним ключем доступно лише для формату .pdf.

    • в полі X-Access-Token зазначте токен доступу користувача, під яким виконується операція — ${initiator().accessToken};

    • в полі X-Digital-Signature source вкажіть джерело цифрового підпису ${sign_submission('StartEvent_lab1').signatureDocumentId};

    • в полі X-Digital-Signature-Derived source вкажіть джерело системного цифрового підпису ${system_signature_ceph_key};

    • в полі Result variable вкажіть назву для вихідного параметра response.

      bp modeling excerpt csv docx 09

    Дані, що передаються для генерації витягу excerptInputData повинні мати відповідний формат:

    {
       "requests":[
          {
             "field1":"value1"
          },
          {
             "field2":"value2"
          }
    
    ..........
       ]
    }
  2. Створіть файл у корені кластера, розмістивши його у відповідному каталозі проєкту.

    Файл повинен мати назву ідентичну зазначеній у полі Excerpt Type (на попередньому кроці), у нашому прикладі — lab-staff-excerpt-csv.csv.

    Diagram

    На цьому етапі визначається формат файлу .csv та .docx.

  3. Створіть задачу скриптування "Зберегти Id запиту витягу-звіту".

    На панелі налаштувань вкажіть наступні значення:

    • в полі Name введіть назву задачі Зберегти Id запиту витягу-звіту;

    • в полі Script Format вкажіть тип (мову) скриптування — groovy;

    • в полі Script Type вкажіть тип скрипту Inline Script;

    • в полі Script вставте безпосередньо groovy-скрипт:

      response.responseBody.prop('excerptIdentifier').value()
    • в полі Result Variable вкажіть назву змінної, до якої буде записано ідентифікатор витягу, — excerptIdentifier.

    bp modeling excerpt csv docx 11

4. Налаштування умов перевірок результату генерації витягу

  1. Додайте задачу виклику зовнішнього бізнес-процесу (Call Activity) "Перевірка статусу генерації витягу-звіту".

    Оберіть налаштований шаблон (Template) Check excerpt status.

    Детальніше ознайомитися з описом делегата Check excerpt status ви можете за посиланням.

    На панелі налаштувань вкажіть наступні значення:

    • в полі Name вкажіть назву задачі Перевірка статусу генерації витягу-звіту;

    • в полі Input excerpt identifier вкажіть ID витягу, який необхідно передати бізнес-процесу, що викликається, — ${excerptIdentifier};

    • в полі Output variable name вкажіть назву змінної — excerptStatus, до якої необхідно зберегти статус витягу, отриманий в результаті виконання підпроцесу, що викликається.

      bp modeling excerpt csv docx 12.1

    Приклад 1. Бізнес процес "Перевірка статусу генерації витягу"

    bp modeling excerpt csv docx 13

  2. Додайте елемент Create Intermediate/Boundary Event, визначте її тип, натиснувши іконку ключа (Change type) та обравши з меню пункт Timer Boundary Event.

    Детальніше ознайомитися з описом елемента моделювання події "Timer" ви можете за посиланням.

    Перейдіть до панелі налаштувань та сконфігуруйте подію:

    • в полі Name введіть значення Вичерпано час на очікування P2M;

    • в полі Timer Definition Type вкажіть тип таймера Duration (тривалість);

    • в полі Timer Definition зазначте тривалість таймера P2M.

    bp modeling excerpt csv docx 12.2

  3. Додайте XOR-шлюзи для Call Activity "Перевірка статусу генерації витягу-звіту" і Timer Boundary Event "Вичерпано час на очікування P2M".

    bp modeling excerpt csv docx 14

  4. Створіть сервісну задачу "Зберегти ідентифікатор згенерованого витягу-звіту у системну БП".

    На панелі налаштувань вкажіть наступні значення:

    • на вкладці General:

      • в полі Name введіть значення Зберегти ідентифікатор згенерованого витягу-звіту у системну БП;

      • в полі Implementation виберіть значення Delegate Expression;

      • в полі Delegate Expression введіть значення ${defineProcessExcerptIdDelegate}.

    • на вкладці Intup/Output:

      • в полі Local Variable Name введіть значення excerptId;

      • в полі Variable Assignment Type виберіть значення String or Expression;

      • в полі Variable Assignment Value введіть значення ${excerptIdentifier}.

      bp modeling excerpt csv docx 15.1

      bp modeling excerpt csv docx 15.2

    Значення, що вказано в полі Id використовується як назва файлу, який користувач буде завантажувати з Кабінету.

  5. Налаштуйте процес потоку для XOR-шлюзу.

    Створіть Connect using sequence (гілки):

    1. до сервісної задачі "Зберегти ідентифікатор згенерованого витягу-звіту у системну БП":

      • у полі Name введіть значення так;

      • у полі Condition Type виберіть значення Expression;

      • у полі Expression введіть значення ${excerptStatus.equals('COMPLETED')}.

        bp modeling excerpt csv docx 16

    2. до іншого XOR-шлюзу:

      • у полі Name введіть значення ні;

      • у полі Condition Type виберіть значення Expression;

      • у полі Expression введіть значення ${excerptStatus.equals('FAILED')}.

        bp modeling excerpt csv docx 17

5. Результат виконання процесу

5.1. Неусіпішний результат виконання бізнес-процесу

  1. Створіть сервісну задачу "Результат виконання "Витяг-звіт не сформовано"".

    Оберіть налаштований шаблон (Template) Define business process status.

    На панелі налаштувань вкажіть наступні значення:

    • у полі Name введіть значення Результат виконання "Витяг-звіт не сформовано";

    • у полі Status введіть значення Витяг не сформовано статус, що відображатиметься після завершення процесу.

    bp modeling excerpt csv docx 18

  2. Налаштуйте процес потоку від XOR-шлюзу до сервісної задачі "Результат виконання "Витяг-звіт не сформовано"", створивши Connect using sequence (гілку).

    І створіть подію завершення бізнес-процесу.

    • у полі Name введіть значення Документ витяг-звіт не сформовано.

    bp modeling excerpt csv docx 19

5.2. Успішний результат виконання бізнес-процесу

  1. Створіть сервісну задачу "Результат виконання "Витяг-звіт сформовано"".

    Оберіть налаштований шаблон (Template) Define business process status.

    На панелі налаштувань вкажіть наступні значення:

    • у полі Name введіть значення Результат виконання "Витяг-звіт сформовано";

    • у полі Status введіть значення Витяг сформовано статус, що відображатиметься після завершення процесу.

    bp modeling excerpt csv docx 20

  2. Cтворіть подію завершення бізнес-процесу.

    • у полі Name введіть значення Документ витяг-звіт сформовано.

    bp modeling excerpt csv docx 21

6. Моделювання форм

Змоделюйте форми згідно з інструкцією за посиланням.

6.1. Моделювання стартової форми

Моделювання стартової форми передбачає створення форми для пошуку лабораторії за назвою.

  • У полі Бізнес-назва форми введіть значення Стартова форма лаб звіт.

  • У полі Службова назва форми введіть значення add-startform-zvit (що використовувалось на минулому кроці як значення параметра Form Key).

bp modeling excerpt csv docx 22

Завантажити налаштовану форму можливо за посиланням: add-startform-zvit.json

6.2. Моделювання форми відображення даних про персонал

Моделювання форми відображення даних про персонал передбачає створення форми для формування даних запитуваної лабораторії.

  • У полі Бізнес-назва форми введіть значення Відобразити дані про персонал звіт.

  • У полі Службова назва форми введіть значення read-personnel-data-zvit,(що використовувалось на минулому кроці як значення параметра Form Key).

bp modeling excerpt csv docx 23

Завантажити налаштовану форму можливо за посиланням: read-personnel-data-zvit.json

7. Приклад використання бізнес-процесу користувачем

Детальніше ознайомитися з процесом формування витягів користувачем за результатом змодельованого бізнес-процесу ви можете за посиланнями: