Flowable-简单应用

Flowable简单的应用终于写好了,对于大致的功能也有了一定的了解,虽然在真实的项目应用中使用的话
还需要进行改进,但是这里还是先写个总结记录一下大致的流程,不足之处后期再来填坑吧。

一.前期准备工作

  1. Flowable提供的流程绘制服务

3.在flowable的流程化绘制服务内绘制流程图,我简单绘制了一个,如下所示:

然后把绘制到的流程下载到本地,并放到processes文件夹下,下面简单说一下这个文件:


  • process 对应的是这个流程整体,id一般在查询的时候作为taskKey使用,name并不是属于flowable的属性,
    主要是为了展示使用的
  • startEvent 这是使用了一个空的开始,还有一些定时的开始,大家有需要可以去了解一下
  • userTask 用户任务,第一个usertask的flowable:assignee是用来接收我们传入的参数的,这里第二个usertask
    添加了一个listener,是在开始执行这个模块的时候触发的,大家可以根据自己的需求去设置执行的时机。listener
    的类必须实现ExecutionListener,主要是针对流程的监听。还有一个TaskListener接口,主要是针对task的监听,
    大家有需要的也可以去了解一下。
  • sequenceFlow 连线,连接两个步骤,sourceRef开始,targetRef目标,conditionExpression执行的判断的表达式
  • exclusiveGateway 排他网关
  • endEvent 结束
    4.简单的操作
    创建流程
void createTask(){
        HashMap<String,Object> map=new HashMap<>();
        map.put("beginTaskID","张三");
        runtimeService.startProcessInstanceByKey("holiday-request",map);
    }

查看流程,这里我是通过入参查询的,还有许多别的查询办法,大家可以自行去探索:

   void selectTask(){
        List<Task> beginTaskID1 = taskService.createTaskQuery().processVariableValueEquals("beginTaskID", "张三").list();
        System.out.println(beginTaskID1.size());
    }

完成流程

void completeTask(){
        List<Task> beginTaskID1 = taskService.createTaskQuery().processVariableValueEquals("beginTaskID", "张三").list();
        String taskId = beginTaskID1.get(0).getId();
        HashMap<String,Object> param=new HashMap<>();
        param.put("checkResult","通过");
        taskService.complete(taskId,param);
    }

查看流程图

public void getProcessDiagram(HttpServletResponse httpServletResponse, String processId) throws Exception {
        ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();

        //流程走完的不显示图
        if (pi == null) {
            return;
        }
        Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
        //使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象
        String InstanceId = task.getProcessInstanceId();
        List<Execution> executions = runtimeService
                .createExecutionQuery()
                .processInstanceId(InstanceId)
                .list();

        //得到正在执行的Activity的Id
        List<String> activityIds = new ArrayList<>();
        List<String> flows = new ArrayList<>();
        for (Execution exe : executions) {
            List<String> ids = runtimeService.getActiveActivityIds(exe.getId());
            activityIds.addAll(ids);
        }

        //获取流程图
        BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());
        ProcessEngineConfiguration engconf = processEngine.getProcessEngineConfiguration();
        ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator();
        InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, engconf.getActivityFontName(), engconf.getLabelFontName(), engconf.getAnnotationFontName(), engconf.getClassLoader(), 1.0);
        OutputStream out = null;
        byte[] buf = new byte[1024];
        int legth = 0;
        try {
            out = httpServletResponse.getOutputStream();
            while ((legth = in.read(buf)) != -1) {
                out.write(buf, 0, legth);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }

删除流程

void deleteTask(){
        List<Task> beginTaskID1 = taskService.createTaskQuery().processVariableValueEquals("beginTaskID", "张三").list();
        String processId = beginTaskID1.get(0).getProcessInstanceId();
        runtimeService.deleteProcessInstance(processId,"删除的原因");
    }

三.总结
这里只是简单的给大家介绍了一下,大家感兴趣的话可以移步到我的github,里面有关于flowable的简单实现,有页面,
可以进行简单的操作,会比纯看代码直观很多。
github地址:https://github.com/WX59991/flowable

原文地址:https://www.cnblogs.com/MissWX/p/14011409.html