activiti 流程处理

pom配置:
<dependency>
  <groupId>org.activiti</groupId>
  <artifactId>activiti-spring-boot-starter</artifactId>
  <version>7.0.0.Beta1</version>
</dependency>
<dependency>
  <groupId>org.activiti</groupId>
  <artifactId>activiti-image-generator</artifactId>
  <version>7.1.0.M6</version>
</dependency>


工具类:
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.ExclusiveGateway;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;



/**
 * @功能描述: 流程业务处理
 */
@Service
public class ActService {

    public static final Integer PASS_VAL = 1;

    public static final Integer REJECT_VAL = 0;

    public static final String CONDITION = "pass";

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Autowired
    private HistoryService historyService;

    /**
     * @apiNote 功能描述 部署流程
     * @param file
     *            -流程文件
     * @param name
     *            - 流程名称
     * @return 返回流程部署ID和定义ID
     * @throws Exception
     */
    public BizActProcess deploy(MultipartFile file, String name) throws Exception {
        BizActProcess actProcess = new BizActProcess();
        Deployment deploy = repositoryService.createDeployment()
            .addBytes(UUID.randomUUID().toString() + ".bpmn", file.getBytes()).name(name).deploy();
        actProcess.setDeploymentid(deploy.getId());
        ProcessDefinition definition =
            repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
        actProcess.setDefid(definition.getId());
        return actProcess;
    }

    /**
     * @apiNote 功能描述 字符串形式部署流程
     * @param bpmninfo
     * @param name
     * @return
     * @throws Exception
     */
    public BizActProcess deployByBpmnInfo(String bpmninfo, String name) throws Exception {
        BizActProcess actProcess = new BizActProcess();
        Deployment deploy = repositoryService.createDeployment()
            .addBytes(UUID.randomUUID().toString() + ".bpmn", bpmninfo.getBytes()).name(name).deploy();
        actProcess.setDeploymentid(deploy.getId());
        ProcessDefinition definition =
            repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
        actProcess.setDefid(definition.getId());
        return actProcess;
    }

    /**
     * @apiNote 功能描述 启动流程实例
     * @param definitionId
     *            -流程定义ID
     * @param businessKey
     *            -业务表ID
     * @param variables
     *            -流程变量
     * @return 流程实例ID
     */
    public String startProcessInstance(String definitionId, String businessKey, Map<String, Object> variables) {
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(definitionId, businessKey, variables);
        return processInstance.getId();
    }

    /**
     * @apiNote 功能描述 当前用户审批通过
     * @param actid
     *            -流程实例ID
     * @param comment
     *            -批注
     */
    public void pass(String actid, String comment) {
        Task task = taskService.createTaskQuery().processInstanceId(actid)
            .taskAssignee(UserUtils.getUserId().toString()).singleResult();
        if (task != null) {
            if (StringUtils.isNotEmpty(comment)) {
                taskService.addComment(task.getId(), actid, comment);
            }
            taskService.setVariable(task.getId(), ActService.CONDITION, ActService.PASS_VAL);
            taskService.complete(task.getId());
        } else {
            throw new BizException("当前没有任务可操作");
        }
    }

    /**
     * @apiNote 功能描述 当前用户审批驳回
     * @param actid
     *            -流程实例ID
     * @param comment
     *            -流程批注
     */
    public void reject(String actid, String comment) {
        Task task = taskService.createTaskQuery().processInstanceId(actid)
            .taskAssignee(UserUtils.getUserId().toString()).singleResult();
        if (task != null) {
            if (StringUtils.isNotEmpty(comment)) {
                taskService.addComment(task.getId(), actid, comment);
            }
            taskService.setVariable(task.getId(), ActService.CONDITION, ActService.REJECT_VAL);
            taskService.complete(task.getId());
        } else {
            throw new BizException("当前没有任务可操作");
        }
    }

    /**
     * 功能描述 流程是否已完成
     */
    public boolean isFinish(String actid) {
        ProcessInstance processInstance =
            runtimeService.createProcessInstanceQuery().processInstanceId(actid).singleResult();
        if (processInstance == null) {
            return true;
        } else {
            return false;
        }
    }

    public List<Task> getActList(Long userId) {
        return taskService.createTaskQuery().taskAssignee(userId.toString()).list();
    }

    public void getHisList(Long userId, String deploymentid) {
        HistoricTaskInstanceQuery instanceQuery =
            historyService.createHistoricTaskInstanceQuery().taskAssignee(userId.toString());
        if (StringUtils.isNotEmpty(deploymentid)) {
            instanceQuery = instanceQuery.deploymentId(deploymentid);
        }
        List<HistoricTaskInstance> list = instanceQuery.list();
        for (HistoricTaskInstance historicTaskInstance : list) {
            System.out.println("ProcessInstanceId : " + historicTaskInstance.getProcessInstanceId());
        }
    }

    public Long getActCount(Long userId) {
        return taskService.createTaskQuery().taskAssignee(userId.toString()).count();
    }

    // 获取节点信息
    public void getFlowElementList(String definitionId) {
        BpmnModel model = repositoryService.getBpmnModel(definitionId);
        if (model != null) {
            Collection<FlowElement> flowElements = model.getMainProcess().getFlowElements();
            for (FlowElement e : flowElements) {
                if (e instanceof ExclusiveGateway) {
                    List<SequenceFlow> incomingFlows = ((ExclusiveGateway)e).getIncomingFlows();
                    List<SequenceFlow> outgoingFlows = ((ExclusiveGateway)e).getOutgoingFlows();
                    for (SequenceFlow incomingFlow : incomingFlows) {
                        FlowElement sourceFlowElement = incomingFlow.getSourceFlowElement();
                        if (sourceFlowElement instanceof UserTask) {
                            UserTask ut = (UserTask)sourceFlowElement;
                            String assignee = ut.getAssignee();
                            if (StringUtils.isNotEmpty(assignee)) {
                                assignee = assignee.replaceAll("\\$|\\{|\\}", "");
                            }
                            System.out.println(assignee);
                            System.out.println(sourceFlowElement.getClass() + " id: " + sourceFlowElement.getId()
                                + " name: " + sourceFlowElement.getName());
                        }
                    }

                    for (SequenceFlow outgoingFlow : outgoingFlows) {
                        // FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement();
                        System.out.println(outgoingFlow + " outgoingFlow name: " + outgoingFlow.getName());
                    }
                }

                // StartEvent UserTask EndEvent SequenceFlow ExclusiveGateway
                // System.out.println(e.getClass().toString() + " flowelement id: " + e.getId() + " name:" +
                // e.getName());
            }
        }
    }
}