工作流很少有让人满意的,即便是国内用的比较多的jbpm,用起来也会觉得很便扭。再加上PHP中没有什么好用的工作流,于是干脆自己设计一个,设计的原则如下:

1 根据80/20原则,只使用wfmc模型中最符合自身应用的20%功能

2 充分吸收国内使用jbpm开发BOSS中遇到的问题,工作流引擎只负责参数的收集和流程的流转,具体和业务的控制,交给每个流程定制的控制类去实现。

3 表单采用简单的html+控制标签的方法实现

4 权限和模板引擎,以及其它辅助函数直接使用办公系统自带的框架

5 充分利用PHP语言的特点,流程设计是基于数据库的,程序上使用OO设计,但采用重对象的方法

6 不把可视化设计流程的工作交给最终客户,而且由设计时完成,因此不考虑流程版本更新的问题

一、工作流数据表设计

tbl_workflow_defination:工作流定义表

defination_id

流程id

defination_name

流程名称

defination_handler

流程处理辅助文件,每个工作流一个文件

自定义处理文件,及其对象。例如workflow-proporsal-handler.php,其中定义对象proposal

tbl_workflow_node:流程结点步骤表

node_id

结点id

defination_id

流程id

node_index

结点序号

结点的step

node_name

结点名称

node_type

结点类型

1人为决策,2自动处理(直接执行execute_function),3等待外部响应(例如外部WS触发),4分支,5汇总6结束结点(此结点执行时候自动终止进程)

init_function

流程初始函数

run_function

流程运行函数

save_function

流程保存函数

transit_function

流程流转函数

prev_node_index

前结点序号

例如1。开始结点没有

执行前,通过此来校验一下流程

next_node_index

后结点序号

例如[同意]3,[不同意]4。尾结点或要结束的结点没有,若没有,直接调用end

executor

执行角色,组,人

role[1,2] group[1,2] user[1,2],为空由运行时决定

execute_type

执行类型

0需所有人执行1只需一人执行

remind

提醒

0不提醒1邮件2短信3邮件和短信

field

可编辑的字段

name,content

max_day

最长时间(天)

tbl_workflow_process:流程执行进程表

process_id

进程id

defination_id

流程id

process_desc

进程描述

显示在我的工作台中

context

上下文

存放上下文变量,例如业务表的id

current_node_index

当前结点序号

start_time

流程启动时间

如遇分支、汇合显示为:

1=》3,4=》3,5=》6

finish_time

流程完成时间

state

状态

1运行2结束

start_user

发起人

发起人,用于显示自己的流程

tbl_workflow_thread:流程执行线程表

thread_id

线程id

process_id

进程id

process_desc

进程描述

node_id

结点id

node_name

结点名称

executor

执行人

start_time

线程生成时间

receive_time

线程接收时间

finish_time

线程完成时间

max_time

结点规定的最长时间

state

状态

0未接收1已接收2已处理

二、常见流程

人工决策

领导传阅

部门领导审批

填写表单

结束

放弃

提交

同意

重填(退回)

不同意

完成

外部响应

发送支付信息

接收支付成功响应(外部WS触发该流程)

三、PHP设计

运行的函数由结点在设计时候决定,如果没有设定,就使用默认的函数。利用了PHP语言的以下特性

classFoo

{

functionVariable()

{

$name='Bar';

$this->$name();// This calls the Bar() method

}

functionBar()

{

echo"This is Bar";

}

}

$foo= newFoo();

$funcname="Variable";

$foo->$funcname();// This calls $foo->Variable()

?>

使用前可以用method_exists来检查。

WorkflowService.php

WorkflowService

$defination

$process

$node

$thread

$input用户输入的和流程有关的变量

list_defination()

{

}

init_process(defination_id)

{  global user;

取得$defination,得到业务的handler,例如WorkflowProposalHandler

建立$process行记录

}

start_process()

{调用WorkflowProposalHandler->start($process)//新建业务对象,并把业务类的参数例如proposal_id放到$process['context’]里面

init_thread(1);  //默认调用第一个结点

}

list_ my_thread ()

{  global user;

}

init_thread(node_index)

