BPMN相关基础
在画流程图之前,首先需要了解BPMN的一些基础知识:开始、结束事件、用户任务、任务受让人、任务审核人、网关等一些基础知识,具体可以参考官方文档,介绍的很详细,也比较容易理解。BPMN介绍
画流程图
画流程图我是通过在线工具进行编辑。工作流在线编辑
简单的模拟了一个请假的流程图:任何一个流程都有开始节点和结束节点。发起人节点发起请假申请后,到达网关节点,根据请假天数,来判断需要组长或经理审批,组长或经理审批完成后,任务到达结束节点,流程结束。图例中,左侧有一些BPMN基本的组件,包括任务,网关、定时器,虽然不太全,不过可以完成日常的简单工作流程。当流程图画完后,点击xml页签,会有对应的xml信息。可以拷贝到我们的项目中,一个简单的流程就算设计完成。
部署
相关API
Deployment deploy = repositoryService.createDeployment()
.name(deploymentVo.getName())//部署名称
.category(deploymentVo.getCategory())//类别
.key(deploymentVo.getKey())//部署key
.tenantId(deploymentVo.getTenantId())//租户Id
.addInputStream(deploymentVo.getResourceName(),inputStream)
//.addClasspathResource("path") 类文件资源
.deploy();
部署可以通过类路径资源的方式,也可以通过文件流的方式两者类似。在项目中,我是通过上传文件上传的方式进行。在部署时,会首先验证文件是不是符合规范。
@PostMapping("/uploadAndDeploy")
public CommonResult uploadAndDeploy(@RequestParam("file") MultipartFile multipartFile, ActReDeploymentParam param) {
CommonResult result= CommonResult.error();
try {
result = deploymentService.createDeploy(param, multipartFile);
} catch (IOException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
return result;
}
public CommonResult createDeploy(ActReDeploymentParam info, MultipartFile multipartFile) throws IOException, XMLStreamException {
String filename = multipartFile.getResource().getFilename();
if(!filename.endsWith("bpmn20.xml")){
return CommonResult.error("文件格式错误",null);
}
InputStream inputStream = multipartFile.getInputStream();
XMLInputFactory xif = new XMLInputFactoryImpl();
InputStreamReader xmlIn = new InputStreamReader(inputStream, "UTF-8");
XMLStreamReader xtr =xif.createXMLStreamReader(xmlIn);
BpmnModel bpmnModel = bpmnXmlConverter.convertToBpmnModel(xtr);
//校验文件
ProcessValidator validator = new ProcessValidatorFactory().createDefaultProcessValidator();
List<ValidationError> errors = validator.validate(bpmnModel);
if(!ObjectUtil.isEmpty(errors)){
StringBuffer es = new StringBuffer();
errors.forEach(ve -> es.append(ve.toString()).append("/n"));
return CommonResult.error(errors);
}
Process mainProcess = bpmnModel.getMainProcess();
String fileName = mainProcess.getName();
if (StrUtil.isEmpty(fileName)) {
return CommonResult.error(Const.ERROR_MSG,"\"No process found in definition \" + fileName");
}
info.setName(mainProcess.getName());
info.setKey(mainProcess.getId());
info.setResourceName(filename);
InputStream sourceStream= multipartFile.getInputStream();
Deployment deploy= flowApi.deployment(info,sourceStream);
return CommonResult.success(deploy);
}
flowApi.deployment
Deployment deploy = repositoryService.createDeployment()
.name(deploymentVo.getName())
.category(deploymentVo.getCategory())
.key(deploymentVo.getKey())
.tenantId(deploymentVo.getTenantId())
.addInputStream(deploymentVo.getResourceName(),inputStream)
//.addClasspathResource("path") 类文件资源
.deploy();
发布成功后,数据库生成关于该流程的定义信息。主要涉及到的表:
- act_re_procdef:流程定义信息:
- key和name,对应xml文件中的id和name,
- 类别category:可以用来对流程进行区分
- tenantId:租户id
- version:版本号。如果同一个流程部署多次,那么版本号会递增,后面在发起流程时,会选择版本号最大的流程定义。
- act_ge_bytearray:流程资源信息,包括xml文件的信息和对应流程图的信息。
- act_re_deployment:流程部署信息
- name:部署名称
- deployTime:部署时间
最后,如果有其他问题,欢迎加qq群176763858交流~