`
jetway
  • 浏览: 480264 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

一个简单的会签实例

    博客分类:
  • java
阅读更多
一个简单的会签实例

作者:tomkoo
以下例子中 采用了jbpm console 的几个实例用户

项目提交人 : ernie .

主管审批 : bert

会签 : ernie , bert , grover

老板审批 : grover

 

正常流程: 项目金额 >= 500W RMB

提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)

正常流程: 项目金额 < 500W RMB

提交项目 --> 主管审批 --> 会签 --> 审批通过(结束)

其中主管审批, 会签, 老板审批 , 不通过, 全部退回给项目提交人修改.

会签中: 所有人全通过, 则通过. 任何一人不通过, 停止其他会签任务.退回给提交人.

流程定义如下:

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process-definition xmlns="urn:jbpm.org:jpdl-3.1"  
  4.     name="tc_prj_approval">  
  5.   
  6.     <swimlane name="initiator" />  
  7.   
  8.     <!项目提交人 >  
  9.     <swimlane name="requester">  
  10.         <assignment expression="user(ernie)" />  
  11.     </swimlane>  
  12.   
  13.     <! 主管 >  
  14.     <swimlane name="chief">  
  15.         <assignment expression="user(bert)" />  
  16.     </swimlane>  
  17.   
  18.     <!老板 >  
  19.     <swimlane name="boss">  
  20.         <assignment expression="user(grover)" />  
  21.     </swimlane>  
  22.   
  23.     <!会签人 >  
  24.     <swimlane name="cosinger">  
  25.         <assignment class="net.chenj.jbpm.sample.CosingerAssiHandler">  
  26.         </assignment>  
  27.     </swimlane>  
  28.     <start-state name="start">  
  29.         <task name="tc_prj_newprj" swimlane="initiator"></task>  
  30.         <transition name="to_submit" to="tc_prj_submit"></transition>  
  31.     </start-state>  
  32.     <task-node name="tc_prj_submit">  
  33.         <task name="tc_prj_submit"></task>  
  34.         <transition name="to_chiefapprove" to="tc_prj_chiefapprove"></transition>  
  35.     </task-node>  
  36.     <task-node name="tc_prj_chiefapprove">  
  37.         <task name="tc_prj_chiefapprove"></task>  
  38.         <transition name="approve" to="tc_prj_countersign"></transition>  
  39.         <transition name="disapprove" to="tc_prj_submit"></transition>  
  40.     </task-node>  
  41.     <task-node name="tc_prj_countersign" signal="last-wait"  
  42.         create-tasks="false">  
  43.         <task name="tc_prj_countersign">  
  44.             <event type="task-end">  
  45.                 <action  
  46.                     class="net.chenj.jbpm.sample.TaskEndCountersign">  
  47.                 </action>  
  48.             </event>  
  49.   
  50.         </task>  
  51.   
  52.         <event type="node-enter">  
  53.             <action name="createInstance"  
  54.                 class="net.chenj.jbpm.sample.CreateTaskInstanceCountersign">  
  55.             </action>  
  56.         </event>  
  57.   
  58.         <transition name="approve" to="amount_decision"></transition>  
  59.         <transition name="disapprove" to="tc_prj_submit"></transition>  
  60.     </task-node>  
  61.     <decision name="amount_decision">  
  62.         <transition name="to_bossapprove" to="tc_prj_bossapprove"></transition>  
  63.         <transition name="to_end" to="end1"></transition>  
  64.     </decision>  
  65.     <task-node name="tc_prj_bossapprove">  
  66.         <task name="tc_prj_bossapprove"></task>  
  67.         <transition name="approve" to="end1"></transition>  
  68.         <transition name="disapprove" to="tc_prj_submit">  
  69.             <condition>#{amount >= 500}</condition>  
  70.         </transition>  
  71.     </task-node>  
  72.     <end-state name="end1"></end-state>  
  73. </process-definition>  
  74.   

<script></script>

 

会签swimlane class

 

  1. package net.chenj.jbpm.sample;   
  2.   
  3. import org.jbpm.graph.exe.*;   
  4. import org.jbpm.taskmgmt.def.*;   
  5. import org.jbpm.taskmgmt.exe.Assignable;   
  6.   
  7. public class CosingerAssiHandler implements AssignmentHandler {   
  8.   
  9.     private static final long serialVersionUID = 1L;   
  10.   
  11.     public void assign(Assignable assignable, ExecutionContext executionContext) {   
  12.         // 从数据库或者ldap 读取会签人设置   
  13.         String[] a = { "ernie""bert""grover" };   
  14.         assignable.setPooledActors(a);   
  15.     }   
  16.   
  17. }   
  18.   

<script></script>
创建会签任务实现类

 

 

  1. package net.chenj.jbpm.sample;   
  2.   
  3. import org.jbpm.graph.def.ActionHandler;   
  4. import org.jbpm.graph.exe.ExecutionContext;   
  5. import org.jbpm.graph.exe.Token;   
  6. import org.jbpm.graph.node.TaskNode;   
  7. import org.jbpm.taskmgmt.def.Task;   
  8. import org.jbpm.taskmgmt.exe.TaskMgmtInstance;   
  9.   
  10. public class CreateTaskInstanceCountersign implements ActionHandler {   
  11.   
  12.     private static final long serialVersionUID = 1L;   
  13.   
  14.     public void execute(ExecutionContext executionContext) throws Exception {   
  15.   
  16.         Token token = executionContext.getToken();   
  17.         TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();   
  18.         TaskNode taskNode = (TaskNode) executionContext.getNode();   
  19.         Task task = taskNode.getTask("tc_prj_countersign");   
  20.         // 从数据库或者ldap 读取会签人设置创建任务实例   
  21.         tmi.createTaskInstance(task, token).setActorId("ernie");   
  22.         tmi.createTaskInstance(task, token).setActorId("bert");   
  23.         tmi.createTaskInstance(task, token).setActorId("grover");   
  24.   
  25.     }   
  26.   
  27. }   

<script></script>

 

结束不通过时结束其他会签任务实现

  1. package net.chenj.jbpm.sample;   
  2.   
  3. import java.util.Collection;   
  4. import java.util.Iterator;   
  5. import org.jbpm.graph.def.ActionHandler;   
  6. import org.jbpm.graph.exe.ExecutionContext;   
  7. import org.jbpm.taskmgmt.exe.TaskInstance;   
  8. import org.jbpm.taskmgmt.exe.TaskMgmtInstance;   
  9.   
  10. public class TaskEndCountersign implements ActionHandler {   
  11.   
  12.     private static final long serialVersionUID = 1L;   
  13.   
  14.     public void execute(ExecutionContext executionContext) throws Exception {   
  15.   
  16.        
  17.         boolean isDisapprove = Boolean.valueOf((String) executionContext   
  18.                 .getVariable("isDisapprove"));   
  19.         // 如果有一个任务实例拒绝通过则结束除当前任务实例外其他任务实例   
  20.         if (isDisapprove) {   
  21.             TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();   
  22.             TaskInstance ti = executionContext.getTaskInstance();   
  23.             final String actorId = ti.getActorId();   
  24.             Collection c = tmi.getSignallingTasks(executionContext);   
  25.             for (Iterator it = c.iterator(); it.hasNext();) {   
  26.                 TaskInstance task = (TaskInstance) it.next();   
  27.                 if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {   
  28.                     task.end("disapprove");   
  29.                 }   
  30.             }   
  31.         }   
  32.   
  33.     }   
  34.   
  35. }   
分享到:
评论

相关推荐

    Activiti多实例任务实现会签

    【描述】"Activiti多实例任务实现会签"这一主题主要关注的是如何通过Activiti的工作流定义语言(BPMN 2.0)中的`user task`元素,结合`multi-instance`属性来创建一个需要多人签字的任务。这种任务的特点是,每个...

    一个利用WF4.0多书签模拟简单会签的例子

    1. **工作流设计**:首先,我们需要设计一个符合会签逻辑的工作流。这通常包括一系列顺序或并发的活动,每个活动代表一个参与者的审批步骤。在WF4.0中,可以通过设计工具如Visual Studio中的Workflow Designer来实现...

    jbpm4.3 会签的实现

    下面是一个简单的会签任务创建示例: ```java TaskService taskService = ... // 获取TaskService实例 Task task = taskService.createTask(); taskService.addCandidateUser(task.getId(), "user1"); taskService....

    JPBM 会签 示例

    JBPM 是一个开源的工作流管理系统,它允许开发者和业务分析师设计、部署和执行业务流程。会签,即多人参与并同意后才能继续流程的步骤,是流程管理中的重要环节,尤其在企业协作和审批流程中常见。 【描述】"简单的...

    UFLO是一款基于Spring的纯Java流程引擎,支持并行、动态并行、串行、会签等各种流转方式。.zip

    5. **会签**:会签是一种特殊的流转方式,需要多个参与者共同完成一个任务。在UFLO中,会签功能可以实现多人审批,确保决策的公正性和合理性,尤其适合于企业内部的审批流程。 6. **流程设计**:UFLO通常配备图形化...

    activity功能代码

    在IT行业中,Activity是BPM(Business Process Management)系统中的核心概念,它是业务流程中的一个操作或任务单元。在这个名为"activity功能代码"的压缩包中,我们可以推测它包含的是一些实现特定业务逻辑的代码,...

    飞龙工作流 FlowLong 真正的国产工作流引擎、json 格式实例模型、仿飞书钉钉审批流程设计器

    总的来说,飞龙工作流FlowLong是一款强大的国产工作流解决方案,结合了JSON的灵活性和易读性以及类似飞书钉钉的用户体验,为开发者和业务人员提供了一个高效、易用的流程管理平台。无论是流程设计、执行还是监控,...

    snakerflow工作流案例

    在这个“snakerflow工作流案例”中,我们将探讨如何将Snakerflow与Struts2和Spring框架相结合,创建一个高效、灵活的工作流应用。 首先,让我们了解一下Snakerflow的核心概念。Snakerflow基于模型驱动的设计思想,...

    jbpm4.4 简单请假流程

    - **工作流实例(Process Instance)**:流程定义在运行时的实体,每个实例代表一个具体的流程执行。 - **任务(Task)**:流程中的一个步骤,可以分配给一个或多个参与者执行。 - **节点(Node)**:流程图中的...

    JWFDv0.96开源工作流引擎设计

    JWFDv0.96是一个开源的工作流引擎设计,其核心目标是通过自定义的流程拓扑数学模型和一系列SQL-API原子操作函数,构建一个流程自动运行控制器。该控制器负责用户对流程实例的操控,使得流程自动化运行,减少了人为...

    camunda简介&实现简单审批流程文档

    1. **最简单的流程定义**:每个节点上只能设置一个审批人。 2. **并行审批**:审批节点上允许设置多个审批人,同一节点上的审批人并行审批。 3. **多实例会签/或签/比例签**:适用于需要多人参与的审批场景。 #### ...

    flowable 底层实现研究输出文档

    多实例是指在一个普通活动上添加额外的属性定义,使得活动可以执行多次。这种特性常用于实现会签功能。 **5.1.1.1 使用说明** 1. **多实例类型**:可以选择并行或顺序执行模式。 2. **基数(多实例)**:定义实例的...

    activiti5用户手册

    手册会通过实例讲解如何创建一个简单的请假申请流程,涉及任务分配、审批、会签等多个环节,以及如何使用Activiti的API和事件机制实现流程的控制和监控。 通过《Activiti5用户手册》,新手不仅可以理解Activiti的...

    Activiti5开发指南

    本指南将引导你如何搭建Activiti开发环境,并创建一个简单的Activiti项目。 首先,要搭建Activiti开发环境,你需要在Eclipse中安装Activiti插件。在Eclipse中点击“Add”,在Name选项中填写一个描述性名称,例如...

    JBPM4工作流应用开始指南.rar

    67 5.4 通过API删除已部署的流程 69 5.5 使用API发起新的流程实例 69 5.5.1 发起流程实例的常规方法 70 5.5.2 指定业务键发起流程实例 70 5.5.3 指定变量发起流程实例 71 5.6 唤醒一个等待状态的执行 71 5.7 任务...

    通达OA工作流设置,不会工作流的人可以下载

    通过拖拽和连接各个节点,如开始、结束、审批、会签等,可以直观地构建出符合组织需求的流程模型。每个节点都可配置特定的规则和条件,如审批人、审批意见、流转时间等。 2. **表单设计**:工作流通常与业务表单...

    superflow工作流平台v4.1-系统功能综合展示例子

    5. **审批流程**:对于需要审批的业务,SuperFlow支持多级审批和会签机制,确保每个环节的决策都得到充分考虑。审批人可以在系统内查看详细信息,进行在线审批,提高决策效率。 6. **报表与统计**:平台提供了丰富...

Global site tag (gtag.js) - Google Analytics