{

取得$node

取得$process

修改$process为运行到当前结点

Switch($node['node_type’])

Case 1:人工决策

建立$thread

WorkflowProposalHandler-> init_function ($process,$node,$thread)

发送提醒

Case 2:自动处理

建立$thread

WorkflowProposalHandler-> init_function ($process,$node,$thread)

调用run_thread(thread_id)

Case 3:等待外部响应

建立$thread

WorkflowProposalHandler-> init_function ($process,$node,$thread)

Case 4:分支

取得所有分支的子结点

init_thread(子结点)

Case 5:汇总:

取得所有前结点,如果所有前结点的Thread都结束了,调出下一结点

调用init_thread(子结点)

Case 6:结束:直接结束进程process

end_process()

}

run_thread(thread_id)

{

取得$node

取得$process

取得$thread

Switch($node['node_type’])

Case 1:人工决策

修改$thread为已接收

WorkflowProposalHandler-> run_function ($process,$node,$thread)显示表单

Case 2:自动处理

修改$thread为已接收

$next_node_id=WorkflowProposalHandler-> run_function ($process,$node,$thread)

调用transit_thread(thread_id, $next_node_id)

Case 3:等待外部响应

修改$thread为已接收

$next_node_id=WorkflowProposalHandler-> run_function ($process,$node,$thread)

transit_thread(thread_id, $next_node_id)

Case 4:分支

Case 5:汇总:

Case 6:结束:

}

save_thread(thread_id)

{  //保存结点数据

取得$node

取得$process

取得$thread

Switch($node['node_type’])

Case 1:人工决策

WorkflowProposalHandler-> save_function ($process,$node,$thread)保存表单

WorkflowProposalHandler-> run_function ($process,$node,$thread)显示表单

Case 2:自动处理

Case 3:等待外部响应

Case 4:分支

Case 5:汇总:

Case 6:结束:

}

transit_thread(thread_id, $next_node_id)

{取得$node

取得$process

取得$thread

Switch($node['node_type’])

Case 1:人工决策

WorkflowProposalHandler->transit_function($process,$node,$thread,$next_node_id)

修改$thread为已完成

If($next_node_id < $ cur_node_id) { //回退

删除所有大于$next_node_id的Thread

}

init_thread($next_node_id)

Case 2:自动处理

修改$thread为已完成

If($next_node_id < $ cur_node_id) { //回退

删除所有大于$next_node_id的Thread

}

init _thread($next_node_id)

Case 3:等待外部响应

修改$thread为已完成

If($next_node_id < $ cur_node_id) { //回退

删除所有大于$next_node_id的Thread

}

init _thread($next_node_id)

Case 4:分支

Case 5:汇总:

Case 6:结束:

}

end_process()

list_my_process

view_process

workflow_proposal_handler.php

WorkflowProposalHandler

start()

prepare_input()准备用户输入变量,从$_POST收集

init_function ()线程建立后调用的默认函数,当流程的执行者由程序生成时,在此函数内更改$thread的executor,例如直接赋值user[2]

run_function ()线程运行化时候调用的默认函数

save_function ()保存运行信息

transit_function ()执行流转

sendmail其它结点调用函数

workflow.php

switch(op)

case list_defination

参数:无

WorkflowService->list_defination()

case start_process :启动

参数:defination_id

WorkflowService->init_process(defination_id)

WorkflowService->start_process()

case list_ my_thread :待处理的列表

WorkflowService->list_ my_thread()

case run_thread :

参数:thread_id

WorkflowService->run_thread(thread_id)

case save_thread :

参数:thread_id

把input收集起来(所有的变量以f_开头),赋给WorkflowService的Input,另外还要获得thread_id

WorkflowService->save_thread(thread_id)

case transit_thread :

参数:thread_id

把input收集起来,赋给WorkflowService的Input,另外还要获得thread_id

$next_node_id =得到用户选择的下一结点id

WorkflowService-> transit _thread(thread_id,$next_node_id)

case list_my_process:所有我发起的流程

case list_all_process:所有我发起的流程

case view_process :

在其它程序中初始化流程

1先自行建立好业务表单

2WorkflowService->init_process(defination_id)

3把建好的业务表单的ID放在process的context里面

4WorkflowService->init_thread(1)

WorkflowService->transit_thread(1,2)通过手动调用把前面的流程过掉

外部服务继续流转流程(只用于自动流程)

1把input收集起来,赋给WorkflowService的Input,另外还要获得thread_id

2 WorkflowService->run_thread(thread_id)

php工作流如何实现,工作流设计参考(包括PHP实现)相关推荐

  1. SharePoint 2013 工作流之使用Visio设计篇

    原文:SharePoint 2013 工作流之使用Visio设计篇 SharePoint 2013增强了工作流,不仅仅基于WorkFlow Foundation 4.0了,设计方式也不仅仅是Desig ...

  2. activiti工作流在线表单设计功能(activiti + ueditor + Ueditor Web Form De

    分享一下我老师大神的人工智能教程吧.零基础,通俗易懂!风趣幽默!http://www.captainbed.net/ 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 之前实现了 ...

  3. 办公自动化中工作流过程定义的设计与实现

    办公自动化中工作流过程定义的设计与实现 转载于:https://blog.51cto.com/hnoas/105576

  4. UED团队规范设计参考及建议

    公司产品线逐渐增多,变动频繁且并行开发,常常需要设计与开发能够快速的做出响应.同时这类产品中有存在很多类似的页面以及组件,可以通过抽象得到一些稳定且高复用性的内容.通过模块化的解决方案,降低冗余的生产 ...

  5. 玩转冷板式液冷 你需要一份靠谱的“设计参考”

    通过"碳达峰"与"碳中和"行动实现可持续发展,是当前人类社会的共识.进入数字时代,作为信息系统运行的物理载体,数据中心建设规模与数量增速迅猛,在源源不断为经济社 ...

  6. HMI人机交互硬件设计参考

    MYD-Y6ULX-HMI 是米尔电子设计的基于 NXP 公司 i.MX 6UL/6ULL 系列处理器的嵌入式开发板.为 HMI 人机接口等应用提供尽可能完善的开发资源. MYD-Y6ULX-HMI ...

  7. ui设计参考网站以及ui设计参考书籍

    今天是ui设计参考网站以及ui设计参考书籍的一些总结推荐,ui设计其实不仅仅是学习一些软件那样简单,很多时候我们需要开发脑力以及想象力,看书是会打开思维,看网站是会打开想象.下面就是ui设计参考网站以 ...

  8. 计算机控制课程设计pid控制,自动化计算机控制课程设计参考题目

    自动化计算机控制技术课程设计参考题目 一.电烤箱温度计算机控制系统设计 参考: 应用各种控制算法(大林,smith 预估,PID 任选其一),实现温箱的闭环控制.要求设计一个以计算机(8088)或是单 ...

  9. 状态机工作流,顺序工作流和Flowchart

    什么是工作流,工作流可以说是对业务处理过程的建模,当我们设计工作流的时候,我们首先要分析业务处理过程中要经历的步骤.然后,我们就可以利用WF创建工作流模型来模拟业务的处理过程. WF工作流包含两种类型 ...

  10. 工作流系列: 工作流模式

    工作流模式 ―Childe Zhao, http://www.workflow-fortune.com -译自 http://tmitwww.tm.tue.nl/research/patterns/ ...

最新文章

  1. CoCreateInstance(转)
  2. OpenAI新论文称打败GAN达到SOTA!是噱头还是干货?
  3. css--小白入门篇3
  4. 动态规划备忘录方法递归方法
  5. virtualbox虚拟机ubuntu和宿主机xp文件件共享方法
  6. 区分range() , np.arange() , np.linspace()
  7. android+rom+bootloader+flash,Android ROM开发(4) bootloader 三种启动模式
  8. execCommand全集
  9. sql跨表查询_白话django之ORM的查询语句
  10. 哈希表和红黑树的对比
  11. ASP.NET 前端Ajax获取数据并刷新
  12. 2-3实战分类模型之数据的读取与展示
  13. linux交叉编译jpeg,libjpeg的交叉编译以及jpeg图片的缩放(缩略图)
  14. prml线性模型小结
  15. JavaScript — json文件的读取与写入
  16. 中交一公局二公司全面推进章管家 印章智慧管理转型在即
  17. google浏览器html不提示,谷歌浏览器不显示标签页怎么回事 谷歌浏览器不显示标签页的解决方法...
  18. 计算机远程桌面连接软件,windows7远程桌面连接软件 提取自最新windows7,可运行于XP...
  19. linux 飞信机器人 下载,飞信机器人FXRobot 's | CN-SEC 中文网
  20. java7723魂斗罗2_魂斗罗3代-完全版

热门文章

  1. 虎牙直播源解析【可选清晰度】
  2. 用matlab模拟3电荷,基于Matlab模拟点电荷电场线和等势线
  3. 精小的无线接收模块22MM直径硬币大小QI协议
  4. 3.26 初接触Python
  5. modelsim安装_Modelsim10.5安装教程
  6. 计算机软件国民经济行业代码,国民经济行业类别及代码.DOC
  7. Qt setFocus
  8. 人力资源管理教程 HR自学视频教程
  9. 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(2)
  10. 《SQL入门经典》总结