Activiti找不到任务id的问题

Activiti的项目中出现了一个问题,如图所示,目前在做【我发起的流程】这个功能,当用户的任务流程还没结束的时候,可以直接从【我发起的流程】页面查看到数据,但是一旦用户任务流程结束,数据入库之后再打开页面会提示找不到任务id。

图中代码部分是通过调取taskid获取流程变量的一个方法。我尝试过手动将流程结束的数据直接插入到act_ru_variable表中,但是有其他关联表存在,插入失败。

接口的做法:查询历史流程变量,然后加上项目里需要的参数,比如taskid,前端那边拿到接口后拿数据的taskid去调图中的接口获取流程变量然后显示在页面上。

求各位帮忙看看问题出在哪里给个大致的解决方向。

img

img

img

该回答引用ChatGPT

如有疑问,可以回复我!

问题的根源在于你在流程结束后试图通过任务ID(taskid)来获取流程变量,然而任务ID在流程结束后可能已经失效。当流程实例结束时,所有与该实例相关的运行时数据(如任务、变量等)都会从运行时表(如 act_ru_task、act_ru_variable)移动到历史表(如 act_hi_taskinst、act_hi_varinst)中。因此,在流程结束后,你需要查询历史表来获取相关数据。

你可以尝试以下解决方案:

1、针对已结束的流程实例,查询历史表(如 act_hi_taskinst、act_hi_varinst)而不是运行时表(如 act_ru_task、act_ru_variable)。

2、修改接口以返回历史任务实例ID而不是任务ID。在前端页面上,根据流程实例是否已结束选择查询运行时任务还是历史任务实例。对于已结束的流程实例,你可以使用历史任务实例ID查询流程变量。

现在是这个方法查不到流程结束的任务吗

img


流程结束的任务不可能删掉的,你可以找到流程结束的数据单独写个接口调,最好不要动已有代码,屎山就是这样一步一步积累的,加油

基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦、”(最新版更智能,功能更加强大)

从您的描述中,我理解到您遇到了两个问题:1)任务流程结束后无法通过taskid获取流程变量;2)手动插入act_ru_variable表导致插入失败。

对于第一个问题,我建议您使用历史流程变量查询接口,例如使用以下代码:

scssCopy code
List<HistoricVariableInstance> variableInstances = historyService.createHistoricVariableInstanceQuery()
        .processInstanceId(processInstanceId)
        .list();

其中,processInstanceId是您要查询的流程实例的ID,可以通过您的前端页面传递过来。查询结果将返回该流程实例下所有的历史流程变量,您可以根据需要筛选出相关的变量进行展示。

对于第二个问题,手动插入act_ru_variable表并不是一个好的解决方案,因为在Activiti框架中,流程实例的状态是由多张表共同维护的,手动操作其中一张表可能会导致数据不一致,从而产生错误。因此,我建议您不要使用这种方式来解决问题。

综上所述,我认为正确的解决方案是:使用历史流程变量查询接口来获取流程变量并在前端页面展示。

根据您提供的信息,问题可能出在对于已经结束的流程,再次调用获取流程变量的方法时,无法找到之前的任务ID导致的。通常情况下,一旦流程结束,就不能再访问与该流程相关的任务和变量。

解决方案可能是将相关数据存储到永久性的数据存储中(如数据库),并确保可以轻松地检索这些数据。另一种选择是使用Activiti提供的历史数据API来检索过去的流程实例和相关变量。您可以使用historyService来获取历史数据:
HistoryService historyService = processEngine.getHistoryService();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();

if (historicProcessInstance != null) {
List variableInstances = historyService.createHistoricVariableInstanceQuery()
.processInstanceId(processInstanceId)
.list();

// Do something with the variable instances
}

此代码段检索指定流程实例的所有变量。您可以过滤和排序结果以查找特定变量,然后在前端展示所需的数据。

希望这些信息能够帮助您解决问题。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
问题原因:
在流程结束后,相关的任务和流程实例实际上已经被删除,因此无法通过taskId查询到相关的流程变量。此时应当查询历史流程变量。

解决方案:

  1. 使用Activiti提供的历史查询API查询历史流程变量,需要使用historyService对象,具体代码如下所示:
