From 558b82a033ae1546f7ed6884a96c13108329d332 Mon Sep 17 00:00:00 2001 From: wanggeng <450292408@qq.com> Date: Fri, 24 Sep 2021 16:14:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=BF=90=E8=A1=8C=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E6=B5=81=E7=A8=8B=E5=9B=BE=E6=9F=A5=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../route/ActivitiRouteController.java | 11 +++- .../activiti/IActivitiModelService.java | 8 +++ .../impl/ActivitiModelServiceImpl.java | 58 +++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/route/ActivitiRouteController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/route/ActivitiRouteController.java index da1d8cf9..8b402451 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/route/ActivitiRouteController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/route/ActivitiRouteController.java @@ -47,7 +47,6 @@ public class ActivitiRouteController { return mv; } - @ApiOperation(value = "查看流程图", notes = "查看流程图接口") @ApiImplicitParams({ @ApiImplicitParam(name = "deploymentId", value = "流程部署ID", paramType = "path") @@ -58,4 +57,14 @@ public class ActivitiRouteController { activitiModelService.getProcessImage(response, deploymentId); } + @ApiOperation(value = "查看运行流程图", notes = "查看运行流程图接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "processInstanceId", value = "流程实例ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("get-runtime-process-image/{processInstanceId}") + public void getRuntimeProcessImage(HttpServletResponse response, @PathVariable("processInstanceId") String processInstanceId) { + activitiModelService.getRuntimeProcessImage(response, processInstanceId); + } + } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java index 5ea78f05..8a3b75e7 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java @@ -31,4 +31,12 @@ public interface IActivitiModelService { * @param deploymentId 部署ID */ void getProcessImage(HttpServletResponse response, String deploymentId); + + /** + * 查看运行流程图 + * + * @param response + * @param processInstanceId + */ + void getRuntimeProcessImage(HttpServletResponse response, String processInstanceId); } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java index 80abd55e..ac12b76f 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java @@ -10,9 +10,14 @@ import ink.wgink.module.activiti.service.activiti.IActivitiModelService; import ink.wgink.util.ResourceUtil; import org.activiti.bpmn.model.BpmnModel; import org.activiti.editor.constants.ModelDataJsonConstants; +import org.activiti.engine.HistoryService; +import org.activiti.engine.ProcessEngine; import org.activiti.engine.RepositoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.repository.Model; import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; import org.activiti.image.impl.DefaultProcessDiagramGenerator; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; @@ -24,6 +29,8 @@ import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.stream.Collectors; /** @@ -41,6 +48,12 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct @Autowired private RepositoryService repositoryService; + @Autowired + private RuntimeService runtimeService; + @Autowired + private HistoryService historyService; + @Autowired + private ProcessEngine processEngine; @Override public void saveModel(String modelId, String name, String description, String json_xml, String svg_xml) throws Exception { @@ -129,4 +142,49 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct throw new SystemException("流程图生成错误", e); } } + + @Override + public void getRuntimeProcessImage(HttpServletResponse response, String processInstanceId) { + response.setContentType("image/png"); + try (InputStream inputStream = getRuntimeProcessImageInputStream(processInstanceId); + OutputStream outputStream = response.getOutputStream(); + ) { + byte[] buf = new byte[1024]; + for (int size; (size = inputStream.read(buf)) != -1; ) { + outputStream.write(buf, 0, size); + } + outputStream.flush(); + } catch (IOException e) { + throw new SystemException("流程图生成错误", e); + } + } + + public InputStream getRuntimeProcessImageInputStream(String processInstanceId) { + //获得流程实例 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + String processDefinitionId = StringUtils.EMPTY; + if (processInstance == null) { + //查询已经结束的流程实例 + HistoricProcessInstance processInstanceHistory = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + if (processInstanceHistory == null) { + return null; + } else { + processDefinitionId = processInstanceHistory.getProcessDefinitionId(); + } + } else { + processDefinitionId = processInstance.getProcessDefinitionId(); + } + + //使用宋体 + String fontName = "宋体"; + //获取BPMN模型对象 + BpmnModel model = repositoryService.getBpmnModel(processDefinitionId); + //获取流程实例当前的节点,需要高亮显示 + List currentActs = Collections.EMPTY_LIST; + if (processInstance != null) { + currentActs = runtimeService.getActiveActivityIds(processInstance.getId()); + } + return processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator().generateDiagram(model, "png", currentActs, new ArrayList<>(), + fontName, fontName, fontName, null, 1D); + } }