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

mac2024-12-28  21

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

更多精彩 第一时间直达

图例

环境

软件版本SpringBoot1.5.10activiti-spring-boot-starter-basic6.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<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery().processInstanceId(id).orderByHistoricActivityInstanceId().asc().list(); // 构造已执行的节点ID集合 List<String> executedActivityIdList = new ArrayList<String>(); for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { executedActivityIdList.add(activityInstance.getActivityId()); } // 获取bpmnModel BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); // 获取流程已发生流转的线ID集合 List<String> 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<String> getExecutedFlows(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstanceList) { List<String> 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<SequenceFlow> 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 <V, V1 extends V, V2 extends V> Map<String, V> toMap(String name1, V1 value1, String name2, V2 value2) { return populateMap(new HashMap<String, V>(), name1, value1, name2, value2); } @SuppressWarnings("unchecked") private static <K, V> Map<String, V> populateMap(Map<String, V> 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

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

最新回复(0)