String processInstanceId = "xxxxxx"; // 此处填写流程实例ID
List<HistoricVariableInstance> variableList = historyService.createHistoricVariableInstanceQuery()
                                .processInstanceId(processInstanceId)
                                .list();
  1. 将查询到的历史流程变量信息与前端需要显示的其他参数一起返回给前端,前端根据需要展示相应的信息。

代码示例:

@GetMapping("/processVariables")
public Map<String, Object> getProcessVariables(String processInstanceId) {
    Map<String, Object> result = new HashMap<>();
    // 查询历史流程变量
    List<HistoricVariableInstance> variableList = historyService.createHistoricVariableInstanceQuery()
                                .processInstanceId(processInstanceId)
                                .list();
    // 将查询到的历史流程变量信息与前端需要显示的其他参数一起返回给前端
    for(HistoricVariableInstance variable: variableList){
        result.put(variable.getVariableName(), variable.getValue());
    }
    result.put("taskid", taskid); // 其他前端需要的参数
    return result;
}

注:以上代码仅作为示例参考,具体实现根据项目实际情况进行调整。
如果我的回答解决了您的问题,请采纳!

这个你要根据接口文档,先单独测试下。你这里显示是任务不存在

该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据你提供的信息,可能是以下几个问题导致找不到任务id:

  1. 任务id没有正确传递。检查一下前端是否将正确的任务id传递给了后端接口。你可以在后端打印出接收到的taskId,确保其正确。
  2. 任务已经完成或不存在。如果任务已经完成或者不存在,就会出现找不到任务id的问题。可以通过查询历史任务来确认任务的状态。如果任务已经完成,那么你需要通过历史任务来获取相关信息。
  3. 任务id不存在于当前用户的任务列表中。任务只能被拥有该任务的用户或组查询到。如果任务不存在于当前用户的任务列表中,那么就会出现找不到任务id的问题。
    ·
    除此之外,还有一些可能的问题需要检查。例如:是否正确设置了任务的候选人或候选组、是否正确设置了任务的处理人等。
    ·
    总的来说,建议你先确定任务是否存在,以及是否正确传递了任务id。如果这两个问题都不存在,那么你可以进一步检查任务的状态和其他相关设置。

检查任务是否已经完成:如果你使用的是历史服务接口,那么你可能会看到任务 ID 不存在的错误。这可能是因为你试图查询已经完成或已经删除的任务。在这种情况下,你可以尝试使用历史查询接口来获取已经完成的任务。
检查任务是否存在于指定的流程实例中:如果你在查询任务时指定了流程实例 ID,那么你需要确认该流程实例是否存在。如果该流程实例不存在或者已经被删除,那么你会看到找不到任务 ID 的错误。
检查权限问题:如果你在执行查询或者操作任务时没有足够的权限,那么你可能会看到找不到任务 ID 的错误。在这种情况下,你可以尝试检查你的权限设置,或者使用具有更高权限的用户进行操作。
检查 Activiti 配置:最后,你可以尝试检查你的 Activiti 配置是否正确。你可以检查数据库连接、引擎配置等方面,以确保 Activiti 正确运行。

historyService服务有个方法可以查询

参考GPT和自己的思路:根据您提供的信息,问题出现在当任务流程结束后再次访问页面时无法找到任务ID。这可能是因为您的代码尝试使用已经结束的任务ID来获取流程变量,但是在任务结束后,这个任务ID已经不再在运行时数据库表(如act_ru_task)中了。

解决这个问题的方法是使用历史流程变量表(如act_hi_varinst)来获取已经结束的任务的流程变量。您可以使用以下代码片段中的代码来查询历史流程变量并获取对应的流程变量值:

// 获取历史流程变量服务
HistoryService historyService = processEngine.getHistoryService();

// 根据任务ID查询历史流程变量
List<HistoricVariableInstance> variables = historyService.createHistoricVariableInstanceQuery()
                                                .taskId(taskId)
                                                .list();

// 遍历历史流程变量,并获取对应的值
for (HistoricVariableInstance variable : variables) {
    String variableName = variable.getVariableName();
    Object variableValue = variable.getValue();
    // 将变量名称和值放入Map中
    variablesMap.put(variableName, variableValue);
}


然后您可以将获取的流程变量值通过接口返回给前端,在页面上显示它们。这样即使任务已经结束,您仍然可以获取到与任务相关的流程变量。