fix: harden disk monitor job interactions
This commit is contained in:
@@ -28,8 +28,13 @@
|
||||
@confirm="confirmTarget"
|
||||
/>
|
||||
|
||||
<DiskMonitorJobTable :rows="jobList" :loading="loading.jobs" @refresh="loadPageData" @detail="openJobDetail" />
|
||||
<DiskMonitorJobDetailDrawer v-model:visible="jobDetailVisible" :detail="jobDetail" :loading="detailLoading" />
|
||||
<DiskMonitorJobTable :rows="jobList" :loading="loading.jobs" @refresh="loadJobList" @detail="openJobDetail" />
|
||||
<DiskMonitorJobDetailDrawer
|
||||
:visible="jobDetailVisible"
|
||||
:detail="jobDetail"
|
||||
:loading="detailLoading"
|
||||
@update:visible="handleJobDetailVisibleChange"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -76,6 +81,7 @@ const jobList = ref<DiskMonitor.JobListItem[]>([])
|
||||
const jobDetailVisible = ref(false)
|
||||
const jobDetail = ref<DiskMonitor.JobDetailData | null>(null)
|
||||
const detailLoading = ref(false)
|
||||
const jobDetailRequestSeq = ref(0)
|
||||
const loading = reactive({
|
||||
init: false,
|
||||
save: false,
|
||||
@@ -148,7 +154,6 @@ const removeTarget = (index: number) => {
|
||||
const loadPolicyDetail = async () => {
|
||||
const response = await getDiskMonitorPolicyDetail()
|
||||
const detail = response.data
|
||||
|
||||
if (!detail) return
|
||||
|
||||
policyForm.value = detail.policy || createDefaultPolicy()
|
||||
@@ -159,12 +164,16 @@ const loadPolicyDetail = async () => {
|
||||
const loadJobList = async () => {
|
||||
loading.jobs = true
|
||||
try {
|
||||
// 统一拉取最近任务列表,并复用首条记录更新摘要卡片
|
||||
// 统一拉取最近任务列表,并按 startedAt 倒序确保摘要展示真实最新任务
|
||||
const response = await getDiskMonitorJobList({
|
||||
pageNum: 1,
|
||||
pageSize: 10
|
||||
})
|
||||
const records = response.data?.records || []
|
||||
const records = [...(response.data?.records || [])].sort((a, b) => {
|
||||
const first = new Date(a.startedAt).getTime()
|
||||
const second = new Date(b.startedAt).getTime()
|
||||
return second - first
|
||||
})
|
||||
jobList.value = records
|
||||
latestJob.value = records[0] || null
|
||||
} finally {
|
||||
@@ -172,16 +181,32 @@ const loadJobList = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
const handleJobDetailVisibleChange = (visible: boolean) => {
|
||||
jobDetailVisible.value = visible
|
||||
if (!visible) {
|
||||
// 抽屉关闭时让旧请求全部失效,避免回写已关闭的详情状态
|
||||
jobDetailRequestSeq.value += 1
|
||||
detailLoading.value = false
|
||||
jobDetail.value = null
|
||||
}
|
||||
}
|
||||
|
||||
const openJobDetail = async (row: DiskMonitor.JobListItem) => {
|
||||
const currentSeq = jobDetailRequestSeq.value + 1
|
||||
jobDetailRequestSeq.value = currentSeq
|
||||
jobDetailVisible.value = true
|
||||
jobDetail.value = null
|
||||
detailLoading.value = true
|
||||
|
||||
try {
|
||||
// 点击明细时按任务 ID 拉取完整执行结果与通知日志
|
||||
// 仅允许最新一次详情请求回写,避免快速切换任务导致脏数据覆盖
|
||||
const response = await getDiskMonitorJobDetail(row.id)
|
||||
if (currentSeq !== jobDetailRequestSeq.value || !jobDetailVisible.value) return
|
||||
jobDetail.value = response.data || null
|
||||
} finally {
|
||||
detailLoading.value = false
|
||||
if (currentSeq === jobDetailRequestSeq.value) {
|
||||
detailLoading.value = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user