挂起与激活
流程定义的挂起与激活:
public class ProcessDefinitionSuspend {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("holiday")
.singleResult();
boolean isSuspend = processDefinition.isSuspended();
if (isSuspend) {
//如果挂起了,就将这个流程激活
repositoryService.activateProcessDefinitionByKey("holiday", true, null);
System.out.println("流程定义ID为" + processDefinition.getId() + "被激活了");
}else {
//否则就挂起
repositoryService.suspendProcessDefinitionByKey("holiday", true, null);
System.out.println("流程定义ID为" + processDefinition.getId() + "被挂起了");
}
}
}
流程实例的挂起与激活:
(传入的流程实例ID不能是已经结束的实例ID,否则会报nullpointexception)
public class ProcessInstanceSuspend {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
String processInstanceId = "20001";
ProcessInstance processInstance = runtimeService
.createProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
boolean isSuspend = processInstance.isSuspended();
if (isSuspend) {
//如果挂起了,就将这个实例激活
runtimeService.activateProcessInstanceById(processInstanceId);
System.out.println("流程实例ID为" + processInstanceId + "被激活了");
}else {
//否则就挂起
runtimeService.suspendProcessInstanceById(processInstanceId);
System.out.println("流程定义ID为" + processInstanceId + "被挂起了");
}
}
}
再看一个流程变量Demo:
首先定义一个流程图:
这里填完请假单后,判断天数,是否大于3天,是则给部门后再总经理审批,否则部门后直接到人事存档。
public class EasyDemo {
public static void main0(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
//部署流程定义
repositoryService.createDeployment().addClasspathResource("diagram/holiday3.bpmn")
.addClasspathResource("diagram/holiday3.png")
.deploy();
//通过流程定义key启动一个流程实例,记得知道流程变量
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<String,Object>();
variables.put("user1", "zhangsan");
variables.put("user2", "lisi");
variables.put("user3", "wangwu");
variables.put("user4", "zhaoliu");
variables.put("num", 4); //zhangsan打算请假4天
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday3",variables);
System.out.println("流程实例ID:" + processInstance.getId());
System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());
System.out.println("流程定义key:" + processInstance.getProcessDefinitionKey());
}
public static void main1(String[] args) {
//办理任务
//1:查询zhangsan代办的任务
String currentUser = "zhangsan";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee(currentUser).list();
System.out.println(currentUser +" 待办的任务有:");
for (Task task : tasks) {
System.out.print(task.getName());
System.out.println(" 待办任务id:" + task.getId());
//zhangsan 待办的任务有:
// 填写请假单 待办任务id:14
}
//2:根据taskId处理任务,处理前可以多判断一下当前用户是否具有该任务的办理权限
String taskId = "14";
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(currentUser)
.singleResult();
if (task != null) {
taskService.complete(taskId);
System.out.println("任务处理完成");
}else {
System.out.println("您没有足够的权限");
}
}
public static void main2(String[] args) {
//办理任务
//1:查询lisi代办的任务
String currentUser = "lisi";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee(currentUser).list();
System.out.println(currentUser +" 待办的任务有:");
for (Task task : tasks) {
System.out.print(task.getName());
System.out.println(" 待办任务id:" + task.getId());
//lisi 待办的任务有:
// 部门领导审批 待办任务id:2502
}
//2:根据taskId处理任务,处理前可以多判断一下当前用户是否具有该任务的办理权限
String taskId = "2502";
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(currentUser)
.singleResult();
if (task != null) {
taskService.complete(taskId);
System.out.println("任务处理完成");
}else {
System.out.println("您没有足够的权限");
}
}
public static void main3(String[] args) {
//办理任务
//1:查询wangwu代办的任务
String currentUser = "wangwu";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee(currentUser).list();
System.out.println(currentUser +" 待办的任务有:");
if (tasks == null) {
System.out.println(currentUser + "当前无待办任务");
}else {
for (Task task : tasks) {
System.out.print(task.getName());
System.out.println(" 待办任务id:" + task.getId());
}
}
//2:根据taskId处理任务,处理前可以多判断一下当前用户是否具有该任务的办理权限
String taskId = "5002";
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(currentUser)
.singleResult();
if (task != null) {
taskService.complete(taskId);
System.out.println("任务处理完成");
}else {
System.out.println("您没有足够的权限");
}
}
public static void main(String[] args) {
//办理任务
//1:查询zhaoliu代办的任务
String currentUser = "zhaoliu";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee(currentUser).list();
System.out.println(currentUser +" 待办的任务有:");
if (tasks == null) {
System.out.println(currentUser + "当前无待办任务");
}else {
for (Task task : tasks) {
System.out.print(task.getName());
System.out.println(" 待办任务id:" + task.getId());
// zhaoliu 待办的任务有:
// 人事部存档 待办任务id:7502
}
}
//2:根据taskId处理任务,处理前可以多判断一下当前用户是否具有该任务的办理权限
String taskId = "7502";
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(currentUser)
.singleResult();
if (task != null) {
taskService.complete(taskId);
System.out.println("任务处理完成");
}else {
System.out.println("您没有足够的权限");
}
}
}
这是一种,直接在实例时把流程变量全给好,
还有一种是在任务节点处理完成后把流程变量给流程实例
(其实还有几种方式,但对于全局流程变量来说大体就分2种)
public class FlowVariable {
public static void main(String[] args) {
//续easydemo的流程,这次把流程变量在任务节点处理后定义。
//也就是在张三填写完请假单后,得到天数传给下一个节点(这里的流程变量作用域仍是全局的)
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("user1", "zhangsan");
variables.put("user2", "lisi");
variables.put("user3", "wangwu");
variables.put("user4", "zhaoliu");
RuntimeService runtimeService = processEngine.getRuntimeService();
//启动一个流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday3", variables);
System.out.println("流程实例id:"+processInstance.getProcessDefinitionId());
//流程实例id: 12501
//zhangsan开始处理任务
TaskService taskService = processEngine.getTaskService();
//看到待办任务(假设只有一个)
Task task = taskService.createTaskQuery().taskAssignee("zhangsan")
.singleResult();
//模拟zhangsan填写完请假表单
Integer day = 1;
Map<String, Object> var = new HashMap<String, Object>();
var.put("num", day);
//把zhangsan请假天数传入流程实例中
taskService.complete(task.getId(),var);
System.out.println("处理完成");
//此时lisi查看自己待办的任务
Task task2 = taskService.createTaskQuery().taskAssignee("lisi").singleResult();
System.out.println("lisi待办的任务:" + task2.getName());
//处理完成
taskService.complete(task2.getId());
System.out.println("处理完成");
//结果:lisi待办的任务:部门领导审批
//处理完成
//此时wangwu查看自己代办的任务
Task task3 = taskService.createTaskQuery().taskAssignee("wangwu").singleResult();
if (task3 == null) {
System.out.println("wangwu没有需要处理的任务");
//结果:wangwu没有需要处理的任务
}else {
System.out.println("wangwu待办的任务:" + task3.getName());
taskService.complete(task3.getId());
}
//此时zhaoliu查看自己代办的任务
Task task4 = taskService.createTaskQuery().taskAssignee("zhaoliu").singleResult();
if (task4 == null) {
System.out.println("zhaoliu没有需要处理的任务");
}else {
System.out.println("zhaoliu待办的任务:" + task4.getName());
taskService.complete(task4.getId());
}
}
}
另外流程变量的作用域仅在任务节点的情况(局部变量):
查询资料,说局部流程变量只能在该任务节点中设置和获取。
任务节点设置的流程局部变量只能在该“申请请假单”节点获取,“部门领导审批”节点或者"总经理审批"节点获取变量就为空。
public class LocalVariable {
public static void main0(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//由于上一小节操作失误,多启动了一个实例,找了数据库的表,得到实例id为15001
//所以就直接从zhangsan开整了
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery()
.processInstanceId("15001")
.taskAssignee("zhangsan")
.list();
if (tasks != null) {
for (Task task : tasks) {
System.out.println("zhangsan待办的任务" + task.getName());
System.out.println("设置局部流程变量。。。。");
taskService.setVariableLocal(task.getId(), "num", 2);
taskService.complete(task.getId());
}
}
}
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//由于上一小节操作失误,多启动了一个实例,找了数据库的表,得到实例id为15001
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery()
.processInstanceId("15001")
.taskAssignee("lisi")
.list();
if (tasks != null) {
for (Task task : tasks) {
System.out.println("lisi待办的任务:" + task.getName());
VariableInstance num = taskService.getVariableInstanceLocal(task.getId(), "num");
if (num == null) {
System.out.println("无值");
//无值
}else {
System.out.println(num.getValue());
}
}
}
}
}