Стандарт ISO 19510
Підтримка сутностей BPMN в BPE:
beginEvent — початкова подія
subProcess — виклик підпроцесу
gateway — абстрактне розгалуження
exclusiveGateway — розгалуження
parallelGateway — паралельне розгалуження
eventBasedGateway — розгалуження запущене подією
messageEvent — асинхронне повідомлення через чергу Erlang-процесу
messageFlow — асинхронне повідомлення через чергу KVS
sequenceFlow — ребро між задачою та/або розгалуженням
boundaryEvent — таймаут усього процесу
timeoutEvent — автоперехід на наступний крок БП
endEvent — кінцева подія
userTask — веб-користувач
serviceTask — алгоритм який миттєво виконується
sendTask — крок, який інкапсулює KVS #writer
receiveTask — крок, який інкапсулює KVS #reader
Приклад сесії оператора
> bpe:start(bpe_account:def(),[]).
Process "1562195753535380000" spawned as <0.139.0>.
{ok,"1562195753535380000"}
> bpe:complete("1562195753535380000").
Process: "1562195753535380000" Task: 'Created' Targets: ['Init']
Target: 'Init' Status: reply Reason: unknown_task
{unknown_task,'Init'}
> bpe:hist("1562195753535380000").
[ {hist,{1,"1562195753535380000"},
feed,[],[],[],[],'IBAN Account',
{task,'Init'},
[],
{{2019,7,4},{2,13,43}}},
{hist,{0,"1562195753535380000"},
feed,[],[],[],[],'IBAN Account',
{task,'Created'},
[],
{{2019,7,4},{2,13,7}}}]
> bpe:head("1562195753535380000").
{hist,{1,"1562195753535380000"},
feed,[],[],[],[],'IBAN Account',
{task,'Init'},
[],
{{2019,7,4},{2,13,43}}}
> supervisor:which_children(bpe_otp).
[{"1562195753535380000",<0.139.0>,worker,[bpe_proc]}]
> kvs:all(writer).
[{writer,"/bpe/proc",1,[],[],[]},
{writer,"/bpe/hist/1562195753535380000",2,[],[],[]}]
> kvs:get("/bpe/hist/1562195753535380000",{1,"1562195753535380000"}).
{ok,{hist,{1,"1562195753535380000"},
feed,[],[],[],[],'IBAN Account',
{task,'Init'},
[],
{{2019,7,4},{2,16,7}}}}
Специфікація BPMN
Ця схема охоплює 80% всіх робочих процесів та забезпечує лише 20% стандартного покриття. Ми називаємо це Легким BPMN, або BPE.
-type bst() :: binary() | string() | atom().
-type procId() :: [] | integer() | {atom(),any()}.
-type histId() :: [] | integer() | {atom()|string(),any()}.
-record(hist, { id = [] :: histId(),
container = feed :: [] | atom(),
feed_id = [] :: any(),
prev = [] :: [] | integer(),
next = [] :: [] | integer(),
feeds = [] :: list(),
name = [] :: [] | binary(),
task = [] :: [] | {atom()|string(),any()},
docs = [] :: list(tuple()),
time = [] :: term() }).
-type tasks() :: #task{} | #serviceTask{} | #userTask{}
| #receiveTask{} | #beginEvent{} | #endEvent{}.
-type events() :: #messageEvent{} | #boundaryEvent{}
| #timeoutEvent{}.
-record(process, { id = [] :: procId(),
container = feed :: [] | atom(),
feed_id = [] :: [] | term(),
prev = [] :: [] | integer(),
next = [] :: [] | integer(),
name = [] :: [] | bst(),
feeds = [] :: list(),
roles = [] :: list(),
tasks = [] :: list(tasks()),
events = [] :: list(events()),
hist = [] :: [] | term(),
flows = [] :: list(#sequenceFlow{}),
rules = [] :: [] | term(),
docs = [] :: list(tuple()),
options = [] :: term(),
task = 'Created' :: [] | atom(),
timer = [] :: [] | reference(),
notifications = [] :: [] | term(),
result = [] :: [] | binary(),
started = [] :: [] | calendat:datetime(),
beginEvent = [] :: [] | atom(),
endEvent = [] :: [] | atom()}).
Приклади процесів
-module(bpe_account).
-compile(export_all).
def() ->
#process { name = 'IBAN Account',
flows = [
#sequenceFlow { source='Created', target='Init'},
#sequenceFlow { source='Init', target='Upload'},
#sequenceFlow { source='Upload', target='Payment'},
#sequenceFlow { source='Payment', target=['Signatory','Process']},
#sequenceFlow { source='Process', target=['Process','Final']},
#sequenceFlow { source='Signatory', target=['Process','Final']} ],
tasks = [
#beginEvent { name='Created', module = bpe_account },
#userTask { name='Init', module = bpe_account },
#userTask { name='Upload', module = bpe_account },
#userTask { name='Signatory', module = bpe_account },
#serviceTask { name='Payment', module = bpe_account },
#serviceTask { name='Process', module = bpe_account },
#endEvent { name='Final', module = bpe_account } ],
beginEvent = 'Created',
endEvent = 'Final',
events = [ #messageEvent{name='PaymentReceived'} ] }.
Впровадження
Компанії, які використовують BPE: