一篇文章教你看懂flowable工作流开发

前言: 

        工欲善其事,必先利其器. 工作流开发,在日常开发中很常见. 但如何从0-1开发一个工作流对于开发人员来说是很关键的.

话不多说,进入正题

  • 引入jar包
<dependency>
            <groupId>org.flowable</groupId>
            <artifactId>flowable-spring-boot-starter</artifactId>
            <version>6.3.0</version>
</dependency>
  • application.yml 文件添加配置信息
flowable:
#  是否主动更新创建flowable关联表
  database-schema-update: true
  idm:
    enabled: true
  async-executor-activate: false
  • 核心api组件介绍
    • RepositoryService 负责deploy部署 ACT_RE_DEPLOYMENT 存储部署信息
    • RuntimeService 工作流启动 ACT_RU_EXECUTION 存储流程实例
    • TaskService 流程节点管理 流程发起成功默认上传第一节点 ACT_RU_TASK(存储任务节点信息)
    • HistoryService 历史记录信息 获取操作对应删除操作 ACT_HI_* 历史信息
    • IdentityService 负责用户信息,组信息维护 ACT_ID_* 用户信息 用户组信息
  • 核心 api (repositoryService)
    • 创建流程部署 repositoryService.createDeployment

    • 部署流程 Deployment : repositoryService.deploy
      • 步骤同上,添加工作流文件信息后,调用deploy 就会生成流程(类似于请假审批,财务审批这种,具体的流程类型,当前还没有发起审批流程)
    • 删除部署 repositoryService.deleteDeployment
      • repositoryService.deleteDeployment(deployId);// 删除流程 无需多言
    • 暂停部署 suspendProcessDefinitionById
      • repositoryService.suspendProcessDefinitionById(id); // 中断流程,后续工作流无法重新发起
    • 唤醒部署 activateProcessDefinitionById
      • repositoryService.activateProcessDefinitionById(id); // 唤醒操作,与中断对应
    • 查询部署 createDeploymentQuery、
      ListIterator<Deployment> list = repositoryService.createDeploymentQuery().orderByDeploymenTime().desc().listPage(pageNum, pageSize).listIterator(); // 查询部署信息,可添加一系列查询条件

  • 核心 api (RuntimeService)
    • 启动流程 runtimeService.createProcessInstanceBuilder .start()
      •         HashMap<String, Object> param = new HashMap<>();
                param.put("variable", param01);
                ProcessInstance start = runtimeService.createProcessInstanceBuilder()
                        .processDefinitionId(deployId)
                        .variables(param)
                        // 节点执行人
                        .tenantId("bhz")
                        .name("启动了")
                        .start();
    • 暂停流程 suspendProcessInstanceById()
      •         runtimeService.suspendProcessInstanceById(processId);
    • 唤醒流程 activateProcessInstanceById
      •         runtimeService.activateProcessInstanceById(processId);
        
    • 流程查询 createExecutionQuery
      • // 查询条件众多 不一一举例 
        Execution execution = runtimeService.createExecutionQuery().executionId(processId).singleResult();
        
    • 删除流程 deleteProcessInstance
      • runtimeService.deleteProcessInstance(processId, userId);
    • 获取流程参数 getVariables
      • Map<String, Object> variables = runtimeService.getVariables(task.getProcessInstanceId());
        
    • 流程信息查询 createProcessInstanceQuery
      • // 同理,查询条件不一一列举. api大多见名知意
        List<ProcessInstance> list = runtimeService.createProcessInstanceQuery()
        

  • 核心api (TaskService)
    • 领单 claim(taskId)
      • taskService.claim(taskId, userId); // 领单,当前流程指定执行人(可以直接在部署内容中,指定. 默认分发给部署文件中指定的操作人)
        
    • 添加节点参数 setVariable(taskId,key,value)
      • taskService.setVariable(taskId, "param", "ssxxx");
        
    • 获取节点参数 getVariable
      • Object param = runtimeService.getVariable(processId, "param");
        
    • 任务提交
      • taskService.complete(taskId); // 流程流转到下一节点
    • 节点信息查询 createTaskQuery
      • // 同理.查询节点见名知意. 
        Task task = taskService.createTaskQuery().taskCandidateOrAssigned(username).singleResult();
        

  • 核心api ( HistoryService ) 历史信息
    • 节点历史信息 createHistoricTaskInstanceQuery
      • historyService.createHistoricTaskInstanceQuery();
        
    • 流程历史信息 createHistoricProcessInstanceQuery
      • HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult();
        

  •  核心api (IdentityService) 用户管理
    • 新建组 newGroup saveGroup
      • Group group = identityService.newGroup(identityGroupFormReq.getGroupId());
        group.setId(identityGroupFormReq.getGroupId());
        group.setName(identityGroupFormReq.getGroupName());
        group.setType(identityGroupFormReq.getGroupType());
        // 保存
        identityService.saveGroup(group);
    • 新建用户 newUser saveUser
      • User user = identityService.newUser(identityAddUserReq.getUserId());
        user.setId(identityAddUserReq.getUserId());
        user.setFirstName(identityAddUserReq.getUserName());
        user.setPassword(identityAddUserReq.getPassword());
        identityService.saveUser(user);
    • 关联用户和组 createMembership
      • identityService.createMembership(user.getId(), identityAddUserReq.getGroupId());
        
    • 查询组信息 createGroupQuery
      • GroupQuery groupQuery = identityService.createGroupQuery().orderByGroupId();
        
    • 查询用户信息 createUserQuery
      • UserQuery userQuery = identityService.createUserQuery();
        

  • 前端 vue整合flowable
    • npm install  workflow-bpmn-modeler
    • <bpmnModeler @save="save" :groups="groups">
    • 方法
    • save(data) {
            this.$axios.post('flowable/deploy/upload', data)
                .then(res => {
                  console.log(res)
                }).catch(err => console.log(err))
            console.log(data)
          },
          doLoadGroup(){
            this.$axios.post('doc/dept/listDistinctDept', null).then(res => this.groups = res.data).catch(err => console.log(err))
          }