`
antivir
  • 浏览: 96575 次
  • 来自: ...
社区版块
存档分类
最新评论

会签实现

    博客分类:
  • jbpm
阅读更多

转载自http://tomkoo.iteye.com/blog/34204

JBPM流程通过Aciton动态创建TaskInstance来实现“会签”(续)

关键字: JBPM 会签 会办 Task TaskInstance

前面写过一篇文章《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》,不过那篇文章可以说是一个大体思路的简单实现,并不完整,也有不少朋友提出了不少的问题。因为做事要善始善终,所以再次贴出这一主题,把会签进行到底。

参考文章:
JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)

第一步还是给出一个新的ProcessDefinition.xml流程定义文件:

Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2.   
  3. <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="资金归集">   
  4.   
  5.     <start-state name="启动">   
  6.         <transition name="" to="制单"></transition>   
  7.     </start-state>   
  8.   
  9.     <task-node name="制单">   
  10.         <task name="制单">   
  11.             <assignment actor-id="#{processStarter}"></assignment>   
  12.         </task>   
  13.         <transition name="送复核" to="复核"></transition>   
  14.     </task-node>   
  15.   
  16.     <task-node name="复核">   
  17.         <task name="复核">   
  18.             <assignment class="com.sky.plugin.jbpm.def.ActorsHandel">   
  19.             </assignment>   
  20.         </task>   
  21.         <transition name="拒绝复核" to="制单"></transition>   
  22.         <transition name="提交审批" to="审批"></transition>   
  23.     </task-node>   
  24.   
  25.     <task-node name="审批" signal="last-wait" create-tasks="false" end-tasks="true">   
  26.         <task name="审批">   
  27.   
  28.         </task>   
  29.         <event type="node-enter">   
  30.             <action name="createInstance"  
  31.                 class="com.sky.plugin.jbpm.def.DynamicCreateTaskInstance">   
  32.             </action>   
  33.         </event>   
  34.   
  35.         <event type="task-end">   
  36.             <action name="createInstance"  
  37.                 class="com.sky.plugin.jbpm.def.ConuntersignActionHandler">   
  38.             </action>   
  39.         </event>   
  40.   
  41.         <transition name="同意" to="结束">   
  42.             <action name="createInstance"  
  43.                 class="com.sky.plugin.jbpm.def.TestActionHandel">   
  44.             </action>   
  45.         </transition>   
  46.         <transition name="拒绝到复核人" to="复核"></transition>   
  47.     </task-node>   
  48.   
  49.     <end-state name="结束"></end-state>   
  50.   
  51.   
  52. </process-definition>  
<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="资金归集">

	<start-state name="启动">
		<transition name="" to="制单"></transition>
	</start-state>

	<task-node name="制单">
		<task name="制单">
			<assignment actor-id="#{processStarter}"></assignment>
		</task>
		<transition name="送复核" to="复核"></transition>
	</task-node>

	<task-node name="复核">
		<task name="复核">
			<assignment class="com.sky.plugin.jbpm.def.ActorsHandel">
			</assignment>
		</task>
		<transition name="拒绝复核" to="制单"></transition>
		<transition name="提交审批" to="审批"></transition>
	</task-node>

	<task-node name="审批" signal="last-wait" create-tasks="false" end-tasks="true">
		<task name="审批">

		</task>
		<event type="node-enter">
			<action name="createInstance"
				class="com.sky.plugin.jbpm.def.DynamicCreateTaskInstance">
			</action>
		</event>

		<event type="task-end">
			<action name="createInstance"
				class="com.sky.plugin.jbpm.def.ConuntersignActionHandler">
			</action>
		</event>

		<transition name="同意" to="结束">
			<action name="createInstance"
				class="com.sky.plugin.jbpm.def.TestActionHandel">
			</action>
		</transition>
		<transition name="拒绝到复核人" to="复核"></transition>
	</task-node>

	<end-state name="结束"></end-state>


</process-definition>


这里除了“文章1”说到要注意的地方外,还要注意的两个地方是:


    1. <event type="node-enter">
    进入流程节点的时候,执行ActionHandler类com.sky.plugin.jbpm.def.DynamicCreateTaskInstance,用来动态生成TaskInstance。
    2. <event type="task-end">
    Task结束的时候调用com.sky.plugin.jbpm.def.ConuntersignActionHandler进行会签处理。判断会签路径来决定会签的执行和走向。


com.sky.plugin.jbpm.def.DynamicCreateTaskInstance
Java代码 复制代码
  1. public class DynamicCreateTaskInstance implements ActionHandler {   
  2.        
  3.     private static final long serialVersionUID = 1L;   
  4.   
  5.     public void execute(ExecutionContext context) throws Exception {   
  6.            
  7.         ProcessDefinition processDefinition = context.getProcessDefinition();   
  8.   
  9.         TaskNode taskNode = (TaskNode) context.getNode();   
  10.         Task task = (Task)taskNode.getTasks().iterator().next();   
  11.   
  12.         Long processDefinitionId = processDefinition.getId();   
  13.         Long taskId = task.getId();   
  14.            
  15.         Token token = context.getToken();   
  16.         TaskMgmtInstance tmi = context.getTaskMgmtInstance();   
  17.            
  18.         //获取自定义的进行会签的人员   
  19.         ServiceFactory serviceFactory = ServiceFactory.getInstance();   
  20.         ProcessService ps = serviceFactory.getProcessService();   
  21.         String[] actors = ps.loadTaskActors(processDefinitionId, taskId);   
  22.            
  23.         //根据会签人员,每人创建一个TaskInstance   
  24.         for(String actor : actors){   
  25.             tmi.createTaskInstance(task, token).setActorId(actor);   
  26.         }   
  27.     }   
  28. }  
public class DynamicCreateTaskInstance implements ActionHandler {
	
	private static final long serialVersionUID = 1L;

	public void execute(ExecutionContext context) throws Exception {
		
		ProcessDefinition processDefinition = context.getProcessDefinition();

		TaskNode taskNode = (TaskNode) context.getNode();
		Task task = (Task)taskNode.getTasks().iterator().next();

		Long processDefinitionId = processDefinition.getId();
		Long taskId = task.getId();
		
		Token token = context.getToken();
		TaskMgmtInstance tmi = context.getTaskMgmtInstance();
		
		//获取自定义的进行会签的人员
		ServiceFactory serviceFactory = ServiceFactory.getInstance();
		ProcessService ps = serviceFactory.getProcessService();
		String[] actors = ps.loadTaskActors(processDefinitionId, taskId);
		
		//根据会签人员,每人创建一个TaskInstance
		for(String actor : actors){
			tmi.createTaskInstance(task, token).setActorId(actor);
		}
	}
}


com.sky.plugin.jbpm.def.ConuntersignActionHandler
Java代码 复制代码
  1. public class ConuntersignActionHandler implements ActionHandler {   
  2.   
  3.     private static final long serialVersionUID = 1L;   
  4.   
  5.     @SuppressWarnings("unchecked")   
  6.     public void execute(ExecutionContext context) throws Exception {   
  7.   
  8.         Token token = context.getToken();   
  9.   
  10.         TaskMgmtInstance tmi = context.getTaskMgmtInstance();   
  11.   
  12.         Collection<TaskInstance> unfinishedTasks = tmi   
  13.                 .getUnfinishedTasks(token);   
  14.   
  15.         Object variable = context.getVariable("selectedTransition");   
  16.         String selectedTransition;   
  17.         if (variable == null) {   
  18.             throw new RuntimeException(   
  19.                     "Jbpm transition error: user selected transition is null!");   
  20.         } else {   
  21.             // 获取当前TaskInstance选择的路径   
  22.             selectedTransition = variable.toString();   
  23.         }   
  24.   
  25.         // 如果用户选择的路径是流程定义中制定的不通过的路径,则自动完成余下所有的会签Task并转到相应路径   
  26.         if (selectedTransition.equals("拒绝到复核人")) {   
  27.             for (TaskInstance unfinishedTaskInstance : unfinishedTasks) {   
  28.                 // 把被结束的没有完成的TaskInstance的ActorId改为automatic complete   
  29.                 if (!unfinishedTaskInstance.hasEnded()) {   
  30.                     unfinishedTaskInstance.setActorId("automatic complete");   
  31.                     unfinishedTaskInstance.end("拒绝到复核人");   
  32.                 }   
  33.             }   
  34.         }   
  35.     }   
  36.   
  37. }  
public class ConuntersignActionHandler implements ActionHandler {

	private static final long serialVersionUID = 1L;

	@SuppressWarnings("unchecked")
	public void execute(ExecutionContext context) throws Exception {

		Token token = context.getToken();

		TaskMgmtInstance tmi = context.getTaskMgmtInstance();

		Collection<TaskInstance> unfinishedTasks = tmi
				.getUnfinishedTasks(token);

		Object variable = context.getVariable("selectedTransition");
		String selectedTransition;
		if (variable == null) {
			throw new RuntimeException(
					"Jbpm transition error: user selected transition is null!");
		} else {
			// 获取当前TaskInstance选择的路径
			selectedTransition = variable.toString();
		}

		// 如果用户选择的路径是流程定义中制定的不通过的路径,则自动完成余下所有的会签Task并转到相应路径
		if (selectedTransition.equals("拒绝到复核人")) {
			for (TaskInstance unfinishedTaskInstance : unfinishedTasks) {
				// 把被结束的没有完成的TaskInstance的ActorId改为automatic complete
				if (!unfinishedTaskInstance.hasEnded()) {
					unfinishedTaskInstance.setActorId("automatic complete");
					unfinishedTaskInstance.end("拒绝到复核人");
				}
			}
		}
	}

}


这个类对于会签是至关重要的,要通过这个Action来判断会签的情况。在这个Action中有这样几句代码:
Java代码 复制代码
  1. Object variable = context.getVariable("selectedTransition");   
  2.         String selectedTransition;   
  3.         if (variable == null) {   
  4.             throw new RuntimeException(   
  5.                     "Jbpm transition error: user selected transition is null!");   
  6.         } else {   
  7.             // 获取当前TaskInstance选择的路径   
  8.             selectedTransition = variable.toString();   
  9.         }  
Object variable = context.getVariable("selectedTransition");
		String selectedTransition;
		if (variable == null) {
			throw new RuntimeException(
					"Jbpm transition error: user selected transition is null!");
		} else {
			// 获取当前TaskInstance选择的路径
			selectedTransition = variable.toString();
		}

其中的selectedTransition是用户选择的路径,也就是通过这个来判断会签的用户选择了“同意”或者“拒绝到复核人”,你可以通过流程变量的形式来保存。

如果“同意”,则继续下去,直到该TaskNode中所有的TaskInstance完成以后,通过会签,继续下去,如果选择“拒绝到复核人”,则会自动完成余下的所有TaskInstance,然后转到Transition“拒绝到复核人”,会签不通过。
其中有一句,设置所有自动完成的TaskInstance的Actor为“automatic complete”,这个可以解决在“以办事务”中出现自动完成的任务(TaskInstance)
Java代码 复制代码
  1. unfinishedTaskInstance.setActorId("automatic complete");  
unfinishedTaskInstance.setActorId("automatic complete");


到这里整个会签的实现都在这里了,行文有点乱。哈哈!

 

分享到:
评论
1 楼 yuyanshan 2008-08-06  
你好,我也是这们做的不,不过我还不明白怎么处理任务,我是这样想的:
TaskInstance ti = jbpmContext.getTaskInstance(Long.parseLong(taskId));
		if("yes".equals(result)) {
			ti.setVariable("isDisapprove", true);
		} 
		if("no".equals(result)) {
			ti.setVariable("isDisapprove", false);
		}
		ti.end();


但是当程序运行到ti.end()的时个它就把无法取得当前令牌的锁,你知道这是什么原因吗?

相关推荐

    Activiti多实例任务实现会签

    【标题】"Activiti多实例任务实现会签"是指在Activiti工作流引擎中,如何配置和使用多实例任务来实现会签功能。在企业级应用中,会签常常用于决策过程,要求多个参与者共同审批,只有当所有参与者都完成审批后,流程...

    JBPM4.4会签实例

    通过学习"CountersignDemo"这个实例,你可以深入了解JBPM4.4的会签实现,包括如何设计流程、创建自定义活动、编写工具类以及如何在实际应用中部署和使用。这将有助于提升你对业务流程管理的理解,使你能更好地为企业...

    Activiti-5.4中实现会签

    下面我们将详细探讨如何在Activiti-5.4中实现会签以及相关的技术细节。 首先,理解会签的概念。在工作流中,会签是指一个任务可以被分配给多个用户或组,每个参与者都可以独立完成任务,而无需等待其他人的操作。在...

    osworkflow dynamic split 动态会签的实现

    本文将深入探讨如何在OSWorkflow中实现动态会签功能,这是一种在多个参与者之间灵活分配任务的关键特性。 OSWorkflow是由OpenSymphony团队开发的,它提供了一个基于Java的API,使得开发者可以轻松地在应用中集成...

    jbpm4.3 会签的实现

    【jbpm4.3 会签的实现】 在企业级工作流管理系统中,会签(Concurrence Signature)是一种常见的审批流程模式,它允许多个审批人同时参与同一个任务的处理,只有当所有指定的审批人都完成他们的操作后,任务才会被...

    Activiti实现会签功能程序Demo.docx

    在Activiti工作流引擎中,会签功能是通过多实例任务(Multi-instance Task)来实现的。这使得流程能够根据特定的规则分配给多个参与者,且这些参与者可以同时进行处理。 **会签类型** 1. **按数量通过**:当参与...

    activiti 会签投票统计

    综上所述,这个主题深入探讨了如何利用 Activiti 的会签功能和自定义组件来实现投票统计和结束条件控制,展示了 Activiti 在复杂业务场景中的灵活性和可扩展性。在实际应用中,开发者可以参考这些组件和流程设计,...

    BPM流程会签开发参考

    2. **工作流引擎**:会签功能的实现离不开工作流引擎的支持,如Activiti、Camunda等。这些引擎能够解析流程定义模型,并根据业务逻辑驱动流程实例的执行。 3. **参与者分配**:确定谁参与会签至关重要。可以基于...

    jBPM4.4 会签,用custom实现(带加签、减签功能)

    在实现会签时,我们可以创建一个custom节点,然后在其中编写Java代码或者使用脚本来处理会签逻辑,包括分配任务给审批人、处理审批结果以及根据需要进行加签或减签操作。 加签功能是在流程运行过程中,根据业务需求...

    工作流开发会签两套方案(Java源代码实现)

    本主题聚焦于"工作流开发会签两套方案(Java源代码实现)",我们将深入探讨两种Java实现会签功能的方法,并结合JBPM(Java Business Process Management)框架,为你揭示如何高效地构建这样的系统。 首先,我们需要...

    jBPM4.4 会签(带加签、减签功能)

    本文将深入探讨如何在jbPM中实现会签以及加签、减签功能,并提供相关实践指导。 1. **会签概念与实现** 会签是指在流程中设置一个环节,需要多个参与者依次或同时进行审批。jbPM通过定义工作流模型,利用task节点...

    【专题讲解】工作流引擎会签,加签,主持人,组长模式专题讲解.docx

    【专题讲解】工作流引擎会签,加签,主持人,组长模式专题讲解 工作流引擎在企业管理和自动化流程中扮演着重要角色...通过这些特性,ccflow致力于打造最易用的工作流引擎,服务于社会,实现流程管理的便捷化和自动化。

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

    通过分析这个文件,开发者可以深入理解如何在实际项目中应用WF4.0的多书签功能来实现会签流程。 总之,WF4.0的多书签机制为创建复杂的、协作式的业务流程提供了强大的工具。通过理解和掌握这些知识点,开发者能够...

    会签系统 asp.net源码

    在本案例中,"BN156-会签系统"是一个使用ASP.NET技术实现的会签流程管理系统,主要用于企业或组织内部的文档审批、流程协作等场景。 1. **会签系统概念** 会签系统是指一种工作流管理系统,它允许多个审批者按照...

    jbpm工作流(会签,串签)

    在本教程中,我们将深入探讨jbpm中的会签和串签功能,以及如何进行流程部署、启动流程、任务提交、查询已办和待办任务。 首先,让我们了解流程部署的概念。在jbpm中,流程部署是将一个流程定义文件(通常是.bpmn或....

    activiti学习-使用activiti多实例任务实现会签

    ### Activiti多实例任务实现会签功能详解 #### 一、多实例用户任务的基本概念与配置 Activiti是一个开源的工作流引擎,它提供了一种灵活的方式来定义业务流程,并且能够支持复杂的业务逻辑处理。其中,多实例任务...

Global site tag (gtag.js) - Google Analytics