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.

108 lines
3.3 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}任务详情`">
<el-descriptions-item :label-width="60" label="状态"> <el-tag size="small">{{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="当前进度">
<template v-if="detail.total === 0">
<span>暂无进度</span>
</template>
<el-progress v-else style="width: 95%;" :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 PubMsgData } from '@/utils/zmq'
import ZMQWorker from '@/composables/useZMQJsonWorker'
import { getTaskInfo, type TaskInfo, type TaskList } from '@/api/module/taks'
import { useMessage } from '@/composables/useMessage'
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 curentTaskId = ref('')
async function open(row: TaskList) {
isShowDrawer.value = true
curentTaskId.value = row.id
await onDetail(row)
worker.subscribe(getSubTopic('server', 'event', 'task'), zmqTaskCb)
}
const statusList = [
{ label: '未开始', value: 0 },
{ label: '进行中', value: 1 },
{ label: '成功', value: 2 },
{ label: '失败', value: -1 },
]
function zmqTaskCb(msg: PubMsgData) {
const { feedback, result, id } = msg
const taskId = feedback[0]
const deviceSN = feedback[1]
const deviceStatus = feedback[2] || '未知状态'
const finish = feedback[3] || 0
const total = feedback[4] || 0
if (curentTaskId.value !== taskId) return
const detail = detailList.value.find(item => item.sn === deviceSN)
if (!detail) return
detail.status = deviceStatus
detail.finish = finish
detail.total = total
}
function handleBeforeClose(done: () => void) {
isShowDrawer.value = false
curentTaskId.value = ''
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>