当前筛选合计(订单金额):
-
{{ fmtDetailAmount(detailSummary.totalAmount) }}
+
{{ detailSummary.amountSkipped ? "—" : fmtDetailAmount(detailSummary.totalAmount) }}
元
|
共 {{ detailSummary.totalCount ?? 0 }} 条
+
(全量金额暂不统计,缩小筛选后可看合计)
二级组织:{{ detailQuery.orgLevel2s.join("、") }}
@@ -487,19 +495,19 @@ const startImportPoll = () => {
pollTimer = setInterval(async () => {
await getDataList()
const list = (state.dataList || []) as any[]
- const running = list.some((r) => r.status === "RUNNING")
- if (!running) {
+ const busy = list.some((r) => r.status === "RUNNING" || r.status === "DELETING")
+ if (!busy) {
clearPollTimer()
importEtaHint.value = ""
- useMessage().success("导入任务已结束,请查看列表状态;成功后请点「统计汇总到刷卡明细」。")
+ useMessage().success("后台任务已结束,请查看列表状态。")
}
}, 5000)
}
watch(
- () => ((state.dataList || []) as any[]).some((r) => r.status === "RUNNING"),
- (hasRunning) => {
- if (hasRunning && !pollTimer) {
+ () => ((state.dataList || []) as any[]).some((r) => r.status === "RUNNING" || r.status === "DELETING"),
+ (hasBusy) => {
+ if (hasBusy && !pollTimer) {
startImportPoll()
}
}
@@ -665,7 +673,10 @@ const detailLoading = ref(false)
const detailOrgLoading = ref(false)
const detailOrgOptions = ref<{ name: string; cnt: number }[]>([])
const detailList = ref
([])
-const detailSummary = ref<{ totalAmount: number | string; totalCount: number }>({ totalAmount: 0, totalCount: 0 })
+const detailSummary = ref<{ totalAmount: number | string | null; totalCount: number; amountSkipped?: boolean }>({
+ totalAmount: 0,
+ totalCount: 0,
+})
const detailQuery = reactive({
bizMonth: "",
importLogId: undefined as any,
@@ -715,9 +726,10 @@ const loadDetailSummary = async () => {
detailSummary.value = {
totalAmount: res.data?.totalAmount ?? 0,
totalCount: Number(res.data?.totalCount ?? 0),
+ amountSkipped: !!res.data?.amountSkipped,
}
} catch {
- detailSummary.value = { totalAmount: 0, totalCount: 0 }
+ detailSummary.value = { totalAmount: 0, totalCount: detailPage.total || 0, amountSkipped: true }
}
}
@@ -745,10 +757,10 @@ const openSkip = (row: any) => {
}
const handleDeleteLog = async (row: { id: string; fileName?: string; status?: string }) => {
- if (row.status === "RUNNING" || deleteLoadingId.value) return
+ if (row.status === "RUNNING" || row.status === "DELETING" || deleteLoadingId.value) return
try {
await useMessageBox().confirm(
- `确认删除「${row.fileName || "该导入"}」?将删除该批人脸逐笔明细;若已汇总到刷卡明细,对应 FACE 来源行也会一并删除,数据量较大时可能需要等待。`,
+ `确认删除「${row.fileName || "该导入"}」?将后台分批删除该批人脸逐笔明细;若已汇总到刷卡明细,对应 FACE 来源行也会一并删除。数据量大时请稍后刷新列表查看进度。`,
"删除导入记录"
)
} catch {
@@ -757,8 +769,9 @@ const handleDeleteLog = async (row: { id: string; fileName?: string; status?: st
deleteLoadingId.value = row.id
try {
const res: any = await delFaceImportLog([row.id])
- useMessage().success(res.msg || "删除成功")
- getDataList()
+ useMessage().success(res.msg || "已提交删除")
+ await getDataList()
+ startImportPoll()
} catch (err: any) {
useMessage().error(err.msg || "删除失败")
} finally {
@@ -776,9 +789,11 @@ const openDetail = async (row?: any) => {
detailQuery.deviceName = ""
detailQuery.orgLevel2s = []
detailPage.current = 1
+ // 先给常用组织,避免等 DISTINCT 查询阻塞弹窗
+ detailOrgOptions.value = PREFERRED_ORGS.map((name) => ({ name, cnt: null as any }))
detailVisible.value = true
- await loadDetailOrgs()
loadDetails()
+ loadDetailOrgs()
}
const loadDetails = async () => {
detailLoading.value = true