Каждый уважающий себя технический руководитель/архитектор программного обеспечения/менеджер по разработке должен написать хотя бы одну CRM в своей жизни.Теги: #программирование #рабочий процесс #fsm #конечный автоматНародная мудрость Всем привет! Меня зовут Михаил, я технический руководитель компании.
ДомКлик .
Сегодня я хочу поговорить об автоматизации бизнес-процессов.
У нас есть объекты, граф состояний\набор статусов, и в каждый момент времени объект находится в одном из возможных состояний.
Это позволяет вам описать рабочий процесс или конечную машину для рассматриваемого процесса и построить на этой абстракции сервис автоматизации.
Многие сервисы, которыми мы пользуемся в повседневной жизни, основаны на процессах, которые можно описать с помощью этих абстракций – интернет-покупки, еда, такси, 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, },
-
Сборка Большого Htpc/Nas На Базе Ivy Bridge
19 Oct, 24 -
Google: «Долой Пиратские Видео!»
19 Oct, 24 -
Exynos – Умный И Экологичный
19 Oct, 24 -
Как Заменить Hr Роботом? Техническая Часть
19 Oct, 24