Flowable工作流简单应用(我的待办,我的申请,我的处理)

一、我的申请 (包括已经完成审批的和正在审批的)

思路:

1.现根据USER_ID查询历史流程实例

2.遍历所有实例,获取实例的任务节点列表,并且以时间排序

3.判断当前节点是否通过,若存在DeleteReason,表示被驳回

注意:一个流程实例包含多个任务节点,是一对多。遍历一个流程实例,只能查到已通过的节点和正在审批的节点,因为后续节点不一定知道是谁审批。

二、我的处理

思路:

1.通过taskService,传入assignee查询到我的待办任务
2.根据任务查询对应的历史流程实例列表
3.遍历流程实例,获取各个任务信息

三、我的待办

思路:
1.通过taskService,传入assignee查询到我的待办任务
2.根据任务查询对应的历史流程实例列表
3.遍历流程实例,获取各个任务信息
 

        拿到流程实例后就是遍历实例获取各个任务阶段的信息,因此可以把此操作封装一下,提高代码复用性

先封装了两个实体类

@Data
public class ProcIns {
  //发起人
    private String starter;
    //申请原因
    private String reason;
    //开启流程的时间
    private LocalDateTime procCreateTime;
    //流程实例结束时间
    private LocalDateTime procEndTime;
    //实例id
    private String proInsId;
    //申请原因
    private String procStatus;
    private List<TaskInfo> tasks;
}
@Data
public class TaskInfo {
    //审核人
    private String userName;
    //任务状态
    private String taskStatus;
    //审核意见
    private String message;
    //审批时间
    private LocalDateTime taskTime;
    //taskId
    private String taskId;

}
/**
     * 案例:我的申请(包含已完成审批的和正在审批的)
     * 思路:
     * 1.现根据USER_ID查询流程实例
     * 2.遍历所有实例,获取实例的任务节点列表,并且以时间排序
     * 3.判断当前节点是否通过,若存在DeleteReason,表示被驳回,若当前节点不存在删除原因,则查询审批意见
     */
    @GetMapping("/mySubmit")
    Result mySubmit(String userId,Integer page,Integer pageSize) {
        //查询发起人1的任务
        List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery()
                .startedBy(userId)
                .orderByProcessInstanceStartTime().asc()
                .listPage((page-1)*pageSize,pageSize);
        ArrayList<ProcIns> procIns = handleProcInsList(list);
        return Result.success(procIns);
    }

    /**
     * 我的待办
     * 1.通过taskService,传入assignee查询到我的待办任务
     * 2.根据任务查询对应的历史流程实例列表
     * 3.遍历流程实例,获取各个任务信息
     */
    @GetMapping("/myTodo")
    Result myTodo(String userId,Integer page,Integer pageSize) {
        List<Task> tasks = taskService.createTaskQuery().taskAssignee(userId).orderByTaskCreateTime().asc()
                .listPage((page - 1) * pageSize, pageSize);
        List<HistoricProcessInstance> processInstances = new ArrayList<>();

        tasks.forEach(task -> {
            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
            processInstances.add(historicProcessInstance);
        });

        ArrayList<ProcIns> procIns = handleProcInsList(processInstances);
        return Result.success(procIns);
    }
    /**
     * 我的处理
     * 1.通过taskService,传入assignee查询到我的待办任务
     * 2.根据任务查询对应的历史流程实例列表
     * 3.遍历流程实例,获取各个任务信息
     */
    @GetMapping("/myHandle")
    Result myHandle(String userId,Integer page,Integer pageSize) {
        List<HistoricTaskInstance> hisTaskInsList = historyService.createHistoricTaskInstanceQuery()
                .finished()
                .taskAssignee(userId)
                .orderByTaskCreateTime().asc()
                .listPage((page - 1) * pageSize, pageSize);

        List<HistoricProcessInstance> processInstances = new ArrayList<>();
        hisTaskInsList.forEach(task -> {
            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
            processInstances.add(historicProcessInstance);
        });

        ArrayList<ProcIns> procIns = handleProcInsList(processInstances);
        return Result.success(procIns);
    }


	//遍历流程实例,获取任务信息
    public ArrayList<ProcIns> handleProcInsList(List<HistoricProcessInstance> list){
        ArrayList<ProcIns> procList = new ArrayList<>();
        list.forEach(procIns -> {
            ProcIns proc = new ProcIns();
            proc.setStarter(proc.getStarter());
            proc.setProInsId(procIns.getId());
            //查询申请原因 全局变量reason
            HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(procIns.getId()).variableName("reason").singleResult();
            if(variableInstance!=null){
                proc.setReason(variableInstance.getValue().toString());
            }
            proc.setProcCreateTime(LocalDateTime.ofInstant(procIns.getStartTime().toInstant(),ZoneId.systemDefault()));
            if(procIns.getEndTime()!=null){
                //整个流程已经结束
                proc.setProcEndTime(LocalDateTime.ofInstant(procIns.getEndTime().toInstant(),ZoneId.systemDefault()));
                proc.setProcStatus("流程已结束");
            }else {
                //流程还没结束
                proc.setProcStatus("处理中...");
            }
            //根据流程实例ID查询实例的具体信息(先获得节点列表),注意先后排序
            List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery().processInstanceId(procIns.getId()).orderByTaskCreateTime().asc().list();
            ArrayList<TaskInfo> taskList = new ArrayList<>();
            tasks.forEach(hisTask -> {
                TaskInfo taskInfo = new TaskInfo();
                taskInfo.setUserName("审核人:" + hisTask.getAssignee());
                taskInfo.setTaskId("任务ID:" + hisTask.getId());
                //判断当前节点是否已经审批
                if (hisTask.getEndTime() == null) {
                    //说明未审批
                    taskInfo.setTaskStatus("任务状态:未审批");
                    //后续节点是查不到的(hisTask中只包含 已经处理的节点 和 正在处理的节点,不含没处理的节点)
                } else {
                    //当前节点已审批
                    taskInfo.setTaskStatus("任务状态:已审批");
                    taskInfo.setTaskId("任务ID:" + hisTask.getId());
                    taskInfo.setUserName("审批人:" + hisTask.getAssignee());
                    //Date-->LocalDateTime
                    taskInfo.setTaskTime(LocalDateTime.ofInstant(hisTask.getEndTime().toInstant(), ZoneId.systemDefault()));
                    //如果当前节点拒绝原因为空,则查询审批意见
                    if (StrUtil.isEmpty(hisTask.getDeleteReason())) {
                        List<Comment> taskComments = taskService.getTaskComments(hisTask.getId());
                        taskComments.forEach(comment -> {
                            //taskInfo.setStatus("任务状态:通过");
                            taskInfo.setMessage("审核信息:" + comment.getFullMessage());
                        });
                    } else {
                        //驳回节点
                        taskInfo.setTaskStatus("任务状态:驳回");
                        taskInfo.setUserName("驳回节点:" + hisTask.getAssignee());
                        taskInfo.setMessage("驳回原因:" + hisTask.getDeleteReason());
                    }
                }
                taskList.add(taskInfo);
            });
            proc.setTasks(taskList);
            procList.add(proc);
        });
        procList.forEach(procIns -> {
            System.out.println(procIns);
            System.out.println(" ");
        });
        return procList;
    }

