优化报表删除
This commit is contained in:
1 parent
49cff27b0b
commit
d43dd5dc8b
2 files changed
+53
-23
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user