会签实现

转载自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");


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

 

你可能感兴趣的:(xml,Blog,jbpm)