接上回工作流程图
1、注册工作流实例
例:http://127.0.0.1:8089/test/workflow/registerProcesses/applicationForLeave
Controller层
/**
* 将资源部署到Camunda BPM的存储库中
* @param name 部署的名称
*/
@GetMapping("/registerProcesses/{name}")
public void registerProcesses(@PathVariable String name) {
taskService.registerProcesses(name);
}
service层
Deployment deployment = repositoryService.createDeployment()
.name(name)
.addClasspathResource("BPMN/diagram_2.bpmn")
.deploy();
成功执行完后可在管理平台查看
2、启动已部署的流程的一个实例
例:http://127.0.0.1:8089/test/workflow/createProcesses/Process_1yvyhsf
Controller层
/**
* 启动已部署的流程的一个实例
* @param id 流程ID
*/
@GetMapping("/createProcesses/{id}")
public void createProcesses(@PathVariable String id) {
taskService.createProcesses(id);
}
service层
ProcessInstance studyCamunda = runtimeService.startProcessInstanceByKey(id);
执行后可在管理页面上查看状态
3、流程执行
controller层
/**
* 流程处理
* @param id 流程ID
* @return
*/
@GetMapping("/taskOfProcesses/{id}")
public String taskOfProcesses(@PathVariable String id) {
return taskService.taskOfProcesses(id);
}
service层
public String taskOfProcesses(String id) {
List<ProcessInstance> list = runtimeService.createProcessInstanceQuery()
.processDefinitionKey(id)
.active()
.list();
if (list.isEmpty()) {
throw new RuntimeException("未获取到流程实例");
}
ProcessInstance processInstance = list.get(0);
TaskQuery taskQuery = taskService.createTaskQuery()
.processInstanceId(processInstance.getId())
.active();
long count = taskQuery.count();
Task task = null;
List<Task> tasks = null;
if (count == 1) {
task = taskQuery.singleResult();
} else {
tasks = taskQuery.list();
}
if (task.getAssignee().equals("张三")) {
HashMap<String, Object> map = new HashMap<>();
map.put("a", "请假");
map.put("b", new Date());
taskService.setVariables(task.getId(), map);
taskService.complete(task.getId());
log.info("张三申请成功");
return "张三申请成功";
}
if (task.getAssignee().equals("主管")) {
Map<String, Object> variables = taskService.getVariables(task.getId());
log.info("variables={}", variables);
String flag = "true";
HashMap<String, Object> map = new HashMap<>();
map.put("flag", flag);
taskService.complete(task.getId(), map);
return "主管" + (flag.equals("true") ? "同意" : "不同意");
}
if (task.getAssignee().equals("经理")) {
for (int i = 0; i < tasks.size(); i++) {
taskService.complete(tasks.get(i).getId());
log.info("经理同意完成流程");
return "经理同意完成流程";
}
}
return null;
}
用例比较简单所以就把流程写到一个入口里面。