Hello,大家好,我是你们CodeWorld,最近工作比较忙,很长时间没有更新过文章了,那么今天呢,就给大家来一期Activiti7的教学
话不多说,直接上
直接上

开篇前提

首先我们要知道什么是Activiti,他怎么使用,解决了什么问题

Activiti介绍

什么是工作流

工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
简单来说就是一个任务层级的关系,假如我们有个员工请假,他需要填写请假条-》提交申请-》组长审批-》经理审批-》老板审批,这样的一个流程,叫它工作流,上级完成后自动流转到下级。

什么是工作流系统

一个软件系统中具有工作流的功能,我们把它称为工作流系统。

工作流使用场景

  • 关键业务流程:订单、报价处理、合同审核、客户电话处理、供应链管理等。
  • 行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。
  • 财务相关:付款申请,报销处理,预算计划审批等
    还有很多的场景都会使用到工作流

为什么要学习工作流

自定义工作流

员工请假案例:
第一步:员工提交申请(status设置为1)
第二步:组长审批通过(status设置为2)
第三步:组长审批不通过(status设置为3)
第四步:经理审批通过(status设置为4)
第五步:经理审批不通过(status设置为5)
第六步:老板审批通过(status设置为6)
第七步:老板审批不通过(status设置为7)
。。。。
如果说任务审核流程很多,那么我们设置的状态就会很多,这样以此下去,耦合性很高,如果流程有所改变,增加审核层级或者去掉某一个审核层级不要,那么这样改代码真的很头疼,加上各种各样的状态判断,人都傻了

还写的der,直接跑路吧

跑路

当我们遇到这种情况了,Activiti就派上用场了,可以解决我们遇到的问题,当员工提交请假申请后,如果组长审核通过,那么自动就会流转到经理审批;如果组长审核不通过,那么自动会流转到员工哪里,重新填写提交。
这样就解决了我们代码的耦合性,如果流程又所变,我们只需要修改流程图就可以。

不跑了

工作流实现的原理

流程图解.png

我们可以在上面清楚的看见每一个流程都对应了一条记录,保存在我们的数据库中,当我们删除或者增加的流程的时候,就和我们的状态没有任何关系了。

使用步骤

  • 引入Activiti:Activiti其实就是用java开发的一套开源的框架。我们要使用首先对应的pom依赖,然后我们就可以通过Activiti提供的类和接口来进行操作了
  • 流程定义:就是使用专门流程建模工具来定义流程,把整个流程用图形的方式表达出来。像idea和eclipse都有对应的Activiti对应的流程订一起。
  • 流程定义的部署:把我们用工具绘制出来的流程存储起来。其实就是把这个流程转化为具体的数据存放到mysql中。
  • 启动一个流程实例:就是开始一次业务流程的运行。比如小明和小红都要请假,那么他们填写了请假申请之后,系统就应该为他们两个都启动一个流程实例。不同的流程实例之间相互是不影响的。
  • 用户查询待办任务:一个任务要经历多个参与者,那么现在这个任务到达哪个地方了,应该由谁来处理了,这个时候我们需要查询出来。但是由于我们使用了Activiti,我们已经不需要自己写sql来查询了,直接嗲用Activiti提供的接口就可以了。
  • 用户办理任务:用户查询待办任务后,就可以办理某个任务,如果这个任务办理完成还需要其他用户办理,比如采购单创建后由部门经理审核,这个过程也是由Activiti帮助我们完成的。

什么是BPMN

BPMN定义了一个业务流程图(Business Process Diagram),该业务流程图基于一个流程图(flowcharting),该流程图被设计用于创建业务流程操作的图形化模型。而一个业务流程模型(Business Process Model),指一个由图形对象(graphical objects)组成的网状图,图形对象包括活动(activities)和用于定义这些活动执行顺序的流程控制器(flow controls)

例如:这就是我们画出的BPMN
BPMN例子

我们再看xml文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.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" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1639040573404" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
  <process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
    <startEvent id="_2" name="开始"/>
    <userTask activiti:exclusive="true" id="_3" name="提交申请"/>
    <sequenceFlow id="_4" sourceRef="_2" targetRef="_3"/>
    <userTask activiti:exclusive="true" id="_5" name="组长审批"/>
    <sequenceFlow id="_6" sourceRef="_3" targetRef="_5"/>
    <userTask activiti:exclusive="true" id="_7" name="经理审批"/>
    <sequenceFlow id="_8" sourceRef="_5" targetRef="_7"/>
    <userTask activiti:exclusive="true" id="_9" name="老板审批"/>
    <sequenceFlow id="_10" sourceRef="_7" targetRef="_9"/>
    <endEvent id="_11" name="结束"/>
    <sequenceFlow id="_12" sourceRef="_9" targetRef="_11"/>
  </process>
  <bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
    <bpmndi:BPMNPlane bpmnElement="myProcess_1">
      <bpmndi:BPMNShape bpmnElement="_2" id="Shape-_2">
        <omgdc:Bounds height="32.0" width="32.0" x="325.0" y="20.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_3" id="Shape-_3">
        <omgdc:Bounds height="55.0" width="85.0" x="305.0" y="110.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_5" id="Shape-_5">
        <omgdc:Bounds height="55.0" width="85.0" x="310.0" y="220.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_7" id="Shape-_7">
        <omgdc:Bounds height="55.0" width="85.0" x="310.0" y="315.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_9" id="Shape-_9">
        <omgdc:Bounds height="55.0" width="85.0" x="315.0" y="420.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_11" id="Shape-_11">
        <omgdc:Bounds height="32.0" width="32.0" x="340.0" y="530.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="_12" id="BPMNEdge__12" sourceElement="_9" targetElement="_11">
        <omgdi:waypoint x="356.0" y="475.0"/>
        <omgdi:waypoint x="356.0" y="530.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_4" id="BPMNEdge__4" sourceElement="_2" targetElement="_3">
        <omgdi:waypoint x="341.0" y="52.0"/>
        <omgdi:waypoint x="341.0" y="110.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_6" id="BPMNEdge__6" sourceElement="_3" targetElement="_5">
        <omgdi:waypoint x="350.0" y="165.0"/>
        <omgdi:waypoint x="350.0" y="220.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_8" id="BPMNEdge__8" sourceElement="_5" targetElement="_7">
        <omgdi:waypoint x="352.5" y="275.0"/>
        <omgdi:waypoint x="352.5" y="315.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10" sourceElement="_7" targetElement="_9">
        <omgdi:waypoint x="355.0" y="370.0"/>
        <omgdi:waypoint x="355.0" y="420.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

这样我们的流程图就创建好了,下面就开始撸代码
具体我们到下一节在讲

好了,本次的技术解析就到这里了?如果觉得不错的话,点亮一下小星星codeworld-cloud-shop
只看不点,不是好孩子哦!!

欢迎加入QQ群(964285437)

QQ群

欢迎加入公众号

公众号


喜欢的少年是你
4 声望0 粉丝