gtsoft-snail-job-admin/src/views/job/batch/modules/job-batch-detail-drawer.vue

122 lines
4.1 KiB
Vue
Raw Normal View History

2024-05-07 14:51:19 +08:00
<script setup lang="tsx">
import { onBeforeUnmount, ref } from 'vue';
import { executorTypeRecord, operationReasonRecord, taskBatchStatusRecord } from '@/constants/business';
2024-05-05 21:56:42 +08:00
import { $t } from '@/locales';
import { tagColor } from '@/utils/common';
2024-05-07 14:51:19 +08:00
import { fetchJobLogList } from '@/service/api/log';
import JobTaskListTable from './job-task-list-table.vue';
import JobTaskTreeTable from './job-task-tree-table.vue';
2024-05-05 21:56:42 +08:00
defineOptions({
name: 'JobBatchDetailDrawer'
});
interface Props {
/** row data */
rowData?: Api.JobBatch.JobBatch | null;
}
2024-05-07 14:51:19 +08:00
defineProps<Props>();
2024-05-05 21:56:42 +08:00
const visible = defineModel<boolean>('visible', {
default: false
});
const taskData = ref<Api.Job.JobTask>();
2024-05-07 14:51:19 +08:00
const logShow = defineModel<boolean>('logShow', {
default: false
});
2024-05-05 21:56:42 +08:00
async function openLog(row: Api.Job.JobTask) {
logShow.value = true;
taskData.value = row;
await getLogList();
}
2024-05-07 14:51:19 +08:00
const logList = ref<Api.JobLog.JobMessage[]>([]);
const interval = ref<NodeJS.Timeout>();
const controller = new AbortController();
const finished = ref<boolean>(false);
let startId = '0';
let fromIndex: number = 0;
async function getLogList() {
const { data: logData, error } = await fetchJobLogList({
taskBatchId: taskData.value!.taskBatchId,
jobId: taskData.value!.jobId,
taskId: taskData.value!.id,
startId,
fromIndex,
size: 50
});
if (!error) {
finished.value = logData.finished;
startId = logData.nextStartId;
fromIndex = logData.fromIndex;
if (logData.message) {
logList.value.push(...logData.message);
logList.value.sort((a, b) => Number.parseInt(a.time_stamp, 10) - Number.parseInt(b.time_stamp, 10));
}
if (!finished.value) {
clearTimeout(interval.value);
interval.value = setTimeout(getLogList, 1000);
}
}
}
const stopLog = () => {
finished.value = true;
controller.abort();
clearTimeout(interval.value);
interval.value = undefined;
};
onBeforeUnmount(() => {
stopLog();
});
2024-05-05 21:56:42 +08:00
</script>
<template>
2024-05-07 14:51:19 +08:00
<DetailDrawer v-model="visible" :title="$t('page.jobBatch.detail')" :width="['50%', '90%']">
<NTabs type="segment" animated>
<NTabPane :name="0" :tab="$t('page.log.info')">
<NDescriptions label-placement="top" bordered :column="2">
<NDescriptionsItem :label="$t('page.jobBatch.groupName')">{{ rowData?.groupName }}</NDescriptionsItem>
<NDescriptionsItem :label="$t('page.jobBatch.jobName')">{{ rowData?.jobName }}</NDescriptionsItem>
<NDescriptionsItem :label="$t('page.jobBatch.taskBatchStatus')">
<NTag :type="tagColor(rowData?.taskBatchStatus!)">
{{ $t(taskBatchStatusRecord[rowData?.taskBatchStatus!]) }}
</NTag>
</NDescriptionsItem>
<NDescriptionsItem :label="$t('page.jobBatch.executionAt')">{{ rowData?.executionAt }}</NDescriptionsItem>
<NDescriptionsItem :label="$t('page.jobBatch.operationReason')">
<NTag :type="tagColor(rowData?.operationReason!)">
{{ $t(operationReasonRecord[rowData?.operationReason!]) }}
</NTag>
</NDescriptionsItem>
<NDescriptionsItem :label="$t('page.jobBatch.executorType')">
<NTag :type="tagColor(rowData?.executorType!)">
{{ $t(executorTypeRecord[rowData?.executorType!]) }}
</NTag>
</NDescriptionsItem>
<NDescriptionsItem :label="$t('page.jobBatch.executorInfo')" :span="2">
{{ rowData?.executorInfo }}
</NDescriptionsItem>
<NDescriptionsItem :label="$t('common.createDt')" :span="2">{{ rowData?.createDt }}</NDescriptionsItem>
</NDescriptions>
</NTabPane>
<NTabPane :name="1" :tab="$t('page.log.title')" display-directive="if">
<JobTaskTreeTable
v-if="rowData?.taskType && [4, 5].includes(Number(rowData.taskType))"
:row-data="rowData"
@show-log="openLog"
2024-05-07 14:51:19 +08:00
/>
<JobTaskListTable v-else :row-data="rowData" @show-log="openLog" />
2024-05-07 14:51:19 +08:00
</NTabPane>
</NTabs>
</DetailDrawer>
<LogDrawer v-model="logList" v-model:show="logShow" :title="$t('page.log.title')" />
2024-05-05 21:56:42 +08:00
</template>
<style scoped></style>