更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
我们的在流程设计器里会根据需要再不同的节点增加扩展属性,如何动态读取这些扩展属性,下面提供一种方法。
1、比如设计里,在这个节点增加属性test2,值是属性2
2、可以在流程启动的时候读取发起人节点的扩展属性或在complete里增加读取扩展属性
下面是在complete读取当前节点的扩展属性
Map<String, Object> flowProperties = getFlowProperties(taskBo.getProcInsId());
/** * 完成任务 * * @param taskBo 请求实体参数 */ @Transactional(rollbackFor = Exception.class) @Override public void complete(WfTaskBo taskBo) { Task task = taskService.createTaskQuery().taskId(taskBo.getTaskId()).singleResult(); if (Objects.isNull(task)) { throw new ServiceException("任务不存在"); } //获取流程当前节点设置的扩展属性值,需要的时候可以使用 //Map<String, Object> flowProperties = getFlowProperties(taskBo.getProcInsId());
3、其中相应的方法如下:
@Override public Map<String, Object> getFlowProperties(String procInsId) { try { Task task = taskService.createTaskQuery().processInstanceId(procInsId).active().singleResult(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); List<FlowViewerDto> flowViewerList = (List<FlowViewerDto>) getFlowViewer(task.getProcessInstanceId()).getData(); FlowViewerDto dto = flowViewerList.stream().filter(flowViewerDto -> !flowViewerDto.isCompleted()).findFirst().orElse(null); String actId; if (ObjectUtils.isNotEmpty(dto)) { actId = dto.getKey(); } else { return null; } FlowElement element = bpmnModel.getFlowElement(actId); List<ExtensionElement> extensionElements = element .getExtensionElements().get("properties"); List<ExtensionElement> child = null; for (ExtensionElement extensionElement : extensionElements) { child = extensionElement.getChildElements().get("property"); } List<Map<String, List<ExtensionAttribute>>> list = new ArrayList<>(); child.stream().forEach(o -> { Map<String, List<ExtensionAttribute>> attributeMap = o.getAttributes(); list.add(attributeMap); }); Map<String, Object> result = new HashMap(); list.stream().forEach(a -> { result.put(a.get("name").get(0).getValue(), a.get("value").get(0).getValue()); }); return result; } catch (NullPointerException nullExcption) { return null; } } /** * 获取流程执行过程 * * @param procInsId * @return */ @Override public R getFlowViewer(String procInsId) { List<FlowViewerDto> flowViewerList = new ArrayList<>(); FlowViewerDto flowViewerDto; // 获得活动的节点 List<HistoricActivityInstance> hisActIns = historyService.createHistoricActivityInstanceQuery() .processInstanceId(procInsId) .orderByHistoricActivityInstanceStartTime() .asc().list(); for (HistoricActivityInstance activityInstance : hisActIns) { if (!"sequenceFlow".equals(activityInstance.getActivityType())) { flowViewerDto = new FlowViewerDto(); flowViewerDto.setKey(activityInstance.getActivityId()); flowViewerDto.setCompleted(!Objects.isNull(activityInstance.getEndTime())); flowViewerList.add(flowViewerDto); } } return R.ok(flowViewerList); }
4、其中FlowViewerDto如下:
/** */ @Data public class FlowViewerDto implements Serializable { private String key; private boolean completed; }