|
|
@@ -44,28 +44,28 @@
|
|
|
<el-table :data="state.jobData" style="width: 100%" v-loading="state.loading" border>
|
|
|
<el-table-column type="expand" fixed>
|
|
|
<template #default="scope">
|
|
|
- <el-table style="margin-left: 48px; width: calc(100% - 48px)" :data="scope.row.jobTriggers" border size="small">
|
|
|
+ <el-table style="margin-left: 48px; width: calc(100% - 48px)" :data="(scope.row as JobOutput).jobTriggers" border size="small">
|
|
|
<el-table-column type="index" label="序号" width="55" align="center" fixed />
|
|
|
<el-table-column prop="triggerId" label="触发器编号" width="120" fixed show-overflow-tooltip />
|
|
|
<el-table-column prop="triggerType" label="类型" show-overflow-tooltip />
|
|
|
- <el-table-column prop="assemblyName" label="程序集" show-overflow-tooltip />
|
|
|
+ <!-- <el-table-column prop="assemblyName" label="程序集" show-overflow-tooltip /> -->
|
|
|
<el-table-column prop="args" label="参数" show-overflow-tooltip />
|
|
|
<el-table-column prop="description" label="描述" width="120" show-overflow-tooltip />
|
|
|
<el-table-column prop="status" label="状态" width="100" align="center" show-overflow-tooltip>
|
|
|
<template #default="scope">
|
|
|
- <el-tag type="warning" effect="plain" v-if="scope.row.status == 0"> 积压 </el-tag>
|
|
|
- <el-tag type="" effect="plain" v-if="scope.row.status == 1"> 就绪 </el-tag>
|
|
|
- <el-tag type="success" effect="plain" v-if="scope.row.status == 2"> 正在运行 </el-tag>
|
|
|
- <el-tag type="danger" effect="plain" v-if="scope.row.status == 3"> 暂停 </el-tag>
|
|
|
- <el-tag type="danger" effect="plain" v-if="scope.row.status == 4"> 阻塞 </el-tag>
|
|
|
- <el-tag type="" effect="plain" v-if="scope.row.status == 5"> 由失败进入就绪 </el-tag>
|
|
|
- <el-tag type="danger" effect="plain" v-if="scope.row.status == 6"> 归档 </el-tag>
|
|
|
- <el-tag type="danger" effect="plain" v-if="scope.row.status == 7"> 崩溃 </el-tag>
|
|
|
- <el-tag type="danger" effect="plain" v-if="scope.row.status == 8"> 超限 </el-tag>
|
|
|
- <el-tag type="danger" effect="plain" v-if="scope.row.status == 9"> 无触发时间 </el-tag>
|
|
|
- <el-tag type="danger" effect="plain" v-if="scope.row.status == 10"> 未启动 </el-tag>
|
|
|
- <el-tag type="danger" effect="plain" v-if="scope.row.status == 11"> 未知作业触发器 </el-tag>
|
|
|
- <el-tag type="danger" effect="plain" v-if="scope.row.status == 12"> 未知作业处理程序 </el-tag>
|
|
|
+ <el-tag type="warning" effect="plain" v-if="(scope.row as SysJobTrigger).status == 0"> 积压 </el-tag>
|
|
|
+ <el-tag type="" effect="plain" v-if="(scope.row as SysJobTrigger).status == 1"> 就绪 </el-tag>
|
|
|
+ <el-tag type="success" effect="plain" v-if="(scope.row as SysJobTrigger).status == 2"> 正在运行 </el-tag>
|
|
|
+ <el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 3"> 暂停 </el-tag>
|
|
|
+ <el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 4"> 阻塞 </el-tag>
|
|
|
+ <el-tag type="" effect="plain" v-if="(scope.row as SysJobTrigger).status == 5"> 由失败进入就绪 </el-tag>
|
|
|
+ <el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 6"> 归档 </el-tag>
|
|
|
+ <el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 7"> 崩溃 </el-tag>
|
|
|
+ <el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 8"> 超限 </el-tag>
|
|
|
+ <el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 9"> 无触发时间 </el-tag>
|
|
|
+ <el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 10"> 未启动 </el-tag>
|
|
|
+ <el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 11"> 未知作业触发器 </el-tag>
|
|
|
+ <el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 12"> 未知作业处理程序 </el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column prop="startTime" label="起始时间" width="100" align="center" show-overflow-tooltip />
|
|
|
@@ -80,19 +80,19 @@
|
|
|
<el-table-column prop="retryTimeout" label="重试间隔ms" width="100" align="center" show-overflow-tooltip />
|
|
|
<el-table-column prop="startNow" label="是否立即启动" width="100" align="center" show-overflow-tooltip>
|
|
|
<template #default="scope">
|
|
|
- <el-tag v-if="scope.row.startNow == true"> 是 </el-tag>
|
|
|
+ <el-tag v-if="(scope.row as SysJobTrigger).startNow == true"> 是 </el-tag>
|
|
|
<el-tag type="info" v-else> 否 </el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column prop="runOnStart" label="是否启动时执行一次" width="150" align="center" show-overflow-tooltip>
|
|
|
<template #default="scope">
|
|
|
- <el-tag v-if="scope.row.runOnStart == true"> 是 </el-tag>
|
|
|
+ <el-tag v-if="(scope.row as SysJobTrigger).runOnStart == true"> 是 </el-tag>
|
|
|
<el-tag type="info" v-else> 否 </el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column prop="resetOnlyOnce" label="是否重置触发次数" width="120" align="center" show-overflow-tooltip>
|
|
|
<template #default="scope">
|
|
|
- <el-tag v-if="scope.row.resetOnlyOnce == true"> 是 </el-tag>
|
|
|
+ <el-tag v-if="(scope.row as SysJobTrigger).resetOnlyOnce == true"> 是 </el-tag>
|
|
|
<el-tag type="info" v-else> 否 </el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
@@ -117,37 +117,60 @@
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column type="index" label="序号" width="55" align="center" fixed />
|
|
|
- <el-table-column prop="jobDetail.jobId" label="作业编号" width="150" fixed>
|
|
|
+ <el-table-column prop="jobDetail.jobId" label="作业编号" width="180" fixed>
|
|
|
<template #default="scope">
|
|
|
<div style="display: flex; align-items: center">
|
|
|
<el-icon><timer /></el-icon>
|
|
|
- <span style="margin-left: 5px">{{ scope.row.jobDetail.jobId }}</span>
|
|
|
+ <span style="margin-left: 5px">{{ (scope.row as JobOutput).jobDetail?.jobId }}</span>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="jobDetail.groupName" label="组名称" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="jobDetail.groupName" label="组名称" width="100" show-overflow-tooltip />
|
|
|
<el-table-column prop="jobDetail.jobType" label="类型" show-overflow-tooltip />
|
|
|
- <el-table-column prop="jobDetail.assemblyName" label="程序集" show-overflow-tooltip />
|
|
|
+ <!-- <el-table-column prop="jobDetail.assemblyName" label="程序集" show-overflow-tooltip /> -->
|
|
|
<el-table-column prop="jobDetail.description" label="描述" show-overflow-tooltip />
|
|
|
- <el-table-column prop="jobDetail.concurrent" label="执行方式" width="100" align="center" show-overflow-tooltip>
|
|
|
+ <el-table-column prop="jobDetail.concurrent" label="执行方式" width="90" align="center" show-overflow-tooltip>
|
|
|
<template #default="scope">
|
|
|
- <el-tag type="success" v-if="scope.row.jobDetail.concurrent == true"> 并行 </el-tag>
|
|
|
+ <el-tag type="success" v-if="(scope.row as JobOutput).jobDetail?.concurrent == true"> 并行 </el-tag>
|
|
|
<el-tag type="warning" v-else> 串行 </el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="jobDetail.createFromScript" label="脚本创建" width="100" align="center" show-overflow-tooltip>
|
|
|
+ <el-table-column prop="jobDetail.createType" label="作业创建类型" width="110" align="center" show-overflow-tooltip>
|
|
|
<template #default="scope">
|
|
|
- <el-tag v-if="scope.row.jobDetail.createFromScript == true"> 是 </el-tag>
|
|
|
- <el-tag type="info" v-else> 否 </el-tag>
|
|
|
+ <el-tag type="info" v-if="(scope.row as JobOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_0"> 内置 </el-tag>
|
|
|
+ <el-tag type="warning" v-if="(scope.row as JobOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_1"> 脚本 </el-tag>
|
|
|
+ <el-tag type="success" v-if="(scope.row as JobOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_2"> HTTP请求 </el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<!-- <el-table-column prop="jobDetail.includeAnnotations" label="扫描特性触发器" align="center" show-overflow-tooltip>
|
|
|
<template #default="scope">
|
|
|
- <el-tag v-if="scope.row.jobDetail.includeAnnotations == true"> 是 </el-tag>
|
|
|
+ <el-tag v-if="(scope.row as JobOutput).jobDetail?.includeAnnotations == true"> 是 </el-tag>
|
|
|
<el-tag v-else> 否 </el-tag>
|
|
|
</template>
|
|
|
</el-table-column> -->
|
|
|
- <el-table-column prop="jobDetail.properties" label="额外数据" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="jobDetail.properties" label="额外数据" show-overflow-tooltip>
|
|
|
+ <template #default="scope">
|
|
|
+ <span v-if="(scope.row as JobOutput).jobDetail?.createType != JobCreateTypeEnum.NUMBER_2"> {{ (scope.row as JobOutput).jobDetail?.properties }} </span>
|
|
|
+ <div v-else style="text-align: center">
|
|
|
+ <el-popover placement="left" :width="400" trigger="hover">
|
|
|
+ <template #reference>
|
|
|
+ <el-tag effect="plain" type="info"> 请求参数 </el-tag>
|
|
|
+ </template>
|
|
|
+ <el-descriptions title="Http 请求参数" :column="1" size="small" :border="true">
|
|
|
+ <el-descriptions-item label="请求地址" label-align="right" label-class-name="job-index-descriptions-label-style">
|
|
|
+ {{ getHttpJobMessage((scope.row as JobOutput).jobDetail?.properties + '').requestUri }}
|
|
|
+ </el-descriptions-item>
|
|
|
+ <el-descriptions-item label="请求方法" label-align="right" label-class-name="job-index-descriptions-label-style">
|
|
|
+ {{ getHttpMethodDesc(getHttpJobMessage((scope.row as JobOutput).jobDetail?.properties + '').httpMethod + '') }}
|
|
|
+ </el-descriptions-item>
|
|
|
+ <el-descriptions-item label="请求报文体" label-align="right" label-class-name="job-index-descriptions-label-style">
|
|
|
+ {{ getHttpJobMessage((scope.row as JobOutput).jobDetail?.properties + '').body }}
|
|
|
+ </el-descriptions-item>
|
|
|
+ </el-descriptions>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
<el-table-column prop="jobDetail.updatedTime" label="更新时间" width="160" align="center" show-overflow-tooltip />
|
|
|
<el-table-column label="操作" width="170" fixed="right" align="center" show-overflow-tooltip>
|
|
|
<template #default="scope">
|
|
|
@@ -199,7 +222,7 @@ import JobCluster from '/@/views/system/job/component/jobCluster.vue';
|
|
|
|
|
|
import { getAPI } from '/@/utils/axios-utils';
|
|
|
import { SysJobApi } from '/@/api-services/api';
|
|
|
-import { JobOutput } from '/@/api-services/models';
|
|
|
+import { JobCreateTypeEnum, JobOutput, SysJobTrigger } from '/@/api-services/models';
|
|
|
|
|
|
const router = useRouter();
|
|
|
const editJobDetailRef = ref<InstanceType<typeof EditJobDetail>>();
|
|
|
@@ -253,24 +276,24 @@ const resetQuery = () => {
|
|
|
// 打开新增作业页面
|
|
|
const openAddJobDetail = () => {
|
|
|
state.editJobDetailTitle = '添加作业';
|
|
|
- editJobDetailRef.value?.openDialog({ concurrent: true, includeAnnotations: true, groupName: 'default', createFromScript: true });
|
|
|
+ editJobDetailRef.value?.openDialog({ concurrent: true, includeAnnotations: true, groupName: 'default', createType: JobCreateTypeEnum.NUMBER_2 });
|
|
|
};
|
|
|
|
|
|
// 打开编辑作业页面
|
|
|
-const openEditJobDetail = (row: any) => {
|
|
|
+const openEditJobDetail = (row: JobOutput) => {
|
|
|
state.editJobDetailTitle = '编辑作业';
|
|
|
editJobDetailRef.value?.openDialog(row.jobDetail);
|
|
|
};
|
|
|
|
|
|
// 删除作业
|
|
|
-const delJobDetail = (row: any) => {
|
|
|
- ElMessageBox.confirm(`确定删除作业:【${row.jobDetail.jobId}】?`, '提示', {
|
|
|
+const delJobDetail = (row: JobOutput) => {
|
|
|
+ ElMessageBox.confirm(`确定删除作业:【${row.jobDetail?.jobId}】?`, '提示', {
|
|
|
confirmButtonText: '确定',
|
|
|
cancelButtonText: '取消',
|
|
|
type: 'warning',
|
|
|
})
|
|
|
.then(async () => {
|
|
|
- await getAPI(SysJobApi).apiSysJobDeleteJobDetailPost({ jobId: row.jobDetail.jobId });
|
|
|
+ await getAPI(SysJobApi).apiSysJobDeleteJobDetailPost({ jobId: row.jobDetail?.jobId });
|
|
|
handleQuery();
|
|
|
ElMessage.success('删除成功');
|
|
|
})
|
|
|
@@ -278,19 +301,19 @@ const delJobDetail = (row: any) => {
|
|
|
};
|
|
|
|
|
|
// 打开新增触发器页面
|
|
|
-const openAddJobTrigger = (row: any) => {
|
|
|
+const openAddJobTrigger = (row: JobOutput) => {
|
|
|
state.editJobTriggerTitle = '添加触发器';
|
|
|
- editJobTriggerRef.value?.openDialog({ jobId: row.jobDetail.jobId, retryTimeout: 1000, startNow: true, runOnStart: true, resetOnlyOnce: true, triggerType: 'Furion.Schedule.PeriodTrigger' });
|
|
|
+ editJobTriggerRef.value?.openDialog({ jobId: row.jobDetail?.jobId, retryTimeout: 1000, startNow: true, runOnStart: true, resetOnlyOnce: true, triggerType: 'Furion.Schedule.PeriodTrigger' });
|
|
|
};
|
|
|
|
|
|
// 打开编辑触发器页面
|
|
|
-const openEditJobTrigger = (row: any) => {
|
|
|
+const openEditJobTrigger = (row: SysJobTrigger) => {
|
|
|
state.editJobTriggerTitle = '编辑触发器';
|
|
|
editJobTriggerRef.value?.openDialog(row);
|
|
|
};
|
|
|
|
|
|
// 删除触发器
|
|
|
-const delJobTrigger = (row: any) => {
|
|
|
+const delJobTrigger = (row: SysJobTrigger) => {
|
|
|
ElMessageBox.confirm(`确定删除触发器:【${row.triggerId}】?`, '提示', {
|
|
|
confirmButtonText: '确定',
|
|
|
cancelButtonText: '取消',
|
|
|
@@ -329,25 +352,25 @@ const pauseAllJob = async () => {
|
|
|
};
|
|
|
|
|
|
// 启动某个作业
|
|
|
-const startJob = async (row: any) => {
|
|
|
- await getAPI(SysJobApi).apiSysJobStartJobPost({ jobId: row.jobDetail.jobId });
|
|
|
+const startJob = async (row: JobOutput) => {
|
|
|
+ await getAPI(SysJobApi).apiSysJobStartJobPost({ jobId: row.jobDetail?.jobId });
|
|
|
ElMessage.success('启动作业');
|
|
|
};
|
|
|
|
|
|
// 暂停某个作业
|
|
|
-const pauseJob = async (row: any) => {
|
|
|
- await getAPI(SysJobApi).apiSysJobPauseJobPost({ jobId: row.jobDetail.jobId });
|
|
|
+const pauseJob = async (row: JobOutput) => {
|
|
|
+ await getAPI(SysJobApi).apiSysJobPauseJobPost({ jobId: row.jobDetail?.jobId });
|
|
|
ElMessage.success('暂停作业');
|
|
|
};
|
|
|
|
|
|
// 启动触发器
|
|
|
-const startTrigger = async (row: any) => {
|
|
|
+const startTrigger = async (row: SysJobTrigger) => {
|
|
|
await getAPI(SysJobApi).apiSysJobStartTriggerPost({ jobId: row.jobId, triggerId: row.triggerId });
|
|
|
ElMessage.success('启动触发器');
|
|
|
};
|
|
|
|
|
|
// 暂停触发器
|
|
|
-const pauseTrigger = async (row: any) => {
|
|
|
+const pauseTrigger = async (row: SysJobTrigger) => {
|
|
|
await getAPI(SysJobApi).apiSysJobPauseTriggerPost({ jobId: row.jobId, triggerId: row.triggerId });
|
|
|
ElMessage.success('暂停触发器');
|
|
|
};
|
|
|
@@ -375,4 +398,31 @@ const openJobDashboard = () => {
|
|
|
path: '/platform/job/dashboard',
|
|
|
});
|
|
|
};
|
|
|
+
|
|
|
+// 根据任务属性获取 HttpJobMessage
|
|
|
+const getHttpJobMessage = (properties: string): HttpJobMessage => {
|
|
|
+ const propData = JSON.parse(properties);
|
|
|
+ const httpJobMessageNet = JSON.parse(propData['HttpJob']); // 后端大写开头的 HttpJobMessage
|
|
|
+
|
|
|
+ return {
|
|
|
+ requestUri: httpJobMessageNet.RequestUri,
|
|
|
+ httpMethod: JSON.stringify(httpJobMessageNet.HttpMethod),
|
|
|
+ body: httpJobMessageNet.Body,
|
|
|
+ };
|
|
|
+};
|
|
|
+
|
|
|
+// 获取请求方法的对应描述
|
|
|
+const getHttpMethodDesc = (httpMethodStr: string): string => {
|
|
|
+ for (const key in editJobDetailRef.value?.httpMethodDef) {
|
|
|
+ if (editJobDetailRef.value?.httpMethodDef[key] === httpMethodStr) return key;
|
|
|
+ }
|
|
|
+ return '';
|
|
|
+};
|
|
|
</script>
|
|
|
+
|
|
|
+<style>
|
|
|
+/* 此样式不能为 scoped */
|
|
|
+.job-index-descriptions-label-style {
|
|
|
+ width: 80px;
|
|
|
+}
|
|
|
+</style>
|