Commit c9a8548920f2507338b35bc77a75430dec7c4de5
1 parent
b471dc55
feat: 流程时间线适配子流程节点
Showing
2 changed files
with
18 additions
and
4 deletions
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 | } | ... | ... |