reactor:【infra 基础设施】infra 的 job、joblogger 描述的统一

pull/211/head
YunaiV 2025-09-10 23:50:56 +08:00
parent 21f76355fa
commit 5ec4d8ab82
5 changed files with 34 additions and 32 deletions

View File

@ -228,16 +228,13 @@ export function useDetailSchema(): DescriptionItemSchema[] {
{
field: 'nextTimes',
label: '后续执行时间',
content: (data) => {
if (!data?.nextTimes) {
return '无后续执行时间';
}
if (data.nextTimes.length === 0) {
content: (data: InfraJobApi.Job) => {
if (!data?.nextTimes || data.nextTimes.length === 0) {
return '无后续执行时间';
}
return h(Timeline, {}, () =>
data.nextTimes.map((time: any) =>
h(Timeline.Item, {}, () => formatDateTime(time)?.toString()),
data.nextTimes?.map((time: Date) =>
h(Timeline.Item, {}, () => formatDateTime(time)),
),
);
},

View File

@ -13,6 +13,15 @@ import { useDetailSchema } from '../data';
const formData = ref<InfraJobApi.Job>(); //
const nextTimes = ref<Date[]>([]); //
const [Descriptions] = useDescription({
componentProps: {
bordered: true,
column: 1,
class: 'mx-4',
},
schema: useDetailSchema(),
});
const [Modal, modalApi] = useVbenModal({
async onOpenChange(isOpen: boolean) {
if (!isOpen) {
@ -29,21 +38,13 @@ const [Modal, modalApi] = useVbenModal({
formData.value = await getJob(data.id);
//
nextTimes.value = await getJobNextTimes(data.id);
// nextTimes formData便 schema 使
formData.value.nextTimes = nextTimes.value;
} finally {
modalApi.unlock();
}
},
});
const [Description] = useDescription({
componentProps: {
bordered: true,
column: 1,
class: 'mx-4',
},
schema: useDetailSchema(),
});
</script>
<template>
@ -53,6 +54,6 @@ const [Description] = useDescription({
:show-cancel-button="false"
:show-confirm-button="false"
>
<Description :data="formData" />
<Descriptions :data="formData" />
</Modal>
</template>

View File

@ -15,6 +15,7 @@ export namespace InfraJobApi {
retryInterval: number;
monitorTimeout: number;
createTime?: Date;
nextTimes?: Date[];
}
}

View File

@ -9,6 +9,8 @@ import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
import { formatDateTime } from '@vben/utils';
import { ElTimeline, ElTimelineItem } from 'element-plus';
import { DictTag } from '#/components/dict-tag';
/** 新增/修改的表单 */
@ -226,5 +228,19 @@ export function useDetailSchema(): DescriptionItemSchema[] {
: '未开启';
},
},
{
field: 'nextTimes',
label: '后续执行时间',
content: (data: InfraJobApi.Job) => {
if (!data?.nextTimes || data.nextTimes.length === 0) {
return '无后续执行时间';
}
return h(ElTimeline, {}, () =>
data.nextTimes?.map((time: Date) =>
h(ElTimelineItem, {}, () => formatDateTime(time)),
),
);
},
},
];
}

View File

@ -4,7 +4,6 @@ import type { InfraJobApi } from '#/api/infra/job';
import { ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { formatDateTime } from '@vben/utils';
import { getJob, getJobNextTimes } from '#/api/infra/job';
import { useDescription } from '#/components/description';
@ -42,6 +41,8 @@ const [Modal, modalApi] = useVbenModal({
formData.value = await getJob(data.id);
//
nextTimes.value = await getJobNextTimes(data.id);
// nextTimes formData便 schema 使
formData.value.nextTimes = nextTimes.value;
} finally {
modalApi.unlock();
}
@ -57,19 +58,5 @@ const [Modal, modalApi] = useVbenModal({
:show-confirm-button="false"
>
<Descriptions :data="formData" />
<!-- 后续执行时间 -->
<div v-if="nextTimes.length > 0" class="mt-4">
<h4 class="mb-2 text-lg font-medium">后续执行时间</h4>
<div class="max-h-[200px] overflow-y-auto rounded border p-2">
<div
v-for="(nextTime, index) in nextTimes"
:key="index"
class="py-1 text-sm text-gray-600"
>
{{ index + 1 }} {{ formatDateTime(nextTime.toString()) }}
</div>
</div>
</div>
</Modal>
</template>