TrainingMaterials 4 2 ExternalStorage: различия между версиями
WikiSysop (обсуждение | вклад) м (1 версия импортирована) |
Agmikheev (обсуждение | вклад) Метка: отменено |
||
Строка 1: | Строка 1: | ||
{{PageHeading|RunaWFE. Практикум. | {{PageHeading|RunaWFE. Практикум. внутреннее хранилище данных.}} | ||
{{Licensing}} | {{Licensing}} | ||
Строка 9: | Строка 9: | ||
= Практическое занятие "Разработка бизнес-процесса "Заказ автотранспорта" = | = Практическое занятие "Разработка бизнес-процесса "Заказ автотранспорта" = | ||
== Цель занятия == | == Цель занятия == | ||
Целью занятия является изучение работы с | Целью занятия является изучение работы с внутренним хранилищем данных, представленным в виде Excel таблиц. | ||
== Теоретические сведения == | == Теоретические сведения == | ||
Строка 15: | Строка 15: | ||
"''' | "'''внутреннее хранилище данных'''" - аналог таблиц базы данных, представленных в виде Excel-листов. Предназначено для централизованного хранения данных бизнес-процесса. | ||
Для работы с | Для работы с внутренним хранилищем в RunaWFE используется одноименный обработчик "внутреннее хранилище данных", который обеспечивает возможность выполнения простых действий: добавления, чтения, удаления и обновления данных. | ||
Подробности использования обработчика, его параметры и возможные действия над | Подробности использования обработчика, его параметры и возможные действия над внутренним хранилищем будут рассмотрены на практическом занятии при разработке бизнес-процесса "Заказ автотранспорта" | ||
== Порядок выполнения работы == | == Порядок выполнения работы == | ||
Строка 29: | Строка 29: | ||
Заказчиком автотранспорта может выступить любой сотрудник организации, который подает заявку с описанием необходимого авто, времени подачи машины и количества мест. | Заказчиком автотранспорта может выступить любой сотрудник организации, который подает заявку с описанием необходимого авто, времени подачи машины и количества мест. | ||
Руководитель одобряет заявку или отказывает. После принятия заявки канцелярией, она сохраняется во | Руководитель одобряет заявку или отказывает. После принятия заявки канцелярией, она сохраняется во внутреннем хранилище для дальнейшей обработки диспетчером автопарка. | ||
Диспетчер автопарка получает из | Диспетчер автопарка получает из внутреннего хранилища все необработанные заявки и выполняет отбор тех, которые будут удовлетворены. | ||
Заявки отображаются в виде таблицы с информацией от кого поступила заявка и с возможностью сортировки по полям. Благодаря этому диспетчер может в первую очередь удовлетворить более приоритетные заявки. | Заявки отображаются в виде таблицы с информацией от кого поступила заявка и с возможностью сортировки по полям. Благодаря этому диспетчер может в первую очередь удовлетворить более приоритетные заявки. | ||
Строка 495: | Строка 495: | ||
''Задача сценария "Получить заявку из списка"'' | ''Задача сценария "Получить заявку из списка"'' | ||
После подачи заявка записывается во | После подачи заявка записывается во внутреннее хранилище данных (Excel файл) со статусом "Не обработана", далее выполняется периодическое ее считывание из внутреннего хранилища для проверки статуса, зная ее id. | ||
При этом '''результат считывания из | При этом '''результат считывания из внутреннего хранилища всегда является списком''' (даже если считывается одна конкретная заявка по ее id). Поэтому дополнительно используется специальный обработчик для получения элемента списка, в данном случае заявки из списка заявок. | ||
Выделите задачу сценария как показано на рисунке 2.32 и перейдите в ее свойство. Здесь выберите в качестве класса обработчика - "Получить элемент списка". Задайте конфигурацию как показано на рисунке 2.33. | Выделите задачу сценария как показано на рисунке 2.32 и перейдите в ее свойство. Здесь выберите в качестве класса обработчика - "Получить элемент списка". Задайте конфигурацию как показано на рисунке 2.33. | ||
Строка 511: | Строка 511: | ||
Подробная работа с | Подробная работа с внутренним хранилищем будет описана в последующих пунктах. | ||
Строка 517: | Строка 517: | ||
</li> | </li> | ||
В процессе "Заявка" используется таймер для установки периода считывания заявки из | В процессе "Заявка" используется таймер для установки периода считывания заявки из внутреннего хранилища. | ||
Кликните по таймеру правой клавишей мыши и выберите пункт "Задержка" | Кликните по таймеру правой клавишей мыши и выберите пункт "Задержка" | ||
Строка 577: | Строка 577: | ||
Данный процесс запускает диспетчер. Выполняется считывание из | Данный процесс запускает диспетчер. Выполняется считывание из внутреннего хранилища всех заявок со статусом "Не обработана". Если такие есть, то они отображаются для диспетчера в виде таблицы с возможностью выбора тех, которые он желает запланировать. Информация по запланированным заявкам обновляется во внутреннем хранилище. Далее цикл считывания необработанных заявок повторяется. | ||
Здесь используется тот же набор элементов что и для процесса "Заявка". | Здесь используется тот же набор элементов что и для процесса "Заявка". | ||
Строка 623: | Строка 623: | ||
Создайте остальные переменные: | Создайте остальные переменные: | ||
* "Все заявки" - переменная формата Список(Заявка), будет содержать считанные из | * "Все заявки" - переменная формата Список(Заявка), будет содержать считанные из внутреннего хранилища необработанные заявки | ||
* "Отобранные заявки" - переменная формата Список(Заявка), будет содержать отобранные диспетчером заявки | * "Отобранные заявки" - переменная формата Список(Заявка), будет содержать отобранные диспетчером заявки | ||
* "Количество заявок" - переменная формата "Целое число", хранит количество заявок | * "Количество заявок" - переменная формата "Целое число", хранит количество заявок | ||
Строка 747: | Строка 747: | ||
Необходима для определения количества необработанных заявок, считанных из | Необходима для определения количества необработанных заявок, считанных из внутреннего хранилища. | ||
Выделите задачу сценария (см. рис. 2.48), введите в свойство "Название" - "Определить количество заявок" | Выделите задачу сценария (см. рис. 2.48), введите в свойство "Название" - "Определить количество заявок" | ||
Строка 845: | Строка 845: | ||
В процессе "Планирование" используется таймер для установки периода считывания необработанных заявок из | В процессе "Планирование" используется таймер для установки периода считывания необработанных заявок из внутреннего хранилища. Кликните по таймеру правой клавишей мыши и выберите пункт "Задержка". Установите задержу равной 10 секунд от даты прихода управления в состояние. | ||
Строка 893: | Строка 893: | ||
''''' | '''''внутреннее хранилище данных. Бот работы с внутренним хранилищем.''''' | ||
В качестве | В качестве внутреннего хранилища данных о заявках используются Excel-листы. Строки на Excel листе соответствуют заявкам, а столбцы атрибутам заявки (id, Тип авто, Статус и т.д.). | ||
Например, на рисунке 2.59 представлен Excel лист с данными по четырем заявкам. | Например, на рисунке 2.59 представлен Excel лист с данными по четырем заявкам. | ||
Строка 903: | Строка 903: | ||
<center>[[Image:zak_59.png]]</center> | <center>[[Image:zak_59.png]]</center> | ||
<center>Рисунок 2.59 Пример | <center>Рисунок 2.59 Пример внутреннего хранилища</center> | ||
Строка 909: | Строка 909: | ||
Для работы с данным хранилищем используется специальный обработчик " | Для работы с данным хранилищем используется специальный обработчик "внутреннее хранилище данных" (ru.runa.wfe.office.storage.handler.ExternalStorageHandler), позволяющий выполнять простейшие действия с данными: | ||
''Действие INSERT'' | ''Действие INSERT'' | ||
Предназначено для добавления данных во | Предназначено для добавления данных во внутреннее хранилище. Вставка выполняется в следующую свободную строку. В качестве входных данных используется переменная пользовательского типа или список из таких переменных. | ||
Например, в разрабатываемом процессе, данное действие будет использовано для вставки во | Например, в разрабатываемом процессе, данное действие будет использовано для вставки во внутреннее хранилище поданной заявки. | ||
''Действие SELECT'' | ''Действие SELECT'' | ||
Предназначено для чтения данных из | Предназначено для чтения данных из внутреннего хранилища, может быть использована с условием. Например, для выборки заявок с определенным статусом. | ||
'''Замечание'''. В качестве результата всегда возвращает список, даже если был получен только один элемент. Именно поэтому в процессе "Заявка", после чтения заявки по ее id, дополнительно используется обработчик "Получить элемент списка". | '''Замечание'''. В качестве результата всегда возвращает список, даже если был получен только один элемент. Именно поэтому в процессе "Заявка", после чтения заявки по ее id, дополнительно используется обработчик "Получить элемент списка". | ||
Строка 927: | Строка 927: | ||
''Действие UPDATE'' | ''Действие UPDATE'' | ||
Предназначено для обновления переменной пользовательского типа во | Предназначено для обновления переменной пользовательского типа во внутреннем хранилище. Обязательно использование условия для определения переменной, которую требуется обновить (иначе будут обновлены все переменные во внутреннем хранилище). | ||
Например, в разрабатываемом процессе используется для обновления заявки после изменения ее статуса с "Не обработана" на "Запланирована", зная ее id. | Например, в разрабатываемом процессе используется для обновления заявки после изменения ее статуса с "Не обработана" на "Запланирована", зная ее id. | ||
Строка 934: | Строка 934: | ||
''Действие DELETE'' | ''Действие DELETE'' | ||
Предназначено для удаления переменной пользовательского типа из | Предназначено для удаления переменной пользовательского типа из внутреннего хранилища. Используется с условием, иначе будут удалены все переменные из внутреннего хранилища. В качестве входного параметра в обязательном порядке должна принимать переменную пользовательского типа, для использования ее в параметре "Переменная". Это необходимо для того, чтобы обработчик знал, какие поля размещены во внутреннем хранилище. | ||
Например, в разрабатываемом процессе используется для удаления заявки из основного | Например, в разрабатываемом процессе используется для удаления заявки из основного внутреннего хранилища после ее переноса в архивное внутреннее хранилище. | ||
'''''Рекомендации для корректной работы с " | '''''Рекомендации для корректной работы с "внутренним хранилищем данных":''''' | ||
1). Один Excel-лист должен соответствовать одной таблице. | 1). Один Excel-лист должен соответствовать одной таблице. | ||
2). Обработчик, реализующий коннектор к Excel-файлу, необходимо использовать только в задаче бота. Это нужно для того, чтобы исключить одновременный доступ к хранилищу из разных экземпляров процессов, в результате чего могут быть потеряны данные. При этом бот-станция должна быть настроена на последовательное выполнение заданий бота в рамках одного потока, работающего с | 2). Обработчик, реализующий коннектор к Excel-файлу, необходимо использовать только в задаче бота. Это нужно для того, чтобы исключить одновременный доступ к хранилищу из разных экземпляров процессов, в результате чего могут быть потеряны данные. При этом бот-станция должна быть настроена на последовательное выполнение заданий бота в рамках одного потока, работающего с внутренним хранилищем. | ||
Таким образом может быть получен простейший аналог транзакций системы управления БД. | Таким образом может быть получен простейший аналог транзакций системы управления БД. | ||
3). Excel файл должен быть предварительно создан. Если в файле предполагается хранить более одной таблицы (расположенных на разных листах), то необходимо предварительно создать эти листы. | 3). Excel файл должен быть предварительно создан. Если в файле предполагается хранить более одной таблицы (расположенных на разных листах), то необходимо предварительно создать эти листы. | ||
4). Таблица всегда должна располагаться начиная с 1-го столбца, поэтому в конфигурации обработчика " | 4). Таблица всегда должна располагаться начиная с 1-го столбца, поэтому в конфигурации обработчика "внутреннее хранилище данных" параметр "Столбец" всегда должен быть равным "1". | ||
5). В момент выполнения обработчика, использующего одно из действий INSERT, DELETE, UPDATE, файлы | 5). В момент выполнения обработчика, использующего одно из действий INSERT, DELETE, UPDATE, файлы внутреннего хранилища данных не должны быть открыты, иначе действие не будет выполнено. | ||
6). Атрибуты пользовательского типа данных не должны содержать пробелы т.к. в случае использования такого поля в условии конфигурации обработчика | 6). Атрибуты пользовательского типа данных не должны содержать пробелы т.к. в случае использования такого поля в условии конфигурации обработчика внутреннего хранилища, действие будет выполнено некорректно. | ||
Например, "Заказ.Количество мест" не будет работать в условии конфигурации обработчика | Например, "Заказ.Количество мест" не будет работать в условии конфигурации обработчика внутреннего хранилища, используйте "Заказ.Количество" | ||
7). Во избежание проблем с форматом '''запрещается''' самостоятельно добавлять данные во | 7). Во избежание проблем с форматом '''запрещается''' самостоятельно добавлять данные во внутреннее хранилище. Если есть необходимость использовать заранее заполненное хранилище, создайте для этого отдельный процесс с задачей бота, использующей обработчик "внутреннее хранилище данных" с соответствующим действием (insert). | ||
Строка 979: | Строка 979: | ||
Если на сервере отсутствует ботстанция localbotstation, то создайте ее (подробнее см. ''"Практическое занятие "Изучение перспективы операций", Порядок выполнения работы, Пункт 10, Рис. 5.3, Рис. 5.4'') | Если на сервере отсутствует ботстанция localbotstation, то создайте ее (подробнее см. ''"Практическое занятие "Изучение перспективы операций", Порядок выполнения работы, Пункт 10, Рис. 5.3, Рис. 5.4'') | ||
<li>'''Создайте''' в среде разработки нового бота "Бот работы с | <li>'''Создайте''' в среде разработки нового бота "Бот работы с внутренним хранилищем" | ||
</li> | </li> | ||
Строка 993: | Строка 993: | ||
<li>'''Создайте''' задачи бота работы с | <li>'''Создайте''' задачи бота работы с внутренним хранилищем | ||
</li> | </li> | ||
Строка 1005: | Строка 1005: | ||
Далее выберите класс обработчика " | Далее выберите класс обработчика "внутреннее хранилище данных" | ||
Строка 1016: | Строка 1016: | ||
'''''Задача "Добавить заявку на обработку"''''' | '''''Задача "Добавить заявку на обработку"''''' | ||
Данная задача бота предназначена для добавления заявки во | Данная задача бота предназначена для добавления заявки во внутреннее хранилище. | ||
Создайте новую задачу бота с названием "Добавить заявку на обработку". Выберите в качестве обработчика " | Создайте новую задачу бота с названием "Добавить заявку на обработку". Выберите в качестве обработчика "внутреннее хранилище данных". | ||
Добавьте входной параметр с названием "Заявка" типа "Пользовательский тип данных". Для этого нажмите кнопку "Добавить" в секции входных параметров, введите название параметра и выберите его тип. | Добавьте входной параметр с названием "Заявка" типа "Пользовательский тип данных". Для этого нажмите кнопку "Добавить" в секции входных параметров, введите название параметра и выберите его тип. | ||
Строка 1041: | Строка 1041: | ||
<center>[[Image:zak_66.png]]</center> | <center>[[Image:zak_66.png]]</center> | ||
<center>Рисунок 2.66 Конструктор конфигурации обработчика " | <center>Рисунок 2.66 Конструктор конфигурации обработчика "внутреннее хранилище данных"</center> | ||
Выберите из списка действий - INSERT. | Выберите из списка действий - INSERT. | ||
Параметр "Входной файл" определяет Excel файл, выступающий в качестве | Параметр "Входной файл" определяет Excel файл, выступающий в качестве внутреннего хранилища. Задайте его как путь к файлу - C:\runa_tmp\DB.xlsx | ||
Нажмите "Добавить атрибут", в поле "Переменная" выберите входной параметр "Заявка". | Нажмите "Добавить атрибут", в поле "Переменная" выберите входной параметр "Заявка". | ||
Строка 1058: | Строка 1058: | ||
Таким образом, переменная связанная со входным параметром "Заявка" с помощью действия INSERT будет добавлена во | Таким образом, переменная связанная со входным параметром "Заявка" с помощью действия INSERT будет добавлена во внутреннее хранилище, представленное файлом C:\runa_tmp\DB.xlsx. | ||
Строка 1073: | Строка 1073: | ||
Данная задача бота предназначена для считывания заявки из | Данная задача бота предназначена для считывания заявки из внутреннего хранилища по ее id (уникальному идентификатору). | ||
Создайте новую задачу бота с названием "Считать заявку". Выберите в качестве обработчика " | Создайте новую задачу бота с названием "Считать заявку". Выберите в качестве обработчика "внутреннее хранилище данных". | ||
Добавьте входной параметр с названием "id" типа "Строка, Текст". | Добавьте входной параметр с названием "id" типа "Строка, Текст". | ||
Строка 1106: | Строка 1106: | ||
'''Замечание'''. Таблица всегда должна располагаться начиная с 1-го столбца, поэтому параметр "Столбец" всегда должен быть равным "1". | '''Замечание'''. Таблица всегда должна располагаться начиная с 1-го столбца, поэтому параметр "Столбец" всегда должен быть равным "1". | ||
Под параметром "Выполняемое действие" расположено текстовое поле, предназначенное для ввода условия. Если его не задать, то SELECT выберет из | Под параметром "Выполняемое действие" расположено текстовое поле, предназначенное для ввода условия. Если его не задать, то SELECT выберет из внутреннего хранилища все заявки. | ||
Синтаксис условий следующий: | Синтаксис условий следующий: | ||
Строка 1143: | Строка 1143: | ||
'''''Задача "Добавить заявку в архив"''''' | '''''Задача "Добавить заявку в архив"''''' | ||
Задача выполняет добавление заявки в архивное | Задача выполняет добавление заявки в архивное внутреннее хранилище. | ||
Процесс создания данной задачи аналогичен созданию задачи "Добавить заявку на обработку". Отличие только в использовании другого Excel файла. | Процесс создания данной задачи аналогичен созданию задачи "Добавить заявку на обработку". Отличие только в использовании другого Excel файла. | ||
Пусть архивное | Пусть архивное внутреннее хранилище будет в файле C:\runa_tmp\Archiv.xlsx | ||
Строка 1165: | Строка 1165: | ||
После добавления заявки в Архив, ее требуется удалить из основного хранилища. | После добавления заявки в Архив, ее требуется удалить из основного хранилища. | ||
Создайте новую задачу бота с названием "Удалить заявку". Выберите в качестве обработчика " | Создайте новую задачу бота с названием "Удалить заявку". Выберите в качестве обработчика "внутреннее хранилище данных". | ||
Добавьте входные параметры: | Добавьте входные параметры: | ||
Строка 1197: | Строка 1197: | ||
В процессе "Планирование" требуется считывать заявки со статусом "Не обработана". | В процессе "Планирование" требуется считывать заявки со статусом "Не обработана". | ||
Создайте новую задачу бота "Считать необработанные заявки". Используйте обработчик " | Создайте новую задачу бота "Считать необработанные заявки". Используйте обработчик "внутреннее хранилище данных". | ||
Добавьте выходной параметр "Заявки" типа "Список". | Добавьте выходной параметр "Заявки" типа "Список". | ||
Строка 1227: | Строка 1227: | ||
В процессе "Планирование" требуется обновить заявки после изменения их статуса. | В процессе "Планирование" требуется обновить заявки после изменения их статуса. | ||
Создайте новую задачу бота "Обновить заявку". Используйте обработчик " | Создайте новую задачу бота "Обновить заявку". Используйте обработчик "внутреннее хранилище данных". | ||
Добавьте входные параметры "id" типа "Строка, Текст", "Заявка" типа "Пользовательский тип данных" | Добавьте входные параметры "id" типа "Строка, Текст", "Заявка" типа "Пользовательский тип данных" | ||
Строка 1265: | Строка 1265: | ||
Для этого выделите роль, нажмите "Изменить", в открывшемся окне выберите вкладку "Бот". | Для этого выделите роль, нажмите "Изменить", в открывшемся окне выберите вкладку "Бот". | ||
В выпадающем списке "исполнитель по имени" должен быть доступен "Бот работы с | В выпадающем списке "исполнитель по имени" должен быть доступен "Бот работы с внутренним хранилищем", выберите его. | ||
Строка 1396: | Строка 1396: | ||
</li> | </li> | ||
<li>'''Откройте''' бот работы с | <li>'''Откройте''' бот работы с внутренним хранилищем | ||
</li> | </li> | ||
Строка 1414: | Строка 1414: | ||
Включение опции гарантирует последовательное выполнение задач данного бота, благодаря чему будет исключена ситуация одновременного доступа к | Включение опции гарантирует последовательное выполнение задач данного бота, благодаря чему будет исключена ситуация одновременного доступа к внутреннему хранилищу данных, которая может привести к потере данных. | ||
Таким образом может быть получен простейший аналог транзакций системы управления БД. | Таким образом может быть получен простейший аналог транзакций системы управления БД. | ||
<li>'''Создайте''' в каталоге "C:\runa_tmp\" пустые Excel файлы "DB.xlsx" и "Archiv.xlsx", являющиеся файлами | <li>'''Создайте''' в каталоге "C:\runa_tmp\" пустые Excel файлы "DB.xlsx" и "Archiv.xlsx", являющиеся файлами внутреннего хранилища | ||
</li> | </li> | ||
Строка 1440: | Строка 1440: | ||
Как видите, управление пришло в цикл считывания необработанных заявок и будет находиться здесь пока во | Как видите, управление пришло в цикл считывания необработанных заявок и будет находиться здесь пока во внутреннее хранилище не добавят хотя бы одну заявку. | ||
Строка 1527: | Строка 1527: | ||
<li>'''Откройте''' файл | <li>'''Откройте''' файл внутреннего хранилища данных - C:\runa_tmp\DB.xlsx | ||
</li> | </li> | ||
Строка 1533: | Строка 1533: | ||
<center>[[Image:zak_99.png]]</center> | <center>[[Image:zak_99.png]]</center> | ||
<center>Рисунок 2.99 Заявки во | <center>Рисунок 2.99 Заявки во внутреннем хранилище </center> | ||
Строка 1539: | Строка 1539: | ||
<li>'''Закройте''' файл | <li>'''Закройте''' файл внутреннего хранилища данных | ||
</li> | </li> | ||
Строка 1572: | Строка 1572: | ||
</li> | </li> | ||
'''Замечание'''. Убедитесь, что перед выполнением данного задания, файл DB.xlsx не открыт для просмотра, иначе бот не сможет вносить изменения во | '''Замечание'''. Убедитесь, что перед выполнением данного задания, файл DB.xlsx не открыт для просмотра, иначе бот не сможет вносить изменения во внутреннее хранилище. | ||
Строка 1609: | Строка 1609: | ||
<li>'''Откройте''' основное и | <li>'''Откройте''' основное и внутреннее хранилище данных (файлы C:\runa_tmp\DB.xlsx и C:\runa_tmp\Archiv.xlsx) | ||
</li> | </li> | ||
Строка 1654: | Строка 1654: | ||
Во | Во внутреннем хранилище данных, представленном в виде Excel файла, на отдельном листе "Склад" хранится информация об имеющихся на складе канцтоварах, их количестве и принадлежности к группе. Весь товар разбит по группам: | ||
* "Экономный сотрудник" - товары, которые нужны для работы практически всем (ручка, карандаш, бумага и т.п.) | * "Экономный сотрудник" - товары, которые нужны для работы практически всем (ручка, карандаш, бумага и т.п.) | ||
Строка 1661: | Строка 1661: | ||
* "Фирменные материалы" - специальные товары, содержащие символику компании (блокнот А5 фирменный, конверт фирменный A4, конверт фирменный A5, пакет полиэтиленовый фирменный большой, портфель фирменный, ручка фирменная и т.п.) | * "Фирменные материалы" - специальные товары, содержащие символику компании (блокнот А5 фирменный, конверт фирменный A4, конверт фирменный A5, пакет полиэтиленовый фирменный большой, портфель фирменный, ручка фирменная и т.п.) | ||
Пользователь заказывает товар со склада, указывая нужное количество. Выбранные товары добавляются на лист "Заказанные товары" | Пользователь заказывает товар со склада, указывая нужное количество. Выбранные товары добавляются на лист "Заказанные товары" внутреннего хранилища. Работник склада получает список заказанных с помощью данного экземпляра процесса товаров, а также текущие остатки на складе. | ||
По предоставленной информации работник склада решает - скомплектовать или отказать заказ. | По предоставленной информации работник склада решает - скомплектовать или отказать заказ. | ||
Строка 1729: | Строка 1729: | ||
Информация по заказанным товарам должна сохраняться во | Информация по заказанным товарам должна сохраняться во внутреннем хранилище на отдельном листе "Заказанные товары", и содержать следующие данные: | ||
* id экземпляра процесса заказа канцтоваров | * id экземпляра процесса заказа канцтоваров | ||
Строка 1741: | Строка 1741: | ||
'''Замечание'''. Т.к. состав данных на листе "Склад" отличается от "Заказанные товары", то используйте два пользовательских типа "Товар" и "Заказанный товар" с соответствующим набором полей. | '''Замечание'''. Т.к. состав данных на листе "Склад" отличается от "Заказанные товары", то используйте два пользовательских типа "Товар" и "Заказанный товар" с соответствующим набором полей. | ||
'''Замечание'''. | '''Замечание'''. внутреннее хранилище, представленное в виде excel файла, должно быть предварительно создано, в том числе и соответствующие листы. Кроме того, внимательно прочитайте рекомендации по использованию обработчика внутреннего хранилища, описанные между пунктами 34 и 35 практического занятия "''Разработка бизнес-процесса "Заказ автотранспорта"''. | ||
'''Обратите внимание'''(!) на пункт 7 - '''запрещается''' самостоятельно добавлять данные во | '''Обратите внимание'''(!) на пункт 7 - '''запрещается''' самостоятельно добавлять данные во внутреннее хранилище, в случае необходимости, используйте для этого задачу бота с обработчиком "внутреннее хранилище данных", действие - insert. | ||
Строка 1754: | Строка 1754: | ||
Поле "Количество" на форме выбора товаров для заказа должно быть по умолчанию равным 0, поэтому после считывания товаров со склада выполните обнуление. Оформите это в виде подпроцесса т.к. обнуление необходимо выполнить для всех групп товаров. Используйте подпроцесс для добавления группы заказанных товаров во | Поле "Количество" на форме выбора товаров для заказа должно быть по умолчанию равным 0, поэтому после считывания товаров со склада выполните обнуление. Оформите это в виде подпроцесса т.к. обнуление необходимо выполнить для всех групп товаров. Используйте подпроцесс для добавления группы заказанных товаров во внутреннее хранилище. | ||
Строка 1813: | Строка 1813: | ||
Обновление остатков товара выполняется в несколько шагов: | Обновление остатков товара выполняется в несколько шагов: | ||
* считывание текущего количества товара из | * считывание текущего количества товара из внутреннего хранилища ("Чтение") в переменную | ||
* вычитание количества заказанного товара из полученного текущего количества ("Модификация") | * вычитание количества заказанного товара из полученного текущего количества ("Модификация") | ||
* обновление остатка во | * обновление остатка во внутреннем хранилище ("Запись") | ||
Т.к. процесс обновления состоит из трёх операций - "чтение", "модификация", "запись", то необходимо гарантировать чтобы во время выполнения этих действий, не было изменено текущее количество обрабатываемого товара, пока не выполнится запись нового значения. | Т.к. процесс обновления состоит из трёх операций - "чтение", "модификация", "запись", то необходимо гарантировать чтобы во время выполнения этих действий, не было изменено текущее количество обрабатываемого товара, пока не выполнится запись нового значения. | ||
Это достигается с помощью выноса действий в отдельную композицию со свойством "Транзакционный=Да", что обеспечивает блокировку задач бота используемого внутри композиции (в нашем случае это бот работы с | Это достигается с помощью выноса действий в отдельную композицию со свойством "Транзакционный=Да", что обеспечивает блокировку задач бота используемого внутри композиции (в нашем случае это бот работы с внутренним хранилищем), пока все точки управления не выйдут из нее. | ||
Строка 1827: | Строка 1827: | ||
Для считывания текущего количества товара из | Для считывания текущего количества товара из внутреннего хранилища используется задача бота с обработчиком "внутреннее хранилище данных", действие - SELECT. | ||
'''Замечание'''. В качестве результата всегда возвращает список, даже если был получен только один элемент. | '''Замечание'''. В качестве результата всегда возвращает список, даже если был получен только один элемент. | ||
Строка 1888: | Строка 1888: | ||
Для правильной работы внутреннего подпроцесса-транзакции, на сервере должны быть выполнены следующие действия: | Для правильной работы внутреннего подпроцесса-транзакции, на сервере должны быть выполнены следующие действия: | ||
* для бота "Бот работы с | * для бота "Бот работы с внутренним хранилищем" должно быть установлено свойство "Транзакционный" | ||
<center>[[Image:tov_bot_tr.png]]</center> | <center>[[Image:tov_bot_tr.png]]</center> | ||
Строка 1894: | Строка 1894: | ||
<center>Рисунок 2.129 Установка свойства "Транзакционный"</center> | <center>Рисунок 2.129 Установка свойства "Транзакционный"</center> | ||
* "Бот работы с | * "Бот работы с внутренним хранилищем" должен обладать полномочиями "Читать", "Конфигурировать бот станцию" | ||
<center>[[Image:tov_botstation_perm.png]]</center> | <center>[[Image:tov_botstation_perm.png]]</center> | ||
Строка 1901: | Строка 1901: | ||
* "Бот работы с | * "Бот работы с внутренним хранилищем" должен обладать полномочиями "Читать" и "Читать экземпляры" БП "Заказ канцтоваров", а также БП "Обновить остатки на складе" | ||
<center>[[Image:tov_def_perm.png]]</center> | <center>[[Image:tov_def_perm.png]]</center> | ||
Строка 1909: | Строка 1909: | ||
== Требования к представлению результатов занятия == | == Требования к представлению результатов занятия == | ||
В результате выполнения лабораторной работы должны быть представлены преподавателю отчет, | В результате выполнения лабораторной работы должны быть представлены преподавателю отчет, внутреннее хранилище в виде Excel-листов, файл с данными archive.datafile ([[ExportDataFile#Description |как получить файл данных]]), содержащий разработанные на занятии бизнес-процессы и бот для работ с внутренним хранилищем. | ||
В отчете должны содержаться следующие выходные данные: | В отчете должны содержаться следующие выходные данные: | ||
Строка 1920: | Строка 1920: | ||
== Контрольные вопросы == | == Контрольные вопросы == | ||
# Какие действия с | # Какие действия с внутренним хранилищем можно выполнять с помощью обработчика "внутреннее хранилище данных" ? | ||
# Почему работа с | # Почему работа с внутренним хранилищем данных построена с помощью задач бота, а не задач сценариев? Объясните назначение опции бота - "Последовательное выполнение". | ||
# Что такое внутренний подпроцесс-транзакция, в каком случае он используется? | # Что такое внутренний подпроцесс-транзакция, в каком случае он используется? | ||
Версия 22:00, 8 ноября 2021
RunaWFE. Практикум. внутреннее хранилище данных.
Версия 4.6.0
© 2015-2023, ООО "Процессные технологии"
Введение
Практическое занятие "Разработка бизнес-процесса "Заказ автотранспорта"
Цель занятия
Целью занятия является изучение работы с внутренним хранилищем данных, представленным в виде Excel таблиц.
Теоретические сведения
Теоретические сведения по работе ботов изложены в первой части лабораторного практикума в пункте "Концепция ботов и бот-станций" раздела "Стандарты и концепции, связанные с СУБПиАР".
"внутреннее хранилище данных" - аналог таблиц базы данных, представленных в виде Excel-листов. Предназначено для централизованного хранения данных бизнес-процесса.
Для работы с внутренним хранилищем в RunaWFE используется одноименный обработчик "внутреннее хранилище данных", который обеспечивает возможность выполнения простых действий: добавления, чтения, удаления и обновления данных.
Подробности использования обработчика, его параметры и возможные действия над внутренним хранилищем будут рассмотрены на практическом занятии при разработке бизнес-процесса "Заказ автотранспорта"
Порядок выполнения работы
В данной работе рассматривается разработка упрощенного варианта бизнес-процесса заказа автотранспорта для организации располагающей собственным автопарком.
Описание бизнес-процесса.
Заказчиком автотранспорта может выступить любой сотрудник организации, который подает заявку с описанием необходимого авто, времени подачи машины и количества мест. Руководитель одобряет заявку или отказывает. После принятия заявки канцелярией, она сохраняется во внутреннем хранилище для дальнейшей обработки диспетчером автопарка.
Диспетчер автопарка получает из внутреннего хранилища все необработанные заявки и выполняет отбор тех, которые будут удовлетворены. Заявки отображаются в виде таблицы с информацией от кого поступила заявка и с возможностью сортировки по полям. Благодаря этому диспетчер может в первую очередь удовлетворить более приоритетные заявки.
После удовлетворения, заявка переносится в архив, заказчик получает задачу "Ознакомиться с запланированной заявкой", а "Гараж" должен отчитаться о выполненном рейсе.
Разработка бизнес-процесса.
- Запустите RunaWFE симулятор, для этого дважды кликните по ярлыку «Start Simulation» на рабочем столе, или выполните команду меню Пуск / Программы / RunaWFE / Start Simulation. (Подробнее см. "Практикум. Введение", Вводное занятие, Порядок выполнения работы, Пункт 1)
- Войдите в web-интерфейс системы RunaWFE под пользователем Administrator. (см. "Практикум. Введение", Вводное занятие, Порядок выполнения работы, Пункт 2, Рис. 5.2) Замечание. По умолчанию пароль пользователя Administrator - "wf".
- Создайте следующих пользователей: (см. "Практикум. Введение", Вводное занятие, Порядок выполнения работы, Пункты 10 - 11, Рис. 5.9 - 5.10) Замечание. Если данные пользователи уже существуют в системе т.е. были созданы в предыдущих работах, то данный пункт можно пропустить
- Жуков Иван Ильич
- Андреев Николай Викторович
- Паучков Петр Петрович
- Иванов Иван Иванович
- Гусеницын Михаил Васильевич
- Личинкин Василий Федорович
- Сергеев Николай Иванович
- Сверчков Иван Иванович
- Создайте группы (см. "Практикум. Введение", Вводное занятие, Порядок выполнения работы, Пункты 4 - 6, Рис. 5.4 - 5.6)
- Гараж
- Канцелярия
- Диспетчеры
- Сотрудники
- Добавьте пользователей в группы группа "Гараж":
- Иванов Иван Иванович
- Гусеницын Михаил Васильевич
- Личинкин Василий Федорович
- Сергеев Николай Иванович
- Жуков Иван Ильич
- Андреев Николай Викторович
- Паучков Петр Петрович
- Иванов Иван Иванович
- Гусеницын Михаил Васильевич
- Личинкин Василий Федорович
- Сергеев Николай Иванович
- Сверчков Иван Иванович
- Дайте полномочия группе "Сотрудники" на вход в систему (см. "Практикум. Введение", Вводное занятие, пункты 7-9, Рис. 5.6 - 5.8 )
- Перейдите к пункту меню "Отношения" по ссылке «Отношения» в левой части экрана (см. раздел "Стандарты и концепции, связанные с СУБПиАР", пункт "Использование бинарных отношений для упрощения инициализации ролей")
- Кликните по ссылке "Создать отношение"
- В появившейся форме введите имя отношения ("Руководитель организации") и необязательное описание. После этого кликните на "Создать"
- Кликните на имени появившейся записи
- В появившейся форме кликните на "Создать пару". В левой части пары выберите пользователя "Сверчков", в правой части пары выберите группу "Сотрудники". Это будет означать, что пользователь Сверчков является руководителем для всех пользователей входящих в группу Сотрудники.
- Откройте среду разработки
- Создайте новый проект "Занятие 11" Для реализации задачи заказа автотранспорта, потребуется разработать два бизнес-процесса.
- "Заявка" - процесс, предназначенный непосредственно для подачи заявки на авто
- "Планирование" - процесс, с помощью которого диспетчер будет обрабатывать поданные заявки
- Создайте новый процесс "Заявка"
- Добавьте элементы на схему бизнес-процесса в соответствии с рисунком 2.5
- Создайте роли (См. "Практикум. Введение", Вводное занятие, Порядок выполнения работы, Пункт 21, Рис 5.20) В разрабатываемом процессе используются следующие Роли:
- Заказчик
- Канцелярия
- Гараж
- Руководитель
- бот
- Инициализируйте роли Роль "Заказчик" будет инициализирована пользователем, запустившим процесс, не требует инициализатора. Роли "Канцелярия" и "Гараж" должны быть проинициализирована группами "Канцелярия" и "Гараж" соответственно. Выделите созданную роль, нажмите "Изменить", перейдите на вкладку "Группы и пользователи WF". Здесь необходимо выполнить синхронизацию с сервером, после чего "Выбрать" из списка нужную группу (см. Рис. 2.6). Для проверки и ввода параметров соединения с сервером воспользуйтесь ссылкой "Настройки соединения" (см. Практическое занятие "Изучение перспективы ресурсов", Пункт 26, Рис. 3.16-3.18)
- Свяжите роли с узлами на графе Роль «Заказчик» с узлами "Начало", "Ознакомиться с отказом" и "Ознакомиться с запланированной заявкой" (Подробнее см. "Практикум. Введение", Вводное занятие, Порядок выполнения работы, Пункт 22). Остальные роли свяжите с узлами в соответствии с рисунком 2.5
- Создайте новый тип данных Заявка будет состоять из следующего набора данных:
- "id" - идентификатор заявки (Строка)
- "ФИО заказчика" (Строка)
- "Тип авто" (Строка)
- "Количество мест" (Целое число)
- "С" - Дата/время подачи авто (Дата/Время)
- "По" - Дата/время окончания рейса (Дата/Время)
- "Статус" (Строка)
- Создайте переменные
- "Заявка" - переменная пользовательского типа "Заявка"
- "Заявки" - переменная формата Список(Заявка)
- "Комментарий заказчика" - переменная формата "Текст"
- "Комментарий руководителя" - переменная формата "Текст"
- "Комментарий канцелярии" - переменная формата "Текст"
- Создайте графические формы Замечание. По умолчанию в качестве редактора форм используется CKEditor4, но в случае если у вас в системе установлен браузер Microsoft Internet Explorer устаревшей версии - 6 (IE6) или 7 (IE7), то с формами могут возникнуть проблемы. Поэтому следует переключить редактор на FCKEditor2 (как переключить редактор см. в Практическое занятие "Изучение перспективы данных", Порядок выполнения работы, Пункт 6, Рис. 4.9, 4.10) Стартовая форма На данной форме заказчик вводит данные заявки Выделите узел «Начало» графа процесса "Заявка" правой кнопкой мыши и выберите команду «Форма» > «Создать форму» (Подробнее см. Практическое занятие "Изучение перспективы данных", Порядок выполнения работы, Пункт 6, Замечание, Рис. 4.11-4.12). На данной форме заказчик вводит данные заявки на автотранспорт. Добавьте на форму текст "Введите данные заявки". Нажмите на иконку вставки в форму таблицы (см. рис. 2.14), используйте 2 столбца и 4 строки (см. рис. 2.15). Расположите таблицу под текстом "Введите данные заявки".
- Выберите класс обработчиков и задайте конфигурации Задача сценария "Получить ФИО заказчика" Необходима для получения ФИО заказчика. Выделите задачу сценария (см. рис. 2.27), введите в свойство "Название" - "Получить ФИО заказчика"
- Задайте задержку для Таймера В процессе "Заявка" используется таймер для установки периода считывания заявки из внутреннего хранилища. Кликните по таймеру правой клавишей мыши и выберите пункт "Задержка"
- Добавьте конфигурацию исключающего шлюза В цикле опроса заявки с проверкой на предмет изменения ее статуса используется исключающий шлюз. Вызовите конструктор. Для этого кликните правой клавишей мыши по элементу и выберите пункт "Конфигурация". Это же можно сделать и через свойства элемента.
- Создайте новый процесс "Планирование"
- Добавьте элементы на схему бизнес-процесса в соответствии с рисунком 2.38
- Создайте роли (См. "Практикум. Введение", Вводное занятие, Порядок выполнения работы, Пункт 21, Рис 5.20) В разрабатываемом процессе используются следующие Роли:
- Диспетчер
- бот
- Свяжите роли с узлами на графе в соответствии с рисунком 2.38 Подробнее см. "Практикум. Введение", Вводное занятие, Порядок выполнения работы, Пункт 22
- Создайте переменные Откройте процесс "Заявка", перейдите на вкладку "Переменные", выделите переменную "Заявка" и нажмите кнопку "Копировать" (см. Рис. 2.39)
- "Все заявки" - переменная формата Список(Заявка), будет содержать считанные из внутреннего хранилища необработанные заявки
- "Отобранные заявки" - переменная формата Список(Заявка), будет содержать отобранные диспетчером заявки
- "Количество заявок" - переменная формата "Целое число", хранит количество заявок
- "индекс заявки" - переменная формата "Целое число", используется для хранения индекса обрабатываемой заявки
- Создайте графические формы Замечание. По умолчанию в качестве редактора форм используется CKEditor4, но в случае если у вас в системе установлен браузер Microsoft Internet Explorer устаревшей версии - 6 (IE6) или 7 (IE7), то с формами могут возникнуть проблемы. Поэтому следует переключить редактор на FCKEditor2 (как переключить редактор см. в Практическое занятие "Изучение перспективы данных", Порядок выполнения работы, Пункт 6, Рис. 4.9, 4.10) Отобрать заявки На данной форме заказчик отбирает заявки которые будут запланированы. Выделите узел «Отобрать заявки» графа процесса "Планирование" правой кнопкой мыши и выберите команду «Форма» > «Создать форму» (Подробнее см. Практическое занятие "Изучение перспективы данных", Порядок выполнения работы, Пункт 6, Замечание, Рис. 4.11-4.12). Добавьте на форму текст "Выберите заявки для обработки:", под которым расположите компонент "Множественный выбор из списка пользовательских переменных" Для этого перейдите в панель "Компоненты форм", выделите компонент "Множественный выбор из списка пользовательских переменных" и с помощью мыши перетащите его на форму (Подробнее см. Практическое занятие "Изучение перспективы операций", Порядок выполнения работы, Пункт 14, Рис. 5.17, 5.18). Замечание. Альтернативным способом добавления на форму может быть двойной клик левой клавишей мыши по компоненту, после чего он будет добавлен в текущее положение курсора на форме. Замечание. Существует два компонента для множественного выбора. Один используется для списка простых переменных, другой для списка пользовательских переменных. В данном случае необходим множественный выбор из списка именно пользовательских переменных.
- "Входные данные" - это список из элементов которого выполняется отбор. В данном случае это все необработанные заявки - переменная "Все заявки"
- "Название переменной" - это список в который будут сохранены отобранные элементы списка, указанного в параметре "Входные данные"
- "Форма отображения" - используйте вариант отображения - "Двумерная таблица" (в версии RunaWFE 4.2.1 и ниже)
- "Поле используемое для сортировки" (параметр отсутствует в версии RunaWFE 4.3.0) - критерий для предварительной сортировки таблицы. Используйте сортировку по "ФИО заказчика"
- Выберите класс обработчиков и задайте конфигурации Задача сценария "Определить количество заявок" Необходима для определения количества необработанных заявок, считанных из внутреннего хранилища. Выделите задачу сценария (см. рис. 2.48), введите в свойство "Название" - "Определить количество заявок" Выберите в качестве класса обработчика - "Агрегатная функция над списком" (см. Рис. 2.48).
- Задайте задержку для Таймера В процессе "Планирование" используется таймер для установки периода считывания необработанных заявок из внутреннего хранилища. Кликните по таймеру правой клавишей мыши и выберите пункт "Задержка". Установите задержу равной 10 секунд от даты прихода управления в состояние.
- Добавьте конфигурацию для исключающих шлюзов Первый исключающий шлюз используется для проверки количества необработанных заявок, если их 0, то управление возвращается в задачу "Считать необработанные заявки", иначе идет по переходу "Отобрать заявки". Конфигурация шлюза представлена на рисунке 2.56
- Откройте среду разработки
- Перейдите на вкладку "Боты" среды разработки (если данная вкладка не отображается, ее можно включить в меню "Окно" > "Боты").
- ОБЯЗАТЕЛЬНО (!) удалите все ботстанции из среды разработки, иначе создание ботов и задач будет приводить к ошибкам и некорректной работе Для этого выделите ботстанцию, кликните правой клавишей мыши, и выберите пункт "удалить" контекстного меню.
- Импортируйте ботстанцию localbotstation с сервера WFE (Подробнее см. Практическое занятие "Работа с Word-ботом", Порядок выполнения работы, Пункт 18, Рис. 2.32-2.34) Если на сервере отсутствует ботстанция localbotstation, то создайте ее (подробнее см. "Практическое занятие "Изучение перспективы операций", Порядок выполнения работы, Пункт 10, Рис. 5.3, Рис. 5.4)
- Создайте в среде разработки нового бота "Бот работы с внутренним хранилищем"
- Создайте задачи бота работы с внутренним хранилищем Для создания новой задачи бота: выделите бот, кликните правой клавишей мыши и выберите "Новая задача бота". Введите название задачи и нажмите "Готово".
- [имяАтрибута] - это поле пользовательской переменной, заданной в параметре "Переменная" секции "Атрибут". Квадратные скобки у имени атрибута обязательны.
- оператор - поддерживаются операторы < , > , <= , >= , != , == , like
- значение - могут быть использованы как константное значение, например проверка статуса на равенство значению 'Не обработана', так и параметры используемые во входных параметрах задачи. Если используется параметр, то перед ним ставят символ @, например @id.
- "id" типа "Строка, Текст"
- "Заявка" типа "Пользовательский тип данных"
- Экспортируйте бота вместе с задачами на сервер WFE (Подробнее см. "Практическое занятие "Работа с Word-ботом", "Порядок выполнения работы", Пункт 20, рис. 2.54, 2.55)
- Откройте процесс "Заявка"
- Перейдите на вкладку "Роли"
- Инициализируйте роль "бот" Для этого выделите роль, нажмите "Изменить", в открывшемся окне выберите вкладку "Бот". В выпадающем списке "исполнитель по имени" должен быть доступен "Бот работы с внутренним хранилищем", выберите его.
- Повторите инициализацию роли бот и в процессе "Планирование"
- Выполните привязку задач ботов в процессе "Заявка" Кликните правой клавишей мыши на узле "Добавить заявку на обработку" и выберите пункт "Задача бота" > "Привязать". В списке задач выберите "Добавить заявку на обработку"
- Выполните привязку задач ботов в процессе "Планирование" Узел "Считать необработанные заявки" - задача бота "Считать необработанные заявки"
- Сохраните процессы и экспортируйте их на сервер WFE (Подробнее см. Практическое занятие "Изучение перспективы потока управления", Порядок выполнения работы, Пункты 11-14) Выполнение процессов: Замечание. Разработанные бизнес-процессы заказа автотранспорта могут выполняться некорректно в устаревших версиях браузера Internet Explorer (IE7 и ниже). Рекомендуется использовать актуальные версии современных браузеров.
- Откройте web интерфейс системы RunaWFE
- Войдите под пользователем Administrator, пароль – wf
- Дайте права на запуск процесса "Заявка" для группы "Сотрудники" Откройте "Запустить процесс", и перейдите в свойства определения бизнес-процесса "Заявка"
- Дайте права на запуск, чтение, чтение экземпляра, а также остановку процесса "Планирование" для группы "Диспетчеры"
- Перейдите в меню "Бот станции"
- Откройте ботстанцию localbotstation
- Откройте бот работы с внутренним хранилищем
- Установите опцию последовательного выполнения задач бота и нажмите применить
- Создайте в каталоге "C:\runa_tmp\" пустые Excel файлы "DB.xlsx" и "Archiv.xlsx", являющиеся файлами внутреннего хранилища
- Войдите в систему под пользователем Сергеев, входящим в группу "Диспетчеры"
- Запустите процесс "Планирование"
- Перейдите в "Запущенные процессы" и откройте только что запущенный экземпляр процесса "Планирование" Замечание. По умолчанию запущенные процессы отсортированы по возрастанию номера экземпляра, что неудобно при необходимости просмотреть "недавно" запущенный экземпляр. Измените тип сортировки - по убыванию номера экземпляра процесса. Подробнее о том как это сделать см. Практическое занятие "Работа с Word-ботом", Порядок выполнения работы, Пункт 23, рис. 2.65 - 2.68
- Войдите в систему под пользователем входящим в группу "Сотрудники", например Жуков
- Запустите новый экземпляр процесса "Заявка"
- Введите данные заявки заказа автотранспорта и нажмите "Запустить"
- Подайте еще пару заявок, например под пользователями Андреев и Паучков
- Войдите под пользователем Сверчков, являющимся руководителем организации
- Откройте каждое из заданий, и одобрите заявки
- Войдите под пользователем Гусеницын, входящим в группу "Канцелярия"
- Примите все заявки
- Войдите на сервер WFE под пользователем Administrator (пароль wf)
- Откройте один из экземпляров процесса "Заявка"
- Откройте файл внутреннего хранилища данных - C:\runa_tmp\DB.xlsx
- Закройте файл внутреннего хранилища данных
- Войдите под диспетчером "Сергеев"
- Откройте задание "Отобрать заявки"
- Отберите обе заявки Для этого поставьте галочку напротив каждой из заявок и выполните задание.
- Откройте полученное задание "Запланировать заявки" Замечание. Убедитесь, что перед выполнением данного задания, файл DB.xlsx не открыт для просмотра, иначе бот не сможет вносить изменения во внутреннее хранилище. Нажмите "Запланировать заявки"
- Откройте выполняемый экземпляр процесса "Планирование" Убедитесь, что бот выполнил задачу "Обновить статус".
- Войдите под пользователем "Administrator"
- Откройте те экземпляры процесса "Заявка", заявки которых были отобраны и запланированы Проверьте, что управление вышло из цикла опроса статуса заявки и бот успешно выполнил задачи переноса заявки в архив.
- Откройте основное и внутреннее хранилище данных (файлы C:\runa_tmp\DB.xlsx и C:\runa_tmp\Archiv.xlsx) Убедитесь, что все запланированные заявки были перенесены из основного хранилища в архив.
- Выполните активные задачи заказчиков и гаража: "Ознакомиться с запланированной заявкой", "Отчитаться о рейсе"
- Войдите под диспетчером "Сергеев" и выполните задачу "Обрабатывать еще заявки?", выбрав "Да"
- Запланируйте оставшиеся заявки (если таковые имеются) Замечание. Убедитесь, что перед выполнением данного задания, файлы DB.xlsx и Archiv.xlsx не открыты для просмотра, иначе бот не сможет вносить в них изменения.
В бизнес-процессе используется следующие элементы: Начало, Действие, Задача сценария, Таймер, Исключающий шлюз, Параллельный шлюз, Окончание.
Для элемента "Задача сценария" используйте опцию компактный вид (см. пункт 1 раздела "Практическое занятие "Работа с Word-ботом". Порядок выполнения работы.",Замечание. рис. 2.2)
Для изменения названий по умолчанию, выделите элемент, кликнув по нему, перейдите в свойства и введите новое значение в поле "Название".
Инициализируйте роль "Руководитель" отношением "Руководитель организации", примененным к роли "Заказчик":
Для этого выделите "Руководитель" в списке ролей на вкладке "Роли" и кликните "Изменить"
В появившейся форме перейдите на вкладку "Задать роль с помощью отношения". Нажмите на "Синхронизация", затем "Выбрать" (См. Рис 2.7)
В списке будут отображаться импортированные с сервера отношения, выберите "Руководитель организации" и нажмите "ОК" (См. Рис. 2.8)
Откройте список для поля "Параметр отношения" и выберите роль "Заказчик" (См. Рис. 2.9). Нажмите "ОК"
Замечание. Инициализация для роли "бот" будет описана в последующих пунктах разработки.
Далее добавьте Атрибуты, соответствующие перечисленному выше набору данных. Для этого используйте кнопку "Создать", расположенную в области "Атрибуты".
В появившемся окне введите название атрибута и нажмите "OK". Форма создания атрибута не отличается от формы создания переменной.
Создайте все атрибуты заявки:
Для создания переменной перейдите на вкладку "Переменные" и нажмите "Создать". В появившейся форме введите название переменной, нажмите "Далее" и выберите ее формат (Подробнее см. "Практикум.Перспективы исполнимых бизнес-процессов", Практическое занятие "Изучение перспективы данных", Порядок выполнения работы, Пункт 5).
Заполните колонки таблицы как показано на рисунке 2.16. Во втором столбце используйте компонент формы "Ввод переменной". Для этого перейдите на вкладку "Компоненты форм", выделите необходимый компонент, в данном случае это "Ввод переменной" и с помощью мыши перетащите его на форму (Подробнее см. Практическое занятие "Изучение перспективы операций", Порядок выполнения работы, Пункт 14, Рис. 5.17, 5.18).
Замечание. Альтернативным способом добавления на форму может быть двойной клик левой клавишей мыши по компоненту, после чего он будет добавлен в текущее положение курсора на форме.
Для вызова свойств добавленного на форму компонента используйте двойной клик левой клавишей мыши или пункт "Параметры компонента" контекстного меню (вызывается правой клавишей мыши).
В качестве параметра "Название переменной" задайте соответствующие поля переменной пользовательского формата "Заявка" (см. рис. 2.17)
Расположите под таблицей компонент для ввода переменной "Комментарий заказчика"
Сохраните и закройте форму.
Задайте валидацию для переменных стартовой формы
Для этого кликните на стартовой форме правой клавишей мыши и выберите пункт "Форма > Проверка переменных формы", в появившейся форме выделяйте переменные и устанавливайте необходимые валидаторы. (Подробнее см. Практическое занятие "Изучение перспективы операций", Пункт 15, рис. 5.27, 5.28).
Для "Заявка.Тип авто" добавьте валидатор "Обязательное поле". В поле "Сообщение об ошибке" введите - "Обязательное поле".
Для "Заявка.Количество мест" добавьте валидатор "Обязательное поле", а также "Диапазон числа" установив минимальное значение в "1" включительно (см. Рис. 2.19), при этом в поле "Сообщение об ошибке" введите - "Должно быть задано минимум одно место"
Для "Заявка.С" добавьте валидатор "Обязательное поле", а также "Диапазон даты относительно текущей" установив параметр "Сдвиг в прошлое" в значение "0" (см. Рис. 2.20), при этом в поле "Сообщение об ошибке" введите - "Дата подачи авто не может быть в прошлом"
Для "Заявка.По" используйте такие же валидаторы как и для "Заявка.С"
Кроме того, необходимо добавить глобальный валидатор для проверки условия "Дата/время окончания рейса должны быть позже даты/времени подачи авто".
Для этого нажмите "Далее" в окне проверок переменных, затем "Добавить". В поле сообщение об ошибке введите "Дата/время окончания рейса должны быть позже даты/времени подачи авто", а в конфигураторе задайте
Заявка.По позже Заявка.С
Форма узла "Одобрить заявку"
Создайте форму для узла "Одобрить заявку"
Здесь руководитель просматривает заявку и вводит комментарий.
Используйте компонент "Отобразить переменную" для вывода значений переменных "Заявка" и "Комментарий заказчика". В качестве вида отображения используйте "Как неактивный компонент ввода"
Создайте аналогичным образом остальные формы.
Выберите в качестве класса обработчика - "Получить информацию об исполнителе" (см. Рис. 2.28).
Вызовите конфигуратор обработчика. Для этого нажмите на выбор конфигурации в свойствах задачи сценария. И введите параметры как показано на рисунке 2.29
Задача сценария "Сформировать id заявки"
Задача предназначена для формирования id подаваемой заявки. Данный идентификатор является уникальным и фактически равен id запущенного экземпляра процесса "Заявка". Кроме того, в данной задаче инициализируется статус заявки ("Не обработана").
Выберите в качестве класса обработчика - "Выполнить формулу" (см. Рис. 2.30).
Задайте конфигурацию:
Заявка.id=get_process_id() Заявка.Статус="Не обработана"
Задача сценария "Получить заявку из списка"
После подачи заявка записывается во внутреннее хранилище данных (Excel файл) со статусом "Не обработана", далее выполняется периодическое ее считывание из внутреннего хранилища для проверки статуса, зная ее id. При этом результат считывания из внутреннего хранилища всегда является списком (даже если считывается одна конкретная заявка по ее id). Поэтому дополнительно используется специальный обработчик для получения элемента списка, в данном случае заявки из списка заявок.
Выделите задачу сценария как показано на рисунке 2.32 и перейдите в ее свойство. Здесь выберите в качестве класса обработчика - "Получить элемент списка". Задайте конфигурацию как показано на рисунке 2.33.
Подробная работа с внутренним хранилищем будет описана в последующих пунктах.
Настройте задержку Таймера в соответствии с рисунком 2.35
Задайте путь по умолчанию "Считать заявку", а условием выхода из цикла по переходу "заявка обработана" будет изменение статуса заявки.
"Заявка.Статус" не равно "Не обработана"
Остальные задачи бизнес-процесса "Заявка" будут описаны в последующих пунктах данной части практикума.
Бизнес-процесс "Планирование"
Данный процесс запускает диспетчер. Выполняется считывание из внутреннего хранилища всех заявок со статусом "Не обработана". Если такие есть, то они отображаются для диспетчера в виде таблицы с возможностью выбора тех, которые он желает запланировать. Информация по запланированным заявкам обновляется во внутреннем хранилище. Далее цикл считывания необработанных заявок повторяется.
Здесь используется тот же набор элементов что и для процесса "Заявка".
Вернитесь в разрабатываемый процесс "Планирование", перейдите на вкладку "Переменные" и нажмите "Вставить" (см. Рис. 2.40)
Замечание. Вместе с переменной будет скопирован и пользовательский тип "Заявка"
Создайте остальные переменные:
Для вызова свойств добавленного на форму компонента используйте двойной клик левой клавишей мыши или пункт "Параметры компонента" контекстного меню (вызывается правой клавишей мыши).
Заполните параметры компонента как показано на рисунке 2.43
Замечание. Набор параметров компонента может отличаться в зависимости от используемой версии RunaWFE.
Описание параметров:
Замечание. В версии RunaWFE 4.3.0 данный параметр поменял свое назначение, теперь это не форма таблицы (используется классическая двумерная таблица), а вид отображения значений. Предлагается выбрать между "Как неактивный компонент ввода" и "Как строка".
Замечание. В новой версии компонента (RunaWFE 4.3.0) появилась возможность выбора полей для отображения в таблице и их позицию. Нажмите кнопку "..." в строке "Атрибуты" (см. рисунок 2.43б). В появившемся окне выделите все поля кроме "id" (диспетчеру не обязательно знать id заявки, поэтому выводить значение этого поля не обязательно), нажмите "Добавить".
В веб интерфейсе компонент будет представлен в виде двумерной таблицы с отображением списка заявок. Диспетчер отбирает заявки проставляя галочки напротив соответствующей строки таблицы.
Запланировать заявки
Создайте форму для узла "Запланировать заявки".
Расположите на форме компонент "Отобразить список пользовательских переменных". Используйте для этого двойной клик по компоненту из палитры.
Двойным кликом мыши или с помощью контекстного меню перейдите в параметры компонента и заполните их как показано на рисунке 2.45. Используйте вариант "а" в случае версии RunaWFE 4.2.1 и ниже, или вариант "б" в случае версии RunaWFE 4.3.0
В web интерфейсе данный компонент будет представлен в виде двумерной таблицы, содержащей отобранные диспетчером заявки.
Обрабатывать еще заявки?
В данном задании диспетчер выбирает продолжать обрабатывать заявки или завершить процесс.
В web интерфейсе форма будет представлена в виде отображаемого текста "Обрабатывать еще заявки?", под которым автоматически будут добавлены кнопки выбора "Да"/"Нет", соответствующие переходам на графе для возврата на чтение очередных необработанных заявок или завершения процесса.
Вызовите конфигуратор обработчика. Для этого нажмите на выбор конфигурации в свойствах задачи сценария. И введите параметры как показано на рисунке 2.49
Для определения количества элементов в списке используется функция "COUNT".
Задача сценария "Определить количество отобранных заявок"
Аналогичным образом выберите класс обработчика и добавьте конфигурацию для задачи сценария "Определить количество отобранных заявок". Но в данном случае определяется количество элементов в списке "Отобранные заявки"
После отбора заявок, управление переходит в цикл предназначенный для поочередного прохода по всем отобранным заявкам для изменения их статуса с "Не обработана" на "Запланирована". В данном цикле используется несколько задач сценариев. Обход заявок выполняется в обратном порядке т.е. от последней отобранной заявки к первой.
Задача "Инициализация индекса заявки"
Используется перед началом цикла, устанавливает индекс на последний элемент списка (обход заявок в обратном порядке). Выберите "Выполнить формулу" в качестве класса обработчика. Задайте конфигурацию:
'индекс заявки'='Количество заявок';
Используйте переменные "индекс заявки" и "Количество заявок"
Задача "Получить заявку из списка отобранных"
Используется для получения заявки по индексу из списка отобранных заявок.
Класс обработчика - "Получить элемент списка".
Задача сценария "Изменить статус заявки"
Предназначена для изменения статуса отобранной заявки с "Не обработана" на "Запланирована".
Класс обработчика "Выполнить формулу", конфигурация:
Заявка.Статус="Запланирована"
Задача сценария "Индекс следующей заявки"
В цикле используется обход заявок в обратном порядке, поэтому в данной задаче сценария выполняется уменьшение индекса на 1.
Класс обработчика "Выполнить формулу", конфигурация:
'индекс заявки'='индекс заявки'-1;
Второй исключающий шлюз используется для проверки количества отобранных диспетчером заявок, если диспетчер не отобрал ни одной заявки, то управление переходит в задачу "Обрабатывать еще заявки", иначе идет по переходу "Отобраны".
Конфигурация шлюза представлена на рисунке 2.57
Третий исключающий шлюз используется в цикле обновления статуса запланированных заявок.
Если индекс обрабатываемой заявки достиг нуля, то статус всех отобранных заявок обновлен и цикл завершается, управление идет по переходу "все заявки обновлены".
Конфигурация шлюза представлена на рисунке 2.58
Остальные задачи бизнес-процесса "Планирование" будут описаны в последующих пунктах данной части практикума.
внутреннее хранилище данных. Бот работы с внутренним хранилищем.
В качестве внутреннего хранилища данных о заявках используются Excel-листы. Строки на Excel листе соответствуют заявкам, а столбцы атрибутам заявки (id, Тип авто, Статус и т.д.).
Например, на рисунке 2.59 представлен Excel лист с данными по четырем заявкам.
Для работы с данным хранилищем используется специальный обработчик "внутреннее хранилище данных" (ru.runa.wfe.office.storage.handler.ExternalStorageHandler), позволяющий выполнять простейшие действия с данными:
Действие INSERT
Предназначено для добавления данных во внутреннее хранилище. Вставка выполняется в следующую свободную строку. В качестве входных данных используется переменная пользовательского типа или список из таких переменных. Например, в разрабатываемом процессе, данное действие будет использовано для вставки во внутреннее хранилище поданной заявки.
Действие SELECT
Предназначено для чтения данных из внутреннего хранилища, может быть использована с условием. Например, для выборки заявок с определенным статусом.
Замечание. В качестве результата всегда возвращает список, даже если был получен только один элемент. Именно поэтому в процессе "Заявка", после чтения заявки по ее id, дополнительно используется обработчик "Получить элемент списка".
Действие UPDATE
Предназначено для обновления переменной пользовательского типа во внутреннем хранилище. Обязательно использование условия для определения переменной, которую требуется обновить (иначе будут обновлены все переменные во внутреннем хранилище).
Например, в разрабатываемом процессе используется для обновления заявки после изменения ее статуса с "Не обработана" на "Запланирована", зная ее id.
Действие DELETE
Предназначено для удаления переменной пользовательского типа из внутреннего хранилища. Используется с условием, иначе будут удалены все переменные из внутреннего хранилища. В качестве входного параметра в обязательном порядке должна принимать переменную пользовательского типа, для использования ее в параметре "Переменная". Это необходимо для того, чтобы обработчик знал, какие поля размещены во внутреннем хранилище.
Например, в разрабатываемом процессе используется для удаления заявки из основного внутреннего хранилища после ее переноса в архивное внутреннее хранилище.
Рекомендации для корректной работы с "внутренним хранилищем данных":
1). Один Excel-лист должен соответствовать одной таблице.
2). Обработчик, реализующий коннектор к Excel-файлу, необходимо использовать только в задаче бота. Это нужно для того, чтобы исключить одновременный доступ к хранилищу из разных экземпляров процессов, в результате чего могут быть потеряны данные. При этом бот-станция должна быть настроена на последовательное выполнение заданий бота в рамках одного потока, работающего с внутренним хранилищем. Таким образом может быть получен простейший аналог транзакций системы управления БД.
3). Excel файл должен быть предварительно создан. Если в файле предполагается хранить более одной таблицы (расположенных на разных листах), то необходимо предварительно создать эти листы.
4). Таблица всегда должна располагаться начиная с 1-го столбца, поэтому в конфигурации обработчика "внутреннее хранилище данных" параметр "Столбец" всегда должен быть равным "1".
5). В момент выполнения обработчика, использующего одно из действий INSERT, DELETE, UPDATE, файлы внутреннего хранилища данных не должны быть открыты, иначе действие не будет выполнено.
6). Атрибуты пользовательского типа данных не должны содержать пробелы т.к. в случае использования такого поля в условии конфигурации обработчика внутреннего хранилища, действие будет выполнено некорректно. Например, "Заказ.Количество мест" не будет работать в условии конфигурации обработчика внутреннего хранилища, используйте "Заказ.Количество"
7). Во избежание проблем с форматом запрещается самостоятельно добавлять данные во внутреннее хранилище. Если есть необходимость использовать заранее заполненное хранилище, создайте для этого отдельный процесс с задачей бота, использующей обработчик "внутреннее хранилище данных" с соответствующим действием (insert).
Далее выберите класс обработчика "внутреннее хранилище данных"
Задача "Добавить заявку на обработку"
Данная задача бота предназначена для добавления заявки во внутреннее хранилище.
Создайте новую задачу бота с названием "Добавить заявку на обработку". Выберите в качестве обработчика "внутреннее хранилище данных".
Добавьте входной параметр с названием "Заявка" типа "Пользовательский тип данных". Для этого нажмите кнопку "Добавить" в секции входных параметров, введите название параметра и выберите его тип.
Перейдите в секцию конфигурации задачи. Нажмите "Изменить"
Будет открыт конструктор конфигурации задачи.
Выберите из списка действий - INSERT.
Параметр "Входной файл" определяет Excel файл, выступающий в качестве внутреннего хранилища. Задайте его как путь к файлу - C:\runa_tmp\DB.xlsx
Нажмите "Добавить атрибут", в поле "Переменная" выберите входной параметр "Заявка".
Таблица с заявками будет располагаться на первой листе Excel, поэтому параметр "Страница по номеру" должен быть равен "1"
Параметр "Столбец" оставьте по умолчанию равными "1".
Замечание. Таблица всегда должна располагаться начиная с 1-го столбца, поэтому параметр "Столбец" всегда должен быть равным "1".
Таким образом, переменная связанная со входным параметром "Заявка" с помощью действия INSERT будет добавлена во внутреннее хранилище, представленное файлом C:\runa_tmp\DB.xlsx.
Сохраните и закройте задачу бота.
Задача "Считать заявку"
Данная задача бота предназначена для считывания заявки из внутреннего хранилища по ее id (уникальному идентификатору).
Создайте новую задачу бота с названием "Считать заявку". Выберите в качестве обработчика "внутреннее хранилище данных".
Добавьте входной параметр с названием "id" типа "Строка, Текст".
Добавьте выходной параметр с названием "Заявки" типа "Список".
Для этого нажмите кнопку "Добавить" в соответствующей секции параметров (входных и выходных), введите название параметра и выберите его тип.
Замечание. Действие SELECT в качестве результата всегда возвращает список, даже если предполагается получить только один экземпляр пользовательской переменной (например заявку по ее уникальному идентификатору), поэтому тип выходного параметра должен быть "Список".
Перейдите в секцию конфигурации и нажмите "Изменить". Будет вызван конструктор конфигурации.
Выберите выполняемое действие - SELECT.
Укажите входной файл - C:\runa_tmp\DB.xlsx
Добавьте атрибут - выходной параметр список "Заявки"
"Страница по номеру" - "1"
"Столбец" - "1"
Замечание. Таблица всегда должна располагаться начиная с 1-го столбца, поэтому параметр "Столбец" всегда должен быть равным "1".
Под параметром "Выполняемое действие" расположено текстовое поле, предназначенное для ввода условия. Если его не задать, то SELECT выберет из внутреннего хранилища все заявки.
Синтаксис условий следующий:
[имяАтрибута] оператор значение
Замечание. Использование пробелов в [имениАтрибута], например [Количество мест] недопустимо, условие будет работать некорректно. Поэтому рекомендуется давать названия атрибутам пользовательского типа без пробелов, дабы их можно было использовать в условии конфигурации обработчика.
Кроме того, поддерживаются составные условия с применением скобок и логических операторов AND, OR.
Например, выполнить SELECT для заявок со статусом 'Не обработана', у которых 'Количество мест' больше или равно 10
[Статус] == 'Не обработана' AND [Количество мест] >= 10
Замечание. Важно соблюдать данный формат, включая наличие одинарных пробелов между операторами и атрибутами, значениями. Иначе условие не выполнится.
В данной задаче требуется получить из хранилища заявку по ее уникальному идентификатору, поэтому используйте следующее условие:
[id] == @id
где [id] - это атрибут пользовательского типа "Заявка", @id - это входной параметр задачи (был добавлен в секции "Входные параметры" задачи)
Задача "Добавить заявку в архив"
Задача выполняет добавление заявки в архивное внутреннее хранилище.
Процесс создания данной задачи аналогичен созданию задачи "Добавить заявку на обработку". Отличие только в использовании другого Excel файла.
Пусть архивное внутреннее хранилище будет в файле C:\runa_tmp\Archiv.xlsx
Задача "Удалить заявку"
После добавления заявки в Архив, ее требуется удалить из основного хранилища.
Создайте новую задачу бота с названием "Удалить заявку". Выберите в качестве обработчика "внутреннее хранилище данных".
Добавьте входные параметры:
Создайте конфигурацию задачи. Используйте действие DELETE.
Задайте условие удаления заявки по идентификатору
[id] == @id
Добавьте атрибут. Используйте входной параметр "Заявка"
Задача "Считать необработанные заявки"
В процессе "Планирование" требуется считывать заявки со статусом "Не обработана".
Создайте новую задачу бота "Считать необработанные заявки". Используйте обработчик "внутреннее хранилище данных".
Добавьте выходной параметр "Заявки" типа "Список".
Добавьте конфигурацию задачи.
Используйте действие "SELECT". В качестве атрибута используйте выходной параметр "Заявки".
Условие считывания необработанных заявок:
[Статус] == 'Не обработана'
Задача "Обновить заявку"
В процессе "Планирование" требуется обновить заявки после изменения их статуса.
Создайте новую задачу бота "Обновить заявку". Используйте обработчик "внутреннее хранилище данных".
Добавьте входные параметры "id" типа "Строка, Текст", "Заявка" типа "Пользовательский тип данных"
Добавьте конфигурацию задачи.
Используйте действие "UPDATE". В качестве атрибута используйте входной параметр "Заявка".
Условие - обновить заявку зная ее идентификатор (передается во входном параметре задачи):
[id] == @id
Нажмите ОК, будет открыта форма редактирования параметров задачи, выберите параметры в соответствии с рисунком 2.80
Аналогично выполните привязку для остальных задач:
Узел "Считать заявку по id" - задача бота "Считать заявку":
Узел "Добавить заявку в архив" - задача бота "Добавить заявку в архив"
Узел "Удалить заявку из основного хранилища" - задача бота "Удалить заявку"
Узел "Обновить заявку" - задача бота "Обновить заявку"
Нажмите на ссылку "Обладатели полномочий".
Дайте право на чтение и запуск процесса "Заявка" для группы "Сотрудники"
Включение опции гарантирует последовательное выполнение задач данного бота, благодаря чему будет исключена ситуация одновременного доступа к внутреннему хранилищу данных, которая может привести к потере данных.
Таким образом может быть получен простейший аналог транзакций системы управления БД.
Как видите, управление пришло в цикл считывания необработанных заявок и будет находиться здесь пока во внутреннее хранилище не добавят хотя бы одну заявку.
Все заявки поступят руководителю организации.
Каждой заявке присвоен уникальный идентификатор id (равный id соответствующего экземпляра процесса "Заявка") и статус "Не обработана".
Заявки будут направлены в канцелярию.
Как видно, бот выполнил задачу добавления заявки на обработку.
Управление пришло в цикл опроса статуса заявки.
Все три поданные заявки добавлены в хранилище.
Замечание. Периодичность проверки хранилища на предмет присутствия в нем необработанных заявок равна 10 секунд, первые 2 заявки были поданы как раз в течении этих 10 секунд, а 3-я позже. Именно поэтому, как видно из рисунка 2.100, диспетчеру отображаются только 2 заявки.
В основном хранилище должны остаться только те заявки, которые еще не запланированы диспетчером.
Если в основном хранилище к этому моменту еще остались заявки, то диспетчер получит соответствующие задания.
Задание для самостоятельной работы
Разработайте учебный вариант бизнес-процесса "Заказ канцтоваров" по следующему описанию.
Во внутреннем хранилище данных, представленном в виде Excel файла, на отдельном листе "Склад" хранится информация об имеющихся на складе канцтоварах, их количестве и принадлежности к группе. Весь товар разбит по группам:
- "Экономный сотрудник" - товары, которые нужны для работы практически всем (ручка, карандаш, бумага и т.п.)
- "Сотрудник" - товары, которые могут потребоваться сотруднику, но это происходит относительно редко (бокс для CD, булавки, калькулятор "Citizen" и т.п.)
- "Отдел" - товары, которые предназначены не одному сотруднику, а сразу отделу (зарядное устройство для аккумуляторов, аккумуляторы пальчиковые, батарейки пальчиковые и т.п.)
- "Фирменные материалы" - специальные товары, содержащие символику компании (блокнот А5 фирменный, конверт фирменный A4, конверт фирменный A5, пакет полиэтиленовый фирменный большой, портфель фирменный, ручка фирменная и т.п.)
Пользователь заказывает товар со склада, указывая нужное количество. Выбранные товары добавляются на лист "Заказанные товары" внутреннего хранилища. Работник склада получает список заказанных с помощью данного экземпляра процесса товаров, а также текущие остатки на складе.
По предоставленной информации работник склада решает - скомплектовать или отказать заказ.
В случае отказа:
- работник склада должен ввести комментарий, содержащий причину отказа
- товар должен быть удален из заказанных товаров
- сотрудник, который заказывал товар должен получить задание "Ознакомиться с отказом" с отображением причины отказа
В случае решения скомплектовать заказ:
- товары переносятся с листа "Заказанные товары" на лист "Архив скомплектованных заказов"
- на складе обновляются остатки по товарам, которые были скомплектованы
- работник склада получает задание "Выдать товар"
- сотрудник, который заказывал товар, получает задания "Ознакомиться - заказ скомплектован" и "Получить товар"
Замечание. Процесс является учебным вариантом, поэтому нет необходимости в проверке условия достаточности для заказа товара на складе. Однако расчет нового значения и обновление количества остатков должны выполняться в единой транзакции дабы обеспечить целостность данных и не потерять возможные изменения количества товара, выполненные в другом экземпляре БП при обновлении остатков.
Ниже представлены рекомендации по выполнению работы.
Каждая группа товаров должна отображаться пользователю на отдельной вкладке. Для добавления вкладок на форму используйте значок "Добавить вкладку", расположенный на панели инструментов редактора форм.
Каждое нажатие на данный значок приводит к добавлению новой вкладки на форму.
Для редактирования названия вкладки:
- кликните по вкладке
- перейдите на страницу "Код"
- измените необходимые названия
- вернитесь на страницу "Дизайн" и сохраните форму
Замечание. В случае версии RunaWFE 4.2.1 и ниже используйте компонент "Редактировать связанные списки", в случае RunaWFE 4.3.0 и выше - компонент "Редактирование списка пользовательских переменных". Выберите запрет на добавление и удаление элементов. Расположите компонент на каждой из вкладок соответствующей группы товаров. Отобразите остатки и заказанные товары на разных вкладках. Используйте компонент "Отобразить список пользовательских переменных".
Информация по заказанным товарам должна сохраняться во внутреннем хранилище на отдельном листе "Заказанные товары", и содержать следующие данные:
- id экземпляра процесса заказа канцтоваров
- название товара
- количество
Информация о принадлежности к группе товаров в "Заказанные товары" - отсутствует.
Заказанными товарами являются только те товары, у которых значение в поле "Количество" больше "0".
Замечание. Т.к. состав данных на листе "Склад" отличается от "Заказанные товары", то используйте два пользовательских типа "Товар" и "Заказанный товар" с соответствующим набором полей.
Замечание. внутреннее хранилище, представленное в виде excel файла, должно быть предварительно создано, в том числе и соответствующие листы. Кроме того, внимательно прочитайте рекомендации по использованию обработчика внутреннего хранилища, описанные между пунктами 34 и 35 практического занятия "Разработка бизнес-процесса "Заказ автотранспорта".
Обратите внимание(!) на пункт 7 - запрещается самостоятельно добавлять данные во внутреннее хранилище, в случае необходимости, используйте для этого задачу бота с обработчиком "внутреннее хранилище данных", действие - insert.
На следующем рисунке изображена одна из возможных схем процесса заказа канцтоваров.
Поле "Количество" на форме выбора товаров для заказа должно быть по умолчанию равным 0, поэтому после считывания товаров со склада выполните обнуление. Оформите это в виде подпроцесса т.к. обнуление необходимо выполнить для всех групп товаров. Используйте подпроцесс для добавления группы заказанных товаров во внутреннее хранилище.
Рассмотрим подробнее подпроцесс выполняющий обновление остатков товара на складе.
В качестве входных данных, в подпроцесс должен быть передан список скомплектованных для заказа товаров.
Используйте обработчик "Агрегатная функция над списком" - COUNT для определения количества заказанных товаров.
Далее организуйте цикл по товарам списка.
Заведите целочисленную переменную "индекс", определяющую индекс текущего обрабатываемого товара из списка заказанных товаров. Используйте для данной переменной значение по умолчанию "1".
В цикле выполняются следующие действия:
- с помощью обработчика "Получить элемент списка" по индексу выбирается очередной заказанный товар
- вызывается внутренний подпроцесс-транзакция, в котором выполняется обновление остатков на складе
- увеличивается индекс для выбора следующего товара
Условием выхода из цикла является обход всех заказанных товаров
Обновление остатков товара выполняется в несколько шагов:
- считывание текущего количества товара из внутреннего хранилища ("Чтение") в переменную
- вычитание количества заказанного товара из полученного текущего количества ("Модификация")
- обновление остатка во внутреннем хранилище ("Запись")
Т.к. процесс обновления состоит из трёх операций - "чтение", "модификация", "запись", то необходимо гарантировать чтобы во время выполнения этих действий, не было изменено текущее количество обрабатываемого товара, пока не выполнится запись нового значения.
Это достигается с помощью выноса действий в отдельную композицию со свойством "Транзакционный=Да", что обеспечивает блокировку задач бота используемого внутри композиции (в нашем случае это бот работы с внутренним хранилищем), пока все точки управления не выйдут из нее.
Для считывания текущего количества товара из внутреннего хранилища используется задача бота с обработчиком "внутреннее хранилище данных", действие - SELECT.
Замечание. В качестве результата всегда возвращает список, даже если был получен только один элемент.
С помощью агрегатной функции COUNT определяется количество элементов в полученном после выполнения SELECT списке
Если count больше 0, т.е. на складе есть товар с таким названием, то выполняется выборка товара из списка
Расчет нового значения поля "Количество" выполняется с помощью обработчика "Выполнить формулу"
Бот обновляет информацию по товару на складе
Для правильной работы внутреннего подпроцесса-транзакции, на сервере должны быть выполнены следующие действия:
- для бота "Бот работы с внутренним хранилищем" должно быть установлено свойство "Транзакционный"
- "Бот работы с внутренним хранилищем" должен обладать полномочиями "Читать", "Конфигурировать бот станцию"
- "Бот работы с внутренним хранилищем" должен обладать полномочиями "Читать" и "Читать экземпляры" БП "Заказ канцтоваров", а также БП "Обновить остатки на складе"
Требования к представлению результатов занятия
В результате выполнения лабораторной работы должны быть представлены преподавателю отчет, внутреннее хранилище в виде Excel-листов, файл с данными archive.datafile (как получить файл данных), содержащий разработанные на занятии бизнес-процессы и бот для работ с внутренним хранилищем.
В отчете должны содержаться следующие выходные данные:
1) Скриншоты основных действий, совершенных на занятии, с пояснениями
2) Скриншоты, содержащие маршруты точек управления для экземпляров бизнес-процессов, доведенных до завершения.
3) Описание возникших при выполнении задания проблем и найденных путей их решения (не обязательно, только если возникли проблемы при выполнении задания).
Контрольные вопросы
- Какие действия с внутренним хранилищем можно выполнять с помощью обработчика "внутреннее хранилище данных" ?
- Почему работа с внутренним хранилищем данных построена с помощью задач бота, а не задач сценариев? Объясните назначение опции бота - "Последовательное выполнение".
- Что такое внутренний подпроцесс-транзакция, в каком случае он используется?
Ссылки
- Документация Runa WFE [официальный сайт проекта]. URL: https://runawfe.ru/rus/Документация