1.声明

当前内容主要为本人学习和测试Activiti6这个工作流的基本操作,模拟钉钉上面的请假流程(简单版)

当前内容主要有:

  1. 使用官方的web-app方式画图
  2. 将当前流程图导出为xml配置
  3. 将xml配置导入项目,并使用java方式加载并实现流程执行

2.画出请假执行流程图

其中都是使用最简单的元素

重要点:
1.启动当前流程需要三个:员工名称,请假时间,请假类型

例如下面参数:

此时发起流程就必须这些参数,注意required设置为true

流程发起后,通过审核人,此时审核人需要一个参数来执行后面是否允许请假通过,同样的设置为approve,设置为boolean类型




之后流程到了条件判断,这里其实就是判断当前的定义的变量approve==true或者approve==false




然后后面的审核人和判断就和这个一样即可完成条件判断(所以这里省略后面的userTask和条件判断)

之后到达抄送人


此时流程执行结束

保存后(上面的请假类型是枚举所以需要在生成的xml中修改)

3.将画出的图导出为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: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" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef"><process id="OffWork" name="OffWork" isExecutable="true"><documentation>钉钉上的请假流程</documentation><startEvent id="offWorkStart" name="发起请求"><extensionElements><activiti:formProperty id="username" name="员工名称" type="string" required="true"></activiti:formProperty><activiti:formProperty id="offwork_type" name="请假类型" type="enum" required="true"></activiti:formProperty><activiti:formProperty id="offwork_day" name="请假天数" type="long" required="true"></activiti:formProperty></extensionElements></startEvent><userTask id="sp_1" name="审批人:人事部" activiti:candidateGroups="management"><extensionElements><activiti:formProperty id="approve" name="是否同意" type="boolean" required="true"></activiti:formProperty></extensionElements></userTask><userTask id="sp_2" name="审批人:人事部主管" activiti:candidateGroups="management"><extensionElements><activiti:formProperty id="approve" name="是否同意" type="boolean" required="true"></activiti:formProperty></extensionElements></userTask><endEvent id="offWorkEnd" name="结束"></endEvent><exclusiveGateway id="sp_1_check" name="判断"></exclusiveGateway><exclusiveGateway id="sp_2_check" name="判断"></exclusiveGateway><userTask id="send_person" name="抄送人" activiti:candidateGroups="system"></userTask><sequenceFlow id="sd_boss" name="抄送给总经理" sourceRef="send_person" targetRef="mail_to_boss"></sequenceFlow><sequenceFlow id="diapatcher_to_csr" name="转发" sourceRef="sp_2" targetRef="sp_2_check"></sequenceFlow><sequenceFlow id="cs_ms_end" name="抄送结束" sourceRef="mail_to_ms" targetRef="offWorkEnd"></sequenceFlow><sequenceFlow id="cs_boss_end" name="抄送结束" sourceRef="mail_to_boss" targetRef="offWorkEnd"></sequenceFlow><sequenceFlow id="sp_1_disapprove" name="不同意" sourceRef="sp_1_check" targetRef="offWorkEnd"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve=='false'}]]></conditionExpression></sequenceFlow><sequenceFlow id="sp_2_approve" name="同意" sourceRef="sp_2_check" targetRef="send_person"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve=='true'}]]></conditionExpression></sequenceFlow><sequenceFlow id="sp_2_disapprove" name="不同意" sourceRef="sp_2_check" targetRef="offWorkEnd"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve=='false'}]]></conditionExpression></sequenceFlow><sequenceFlow id="dispatcher_to_zg" name="转发" sourceRef="sp_1" targetRef="sp_1_check"></sequenceFlow><sequenceFlow id="sp_1_approve" name="同意" sourceRef="sp_1_check" targetRef="sp_2"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve=='true'}]]></conditionExpression></sequenceFlow><manualTask id="mail_to_ms" name="发送邮件给秘书"></manualTask><manualTask id="mail_to_boss" name="发送邮件给总经理"></manualTask><sequenceFlow id="sd_ms" name="抄送给秘书" sourceRef="send_person" targetRef="mail_to_ms"></sequenceFlow><sequenceFlow id="submit_offwork" name="提交请假请求" sourceRef="offWorkStart" targetRef="sp_1"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_OffWork"><bpmndi:BPMNPlane bpmnElement="OffWork" id="BPMNPlane_OffWork"><bpmndi:BPMNShape bpmnElement="offWorkStart" id="BPMNShape_offWorkStart"><omgdc:Bounds height="30.0" width="30.0" x="120.0" y="163.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sp_1" id="BPMNShape_sp_1"><omgdc:Bounds height="80.0" width="100.0" x="240.0" y="138.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sp_2" id="BPMNShape_sp_2"><omgdc:Bounds height="80.0" width="100.0" x="480.0" y="138.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="offWorkEnd" id="BPMNShape_offWorkEnd"><omgdc:Bounds height="28.0" width="28.0" x="1050.0" y="330.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sp_1_check" id="BPMNShape_sp_1_check"><omgdc:Bounds height="40.0" width="40.0" x="390.0" y="158.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sp_2_check" id="BPMNShape_sp_2_check"><omgdc:Bounds height="40.0" width="40.0" x="625.0" y="158.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="send_person" id="BPMNShape_send_person"><omgdc:Bounds height="80.0" width="100.0" x="720.0" y="138.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="mail_to_ms" id="BPMNShape_mail_to_ms"><omgdc:Bounds height="80.0" width="100.0" x="930.0" y="75.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="mail_to_boss" id="BPMNShape_mail_to_boss"><omgdc:Bounds height="80.0" width="100.0" x="930.0" y="180.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="sd_boss" id="BPMNEdge_sd_boss"><omgdi:waypoint x="820.0" y="178.375"></omgdi:waypoint><omgdi:waypoint x="930.0" y="219.625"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="cs_boss_end" id="BPMNEdge_cs_boss_end"><omgdi:waypoint x="980.0" y="260.0"></omgdi:waypoint><omgdi:waypoint x="980.0" y="344.0"></omgdi:waypoint><omgdi:waypoint x="1050.0" y="344.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="diapatcher_to_csr" id="BPMNEdge_diapatcher_to_csr"><omgdi:waypoint x="580.0" y="178.2164502164502"></omgdi:waypoint><omgdi:waypoint x="625.4130434782609" y="178.41304347826087"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sp_2_disapprove" id="BPMNEdge_sp_2_disapprove"><omgdi:waypoint x="645.5" y="197.5"></omgdi:waypoint><omgdi:waypoint x="645.5" y="344.0"></omgdi:waypoint><omgdi:waypoint x="1050.0" y="344.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sp_1_disapprove" id="BPMNEdge_sp_1_disapprove"><omgdi:waypoint x="410.5" y="197.5"></omgdi:waypoint><omgdi:waypoint x="410.5" y="344.0"></omgdi:waypoint><omgdi:waypoint x="1050.0" y="344.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="submit_offwork" id="BPMNEdge_submit_offwork"><omgdi:waypoint x="150.0" y="178.0"></omgdi:waypoint><omgdi:waypoint x="240.0" y="178.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sd_ms" id="BPMNEdge_sd_ms"><omgdi:waypoint x="820.0" y="157.61607142857144"></omgdi:waypoint><omgdi:waypoint x="930.0" y="115.38392857142857"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sp_2_approve" id="BPMNEdge_sp_2_approve"><omgdi:waypoint x="664.5766129032259" y="178.4233870967742"></omgdi:waypoint><omgdi:waypoint x="720.0" y="178.2008032128514"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="dispatcher_to_zg" id="BPMNEdge_dispatcher_to_zg"><omgdi:waypoint x="340.0" y="178.20746887966806"></omgdi:waypoint><omgdi:waypoint x="390.4166666666667" y="178.41666666666666"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sp_1_approve" id="BPMNEdge_sp_1_approve"><omgdi:waypoint x="429.6357142857143" y="178.36428571428573"></omgdi:waypoint><omgdi:waypoint x="480.0" y="178.00709219858157"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="cs_ms_end" id="BPMNEdge_cs_ms_end"><omgdi:waypoint x="1030.0" y="115.0"></omgdi:waypoint><omgdi:waypoint x="1064.0" y="115.0"></omgdi:waypoint><omgdi:waypoint x="1064.0" y="330.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

