Browse Source

refactor(flow): 简化标题解析逻辑并增加未解析标记

- 移除标题解析中对 FlowTaskExt、FlowEntry、FlowEntryPublish 的前置条件判断,标题只认 zz_flow_task_instance_ext 落库值
- 删除 FlowApiServiceImpl 和 FlowOperationController 中冗余的批量预加载逻辑,减少不必要的数据库查询
- 新增 title_incomplete 字段,当标题中残留未解析的 ${...} 占位符时自动标记
- FlowTaskInstanceExtMapper.xml 的 upsert 语句增加 title_incomplete 字段的插入与更新
- FlowTaskTitleBackfillServiceImpl 回填时统计 incomplete 条数,FlowTaskTitleBackfillVo 新增 incompleteCount 字段
- FlowConstant 中新增 TITLE_PLACEHOLDER_PREFIX 常量用于占位符检测
pull/2/head
chenchuchuan 2 weeks ago
parent
commit
73efdd4df7
  1. 7
      common/common-flow/src/main/java/apelet/common/flow/constant/FlowConstant.java
  2. 47
      common/common-flow/src/main/java/apelet/common/flow/controller/FlowOperationController.java
  3. 10
      common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowTaskInstanceExtMapper.xml
  4. 7
      common/common-flow/src/main/java/apelet/common/flow/model/FlowTaskInstanceExt.java
  5. 13
      common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowApiServiceImpl.java
  6. 5
      common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowTaskInstanceExtServiceImpl.java
  7. 7
      common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowTaskTitleBackfillServiceImpl.java
  8. 7
      common/common-flow/src/main/java/apelet/common/flow/vo/FlowTaskTitleBackfillVo.java

7
common/common-flow/src/main/java/apelet/common/flow/constant/FlowConstant.java

