流程图绘制

简介: 经典工具:Flowable Eclipse Designer

经典工具:Flowable Eclipse Designer


但是,这是一个 Eclipse 插件。


IDEA:

  • IDEA 默认就有一个流程图绘制工具,当在 IDEA 中打开一个流程图的 XML 文件的时候,可以选择 Designer,就可以通过可视化的方式去查看这个流程图,默认的不推荐。
  • IDEA 中也有一个流程绘制插件 flowable-bpmn-visualizer,但是这个插件也不好用,不过勉强能用。


这是 IDEA 里的两个插件。


其他的绘制工具:

  1. flowable-ui 这是官方提供的一个 flowable 的工具,里边有很多功能,包括画流程图。
  2. 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());
    }
}

2105804-20230723111318542-1050695684.png

分析流程图的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>


目录
相关文章
|
15小时前
时标网络图绘制步骤
时标网络图绘制步骤
时标网络图绘制步骤
|
16小时前
|
Python
matplotlib绘制动态瀑布图
matplotlib绘制动态瀑布图
|
16小时前
|
程序员 uml
UML图 | 时序图(顺序、序列图)绘制
UML图 | 时序图(顺序、序列图)绘制
149 0
|
9月前
|
uml
UML类图的 绘制标准 及 绘制工具
讲解绘制类图的标准,以及如何使用ProcessOn(在线工具 无需下载)轻松绘制类图
159 0
|
7月前
|
数据可视化
R绘图 | 云雨图+双向条形图
R绘图 | 云雨图+双向条形图
72 0
|
11月前
|
数据可视化 数据挖掘
绘图系列|R-corrplot相关图
绘图系列|R-corrplot相关图
|
12月前
|
数据可视化
R 可视乎|优雅的绘制流程图
R 可视乎|优雅的绘制流程图
42 0
|
JSON 前端开发 数据可视化
【图形基础篇】02 # 指令式绘图系统:如何用Canvas绘制层次关系图?
【图形基础篇】02 # 指令式绘图系统:如何用Canvas绘制层次关系图?
145 0
【图形基础篇】02 # 指令式绘图系统:如何用Canvas绘制层次关系图?
如何用两种不同的方法动态绘制饼状图
如何用两种不同的方法动态绘制饼状图
160 0
如何用两种不同的方法动态绘制饼状图
|
开发者 Python
3D 图绘制|学习笔记
快速学习3D 图绘制
155 0
3D 图绘制|学习笔记