|
@@ -117,9 +117,21 @@
|
|
|
</span>
|
|
</span>
|
|
|
<span class="stat-label">导入失败(条)</span>
|
|
<span class="stat-label">导入失败(条)</span>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <!-- AI 无法清洗的表:同属失败语义,单独明示(此前只藏在处理日志里) -->
|
|
|
|
|
+ <template v-if="unableCount > 0">
|
|
|
|
|
+ <div class="stat-divider"></div>
|
|
|
|
|
+ <div class="stat-item">
|
|
|
|
|
+ <span class="stat-value is-fail">{{ unableCount }}</span>
|
|
|
|
|
+ <span class="stat-label">未清洗(表)</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="complete-actions">
|
|
<div class="complete-actions">
|
|
|
- <Button v-if="showErrorLogAction" class="complete-log" @click="handleViewLog">查看错误日志</Button>
|
|
|
|
|
|
|
+ <Button class="complete-log" @click="handleViewLog">查看清洗日志</Button>
|
|
|
|
|
+ <Button v-if="isFused" type="primary" class="complete-result" @click="handleStartAnalysis">
|
|
|
|
|
+ 开始分析
|
|
|
|
|
+ </Button>
|
|
|
|
|
+ <Button v-else type="primary" class="complete-result" @click="handleViewResult">查看结果</Button>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
@@ -221,7 +233,6 @@
|
|
|
if (isComplete.value) return governTaskFinished.value ? '数据治理完成' : '清洗入库流程已完成';
|
|
if (isComplete.value) return governTaskFinished.value ? '数据治理完成' : '清洗入库流程已完成';
|
|
|
return `当前正在执行${currentStepLabel.value}`;
|
|
return `当前正在执行${currentStepLabel.value}`;
|
|
|
});
|
|
});
|
|
|
- const showErrorLogAction = computed(() => Number(displayFailCount.value ?? 0) > 0);
|
|
|
|
|
const completeDesc = computed(() =>
|
|
const completeDesc = computed(() =>
|
|
|
governTaskFinished.value ? '数据治理已完成,治理结果已写入案件数据。' : '清洗与入库流程已执行完毕。',
|
|
governTaskFinished.value ? '数据治理已完成,治理结果已写入案件数据。' : '清洗与入库流程已执行完毕。',
|
|
|
);
|
|
);
|
|
@@ -347,11 +358,29 @@
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handleViewLog = () => {
|
|
const handleViewLog = () => {
|
|
|
- if (!showErrorLogAction.value) return;
|
|
|
|
|
refreshCurrentCleanBatchId();
|
|
refreshCurrentCleanBatchId();
|
|
|
logModalOpen.value = true;
|
|
logModalOpen.value = true;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 自主清洗的完成出口「查看结果」:跳清洗结果统计页(导入文件列表带数据量/成功失败条数)。
|
|
|
|
|
+ * 智能清洗的对应出口是「开始分析」(见 {@link handleStartAnalysis})。
|
|
|
|
|
+ */
|
|
|
|
|
+ const handleViewResult = async () => {
|
|
|
|
|
+ if (!shouldRunGovernAfterClean.value) {
|
|
|
|
|
+ createMessage.warning('数据治理已关闭,本次导入未自动治理,可在数据页手动执行');
|
|
|
|
|
+ }
|
|
|
|
|
+ await navigateToImportResult();
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ /** 智能清洗的完成出口「开始分析」:直接进案件研判(智能工作台)新对话草稿 */
|
|
|
|
|
+ const handleStartAnalysis = async () => {
|
|
|
|
|
+ if (!shouldRunGovernAfterClean.value) {
|
|
|
|
|
+ createMessage.warning('数据治理已关闭,本次导入未自动治理,可在数据页手动执行');
|
|
|
|
|
+ }
|
|
|
|
|
+ await go({ path: PageEnum.BASE_WORKBENCH, query: { newChat: '1' } }, true);
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
const navigateToImportResult = async () => {
|
|
const navigateToImportResult = async () => {
|
|
|
sessionStorage.removeItem(IMPORT_FILE_INFO_STORAGE_KEY);
|
|
sessionStorage.removeItem(IMPORT_FILE_INFO_STORAGE_KEY);
|
|
|
sessionStorage.removeItem(RECLEAN_CONTEXT_STORAGE_KEY);
|
|
sessionStorage.removeItem(RECLEAN_CONTEXT_STORAGE_KEY);
|
|
@@ -866,8 +895,7 @@
|
|
|
/**
|
|
/**
|
|
|
* 清洗阶段完成判定:非融合模式看 SSE 进度;融合模式看 AI 批次终态 —— 后端在
|
|
* 清洗阶段完成判定:非融合模式看 SSE 进度;融合模式看 AI 批次终态 —— 后端在
|
|
|
* 1/2/3 级全部结束后推终态消息(cmd 103,stage=DONE/PARTIAL/FAILED)。纯 AI/4级
|
|
* 1/2/3 级全部结束后推终态消息(cmd 103,stage=DONE/PARTIAL/FAILED)。纯 AI/4级
|
|
|
- * 批次没有 doClean,SSE 进度不会走到 100%,不能拿 progress 当完成依据,
|
|
|
|
|
- * 否则完成面板与自动跳转永远不会触发(2026-10-11 实测卡在「任务执行中」)。
|
|
|
|
|
|
|
+ * 批次没有 doClean,SSE 进度不会走到 100%,不能拿 progress 当完成依据。
|
|
|
*/
|
|
*/
|
|
|
const cleanPhaseDone = computed(() => (isFused.value ? aiStageFinished.value : progress.value >= 100));
|
|
const cleanPhaseDone = computed(() => (isFused.value ? aiStageFinished.value : progress.value >= 100));
|
|
|
const isComplete = computed(
|
|
const isComplete = computed(
|
|
@@ -875,27 +903,16 @@
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 进度到 100%(清洗/治理全部完成)后自动跳转到清洗结果统计页(案件数据 / 导入文件,
|
|
|
|
|
- * 列表带每个文件的数据量与成功/失败条数),停留片刻让用户看到完成状态。
|
|
|
|
|
- * isComplete 可能多次翻转 true(governTaskFinished 等),用标记防重入。
|
|
|
|
|
|
|
+ * 完成时提示「另有 N 个表 AI 无法清洗」——只在完成那一刻提醒一次。
|
|
|
|
|
+ * 完成后<b>不自动跳转</b>(2026-10-11 需求):跳转由完成面板上的按钮触发,
|
|
|
|
|
+ * 自主清洗给「查看结果」,智能清洗给「开始分析」。
|
|
|
*/
|
|
*/
|
|
|
- const autoJumped = ref(false);
|
|
|
|
|
watch(isComplete, (done) => {
|
|
watch(isComplete, (done) => {
|
|
|
- if (!done || autoJumped.value) return;
|
|
|
|
|
- autoJumped.value = true;
|
|
|
|
|
- createMessage.success('清洗导入完成,正在进入导入文件统计…');
|
|
|
|
|
|
|
+ if (!done) return;
|
|
|
const unable = isFused.value ? (aiStage.value?.needReviewCount ?? 0) : 0;
|
|
const unable = isFused.value ? (aiStage.value?.needReviewCount ?? 0) : 0;
|
|
|
if (unable > 0) {
|
|
if (unable > 0) {
|
|
|
createMessage.warning(`另有 ${unable} 个表 AI 无法清洗,详情见处理日志;可用「手动清洗」处理。`);
|
|
createMessage.warning(`另有 ${unable} 个表 AI 无法清洗,详情见处理日志;可用「手动清洗」处理。`);
|
|
|
}
|
|
}
|
|
|
- window.setTimeout(() => {
|
|
|
|
|
- // 自动跳转不弹「治理关闭」确认框(弹窗会卡住自动流程),改用提示说明;
|
|
|
|
|
- // 结果统计页顶栏本来就有「数据治理」按钮,用户可在那里手动治理。
|
|
|
|
|
- if (!shouldRunGovernAfterClean.value) {
|
|
|
|
|
- createMessage.warning('数据治理已关闭,本次导入未自动治理,可在数据页手动执行');
|
|
|
|
|
- }
|
|
|
|
|
- void navigateToImportResult();
|
|
|
|
|
- }, 1800);
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
/**
|