基于开源工作流引擎OSWorkflow的业务系统实例——请假审批系统

最近工作中一个项目打算采用工作流技术,所以对工作流特别是OSWorkflow进行了一些学习和研究,为了向项目组其他成员演示和进一步进行应用,做了这个小业务系统,现在经过整理把它拿出来,希望对想要了解OSWorkflow的朋友有一点帮助。我接触的时间也不长,所以哪个地方有问题还希望大家多多指点,对工作流技术共同提高。

[b]这个小业务系统的主要目的[/b]
演示如何基于OSWorkflow构建业务系统,即如何将原来程序内硬编码的业务过程抽取出来,放到底层的工作流引擎中,上层业务模块只进行具体业务动作的执行,同时演示着两层如何“集成”。
本系统演示三个方面:业务处理和OSWorkflow的基本“集成”、工作流引擎根据工作流定义调用业务处理逻辑、基于业务数据的工作流跳转

[b]业务用例描述[/b]
核心工作流:
1、员工填写请假申请单,包括“请假原因”和“请假天数”,填写后进行提交;
2、部门主管对员工请假申请进行审批,同意员工请假;
3、人力资源主管对员工请假申请进行审批,同意员工请假;
4、系统发送邮件通知员工请假申请已获得批准;
5、用例结束;

备选工作流1:
在第一步中,如果员工请假天数小于等于3天,那么不需要部门主管审批,直接从第一步跳到第三步,又人力资源审批;

备选工作流2:
在第二步中,如果部门主管不同意请假申请,那么系统将给请假员工发送请假没有通过的邮件通知,用例结束;

备选工作流3:
在第三步中,如果人力资源主管不同意请假申请,那么系统将给请假员工发送请假没有通过的邮件通知,用例结束;

[b]系统运行/开发环境[/b]
数据库:ms sqlserver2000
应用服务器:Jboss-4.0.2
开发工具:Jbuilder2006

[b]系统搭建[/b]
1、创建数据库,我命名为osworkflow_app,也可命名为任意名字,只要在数据源配置中正确配置即可;
2、创建数据表并初始化用户及用户组数据,执行附件中的db_leaveApprove_20070712.sql即可;
3、在jboss下配置数据源,我的配置如附件mssql-ds.xml
4、将osworkflow及log4j的配置文件leave_apply.xml、osuser.xml、osworkflow.xml、propertyset.xml、workflows.xml、log4j.properties拷贝到工程目录src下面;
可直接将附件的leaveApprove.rar解到项目中,里面包括所有的源程序和资源包。

[b]工作流定义文件说明[/b]
依据本业务需求的工作流定义文件如下
定义中包括6个step

step1是员工请假申请的步骤,本步骤的action在执行时将回调业务方法类ApplyFunction,将申请单数据插入到数据库中,同时处理结果将根据请假申请天数dayCount进行判断,如果请假申请天数大于3天,将跳到step2让部门主管审批,如果不大于3天,将直接跳到step3让人力资源主管审批;

step2 是部门主管审批,如果审批同意(opinion!=2)将跳到step3再由人力资源主管审批,如果审批不同意(opinion==2)将跳到step5自动发“申请未批准”邮件通知步骤;

step3 是人力资源主管审批,如果审批同意(opinion!=2)将跳到step4自动发“申请批准”邮件通知步骤,如果审批不同意(opinion==2)将跳到step5自动发“申请未批准”邮件通知步骤;

step4和step5都是自动发送邮件通知步骤,执行完之后跳到空步骤step6结束该工作流实例。

工作流定义文件
[code]<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.6//EN" "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">
<workflow>
<initial-actions>
<action id="100" name="启动请假申请工作流">
<results>
<unconditional-result old-status="Finished" status="Underway" step="1"/>
</results>
</action>
</initial-actions>
<steps>
<step id="1" name="请假申请">
<actions>
<action id="1" name="提交需求申请">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">employee</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">com.qiny.leave.ApplyFunction</arg>
</function>
</pre-functions>
<results>
<result old-status="Finished" status="Underway" step="2" owner="manager1">
<conditions type="AND">
<condition type="beanshell">
<arg name="script">
propertySet.getInt("dayCount")>3
</arg>
</condition>
</conditions>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("步骤 1 提交需求申请 满足条件结果 需部门经理审批...");
</arg>
</function>
</post-functions>
</result>
<unconditional-result old-status="Finished" status="Underway" step="3" owner="hr1"/>
</results>
</action>
</actions>
</step>
<step id="2" name="请假申请审核">
<actions>
<action id="2" name="部门主管审批请假申请">
<restrict-to>
<conditions type="AND">
<condition type="beanshell">
<arg name="script">true</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">manager</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">com.qiny.leave.ApproveFunction</arg>
</function>
</pre-functions>
<results>
<result old-status="Finished" status="Underway" step="5">
<conditions type="AND">
<condition type="beanshell">
<arg name="script">
propertySet.getInt("opinion")==2
</arg>
</condition>
</conditions>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("步骤 2 请假申请审核 部门经理审批没有通过 ...");
</arg>
</function>
</post-functions>
</result>
<unconditional-result old-status="Finished" status="Underway" step="3" owner="hr1"/>
</results>
</action>
</actions>
</step>
<step id="3" name="请假申请审核">
<actions>
<action id="3" name="人力资源主管审批请假申请">
<pre-functions>
<function type="class">
<arg name="class.name">com.qiny.leave.ApproveFunction</arg>
</function>
</pre-functions>
<results>
<result old-status="Finished" status="Underway" step="5">
<conditions type="AND">
<condition type="beanshell">
<arg name="script">
propertySet.getInt("opinion")==2
</arg>
</condition>
</conditions>
</result>
<unconditional-result old-status="Finished" status="Underway" step="5"/>
</results>
</action>
</actions>
</step>
<step id="4" name="请假申请结果通知">
<actions>
<action id="4" auto="true" name="请假申请获准邮件通知">
<pre-functions>
<function type="beanshell">
<arg name="script">
System.out.println("步骤 4 自动动作 请假申请获准邮件通知 Send mail 祝贺你$$$$$$$");
</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Finished" step="6"/>
</results>
</action>
</actions>
</step>
<step id="5" name="请假申请结果通知">
<actions>
<action id="5" auto="true" name="请假申请没能获准邮件通知">
<pre-functions>
<function type="beanshell">
<arg name="script">
System.out.println("步骤 5 自动动作 请假申请没能获准邮件通知 Send mail 很抱歉$$$$$$$");
</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Finished" step="6"/>
</results>
</action>
</actions>
</step>
<step id="6" name="flow over">
</step>
</steps>
</workflow>[/code]

回家了,明天再对一些程序进行说明
可以下载附件,建立工程后执行,数据库中有三个用户:employee1表示员工,可以提交请假申请;manager1表示部门主管;hr1表示人力资源主管,密码都是test
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值