好的,以下是一个简单Flowable 请假工作流的实现: 1. 创建一个请假表单,包含以下字段:请假人、请假类型、请假开始时间、请假结束时间、请假事由。 2. 在 Flowable Modeler 中创建一个流程模型,添加以下任务节点: - 提交申请:请假人提交请假申请。 - 经理审批:请假申请提交给经理审批。 - HR审批:请假申请提交给 HR 审批。 - 结束流程:请假申请被批准或拒绝,流程结束。 3. 在 Flowable Modeler 中创建一个流程变量: - approved:一个布尔类型的变量,用于记录请假申请是否被批准。 4. 将任务节点连接起来,设置条件流程: - 提交申请 -> 经理审批:当请假类型为病假或事假且请假天数小于等于 3 天时,自动提交给经理审批。 - 提交申请 -> HR审批:当请假类型为病假或事假且请假天数大于 3 天时,自动提交给 HR 审批。 - 经理审批 -> 结束流程:当经理批准请假申请时,将 approved 变量设置为 true 并结束流程。 - HR审批 -> 结束流程:当 HR 批准请假申请时,将 approved 变量设置为 true 并结束流程。 - 经理审批、HR审批 -> 结束流程:当经理或 HR 拒绝请假申请时,将 approved 变量设置为 false 并结束流程。 5. 在 Flowable Modeler 中添加流程监听器: - on leave request submit:监听提交申请任务节点的完成事件,设置请假开始时间为当前时间。 - on manager approve:监听经理审批任务节点的完成事件,设置请假结束时间为当前时间。 - on HR approve:监听 HR 审批任务节点的完成事件,设置请假结束时间为当前时间。 6. 部署流程模型。 7. 在应用程序中使用 Flowable API 来启动请假流程: - 创建一个 ProcessInstance 对象。 - 设置流程变量,包括请假人、请假类型、请假天数、请假事由等信息。 - 启动流程实例。 8. 在应用程序中使用 Flowable API 来完成任务节点: - 获取待办任务列表。 - 完成任务节点,包括审批意见、审批结果等信息。 以上就是一个简单Flowable 请假工作流的实现步骤,具体实现可以根据业务需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值