4.开始补充部分内容

直接将该xml拷贝到项目中,然后找到enum这个请假类型的地方开始补充

<activiti:formProperty id="offwork_type" name="请假类型" type="enum" required="true"><activiti:value id="illVacation" name="病假"></activiti:value><activiti:value id="birthVacation" name="产假"></activiti:value><activiti:value id="ownerVacation" name="个人假"></activiti:value>
</activiti:formProperty>

5.执行java测试

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;public class OffWorkActiviti6Test {public static void main(String[] args) {/*ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration()* .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE)* .setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")* .setAsyncExecutorActivate(false) .buildProcessEngine();*/// 1. 加载对应的activiti的xml配置文件// ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration().setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE).setJdbcUrl("jdbc:mysql://localhost:3306/hy_activiti6").setJdbcDriver("com.mysql.jdbc.Driver").setJdbcUsername("root").setJdbcPassword("root").setAsyncExecutorActivate(false).buildProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();repositoryService.createDeployment().addClasspathResource("OffWork.bpmn20.xml").deploy();System.out .println("Number of process definitions: " + repositoryService.createProcessDefinitionQuery().count());// 创建一个雇员的名称为:Kermit发起一个请假流程,请1天病假String username = "Kermit";Map<String, Object> variables = new HashMap<String, Object>();variables.put("username", username);variables.put("type", "illVacation");variables.put("offWorkDays", 1);RuntimeService runtimeService = processEngine.getRuntimeService();// 这里为发起实际的请假请求ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("OffWork", variables);// Verify that we started a new process instanceSystem.out.println("Number of process instances: " + runtimeService.createProcessInstanceQuery().count());System.out.println("员工:" + username + ",发起" + 1 + "天病假的请求");// 管理组获取所有的任务请求(包括请假等事项)// Fetch all tasks for the management groupTaskService taskService = processEngine.getTaskService();List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();for (Task task : tasks) {System.out.println("Task available: " + task.getName());}// 同意请求,让下一位进行处理Task offWorkTask = tasks.get(0);variables = new HashMap<String, Object>();variables.put("approve", true);taskService.complete(offWorkTask.getId(), variables);System.out.println("人事部人员同意请假请求....");// 再次获取,下一个人的执行流程tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();for (Task task : tasks) {System.out.println("Task available: " + task.getName());}// 人事部主管同意请求offWorkTask = tasks.get(0);variables = new HashMap<String, Object>();variables.put("approve", true);taskService.complete(offWorkTask.getId(), variables);System.out.println("人事部主管同意请假请求....");//系统执行抄送任务给当前的经理和秘书        tasks = taskService.createTaskQuery().taskCandidateGroup("system").list();for (Task task : tasks) {System.out.println("Task available: " + task.getName());}// 任务完成offWorkTask = tasks.get(0);taskService.complete(offWorkTask.getId());System.out.println("系统自动转发当前的请假给总经理和秘书....");}
}

执行结果:

查看数据库结果

整个流程执行成功!

6.总结

使用官方的web app的流程设计器和下载xml方式简化了开发步骤,和流程xml的编写,很容易编写(但是要小心传递的参数问题和判断条件问题)

Activiti6:模拟钉钉上面的请假流程(使用web画图并导出xml然后使用java执行流程)相关推荐

  1. Hibernate→ORM、简介、第一个Hibernate实现、核心XML配置、Hibernate执行流程、操作数据库对象session、事务、映射XML配置、单例CRUD、get与load

    OMR Hibernate 官网 http://hibernate.org/ 第一个Hibernate实现 配置文件 持久化类 关系映射文件 测试类 代码 hibernate.cfg.xml常用配置 ...

  2. CI/CD-Jenkins(邮箱、钉钉通知)

    目录 一.CI/CD概念 1.CI(Continuous Intergration) 2.CD(Continuous Delivery) 3.拓扑图 二.环境准备 1.部署Jenkins 1.安装Je ...

  3. python下载图片的命令_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...

    妹子图网站----前言 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写爬图片这一件事情.希望可以做好. 为了写好爬虫,我们需 ...

  4. android怎么让图片显示在button上面_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...

    ## **妹子图网站----前言** 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写`爬图片`这一件事情.希望可以做好. 为 ...

  5. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53939176 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  6. 从源码的角度理解Glide的执行流程

    转自:http://blog.csdn.net/guolin_blog/article/details/53939176 在本系列的上一篇文章中,我们学习了Glide的基本用法,体验了这个图片加载框架 ...

  7. 请求转发与重定向的区别和执行流程

    请求转发与重定向的区别和执行流程 文章目录 请求转发与重定向的区别和执行流程 1 请求转发与重定向区别 2 现实生活的例子 2.1 重定向 2.2 请求转发 3 重定向-流程图.代码.结果 3.1 流 ...

  8. Java中对接钉钉API获取数据流程

    场景 需要做后台管理系统,接入钉钉API获取人员.考勤.审批等相关数据. 实现 钉钉开放平台应用开发文档 https://developers.dingtalk.com/document/app 首先 ...

  9. 解析approvalFlow——仿钉钉后台审批流程

    文章目录 1. approval介绍 1.1 功能应用 1.2 项目地址 2. jsxPreview.vue应用 2.1 页面结构 2.2 表单解析 3. 功能拓展 3.1 数据回显 3.2 拓展样式 ...

最新文章

  1. 环境微生物期刊—Bioresource Technology
  2. APUE(第四章)文件和目录
  3. mysql 常用命令 | 表间 弱关联 join
  4. PartialView 加载Js
  5. 校园PHP表白墙程序源码
  6. 1.2_linearbinary_search_顺序(线性)查找二分(折半)查找
  7. 51nod 1275 连续子段的差异(twopointer+单调队列)
  8. mac 发现 添加 连接 局域网内打印机
  9. 区块链 hyperledger fabric的系统链码有哪些类型 LSCC ESCC VSCC CSCC是什么
  10. linux 远程安装teamviewer,远程桌面工具TeamViewer教程:如何在红帽® 企业Linux®上安装TeamViewer...
  11. 总结在CentOS7上搭建CUDA10+cudnn7的Tensorflow-gpu环境的经验
  12. 继承关系下怎样使用Builder 模式
  13. 芝麻授权 java调用_手机浏览器怎么调用支付宝进行用户授权呢?
  14. 软件测试自动感应灯,原来这么简单——四种常见LED感应灯工作原理
  15. 酷比魔方iwork1x i30双系统版,重装单Ubuntu 20.04系统记录(重力传感器、触摸屏、启动菜单、声卡问题、优化充电慢)
  16. 计算机word窗口的组成,推计算机等级考试题库:一级MS Office第三章“Word窗口及其组成”(一)...
  17. 图书馆机器人索书号识别
  18. wps字体颜色怎么改
  19. PG数据库内核源码分析——UPDATE
  20. 回头再说 008 瞬

热门文章

  1. 超越美国!中国AI初创企业融资额全球第一 人脸识别最受热捧【附报告全文】
  2. ggplot画世界地图
  3. ubuntu服务器ftp无法上传文件,ubuntu服务器上传文件ftp
  4. 门多萨与马尔克斯谈话录
  5. 详解凸优化、图神经网络、强化学习、贝叶斯方法等四大主题
  6. 【项目】小帽商城 II(一)
  7. 物理仿真实验运用计算机什么用,电脑模拟与物理实验教学
  8. 什么是GRAY色彩空间
  9. 【智能制造】周宏仁:通俗易懂讲清楚制造业“数字化起步,网络化崛起,智能化发展”;任泽平:解码“德国制造”的七大基因
  10. java抢微博福卡,敬业福终极攻略:一天拿20多张福卡,轻松集齐支付宝五福