乐趣区

SpringBoot整合Camunda二

一、绘制 bpmn 流程图

1、下载流程图绘制工具

https://camunda.com/download/…

2、创建 bpmn 流程图


这里我们创建一个简单的流程,该流程中只有一个审核节点,并且不需要判断审核是同意还是拒绝。并且在审核节点我们设置了一个属性,将该节点的任务归属到 camunda-admin 这个组。

二、编写代码

1、保存流程图

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

2、编写基础接口

(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) {
    //1、根据用户名查询所在组
    List<Group> list = identityService.createGroupQuery().groupMember(username).list();
    if (list != null && !list.isEmpty()) {
        //2、获取所有组名
        // 这里我配置错了,错把 id 当 name 了。List<String> collect = list.stream().map(Group::getId).collect(Collectors.toList());
        //3、根据组名查询所有任务
        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) {
    //1、查询组名
    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());
        //2、查询任务
        Task task = taskService.createTaskQuery().taskCandidateGroupIn(collect).processInstanceId(param.getProcessInstanceId()).singleResult();
        if (task != null) {
            //3、判断该任务是否被领取
            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) {
    //1、查询任务
    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

退出移动版