flowable流程详解

flowable流程详解flowable图例解释请假流程bpmn20.xml文件请假流程示例图例解释开始事件:图中用细线圆圈来表示,是流程实例的开始点箭头:表示节点之间的流转指向。用户任务:在图中用左上角有人的圆角矩形表示,这些是需要用户来操作的节点。图中有两个,第一个表示需要经理进行审批来同意或拒绝,第二个表示用户来确认销假。排它网关:用叉形符号填充的菱形表示,从该图中出来的箭头往往有多个,但只有一个满足条件,流程会沿着满足条件的方向流转。自动化任务:左上角有齿轮形状的的圆角矩形,表示自动执行的节点。图中

大家好,又见面了,我是你们的朋友全栈君。

图例解释

在这里插入图片描述

  • 开始事件:图中用细线圆圈来表示,是流程实例的开始点
  • 箭头:表示节点之间的流转指向。
  • 用户任务: 在图中用左上角有人的圆角矩形表示,这些是需要用户来操作的节点。图中有两个,第一个表示需要经理进行审批来同意或拒绝,
    第二个表示用户来确认销假。
  • 排它网关: 用叉形符号填充的菱形表示,从该图中出来的箭头往往有多个,但只有一个满足条件,流程会沿着满足条件的方向流转。
  • 自动化任务 :左上角有齿轮形状的的圆角矩形,表示自动执行的节点。图中上面的表示请假被经理同意后自动注册通知到外部系统,下面的表示请假被经理拒绝后自动发邮件通知给申请人。
  • 结束事件: 图中用粗线圆圈表示,表示流程的结束。图中上面的结束事件表示请假成功结束,下面的表示请假失败结束。

请假流程

bpmn20.xml文件

Flowable引擎需要流程定义为BPMN 2.0格式,这是一个业界广泛接受的XML标准。 在Flowable术语中,我们将其称为一个流程定义(process definition)。一个流程定义可以启动多个流程实例(process instance)。流程定义可以看做是重复执行流程的蓝图。

请假流程示例

在这里插入图片描述

<?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 id="Leave" name="请假流程" isExecutable="true">
        <documentation>请假流程</documentation>
        <startEvent id="start" name="开始" flowable:initiator="applyUser"></startEvent>
        <userTask id="hrTask" name="人事审批" flowable:assignee="${taskUser}">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <exclusiveGateway id="judgeTask"></exclusiveGateway>
        <userTask id="managerTak" name="经理审批" flowable:candidateGroups="manager"></userTask>
        <userTask id="bossTask" name="老板审批" flowable:candidateGroups="boss"></userTask>
        <endEvent id="end" name="结束"></endEvent>
        <sequenceFlow id="flow1" sourceRef="start" targetRef="hrTask"></sequenceFlow>
        <sequenceFlow id="managerPassFlow" name="通过" sourceRef="managerTak" targetRef="end">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${pass}]]></conditionExpression>
        </sequenceFlow>
        <userTask id="userTask" name="调整申请" flowable:assignee="${applyUser}">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <sequenceFlow id="bossPassFlow" name="通过" sourceRef="bossTask" targetRef="end">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${pass}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow id="judgeMore" name="大于3天" sourceRef="judgeTask" targetRef="bossTask">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days > 3}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow id="managerNotPassFlow" name="驳回" sourceRef="managerTak" targetRef="userTask">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!pass}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow id="bossNotPassFlow" name="驳回" sourceRef="bossTask" targetRef="userTask">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!pass}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow id="hrPassFlow" name="同意" sourceRef="hrTask" targetRef="judgeTask">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${pass}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow id="hrNotPassFlow" name="驳回" sourceRef="hrTask" targetRef="userTask">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!pass}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow id="judgeLess" name="小于3天" sourceRef="judgeTask" targetRef="managerTak">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days <= 3}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow id="userPassFlow" name="重新申请" sourceRef="userTask" targetRef="hrTask">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${pass}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow id="userNotPassFlow" name="关闭申请" sourceRef="userTask" targetRef="end">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!pass}]]></conditionExpression>
        </sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_Leave">
        <bpmndi:BPMNPlane bpmnElement="Leave" id="BPMNPlane_Leave">
            <bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
                <omgdc:Bounds height="30.0" width="30.0" x="300.0" y="135.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="hrTask" id="BPMNShape_hrTask">
                <omgdc:Bounds height="80.0" width="100.0" x="360.0" y="165.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="judgeTask" id="BPMNShape_judgeTask">
                <omgdc:Bounds height="40.0" width="40.0" x="255.0" y="300.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="managerTak" id="BPMNShape_managerTak">
                <omgdc:Bounds height="80.0" width="100.0" x="555.0" y="75.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="bossTask" id="BPMNShape_bossTask">
                <omgdc:Bounds height="80.0" width="100.0" x="450.0" y="420.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end">
                <omgdc:Bounds height="28.0" width="28.0" x="705.0" y="390.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="userTask" id="BPMNShape_userTask">
                <omgdc:Bounds height="80.0" width="100.0" x="510.0" y="270.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
                <omgdi:waypoint x="327.9390183144677" y="157.4917313275668"></omgdi:waypoint>
                <omgdi:waypoint x="360.0" y="176.05263157894737"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="hrPassFlow" id="BPMNEdge_hrPassFlow">
                <omgdi:waypoint x="363.04347826086956" y="244.95000000000002"></omgdi:waypoint>
                <omgdi:waypoint x="285.77299999999997" y="310.79999999999995"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="hrNotPassFlow" id="BPMNEdge_hrNotPassFlow">
                <omgdi:waypoint x="459.95" y="236.21875000000006"></omgdi:waypoint>
                <omgdi:waypoint x="513.9794844818516" y="270.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="judgeLess" id="BPMNEdge_judgeLess">
                <omgdi:waypoint x="274.3359375" y="300.66397214564284"></omgdi:waypoint>
                <omgdi:waypoint x="274.3359375" y="115.0"></omgdi:waypoint>
                <omgdi:waypoint x="554.9999999999982" y="115.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="userPassFlow" id="BPMNEdge_userPassFlow">
                <omgdi:waypoint x="510.0" y="310.0"></omgdi:waypoint>
                <omgdi:waypoint x="411.0" y="310.0"></omgdi:waypoint>
                <omgdi:waypoint x="411.0" y="244.95000000000002"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="bossPassFlow" id="BPMNEdge_bossPassFlow">
                <omgdi:waypoint x="549.9499999999998" y="447.2146118721461"></omgdi:waypoint>
                <omgdi:waypoint x="705.4331577666419" y="407.4567570622598"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="judgeMore" id="BPMNEdge_judgeMore">
                <omgdi:waypoint x="287.29730895645025" y="327.65205479452055"></omgdi:waypoint>
                <omgdi:waypoint x="450.0" y="428.8888888888889"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="managerPassFlow" id="BPMNEdge_managerPassFlow">
                <omgdi:waypoint x="620.7588235294118" y="154.95"></omgdi:waypoint>
                <omgdi:waypoint x="713.8613704477151" y="390.96328050279476"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="userNotPassFlow" id="BPMNEdge_userNotPassFlow">
                <omgdi:waypoint x="609.95" y="339.5301886792453"></omgdi:waypoint>
                <omgdi:waypoint x="706.9383699359797" y="396.87411962686997"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="bossNotPassFlow" id="BPMNEdge_bossNotPassFlow">
                <omgdi:waypoint x="515.98" y="420.0"></omgdi:waypoint>
                <omgdi:waypoint x="544.0" y="349.95000000000005"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="managerNotPassFlow" id="BPMNEdge_managerNotPassFlow">
                <omgdi:waypoint x="595.438344721373" y="154.95"></omgdi:waypoint>
                <omgdi:waypoint x="567.9366337262223" y="270.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</definitions>

