转自:http://www.blogjava.net/rosen/archive/2005/08/12/9888.html
使用 OSWorkflow 已经有段时间了,现在看来实际需求不是请假条流程原型这么简单。
有这样的需求:OA 系统中的公文审批共有六个 step,采用单点(不牵涉 split 和 join)逐级审核方式,不同角色登陆时,由同一页面处理,为了便于收发文统计,必须知道下一个接收人是哪个。
由于在触发当前 action 的同时就要设置好下一接收者,遂需要引进新的协作表。当 action 时要调用另外的 save
方法,而这一过程当然不能在表现层进行。最开始的做法是用一个辅助 service 来取出每个 action 的下一接收者,如下:
public List getLeader(int type,int companyId) {
switch (type) {
case 1:
return docSendDao.getThisFaculty(companyId);
case 2:
return docSendDao.getOffice();
case 3:
return docSendDao.getSecGroup();
case 4:
return docSendDao.getOfficeLead();
case 5:
return docSendDao.getSecFaculty();
default :
return new ArrayList();
}
}
|
这种做法在开发的前期还觉得不错,随着需求的进一步详细,发现当新增、修改流程时,也许我们要在这个 service
中满山遍野的找寻到底代码在哪里。更糟糕的是产品提交用户后,用户不会花费这么大的耐心让你这样维护。在经过短暂的思考后,决定利用
OSWorkflow 的 FunctionProvider 接口和 script 做文章。
一个比较成熟的想法是(如各位有更好的方案不妨交流):每个流程都可能面临修改,那就把流程的每个 action
要做的事抽取出来,这样修改起来相对独立,比如要把下一默认接收者改成其他人;另一个目的是快速响应用户对新流程的需求,在提出需求后,生成相应的流程文
件及每个 action 要做的事,提交到服务器,重启就可以用了,而不是在已有代码基础上新增。这里的“每个 action 要做的事”就是
OSWorkflow 的 FunctionProvider 接口,实现这个接口,就可以为所欲为了。
代码片断如下:
流程定义
<step id="1" name="科领导审批">
<actions>
<action id="2" name="批准" view="批准">
<results>
<unconditional-result id="2" old-status="Finished" status="Queued" step="2" owner="${stepOwner}">
<pre-functions>
//向 FacultyLea 类说明当前调用者
<function type="beanshell">
<arg name="script">
String caller = context.getCaller();
transientVars.put("caller", caller);
</arg>
</function>
//FunctionProvider 实现类
//向协作表中写入当前调用者和下一默认接收者
<function name="set.caller" type="class">
<arg name="class.name">***.*****.util.FacultyLea</arg> </function>
</pre-functions>
</unconditional-result>
</results>
</action>
<action id="3" name="拒绝" view="拒绝">
<results>
<unconditional-result id="3" old-status="Finished" status="Finished" step="7"/>
</results>
</action>
</actions>
</step>
FacultyLea
public class FacultyLea implements FunctionProvider{
ReadProperty readProperty = ReadProperty.getInstance();
ApplicationContext ctx=new
FileSystemXmlApplicationContext(System.getProperty("user.dir")+"/web/WEB-INF/classes/applicationContext.xml");
private SendDao sendDao = (SendDao) ctx.getBean("sendDao");
private DocService docService = (DocService) ctx.getBean("docService");
public void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException {
long l=((HibernateCurrentStep)((Collection)transientVars.get("currentSteps")).toArray()[0]).getEntryId();
Doc md=docService.findDocByWrokFlowId(l+"");
String caller=(String)transientVars.get("caller");
//设置下一步的接收者
Timestamp date = new Timestamp(System.currentTimeMillis());
String query = "some hql here";
List leaders = docSendDao.find(query);
for(int i=0;i<leaders.size();i++){
Send send = new Send();
send.setSendUser(new UserLogin(new Integer(caller)));
send.setDoc(md);
......
sendDao.save(send);
}
//设置该步骤处理者
transientVars.put("stepOwner", caller);
}
}
分享到:
相关推荐
OSWorkflow
OSWorkFlow demo 资料 OSWorkFlow demo 资料
OSWorkflow中文手册OSWorkflow中文手册OSWorkflow中文手册OSWorkflow中文手册 pdf 50页
工作流 osworkflow工作流 osworkflow工作流 osworkflow工作流 osworkflow工作流 osworkflow工作流 osworkflow
OSWORKFlow流程开发教程
OSWorkflow中文手册OSWorkflow-chinese-manual-2.8.pdf Packt.Publishing.OSWorkflow.A.Guide.for.Java.Developers.and.Architects.Aug.2007.pdf 工作流普及风暴—基础概念.doc 用osworkflow写一个请假例子.rar
通过osworkflow项目的学习和实践,总结出的一套osworkflow工作流引擎的学习笔记,供需要使用osworkflow系统的同学们借鉴,谢谢!
OSWorkflow 2.8 API 文档
osworkflow中文入门指南,osworkflow+hibernate+spring集成配置,osworkflow-2.8.0.jar
这是一个简单的osworkflow的web应用,比较适合初学或入门者,或想研究osworkflow的人,如果有任何问题,可以联系我.
osworkflow教程,osworkflow教程,osworkflow教程,osworkflow教程,osworkflow教程,osworkflow教程,osworkflow教程,osworkflow教程,osworkflow教程osworkflow教程osworkflow教程,osworkflow教程,osworkflow教程...
osworkflow2.8.rar 工作流引擎
OsWorkflow与CMS集成,将OsWorkflow安装到OpenCms,采用MySQL数据库
OSWorkflow中文手册.pdf OSWorkflow中文手册.pdf OSWorkflow中文手册.pdf
spring+hibernate+osworkflow,服务器为Tomcat6.0,数据库为Mysql 把viewlivegraph2.jsp改为viewlivegraph.jsp. 其中把wf的获得修改为 ApplicationContext cxt = WebApplicationContextUtils.get...
osworkflow 中文文档,内容详尽。
osworkflow中文手册osworkflow中文手册osworkflow中文手册
自己整理的一些osworkflow方面的资料