2018-03-22 14:41:51
李艳玲
|
数据表
workflow table 工作流
workflow_node 工作流节点
workflow_node_action 工作流节点动作表 workflow_node_action.cfg结构如下: {
// action的多个结果分别会跳到哪个节点
results: {
success: {
node_id:
111,
}
pending: {
node_id:
222,
}
failed: {
node_id:
444,
}
}
/
/ 强耦合的工作流系统,需要配置多个应用/module有关的东西
modules: {
main: {
// 要执行这个actin要进入的url
action_urls: [
"user/edit",
"user/edit-post",
],
// action的结果,这里的results只需要配置与
module有关的东西,如
url
results: {
success: {
next_url:
"abc/def",
next_url_method:
"redirect" }
pending: {}
failed: {}
}
},
other_modules: {}
}
}
调用示例:Class OrderController(){
function selectWorker(){
return view(
'selectWorker');
}
function selectWorkerPost(){
// 控制器层的验证规则
// 调用服务层 OrderService
::selectWorkder(
$orderId,
$workerId);
// 返回数据结果,可根据Workflow的处理结果和配置,自动跳转,如:
return OrderService
::getWorkflow()
->processResult();
}
}
Class OrderService{
function selectWorkder(
$orderId,
$workerId){
$order
=
Order
::find(
$orderId);
$wf
=
self
::getWorkFlow();
// 工作流检查节点能否执行该动作
$wf
->check(
$order
->status,
'selectWorkder');
// 其它页面规则的验证
// 处理数据
$result
=
'success';
// 记录工作流的动作,方便控制器调整数据和配置进行下一步处理,并返回业务对象下一个状态
$nextStatus
=
$wf
->procces(
$orderOldStatus,
'selectWorkder',
$result);
// 保存数据和最新的状态
// 后续处理 Event::on('after-select-worker');
// 组装并返回数据 }
}
结论
工作流引擎只适用在流程可能会变化的业务中。 否则简单的系统,直接在controller中配置URL,在业务层中直接写状态转换,这样可能更灵活简洁。 如果流程再要灵活点,例如,用户是男的或女的走的流程不一样,你就需要在cfg里面做详尽的配置。
应用 |
李艳玲 最后编辑, 2018-03-23 08:24:06