You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
4.6 KiB
172 lines
4.6 KiB
<template> |
|
<div class="fault-rule-drawer"> |
|
<el-drawer v-model="isShowDrawer" title="任务详情" direction="rtl" size="50%" |
|
modal-class="model-dev-opn" |
|
:before-close="handleBeforeClose"> |
|
<main class="wh-full" v-loading="loading"> |
|
<template v-for="detail in detailList"> |
|
<el-descriptions border :title="`${detail.sn}任务详情`" style="margin-top: 20px"> |
|
<el-descriptions-item :label-width="60" label="状态"> |
|
<el-tag size="small" :type="statusTypeMap[detail.status]">{{ |
|
statusList.find(r => r.value === |
|
detail.status)?.label || '--' |
|
}} |
|
</el-tag> |
|
</el-descriptions-item> |
|
<el-descriptions-item :label-width="100" label="总数任务量">{{ |
|
detail.total |
|
}} |
|
</el-descriptions-item> |
|
<el-descriptions-item :label-width="110" label="已完任务量">{{ |
|
detail.finish |
|
}} |
|
</el-descriptions-item> |
|
<el-descriptions-item :label-width="60" label="信息"> |
|
{{ detail?.info ? detail.info : '暂无信息' }} |
|
</el-descriptions-item> |
|
<el-descriptions-item label="当前进度" style="width: 400px"> |
|
<template v-if="detail.total === 0 || detail.status === -1 || detail.status === 2 "> |
|
<span>暂无进度</span> |
|
</template> |
|
<el-progress v-else |
|
:percentage="Math.floor((detail.finish / detail.total) * 100)" |
|
:text-inside="true" :stroke-width="20"/> |
|
</el-descriptions-item> |
|
</el-descriptions> |
|
</template> |
|
</main> |
|
</el-drawer> |
|
</div> |
|
</template> |
|
|
|
<script setup lang="ts"> |
|
import { getSubTopic, type SubMsgData } from '@/utils/zmq' |
|
import ZMQWorker from '@/composables/useZMQJsonWorker' |
|
import { getTaskInfo, type TaskInfo, type TaskList } from '@/api/module/taks' |
|
import { useMessage } from '@/composables/useMessage' |
|
import { statusList, statusTypeMap } from "./utils"; |
|
|
|
const message = useMessage() |
|
const worker = ZMQWorker.getInstance() |
|
const isShowDrawer = defineModel<boolean>() |
|
|
|
const detailList = ref<TaskInfo[]>([]) |
|
const loading = ref(false) |
|
|
|
async function onDetail(row: TaskList) { |
|
loading.value = true |
|
const res = await getTaskInfo(row.id); |
|
if (res.code === 0) { |
|
detailList.value = res?.data?.details ?? [] |
|
} else { |
|
message.error('获取任务详情失败') |
|
} |
|
loading.value = false |
|
} |
|
|
|
const currentTaskId = ref('') |
|
const currentTask = ref<TaskList>() |
|
|
|
async function open(row: TaskList) { |
|
isShowDrawer.value = true |
|
currentTaskId.value = row.id |
|
currentTask.value = row |
|
await onDetail(row) |
|
worker.subscribe(getSubTopic('server', 'event', 'task'), zmqTaskCb) |
|
} |
|
|
|
const infoList = { |
|
'import': [{ |
|
value: -1, |
|
label: '子任务执行失败' |
|
}, { |
|
label: '等待执行', |
|
value: 0 |
|
}, { |
|
label: '子任务执行中', |
|
value: 1 |
|
}, { |
|
label: '子任务已取消', |
|
value: 2 |
|
}, { |
|
label: '子任务完成', |
|
value: 3 |
|
}], |
|
'export': [{ |
|
value: -1, |
|
label: '子任务执行失败' |
|
}, { |
|
label: '等待执行', |
|
value: 0 |
|
}, { |
|
label: '子任务执行中', |
|
value: 1 |
|
}, { |
|
label: '子任务已取消', |
|
value: 2 |
|
}, { |
|
label: '子任务完成', |
|
value: 3 |
|
}], |
|
'update': [{ |
|
value: -1, |
|
label: '更新执行失败' |
|
}, { |
|
label: '等待更新执行', |
|
value: 0 |
|
}, { |
|
label: '更新执行中', |
|
value: 1 |
|
}, { |
|
label: '更新已取消', |
|
value: 2 |
|
}, { |
|
label: '执行更新成功', |
|
value: 3 |
|
}] |
|
} as any |
|
|
|
function zmqTaskCb(msg: SubMsgData) { |
|
console.log('info', msg) |
|
const { feedback } = msg |
|
const taskId = feedback[0] |
|
const id = feedback[1] |
|
const deviceStatus = feedback[2] || '未知状态' |
|
const finish = feedback[3] || 0 |
|
const total = feedback[4] || 0 |
|
if (currentTaskId.value !== taskId) return |
|
const detail = detailList.value.find(item => item.id === id) |
|
if (!detail) return |
|
detail.status = deviceStatus |
|
detail.finish = finish |
|
detail.total = total |
|
if (!currentTask?.value?.mode) return; |
|
detail.info = `${infoList[currentTask.value.mode].find((r: any) => r.value === |
|
detail.status)?.label || '--'}` |
|
} |
|
|
|
function handleBeforeClose(done: () => void) { |
|
isShowDrawer.value = false |
|
currentTaskId.value = '' |
|
worker.unsubscribe(getSubTopic('server', 'event', 'task')) |
|
done() |
|
} |
|
|
|
defineExpose({ |
|
open, |
|
}) |
|
</script> |
|
|
|
<style scoped lang="scss"> |
|
.fault-rule-drawer { |
|
font-size: 16px; |
|
|
|
:deep(.edfs-wrap) { |
|
width: auto; |
|
} |
|
|
|
:deep(.el-drawer__header) { |
|
color: var(--text-color); |
|
} |
|
} |
|
</style>
|
|
|