天天看點

工作流實戰_28_flowable 任務多執行個體

項目位址:​​https://gitee.com/lwj/flowable.git​​ 分支flowable-base

任務多執行個體由2種形式:

第1種場景:當多執行個體中的每一個勢力都辦理完任務後,節點流轉。

案例:當多執行個體節點由2個人(A,B)需要辦理此任務,A和B的代辦任務中都會有次任務需要辦理,當A辦理此任務後,會在已辦任務清單中檢視已辦任務,同時,A的代辦列在表中,仍然會有此待辦任務;當B辦理此任務後,節點進行流轉,AB待辦隊列中,無此待辦任務,均在已辦任務隊列中。

第2種場景:當多執行個體中設定結束條件,當滿足條件後,節點流轉。

案例:如下所述

業務場景:

收集每個員工的績效考核資訊;

收集一次組織活動的資訊;

一個合同需要三個經理審批,可以是順序的也可以是并行的;

一個合同計劃審批有30個人審批,隻需要其中70%的人審批通過即可。等等 *

1、任務多執行個體四個内置變量

屬性 解釋
nrOfInstances 一共有多少個執行個體
nrOfCompletedInstances 已經完成的執行個體個數
nrOfActiveInstances 未完成的執行個體個數

2、配置多執行個體

2.1、配置參數

工作流實戰_28_flowable 任務多執行個體

2.2、配置候選人

工作流實戰_28_flowable 任務多執行個體

2.3、配置結束條件

工作流實戰_28_flowable 任務多執行個體
public ReturnVo add(Leave leave, String sessionId) {
        ReturnVo returnVo = new ReturnVo(ReturnCode.FAIL, "添加失敗");
        try {
            String leaveId = UUIDGenerator.generate();
            leave.setId(leaveId);
            StartProcessInstanceVo startProcessInstanceVo = new StartProcessInstanceVo();
            startProcessInstanceVo.setBusinessKey(leaveId);
            User user = SecurityUtils.getCurrentUserObject();
            startProcessInstanceVo.setCreator(user.getId());
            startProcessInstanceVo.setCurrentUserCode(user.getId());
            startProcessInstanceVo.setFormName("請假流程");
            startProcessInstanceVo.setSystemSn("flow");
            startProcessInstanceVo.setProcessDefinitionKey("leave");
            Map<String, Object> variables = new HashMap<>();
            variables.put("days", leave.getDays());
            startProcessInstanceVo.setVariables(variables);
            //設定三個人作為多執行個體的人員
            List<String> userList = new ArrayList<>();
            userList.add("00000005");
            userList.add("00000006");
            variables.put("userList", userList);

            ReturnVo<ProcessInstance> returnStart = flowableProcessInstanceService.startProcessInstanceByKey(startProcessInstanceVo);
            if (returnStart.getCode().equals(ReturnCode.SUCCESS)){
                String processInstanceId = returnStart.getData().getProcessInstanceId();
                leave.setProcessInstanceId(processInstanceId);
                this.LeaveService.insertLeave(leave);
                returnVo = new ReturnVo(ReturnCode.SUCCESS, "添加成功");
            }else {
                returnVo = new ReturnVo(returnStart.getCode(), returnStart.getMsg());
            }
        } catch (Exception e) {
            logger.error("LeaveController-add:", e);
            e.printStackTrace();
        }
        return returnVo;
    }