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.

173 lines
4.6 KiB

<template>
<div class="fault-rule-drawer">
3 months ago
<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">
3 months ago
<el-descriptions-item :label-width="60" label="状态">
<el-tag size="small" :type="statusTypeMap[detail.status]">{{
3 months ago
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
3 months ago
: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">
3 months ago
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
}
3 months ago
const currentTaskId = ref('')
const currentTask = ref<TaskList>()
3 months ago
async function open(row: TaskList) {
isShowDrawer.value = true
3 months ago
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
3 months ago
function zmqTaskCb(msg: SubMsgData) {
console.log('info', msg)
3 months ago
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
3 months ago
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
3 months ago
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>