经典工具:Flowable Eclipse Designer
但是,这是一个 Eclipse 插件。
IDEA:
- IDEA 默认就有一个流程图绘制工具,当在 IDEA 中打开一个流程图的 XML 文件的时候,可以选择 Designer,就可以通过可视化的方式去查看这个流程图,默认的不推荐。
- IDEA 中也有一个流程绘制插件
flowable-bpmn-visualizer
,但是这个插件也不好用,不过勉强能用。
这是 IDEA 里的两个插件。
其他的绘制工具:
- flowable-ui 这是官方提供的一个 flowable 的工具,里边有很多功能,包括画流程图。
- bpmn.js 这个工具是 Camunda 提供的,可以嵌入到我们当前的项目中,利用这个 bpmn.js 可以开发一个流程绘制工具。原生的 bpmn.js 画出来的流程图只能在 Camunda 中使用,但是经过改造之后,就可以在 flowable 中使用了。
flowable-bpmn-visualizer
插件安装:
装好之后重启 IDEA 即可。
在 IDEA 中,当我们安装了这个插件之后,新建文件的时候,就有相应的选项,如下图:
选择这个就可以新建一个流程图了。
如下图是官方提供的一个流程图:
我们使用这个插件来绘制一下这个流程图先上个手:
创建项目略过,在 resources 文件夹当中鼠标右键新建一个 BPMN 文件,然后就可以绘制流程图了。
在 BPMN 文件中,鼠标右键,选择 View BPMN(Flowble) Diagram
,然后就可以绘制流程图了:
点击画布中间,会出现一些全局的属性,如下图:
这个就是描述一下我们的流程图是干嘛的,给一个 ID, Name。
绘制开始节点,鼠标在插件当中右键:
点击添加的开始节点,主要是属性:
- id: 给这个开始节点起一个名字,也代表着唯一标识
- Name:描述一下这个节点是干嘛的
然后继续绘制我们的下一个节点,User Task,鼠标右键 Activities
:
!> 注意,这里如果是传递变量需要用 ${}
表达式,如果是字符串,直接写即可,例如,这个节点由一个名为 BNTang 的用户来处理,那么写法如下:
绘制一个网关,排它网关,鼠标右键 Gateways
:
绘制一个 Service Task,鼠标右键 Activities
:
注意,从排他性网关出来的线条中,有一个 Condition expression,这个表示这个线条执行的条件。以下图为例,具体来说,就是当用户在审批的时候,本质上其实就是传递一个变量,变量值为 true 或者 false。下图中的 ${approve}
表示这个变量的名字为 approve。
下图表示的是从网关出来之后,approve 变量如果为 false,那么就进入到请求被拒绝的服务中。
然后再将我们的流程图完善一下:
总结一下比较关键的几个属性:
- id: 唯一标识
- Name: 描述
- Assignee: 任务的执行者
- Condition expression: 条件表达式,用于判断流程的走向
- Service Task: 服务任务,用于执行一些业务逻辑,例如,发送邮件,发送短信等等
修正一下之前的流程图当中的问题,并解析一下这个流程图的XML,解析XML我会对流程的各个部分编写注释,然后我会将最终的XML贴在下方。
首先是我们的结束节点有两个的情况,按道理只有一个结束节点,所以我们需要将这个结束节点删除一个,然后将线条连接到另一个结束节点上。
Service Task 节点给 Class 属性赋值,意思是这个节点执行的时候,会执行这个类中的方法,这个类需要实现 JavaDelegate 接口,然后重写 execute 方法,这个方法就是这个节点执行的时候会执行的方法。
/** * @author BNTang * @version 1.0 * @description 发送请假审批邮箱拒绝或者同意 * @since 2023-11-23 **/ public class Approve implements JavaDelegate { @Override public void execute(DelegateExecution delegateExecution) { System.out.println("发送请假审批邮箱拒绝或者同意" + delegateExecution.getVariables()); } }
分析流程图的XML文件
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef"> <!-- process:流程定义的根元素,一个BPMN 2.0文档中可以包含多个process元素,每个process元素都是一个独立的流程定义。 --> <process id="hoildayRequestDemo" name="hoildayRequestDemo" isExecutable="true"> <!-- startEvent:开始事件,流程定义中必须包含一个开始事件,用于标识流程定义的启动点。 --> <startEvent id="startEvent" name="开始一个请假流程"/> <!-- userTask:用户任务,流程定义中可以包含多个用户任务,用于标识流程中的一个任务。 --> <userTask id="approveRequest" name="批准或者拒绝请假请求"/> <!-- sequenceFlow:顺序流,用于标识流程中的执行顺序。 --> <sequenceFlow id="startEvent_to_approveRequest" sourceRef="startEvent" targetRef="approveRequest"/> <!-- exclusiveGateway:排他网关,用于标识流程中的分支和合并。 --> <exclusiveGateway id="approveOrRejectGateway"/> <!-- sequenceFlow:顺序流,用于标识流程中的执行顺序。 --> <sequenceFlow id="approveRequest_to_approveOrRejectGateway" sourceRef="approveRequest" targetRef="approveOrRejectGateway"/> <!-- serviceTask:服务任务,用于标识流程中的一个服务任务。 --> <serviceTask id="sendApproveEmail" flowable:exclusive="true" name="发送请假审批通过的邮箱"/> <!-- sequenceFlow:顺序流,用于标识流程中的执行顺序。 --> <sequenceFlow id="gateway_to_approve" sourceRef="approveOrRejectGateway" targetRef="sendApproveEmail"> <!-- conditionExpression:条件表达式,用于标识顺序流的条件。 --> <conditionExpression xsi:type="tFormalExpression">${approve}</conditionExpression> </sequenceFlow> <!-- serviceTask:服务任务,用于标识流程中的一个服务任务。 --> <serviceTask id="sendRejectEmail" flowable:exclusive="true" name="发送请假被拒绝的邮箱" flowable:class="top.it6666.flowable.Approve"/> <!-- sequenceFlow:顺序流,用于标识流程中的执行顺序。 --> <sequenceFlow id="gateway_to_reject" sourceRef="approveOrRejectGateway" targetRef="sendRejectEmail" name="从网关到请求被拒绝"> <conditionExpression xsi:type="tFormalExpression">${!approve}</conditionExpression> </sequenceFlow> <!-- sequenceFlow:顺序流,用于标识流程中的执行顺序。 --> <sequenceFlow id="sendApproveEmail_to_endEvent" sourceRef="sendApproveEmail" targetRef="endEvent"/> <sequenceFlow id="sendRejectEmail_to_endEvent" sourceRef="sendRejectEmail" targetRef="endEvent"/> <endEvent id="endEvent"/> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_hoildayRequestDemo"> <bpmndi:BPMNPlane bpmnElement="hoildayRequestDemo" id="BPMNPlane_hoildayRequestDemo"> <!-- 开始节点 --> <bpmndi:BPMNShape id="shape-720716bb-7992-4c79-9289-7697c965a250" bpmnElement="startEvent"> <omgdc:Bounds x="-550.0" y="65.0" width="30.0" height="30.0"/> </bpmndi:BPMNShape> <!-- 用户任务 --> <bpmndi:BPMNShape id="shape-4bbbd282-b4b4-4ebc-a979-f148f400e7d2" bpmnElement="approveRequest"> <omgdc:Bounds x="-425.0" y="40.0" width="100.0" height="80.0"/> </bpmndi:BPMNShape> <!-- sequenceFlow:顺序流,用于标识流程中的执行顺序。 --> <bpmndi:BPMNEdge id="edge-c9de96ec-da86-43c6-b84f-c185782ac4ff" bpmnElement="startEvent_to_approveRequest"> <omgdi:waypoint x="-520.0" y="80.0"/> <omgdi:waypoint x="-425.0" y="80.0"/> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="shape-7d5f411f-f2e2-4c4a-ac43-368ef7489c11" bpmnElement="approveOrRejectGateway"> <omgdc:Bounds x="-230.0" y="60.0" width="40.0" height="40.0"/> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="edge-20bcfcad-f8b8-4a3c-8f2b-1540b0903b10" bpmnElement="approveRequest_to_approveOrRejectGateway"> <omgdi:waypoint x="-325.0" y="80.0"/> <omgdi:waypoint x="-230.0" y="80.0"/> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="shape-c1f0d7a5-355f-4cc7-857e-ec50ad44e5f9" bpmnElement="sendApproveEmail"> <omgdc:Bounds x="-110.0" y="40.0" width="100.0" height="80.0"/> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="edge-7388f00b-1867-4b52-87e2-1c8dbcac5588" bpmnElement="gateway_to_approve"> <omgdi:waypoint x="-190.0" y="80.0"/> <omgdi:waypoint x="-110.0" y="80.0"/> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="shape-28a27ae4-28cf-4257-8858-7fd1222f9b58" bpmnElement="sendRejectEmail"> <omgdc:Bounds x="-110.0" y="165.0" width="100.0" height="80.0"/> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="edge-c687124b-5335-44b3-9e84-4c08c759e566" bpmnElement="gateway_to_reject"> <omgdi:waypoint x="-210.0" y="100.0"/> <omgdi:waypoint x="-210.0" y="185.0"/> <omgdi:waypoint x="-110.0" y="185.0"/> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="edge-cbdabd5a-0320-4beb-8746-8a0b2c3d982b" bpmnElement="sendApproveEmail_to_endEvent"> <omgdi:waypoint x="-10.0" y="80.0"/> <omgdi:waypoint x="125.0" y="80.0"/> <omgdi:waypoint x="125.0" y="169.99998"/> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="edge-7ac3bda4-a111-4f1b-a1cd-0e673c8d3ed9" bpmnElement="sendRejectEmail_to_endEvent"> <omgdi:waypoint x="-10.0" y="185.0"/> <omgdi:waypoint x="110.0" y="185.0"/> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="shape-b5991b38-6b94-478d-968a-d137717678f6" bpmnElement="endEvent"> <omgdc:Bounds x="110.0" y="170.0" width="30.0" height="30.0"/> </bpmndi:BPMNShape> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>