Commit c9a8548920f2507338b35bc77a75430dec7c4de5

Authored by Lesan
1 parent b471dc55

feat: 流程时间线适配子流程节点

yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java
... ... @@ -72,6 +72,9 @@ public class BpmApprovalDetailRespVO {
72 72 @Schema(description = "候选人用户列表")
73 73 private List<UserSimpleBaseVO> candidateUsers; // 只包含未生成 ApprovalTaskInfo 的用户列表
74 74  
  75 + @Schema(description = "流程编号", example = "8761d8e0-0922-11f0-bd37-00ff1db677bf")
  76 + private String processInstanceId;
  77 +
75 78 }
76 79  
77 80 @Schema(description = "活动节点的任务信息")
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
... ... @@ -387,8 +387,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
387 387 List<HistoricActivityInstance> activities, List<HistoricTaskInstance> tasks) {
388 388 // 遍历 tasks 列表,只处理已结束的 UserTask
389 389 // 为什么不通过 activities 呢?因为,加签场景下,它只存在于 tasks,没有 activities,导致如果遍历 activities 的话,它无法成为一个节点
390   - // TODO @芋艿:子流程只有activity,这里获取不到已结束的子流程;
391   - // TODO @lesan:【子流程】基于 activities 查询出 usertask、callactivity,然后拼接?如果是子流程,就是可以点击过去?
392 390 List<HistoricTaskInstance> endTasks = filterList(tasks, task -> task.getEndTime() != null);
393 391 List<ActivityNode> approvalNodes = convertList(endTasks, task -> {
394 392 FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
... ... @@ -410,7 +408,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
410 408  
411 409 // 遍历 activities,只处理已结束的 StartEvent、EndEvent
412 410 List<HistoricActivityInstance> endActivities = filterList(activities, activity -> activity.getEndTime() != null
413   - && (StrUtil.equalsAny(activity.getActivityType(), ELEMENT_EVENT_START, ELEMENT_EVENT_END)));
  411 + && (StrUtil.equalsAny(activity.getActivityType(), ELEMENT_EVENT_START, ELEMENT_CALL_ACTIVITY, ELEMENT_EVENT_END)));
414 412 endActivities.forEach(activity -> {
415 413 // StartEvent:只处理 BPMN 的场景。因为,SIMPLE 情况下,已经有 START_USER_NODE 节点
416 414 if (ELEMENT_EVENT_START.equals(activity.getActivityType())
... ... @@ -444,7 +442,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
444 442 }
445 443 approvalNodes.add(endNode);
446 444 }
  445 + // CallActivity
  446 + if (ELEMENT_CALL_ACTIVITY.equals(activity.getActivityType())) {
  447 + ActivityNode callActivity = new ActivityNode().setId(activity.getId())
  448 + .setName(BpmSimpleModelNodeTypeEnum.CHILD_PROCESS.getName())
  449 + .setNodeType(BpmSimpleModelNodeTypeEnum.CHILD_PROCESS.getType()).setStatus(processInstanceStatus)
  450 + .setStartTime(DateUtils.of(activity.getStartTime()))
  451 + .setEndTime(DateUtils.of(activity.getEndTime()))
  452 + .setProcessInstanceId(activity.getProcessInstanceId());
  453 + approvalNodes.add(callActivity);
  454 + }
447 455 });
  456 + approvalNodes.sort(Comparator.comparing(ActivityNode::getStartTime));
448 457 return approvalNodes;
449 458 }
450 459  
... ... @@ -464,7 +473,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
464 473 HistoricActivityInstance::getActivityId);
465 474  
466 475 // 按照 activityId 分组,构建 ApprovalNodeInfo 节点
467   - // TODO @lesan:【子流程】在子流程进行审批的时候,HistoricActivityInstance 里面可以拿到 runActivities.get(0).getCalledProcessInstanceId()。要不要支持跳转???
468 476 Map<String, HistoricTaskInstance> taskMap = convertMap(tasks, HistoricTaskInstance::getId);
469 477 return convertList(runningTaskMap.entrySet(), entry -> {
470 478 String activityId = entry.getKey();
... ... @@ -510,6 +518,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
510 518 approvalTaskInfo.getAssignee())); // 委派或者向前加签情况,需要先比较 owner
511 519 activityNode.setCandidateUserIds(CollUtil.sub(candidateUserIds, index + 1, candidateUserIds.size()));
512 520 }
  521 + if (BpmSimpleModelNodeTypeEnum.CHILD_PROCESS.getType().equals(activityNode.getNodeType())) {
  522 + activityNode.setProcessInstanceId(firstActivity.getProcessInstanceId());
  523 + }
513 524 return activityNode;
514 525 });
515 526 }
... ...