文章
问答
冒泡
三、camunda学习-通过接口执行流程
上篇中,我们实践了,基于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());
}
 
调用接口,得到流程列表
0
 
 
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
0
 
0
 
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表单信息
0
 
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完成任务
0
 
到界面上可以看到,已经进入到下一个节点了
0
 
以上,便可以用接口的形式完成一个工作流。
另外,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
例如获取 所有流程实例的接口
0
 
camunda

关于作者

落雁沙
非典型码农
获得点赞
文章被阅读