Реализация Конечного Автомата Для Автоматизации Процессов.

Каждый уважающий себя технический руководитель/архитектор программного обеспечения/менеджер по разработке должен написать хотя бы одну CRM в своей жизни.

Народная мудрость Всем привет! Меня зовут Михаил, я технический руководитель компании.

ДомКлик .

Сегодня я хочу поговорить об автоматизации бизнес-процессов.

У нас есть объекты, граф состояний\набор статусов, и в каждый момент времени объект находится в одном из возможных состояний.

Это позволяет вам описать рабочий процесс или конечную машину для рассматриваемого процесса и построить на этой абстракции сервис автоматизации.

Многие сервисы, которыми мы пользуемся в повседневной жизни, основаны на процессах, которые можно описать с помощью этих абстракций – интернет-покупки, еда, такси, CRM, ERP,… Рассмотрим, например, процесс оформления и доставки заказа.

Описание объекта

  
  
  
  
  
   

class Order: status responsible price paid

я

WF_STATUSES = (NEW, ORDERED, RESERVED, CANCELLED, RETURNED, PAID, SHIPPED, DELIVERED, COMPLETED,)

Студия разработчиков Borland , ODBC, всё так и должно быть, на дворе 2006 год. именно тогда у меня появилась возможность поработать над первой в жизни CRM. Психика человека устроена так, что все плохое вытесняется и заменяется, поэтому, знакомясь с очередной реализацией рабочего процесса или создавая проект с нуля, я старался найти ту самую серебряную пулю – общий подход, который бы наиболее удобен в использовании, интуитивно понятен и эффективен.

За время работы у меня накопилась хорошая подборка решений из серии того, чего делать не надо, но и кое-что полезное мне удалось выработать.



Чего не делать



def set_ordered(self, request): .

object = self.get_object() object.status = ORDERED object.save() .



Самое неудачное решение — разнести по всему программному коду всю логику движения объекта по рабочему процессу.

Изменяем состояние объекта в API-обработчиках, сигналах, триггерах, методах классов, где это возможно.

При таком подходе нет единого понимания процесса, внести изменения крайне сложно.



class Order: .

def set_ordered(self): pass def set_reserved(self): pass

Довольно удобно реализовать рабочий процесс через класс, где будет функция перехода к каждому статусу.

Мне не нравится этот вариант, потому что часто есть общий подход к изменению статуса — какие-то общие действия, которые должны быть в каждой функции, например:

  • проверка состояния объекта
  • назначение ответственного лица
  • регистрация изменений статуса
Кроме того, поддержка и развитие такого рабочего процесса в нашем меняющемся мире также создаст проблемы.

Например, введение в процесс новых шагов потребует переоценки всех мест проекта, где меняется состояние объекта.

К тому же логика рабочего процесса ускользает между пальцами и мы опять не понимаем, какой статус за каким следует. Чтобы разобраться в этом, вам понадобится глубокое понимание проекта.



К чему мы пришли

Итак, у нас есть объект — заказ в интернет-магазине и статусная модель, описывающая процесс покупки товара.

Сначала мы определили варианты манипулирования объектом, мы можем

  • переместите объект по положительному сценарию DIR_NEXT,
  • перейти к альтернативным ветвям DIR_FAIL, DIR_WAIT, DIR_RETURN,
  • отменить обработку объекта DIR_CANCEL,
  • завершить обработку объекта DIR_COMPLETE.


DIRECTIONS = (DIR_NEXT, DIR_FAIL, DIR_RETURN, DIR_WAIT, DIR_CANCEL, DIR_COMPLETE,)

Далее, чтобы получить четкое представление о процессе, его необходимо описать.

Мы выбрали схему JSON, которая является хорошей отправной точкой для построения визуального представления процесса.

Кроме того, диаграмма процесса всегда под рукой в коде, поэтому вы можете запомнить, что для чего нужно.

Рабочий процесс процесса

ORDER_WORKFLOW = { NEW: { DIR_NEXT: ORDERED, 'responsible': AUTHOR, }, ORDERED: { DIR_NEXT: RESERVED, DIR_RETURN: RETURNED, DIR_CANCEL: CANCELLED, 'responsible': MANAGER, }, RESERVED: { DIR_NEXT: PAID, DIR_CANCEL: CANCELLED, }, PAID: { DIR_NEXT: SHIPPED, 'notify_manager': True, 'responsible': STOREKEEPER, }, SHIPPED: { DIR_NEXT: DELIVERED, 'notify_client': True, 'responsible': DRIVER, }, DELIVERED: { DIR_NEXT: COMPLETED, DIR_CANCEL: CANCELLED, }, COMPLETED: { 'notify_manager': True, 'finished': True, },

Теги: #программирование #рабочий процесс #fsm #конечный автомат
Вместе с данным постом часто просматривают: