流程图绘制
经典工具: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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具