【php精品源码栏目提醒】:以下是网学会员为您推荐的php精品源码-工作流数据库设计 - 其它资料,希望本篇文章对您学习有所帮助。
工作流设计参考(包括
PHP 实现)本文关键词:
php 工作流workflow 工作流设计的工作流很少有让人满意的,即便是国内用的比较多的 jbpm,用起来也会觉得很便扭。
再加上
PHP 中没有什么好用的工作流,于是干脆自己设计一个,设计的原则如下:1 根据 80/20 原则,只使用 wfmc 模型中最符合自身应用的 20%功能2 充分吸收国内使用 jbpm 开发 BOSS 中遇到的问题,工作流引擎只负责参数的收集和流程的流转,具体和业务的控制,交给每个流程定制的控制类去实现。
3 表单采用简单的 html控制标签的方法实现4 权限和模板引擎,以及其它辅助函数直接使用办公系统自带的框架5 充分利用
PHP 语言的特点,流程设计是基于数据库的,程序上使用 OO 设计,但采用重对象的方法6 不把可视化设计流程的工作交给最终客户, 而且由设计时完成, 因此不考虑流程版本更新的问题一、工作流数据表设计tbl_workflow_defination:工作流定义表defination_id 流程 iddefination_name 流程名称defination_handler 流程处理辅助文件,每 自 定 义 处 理 文 件 , 及 其 对 象 。
例 如 个工作流一个文件 workflow-proporsal-handler.
php,其中定义对象 proposaltbl_workflow_node:流程结点步骤表node_id 结点 iddefination_id 流程 idnode_index 结点序号 结点的 stepnode_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。
尾结点或要结束的结 点没有,若没有,直接调用 endexecutor 执行角色,组,人 role12 group12 user12为空由运行时决 定execute_type 执行类型 0 需所有人执行 1 只需一人执行remind 提醒 0 不提醒 1 邮件 2 短信 3 邮件和短信field 可编辑的字段 namecontentmax_day 最长时间天tbl_workflow_process :流程执行进程表process_id 进程 iddefination_id 流程 idprocess_desc 进程描述 显示在我的工作台中context 上下文 存放上下文变量例如业务表的 idcurrent_node_index 当前结点序号start_time 流程启动时间 如遇分支、汇合显示为: 1=》34=》35=》6finish_time 流程完成时间state 状态 1 运行 2 结束start_user 发起人 发起人,用于显示自己的流程tbl_workflow_thread :流程执行线程表thread_id 线程 idprocess_id 进程 idprocess_desc 进程描述node_id 结点 idnode_name 结点名称executor 执行人start_time 线程生成时间receive_time 线程接收时间finish_time 线程完成时间max_time 结点规定的最长时间state 状态 0 未接收 1 已接收 2 已处理二、常见流程人工决策领导传阅部门领导审批填写表单结束放弃提交同意重填(退回)不同意完成外部响应发送支付信息接收支付成功响应(外部 WS 触发该流程)三、
PHP 设计运行的函数由结点在设计时候决定,如果没有设定,就使用默认的函数。
利用了
PHP 语言的以下特性使用前可以用 method_exists 来检查。
WorkflowService.
php WorkflowServicedefinationprocessnodethreadinput 用户输入的和流程有关的变量list_definationinit_processdefination_idglobal user取得defination,得到业务的 handler例如 WorkflowProposalHandler 建立process 行记录start_process调 用 WorkflowProposalHandler-startprocess//新 建 业 务 对 象, 并把 业 务类的 参 数 例如proposal_id 放到process‘context’里面 init_thread1 //默认调用第一个结点list_ my_thread global userinit_threadnode_index 取得node 取得process 修改process 为运行到当前结点 Switchnode‘node_type’ Case 1: 人工决策 建立thread WorkflowProposalHandler- init_function processnodethread 发送提醒Case 2: 自动处理 建立thread WorkflowProposalHandler- init_function processnodethread 调用 run_threadthread_idCase 3: 等待外部响应 建立thread WorkflowProposalHandler- init_function processnodethreadCase 4: 分支 取得所有分支的子结点 init_thread子结点Case 5: 汇总: 取得所有前结点,如果所有前结点的 Thread 都结束了,调出下一结点 调用 init_thread子结点Case 6: 结束:直接结束进程 process end_processrun_threadthread_id取得node取得process取得thread Switchnode‘node_type’ Case 1: 人工决策 修改thread 为已接收 WorkflowProposalHandler- run_function processnodethread 显示表单Case 2: 自动处理 修改thread 为已接收 next_node_idWorkflowProposalHandler- run_function processnodethread 调用 transit_threadthread_id next_node_idCase 3: 等待外部响应 修改thread 为已接收 next_node_idWorkflowProposalHandler- run_function processnodethread transit_threadthread_id next_node_idCase 4: 分支Case 5: 汇总:Case 6: 结束:save_threadthread_id//保存结点数据取得node取得process取得thread Switchnode‘node_type’ Case 1: 人工决策 WorkflowProposalHandler- save_function processnodethread 保存表单WorkflowProposalHandler- run_function processnodethread 显示表单Case 2: 自动处理Case 3: 等待外部响应Case 4: 分支Case 5: 汇总:Case 6: 结束:transit_threadthread_id next_node_id取得node 取得process取得thread Switchnode‘node_type’ Case 1: 人工决策 WorkflowProposalHandler-transit_functionprocessnodethreadnext_node_id 修改thread 为已完成 Ifnext_node_id cur_node_id //回退 删除所有大于next_node_id 的 Thread init_threadnext_node_idCase 2: 自动处理修改thread 为已完成 Ifnext_node_id cur_node_id //回退 删除所有大于next_node_id 的 Thread init _threadnext_node_idCase 3: 等待外部响应 修改thread 为已完成 Ifnext_node_id cur_node_id //回退 删除所有大于next_node_id 的 Thread init _threadnext_node_idCase 4: 分支Case 5: 汇总:Case 6: 结束:end_processlist_my_processview_processworkflow_proposal_handler.phpWorkflowProposalHandler start prepare_input 准备用户输入变量,从_POST 收集 init_function 线程建立后调用的默认函数,当流程的执行者由程序生成时,在此函数内 更改thread 的 executor,例如直接赋值 user2 run_function 线程运行化时候调用的默认函数 save_function 保存运行信息 transit_function 执行流转 sendmail 其它结点调用函数workflow.
php switchop case list_defination 参数:无WorkflowService-list_definationcase start_process : 启动 参数:defination_id WorkflowService-init_processdefination_id WorkflowService-start_process case list_ my_thread : 待处理的列表 WorkflowService-list_ my_thread case run_thread : 参数:thread_id WorkflowService-run_threadthread_id case save_thread : 参数:thread_id 把 input 收集起来(所有的变量以 f_ 开头) ,赋给 WorkflowService 的 Input,另外还要获得 thread_id WorkflowService-save_threadthread_id case transit_thread : 参数:thread_id把 input 收集起来,赋给 WorkflowService 的 Input,另外还要获得 thread_idnext_node_id 得到用户选择的下一结点 idWorkflowService- transit _threadthread_id,next_node_id case list_my_process: 所有我发起的流程 case list_all_process: 所有我发起的流程 case view_process :在其它程序中初始化流程1 先自行建立好业务表单2WorkflowService-init_processdefination_id3 把建好的业务表单的 ID 放在 process 的 context 里面4WorkflowService-init_thread1WorkflowService-transit_thread1,2 通过手动调用把前面的流程过掉外部服务继续流转流程(只用于自动流程)1 把 input 收集起来,赋给 WorkflowService 的 Input,另外还要获得 thread_id2 WorkflowService-run_threadthread_id
上一篇:
【精品】awk中文手册
下一篇:
应用数学学报编辑部联系方式