用osworkflow写一个请假例子 - 庄周梦蝶 - BlogJava
来源:百度文库 编辑:神马文学网 时间:2024/05/02 04:58:14
庄周梦蝶天行健,君子以自强不息
osworkflow扩展非常容易,跟我们的应用结合起来使用也很容易。假设一个请假流程:员工请假,需要经过部门经理和人力资源部经理两人共同审批,只有当两人都许可时才通过,任一人驳回就失效,也就是一个and split和andJoin流程,并且我们附加一个要求,当发送请假请求、许可和驳回这几个操作时都将发送一条消息给相应的用户。
流程定义文件如下:
"http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">
com.opensymphony.workflow.util.Caller
status="Underway" step="1" owner="${caller}" />
com.opensymphony.workflow.util.StatusCondition
Underway
com.opensymphony.workflow.util.AllowOwnerOnlyCondition
com.opensymphony.workflow.util.StatusCondition
Underway
com.opensymphony.workflow.util.AllowOwnerOnlyCondition
com.opensymphony.workflow.util.Caller
split="1" status="Queued">
net.rubyeye.leavesys.service.workflow.SendRemindInfFunction
AND (GROUPNAME='dept_manager' or
GROUPNAME='comp_manager')
you have leavemsg to
check!please check it!
com.opensymphony.workflow.util.OSUserGroupCondition
dept_manager
com.opensymphony.workflow.util.Caller
propertySet.setString("action1",
"success");
status="Queued" join="1" owner="${caller}" />
com.opensymphony.workflow.util.OSUserGroupCondition
dept_manager
com.opensymphony.workflow.util.Caller
propertySet.setString("action1",
"fail");
status="Queued" join="2" owner="${caller}" />
com.opensymphony.workflow.util.OSUserGroupCondition
comp_manager
com.opensymphony.workflow.util.Caller
propertySet.setString("action2",
"success");
status="Queued" join="1" owner="${caller}" />
com.opensymphony.workflow.util.OSUserGroupCondition
dept_manager
com.opensymphony.workflow.util.Caller
propertySet.setString("action2",
"fail");
status="Queued" join="2" owner="${caller}" />
step="2" />
step="3" />
"Finished".equals(jn.getStep(2).getStatus()) &&
"Finished".equals(jn.getStep(3).getStatus())&&"success".equals(propertySet.getString("action1"))&&
"success".equals(propertySet.getString("action2"))
]]>
step="4"/>
"Finished".equals(jn.getStep(2).getStatus()) &&"fail".equals(propertySet.getString("action1"))
]]>
"Finished".equals(jn.getStep(3).getStatus())&&"fail".equals(propertySet.getString("action2"))
]]>
status="Queued">
net.rubyeye.leavesys.service.workflow.SendRemindInfFunction
AND GROUPNAME='employee'
you leveamsg is fail!!!
请注意,我们在许可或者通过的时候propertySet.setString("action2",......),propertySet.setString("action3",......),然后在join点判断,如果两个都是success,流程结束;如果一个是fail,就发送一个消息给员工。
发送消息的function像这样:
package net.rubyeye.leavesys.service.workflow;
import java.sql.SQLException;
import java.util.Map;
import net.rubyeye.leavesys.domain.RemindInf;
import net.rubyeye.leavesys.service.ManagerFactory;
import com.opensymphony.module.propertyset.PropertySet;
import com.opensymphony.workflow.FunctionProvider;
import com.opensymphony.workflow.WorkflowException;
public class SendRemindInfFunction implements FunctionProvider {
public void execute(Map transientVars, Map args, PropertySet ps)
throws WorkflowException {
String groupName = (String) args.get("groupName");
String content = (String) args.get("content");
RemindInf remindInf = new RemindInf();
remindInf.setContent(content);
try {
ManagerFactory.getRemindService().addRemindInfByGroupName(
groupName, remindInf);
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
得到两个参数groupName和content(消息内容),调用业务对象发送消息。
完整代码下载在《LeaveSystem》
代码用到了自己过去写的一个MVC框架和持久层,对此有兴趣的参考这三篇文章:
《设计自己的MVC框架》
《设计模式之事务处理》
《使用Annotation设计持久层》
如果仅仅是想了解osworkflow的应用,建议您跑下流程,读读相关几个业务类(LeaveServiceImpl.java,SendRemindInfFunction.java,service包下)即可。解压缩后的文件可以直接导入myeclipse工程,部署在tomcat下,数据库用的是oracle。跑起来以后可以用3个用户登录,test是雇员组,dennis是部门经理组,jordan是公司经理,都不需要密码。写的比较简单,只是实验性质,见谅。
我认为使用osworkflow,只要了解了它的表结构和主要原理,根据你的业务需要结合几张主要表(os_wfentry,os_currentstep,os_historystep等)合理设计数据库和业务流程,可以省去过去为每个业务流程对象创建的一大堆flag(标志,目前的流程状态)的累赘,充分利用工作流的威力。比如为部门经理和人力资源部经理显示不同的需要审批的假单列表,只要结合os_historystep表进行联合查询,部门经理的应该是执行了未执行acion2,step在3的;而人力资源部经理得到的同样是step在3,action未执行3的。
手痒痒,很想把去年为一家公司写的绩效考核系统改写一下,当时设计的一个contract对象拥有7,8个flag来标志合约状态(直接上级审核,人力资源评价,KPI评价等),搞的非常混乱,而且流程写死在代码里,如果以后要改变考核流程,只有重新写过一套。不过那家公司是国有企业,每年的固定的预算费用一定要花掉,反正大家一起赚国家的钱嘛。
用osworkflow写一个请假例子
update:这个例子是不当的,更合适的例子请自己上javaeye上搜索个帖子。源码俺早就丢了,请不要再发邮件给我,谢谢。osworkflow扩展非常容易,跟我们的应用结合起来使用也很容易。假设一个请假流程:员工请假,需要经过部门经理和人力资源部经理两人共同审批,只有当两人都许可时才通过,任一人驳回就失效,也就是一个and split和andJoin流程,并且我们附加一个要求,当发送请假请求、许可和驳回这几个操作时都将发送一条消息给相应的用户。
流程定义文件如下:
"http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">
com.opensymphony.workflow.util.Caller
com.opensymphony.workflow.util.StatusCondition
com.opensymphony.workflow.util.AllowOwnerOnlyCondition
com.opensymphony.workflow.util.StatusCondition
com.opensymphony.workflow.util.AllowOwnerOnlyCondition
com.opensymphony.workflow.util.Caller
net.rubyeye.leavesys.service.workflow.SendRemindInfFunction
AND (GROUPNAME='dept_manager' or
GROUPNAME='comp_manager')
you have leavemsg to
check!please check it!
com.opensymphony.workflow.util.OSUserGroupCondition
com.opensymphony.workflow.util.Caller
propertySet.setString("action1",
"success");
com.opensymphony.workflow.util.OSUserGroupCondition
com.opensymphony.workflow.util.Caller
propertySet.setString("action1",
"fail");
com.opensymphony.workflow.util.OSUserGroupCondition
com.opensymphony.workflow.util.Caller
propertySet.setString("action2",
"success");
com.opensymphony.workflow.util.OSUserGroupCondition
com.opensymphony.workflow.util.Caller
propertySet.setString("action2",
"fail");
"Finished".equals(jn.getStep(2).getStatus()) &&
"Finished".equals(jn.getStep(3).getStatus())&&"success".equals(propertySet.getString("action1"))&&
"success".equals(propertySet.getString("action2"))
]]>
"Finished".equals(jn.getStep(2).getStatus()) &&"fail".equals(propertySet.getString("action1"))
]]>
"Finished".equals(jn.getStep(3).getStatus())&&"fail".equals(propertySet.getString("action2"))
]]>
net.rubyeye.leavesys.service.workflow.SendRemindInfFunction
AND GROUPNAME='employee'
you leveamsg is fail!!!
请注意,我们在许可或者通过的时候propertySet.setString("action2",......),propertySet.setString("action3",......),然后在join点判断,如果两个都是success,流程结束;如果一个是fail,就发送一个消息给员工。
发送消息的function像这样:
package net.rubyeye.leavesys.service.workflow;
import java.sql.SQLException;
import java.util.Map;
import net.rubyeye.leavesys.domain.RemindInf;
import net.rubyeye.leavesys.service.ManagerFactory;
import com.opensymphony.module.propertyset.PropertySet;
import com.opensymphony.workflow.FunctionProvider;
import com.opensymphony.workflow.WorkflowException;
public class SendRemindInfFunction implements FunctionProvider {
public void execute(Map transientVars, Map args, PropertySet ps)
throws WorkflowException {
String groupName = (String) args.get("groupName");
String content = (String) args.get("content");
RemindInf remindInf = new RemindInf();
remindInf.setContent(content);
try {
ManagerFactory.getRemindService().addRemindInfByGroupName(
groupName, remindInf);
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
得到两个参数groupName和content(消息内容),调用业务对象发送消息。
完整代码下载在《LeaveSystem》
代码用到了自己过去写的一个MVC框架和持久层,对此有兴趣的参考这三篇文章:
《设计自己的MVC框架》
《设计模式之事务处理》
《使用Annotation设计持久层》
如果仅仅是想了解osworkflow的应用,建议您跑下流程,读读相关几个业务类(LeaveServiceImpl.java,SendRemindInfFunction.java,service包下)即可。解压缩后的文件可以直接导入myeclipse工程,部署在tomcat下,数据库用的是oracle。跑起来以后可以用3个用户登录,test是雇员组,dennis是部门经理组,jordan是公司经理,都不需要密码。写的比较简单,只是实验性质,见谅。
我认为使用osworkflow,只要了解了它的表结构和主要原理,根据你的业务需要结合几张主要表(os_wfentry,os_currentstep,os_historystep等)合理设计数据库和业务流程,可以省去过去为每个业务流程对象创建的一大堆flag(标志,目前的流程状态)的累赘,充分利用工作流的威力。比如为部门经理和人力资源部经理显示不同的需要审批的假单列表,只要结合os_historystep表进行联合查询,部门经理的应该是执行了未执行acion2,step在3的;而人力资源部经理得到的同样是step在3,action未执行3的。
手痒痒,很想把去年为一家公司写的绩效考核系统改写一下,当时设计的一个contract对象拥有7,8个flag来标志合约状态(直接上级审核,人力资源评价,KPI评价等),搞的非常混乱,而且流程写死在代码里,如果以后要改变考核流程,只有重新写过一套。不过那家公司是国有企业,每年的固定的预算费用一定要花掉,反正大家一起赚国家的钱嘛。
用osworkflow写一个请假例子 - 庄周梦蝶 - BlogJava
我想用PYTHON写一个小例子来理解什么是脚本语言 - IDC专家网
工作流(OSWorkFLOW)的例子改造 - 隔壁老王的博客 - CSDN博客
一个BPEL的例子
一个BPEL的例子
一个spring的简单例子
iBATIS实现的一个例子
一个真实的大学生例子
堕落:一个负面的例子
一个老公给妻子的请假申请书
BlogJava
BlogJava
载荷为位置函数的一个例子
使用Hibernate的一个完整例子
一个简单的XML Schema的例子
C# Remoting的一个简单例子
载荷为位置函数的一个例子
爆笑!一个老公给妻子的请假申请书(图)
爆笑!一个老公给妻子的请假申请书(图)
爆笑!一个老公给妻子的请假申请书
爆笑!一个老公给妻子的请假申请书(图)
爆笑!一个老公给妻子的请假申请书
osworkflow入门篇
“庄周梦蝶”的意蕴