一、前言

大家好,因为目前手里需要用到flowable工作流,之前没有接触过,所以在这里记录一下学习的进度,开始后台使用SpringCloud分布式框架和前端Vue框架实现一个简单的请假流程。

二、代码实现

1.首先引入需要flowable的坐标,也是就pom依赖包。

		<!-- flowable初始化工程所需-->
        <dependency>
            <groupId>org.flowable</groupId>
            <artifactId>flowable-spring-boot-starter</artifactId>
            <version>${flowable.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 如果指定了自己的数据库则不需要,h2基于内存存储-->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.197</version>
        </dependency>

2.流程设计
利用flowable-UI可视化设计器设计自己的请假流程,这里只做一个简单请假审批流程,如下图:
在这里插入图片描述
其中,开始审批节点可以指定流程发起者和绑定相应的请假表单,表单可以自己设计,
在这里插入图片描述

在创建新的表单时的key很重要,后面是跟流程绑定的。
在这里插入图片描述
这样自己设计的表单就建好了,在之后的每个流程节点上的表单引用选择此表单进行绑定(同流程开始节点)。
在这里插入图片描述
好了,这里建好了需要的模型,接下来就是如何后台启动部署并走流程了。

3.后台实现

首先,flowable工作流想要生效需要几个步骤:

  1. 建立流程模型(上一步已经做好了),获得bpmn.xml配置文件,这个xml里面记录的是可视化设计页面上的节点、指定人、表单相关信息。
  2. 部署该模型,指定需要使用的流程是哪一个。
  3. 启动刚刚指定的流程实例。
  4. 根据节点指定的审批人或组的key获取待办列表。
  5. 审批该节点。
  6. 自动到下一个节点指定的审批人或组。
  7. 查询节点已办列表。

接下来每一步将详细介绍:

1.获得配置文件

之前咱们建好了流程模型,先下载配置文件
在这里插入图片描述
2.部署流程

这里部署流程有三种:

1.当前我们使用的是classpath部署,即指定classes路径。将下载的xml放在resources下面

//部署流程
		Deployment deploy = repositoryService.createDeployment()
			.addClasspathResource("yourmodelkey.bpmn20.xml")
			.name("yourmodelkey")
			.deploy();

2.根据ui.modeler的 modelId部署

	/**部署流程定义(根据ui.modeler的 modelId部署)
     * @param modelId 模型ID
     * @from fhadmin.cn
     */
    protected String deploymentProcessDefinitionFromUIModelId(String modelId) throws Exception{
        Model model = modelService.getModel(modelId);
        BpmnModel bpmnModel = modelService.getBpmnModel(model);
        Deployment deployment = repositoryService.createDeployment()
        .name(model.getName())
        .addBpmnModel(model.getKey() + ".bpmn", bpmnModel).deploy();
        return deployment.getId(); //部署ID
    }

3.从zip压缩包部署

/**部署流程定义(从zip压缩包)
     * @param name       //部署名称
     * @param zippath    //zip文件路径
     * @from fhadmin.cn
     * @throws FileNotFoundException 
     */
    protected String deploymentProcessDefinitionFromZip(String name, String zippath) throws Exception{
        File outfile = new File(zippath);
        FileInputStream inputStream = new FileInputStream(outfile);
        ZipInputStream ipInputStream = new ZipInputStream(inputStream);
        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();      //创建部署对象
        deploymentBuilder.name(name);                       //部署名称
        deploymentBuilder.addZipInputStream(ipInputStream);
        Deployment deployment = deploymentBuilder.deploy();  //完成部署
        ipInputStream.close();
        inputStream.close();
        return deployment.getId();                         //部署ID
    }

3.启动流程

	@Autowired
	private RuntimeService runtimeService;
	
	ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("forleave");
	processInstance.getId();//启动的流程Id

到这里已经可以应用刚刚创建的请假流程了,接下来需要到下一个节点审批人。

4.待办列表

/**
* @assignee 指定人id
**/
public List<Task> getTasks(String assignee) {
		//taskCandidateUser() 根据指定人查
		//taskCandidateGroup() 根据指定组查
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = processEngine.getTaskService();
		return taskService.createTaskQuery().taskAssignee(assignee).orderByTaskCreateTime().desc().list();
	}

当我们的待办人登录后,则需要选择一条流程进行审批。

5.审批流程

/**
*@id 流程Id
*@approved true表示通过,false表示驳回
*/
public void dealTask(String id,Boolean approved) {
		Map variables = new HashMap<String, Object>();
		variables.put("approved", approved);
		taskService.complete(id, variables);
	}

此刻通过后流程自动流转到下一审批人,需要下一审批人登录后处理。这里我们可以查看当前审批人的已办列表已经有该流程。

6.已办列表

/**
* @assignee 指定人id
**/
public List<HistoricProcessInstance> getdoed(String assignee) {
		return historyService.createHistoricProcessInstanceQuery().involvedUser(assignee).orderByProcessInstanceStartTime().desc().list();
	}

三、总结

以上是初识了两天flowable工作流的内容,熟悉了flowable中Rest API使用和种类,知道了flowable数据库表中表功能,简单的实现了请假流程。这里再补充两个问题,一个是微服务模式下,分布式部署flowable的xml该怎么获取?第二个是实际业务产生的表单如何与工作流相关联?大家有想法吗,可以在评论区一起讨论哦。

Logo

前往低代码交流专区

更多推荐