activiti学习(二十八) |
您所在的位置:网站首页 › activiti完成任务 › activiti学习(二十八) |
概述
加签本质上就是让多实例任务增加一个处理任务和新增处理人。在业务流程中常有一种情况是,如果A审批,那么直接通过,如果是B审批,则还需要C审批才能通过。后一类情况就特别适合使用加签。另外在转他人处理的问题上,普通任务节点可以通过自由跳转到本节点实现,但多实例任务中这样处理会导致该任务节点所有处理人重新开始处理任务,所以多实例任务的转他人处理不适合用自由跳转,更适合通过加签去实现。 实现 串行多实例任务加签 直接上源码 import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.interceptor.Command; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.persistence.entity.ExecutionEntity; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.activiti.engine.impl.persistence.entity.TaskEntityManager; public class SequenceContersignCmd implements Command { private String taskId; private Map variables; public SequenceContersignCmd(String taskId, Map variables) { this.taskId = taskId; this.variables = variables; } public Object execute(CommandContext commandContext) { TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager(); TaskEntity taskEntity = taskEntityManager.findTaskById(taskId); ExecutionEntity executionEntity = taskEntity.getExecution(); //多实例任务总数加一 Integer nrOfInstances = (Integer)executionEntity.getVariable("nrOfInstances"); executionEntity.setVariable("nrOfInstances", nrOfInstances + 1); // 设置流程变量 executionEntity.setVariables(variables); return null; } }串行多实例的加签非常简单,只需要调整任务总数变量nrOfInstances加一即可。因为串行多实例任务每个时刻最多只会有一个活动实例,所以当前活动实例数恒定是一,nrOfActiveInstances不用变。执行这个命令类,即可 并行多实例加签 import java.util.Date; import java.util.Map; import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.activiti.engine.impl.interceptor.Command; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.persistence.entity.ExecutionEntity; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.activiti.engine.impl.persistence.entity.TaskEntityManager; public class ParallelContersign implements Command { private String taskId; private Map variables; public ParallelContersign(String taskId, Map variables) { this.taskId = taskId; this.variables = variables; } public Object execute(CommandContext commandContext) { ProcessEngineConfigurationImpl pec = commandContext.getProcessEngineConfiguration(); TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager(); TaskEntity taskEntity = taskEntityManager.findTaskById(taskId); ExecutionEntity executionEntity = taskEntity.getExecution(); // 设置流程变量 executionEntity.setVariables(variables); ExecutionEntity parentExecutionEntity = executionEntity.getParent(); ExecutionEntity newExecutionEntity = parentExecutionEntity.createExecution(); newExecutionEntity.setActive(true); newExecutionEntity.setConcurrent(true); newExecutionEntity.setScope(false); TaskEntity newTaskEntity = new TaskEntity(); newTaskEntity.setCreateTime(new Date()); newTaskEntity.setTaskDefinition(taskEntity.getTaskDefinition()); newTaskEntity.setProcessDefinitionId(taskEntity.getProcessDefinitionId()); newTaskEntity.setTaskDefinitionKey(taskEntity.getTaskDefinitionKey()); newTaskEntity.setProcessInstanceId(taskEntity.getProcessInstanceId()); newTaskEntity.setExecutionId(newExecutionEntity.getId()); newTaskEntity.setName(taskEntity.getName()); newTaskEntity.setId(pec.getIdGenerator().getNextId()); newTaskEntity.setExecution(newExecutionEntity); pec.getTaskService().saveTask(newTaskEntity); Integer nrOfInstances = (Integer)executionEntity.getVariable("nrOfInstances"); Integer nrOfActiveInstances = (Integer)executionEntity.getVariable("nrOfActiveInstances"); executionEntity.setVariable("nrOfInstances", nrOfInstances + 1); executionEntity.setVariable("nrOfActiveInstances", nrOfActiveInstances + 1); newExecutionEntity.setVariableLocal("loopCounter", nrOfInstances); return null; } } 并行多实例的加签复杂一些,主要是并行多实例任务需要我们手动新建execution和对应的task。24-25行获取当前taskId对应的execution,30行再获取其父execution。31-34行通过父execution创建子execution并为其设置属性。35-45行新建task并设置其属性,最后进行保存。49行增加任务总数变量nrOfInstances,50行增加活动实例数,51行设置execution的局部变量loopCounter,loopCounter变量其实就是类似一个index,作为多实例任务的序列号。 转他人处理 文章开头提到了转他人处理的问题。这里准备以实例进行说明如何通过加签实现转他人处理。 首先创建命令类TransferToOtherCmd.java import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import org.activiti.engine.TaskService; import org.activiti.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.interceptor.Command; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.persistence.entity.ExecutionEntity; import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.activiti.engine.impl.persistence.entity.TaskEntityManager; import org.activiti.engine.impl.pvm.process.ActivityImpl; public class TransferToOtherCmd implements Command { private String taskId; private Map variables; private String assignee; public TransferToOtherCmd(String taskId, Map variables, String assignee) { this.taskId = taskId; this.variables = variables; this.assignee = assignee; } public Object execute(CommandContext commandContext) { ProcessEngineConfigurationImpl pec = commandContext.getProcessEngineConfiguration(); TaskService taskService = pec.getTaskService(); TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager(); TaskEntity taskEntity = taskEntityManager.findTaskById(taskId); ExecutionEntity executionEntity = taskEntity.getExecution(); String processDefinitionId = executionEntity.getProcessDefinitionId(); ProcessDefinitionEntity processDefinitionEntity = Context.getProcessEngineConfiguration().getDeploymentManager() .findDeployedProcessDefinitionById(processDefinitionId); ActivityImpl curActivityImpl = processDefinitionEntity.findActivity(taskEntity.getName()); List assigneeList = (List) executionEntity.getVariable("assigneeList"); if (curActivityImpl.getActivityBehavior() instanceof SequentialMultiInstanceBehavior) { Integer nrOfInstances = (Integer) executionEntity.getVariable("nrOfInstances"); Integer loopCounter = (Integer) executionEntity.getVariable("loopCounter"); executionEntity.setVariableLocal("nrOfInstances", nrOfInstances + 1); List newAssigneeList = new ArrayList(); int i=0; for(; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |