SpringBoot整合Camunda(二)

1、绘制bpmn流程图

一、下载流程图绘制工具

https://camunda.com/download/...java

二、建立bpmn流程图

clipboard.png
这里咱们建立一个简单的流程,该流程中只有一个审核节点,而且不须要判断审核是赞成仍是拒绝。而且在审核节点咱们设置了一个属性,将该节点的任务归属到camunda-admin这个组。
clipboard.pngapp

2、编写代码

一、保存流程图

将咱们绘制好的bpmn文件拷贝到上一文建立的项目的resources目录下,这里咱们在resources下建立一个子目录bpmn用于放置咱们的流程图。
clipboard.pngide

二、编写基础接口

(1)流程发起接口

/**
 * 发起流程
 *
 * @param param ProcessStartParam
 * @return ResultBean
 */
@ApiOperation("发起流程")
@PostMapping("/process/start")
public ResultBean<?> startProcess(@Valid @RequestBody ProcessStartParam param) {
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(param.getProcessDefinitionId());
    Map<String, Object> map = new HashMap<>();
    map.put("processDefinitionId", processInstance.getProcessDefinitionId());
    map.put("processInstanceId", processInstance.getProcessInstanceId());
    map.put("businessKey", processInstance.getBusinessKey());
    map.put("caseInstanceId", processInstance.getCaseInstanceId());
    map.put("rootProcessInstanceId", processInstance.getRootProcessInstanceId());
    return new ResultBean<>(HttpServletResponse.SC_OK, "SUCCESS", map);
}

(2)本身的任务列表

/**
 * 本身的任务列表
 *
 * @param assignee 任务所属者
 * @return ResultBean
 */
@ApiOperation("查询本身的任务列表")
@GetMapping("/self/tasks")
public ResultBean<?> selfTaskList(@RequestParam("assignee") String assignee) {
    List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
    if (tasks != null && !tasks.isEmpty()) {
        List<Map<String, Object>> resultList = new ArrayList<>(tasks.size());
        tasks.forEach(task -> {
            Map<String, Object> map = new HashMap<>(3);
            map.put("processDefinitionId", task.getProcessDefinitionId());
            map.put("processInstanceId", task.getProcessInstanceId());
            map.put("taskId", task.getId());
            resultList.add(map);
        });
        return new ResultBean<>(HttpServletResponse.SC_OK, "SUCCESS", resultList);
    } else {
        return new ResultBean<>(HttpServletResponse.SC_OK, "SUCCESS", "未查询到任务列表");
    }
}

(3)可用任务列表

/**
 * 可用任务列表
 *
 * @param username 用户名称
 * @return ResultBean
 */
@ApiOperation("可用任务列表")
@GetMapping("/available/tasks")
public ResultBean<?> availableTaskList(@RequestParam("username") String username) {
    //一、根据用户名查询所在组
    List<Group> list = identityService.createGroupQuery().groupMember(username).list();
    if (list != null && !list.isEmpty()) {
        //二、获取全部组名
        //这里我配置错了,错把id当name了。
        List<String> collect = list.stream().map(Group::getId).collect(Collectors.toList());
        //三、根据组名查询全部任务
        List<Task> tasks = taskService.createTaskQuery().taskCandidateGroupIn(collect).list();
        if (tasks != null && !tasks.isEmpty()) {
            List<Map<String, Object>> resultList = new ArrayList<>(tasks.size());
            tasks.forEach(task -> {
                Map<String, Object> map = new HashMap<>(3);
                map.put("processDefinitionId", task.getProcessDefinitionId());
                map.put("processInstanceId", task.getProcessInstanceId());
                map.put("taskId", task.getId());
                resultList.add(map);
            });
            return new ResultBean<>(HttpServletResponse.SC_OK, "SUCCESS", resultList);
        } else {
            return new ResultBean<>(HttpServletResponse.SC_OK, "SUCCESS", "未查询到任务列表");
        }
    } else {
        return new ResultBean<>(HttpServletResponse.SC_NOT_FOUND, "ERROR", "未查询到所属组");
    }
}

(4)任务领取

/**
 * 任务领取
 *
 * @param param TaskClaimParam
 * @return ResultBean
 */
@ApiOperation("任务领取")
@PostMapping("/claim/task")
public ResultBean<String> claimTask(@Valid @RequestBody TaskClaimParam param) {
    //一、查询组名
    List<Group> list = identityService.createGroupQuery().groupMember(param.getUsername()).list();
    if (list != null && !list.isEmpty()) {
        List<String> collect = list.stream().map(Group::getId).collect(Collectors.toList());
        //二、查询任务
        Task task = taskService.createTaskQuery().taskCandidateGroupIn(collect).processInstanceId(param.getProcessInstanceId()).singleResult();
        if (task != null) {
            //三、判断该任务是否被领取
            if (StringUtils.isBlank(task.getAssignee())) {
                taskService.claim(task.getId(), param.getUsername());
                return new ResultBean<>(HttpServletResponse.SC_OK, "SUCCESS", "任务领取成功");
            } else {
                return new ResultBean<>(HttpServletResponse.SC_FOUND, "SUCCESS", "任务已被他人领取");
            }
        } else {
            return new ResultBean<>(HttpServletResponse.SC_NOT_FOUND, "ERROR", "未查询到任务");
        }
    } else {
        return new ResultBean<>(HttpServletResponse.SC_NOT_FOUND, "ERROR", "未查询到所属组");
    }
}

(5)任务审核

/**
 * 任务审核
 *
 * @param param TaskReviewParam
 * @return ResultBean
 */
@ApiOperation("任务审核")
@PostMapping("/review/task")
public ResultBean<String> review(@Valid @RequestBody TaskReviewParam param) {
    //一、查询任务
    Task task = taskService.createTaskQuery().taskId(param.getTaskId()).taskAssignee(param.getUsername()).singleResult();
    if (task != null) {
        taskService.complete(param.getTaskId());
        return new ResultBean<>(HttpServletResponse.SC_OK, "SUCCESS", "任务审核成功");
    } else {
        return new ResultBean<>(HttpServletResponse.SC_NOT_FOUND, "ERROR", "未查询到任务");
    }
}

(6)流程历史记录

/**
 * 流程历史记录
 *
 * @param processInstanceId 流程实例id
 * @return ResultBean
 */
@ApiOperation("流程历史记录")
@GetMapping("/histories")
public ResultBean<?> processHistories(@RequestParam("processInstanceId") String processInstanceId) {
    List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).list();
    if (list != null && !list.isEmpty()) {
        return new ResultBean<>(HttpServletResponse.SC_OK, "SUCCCESS", list);
    } else {
        return new ResultBean<>(HttpServletResponse.SC_NOT_FOUND, "ERROR", "未查询到流程历史");
    }
}

测试

懒得写

  • runtimeService: 该service提供跟流程相关的方法,例如开始一个流程,删除一个流程等。
  • identityService: 该service提供跟身份相关的方法,例如增长一个用户,增长一个组等。
  • taskService: 该service提供跟任务相关的方法,例如领取任务,审核任务等。
  • historyService: 该service提供跟历史记录相关的方法,例如流程历史记录,任务历史记录等。
camunda提供了不少种任务,也提供了很牛X的功能,一切尽在官网,去吧皮卡丘~~~
https://camunda.org
相关文章
相关标签/搜索