`

充分利用 OSWorkflow 的 function

阅读更多

转自: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

    OSWorkFlow

    OSWorkFlow是一个基于Java的工作流引擎,用于在企业级应用中实现复杂的业务流程自动化。它提供了灵活的流程定义和执行模型,使得开发者可以方便地设计、实施和管理各种工作流。下面将详细介绍OSWorkFlow的核心概念、...

    osworkflow中文入门指南,osworkflow+hibernate+spring集成配置,osworkflow-2.8.0.jar

    **利用osworkflow实现业务流程.doc** 可能包含了一些实际案例,演示如何使用osworkflow设计和实现具体的业务流程,比如审批流程、订单处理流程等。 **Osworkflow2.8.0+hibernate3.1.3+spring1.2.8集成环境配置安装...

    osworkflow

    **osWorkflow 概述** osWorkflow 是一个开源的工作流管理系统,专为 Java 应用程序设计,用于处理复杂的业务流程。...通过深入学习和实践,你将能够掌握如何利用osWorkflow 构建高效、可扩展的业务流程管理解决方案。

    osworkflow详细资料 pdf 工作流

    **工作流技术与OSWorkflow详解** 工作流(Workflow)是一种自动化业务流程的技术,它通过定义、执行和管理...通过深入学习和实践,开发者可以充分利用OSWorkflow的功能,为企业定制出符合自身需求的工作流解决方案。

    OSWorkflow中文手册 OSWorkflow中文手册

    OSWorkflow是一款开源的工作流引擎,主要用于管理应用程序中的复杂业务流程。这款工具提供了强大的工作流建模、执行和跟踪功能,让开发者能够灵活地定义和控制应用程序的流程逻辑。本手册是OSWorkflow的中文版,旨在...

    目前osworkflow最新最全的资料合集

    **osworkflow** 是一个强大的开源工作流引擎,主要用于在Java应用程序中实现...通过深入学习这些文档,你可以掌握如何利用osworkflow来实现动态、可扩展的工作流解决方案,从而提升你的Java应用程序的业务处理能力。

    OsWorkflow

    通过这个请假申请的例子,你可以了解到如何使用XML定义流程,Servlet如何与工作流引擎交互,以及如何利用OsWorkflow API来控制流程的执行。这不仅有助于理解OsWorkflow的工作原理,也为实际开发提供了实践经验。

    OSWorkFlow 请假实例

    在"OSWorkFlow 请假实例"中,我们可以理解这是一个利用OSWorkFlow引擎实现的员工请假申请流程。这个流程可能包括请假申请的提交、审批、通知等相关步骤。在实际应用中,员工通过系统提出请假请求,然后这个请求会...

    OSWorkflow的开发指导与指南.pdf

    在处理工作流相关应用时,开发者能够利用OSWorkflow来构建、控制和管理流程。从文件内容中我们可以看到,该文件主要涉及OSWorkflow的版本更新、组件、存储方式以及工作流的一些核心概念。下面将围绕OSWorkflow开发...

    工作流 osworkflow 例子和原理

    3. 编写控制器:利用OSWorkflow API启动流程、查询状态、执行操作。 4. 监听和扩展:注册监听器以监听流程事件,实现自定义逻辑。 5. 集成到应用程序:将OSWorkflow整合进你的项目,处理流程相关的请求。 总的来说...

    基于osworkflow框架的OA系统demo

    本DEMO是基于osworkflow框架构建的一个会议室使用申请的实例,旨在展示如何利用osworkflow来实现一个具体的办公自动化功能。 **1. osworkflow简介** OSWorkflow提供了强大的工作流定义和执行能力,包括流程设计、...

    Osworkflow10份资料

    OSWorkflow中文手册OSWorkflow-chinese-manual-2.8.pdf Packt.Publishing.OSWorkflow.A.Guide.for.Java.Developers.and.Architects.Aug.2007.pdf 工作流普及风暴—基础概念.doc 用osworkflow写一个请假例子.rar

    osworkflow2.8.pdf

    - **Spring Hibernate 存储**:利用 Spring 和 Hibernate 技术进行持久化操作。 - **JDBC 模板存储**:使用 JDBC 模板简化数据库操作。 - **Hibernate 存储**:直接使用 Hibernate 进行对象关系映射。 #### 四、...

    osworkflow学习笔记

    通过osworkflow项目的学习和实践,总结出的一套osworkflow工作流引擎的学习笔记,供需要使用osworkflow系统的同学们借鉴,谢谢!

    OSWorkflow2.8 API文档

    OSWorkflow 2.8 API 文档

    osworkflow2.8

    OSWorkflow 是一个开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程管理。这个"osworkflow2.8"版本是OSWorkflow的一个特定发行版,包含了一整套用于设计、执行和管理工作流程的工具和资源。下面我们将...

    流程引擎OSworkflow2.8资料(所有jar包,学习资料,api)

    总的来说,这个压缩包为开发者提供了一站式资源,使他们能够有效地利用OSWorkflow 2.8构建高效、可扩展的业务流程管理系统。通过深入学习和实践,你可以掌握如何利用这个强大的工具来优化你的应用程序的流程控制。

    osworkflow_bundle2

    OSWorkflow 是一个开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。"osworkflow_bundle2" 是一个专门用于学习 OSWorkflow 的示例集合,它包含了一系列的资源和实例,帮助用户理解并掌握如何使用这个...

Global site tag (gtag.js) - Google Analytics