当前位置:文档之家› 工作流设计参考_包括PHP实现

工作流设计参考_包括PHP实现

工作流设计参考(包括PHP实现)本文关键词:php工作流,workflow工作流设计的工作流很少有让人满意的,即便是国内用的比较多的jbpm,用起来也会觉得很便扭。

再加上PHP中没有什么好用的工作流,于是干脆自己设计一个,设计的原则如下:1 根据80/20原则,只使用wfmc模型中最符合自身应用的20%功能2 充分吸收国内使用jbpm开发BOSS中遇到的问题,工作流引擎只负责参数的收集和流程的流转,具体和业务的控制,交给每个流程定制的控制类去实现。

3 表单采用简单的html+控制标签的方法实现4 权限和模板引擎,以及其它辅助函数直接使用办公系统自带的框架5 充分利用PHP语言的特点,流程设计是基于数据库的,程序上使用OO设计,但采用重对象的方法6 不把可视化设计流程的工作交给最终客户,而且由设计时完成,因此不考虑流程版本更新的问题一、工作流数据表设计二、常见流程人工决策领导传阅部门领导审批填写表单结束放弃提交同意重填(退回)不同意完成外部响应发送支付信息接收支付成功响应(外部WS触发该流程)三、PHP设计运行的函数由结点在设计时候决定,如果没有设定,就使用默认的函数。

利用了PHP语言的以下特性使用前可以用method_exists来检查。

WorkflowService.phpWorkflowService$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: 人工决策建立$threadWorkflowProposalHandler-> init_function ($process,$node,$thread)发送提醒Case 2: 自动处理建立$threadWorkflowProposalHandler-> init_function ($process,$node,$thread)调用run_thread(thread_id)Case 3: 等待外部响应建立$threadWorkflowProposalHandler-> init_function ($process,$node,$thread)Case 4: 分支取得所有分支的子结点init_thread(子结点)Case 5: 汇总:取得所有前结点,如果所有前结点的Thread都结束了,调出下一结点调用init_thread(子结点)Case 6: 结束:直接结束进程processend_process()}run_thread(thread_id){取得$node取得$process取得$threadSwitch($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取得$threadSwitch($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取得$threadSwitch($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_processview_processworkflow_proposal_handler.phpWorkflowProposalHandlerstart()prepare_input() 准备用户输入变量,从$_POST收集init_function () 线程建立后调用的默认函数,当流程的执行者由程序生成时,在此函数内更改$thread的executor,例如直接赋值user[2]run_function () 线程运行化时候调用的默认函数save_function () 保存运行信息transit_function () 执行流转sendmail 其它结点调用函数workflow.phpswitch(op)case list_defination参数:无WorkflowService->list_defination();case start_process : 启动参数:defination_idWorkflowService->init_process(defination_id);WorkflowService->start_process();case list_ my_thread : 待处理的列表WorkflowService->list_ my_thread();case run_thread :参数:thread_idWorkflowService->run_thread(thread_id);case save_thread :参数:thread_id把input收集起来(所有的变量以f_ 开头),赋给WorkflowService的Input,另外还要获得thread_idWorkflowService->save_thread(thread_id);case transit_thread :参数:thread_id把input收集起来,赋给WorkflowService的Input,另外还要获得thread_id$next_node_id = 得到用户选择的下一结点idWorkflowService-> 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_id2 WorkflowService->run_thread(thread_id);。

相关主题