一、使用EL表达式进行指定流程处理人
在流程部署之后,启动流程的时候进行runtimeService.startProcessInstanceByKey(processDefinitionKey, map)指定map集合。
/**
* 启动流程实例
* act_hi_actinst 流程实例执行历史
* act_hi_identitylink 流程参与用户信息历史
* act_hi_taskins 任务实例历史信息
* act_ru_execution 流程执行的信息
* act_ru_identitylink 流程参与者信息
* act_ru_task 任务信息
*
*/
@Test
public void startProcess() {
//1、创建流程ProcessEngine
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取流程RuntimeService服务
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
//定义处理人为EL表达式,需要对map集合中的【EL表达式】进行存储
Map<String, Object> map = new HashMap<>();
map.put("assign0", "Tom");
map.put("assign1", "Jerry");
map.put("assign2", "James");
//3、根据流程定义的id启动流程
ProcessInstance ins = runtimeService.startProcessInstanceByKey("MyEvection", map);
System.out.println("流程定义ID" + ins.getProcessDefinitionId());
System.out.println("流程实例ID" + ins.getId());
System.out.println("活动的ID" + ins.getActivityId());
}
指定assign的时候,使用定义的map的key即可。
二、使用监听器设置负责人
delegateTask.getName():表示用户任务节点
delegateTask.getEventName():表示用户在什么事件执行该监听器
/**
* Activiti监听器
*/
public class MyTaskListener implements TaskListener {
/**
* 使用监听器指定负责人
* @param delegateTask
*/
@Override
public void notify(DelegateTask delegateTask) {
if ("经理审批".equals(delegateTask.getName()) &&
"create".equals(delegateTask.getEventName())) {
delegateTask.setAssignee("Tom");
}
}
}
需要在bpmn文件中定义taskListener标签, event表示:在创建用户任务的时候执行监听器【有create、assignment、complete、delete】。
<userTask id="sid-67d434c8-7cfe-45e3-a548-bc9cee04d4e1" name="经理审批">
<documentation/>
<extensionElements>
<activiti:taskListener event="create" class="com.act.activiti.listener.MyTaskListener">
</activiti:taskListener>
</extensionElements>
</userTask>
三、设置流程变量
1、启动时设置流程变量
① 首先定义实体类用于封装变量信息
/**
* 出差申请流程变量对象
* 一定要实现Serializable序列化接口
*/
@Data
public class EvectionVo implements Serializable {
/**
* 主键
*/
private String id;
/**
* 出差天数
*/
private Integer num;
/**
* 出差单
*/
private String evectionName;
/**
* 起始日期
*/
private Date beginDate;
/**
* 结束日期
*/
private Date endDate;
}
② 编写启动流程信息
public void startProcess() {
//1、创建流程ProcessEngine
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取流程RuntimeService服务
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
//3、根据流程定义的id启动流程
ProcessInstance ins = runtimeService.startProcessInstanceByKey("MyEvection", map);*/
Map<String, Object> map = new HashMap<>();
EvectionVo evectionVo = new EvectionVo();
evectionVo.setNum(1);
map.put("evection", evectionVo);
ProcessInstance ins = runtimeService.startProcessInstanceByKey("MyEvection", map);
System.out.println("流程定义ID" + ins.getProcessDefinitionId());
System.out.println("流程实例ID" + ins.getId());
System.out.println("活动的ID" + ins.getActivityId());
}
③ Condition expression填写:定义时定义的变量名
2、任务办理时设置流程变量
public void completTask() {
//任务id
String key = "myEvection2";
// 任务负责人
String assingee = "张三";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
// 创建变量集合
Map<String, Object> map = new HashMap<>();
// 创建出差pojo对象
Evection evection = new Evection();
// 设置出差天数
evection.setNum(2d);
// 定义流程变量
map.put("evection", evection);
// 完成任务前,需要校验该负责人可以完成当前任务
// 校验方法:
// 根据任务id和任务负责人查询当前任务,如果查到该用户有权限,就完成
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assingee)
.singleResult();
if (task != null) {
//完成任务是,设置流程变量的值
taskService.complete(task.getId(), map);
System.out.println("任务执行完成");
}
}
3、设置global变量参数【办理时设置】
public void setGlobalVariableByExecutionId(){
// 当前流程实例执行 id,通常设置为当前执行的流程实例
String executionId="2601";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 创建出差pojo对象
Evection evection = new Evection();
// 设置天数
evection.setNum(3d);
// 通过流程实例 id设置流程变量
runtimeService.setVariable(executionId, "evection", evection);
// 一次设置多个值
// runtimeService.setVariables(executionId, variables)
}
4、设置global变量参数【通过当前任务设置】
public void setGlobalVariableByTaskId(){
//当前待办任务id
String taskId="1404";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Evection evection = new Evection();
evection.setNum(3);
//通过任务设置流程变量
taskService.setVariable(taskId, "evection", evection);
//一次设置多个值
//taskService.setVariables(taskId, variables)
}
5、设置local变量参数【办理时设置】
public void completTask() {
//任务id
String taskId = "1404";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
// 定义流程变量
Map<String, Object> variables = new HashMap<String, Object>();
Evection evection = new Evection ();
evection.setNum(3d);
// 定义流程变量
Map<String, Object> variables = new HashMap<String, Object>();
// 变量名是holiday,变量值是holiday对象
variables.put("evection", evection);
// 设置local变量,作用域为该任务
taskService.setVariablesLocal(taskId, variables);
// 完成任务
taskService.complete(taskId);
}
6、设置local变量参数【通过当前任务设置】
public void setLocalVariableByTaskId(){
// 当前待办任务id
String taskId="1404";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Evection evection = new Evection ();
evection.setNum(3d);
// 通过任务设置流程变量
taskService.setVariableLocal(taskId, "evection", evection);
// 一次设置多个值
//taskService.setVariablesLocal(taskId, variables)
}
四、组任务设置
1、查询组任务
在流程定义的时候指定 Assign 为多人
主要代码:taskCandidateUser(“Tom”);
到act_ru_identitylink中查询候选人数据
/**
* 查询组任务
*/
@Test
public void getGroupTask() {
ProcessEngineConfiguration processEngineConfigurationFromResource = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
ProcessEngine processEngine = processEngineConfigurationFromResource.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("MyEvection-groupTask")
.taskCandidateUser("Tom") //根据候选人查询任务
.list();
for (Task task : taskList) {
System.out.println("任务负责人ID" + task.getAssignee());
System.out.println("任务ID" + task.getId());
System.out.println("流程实例ID" + task.getProcessInstanceId());
System.out.println("===============================");
}
}