ActRunningService.java 6.43 KB
Newer Older
mengmeng's avatar
mengmeng committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
package io.hmit.modules.activiti.service;

import io.hmit.common.constant.Constant;
import io.hmit.common.exception.ErrorCode;
import io.hmit.common.exception.HmitException;
import io.hmit.common.page.PageData;
import io.hmit.modules.activiti.dto.ProcessInstanceDTO;
import io.hmit.modules.activiti.dto.ProcessStartDTO;
import io.hmit.modules.security.user.SecurityUser;
import org.activiti.engine.IdentityService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 运行中的流程
 *
 * @author zsh 408538940@qq.com
 */
@Service
public class ActRunningService {

    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private IdentityService identityService;
    @Autowired
    protected RepositoryService repositoryService;

    /**
     * 流程定义列表
     */
    public PageData<Map<String, Object>> page(Map<String, Object> params) {

        String id = (String) params.get("id");
        String definitionKey = (String) params.get("definitionKey");

        //分页参数
        int curPage = 1;
        int limit = 10;
        if (params.get(Constant.PAGE) != null) {
            curPage = Integer.parseInt((String) params.get(Constant.PAGE));
        }
        if (params.get(Constant.LIMIT) != null) {
            limit = Integer.parseInt((String) params.get(Constant.LIMIT));
        }

        ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
        if (StringUtils.isNotBlank(id)) {
            processInstanceQuery.processInstanceId(id);
        }
        if (StringUtils.isNotBlank(definitionKey)) {
            processInstanceQuery.processDefinitionKey(definitionKey);
        }

        List<ProcessInstance> processInstanceList = processInstanceQuery.listPage((curPage - 1) * limit, limit);
        List<Map<String, Object>> objectList = new ArrayList<>();
        for (ProcessInstance processInstance : processInstanceList) {
            objectList.add(processInstanceConvert(processInstance));
        }
        return new PageData<>(objectList, (int) processInstanceQuery.count());
    }

    /**
     * 流程实例信息
     */
    private Map<String, Object> processInstanceConvert(ProcessInstance processInstance) {

        Map<String, Object> map = new HashMap<>(9);
        map.put("id", processInstance.getId());
        map.put("processInstanceId", processInstance.getProcessInstanceId());
        map.put("processDefinitionId", processInstance.getProcessDefinitionId());
        map.put("processDefinitionName", processInstance.getProcessDefinitionName());
        map.put("processDefinitionKey", processInstance.getProcessDefinitionKey());
        map.put("businessKey", processInstance.getBusinessKey());
        map.put("activityId", processInstance.getActivityId());

        ProcessDefinitionEntity definition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processInstance.getProcessDefinitionId());
        ActivityImpl activity = definition.findActivity(processInstance.getActivityId());
        map.put("activityName", activity.getProperty("name"));
        map.put("suspended", processInstance.isSuspended());

        return map;
    }

    /**
     * 删除实例
     *
     * @param id 实例ID
     */
    public void delete(String id) {

        runtimeService.deleteProcessInstance(id, null);
    }

    /**
     * 启动流程实例
     *
     * @param key 流程定义标识key
     */
    public ProcessInstanceDTO startProcess(String key) {

        String userId = SecurityUser.getUserId().toString();
        identityService.setAuthenticatedUserId(userId);
        ProcessDefinitionEntity definition = (ProcessDefinitionEntity) repositoryService.createProcessDefinitionQuery().processDefinitionKey(key).latestVersion().singleResult();
        if (definition.isSuspended()) {
            throw new HmitException(ErrorCode.PROCESS_START_ERROR);
        }
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key);
        ProcessInstanceDTO dto = new ProcessInstanceDTO();
        this.convertInstance(processInstance, dto);
        return dto;
    }

    private void convertInstance(ProcessInstance processInstance, ProcessInstanceDTO dto) {

        dto.setBusinessKey(processInstance.getBusinessKey());
        dto.setDeploymentId(processInstance.getDeploymentId());
        dto.setDescription(processInstance.getDescription());
        dto.setName(processInstance.getName());
        dto.setEnded(processInstance.isEnded());
        dto.setSuspended(processInstance.isSuspended());
        dto.setProcessDefinitionId(processInstance.getProcessDefinitionId());
        dto.setProcessDefinitionKey(processInstance.getProcessDefinitionKey());
        dto.setProcessDefinitionName(processInstance.getProcessDefinitionName());
        dto.setProcessDefinitionVersion(processInstance.getProcessDefinitionVersion());
        dto.setProcessInstanceId(processInstance.getProcessInstanceId());
    }

    /**
     * 根据流程Key,启动实例
     *
     * @param processStartDTO
     * @return
     */
    public ProcessInstanceDTO startOfBusinessKey(ProcessStartDTO processStartDTO) {

        String userId = SecurityUser.getUserId().toString();
        identityService.setAuthenticatedUserId(userId);
        ProcessDefinitionEntity definition = (ProcessDefinitionEntity) repositoryService.createProcessDefinitionQuery().processDefinitionKey(processStartDTO.getProcessDefinitionKey()).latestVersion().singleResult();
        if (definition.isSuspended()) {
            throw new HmitException(ErrorCode.PROCESS_START_ERROR);
        }
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processStartDTO.getProcessDefinitionKey(), processStartDTO.getBusinessKey(), processStartDTO.getVariables());
        ProcessInstanceDTO dto = new ProcessInstanceDTO();
        this.convertInstance(processInstance, dto);
        return dto;
    }
}