锁定老帖子 主题:写了一个简单的工作流引擎
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-19
仿照OSWORKFLOW写了一个简单的工作流引擎,支持简单流程,分支,合并等操作。 工作流所采用的数据库如下: create table wf_instances( id integer primary key, name, filename, status --CREATED, ACTIVATED, SUSPENDED, KILLED 和 COMPLETED ) create table wf_curr_steps( id integer primary key, wf_instance_id integer, step integer, action integer, status, owner, started_at datetime, finished_at datetime, caller ) create table wf_properties( id integer primary key, wf_instance_id integer, item_key, item_value ) 采用YAML来描述流程定义,比如一个请假流程的定义如下: workflow: init-actions: 1: name: 开始 results: - step: 1 status: 在填写 owner: @wf_params['caller'] steps: 1: name: 填写请假单 actions: 1: name: 修改 params: page-name: edit_leave results: - step: 1 status: 在填写 owner: @wf_params['caller'] 2: name: 提交申请 params: page-name: apply_leave results: - condition: @wf_params['days'].to_i <= 3 step: 2 status: 待审核 owner: 部门经理 - step: 3 status: 待审核 owner: 公司领导 2: name: 部门经理审核 actions: 1: name: 同意 params: page-name: verify_leave results: - step: 4 status: 待归档 owner: 资料员 2: name: 不同意 params: page-name: verify_leave results: - step: 1 status: 不同意 owner: @wf_params['applier'] 3: name: 公司领导审核 actions: 1: name: 同意 params: page-name: verify_leave results: - step: 4 status: 待归档 owner: 资料员 2: name: 不同意 params: page-name: verify_leave results: - step: 1 status: 不同意 owner: @wf_params['applier'] 4: name: 归档 actions: 1: name: 归档处理 condition: curr_instance_step(4).status=='待归档' params: page-name: verify_leave results: - step: 4 status: 已归档 owner: 资料员
使用的基本方法介绍如下: 1、建立工作流实例: @wf = Workflow.new(caller) @wf_id = @wf.create('请假流程.yml', 2, nil) 2、执行一个ACTION: @wf.do_action(@wf_id,step_id,action_id,wf_params) 3、获取当前可执行的动作: @wf.available_actions(@wf_id,wf_params) 4、获取当前实例的全部全部STEP全部: @wf.curr_steps(@wf_id) 5、删除工作流实例: @wf.destroy(@wf_id)
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-06-19
很好,继续努力,成为ruby的第一个开源工作流
|
|
返回顶楼 | |
发表时间:2008-06-19
redmine算不算是个开源的工作流呢?
|
|
返回顶楼 | |
发表时间:2008-06-19
太粗糙了吧, 可以参考oswf等其他,结合中国国情的wf。
写出想法, 大家共同参与。 我想应该是很有前途的。 |
|
返回顶楼 | |
发表时间:2008-06-20
呵呵,楼主精神可嘉!
虽然workflow原理不是很复杂,可感觉做一个成熟的workflow真的很难,需要投入巨大的研发力量。一个成熟的workflow产品至少要包含流程设计(一般都是支持傻瓜式的图形操作),Role管理,Form设计,业务逻辑控制模块等,用户管理模块。 我现在的工作就是做基于工作流进行二次开发。有成熟的workflow平台支持,感觉开发e-workflow类的电子流程系统效率还是挺高的。 目前我使用的是adobe workflow.公司花了不少钱买的。功能很强,就是开发工具傻了点,不过也没办法,产品好像都是这样。 |
|
返回顶楼 | |
发表时间:2008-06-21
写的太粗糙,?Action定义怎么配置的? |
|
返回顶楼 | |
发表时间:2008-06-21
ltian 写道 Rocwo 写道 呵呵,楼主精神可嘉!
虽然workflow原理不是很复杂,可感觉做一个成熟的workflow真的很难,需要投入巨大的研发力量。一个成熟的workflow产品至少要包含流程设计(一般都是支持傻瓜式的图形操作),Role管理,Form设计,业务逻辑控制模块等,用户管理模块。 我现在的工作就是做基于工作流进行二次开发。有成熟的workflow平台支持,感觉开发e-workflow类的电子流程系统效率还是挺高的。 目前我使用的是adobe workflow.公司花了不少钱买的。功能很强,就是开发工具傻了点,不过也没办法,产品好像都是这样。 Role管理,业务逻辑控制模块等,用户管理模块。这些东西根本不属于工作流系统本身应该有的,因为不用工作流也会需要这些东西,工作流只是和这些东西有接口。 Form设计,也就是说工作单的开发吧,谁会用一个专用Form设计工具去开发工作单呢?更多的程序员还是用eclipse,vs等通用的开发工具开工作单。 楼上很正确, 工作流最重要的是引擎部分, 其他的给个接口就行了。 还有, 没必要用jaml吧? 用ruby 做dsl不是很好么? |
|
返回顶楼 | |
发表时间:2008-06-21
ltian 写道 Form设计,也就是说工作单的开发吧,谁会用一个专用Form设计工具去开发工作单呢?更多的程序员还是用eclipse,vs等通用的开发工具开工作单。 现在有些工作流产品带表单设计的,自定义表单+自定义流程,这是一大卖点。 |
|
返回顶楼 | |
发表时间:2008-06-23
以前用过actionflow,rails的一个插件
|
|
返回顶楼 | |
发表时间:2008-06-23
Godlikeme 写道
写的太粗糙,?Action定义怎么配置的?
一开始粗糙是难免的,Action定义在workflow——>steps——>actions中。在这里是用YAML描述的。 Action前后可以接受一段RUBY脚本,在before-action和after-action中定义。
下面再给出一个国土的案件查处流程:
workflow: init-actions: 1: name: 开始 results: - step: 1 status: 受理 owner: @wf_params['caller']+':案件受理人' steps: 1: name: 受理 actions: 1: name: 修改 condition: curr_instance_step(1).status=='受理' params: action-name: edit results: - step: 1 status: 受理 owner: @wf_params['caller']+':案件受理人' 2: name: 删除 condition: curr_instance_step(1).status=='受理' params: action-name: destroy results: - step: 1 status: 受理 owner: @wf_params['caller']+':案件受理人' 3: name: 移交立案 condition: curr_instance_step(1).status=='受理' params: action-name: comm_work doc-template: doc06 results: - step: 2 status: 立案 owner: @wf_params['caller']+':案件立案人' 4: name: 当场处罚 condition: curr_instance_step(1).status=='受理' params: action-name: comm_work doc-template: doc05 results: - step: 60 status: 当场 owner: @wf_params['caller']+':案件办理人' 2: name: 立案 actions: 1: name: 立案窗口 condition: curr_instance_step(2).status=='立案' params: action-name: edit_document results: - step: 2 status: 立案 owner: @wf_params['caller']+':案件立案人' 2: name: 移交调查 condition: curr_instance_step(2).status=='立案' params: action-name: comm_work doc-template: doc07 doc08 doc10 doc11 doc09 doc12 results: - step: 3 status: 调查 owner: @wf_params['caller']+':案件调查人' 3: name: 调查 actions: 1: name: 调查窗口 condition: curr_instance_step(3).status=='调查' params: action-name: edit_document results: - step: 3 status: 调查 owner: @wf_params['caller']+':案件调查人' 2: name: 移交审理 condition: curr_instance_step(3).status=='调查' params: action-name: comm_work doc-template: doc13 doc14 doc15 results: - step: 4 status: 审理 owner: @wf_params['caller']+':案件办理人' 4: name: 审理 actions: 1: name: 审理窗口 condition: curr_instance_step(4).status=='审理' params: action-name: edit_document results: - step: 4 status: 审理 owner: @wf_params['caller']+':案件办理人' 2: name: 不予行政处罚 condition: curr_instance_step(4).status=='审理' params: action-name: comm_work doc-template: doc16 doc27 results: - step: 33 status: 结案 owner: @wf_params['caller']+':案件办理人' 3: name: 处罚告知 condition: curr_instance_step(4).status=='审理' params: action-name: comm_work doc-template: doc19 results: - step: 30 status: 告知 owner: @wf_params['caller']+':案件办理人' 4: name: 撤案 condition: curr_instance_step(4).status=='审理' params: action-name: comm_work doc-template: doc17 results: - step: 40 status: 撤案 owner: @wf_params['caller']+':案件办理人' 30: name: 告知 actions: 1: name: 告知窗口 condition: curr_instance_step(30).status=='告知' params: action-name: edit_document results: - step: 30 status: 告知 owner: @wf_params['caller']+':案件办理人' 2: name: 移交处罚决定 condition: curr_instance_step(30).status=='告知' params: action-name: comm_work doc-template: doc23 doc24 results: - step: 31 status: 处罚 owner: @wf_params['caller']+':案件办理人' 31: name: 处罚 actions: 1: name: 处罚决定窗口 condition: curr_instance_step(31).status=='处罚' params: action-name: edit_document results: - step: 31 status: 处罚 owner: @wf_params['caller']+':案件办理人' 2: name: 移交执行 condition: curr_instance_step(31).status=='处罚' params: action-name: comm_work doc-template: doc25 doc26 results: - step: 32 status: 执行 owner: @wf_params['caller']+':案件办理人' 32: name: 执行 actions: 1: name: 执行窗口 condition: curr_instance_step(32).status=='执行' params: action-name: edit_document results: - step: 32 status: 执行 owner: @wf_params['caller']+':案件办理人' 2: name: 移交结案 condition: curr_instance_step(32).status=='执行' params: action-name: comm_work doc-template: doc27 results: - step: 33 status: 结案 owner: @wf_params['caller']+':案件办理人' 33: name: 结案 actions: 1: name: 结案窗口 condition: curr_instance_step(33).status=='结案' params: action-name: edit_document results: - step: 33 status: 结案 owner: @wf_params['caller']+':案件办理人' 2: name: 完成 condition: curr_instance_step(33).status=='结案' params: action-name: comm_work doc-template: results: - step: 90 status: 结案 owner: @wf_params['caller']+':案件办理人' 40: name: 撤案 actions: 1: name: 撤案窗口 condition: curr_instance_step(40).status=='撤案' params: action-name: edit_document results: - step: 40 status: 撤案 owner: @wf_params['caller']+':案件办理人' 2: name: 完成 condition: curr_instance_step(40).status=='撤案' params: action-name: comm_work doc-template: results: - step: 90 status: 撤案 owner: @wf_params['caller']+':案件办理人' 60: name: 当场 actions: 1: name: 当场处罚窗口 condition: curr_instance_step(60).status=='当场' params: action-name: edit_document results: - step: 60 status: 当场 owner: @wf_params['caller']+':案件办理人' 2: name: 移交执行 condition: curr_instance_step(60).status=='当场' params: action-name: comm_work doc-template: doc25 doc26 results: - step: 32 status: 执行 owner: @wf_params['caller']+':案件办理人' 90: name: 完成 actions: 1: name: 完成处理 auto: true after-action: | law_case = LawCase.find_by_wf_instance_id @wf_instance.id if law_case law_case.wf_instance_id = nil law_case.status = '完成' law_case.save! end @wf_instance.destroy results: - step: 90 status: 完成 |
|
返回顶楼 | |