大家好,因为目前手里需要用到flowable工作流,之前没有接触过,所以在这里记录一下学习的进度,开始后台使用SpringCloud分布式框架和前端Vue框架实现一个简单的请假流程。
1.首先引入需要flowable的坐标,也是就pom依赖包。
<dependency>
<groupId>org.flowablegroupId>
<artifactId>flowable-spring-boot-starterartifactId>
<version>${flowable.version}version>
<exclusions>
<exclusion>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>com.h2databasegroupId>
<artifactId>h2artifactId>
<version>1.4.197version>
dependency>
2.流程设计
利用flowable-UI可视化设计器设计自己的请假流程,这里只做一个简单请假审批流程,如下图:
其中,开始审批节点可以指定流程发起者和绑定相应的请假表单,表单可以自己设计,
在创建新的表单时的key很重要,后面是跟流程绑定的。
这样自己设计的表单就建好了,在之后的每个流程节点上的表单引用选择此表单进行绑定(同流程开始节点)。
好了,这里建好了需要的模型,接下来就是如何后台启动部署并走流程了。
3.后台实现
首先,flowable工作流想要生效需要几个步骤:
建立流程模型
(上一步已经做好了),获得bpmn.xml配置文件,这个xml里面记录的是可视化设计页面上的节点、指定人、表单相关信息。部署
该模型,指定需要使用的流程是哪一个。启动
刚刚指定的流程实例。接下来每一步将详细介绍:
1.获得配置文件
这里部署流程有三种:
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该怎么获取?第二个是实际业务产生的表单如何与工作流相关联?大家有想法吗,可以在评论区一起讨论哦。