package com.mossle.bpm.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import com.mossle.bpm.support.EdgeDTO;
import com.mossle.bpm.support.NodeDTO;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.EndEvent;
import org.activiti.bpmn.model.ExclusiveGateway;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.GraphicInfo;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.cmd.GetBpmnModelCmd;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class TraceService {
private static Logger logger = LoggerFactory.getLogger(TraceService.class);
private ProcessEngine processEngine;
public List<NodeDTO> traceProcessInstance(String processInstanceId) {
HistoricProcessInstance historicProcessInstance = processEngine
.getHistoryService().createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
GetBpmnModelCmd getBpmnModelCmd = new GetBpmnModelCmd(
historicProcessInstance.getProcessDefinitionId());
BpmnModel bpmnModel = processEngine.getManagementService()
.executeCommand(getBpmnModelCmd);
Map<String, GraphicInfo> graphicInfoMap = bpmnModel.getLocationMap();
List<NodeDTO> nodeDtos = new ArrayList<NodeDTO>();
for (Map.Entry<String, GraphicInfo> entry : graphicInfoMap.entrySet()) {
String key = entry.getKey();
GraphicInfo graphicInfo = entry.getValue();
nodeDtos.add(this.convertNodeDto(graphicInfo,
bpmnModel.getFlowElement(key), key, bpmnModel));
}
return nodeDtos;
}
public NodeDTO convertNodeDto(GraphicInfo graphicInfo,
FlowElement flowElement, String id, BpmnModel bpmnModel) {
NodeDTO nodeDto = new NodeDTO();
nodeDto.setX((int) graphicInfo.getX());
nodeDto.setY((int) graphicInfo.getY());
nodeDto.setWidth((int) graphicInfo.getWidth());
nodeDto.setHeight((int) graphicInfo.getHeight());
//
nodeDto.setId(id);
nodeDto.setName(flowElement.getName());
if (flowElement instanceof UserTask) {
nodeDto.setType("用户任务");
UserTask userTask = (UserTask) flowElement;
nodeDto.setAssignee(userTask.getAssignee());
} else if (flowElement instanceof StartEvent) {
nodeDto.setType("开始事件");
} else if (flowElement instanceof EndEvent) {
nodeDto.setType("结束事件");
} else if (flowElement instanceof ExclusiveGateway) {
nodeDto.setType("选择网关");
}
if (flowElement instanceof FlowNode) {
FlowNode flowNode = (FlowNode) flowElement;
for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
EdgeDTO edgeDto = new EdgeDTO();
edgeDto.setId(sequenceFlow.getTargetRef());
for (GraphicInfo flowGraphicInfo : bpmnModel
.getFlowLocationGraphicInfo(sequenceFlow.getId())) {
List<Integer> position = new ArrayList<Integer>();
position.add((int) flowGraphicInfo.getX()
- ((int) graphicInfo.getWidth() / 2));
position.add((int) flowGraphicInfo.getY()
- ((int) graphicInfo.getHeight() / 2));
edgeDto.getG().add(position);
}
edgeDto.getG().remove(0);
edgeDto.getG().remove(edgeDto.getG().size() - 1);
logger.debug("{}", edgeDto.getG());
nodeDto.getOutgoings().add(edgeDto);
}
}
return nodeDto;
}
@Resource
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
}