03_Snaker流程demo
作者:互联网
本篇简介
本篇以一个小Case带大家熟悉下 Snaker是如何运作的,对于初入门的老铁可以先跟着我得思路走,你会逐步熟悉Snaker提供的操作
请假案例
流程定义文件存放位置
- Snaker中的流程定义文件是以.snaker结尾
流程定义模型
流程定义文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<process displayName="请假流程测试" instanceUrl="/snaker/flow/all" name="leave">
<start displayName="start1" layout="24,124,-1,-1" name="start1">
<transition g="" name="transition1" offset="0,0" to="apply"/>
</start>
<end displayName="end1" layout="570,124,-1,-1" name="end1"/>
<task assignee="apply" displayName="请假申请" form="/flow/leave/apply" layout="117,122,-1,-1" name="apply" performType="ANY">
<transition g="" name="transition2" offset="0,0" to="approveDept"/>
</task>
<task assignee="approveDept" displayName="部门经理审批" form="/flow/leave/approveDept" layout="272,122,-1,-1" name="approveDept" performType="ANY">
<transition g="" name="transition3" offset="0,0" to="decision1"/>
</task>
<decision displayName="decision1" expr="#day > 2 ? 'transition5' : 'transition4'" layout="426,124,-1,-1" name="decision1">
<transition displayName="<=2天" g="" name="transition4" offset="0,0" to="end1"/>
<transition displayName=">2天" g="" name="transition5" offset="0,0" to="approveBoss"/>
</decision>
<task assignee="approveBoss" displayName="总经理审批" form="/flow/leave/approveBoss" layout="404,231,-1,-1" name="approveBoss" performType="ANY">
<transition g="" name="transition6" offset="0,0" to="end1"/>
</task>
</process>
组件模型属性
部署流程定义文件
注入流程引擎接口
@Autowired
private SnakerEngine engine;
部署流程定义文件
InputStream streamFromClasspath = StreamHelper.getStreamFromClasspath("flows/leave.snaker");
String deploy = engine.process().deploy(streamFromClasspath);
System.out.println(deploy);
查看数据表
- wf_process中就会增加一条数据,如果重复部署version就会加一
- 一般我都会使用最新的流程定义,重复部署意味着我们的流程有变更,管理员才会有的操作
- 如何获取一个流程定义最新的版本是多少呢?放心提供的有API
/**
* 数据库访问接口
* 主要提供保存、更新、查询流程的相关table
*/
@Autowired
private DBAccess dbAccess;
// LEAVE_PROCESS:流程定义文件的name
dbAccess.getLatestProcessVersion(LEAVE_PROCESS);
启动一个流程实例
- tom这名员工要请假
Integer leaveVersion = dbAccess.getLatestProcessVersion(LEAVE_PROCESS);
// 流程定义Id、操作人、参数
Order dm = engine.startInstanceByName(LEAVE_PROCESS, leaveVersion, "tom");
System.out.println(dm.getId());
- 更多启动流程实例方法
启动流程并执行
/**
* 据流程定义 name 启动流程实例
* 申请上线操作发起;并完成任务
*/
@Test
public void startInstanceByNameAndExecute() {
// Process process = allProcess.get(0);
Map<String, Object> map = new HashMap<>();
// 传递变量;申请者的Id
map.put("apply", APPLY_OPERATOR);
// 传递变量;部门审批人的Id
map.put("approveDept", APPROVE_DEPT_OPERATOR);
// 变量 请假天数
map.put("day", 3);
Integer leaveVersion = dbAccess.getLatestProcessVersion(LEAVE_PROCESS);
// 获取一个流程定义最新的版本
// 按照名字启动的 流程
Order dm = startAndExecute(LEAVE_PROCESS, leaveVersion, APPLY_OPERATOR, map);
System.out.println(dm.getId());
}
private Order startAndExecute(String name, Integer version, String operator, Map<String, Object> args) {
Order order = engine.startInstanceByName(name, version, operator, args);
List<Task> tasks = engine.query().getActiveTasks(new QueryFilter().setOrderId(order.getId()));
if (tasks != null && tasks.size() > 0) {
List<Task> tasks1 = engine.executeTask(tasks.get(0).getId(), operator, args);
if (!tasks1.isEmpty() && tasks1.size() == 1) {
engine.task().addTaskActor(tasks1.get(0).getId(), "approve_userName2");
System.out.println("测试加签----------加签成功!");
} else {
System.out.println("测试加签----------加签失败!");
}
System.out.println(tasks1.size());
}
return order;
}
-
任务表数据变化
-
历史任务表数据变化
-
任务和参与人表数据变化
历史 任务和参与人表数据变化
标签:engine,03,Snaker,定义,PROCESS,demo,流程,System,println 来源: https://blog.csdn.net/qq_42946728/article/details/113757028