Activiti开发案例之生成实时流程图

点击▲关注 “爪哇笔记”   给公众号标星置顶

更多精彩 第一时间直达Activiti开发案例之生成实时流程图_第1张图片

图例

Activiti开发案例之生成实时流程图_第2张图片

环境

软件 版本
SpringBoot 1.5.10
activiti-spring-boot-starter-basic 6.0

生成代码

以下是简化代码:

    /**	
     * 查看实例流程图,根据流程实例ID获取流程图	
     */	
    @RequestMapping(value="traceprocess/{instanceId}",method=RequestMethod.GET)	
    public void traceprocess(HttpServletResponse response,@PathVariable("instanceId")String instanceId) throws Exception{	
        InputStream in = flowUtils.getResourceDiagramInputStream(instanceId);	
        ServletOutputStream output = response.getOutputStream();	
        IOUtils.copy(in, output);	
    }

Flow 工具类:

/**	
 * Flow 工具类	
 * @author 小柒2012	
 */	
@Component	
public class FlowUtils {	
    @Autowired	
    RuntimeService runservice;	
    @Autowired	
    private HistoryService historyService;	
    @Autowired	
    private RepositoryService repositoryService;	
    @Autowired	
    private ProcessEngineFactoryBean processEngine;	
    /**	
     * 获取历史节点流程图	
     * @param id	
     * @return	
     */	
    public  InputStream getResourceDiagramInputStream(String id) {	
        try {	
            // 获取历史流程实例	
            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult();	
            // 获取流程中已经执行的节点,按照执行先后顺序排序	
            List historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery().processInstanceId(id).orderByHistoricActivityInstanceId().asc().list();	
            // 构造已执行的节点ID集合	
            List executedActivityIdList = new ArrayList();	
            for (HistoricActivityInstance activityInstance : historicActivityInstanceList) {	
                executedActivityIdList.add(activityInstance.getActivityId());	
            }	
            // 获取bpmnModel	
            BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());	
            // 获取流程已发生流转的线ID集合	
            List flowIds = this.getExecutedFlows(bpmnModel, historicActivityInstanceList);	
            // 使用默认配置获得流程图表生成器,并生成追踪图片字符流	
            ProcessDiagramGenerator processDiagramGenerator = processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator();	
            //你也可以 new 一个	
            //DefaultProcessDiagramGenerator processDiagramGenerator = new DefaultProcessDiagramGenerator();	
            InputStream imageStream = processDiagramGenerator.generateDiagram(bpmnModel, "png", executedActivityIdList, flowIds, "宋体", "微软雅黑", "黑体", null, 2.0);	
            return imageStream;	
        } catch (Exception e) {	
            e.printStackTrace();	
            return null;	
        }	
    }	
private List getExecutedFlows(BpmnModel bpmnModel,	
                                              List historicActivityInstanceList) {	
        List executedFlowIdList = new ArrayList<>();	
        for (int i = 0; i < historicActivityInstanceList.size() - 1; i++) {	
            HistoricActivityInstance hai = historicActivityInstanceList.get(i);	
            FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(hai.getActivityId());	
            List sequenceFlows = flowNode.getOutgoingFlows();	
            if (sequenceFlows.size() > 1) {	
                HistoricActivityInstance nextHai = historicActivityInstanceList.get(i + 1);	
                sequenceFlows.forEach(sequenceFlow -> {	
                    if (sequenceFlow.getTargetFlowElement().getId().equals(nextHai.getActivityId())) {	
                        executedFlowIdList.add(sequenceFlow.getId());	
                    }	
                });	
            } else if (sequenceFlows.size() == 1) {	
                executedFlowIdList.add(sequenceFlows.get(0).getId());	
            }	
        }	
        return executedFlowIdList;	
    }

UtilMisc 工具类:

public class UtilMisc {	
    public static  Map toMap(String name1, V1 value1, String name2, V2 value2) {	
        return populateMap(new HashMap(), name1, value1, name2, value2);	
    }	
    @SuppressWarnings("unchecked")	
    private static  Map populateMap(Map map, Object... data) {	
        for (int i = 0; i < data.length;) {	
            map.put((String) data[i++], (V) data[i++]);	
        }	
        return map;	
    }	
}

工作流枚举类:

/**	
 * 工作流枚举类	
 * @author 小柒2012	
 */	
public enum BpmsActivityTypeEnum {	
    START_EVENT("startEvent", "开始事件"),	
    END_EVENT("endEvent", "结束事件"),	
    USER_TASK("userTask", "用户任务"),	
    EXCLUSIVE_GATEWAY("exclusiveGateway", "排他网关"),	
    PARALLEL_GATEWAY("parallelGateway", "并行网关"),	
    INCLUSIVE_GATEWAY("inclusiveGateway", "包含网关");	
    private String type;	
    private String name;	
    private BpmsActivityTypeEnum(String type, String name) {	
        this.type = type;	
        this.name = name;	
    }	
    public String getType() {	
        return type;	
    }	
    public void setType(String type) {	
        this.type = type;	
    }	
    public String getName() {	
        return name;	
    }	
    public void setName(String name) {	
        this.name = name;	
    }	
}

浏览器直接发送以下格式请求,就可以查看实时流程图:

# traceprocess 后面追加流程ID	
http://localhost:8080/traceprocess/20190214

640?wx_fmt=jpeg

▲一个有温度的公众号,期待与你一起进步

你可能感兴趣的:(Activiti开发案例之生成实时流程图)