zoukankan      html  css  js  c++  java
  • Activiti实现流程自由跳转

    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.TaskService;
    import org.activiti.engine.impl.RepositoryServiceImpl;
    import org.activiti.engine.impl.RuntimeServiceImpl;
    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.pvm.process.ActivityImpl;
    
    /**
     * Created by Administrator on 2016/11/11.
     */
    public class TaskFlowControlService {
        ProcessEngine _processEngine;
        private String _processId;
    
        public TaskFlowControlService(ProcessEngine processEngine, String processId)
        {
            this._processEngine = processEngine;
            this._processId = processId;
        }
    
        /**
         *  跳转至指定活动节点
         * @param targetTaskDefinitionKey
         */
        public void jump(String targetTaskDefinitionKey){
            TaskEntity currentTask = (TaskEntity)_processEngine.getTaskService()
                    .createTaskQuery()
                    .processInstanceId(_processId).singleResult();
            jump(currentTask,targetTaskDefinitionKey);
        }
    
        /**
         * @param currentTaskEntity 当前任务节点
         * @param targetTaskDefinitionKey  目标任务节点(在模型定义里面的节点名称)
         */
        private void jump(final TaskEntity currentTaskEntity, String targetTaskDefinitionKey){
            final ActivityImpl activity = getActivity(_processEngine,
                    currentTaskEntity.getProcessDefinitionId(),targetTaskDefinitionKey);
            final ExecutionEntity execution = (ExecutionEntity)_processEngine.getRuntimeService()
                    .createExecutionQuery().executionId(currentTaskEntity.getExecutionId()).singleResult();
            final TaskService taskService = _processEngine.getTaskService();
            ((RuntimeServiceImpl)_processEngine.getRuntimeService()).getCommandExecutor()
                    .execute(new Command<java.lang.Void>() {
                        public Void execute(CommandContext commandContext) {
    
                            //创建新任务
                            execution.setActivity(activity);
                            execution.executeActivity(activity);
    
                            //删除当前的任务
                            //不能删除当前正在执行的任务,所以要先清除掉关联
                            currentTaskEntity.setExecutionId(null);
                            taskService.saveTask(currentTaskEntity);
                            taskService.deleteTask(currentTaskEntity.getId(),true);
                            return null;
                        }
                    });
        }
    
        private ActivityImpl getActivity(ProcessEngine processEngine, String processDefId, String activityId)
        {
            ProcessDefinitionEntity pde = getProcessDefinition(processEngine, processDefId);
            return pde.findActivity(activityId);
        }
    
        private ProcessDefinitionEntity getProcessDefinition(ProcessEngine processEngine, String processDefId)
        {
            return (ProcessDefinitionEntity) ((RepositoryServiceImpl) processEngine.getRepositoryService())
                    .getDeployedProcessDefinition(processDefId);
        }
    }
  • 相关阅读:
    对每项物品,找出最贵价格的物品的经销商
    每项物品的的最高价格是多少?
    找出最贵物品的编号、销售商和价格
    查数据库有哪些表、查数据库
    取某字段不为空的数据is not null
    mysql匹配模式
    找出包含正好5个字符的名字
    要想找出正好包含5个字符的名字
    要想找出包含“w”的名字
    要想找出以“y”结尾的名字
  • 原文地址:https://www.cnblogs.com/mymelody/p/6054372.html
Copyright © 2011-2022 走看看