Flowable中查看当前流程图已到达节点(包含路径),前后端实现

16 篇文章 1 订阅
14 篇文章 0 订阅
该博客介绍了一种后端通过任务ID获取流程审批图,并转换为Base64编码发送给前端展示的方法。后端使用Activiti工作流引擎,通过查询历史和运行时实例来获取流程信息,然后生成流程图并进行Base64编码。前端接收到编码后的图片数据,将其显示在页面上,实现了审批流程的实时跟踪。
摘要由CSDN通过智能技术生成

1、后端直接传入任务的ID

 /**
     * 查看当前流程图已到达节点(包含路径)
     */
    public String genProcessDiagrams(@RequestParam String taskId, HttpServletResponse httpServletResponse) throws IOException {
        String processId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();
        ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
        HistoricProcessInstance his = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult();
        String pdi="";
        //流程走完的不显示图
        if (pi == null) {
            pdi=his.getProcessDefinitionId();
        }else {
            pdi=pi.getProcessDefinitionId();
        }
        if(pdi==""){
            return null;
        }
        //获得活动的节点
        List<HistoricActivityInstance> historyProcess =  historyService.createHistoricActivityInstanceQuery().processInstanceId(processId).orderByHistoricActivityInstanceStartTime().asc().list();
        List<String> activityIds = new ArrayList<>();
        List<String> flows = new ArrayList<>();
        //获取流程图
        BpmnModel bpmnModel = repositoryService.getBpmnModel(pdi);
        for (HistoricActivityInstance hi : historyProcess) {
            String activityType = hi.getActivityType();
            if (activityType.equals("sequenceFlow") || activityType.equals("exclusiveGateway")) {
                flows.add(hi.getActivityId());
            } else if (activityType.equals("userTask") || activityType.equals("startEvent")) {
                activityIds.add(hi.getActivityId());
            }
        }
        List<Task> tasks = taskService.createTaskQuery().processInstanceId(processId).list();
        for (Task task : tasks) {
            activityIds.add(task.getTaskDefinitionKey());
        }
        ProcessEngineConfiguration engConf = processEngine.getProcessEngineConfiguration();
        engConf.setActivityFontName("宋体");
        engConf.setLabelFontName("宋体");
        engConf.setAnnotationFontName("宋体");
        //定义流程画布生成器
        ProcessDiagramGenerator processDiagramGenerator = engConf.getProcessDiagramGenerator();
        InputStream in = processDiagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, engConf.getActivityFontName()
                , engConf.getLabelFontName(), engConf.getAnnotationFontName(), engConf.getClassLoader(), 1.0, true);

        // 设置响应的类型格式为图片格式
        httpServletResponse.setContentType("image/png");
        //禁止图像缓存。
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setHeader("Cache-Control", "no-cache");
        httpServletResponse.setDateHeader("Expires", 0);

        String base64Img = null;
        try {
            // in.available()返回文件的字节长度
            byte[] buf = new byte[in.available()];
            // 将文件中的内容读入到数组中
            in.read(buf);
            // 进行Base64编码处理
            base64Img = new String(Base64Utils.encode(buf), StandardCharsets.UTF_8);
        }catch (IOException e){
            e.printStackTrace();
        } finally {
            if (in != null) {
                in.close();
            }
        }
        return base64Img;
    }

2、前端实现


 <div id="content36">
            <BoxHead title="流程审批跟踪" />
            <div style="text-align: center">
                <img :src="imgSrc" />
            </div>
        </div>
// 获取审批图
        genProcessDiagrams() {
            genProcessDiagramsApi({ taskId: this.taskIds })
                .then((res) => {
                    this.imgSrc = "data:image/png;base64," + res.data;
                })
                .catch((err) => {
                    if (+err.status === -1) {
                        this.handleMessage(err.statusText);
                    }
                });
        },
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值