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', field: 'nextTimes',
label: '后续执行时间', label: '后续执行时间',
content: (data) => { content: (data: InfraJobApi.Job) => {
if (!data?.nextTimes) { if (!data?.nextTimes || data.nextTimes.length === 0) {
return '无后续执行时间';
}
if (data.nextTimes.length === 0) {
return '无后续执行时间'; return '无后续执行时间';
} }
return h(Timeline, {}, () => return h(Timeline, {}, () =>
data.nextTimes.map((time: any) => data.nextTimes?.map((time: Date) =>
h(Timeline.Item, {}, () => formatDateTime(time)?.toString()), h(Timeline.Item, {}, () => formatDateTime(time)),
), ),
); );
}, },

View File

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

View File

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

View File

@ -9,6 +9,8 @@ import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks'; import { getDictOptions } from '@vben/hooks';
import { formatDateTime } from '@vben/utils'; import { formatDateTime } from '@vben/utils';
import { ElTimeline, ElTimelineItem } from 'element-plus';
import { DictTag } from '#/components/dict-tag'; 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 { ref } from 'vue';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { formatDateTime } from '@vben/utils';
import { getJob, getJobNextTimes } from '#/api/infra/job'; import { getJob, getJobNextTimes } from '#/api/infra/job';
import { useDescription } from '#/components/description'; import { useDescription } from '#/components/description';
@ -42,6 +41,8 @@ const [Modal, modalApi] = useVbenModal({
formData.value = await getJob(data.id); formData.value = await getJob(data.id);
// //
nextTimes.value = await getJobNextTimes(data.id); nextTimes.value = await getJobNextTimes(data.id);
// nextTimes formData便 schema 使
formData.value.nextTimes = nextTimes.value;
} finally { } finally {
modalApi.unlock(); modalApi.unlock();
} }
@ -57,19 +58,5 @@ const [Modal, modalApi] = useVbenModal({
:show-confirm-button="false" :show-confirm-button="false"
> >
<Descriptions :data="formData" /> <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> </Modal>
</template> </template>