基于若依的ruoyi-nbcio流程管理系统自定义业务撤回功能的修复

简介: 基于若依的ruoyi-nbcio流程管理系统自定义业务撤回功能的修复

更多ruoyi-nbcio功能请看演示系统

gitee源代码地址

前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio

演示地址:RuoYi-Nbcio后台管理系统

更多nbcio-boot功能请看演示系统

gitee源代码地址

后端代码: https://gitee.com/nbacheng/nbcio-boot

前端代码:https://gitee.com/nbacheng/nbcio-vue.git

在线演示(包括H5) : http://122.227.135.243:9888

 

      撤回功能主要是针对我审批完后的一种操作方式,只能我自己审批完到下一节点的时候才能做撤回操作,比如我审批通过了,我可以进行撤回,但一旦下一个节点也被人审批了,那我就不能撤回了。

    具体的代码如下,主要是修复对自定义业务关联表的数据更新:

@Override
    @Transactional(rollbackFor = Exception.class)
    public void revokeProcess(WfTaskBo taskBo) {
        String procInsId = taskBo.getProcInsId();
        String taskId = taskBo.getTaskId();
        // 校验流程是否结束
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
            .processInstanceId(procInsId)
            .active()
            .singleResult();
        if(ObjectUtil.isNull(processInstance)) {
            throw new RuntimeException("流程已结束或已挂起,无法执行撤回操作");
        }
        // 获取待撤回任务实例
        HistoricTaskInstance currTaskIns = historyService.createHistoricTaskInstanceQuery()
            .taskId(taskId)
            .taskAssignee(TaskUtils.getUserName())
            .singleResult();
        if (ObjectUtil.isNull(currTaskIns)) {
            throw new RuntimeException("当前任务不存在,无法执行撤回操作");
        }
        // 获取 bpmn 模型
        BpmnModel bpmnModel = repositoryService.getBpmnModel(currTaskIns.getProcessDefinitionId());
        UserTask currUserTask = ModelUtils.getUserTaskByKey(bpmnModel, currTaskIns.getTaskDefinitionKey());
        // 查找下一级用户任务列表
        List<UserTask> nextUserTaskList = ModelUtils.findNextUserTasks(currUserTask);
        List<String> nextUserTaskKeys = nextUserTaskList.stream().map(UserTask::getId).collect(Collectors.toList());
        // 获取当前节点之后已完成的流程历史节点
        List<HistoricTaskInstance> finishedTaskInsList = historyService.createHistoricTaskInstanceQuery()
            .processInstanceId(procInsId)
            .taskCreatedAfter(currTaskIns.getEndTime())
            .finished()
            .list();
        for (HistoricTaskInstance finishedTaskInstance : finishedTaskInsList) {
            // 检查已完成流程历史节点是否存在下一级中
            if (CollUtil.contains(nextUserTaskKeys, finishedTaskInstance.getTaskDefinitionKey())) {
                throw new RuntimeException("下一流程已处理,无法执行撤回操作");
            }
        }
        // 获取所有激活的任务节点,找到需要撤回的任务
        List<Task> activateTaskList = taskService.createTaskQuery().processInstanceId(procInsId).list();
        List<String> revokeExecutionIds = new ArrayList<>();
        for (Task task : activateTaskList) {
            // 检查激活的任务节点是否存在下一级中,如果存在,则加入到需要撤回的节点
            if (CollUtil.contains(nextUserTaskKeys, task.getTaskDefinitionKey())) {
                // 添加撤回审批信息
                taskService.setAssignee(task.getId(), TaskUtils.getUserName());
                taskService.addComment(task.getId(), task.getProcessInstanceId(), FlowComment.REVOKE.getType(), LoginHelper.getNickName() + "撤回流程审批");
                revokeExecutionIds.add(task.getExecutionId());
            }
        }
        try {
            runtimeService.createChangeActivityStateBuilder()
                .processInstanceId(procInsId)
                .moveExecutionsToSingleActivityId(revokeExecutionIds, currTaskIns.getTaskDefinitionKey()).changeState();
            String dataId = taskBo.getDataId();
            if(StringUtils.isNotEmpty(dataId)) {
              //当前任务信息
                List<Task> listtask = taskService.createTaskQuery().processInstanceId(procInsId).taskAssignee(TaskUtils.getUserName()).list();
              WfMyBusiness business = wfMyBusinessService.getByDataId(dataId);
              //更新自定义业务任务关联表与流程历史表,以便可以重新发起流程。
              if (business != null) {
                if (listtask != null && listtask.size()>0) {
                  business.setActStatus(ActStatus.revoke);
                    business.setTodoUsers(listtask.get(0).getAssignee());
                }
                else {
                  business.setActStatus(ActStatus.revoke);
                  business.setTodoUsers("");
                  business.setDoneUsers("");
                  business.setProposer("");
                  business.setTaskName("");
                  business.setTaskId("");
                  business.setTaskNameId("");
                }
                
                  wfMyBusinessService.updateById(business);
                } 
            }
        } catch (FlowableObjectNotFoundException e) {
            throw new RuntimeException("未找到流程实例,流程可能已发生变化");
        } catch (FlowableException e) {
            throw new RuntimeException("执行撤回操作失败");
        }
    }

   

