优化报表删除

This commit is contained in:
zjf committed 2026-09-23 17:45:53 +08:00
1 parent 49cff27b0b
commit d43dd5dc8b
2 files changed
+53 -23

No files matched your search

+18 -3
View File
@@ -14,10 +14,20 @@ export function delFaceImportLog(ids?: Object) {
})
}
export function fetchFaceDetailPage(query?: Object) {
return request({ url: "/canteen/canteenReport/faceImport/detail/page", method: "get", params: query })
return request({
url: "/canteen/canteenReport/faceImport/detail/page",
method: "get",
params: query,
timeout: 120000,
})
}
export function fetchFaceDetailSum(query?: Object) {
return request({ url: "/canteen/canteenReport/faceImport/detail/sum", method: "get", params: query })
return request({
url: "/canteen/canteenReport/faceImport/detail/sum",
method: "get",
params: query,
timeout: 120000,
})
}
export function importFaceExcel(data: FormData, params: Object) {
return request({
@@ -39,7 +49,12 @@ export function aggregateFaceToSwipe(params: Object) {
})
}
export function fetchFaceOrgLevel2(query?: Object) {
return request({ url: "/canteen/canteenReport/faceImport/orgLevel2", method: "get", params: query })
return request({
url: "/canteen/canteenReport/faceImport/orgLevel2",
method: "get",
params: query,
timeout: 120000,
})
}
/** 结算台厂区 */
@@ -17,7 +17,8 @@
<el-select v-model="state.queryForm.status" clearable placeholder="全部" style="width: 120px">
<el-option label="成功" value="SUCCESS" />
<el-option label="失败" value="FAILED" />
<el-option label="进行中" value="RUNNING" />
<el-option label="导入中" value="RUNNING" />
<el-option label="删除中" value="DELETING" />
</el-select>
</el-form-item>
<el-form-item>
@@ -54,13 +55,13 @@
:closable="false"
show-icon
class="mb-3"
:title="`后台仍有导入任务进行中,列表约每 5 秒自动刷新…${importEtaHint ? ' ' + importEtaHint : ''}`"
:title="`后台仍有导入/删除任务进行中,列表约每 5 秒自动刷新…${importEtaHint ? ' ' + importEtaHint : ''}`"
/>
<el-table
:data="state.dataList"
v-loading="state.loading || !!deleteLoadingId"
element-loading-text="正在删除明细与关联刷卡,请稍候…"
element-loading-text="正在提交删除…"
border
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
@@ -88,6 +89,7 @@
<el-tag v-if="row.status === 'SUCCESS'" type="success" size="small">成功</el-tag>
<el-tag v-else-if="row.status === 'FAILED'" type="danger" size="small">失败</el-tag>
<el-tag v-else-if="row.status === 'RUNNING'" type="warning" size="small" effect="dark">导入中</el-tag>
<el-tag v-else-if="row.status === 'DELETING'" type="warning" size="small" effect="dark">删除中</el-tag>
<el-tag v-else type="info" size="small">{{ row.status || "-" }}</el-tag>
</template>
</el-table-column>
@@ -107,12 +109,17 @@
<el-table-column prop="createTime" label="导入时间" width="170" />
<el-table-column label="操作" width="130" fixed="right">
<template #default="{ row }">
<el-button link type="primary" :disabled="!!deleteLoadingId" @click="openDetail(row)">明细</el-button>
<el-button
link
type="primary"
:disabled="row.status === 'RUNNING' || row.status === 'DELETING' || !!deleteLoadingId"
@click="openDetail(row)"
>明细</el-button>
<el-button
link
type="danger"
:loading="deleteLoadingId === row.id"
:disabled="row.status === 'RUNNING' || (!!deleteLoadingId && deleteLoadingId !== row.id)"
:disabled="row.status === 'RUNNING' || row.status === 'DELETING' || (!!deleteLoadingId && deleteLoadingId !== row.id)"
@click="handleDeleteLog(row)"
>
删除
@@ -272,7 +279,7 @@
<el-option
v-for="o in detailOrgOptions"
:key="o.name"
:label="`${o.name}(${o.cnt})`"
:label="o.cnt != null ? `${o.name}(${o.cnt})` : o.name"
:value="o.name"
/>
</el-select>
@@ -299,10 +306,11 @@
</el-form>
<div class="detail-sum-bar mb-2">
<span>当前筛选合计(订单金额):</span>
<b class="sum-amount">{{ fmtDetailAmount(detailSummary.totalAmount) }}</b>
<b class="sum-amount">{{ detailSummary.amountSkipped ? "—" : fmtDetailAmount(detailSummary.totalAmount) }}</b>
<span class="sum-unit">元</span>
<span class="sum-split">|</span>
<span>共 {{ detailSummary.totalCount ?? 0 }} 条</span>
<span v-if="detailSummary.amountSkipped" class="sum-filter">(全量金额暂不统计,缩小筛选后可看合计)</span>
<span v-if="detailQuery.orgLevel2s?.length" class="sum-filter">
二级组织:{{ detailQuery.orgLevel2s.join("、") }}
</span>
@@ -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<any[]>([])
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