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
相關文章
相關標籤/搜索