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;
}
}