Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 0 additions & 57 deletions processext/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,63 +182,6 @@ public Map<String, String> getNextNodeInfoByConditionalFlowId(String procDefKey,

```

#### 获取流程定义列表信息getProcInstGraphByTaskId/getProcInstGraphByProcInstId

注意:

1. 未来节点的审批人信息只能根据当前变量获取。若后续节点对变量有变化,当前节点无法获取到未来信息。
2. 流程复杂时,列表节点顺序不一定完全正确。

```java
/**
* 获取流程信息
* 未来节点的审批人信息只能根据当前变量获取。若后续节点对变量有变化,当前节点无法获取到未来信息。
*
* @param procInstId 流程实例ID
* @return 流程信息
*/
@NaslLogic
public List<Element> getProcInstGraphByProcInstId(String procInstId)
```

##### 数据结构说明

1. Element节点信息

| 字段名 | 类型 | 字段说明 | 备注 |
|---------------------|--------|-------|---|
| current | Boolean | 是否当前活跃节点 ||
| completed | Boolean | 任务是否完成 ||
| name | String | 节点名称 ||
| title | String| 节点标题 ||
| type |String | 节点类型 ||
| completeInfos | List<CompleteInfo>| 处理信息 ||

2. CompleteInfo节点处理信息

| 字段名 | 类型 | 字段说明 | 备注 |
|---------------------|--------|-------|---|
| assignee | ProcessUser | 处理人 |未完成节点不存在处理人信息|
| completeTime | String | 处理完成时间 ||
| completed | Boolean | 是否已完成 ||
| candidates | List<ProcessUser> | 候选人 |待选人|
| addSignTag | Boolean| 加签标志 ||

3. ProcessUser节点处理人信息

| 字段名 | 类型 | 字段说明 | 备注 |
|---------------------|--------|-------|---|
| userName | String | 名称 ||
| displayName | String | 展示名称 ||

##### 展示流程列表,并且运行时获取并修改候选人示例

1. 给可修改候选人的节点配置处理人为流程自定义变量。一个节点对应一个变量。
2. 流程自定义变量默认值暂不可用,若业务场景需要有默认用户,建议使用流程启动事件做初始赋值。
3. 调用本接口获取流程信息。其中配置流程自定义变量为处理人的节点,对应的candidates值将会是流程自定义变量的值。
4. 调用【根据任务id/实例id修改流程自定义变量updateProcessVariableByTaskId/updateProcessVariableByProcInstId】可修改流程自定义变量
![img_9.png](img_9.png)

### 任务实例查询

#### 查询我的待办任务列表getMyPendingTasksByCustomUser
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -158,126 +158,4 @@ public Map<String, String> getNextNodeNamesByPreviousNodeName(BpmnModel bpmnMode
return nextNodes;
}

/**
* 获取流程定义列表信息
* 未来节点的审批人信息只能根据当前变量获取。若后续节点对变量有变化,当前节点无法获取到未来信息。
*
* @param taskId 任务ID
* @return 流程信息
*/
@ReconfirmAuthorization
public List<Element> getProcInstGraphByTaskId(String taskId) {
Optional<CWHistoricTaskInstance> optional = this.taskInstanceService.getHistoricTaskInstanceById(taskId);
if (!optional.isPresent()) {
log.warn("Task does not exist!");
throw new ProcessExtCommonException("Task does not exist!");
} else {
return this.getProcInstGraphByProcInstId(optional.get().getProcessInstanceId());
}
}

/**
* 获取流程定义列表信息
* 未来节点的审批人信息只能根据当前变量获取。若后续节点对变量有变化,当前节点无法获取到未来信息。
*
* @param procInstId
* @return 流程信息
*/
@ReconfirmAuthorization
public List<Element> getProcInstGraphByProcInstId(String procInstId) {
try {
CWProcInstGraphModel cwProcInstGraphModel = processGraphService.getProcInstGraphModelByProcessInstanceId(procInstId);
//未完成节点获取编辑态设置的审批人信息
cwProcInstGraphModel.getElements().stream()
.filter(element -> !element.getType().equals(com.netease.lowcode.lib.util.ProcessConstant.ELEMENT_EVENT_END))
.filter(element -> !element.getType().equals(com.netease.lowcode.lib.util.ProcessConstant.ELEMENT_EVENT_Start))
.filter(element -> !element.getType().equals(com.netease.lowcode.lib.util.ProcessConstant.ELEMENT_EVENT_InclusiveGateway))
.filter(element -> !element.getType().equals(com.netease.lowcode.lib.util.ProcessConstant.ELEMENT_EVENT_ExclusiveGateway))
.filter(element -> !element.isCompleted())
.filter(element -> element.getCompleteInfos() == null || element.getCompleteInfos().isEmpty())
.forEach(element -> {
List<CWCompleteInfoModel> getCompleteInfos = new ArrayList<>();
CWCompleteInfoModel cwCompleteInfoModel = new CWCompleteInfoModel();
cwCompleteInfoModel.setCompleted(false);
cwCompleteInfoModel.setCandidates(getAssigneeList(procInstId, element.getName()));
getCompleteInfos.add(cwCompleteInfoModel);
element.setCompleteInfos(getCompleteInfos);
});
//固定end节点最后
CWElementModel end = cwProcInstGraphModel.getElements().stream().filter(element -> element.getType().equals(com.netease.lowcode.lib.util.ProcessConstant.ELEMENT_EVENT_END)).findFirst().get();
cwProcInstGraphModel.getElements().remove(end);
List<CWElementModel> cwElementModelList = ElementSort.sortElements(cwProcInstGraphModel.getElements(), cwProcInstGraphModel.getFlows());
cwElementModelList.add(end);
cwElementModelList = cwElementModelList.stream().filter(Objects::nonNull).collect(Collectors.toList());
return toElement(cwElementModelList);
} catch (Exception e) {
log.error("Process graph sort error!", e);
throw e;
}
}

private List<Element> toElement(List<CWElementModel> cwElementModelList) {
List<Element> elements = new ArrayList<>();
for (CWElementModel cwElementModel : cwElementModelList) {
Element element = new Element();
element.setName(cwElementModel.getName());
element.setTitle(cwElementModel.getTitle());
element.setType(cwElementModel.getType());
element.setCurrent(cwElementModel.isCurrent());
element.setCompleted(cwElementModel.isCompleted());
if (cwElementModel.getCompleteInfos() != null && !cwElementModel.getCompleteInfos().isEmpty()) {
List<CompleteInfo> completeInfos = cwElementModel.getCompleteInfos().stream().map(cwCompleteInfoModel -> {
CompleteInfo completeInfo = new CompleteInfo();
completeInfo.setCompleteTime(cwCompleteInfoModel.getCompleteTime());
completeInfo.setCompleted(cwCompleteInfoModel.isCompleted());
if (StringUtils.isNoneBlank(cwCompleteInfoModel.getAssignee())) {
com.netease.codewave.process.open.domain.structure.ProcessUser processUserAssignee = processUserIdentityService.getUsersByUserName(cwCompleteInfoModel.getAssignee());
completeInfo.setAssignee(ProcessUserUtil.toProcessUserFront(processUserAssignee));
}
if (com.netease.lowcode.core.util.CollectionUtils.isNotEmpty(cwCompleteInfoModel.getCandidates())) {
completeInfo.setCandidates(cwCompleteInfoModel.getCandidates().stream()
.map(processUserIdentityService::getUsersByUserName)
.map(ProcessUserUtil::toProcessUserFront).collect(Collectors.toList()));
}
completeInfo.setAddSignTag(cwCompleteInfoModel.getAddSignTag());
return completeInfo;
}).collect(Collectors.toList());
element.setCompleteInfos(completeInfos);
}
elements.add(element);
}
return elements;
}

private List<String> getAssigneeList(String procInstId, String currentUserTaskNodeKey) {
BpmnModel bpmnModel = repositoryService.getBpmnModel(getProcessDefinitionId(procInstId));
if (bpmnModel != null) {
String version = bpmnModel.getMainProcess().getAttributeValue(ProcessConstant.EXTENSION_NAMESPACE, ProcessConstant.KEY_NASL_VERSION);
try {
String taskAssigneeServiceName = String.format(TASK_ASSIGNEE_SERVICE_NAME, bpmnModel.getMainProcess().getId(), version, currentUserTaskNodeKey);
Object service = applicationContext.getBean(taskAssigneeServiceName);
if (service == null) {
return null;
}
Method method = service.getClass().getMethod("getAssigneeList", Map.class);
Map<String, Object> variables = runtimeService.getVariables(procInstId);
return (List<String>) method.invoke(service, variables);
} catch (Exception e) {
log.error("getAssigneeList error", e);
}
}
return null;
}

public String getProcessDefinitionId(String processInstanceId) {
// 根据流程实例ID查询流程实例
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();

if (historicProcessInstance != null) {
return historicProcessInstance.getProcessDefinitionId();
}
return null;
}
}
Loading