@ -39,6 +39,13 @@ public class FlowConstant {
public static final String SUBMIT_USER_VAR = "submitUser"; public static final String SUBMIT_USER_VAR = "submitUser";
/** /**
* 标题模板里未解析占位符的起始标记。
* <p>resolveTitle 对"占位符取不到值"是静默处理的 —— 不删不报错,把 ${xxx} 原样留在标题里
* (最常见的原因是该实例的业务数据已经不存在了)。写入标题时据此打 title_incomplete 标记。</p>
*/
public static final String TITLE_PLACEHOLDER_PREFIX = "${";
/**
* 多任务拒绝数量变量。 * 多任务拒绝数量变量。
*/ */
public static final String MULTI_REFUSE_COUNT_VAR = "multiRefuseCount"; public static final String MULTI_REFUSE_COUNT_VAR = "multiRefuseCount";

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

@ -853,18 +853,6 @@ public class FlowOperationController {
// 节点标题按实例批量预载(一次 IN 查询覆盖整页),避免逐行查询造成 N+1。 // 节点标题按实例批量预载(一次 IN 查询覆盖整页),避免逐行查询造成 N+1。
Map<String, FlowTaskInstanceExt> taskInstanceExtMap = Map<String, FlowTaskInstanceExt> taskInstanceExtMap =
flowTaskInstanceExtService.getMapByProcessInstanceIds(instanceIdSet); flowTaskInstanceExtService.getMapByProcessInstanceIds(instanceIdSet);
Set<String> processDefinitionIdSet = taskInstanceList.stream()
.map(HistoricTaskInstance::getProcessDefinitionId).collect(Collectors.toSet());
List<FlowEntryPublish> flowEntryPublishList =
flowEntryService.getFlowEntryPublishList(processDefinitionIdSet);
Map<String, FlowEntryPublish> flowEntryPublishMap =
flowEntryPublishList.stream().collect(Collectors.toMap(FlowEntryPublish::getProcessDefinitionId, c -> c));
Set<Long> entryIdSet = flowEntryPublishList.stream()
.map(FlowEntryPublish::getEntryId).filter(Objects::nonNull).collect(Collectors.toSet());
Map<Long, FlowEntry> flowEntryMap = flowEntryService.listByIds(entryIdSet).stream()
.collect(Collectors.toMap(FlowEntry::getEntryId, e -> e));
Map<String, FlowTaskExt> flowTaskExtMap = flowTaskExtService.getByProcessDefinitionId(processDefinitionIdSet).stream()
.collect(Collectors.toMap(t -> t.getProcessDefinitionId() + ":" + t.getTaskId(), t -> t, (k1, k2) -> k1));
resultList.forEach(result -> { resultList.forEach(result -> {
String instanceId = result.get(INSTANCE_ID).toString(); String instanceId = result.get(INSTANCE_ID).toString();
HistoricProcessInstance instance = instanceMap.get(instanceId); HistoricProcessInstance instance = instanceMap.get(instanceId);
@ -878,20 +866,12 @@ public class FlowOperationController {
FlowWorkOrder flowWorkOrder = workOrderMap.get(instanceId); FlowWorkOrder flowWorkOrder = workOrderMap.get(instanceId);
if (flowWorkOrder != null) { if (flowWorkOrder != null) {
result.put("workOrderCode", flowWorkOrder.getWorkOrderCode()); result.put("workOrderCode", flowWorkOrder.getWorkOrderCode());
String processDefinitionId = result.get("processDefinitionId").toString(); // 标题只认 zz_flow_task_instance_ext 的落库值:没有标题行就是空
FlowEntryPublish flowEntryPublish = flowEntryPublishMap.get(processDefinitionId);
FlowTaskExt flowTaskExt = flowTaskExtMap.get(
processDefinitionId + ":" + result.get("taskDefinitionKey"));
if (flowEntryPublish != null && flowTaskExt != null) {
FlowEntry flowEntry = flowEntryMap.get(flowEntryPublish.getEntryId());
if (flowEntry != null) {
Object taskDefinitionKey = result.get("taskDefinitionKey"); Object taskDefinitionKey = result.get("taskDefinitionKey");
String taskKey = taskDefinitionKey == null ? null : taskDefinitionKey.toString(); String taskKey = taskDefinitionKey == null ? null : taskDefinitionKey.toString();
result.put("title", flowApiService.resolveTitleCached(flowWorkOrder, taskKey, result.put("title", flowApiService.resolveTitleCached(flowWorkOrder, taskKey,
taskKey == null ? null : taskInstanceExtMap.get(instanceId + ":" + taskKey))); taskKey == null ? null : taskInstanceExtMap.get(instanceId + ":" + taskKey)));
} }
}
}
}); });
Set<String> taskIdSet = Set<String> taskIdSet =
taskInstanceList.stream().map(HistoricTaskInstance::getId).collect(Collectors.toSet()); taskInstanceList.stream().map(HistoricTaskInstance::getId).collect(Collectors.toSet());
@ -949,22 +929,11 @@ public class FlowOperationController {
Map<String, FlowTaskInstanceExt> taskInstanceExtMap = flowTaskInstanceExtService.getMapByProcessInstanceIds(instanceIdSet); Map<String, FlowTaskInstanceExt> taskInstanceExtMap = flowTaskInstanceExtService.getMapByProcessInstanceIds(instanceIdSet);
Set<String> processDefinitionIdSet = pageData.getDataList().stream() Set<String> processDefinitionIdSet = pageData.getDataList().stream()
.map(HistoricProcessInstance::getProcessDefinitionId).collect(Collectors.toSet()); .map(HistoricProcessInstance::getProcessDefinitionId).collect(Collectors.toSet());
Map<String, FlowEntryPublish> flowEntryPublishMap = new HashMap<>(); // 流程实例列表使用起始节点的标题,首节点 taskKey 存在发布版本的 initTaskInfo 里。
Map<Long, FlowEntry> flowEntryMap = new HashMap<>();
Map<String, FlowTaskExt> flowTaskExtMap = new HashMap<>();
// 流程实例列表使用起始节点的标题模板。
Map<String, String> initTaskKeyMap = new HashMap<>(); Map<String, String> initTaskKeyMap = new HashMap<>();
if (CollUtil.isNotEmpty(processDefinitionIdSet)) { if (CollUtil.isNotEmpty(processDefinitionIdSet)) {
List<FlowEntryPublish> flowEntryPublishList = List<FlowEntryPublish> flowEntryPublishList =
flowEntryService.getFlowEntryPublishList(processDefinitionIdSet); flowEntryService.getFlowEntryPublishList(processDefinitionIdSet);
flowEntryPublishMap.putAll(flowEntryPublishList.stream()
.collect(Collectors.toMap(FlowEntryPublish::getProcessDefinitionId, c -> c)));
Set<Long> entryIdSet = flowEntryPublishList.stream()
.map(FlowEntryPublish::getEntryId).filter(Objects::nonNull).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(entryIdSet)) {
flowEntryMap.putAll(flowEntryService.listByIds(entryIdSet).stream()
.collect(Collectors.toMap(FlowEntry::getEntryId, e -> e)));
}
for (FlowEntryPublish flowEntryPublish : flowEntryPublishList) { for (FlowEntryPublish flowEntryPublish : flowEntryPublishList) {
TaskInfoVo initTaskInfo = StrUtil.isBlank(flowEntryPublish.getInitTaskInfo()) TaskInfoVo initTaskInfo = StrUtil.isBlank(flowEntryPublish.getInitTaskInfo())
? null : JSON.parseObject(flowEntryPublish.getInitTaskInfo(), TaskInfoVo.class); ? null : JSON.parseObject(flowEntryPublish.getInitTaskInfo(), TaskInfoVo.class);
@ -972,8 +941,6 @@ public class FlowOperationController {
initTaskKeyMap.put(flowEntryPublish.getProcessDefinitionId(), initTaskInfo.getTaskKey()); initTaskKeyMap.put(flowEntryPublish.getProcessDefinitionId(), initTaskInfo.getTaskKey());
} }
} }
flowTaskExtMap.putAll(flowTaskExtService.getByProcessDefinitionId(processDefinitionIdSet).stream()
.collect(Collectors.toMap(t -> t.getProcessDefinitionId() + ":" + t.getTaskId(), t -> t, (k1, k2) -> k1)));
} }
List<Map<String, Object>> resultList = new LinkedList<>(); List<Map<String, Object>> resultList = new LinkedList<>();
pageData.getDataList().forEach(instance -> { pageData.getDataList().forEach(instance -> {
@ -987,19 +954,11 @@ public class FlowOperationController {
if (workOrder != null) { if (workOrder != null) {
data.put("workOrderCode", workOrder.getWorkOrderCode()); data.put("workOrderCode", workOrder.getWorkOrderCode());
data.put("flowStatus", workOrder.getFlowStatus()); data.put("flowStatus", workOrder.getFlowStatus());
FlowEntryPublish flowEntryPublish = flowEntryPublishMap.get(instance.getProcessDefinitionId()); // 流程实例列表使用起始节点的标题;标题只认落库值,没有标题行就是空
FlowTaskExt flowTaskExt = flowTaskExtMap.get(
instance.getProcessDefinitionId() + ":" + initTaskKeyMap.get(instance.getProcessDefinitionId()));
if (flowEntryPublish != null && flowTaskExt != null) {
FlowEntry flowEntry = flowEntryMap.get(flowEntryPublish.getEntryId());
if (flowEntry != null) {
// 流程实例列表使用起始节点的标题。
String initTaskKey = initTaskKeyMap.get(instance.getProcessDefinitionId()); String initTaskKey = initTaskKeyMap.get(instance.getProcessDefinitionId());
data.put("title", flowApiService.resolveTitleCached(workOrder, initTaskKey, data.put("title", flowApiService.resolveTitleCached(workOrder, initTaskKey,
initTaskKey == null ? null : taskInstanceExtMap.get(instance.getId() + ":" + initTaskKey))); initTaskKey == null ? null : taskInstanceExtMap.get(instance.getId() + ":" + initTaskKey)));
} }
}
}
resultList.add(data); resultList.add(data);
}); });
return ResponseResult.success(MyPageUtil.makeResponseData(resultList, pageData.getTotalCount())); return ResponseResult.success(MyPageUtil.makeResponseData(resultList, pageData.getTotalCount()));

10
common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowTaskInstanceExtMapper.xml

@ -9,6 +9,7 @@
<result column="process_definition_id" jdbcType="VARCHAR" property="processDefinitionId"/> <result column="process_definition_id" jdbcType="VARCHAR" property="processDefinitionId"/>
<result column="task_key" jdbcType="VARCHAR" property="taskKey"/> <result column="task_key" jdbcType="VARCHAR" property="taskKey"/>
<result column="title" jdbcType="VARCHAR" property="title"/> <result column="title" jdbcType="VARCHAR" property="title"/>
<result column="title_incomplete" jdbcType="TINYINT" property="titleIncomplete"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/> <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="create_user_id" jdbcType="BIGINT" property="createUserId"/> <result column="create_user_id" jdbcType="BIGINT" property="createUserId"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
@ -17,13 +18,14 @@
<insert id="upsert" parameterType="apelet.common.flow.model.FlowTaskInstanceExt"> <insert id="upsert" parameterType="apelet.common.flow.model.FlowTaskInstanceExt">
INSERT INTO zz_flow_task_instance_ext INSERT INTO zz_flow_task_instance_ext
(id, tenant_id, app_code, process_instance_id, process_definition_id, task_key, title, (id, tenant_id, app_code, process_instance_id, process_definition_id, task_key,
create_time, create_user_id, update_time, update_user_id) title, title_incomplete, create_time, create_user_id, update_time, update_user_id)
VALUES VALUES
(#{id}, #{tenantId}, #{appCode}, #{processInstanceId}, #{processDefinitionId}, #{taskKey}, #{title}, (#{id}, #{tenantId}, #{appCode}, #{processInstanceId}, #{processDefinitionId}, #{taskKey},
#{createTime}, #{createUserId}, #{updateTime}, #{updateUserId}) #{title}, #{titleIncomplete}, #{createTime}, #{createUserId}, #{updateTime}, #{updateUserId})
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
title = VALUES(title), title = VALUES(title),
title_incomplete = VALUES(title_incomplete),
process_definition_id = VALUES(process_definition_id), process_definition_id = VALUES(process_definition_id),
update_time = VALUES(update_time), update_time = VALUES(update_time),
update_user_id = VALUES(update_user_id) update_user_id = VALUES(update_user_id)

7
common/common-flow/src/main/java/apelet/common/flow/model/FlowTaskInstanceExt.java

@ -61,6 +61,13 @@ public class FlowTaskInstanceExt {
private String title; private String title;
/** /**
* 标题是否未完整解析:0-完整;1-模板里还有没解析出来的 ${...} 占位符。
* <p>resolveTitle 取不到值时是静默保留占位符的,靠这个标记才能事后筛出没算全的标题。</p>
*/
@TableField(value = "title_incomplete")
private Integer titleIncomplete;
/**
* 创建时间。 * 创建时间。
*/ */
@TableField(value = "create_time") @TableField(value = "create_time")

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

@ -982,11 +982,6 @@ public class FlowApiServiceImpl implements FlowApiService {
flowEntryService.getFlowEntryPublishList(processDefinitionIdSet); flowEntryService.getFlowEntryPublishList(processDefinitionIdSet);
Map<String, FlowEntryPublish> flowEntryPublishMap = Map<String, FlowEntryPublish> flowEntryPublishMap =
flowEntryPublishList.stream().collect(Collectors.toMap(FlowEntryPublish::getProcessDefinitionId, c -> c)); flowEntryPublishList.stream().collect(Collectors.toMap(FlowEntryPublish::getProcessDefinitionId, c -> c));
// 批量加载流程对象,用于判断在线表单(bindFormType=0)
Set<Long> entryIdSet = flowEntryPublishList.stream()
.map(FlowEntryPublish::getEntryId).filter(Objects::nonNull).collect(Collectors.toSet());
Map<Long, FlowEntry> flowEntryMap = flowEntryService.listByIds(entryIdSet).stream()
.collect(Collectors.toMap(FlowEntry::getEntryId, e -> e));
List<ProcessInstance> instanceList = this.getProcessInstanceList(procInstanceIdSet); List<ProcessInstance> instanceList = this.getProcessInstanceList(procInstanceIdSet);
Map<String, ProcessInstance> instanceMap = Map<String, ProcessInstance> instanceMap =
instanceList.stream().collect(Collectors.toMap(ProcessInstance::getId, c -> c)); instanceList.stream().collect(Collectors.toMap(ProcessInstance::getId, c -> c));
@ -1000,8 +995,6 @@ public class FlowApiServiceImpl implements FlowApiService {
// 节点标题按实例批量预载(一次 IN 查询覆盖整页),避免逐行查询造成 N+1。 // 节点标题按实例批量预载(一次 IN 查询覆盖整页),避免逐行查询造成 N+1。
Map<String, FlowTaskInstanceExt> taskInstanceExtMap = Map<String, FlowTaskInstanceExt> taskInstanceExtMap =
flowTaskInstanceExtService.getMapByProcessInstanceIds(procInstanceIdSet); flowTaskInstanceExtService.getMapByProcessInstanceIds(procInstanceIdSet);
List<FlowTaskExt> allFlowTaskExtList = flowTaskExtService.getByProcessDefinitionId(processDefinitionIdSet);
Map<String, FlowTaskExt> flowTaskExtMap = allFlowTaskExtList.stream().collect(Collectors.toMap(t -> t.getProcessDefinitionId() + ":" + t.getTaskId(), t -> t, (k1, k2) -> k1));
Map<String, Boolean> multiInstanceTaskMap = new HashMap<>(); Map<String, Boolean> multiInstanceTaskMap = new HashMap<>();
for (Task task : taskList) { for (Task task : taskList) {
FlowTaskVo flowTaskVo = new FlowTaskVo(); FlowTaskVo flowTaskVo = new FlowTaskVo();
@ -1029,12 +1022,10 @@ public class FlowApiServiceImpl implements FlowApiService {
flowTaskVo.setIsDraft(flowWorkOrder.getFlowStatus().equals(FlowTaskStatus.DRAFT)); flowTaskVo.setIsDraft(flowWorkOrder.getFlowStatus().equals(FlowTaskStatus.DRAFT));
flowTaskVo.setWorkOrderCode(flowWorkOrder.getWorkOrderCode()); flowTaskVo.setWorkOrderCode(flowWorkOrder.getWorkOrderCode());
} }
FlowTaskExt flowTaskExt = flowTaskExtMap.get(task.getProcessDefinitionId() + ":" + task.getTaskDefinitionKey()); // 标题只以 zz_flow_task_instance_ext 的落库值为准:没有标题行就是空,
FlowEntry flowEntry = flowEntryMap.get(flowEntryPublishMap.get(task.getProcessDefinitionId()).getEntryId()); // 不需要再按"节点配没配模板""是不是在线表单"做前置判断(那两个条件对标题行本身没有约束力)。
if (flowTaskExt != null && flowEntry != null) {
flowTaskVo.setTitle(this.resolveTitleCached(flowWorkOrder, task.getTaskDefinitionKey(), flowTaskVo.setTitle(this.resolveTitleCached(flowWorkOrder, task.getTaskDefinitionKey(),
taskInstanceExtMap.get(task.getProcessInstanceId() + ":" + task.getTaskDefinitionKey()))); taskInstanceExtMap.get(task.getProcessInstanceId() + ":" + task.getTaskDefinitionKey())));
}
flowTaskVoList.add(flowTaskVo); flowTaskVoList.add(flowTaskVo);
} }
Set<String> loginNameSet = flowTaskVoList.stream() Set<String> loginNameSet = flowTaskVoList.stream()

5
common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowTaskInstanceExtServiceImpl.java

@ -6,6 +6,7 @@ import apelet.common.core.base.service.BaseService;
import apelet.common.core.constant.ApplicationConstant; import apelet.common.core.constant.ApplicationConstant;
import apelet.common.core.object.TokenData; import apelet.common.core.object.TokenData;
import apelet.common.core.util.DefaultDataSourceResolver; import apelet.common.core.util.DefaultDataSourceResolver;
import apelet.common.flow.constant.FlowConstant;
import apelet.common.flow.dao.FlowTaskInstanceExtMapper; import apelet.common.flow.dao.FlowTaskInstanceExtMapper;
import apelet.common.flow.model.FlowTaskInstanceExt; import apelet.common.flow.model.FlowTaskInstanceExt;
import apelet.common.flow.service.FlowTaskInstanceExtService; import apelet.common.flow.service.FlowTaskInstanceExtService;
@ -73,6 +74,10 @@ public class FlowTaskInstanceExtServiceImpl extends BaseService<FlowTaskInstance
entity.setProcessDefinitionId(processDefinitionId); entity.setProcessDefinitionId(processDefinitionId);
entity.setTaskKey(taskKey); entity.setTaskKey(taskKey);
entity.setTitle(this.truncateTitle(title)); entity.setTitle(this.truncateTitle(title));
// 标题里还残留 ${xxx} 说明有占位符没解析出来(最常见的原因是该实例的业务数据已经不存在了)。
// resolveTitle 对这种情况是静默的,不打标记就只能靠肉眼在标题里找 ${},事后也筛不出来。
// 注意判断的是截断【前】的原始标题:截断可能把 ${number} 截成半个,那也要算没算全。
entity.setTitleIncomplete(StrUtil.contains(title, FlowConstant.TITLE_PLACEHOLDER_PREFIX) ? 1 : 0);
Date now = new Date(); Date now = new Date();
entity.setCreateTime(now); entity.setCreateTime(now);
entity.setUpdateTime(now); entity.setUpdateTime(now);

7
common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowTaskTitleBackfillServiceImpl.java

@ -5,6 +5,7 @@ import apelet.common.core.constant.ApplicationConstant;
import apelet.common.core.object.GlobalThreadLocal; import apelet.common.core.object.GlobalThreadLocal;
import apelet.common.core.object.TokenData; import apelet.common.core.object.TokenData;
import apelet.common.core.util.DefaultDataSourceResolver; import apelet.common.core.util.DefaultDataSourceResolver;
import apelet.common.flow.constant.FlowConstant;
import apelet.common.flow.model.FlowEntry; import apelet.common.flow.model.FlowEntry;
import apelet.common.flow.model.FlowTaskExt; import apelet.common.flow.model.FlowTaskExt;
import apelet.common.flow.model.FlowTaskInstanceExt; import apelet.common.flow.model.FlowTaskInstanceExt;
@ -76,6 +77,7 @@ public class FlowTaskTitleBackfillServiceImpl implements FlowTaskTitleBackfillSe
result.setInstanceCount(0); result.setInstanceCount(0);
result.setNodeCount(0); result.setNodeCount(0);
result.setSavedCount(0); result.setSavedCount(0);
result.setIncompleteCount(0);
result.setSkippedExistCount(0); result.setSkippedExistCount(0);
result.setSkippedNoTitleCount(0); result.setSkippedNoTitleCount(0);
result.setFailedCount(0); result.setFailedCount(0);
@ -145,6 +147,11 @@ public class FlowTaskTitleBackfillServiceImpl implements FlowTaskTitleBackfillSe
flowTaskInstanceExtService.saveTaskTitle( flowTaskInstanceExtService.saveTaskTitle(
processInstanceId, workOrder.getProcessDefinitionId(), taskKey, title); processInstanceId, workOrder.getProcessDefinitionId(), taskKey, title);
result.setSavedCount(result.getSavedCount() + 1); result.setSavedCount(result.getSavedCount() + 1);
if (StrUtil.contains(title, FlowConstant.TITLE_PLACEHOLDER_PREFIX)) {
// 占位符没解析出来(通常是该实例的业务数据已不存在),落库时会打上 title_incomplete 标记,
// 这里单独计数,好让返回结果直接看出"有多少条其实没算全"——只看 failedCount 是看不出来的。
result.setIncompleteCount(result.getIncompleteCount() + 1);
}
} catch (Exception e) { } catch (Exception e) {
// 单条失败不影响整批,记数后继续 // 单条失败不影响整批,记数后继续
result.setFailedCount(result.getFailedCount() + 1); result.setFailedCount(result.getFailedCount() + 1);

7
common/common-flow/src/main/java/apelet/common/flow/vo/FlowTaskTitleBackfillVo.java

@ -38,6 +38,13 @@ public class FlowTaskTitleBackfillVo {
private Integer skippedExistCount; private Integer skippedExistCount;
/** /**
* 已写入、但标题里仍有未解析占位符的条数。
* <p>最常见的原因是该实例的业务数据已经不存在了。这些行的 title_incomplete 为 1。</p>
*/
@Schema(description = "标题未完整解析的条数")
private Integer incompleteCount;
/**
* 算不出标题(非在线表单 / 模板为空 / 业务数据取不到)而跳过的条数。 * 算不出标题(非在线表单 / 模板为空 / 业务数据取不到)而跳过的条数。
*/ */
@Schema(description = "算不出标题跳过的条数") @Schema(description = "算不出标题跳过的条数")

Loading…
Cancel
Save