Browse Source

Merge branch 'main-stable' of http://124.222.6.97:3000/sunquan/apelet_tenant into feature/2026-10/1031-ccc-dev

feature/2026-10/1031-ccc-dev
chenchuchuan 2 weeks ago
parent
commit
7328de409a
  1. 39
      common/common-flow/src/main/java/apelet/common/flow/controller/FlowOperationController.java
  2. 6
      common/common-flow/src/main/java/apelet/common/flow/service/FlowApiService.java
  3. 11
      common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowApiServiceImpl.java

39
common/common-flow/src/main/java/apelet/common/flow/controller/FlowOperationController.java

@ -219,13 +219,12 @@ public class FlowOperationController { @@ -219,13 +219,12 @@ public class FlowOperationController {
if (StrUtil.isNotBlank(flowTaskExt.getVariableListJson())) {
taskInfoVo.setVariableList(JSON.parseArray(flowTaskExt.getVariableListJson(), JSONObject.class));
}
FlowWorkOrder workOrder = flowWorkOrderService.getFlowWorkOrderByProcessInstanceId(processInstanceId);
// 单条详情:只查一次节点扩展(复用批量接口传单元素集合),无 N+1 风险。
String taskKey = taskInfoVo.getTaskKey();
FlowTaskInstanceExt taskInstanceExt = workOrder == null || StrUtil.isBlank(taskKey) ? null
FlowTaskInstanceExt taskInstanceExt = StrUtil.isBlank(taskKey) ? null
: flowTaskInstanceExtService.getMapByProcessInstanceIds(CollUtil.newHashSet(processInstanceId))
.get(processInstanceId + ":" + taskKey);
taskInfoVo.setTitle(flowApiService.resolveTitleCached(workOrder, taskKey, taskInstanceExt));
taskInfoVo.setTitle(flowApiService.resolveTitleCached(taskInstanceExt));
}
return ResponseResult.success(taskInfoVo);
}
@ -835,24 +834,16 @@ public class FlowOperationController { @@ -835,24 +834,16 @@ public class FlowOperationController {
pageData.getDataList().forEach(instance -> resultList.add(BeanUtil.beanToMap(instance)));
List<HistoricTaskInstance> taskInstanceList = pageData.getDataList();
if (CollUtil.isNotEmpty(taskInstanceList)) {
Set<String> instanceIdSet = taskInstanceList.stream()
.map(HistoricTaskInstance::getProcessInstanceId).collect(Collectors.toSet());
Set<String> instanceIdSet = taskInstanceList.stream().map(HistoricTaskInstance::getProcessInstanceId).collect(Collectors.toSet());
List<HistoricProcessInstance> instanceList = flowApiService.getHistoricProcessInstanceList(instanceIdSet);
Set<String> loginNameSet = instanceList.stream()
.map(HistoricProcessInstance::getStartUserId).collect(Collectors.toSet());
List<FlowUserInfoVo> userInfoList = flowCustomExtFactory
.getFlowIdentityExtHelper().getUserInfoListByUsernameSet(loginNameSet);
Map<String, FlowUserInfoVo> userInfoMap =
userInfoList.stream().collect(Collectors.toMap(FlowUserInfoVo::getLoginName, c -> c));
Map<String, HistoricProcessInstance> instanceMap =
instanceList.stream().collect(Collectors.toMap(HistoricProcessInstance::getId, c -> c));
List<FlowWorkOrder> workOrderList =
flowWorkOrderService.getInList(INSTANCE_ID, instanceIdSet);
Map<String, FlowWorkOrder> workOrderMap =
workOrderList.stream().collect(Collectors.toMap(FlowWorkOrder::getProcessInstanceId, c -> c));
Set<String> loginNameSet = instanceList.stream().map(HistoricProcessInstance::getStartUserId).collect(Collectors.toSet());
List<FlowUserInfoVo> userInfoList = flowCustomExtFactory.getFlowIdentityExtHelper().getUserInfoListByUsernameSet(loginNameSet);
Map<String, FlowUserInfoVo> userInfoMap = userInfoList.stream().collect(Collectors.toMap(FlowUserInfoVo::getLoginName, c -> c));
Map<String, HistoricProcessInstance> instanceMap = instanceList.stream().collect(Collectors.toMap(HistoricProcessInstance::getId, c -> c));
List<FlowWorkOrder> workOrderList = flowWorkOrderService.getInList(INSTANCE_ID, instanceIdSet);
Map<String, FlowWorkOrder> workOrderMap = workOrderList.stream().collect(Collectors.toMap(FlowWorkOrder::getProcessInstanceId, c -> c));
// 节点标题按实例批量预载(一次 IN 查询覆盖整页),避免逐行查询造成 N+1。
Map<String, FlowTaskInstanceExt> taskInstanceExtMap =
flowTaskInstanceExtService.getMapByProcessInstanceIds(instanceIdSet);
Map<String, FlowTaskInstanceExt> taskInstanceExtMap = flowTaskInstanceExtService.getMapByProcessInstanceIds(instanceIdSet);
resultList.forEach(result -> {
String instanceId = result.get(INSTANCE_ID).toString();
HistoricProcessInstance instance = instanceMap.get(instanceId);
@ -869,15 +860,13 @@ public class FlowOperationController { @@ -869,15 +860,13 @@ public class FlowOperationController {
// 标题只认 zz_flow_task_instance_ext 的落库值:没有标题行就是空
Object taskDefinitionKey = result.get("taskDefinitionKey");
String taskKey = taskDefinitionKey == null ? null : taskDefinitionKey.toString();
result.put("title", flowApiService.resolveTitleCached(flowWorkOrder, taskKey,
result.put("title", flowApiService.resolveTitleCached(
taskKey == null ? null : taskInstanceExtMap.get(instanceId + ":" + taskKey)));
}
});
Set<String> taskIdSet =
taskInstanceList.stream().map(HistoricTaskInstance::getId).collect(Collectors.toSet());
Set<String> taskIdSet = taskInstanceList.stream().map(HistoricTaskInstance::getId).collect(Collectors.toSet());
List<FlowTaskComment> commentList = flowTaskCommentService.getFlowTaskCommentListByTaskIds(taskIdSet);
Map<String, List<FlowTaskComment>> commentMap =
commentList.stream().collect(Collectors.groupingBy(FlowTaskComment::getTaskId));
Map<String, List<FlowTaskComment>> commentMap = commentList.stream().collect(Collectors.groupingBy(FlowTaskComment::getTaskId));
resultList.forEach(result -> {
List<FlowTaskComment> comments = commentMap.get(result.get("id").toString());
if (CollUtil.isNotEmpty(comments)) {
@ -956,7 +945,7 @@ public class FlowOperationController { @@ -956,7 +945,7 @@ public class FlowOperationController {
data.put("flowStatus", workOrder.getFlowStatus());
// 流程实例列表使用起始节点的标题;标题只认落库值,没有标题行就是空
String initTaskKey = initTaskKeyMap.get(instance.getProcessDefinitionId());
data.put("title", flowApiService.resolveTitleCached(workOrder, initTaskKey,
data.put("title", flowApiService.resolveTitleCached(
initTaskKey == null ? null : taskInstanceExtMap.get(instance.getId() + ":" + initTaskKey)));
}
resultList.add(data);

6
common/common-flow/src/main/java/apelet/common/flow/service/FlowApiService.java

@ -671,12 +671,10 @@ public interface FlowApiService { @@ -671,12 +671,10 @@ public interface FlowApiService {
* 本方法只读落库值,<b>不做实时解析兜底</b>:没有标题行就返回 null,列表上该行标题为空。
* 因此存量数据(改造前已跑的实例)标题会为空,需要回填后才有。</p>
*
* @param workOrder 流程工单对象,为空时返回 null。
* @param taskKey BPMN 节点Id,用于定位标题行,为空时返回 null。
* @param taskInstanceExt 节点扩展对象(调用方批量预载,避免逐行查询),可为空。
* @param taskInstanceExt 节点扩展对象(调用方按 (实例, 节点) 批量预载,避免逐行查询),可为空。
* @return 落库的标题;没有标题行返回 null。
*/
String resolveTitleCached(FlowWorkOrder workOrder, String taskKey, FlowTaskInstanceExt taskInstanceExt);
String resolveTitleCached(FlowTaskInstanceExt taskInstanceExt);
/**
* 生成指定节点的标题并落库到 zz_flow_task_instance_ext。

11
common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowApiServiceImpl.java

@ -1024,7 +1024,7 @@ public class FlowApiServiceImpl implements FlowApiService { @@ -1024,7 +1024,7 @@ public class FlowApiServiceImpl implements FlowApiService {
}
// 标题只以 zz_flow_task_instance_ext 的落库值为准:没有标题行就是空,
// 不需要再按"节点配没配模板""是不是在线表单"做前置判断(那两个条件对标题行本身没有约束力)。
flowTaskVo.setTitle(this.resolveTitleCached(flowWorkOrder, task.getTaskDefinitionKey(),
flowTaskVo.setTitle(this.resolveTitleCached(
taskInstanceExtMap.get(task.getProcessInstanceId() + ":" + task.getTaskDefinitionKey())));
flowTaskVoList.add(flowTaskVo);
}
@ -2962,14 +2962,11 @@ public class FlowApiServiceImpl implements FlowApiService { @@ -2962,14 +2962,11 @@ public class FlowApiServiceImpl implements FlowApiService {
}
@Override
public String resolveTitleCached(FlowWorkOrder workOrder, String taskKey, FlowTaskInstanceExt taskInstanceExt) {
public String resolveTitleCached(FlowTaskInstanceExt taskInstanceExt) {
// 标题只以 zz_flow_task_instance_ext 的落库值为准,不再回退到按模板实时解析。
// 这样"这个节点到底有没有落库"在列表上一眼可见,排查/联调时不会被实时兜底掩盖。
if (workOrder == null || taskInstanceExt == null || StrUtil.isBlank(taskKey)
|| StrUtil.isBlank(taskInstanceExt.getTitle())) {
return null;
}
return taskInstanceExt.getTitle();
String title = taskInstanceExt == null ? null : taskInstanceExt.getTitle();
return StrUtil.isBlank(title) ? null : title;
}
@Override

Loading…
Cancel
Save