上篇中,我们实践了,基于camunda自带界面,执行流程。但是,在实际情况中,工作流会与业务紧密结合。所以,我们需要通过接口形式来触发流程的进行。
还是沿用上篇的流程。我们用接口调用的方式来执行
注意,camunda字典的entity 很多是不能直接序列化的,我们需要自己用对象处理
1.通过接口来获取流程列表
private final RepositoryService repositoryService;
/**
* 获取流程列表
* @return
*/
@GetMapping(value = "process-definitions")
public List<ProcessDefinitionVO> processDefinitions() {
List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery().list();
return processDefinitions.stream().map(t -> ProcessDefinitionVO.builder().id(t.getId()).key(t.getKey()).resourceName(t.getResourceName()).build()).collect(Collectors.toList());
}
调用接口,得到流程列表
2.开始流程
private final RuntimeService runtimeService;
/**
* 开始流程
* @param id
* @param map
* @return
*/
@PostMapping(value = "process/{id}")
public String startProcess(@PathVariable(value = "id") String id, @RequestBody Map<String, Object> map) {
Execution execution = runtimeService.startProcessInstanceById(id, map);
return execution.getProcessInstanceId();
}
根据流程ID来开始流程,返回实例ID
3.获取当前任务节点信息
/**
* 获取当前task
* @param processId
* @return
*/
@GetMapping(value = "task/active/{processId}")
public TaskVO tasks(@PathVariable(value = "processId") String processId) {
Task task = taskService.createTaskQuery().processInstanceId(processId).active().singleResult();
if (Objects.isNull(task)) {
return null;
}
List<TaskFormFieldVO> formFields = new ArrayList<>();
TaskFormData formData = formService.getTaskFormData(task.getId());
if (Objects.nonNull(formData) && !CollectionUtils.isEmpty(formData.getFormFields())) {
formFields = formData.getFormFields().stream().map(t -> TaskFormFieldVO.builder().businessKey(t.isBusinessKey()).id(t.getId()).label(t.getLabel()).type(t.getTypeName()).build()).collect(Collectors.toList());
}
return TaskVO.builder().id(task.getId()).name(task.getName()).description(task.getDescription()).formFields(formFields).build();
}
获得当前任务节点信息还有form表单信息
4.完成任务节点
/**
* 完成task
* @param taskId
* @param map
*/
@PutMapping("task/complete/{taskId}")
public void taskCompete(@PathVariable(value = "taskId") String taskId,@RequestBody Map<String, Object> map){
taskService.complete(taskId,map);
}
根据taskId完成任务
到界面上可以看到,已经进入到下一个节点了
以上,便可以用接口的形式完成一个工作流。
另外,camunda自己也提供了一套reatapi ,文档:https://docs.camunda.org/manual/7.16/reference/rest/
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
</dependency>
默认前缀是engin-rest
例如获取 所有流程实例的接口