weixin_58662786 2023-03-18 14:31 采纳率: 63.6%
浏览 36
已结题

Activiti关于获得用户审批流程的问题

项目里面要用activiti写用户审批流程,在用户审批结束之后,正在运行的流程里面用户审批的流程结束,页面上无法显示已经结束的审批流程。想让大家看看目前做法是否可行,还有没有更简单的方法,这样后期方便维护。

目前用户流程中的审批已经写好,需要添加用户结束的审批流程,并在里面添加必要的流程变量,有没有办法一下都取出来,因为后面要做分页。

图中做了两个query,想分别取出正在运行的审批流程和已经结束的审批流程,但是最后合在一起的话分页会很麻烦,不知道有没有办法将query合并起来。

img

  • 写回答

7条回答 默认 最新

  • CodeBytes 2023-03-18 14:47
    关注

    该回答引用ChatGPT

    如有疑问,可以回复我!

    可以尝试将两个查询(正在运行的审批流程和已结束的审批流程)放在同一个查询中,然后按照创建时间对结果进行排序。这样可以简化查询逻辑,同时也方便进行分页。以下是一个示例代码:

    
    // 获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
    // 获取TaskService和HistoryService
    TaskService taskService = processEngine.getTaskService();
    HistoryService historyService = processEngine.getHistoryService();
    
    // 正在运行的审批流程查询
    TaskQuery runningTasksQuery = taskService.createTaskQuery()
        .taskDefinitionKey("Activity_test_Approval")
        .taskCandidateOrAssigned(currentUserId)
        .orderByTaskCreateTime().asc();
    
    // 已结束的审批流程查询
    HistoricTaskInstanceQuery finishedTasksQuery = historyService.createHistoricTaskInstanceQuery()
        .taskDefinitionKey("Activity_test_Approval")
        .finished()
        .orderByTaskCreateTime().desc();
    
    // 合并正在运行的审批流程和已结束的审批流程
    List<Task> runningTasks = runningTasksQuery.list();
    List<HistoricTaskInstance> finishedTasks = finishedTasksQuery.list();
    
    List<Object> allTasks = new ArrayList<>();
    allTasks.addAll(runningTasks);
    allTasks.addAll(finishedTasks);
    
    // 对结果进行排序
    allTasks.sort((task1, task2) -> {
        Date createTime1 = task1 instanceof Task ? ((Task) task1).getCreateTime() : ((HistoricTaskInstance) task1).getCreateTime();
        Date createTime2 = task2 instanceof Task ? ((Task) task2).getCreateTime() : ((HistoricTaskInstance) task2).getCreateTime();
        return createTime1.compareTo(createTime2);
    });
    
    // 计算总数
    long total = runningTasksQuery.count() + finishedTasksQuery.count();
    
    // 对结果进行分页
    int pageSize = 10;
    int pageNumber = 1; // 从1开始
    List<Object> pagedTasks = allTasks.subList((pageNumber - 1) * pageSize, Math.min(pageNumber * pageSize, allTasks.size()));
    
    

    这个示例代码首先分别获取正在运行的审批流程和已结束的审批流程,然后将它们合并到一个列表中,并按照创建时间对结果进行排序。接着,计算总数以及进行分页。

    这种方法可以简化查询逻辑,并且使分页更加简单。不过,请注意,如果任务数量很大,这种方法可能会导致性能问题。如果您在实际应用中遇到性能问题,可以尝试优化查询逻辑,例如使用原生SQL查询或者其他技术

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月18日

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题