相关文章
|
11月前
|
弹性计算 人工智能 安全
阿里云Alibaba Cloud Linux是什么?Alibaba Cloud Linux镜像系统问题解答FAQ
Alibaba Cloud Linux是阿里云自研的免费Linux操作系统,兼容CentOS/RHEL生态,提供十年长期支持。深度优化云服务器ECS性能,支持AI、大数据、数据库等场景,具备安全加固、内核热补丁、多架构支持等能力,广泛应用于阿里云大规模实例部署。
1121 3
|
移动开发 前端开发
基于jeecg-boot的flowable流程审批时增加下一个审批人设置
基于jeecg-boot的flowable流程审批时增加下一个审批人设置
1816 0
|
11月前
|
Web App开发 JSON 监控
零配置方案:Zabbix + HTTP 代理实现内网穿透工具的自动化管理
本文作者蔡斯,Zabbix社区签约专家,Zabbix 6.0/7.0官方译者。文章探讨如何利用Zabbix的HTTP代理与低级别发现(LLD)功能,实现对免费内网穿透工具的自动化监控,解决多账号、多设备管理难、服务状态盲区等痛点,打造零侵入、零配置、无限扩展的智能监控体系。
498 0
|
前端开发 Java API
SpringBoot整合Flowable【07】- 驳回节点任务
本文通过绩效流程的业务场景,详细介绍了如何在Flowable工作流引擎中实现任务驳回功能。具体步骤包括:获取目标任务节点和当前任务节点信息,进行必要的判空和逻辑校验,调用API完成节点回退,并清理相关脏数据(如历史任务和变量)。最后通过测试验证了驳回功能的正确性,确保流程能够成功回退到指定节点并清除中间产生的冗余数据。此功能在实际业务中非常有用,能够满足上级驳回自评等需求。
3370 0
SpringBoot整合Flowable【07】- 驳回节点任务
|
人工智能 数据挖掘 API
R2R:开源的 RAG 集成系统,支持多模态处理、混合搜索、知识图谱构建等增强检索技术
R2R 是一款先进的 AI 检索增强生成平台,支持多模态内容处理、混合搜索和知识图谱构建,适用于复杂数据处理和分析的生产环境。
1526 3
R2R:开源的 RAG 集成系统,支持多模态处理、混合搜索、知识图谱构建等增强检索技术
|
前端开发 数据库 JavaScript
基于Flowable的流程挂接自定义业务表单的设计与实践
文章讨论了如何在Flowable流程引擎中挂接自定义业务表单,以及相关设计和实践的步骤。文章中包含了一些前后端代码示例,如Vue组件的模板和脚本部分,这些代码用于实现与Flowable流程引擎交互的界面。例如,有一个按钮组件用于提交申请,点击后会触发applySubmit方法,该方法会与后端API进行交互,处理流程启动、查询关联流程等逻辑。
55332 11
|
JSON NoSQL MongoDB
mongodb导出聚合查询的数据
mongodb导出聚合查询的数据
|
机器学习/深度学习 人工智能 自动驾驶
实战案例分析:AI在特定行业的深度应用
【7月更文第20天】随着人工智能技术的飞速发展,其在各行各业的应用日益广泛且深入,不仅推动了产业创新,也极大地提升了服务效率与质量。本文将聚焦于金融、教育、和交通三大领域,通过具体案例与技术解析,展现AI如何在这三个行业中发挥着革命性的作用。
2583 0
|
负载均衡 Java 调度
xxl-job与其他调度框架比较与部署
xxl-job与其他调度框架比较与部署
xxl-job与其他调度框架比较与部署