Activiti6:模拟钉钉上面的请假流程(使用web画图并导出xml然后使用java执行流程)
1.声明
当前内容主要为本人学习和测试Activiti6这个工作流的基本操作,模拟钉钉上面的请假流程(简单版)
当前内容主要有:
- 使用官方的web-app方式画图
- 将当前流程图导出为xml配置
- 将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执行流程)相关推荐
- Hibernate→ORM、简介、第一个Hibernate实现、核心XML配置、Hibernate执行流程、操作数据库对象session、事务、映射XML配置、单例CRUD、get与load
OMR Hibernate 官网 http://hibernate.org/ 第一个Hibernate实现 配置文件 持久化类 关系映射文件 测试类 代码 hibernate.cfg.xml常用配置 ...
- CI/CD-Jenkins(邮箱、钉钉通知)
目录 一.CI/CD概念 1.CI(Continuous Intergration) 2.CD(Continuous Delivery) 3.拓扑图 二.环境准备 1.部署Jenkins 1.安装Je ...
- python下载图片的命令_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...
妹子图网站----前言 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写爬图片这一件事情.希望可以做好. 为了写好爬虫,我们需 ...
- android怎么让图片显示在button上面_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...
## **妹子图网站----前言** 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写`爬图片`这一件事情.希望可以做好. 为 ...
- Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53939176 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...
- 从源码的角度理解Glide的执行流程
转自:http://blog.csdn.net/guolin_blog/article/details/53939176 在本系列的上一篇文章中,我们学习了Glide的基本用法,体验了这个图片加载框架 ...
- 请求转发与重定向的区别和执行流程
请求转发与重定向的区别和执行流程 文章目录 请求转发与重定向的区别和执行流程 1 请求转发与重定向区别 2 现实生活的例子 2.1 重定向 2.2 请求转发 3 重定向-流程图.代码.结果 3.1 流 ...
- Java中对接钉钉API获取数据流程
场景 需要做后台管理系统,接入钉钉API获取人员.考勤.审批等相关数据. 实现 钉钉开放平台应用开发文档 https://developers.dingtalk.com/document/app 首先 ...
- 解析approvalFlow——仿钉钉后台审批流程
文章目录 1. approval介绍 1.1 功能应用 1.2 项目地址 2. jsxPreview.vue应用 2.1 页面结构 2.2 表单解析 3. 功能拓展 3.1 数据回显 3.2 拓展样式 ...
最新文章
- 环境微生物期刊—Bioresource Technology
- APUE(第四章)文件和目录
- mysql 常用命令 | 表间 弱关联 join
- PartialView 加载Js
- 校园PHP表白墙程序源码
- 1.2_linearbinary_search_顺序(线性)查找二分(折半)查找
- 51nod 1275 连续子段的差异(twopointer+单调队列)
- mac 发现 添加 连接 局域网内打印机
- 区块链 hyperledger fabric的系统链码有哪些类型 LSCC ESCC VSCC CSCC是什么
- linux 远程安装teamviewer,远程桌面工具TeamViewer教程:如何在红帽® 企业Linux®上安装TeamViewer...
- 总结在CentOS7上搭建CUDA10+cudnn7的Tensorflow-gpu环境的经验
- 继承关系下怎样使用Builder 模式
- 芝麻授权 java调用_手机浏览器怎么调用支付宝进行用户授权呢?
- 软件测试自动感应灯,原来这么简单——四种常见LED感应灯工作原理
- 酷比魔方iwork1x i30双系统版,重装单Ubuntu 20.04系统记录(重力传感器、触摸屏、启动菜单、声卡问题、优化充电慢)
- 计算机word窗口的组成,推计算机等级考试题库:一级MS Office第三章“Word窗口及其组成”(一)...
- 图书馆机器人索书号识别
- wps字体颜色怎么改
- PG数据库内核源码分析——UPDATE
- 回头再说 008 瞬
热门文章
- 超越美国!中国AI初创企业融资额全球第一 人脸识别最受热捧【附报告全文】
- ggplot画世界地图
- ubuntu服务器ftp无法上传文件,ubuntu服务器上传文件ftp
- 门多萨与马尔克斯谈话录
- 详解凸优化、图神经网络、强化学习、贝叶斯方法等四大主题
- 【项目】小帽商城 II(一)
- 物理仿真实验运用计算机什么用,电脑模拟与物理实验教学
- 什么是GRAY色彩空间
- 【智能制造】周宏仁:通俗易懂讲清楚制造业“数字化起步,网络化崛起,智能化发展”;任泽平:解码“德国制造”的七大基因
- java抢微博福卡,敬业福终极攻略:一天拿20多张福卡,轻松集齐支付宝五福