`
jbpm-x
  • 浏览: 49090 次
  • 性别: Icon_minigender_2
  • 来自: 大连
社区版块
存档分类
最新评论

请假流程

阅读更多

 

作者: nogocn 


在某一公司中,部门员工要休假的话需要部门主管的批准。如果休假天数大于10天的话,在部门主管的同意后,还必须上级主管批准。如果是部门主管要休假只要上级主管批准即可。在休假被批准之前,申请人可以撤销休假申请。
每个员工还有多少天休假必须管理起来,在员工提交休假申请时要检查申请天数是否超过可用天数。申请批准后,要在可用天数里减去申请天数。每次休假申请结束之后,不管通过未通过或是否取消,都必须记录下来。主管在批复申请之后,系统要将批复结果Email给申请人。对于大于10天的申请,如果部门主管已批准同意而上级主管还未批准,这时申请人撤销申请后,系统应发Email通知部门主管申请已撤销。 
  processdefinition.xml如下:

xml 代码
  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2. <!---->  
  3.     "-//jBpm/jBpm Mapping DTD 2.0//EN"   
  4.     "http://jbpm.org/dtd/processdefinition-2.0.dtd">  
  5. <process-definition  name="RequestLeave">  
  6.  <swimlane name="requester">  
  7.   <description>申请者description>  
  8.  swimlane>  
  9.  <swimlane name="chief">  
  10.   <description>部门主管description>  
  11.   <delegation class="kellerdu.jbpm.delegation.ChiefSwimlane"/>  
  12.  swimlane>  
  13.  <swimlane name="boss">  
  14.   <description>上级主管description>  
  15.   <delegation class="kellerdu.jbpm.delegation.BossSwimlane"/>  
  16.  swimlane>  
  17.  <start-state name="request" swimlane="requester">  
  18.   <transition to="BeginRequest"/>  
  19.  start-state>  
  20.  <fork name="BeginRequest">  
  21.   <transition to="RequesterCancel"/>  
  22.   <transition to="IsChief"/>  
  23.  fork>  
  24.  <decision name="IsChief">  
  25.   <delegation class="kellerdu.jbpm.delegation.ChiefDecision"/>  
  26.   <transition name="BossApprove"  to="BossApprove"/>  
  27.   <transition name="ChiefApprove"  to="ChiefApprove"/>  
  28.  decision>  
  29.  <state name="RequesterCancel">  
  30.   <assignment swimlane="requester"/>  
  31.   <transition name="cancel" to="Decided">  
  32.    <action>  
  33.     <!---->  
  34.     <delegation class="kellerdu.jbpm.action.RequestCancel"/>  
  35.    action>  
  36.   transition>  
  37.  state>  
  38.  <state name="ChiefApprove">  
  39.   <assignment swimlane="chief"/>  
  40.   <transition name="approve" to="NeedBossApprove">  
  41.    <action>  
  42.     <!---->  
  43.     <delegation class="kellerdu.jbpm.action.ChiefApprove"/>  
  44.    action>  
  45.   transition>  
  46.   <transition name="disapprove" to="Decided">  
  47.    <action>  
  48.     <!---->  
  49.     <delegation class="kellerdu.jbpm.action.ChiefDisapprove"/>  
  50.    action>  
  51.   transition>  
  52.  state>  
  53.  <state name="BossApprove">  
  54.   <assignment swimlane="boss"/>  
  55.   <transition name="approve" to="Decided">  
  56.    <action>  
  57.     <!---->  
  58.     <delegation class="kellerdu.jbpm.action.BossApprove"/>  
  59.    action>  
  60.   transition>  
  61.   <transition name="disapprove" to="Decided">  
  62.    <action>  
  63.     <!---->  
  64.     <delegation class="kellerdu.jbpm.action.BossDisapprove"/>  
  65.    action>  
  66.   transition>  
  67.  state>  
  68.  <decision name="NeedBossApprove">  
  69.   <!---->  
  70.   <delegation class="kellerdu.jbpm.delegation.NeedBossApproveDecision"/>  
  71.   <transition name="need" to="BossApprove"/>  
  72.   <transition name="notNeed" to="Decided"/>  
  73.  decision>  
  74.  <join name="Decided">  
  75.   <description>有一个先到达即进行父Tokendescription>  
  76.   <delegation class="kellerdu.jbpm.delegation.DecidedJoin"/>  
  77.   <transition to="DoSomething"/>  
  78.  join>  
  79.  <decision name="DoSomething">  
  80.   <description>  

    根据请求的状态决定。
    (1)“主管或者老板批准”-‘approve’:修改员工休假的总天数,设定发给用户E-Mail的信息。
    (2)“主管或者老板否决”-“disapprove”:设定发给用户E-Mail的信息。
    (3)“撤销”-"cancel"-设定发给用户E-Mail的信息。如果主管批准,要发给主管消息说明已经撤销。
  

xml 代码
  1.  description>  
  2.  <delegation class="kellerdu.jbpm.delegation.DoSomethingDecision"/>  
  3.  <transition name="disapprove" to="Finished">  
  4.   <action>  
  5.    <delegation class="kellerdu.jbpm.action.Disapprove"/>  
  6.   action>  
  7.  transition>  
  8.  <transition name="approve" to="Finished">  
  9.   <action>  
  10.    <delegation class="kellerdu.jbpm.action.Approve"/>  
  11.   action>  
  12.  transition>  
  13.  <transition name="cancel" to="Finished">  
  14.   <action>  
  15.    <delegation class="kellerdu.jbpm.action.Cancel"/>  
  16.   action>  
  17.  transition>  
  18. decision>  
  19. <end-state name="Finished"/>  
  20. <action event-type="process-end">  
  21.  <!---->  
  22.  <delegation class="kellerdu.jbpm.action.ProcessEndAction"/>  
  23. action>  
  24. /process-definition>  

 

Action指明的是当前状态要执行的一些额外的操作,如记录log、发邮件等。
(1)Swimline的delegation要做的就是判别当前Actor的身份。
  

java 代码
  1. package kellerdu.jbpm.delegation;   
  2.   
  3. import org.jbpm.delegation.*;   
  4. import kellerdu.jbpm.LogsFactory;   
  5. import org.apache.commons.logging.Log;   
  6.   
  7. public class BossSwimlane implements AssignmentHandler {   
  8.     public BossSwimlane() {   
  9.     }   
  10.   
  11.     /**  
  12.      * 当前的状态有哪个actor来具体负责处理,选择是老板的actor来处理。  
  13.      *  
  14.      * 如果王林是老板,那么他请假可以用他的名称来开始一个请假流程,当他检查他需要批示的  
  15.      * 请假时,使用actorId=boss来找出所有的批示。这时selectActor返回的值就是一个常量“boss”  
  16.      *  
  17.      *  
  18.      * @param assignmentContext AssignmentContext  
  19.      * @return String  
  20.      * @todo Implement this org.jbpm.delegation.AssignmentHandler method  
  21.      */  
  22.     public String selectActor(AssignmentContext assignmentContext) {   
  23.         Log log = LogsFactory.getLogInstance(this.getClass());   
  24.         log.info("任务分配给老板");   
  25.         return "boss";   
  26.     }   
  27. }   
  28. ========================================   
  29. ackage kellerdu.jbpm.delegation;   
  30.   
  31. import org.jbpm.delegation.*;   
  32. import kellerdu.jbpm.LogsFactory;   
  33. import org.apache.commons.logging.Log;   
  34.   
  35. public class ChiefSwimlane implements AssignmentHandler {   
  36.     public ChiefSwimlane() {   
  37.     }   
  38.   
  39.     /**  
  40.      * selectActor  
  41.      * @see BossSwimlane  
  42.      *  
  43.      * @param assignmentContext AssignmentContext  
  44.      * @return String  
  45.      * @todo Implement this org.jbpm.delegation.AssignmentHandler method  
  46.      */  
  47.     public String selectActor(AssignmentContext assignmentContext) {   
  48.        Log log = LogsFactory.getLogInstance(this.getClass());   
  49.         log.info("任务分配给上级主管");   
  50.        return "chief";   
  51.     }   
  52. }   

(二)Decision

java 代码
  1. package kellerdu.jbpm.delegation;   
  2.   
  3. import org.jbpm.delegation.*;   
  4. import kellerdu.jbpm.LogsFactory;   
  5. import org.apache.commons.logging.Log;   
  6. import kellerdu.jbpm.Constants;   
  7.   
  8. public class ChiefDecision implements DecisionHandler {   
  9.     public ChiefDecision() {   
  10.     }   
  11.   
  12.     /**  
  13.      * 判断是否需要主管批准,决定下一个要进行的transition  
  14.      *  
  15.      * @param executionContext ExecutionContext  
  16.      * @return String  
  17.      * @todo Implement this org.jbpm.delegation.DecisionHandler method  
  18.      */  
  19.     public String decide(ExecutionContext executionContext) {   
  20.         Log log=LogsFactory.getLogInstance(this.getClass());   
  21.         String ac=(String)executionContext.getVariable(Constants.USER_NAME);   
  22.         if(ac!=null&&(ac.equals("dali")||ac.equals("wang"))){   
  23.             log.info(ac+"需要老板批准!");   
  24.             return "BossApprove";   
  25.         }else{   
  26.             log.info(ac+"需要先经主管批准");   
  27.             return "ChiefApprove";   
  28.         }   
  29.     }   
  30. }   
  31.   

=======================
(三)fork

java 代码
  1. package kellerdu.jbpm.delegation;   
  2.   
  3. import org.jbpm.*;   
  4. import org.jbpm.delegation.*;   
  5. import org.jbpm.model.execution.*;   
  6. import java.util.*;   
  7.   
  8. public class DecidedJoin implements JoinHandler {   
  9.     public DecidedJoin() {   
  10.     }   
  11.   
  12.     /**  
  13.      * fork,只要一个分支到达,即可进行下一步操作,同时取消其它同时进行的分支。  
  14.      * 这里就是用户如果取消,请假就取消。如果用户请假批准,则用户不能取消。  
  15.      *  
  16.      * @param forkContext ForkContext  
  17.      * @throws ExecutionException  
  18.      * @todo Implement this org.jbpm.delegation.ForkHandler method  
  19.      */  
  20.     public void join(JoinContext joinContext) throws ExecutionException {   
  21.         Iterator it=joinContext.getConcurrentTokens().values().iterator();   
  22.         Token arrivingToken = joinContext.getToken();   
  23.         while(it.hasNext()){   
  24.             Token to=(Token)it.next();   
  25.             if(to.getId().equals(arrivingToken.getId())){   
  26.                 //取消其它执行的Token   
  27.                 joinContext.getExecutionService().cancelToken(to.getId());   
  28.             }   
  29.         }   
  30.          // reactivate the parent token.   
  31.           joinContext.reactivateToken( arrivingToken.getParent() );   
  32.     }   
  33. }   
  34.     

(一)  开始一个请假流程
      

java 代码
  1. //user是请假人的actorId   
  2.       ExecutionService es=JbpmServiceFactory.getInstance().openExecutionService(user);   
  3.        HashMap vs=new HashMap();   
  4.       //一些参数   
  5.        vs.put(Constants.REQUEST_STATUS,String.valueOf(0));   
  6.        vs.put(Constants.REQUEST_RETURN_INFO,"No info!");   
  7.        vs.put(Constants.USER_NAME,EncodeTransfer.toISO(user));   
  8.        vs.put(Constants.REQUEST_DAYS,String.valueOf(rea.getDays()));   
  9.        try {   
  10.           //开启请假流程   
  11.            es.startProcessInstance(Constants.WORK_NAME, vs);   
  12.            log.info("["+user+"]"+"申请假期开始!请假"+rea.getDays()+"天!");   
  13.            return am.findForward("main");   
  14.        } catch (ExecutionException ex) {   
  15.            ex.printStackTrace();   
  16.            log.error("请假进程无法开始!");   
  17.            return am.findForward("error");   
  18.        }finally{   
  19.            es.close();   
  20.        }   

(二)当前执行任务
    对于部门经理或者老板,找到要处理的请假。
     

java 代码
  1. String actorId = (String) req.getSession().getAttribute(Constants.USER);   
  2.           if(actorId.equals("wang")){   
  3.               actorId="boss";   
  4.           }else if(actorId.equals("bigli")){   
  5.               actorId="chief";   
  6.           }   
  7.           // get the execution service   
  8.           ExecutionService executionService = JbpmServiceFactory.getInstance().   
  9.                                               openExecutionService(actorId);   
  10.   
  11.           // get the tasklist from jbpm for user   
  12.           List tasks = new ArrayList();   
  13.           // add the jbpm tasks   
  14.           tasks.addAll(executionService.getTaskList(actorId));   
  15.           // put the tasklist into the form   
  16.           mf.setTasks(tasks);   
  17.           // get the tasklist from jbpm for user   
  18.           List definitions = new ArrayList();   
  19.           // add the jbpm definitions   
  20.           definitions.addAll(executionService.getLatestDefinitions());   
  21.           // put the tasklist into the form   
  22.           mf.setRequests(definitions);   
  23.           // close the execution service   
  24.           executionService.close();   
  25.           req.getSession().setAttribute("mainForm",mf);   
  26.           log.debug("任务: " + tasks);   
  27.           log.debug("当前可以执行的请求: " + definitions);   

(三)处理请假
           

java 代码
  1. String actorId = (String) reqrest.getSession().getAttribute(Constants.   
  2.                     USER);   
  3.             Long tokenId=new Long(req.getParameter("tokenId"));   
  4.             // get the execution service   
  5.             ExecutionService executionService = JbpmServiceFactory.getInstance().   
  6.                                                 openExecutionService(actorId);   
  7.             Map hm=executionService.getVariables(tokenId);//变量   
  8.             String act=req.getParameter("action");//进行转换的transition   
  9.             executionService.endOfState(tokenId,hm,act);   
  10.             executionService.close();   

分享到:
评论

相关推荐

    activiti请假流程文件bpmn.xml和流程图

    这个压缩包包含的“activiti请假流程文件bpmn.xml”和“流程图”是理解Activiti如何实现请假流程的关键资料。 BPMN(Business Process Model and Notation)是一种标准化的语言,用于图形化地表示业务流程。在这个...

    简单的activiti请假流程

    这个“简单的activiti请假流程”项目是针对初学者或希望了解Activiti基本操作的一个实例,旨在展示如何在实际场景中部署、启动、执行和结束一个流程。 1. Activiti 概述: Activiti 是基于模型驱动的,采用BPMN ...

    请假流程 c#.net

    【描述】:“请假流程请假流程请假流程请假流程请假流程请假流程请假流程请假流程请假流程” 这段描述虽然重复,但可以理解为强调请假流程在企业管理中的重要性。请假流程通常是员工日常工作中必不可少的一部分,一...

    activiti 工作流实例-实现请假流程

    这个是Activiti开发的请假流程实例,可以作为用Activiti开发工作流的参考;项目采用spring+hibernate+strus2+activity开发,可以运行;数据库采用oracle,其中 QingJia 和 QingJiaHis 是自己的业务表,分别表示 请假...

    activiti实现请假流程

    在本案例中,“activiti实现请假流程”指的是利用 Activiti 开源插件创建了一个具体的应用场景,即员工请假流程的自动化管理。 Activiti 的核心功能包括: 1. **流程定义**:使用 BPMN 2.0 标准的图形化建模工具,...

    工作流(workflow)请假流程实例

    在这个“请假流程实例”中,我们将深入探讨如何通过工作流实现请假申请的自动化处理。 请假流程通常涉及以下几个关键步骤: 1. **请假申请**:员工在系统中发起请假申请,填写相关信息,如请假天数、原因等,并...

    C#.net 实现的请假流程

    在本项目中,"C#.net 实现的请假流程"是一个使用C#编程语言和.NET框架构建的应用程序,主要用于模拟并处理员工的请假申请。这个应用程序利用了Microsoft的Windows Workflow Foundation (WF) 技术,这是一个强大的...

    activiti5.9 请假流程例子 eclipse项目

    【标题】"activiti5.9 请假流程例子 eclipse项目" 在企业级应用开发中,工作流管理系统(Workflow Management System)扮演着至关重要的角色,它能够自动化和管理业务流程,提高工作效率。Activiti 是一个开源的...

    activity例子,含请假流程

    1. **请假流程**:在企业信息化管理中,请假流程是常见的业务流程之一。员工通过系统提交请假申请,经过部门经理审批,再到人力资源部门确认,最后系统自动更新员工的出勤记录。Activiti可以完美地实现这个流程,...

    jbpm4.4+s2sh请假流程例子

    【jbpm4.4+s2sh请假流程例子】是一个典型的结合了jbpm4.4工作流引擎和Struts2、Spring、Hibernate(S2SH)框架的实战项目,旨在演示如何在企业级应用中实现一个完整的请假流程。在这个例子中,jbpm4.4作为流程管理的...

    jbpm 请假流程定义发布项目

    **jbpm 请假流程定义发布项目** jbpm(Java Business Process Management)是一个开源的工作流管理系统,主要用于业务流程的建模、执行和管理。这个项目主要介绍如何使用jbpm来实现一个具体的请假流程,并且提供了...

    Excel模板员工请假流程图.zip

    《Excel模板员工请假流程图详解》 在企业管理中,流程图是一种有效的工具,它能清晰地展示业务流程,便于员工理解和执行。对于员工请假流程,一个精心设计的Excel模板可以大大提高工作效率,确保流程的规范性。本文...

    一个请假流程实例(JBPM项目)

    【标题】"一个请假流程实例(JBPM项目)"所涉及的知识点主要集中在企业流程管理和Java业务处理平台JBPM上。JBPM是一个开源的工作流管理系统,它允许开发者设计、执行和管理业务流程。在这个实例中,我们将探讨如何使用...

    jbpm3.2 简单的请假流程

    在本场景中,我们关注的是jbpm3.2版本的一个简单的请假流程示例。jbpm3.2是jbpm项目早期的一个稳定版本,它提供了一个强大的框架,允许开发者创建、部署和执行业务流程。 jbpm的请假流程示例通常会展示如何通过jbpm...

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子。带有文档教程和所有源码+JAR包。在网上找了半天jbpm6\jbpm7的资料,都很少。所以 环境:Myeclipse2015 JDK1.7 mysql 5.0 Struts2+Spring3.1 1...

    jbpm4 s2sh 请假流程

    【jbpm4 s2sh 请假流程】是一个基于jbpm工作流引擎和SSH(Struts2、Spring、Hibernate)框架的简单示例应用,用于演示如何在Java Web环境中实现一个请假流程。在这个教程中,我们将深入理解jbpm4的工作原理以及如何...

    我转一个请假流程实例的全部!及详细代码!很有代表性。

    标题中的“我转一个请假流程实例的全部!及详细代码!很有代表性。”表明这是一个关于请假流程的编程实例,其中包含了完整的代码实现。这个实例可能是为了展示如何在软件系统中设计和实现一个请假申请的业务流程,它...

    jbpm+S2SH请假流程经典实现及源码

    这个“jbpm+S2SH请假流程经典实现及源码”是一个实际的应用示例,它将jbpm的工作流引擎与S2SH框架集成,用于实现一个完整的请假流程管理。 首先,jbpm的核心功能包括流程建模、流程实例管理、任务管理和事件处理等...

    一个Jbpm员工请假流程的实例(源代码)

    在这个实例中,我们关注的是一个基于Jbpm实现的员工请假流程。这个流程涵盖了从申请到审批的整个过程,展示了Jbpm在实际业务场景中的应用。 首先,`.classpath`和`.project`是Eclipse IDE的配置文件,它们定义了...

    一个Jbpm员工请假流程的实例(doc)

    【Jbpm员工请假流程实例解析】 Jbpm是一个开源的工作流管理系统,它允许开发者创建、执行和管理业务流程。这个实例是针对Jbpm3.1版本设计的一个员工请假流程,由吴大愚编写的,旨在帮助用户理解如何利用Jbpm实现...

Global site tag (gtag.js) - Google Analytics