提交接口进度完善
This commit is contained in:
@@ -115,13 +115,13 @@
|
||||
<div v-if="shouldShowProgress(item)" class="delete-brand-progress-block">
|
||||
<div class="delete-brand-progress-header">
|
||||
<span>任务进度</span>
|
||||
<span>{{ formatProgressPercent(item.taskId!) }}%</span>
|
||||
<span>{{ formatProgressPercent(item) }}%</span>
|
||||
</div>
|
||||
<div class="delete-brand-progress-bar">
|
||||
<div class="delete-brand-progress-bar-fill"
|
||||
:style="{ width: `${formatProgressPercent(item.taskId!)}%` }"></div>
|
||||
:style="{ width: `${formatProgressPercent(item)}%` }"></div>
|
||||
</div>
|
||||
<div class="files delete-brand-progress">{{ formatProgress(item.taskId!) }}</div>
|
||||
<div class="files delete-brand-progress">{{ formatProgress(item) }}</div>
|
||||
</div>
|
||||
<div v-if="item.previewRows?.length" class="files split-entry-list delete-brand-preview">
|
||||
{{ formatPreview(item.previewRows) }}
|
||||
@@ -167,13 +167,13 @@
|
||||
<div v-if="shouldShowProgress(item)" class="delete-brand-progress-block">
|
||||
<div class="delete-brand-progress-header">
|
||||
<span>任务进度</span>
|
||||
<span>{{ formatProgressPercent(item.taskId!) }}%</span>
|
||||
<span>{{ formatProgressPercent(item) }}%</span>
|
||||
</div>
|
||||
<div class="delete-brand-progress-bar">
|
||||
<div class="delete-brand-progress-bar-fill"
|
||||
:style="{ width: `${formatProgressPercent(item.taskId!)}%` }"></div>
|
||||
:style="{ width: `${formatProgressPercent(item)}%` }"></div>
|
||||
</div>
|
||||
<div class="files delete-brand-progress">{{ formatProgress(item.taskId!) }}</div>
|
||||
<div class="files delete-brand-progress">{{ formatProgress(item) }}</div>
|
||||
</div>
|
||||
<div v-if="item.previewRows?.length" class="files split-entry-list delete-brand-preview">
|
||||
{{ formatPreview(item.previewRows) }}
|
||||
@@ -421,25 +421,30 @@ function shouldShowProgress(item: DeleteBrandResultItem) {
|
||||
if (!taskId) return false
|
||||
|
||||
const progress = taskDetails.value[taskId]?.line_progress
|
||||
const status = getTaskStatus(taskId)
|
||||
const multiFileTask = isMultiFileTask(taskId)
|
||||
const qs = getQueueStatus(item)
|
||||
|
||||
// 已完成/终态后隐藏进度条。
|
||||
if (qs === '本文件解析完毕' || qs === '已被全局判定为终态') {
|
||||
if (multiFileTask) {
|
||||
const sessionItem = findSessionItem(taskId, item)
|
||||
const isActiveItem = getItemKey(item) === activeItemKey.value
|
||||
const isProgressTarget = Boolean(progress?.has_progress && progress?.info?.file_name === item.sourceFilename)
|
||||
|
||||
// 多文件任务下,展示规则更宽松:
|
||||
// 1) 当前活跃文件;2) 后端进度指向的文件;3) 已推送文件;4) 已完成文件(任务未终态时保留)。
|
||||
if (isActiveItem || isProgressTarget || sessionItem?._pushed) {
|
||||
return true
|
||||
}
|
||||
if ((status === 'RUNNING' || status === 'PENDING' || !status) && sessionItem?._completed) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
if (multiFileTask) {
|
||||
const sessionItem = findSessionItem(taskId, item)
|
||||
// 多文件任务:未入队的文件不展示同一个 task 的公共进度,避免“两个文件同时在跑”的错觉。
|
||||
if (!sessionItem?._pushed) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (progress?.has_progress && progress?.info?.file_name) {
|
||||
return progress.info.file_name === item.sourceFilename
|
||||
}
|
||||
return true
|
||||
// 单文件任务:完成/终态后隐藏。
|
||||
if (qs === '本文件解析完毕' || qs === '已被全局判定为终态') {
|
||||
return false
|
||||
}
|
||||
|
||||
if (progress?.has_progress || progress?.info) {
|
||||
@@ -507,10 +512,40 @@ function updateSummary(items: DeleteBrandResultItem[]) {
|
||||
}
|
||||
}
|
||||
|
||||
function formatProgress(taskId: number) {
|
||||
function getFileProgress(item: DeleteBrandResultItem) {
|
||||
const taskId = item.taskId
|
||||
if (!taskId) return null
|
||||
const detail = taskDetails.value[taskId]
|
||||
const fileProgress = detail?.fileProgress || []
|
||||
return fileProgress.find((fp) => {
|
||||
if (fp.fileKey && item.fileKey) return fp.fileKey === item.fileKey
|
||||
if (fp.sourceFilename && item.sourceFilename) return fp.sourceFilename === item.sourceFilename
|
||||
return false
|
||||
}) || null
|
||||
}
|
||||
|
||||
function formatProgress(item: DeleteBrandResultItem) {
|
||||
const taskId = item.taskId
|
||||
if (!taskId) return ''
|
||||
|
||||
const detail = taskDetails.value[taskId]
|
||||
const info = detail?.line_progress?.info
|
||||
const fp = getFileProgress(item)
|
||||
|
||||
if (fp) {
|
||||
const parts: string[] = []
|
||||
const processedRows = fp.processedRows ?? 0
|
||||
const totalRows = fp.totalRows ?? 0
|
||||
if (fp.status) parts.push(`文件状态:${fp.status}`)
|
||||
parts.push(`文件进度:${processedRows}/${totalRows}`)
|
||||
if (info?.finished_files != null) {
|
||||
const total = info.file_total && info.file_total > 0 ? `/${info.file_total}` : ''
|
||||
parts.push(`已完成文件:${info.finished_files}${total}`)
|
||||
}
|
||||
if (info?.phase) parts.push(`阶段:${info.phase}`)
|
||||
return parts.join('|')
|
||||
}
|
||||
|
||||
if (!detail?.line_progress?.has_progress || !info) {
|
||||
const status = detail?.task?.status
|
||||
return status ? `任务状态:${status}` : ''
|
||||
@@ -532,8 +567,15 @@ function formatProgress(taskId: number) {
|
||||
return parts.join('|')
|
||||
}
|
||||
|
||||
function formatProgressPercent(taskId: number) {
|
||||
function formatProgressPercent(item: DeleteBrandResultItem) {
|
||||
const taskId = item.taskId
|
||||
if (!taskId) return 0
|
||||
|
||||
const fp = getFileProgress(item)
|
||||
if (fp) {
|
||||
return Math.max(0, Math.min(100, fp.percent ?? 0))
|
||||
}
|
||||
|
||||
const info = taskDetails.value[taskId]?.line_progress?.info
|
||||
if (!info) return 0
|
||||
|
||||
@@ -578,20 +620,21 @@ function getQueueStatus(item: DeleteBrandResultItem) {
|
||||
return '已被全局判定为终态'
|
||||
}
|
||||
|
||||
// 多文件:未推送的文件必须保持“未入队”,避免被同 task 的公共 RUNNING 状态误判成“处理中”。
|
||||
if (multiFileTask && !sessionItem?._pushed && !sessionItem?._completed) {
|
||||
return '未入队'
|
||||
}
|
||||
|
||||
// 先看前端会话态:一旦该文件已判定完成,优先展示完成,避免被 RUNNING 覆盖导致链式推进卡住。
|
||||
if (sessionItem?._completed) {
|
||||
return '本文件解析完毕'
|
||||
}
|
||||
|
||||
// 多文件场景下,如果后端进度明确指向当前文件,即使本地 _pushed 丢失也应判定为处理中(例如刷新页面后恢复场景)。
|
||||
if (status === 'RUNNING' && info?.has_progress && info?.info?.file_name === item.sourceFilename) {
|
||||
return '处理中'
|
||||
}
|
||||
|
||||
// 多文件:未推送且未完成,才视为未入队。
|
||||
if (multiFileTask && !sessionItem?._pushed && !sessionItem?._completed) {
|
||||
return '未入队'
|
||||
}
|
||||
|
||||
if (multiFileTask && status === 'SUCCESS') {
|
||||
return '本文件解析完毕'
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user