第2至8行是一种样板文件,在大多数的流程定义中都是一样的。需要与BPMN 2.0标准规范完全一致。

每一个步骤(在BPMN 2.0术语中称作活动(activity))都有一个id属性,为其提供一个在XML文件中唯一的标识符。所有的活动都可以设置一个名字,以提高流程图的可读性。

活动之间通过顺序流(sequence flow)连接,在流程图中是一个有向箭头。在执行流程实例时,执行(execution)会从启动事件沿着顺序流流向下一个活动。

离开排他网关(带有X的菱形)的顺序流很特别:都以表达式(expression)的形式定义了条件(condition) (例:<![CDATA[${pass}]]>)。当流程实例的执行到达这个网关时,会计算条件,并使用第一个计算为true的顺序流。这就是排他的含义:只选择一个。当然如果需要不同的路由策略,可以使用其他类型的网关。

这里用作条件的表达式为${pass},这是${pass== true}的简写。变量’pass’被称作流程变量(process variable)。流程变量是持久化的数据,与流程实例存储在一起,并可以在流程实例的生命周期中使用。在这个例子里,我们需要在特定的地方(当经理用户任务提交时,或者以Flowable的术语来说,完成(complete)时)设置这个流程变量,因为这不是流程实例启动时就能获取的数据。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143608.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mysql 符串类型的数字排序(字符串转数字)[通俗易懂]

    mysql 符串类型的数字排序(字符串转数字)[通俗易懂]针对字符串类型的字符排序需要先转换成数字再进行排序1.直接用加法  字符串+0select*fromordersorderby(mark+0)desc2.使用函数CAST(valueastype);CONVERT(value,type);注:这里的type可以为:浮点数:DECIMAL整数:SIGNED无符号整数:UNSIGNEDselect*fromordersorderby…

  • 建立git服务器_git部署代码到服务器

    建立git服务器_git部署代码到服务器参考网上资料搭建git服务器过程记录如下:需求硬件需求:一台Ubuntu或者debian电脑(虚拟机),能通过网络访问到。软件需求:git-core,gitosis,openssh-server,openssh-client安装配置git服务器安装git和openssh:a@server:~$sudoapt-getinstallgit-coreopenssh-servero…

  • 最新、最全、最准确的手机号正则表达式

    最新、最全、最准确的手机号正则表达式更新到2018年1月,支持最新的166号段/***手机号码正则表达式*/privatestaticfinalStringPHONE_NUMBER_REG="^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";

  • jQuery数据类型总结建议收藏

    jQuery除了包含原生JS中的内置数据类型(built-indatatype),还包括一些扩展的数据类型(virtualtypes),如Selectors、Events等。1.StringS

    2021年12月21日
  • 阿里云部署django实现公网访问

    本博的主要目的是对阿里云部署django实现公网访问进行一次简单的记录,方便日后查询。内容目录:(1)申请阿里云服务器及安全组配置(2)实现ssh远程控制(3)实现ftp文件传输(4)安装p

    2021年12月29日
  • 数据库——操作数据库语句(select单表查询)

    数据库——操作数据库语句(select单表查询)前两天又装了oracle,开始再次学习数据库,希望这次可以系统的学习,主要是语句的学习。数据库操作语句SQL一、select   查询语句二、DDL 数据 定义 语句(create、drop、alter)三、DML数据操作语句(insert delect update)四、TCL 事务控制  语句(commit提交、rollback撤销、savep

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号