Портфолио / система \"Sv-Workflow\" (г. Дзержинск)
Система автоматизированного управления бизнес-процессами предприятия класса Workflow "Sv-Workflow"
Система автоматизированного управления бизнес-процессами предприятия класса Workflow - программное обеспечение, упорядочивающее и управляющее задачами, ресурсами и правилами, необходимыми для выполнения бизнес-процесса.
Нами разработан один из вариантов АСУП класса Workflow на основе технологии Java 2 Enterprise Edition (J2EE).
Разработанная система представляет собой группу пользователей (ролей), между которыми реализован обмен сообщениями. Обмен сообщениями происходит через маршрутизатор, который рассылает сообщения между клиентами в соответствии с заданными условиями. Клиенты представляют собой отдельные роли Workflow и реализованы по технологии “тонкий клиент”. Основу маршрутизатора составляет служба сообщений Java Message Service (JMS). Сам маршрутизатор реализован в виде отдельного компонента Enterprise Java Bean (EJB), расположенного в контейнере сервера, который принимает запросы от клиентов и отвечает на них, взаимодействия с компонентом EJB. Полученные маршрутизатором JMS-сообщения от клиента или компонента сервера является событием Workflow-системы. Задача маршрутизатора состоит в приеме, документировании и расшифровке JMS-сообщения. Обработка управляющих сообщений происходит по программе, составляемой Workflow-программистом, посредством специально разработанной данной системы внутреннего макроязыка. В частном случае управляющие сообщения могут посылаться маршрутизатору пользователями. Временная последовательность выполнения заданий определяет последовательность операторов в программе на макроязыке. Программу можно исправлять и дополнять непосредственно во время работы системы на предприятии. Маршрутизатор возвращает клиентам карту Workflow-процесса, которая является графическим отражением управляющей программы, заданной маршрутизатору.
Наличие внутреннего макроязыка является одним из достоинств разработанной системы, поскольку большинство аналогичных систем не представляет гибких средств для внешнего программирования бизнес-процессов. В лучшем случае имеется программный API, не предоставляющий достаточного уровня абстракции, необходимого для ясного моделирования сложных бизнес-процессов.
Пример
Примеры возможных операторов макроязыка
В начале работы программируется структура отделов данного предприятия, т.е. определяется сколько и каких потенциальных ролей находиться в отделе, какие action-ы или их элементы закреплены за отделом и т.д. На этом этапе возможно не только моделирование структуры отделов, но предоставление сервисов по динамическому добавлению ролей, предоставлению справочной информации и др.
DEPARTMENT FIRST // объявляем первый отдел DEPARTMENT SECOND // объявляем второй отдел ROLE ENGINEER // вводим роль инженера ENGINEER PETROV, SIDOROV // создаём экземпляры ролей инженера FIRST.ADD (PETROV, SIDOROV) // добавляем экземпляры в первый отдел SECOND.ADD (PETROV) // экземпляры могут совмещать обязанности FIRST.INFO // предоставляем информацию по первому отделу
Написание программы динамики бизнес-процесса сводиться к обработке событий в системе Workflow. Событие происходит в момент получения JMS-сообщения.
При активизации action об этом извещаются все участники (роли) путем рассылки им уведомления о начале работы и сроках исполнения.
INIT_ACTION (ROLE1, ROLE2, ROLE3,...) // Извещаем роли о начале работы над action APPOINT (ROLE1, TASK345, DATE) // Назначить роли 1 задание номер 345 до срока DATE.
В случае если роль предоставила отчёт о выполнении своей части работы - происходит событие, сигнализирующее о том, что первая роль выполнила своё задание и можно начинать работать второй роли. Это реализуется посредством следующей конструкции:
IF (DONE (ROLE1)) THEN BEGIN (ROLE2) ELSE WARN (ROLE1)
Если роль 1 закончила задание разрешить начало работы роли 2, в противном случае роли 1 выносится предупреждение. Здесь обрабатывается событие успешного завершения работы первой роли, генерация данного события происходит после того как ROLE1 присылает JMS-сообщение с готовым проектом, подтверждая, что он закончил над ним работать.
Если же роль 1 так и не справилась с выполнением задания, происходит переназначение задания другой роли:
IF (NOTDONE (ROLE1)) THEN APPOINT (ROLE3)
Оператор NOTIFICATION
оповещения какой-либо роли об окончании задания другой ролью. Это событие вызывает не только отправление сообщения, но и запускает другие механизмы Workflow - отображение информации для других ролей, архивацию данных, которые прислала роль, выполнившая задание, и т.д.
NOTIFICATION (ROLE3, DONE (ROLE2))
Оповещаем роль 3, что роль 2 закончила задание.
В начале каждой Workflow-программы требуются стандартные действия, например, по определению структуру предприятия. Эти операторы можно объединить в подпрограмму и вызывать одной строкой.
CALL SETSTRUCTURE()
Пример программы на макроязыке
Пусть надо реализовать следующую простейшую цепочку работ.
Роль А, находящаяся в первом отделе, посылает задание роли В, находящейся во втором отделе. После выполнения задания ролью В, оно пересылается роли С из третьего отдела. Когда роль С выполняет задание она сообщает роли А, инициировавшей задание об его успешном выполнении. Если одна из ролей не справляется с заданием происходит переназначение этого задания роли D, при этом роль А начинает выполнение задание по подготовке документов о наказании роли, не справившейся с заданием.
SUBROUTINE SETSTRUCTURE … END SUBROUTINE SETSTRUCTURE PROGRAM EXAMPLE BEGIN PROCESS EXAMPLE CALL SETSTRUCTURE(); DEPARTMENT FIRST; DEPARTMENT SECOND; DEPARTMENT THIRD; ROLE ACCOUNTABLE; ROLE ENGINEER; ACCOUNTABLE A; ENGINEER B,C,D; FIRST.ADD (A); SECOND.ADD (B); THIRD.ADD (C); INIT_ACTION (A, B, C); APPOINT (B, TASK345, 14); APPOINT (С, TASK346, B.DATE + 14); BEGIN (B); IF ((B.TASKTIME > B.DATE) AND ((B.TASKTIME - B.DATE) < 3)) THEN { WHILE ((B.NOTDONE) OR ((B.TASKTIME - B.DATE)!=3)) { EVERY DAY WARN (B); } } ELSE IF ((B.TASKTIME - B.DATE)>=3) THEN { APPOINT (D, TASK 345, 10); BEGIN (D); APPOINT (A,TASK347,2); BEGIN (A); } ELSE IF (DONE (B) OR (DONE (D))) THEN { IF (DONE(B)) THEN { NOTIFICATION (C,DONE(B)); NOTIFICATION (A,DONE(B)); } ELSE IF (DONE(D)) THEN { NOTIFICATION (C,DONE(D)); NOTIFICATION (A,DONE(D)); } BEGIN (C); } IF (DONE(C)) THEN { NOTIFICATION(A,DONE(B)); END PROCESS EXAMPLE; } ELSE { APPOINT (D, TASK346, 5); BEGIN (D); IF (DONE(D)) { NOTIFICATION(A,DONE(D)); END PROCESS EXAMPLE; } ELSE { END PROCESS EXAMPLE; RETURN -1; } } END PROGRAM EXAMPLE