wip: 任务批次-初稿
This commit is contained in:
parent
1c2feafe79
commit
71b28e2a9b
@ -268,6 +268,7 @@ const local: App.I18n.Schema = {
|
|||||||
workflow_batch: 'Workflow Batch',
|
workflow_batch: 'Workflow Batch',
|
||||||
job: 'Schedule Task Management',
|
job: 'Schedule Task Management',
|
||||||
job_task: 'Schedule Task List',
|
job_task: 'Schedule Task List',
|
||||||
|
job_batch: 'Schedule Task Batch List',
|
||||||
'manage_user-detail': 'User Detail',
|
'manage_user-detail': 'User Detail',
|
||||||
manage_role: 'Role Manage',
|
manage_role: 'Role Manage',
|
||||||
manage_menu: 'Menu Manage',
|
manage_menu: 'Menu Manage',
|
||||||
@ -367,6 +368,7 @@ const local: App.I18n.Schema = {
|
|||||||
retryTask: 'Retry Task',
|
retryTask: 'Retry Task',
|
||||||
retryTaskTip: 'Total task volume: retry/callback task volume',
|
retryTaskTip: 'Total task volume: retry/callback task volume',
|
||||||
jobTask: 'Job Task',
|
jobTask: 'Job Task',
|
||||||
|
jobBatch: 'Job Batch',
|
||||||
jobTaskTip: 'Success rate: total completion/total dispatch amount',
|
jobTaskTip: 'Success rate: total completion/total dispatch amount',
|
||||||
onlineServiceCount: 'Online Machine',
|
onlineServiceCount: 'Online Machine',
|
||||||
onlineServiceTip: 'Always online machines: the sum of clients and servers registered to the system',
|
onlineServiceTip: 'Always online machines: the sum of clients and servers registered to the system',
|
||||||
@ -882,6 +884,19 @@ const local: App.I18n.Schema = {
|
|||||||
cron: 'CRON表达式',
|
cron: 'CRON表达式',
|
||||||
workflow: '工作流'
|
workflow: '工作流'
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
jobBatch: {
|
||||||
|
title: 'Job Batch List',
|
||||||
|
groupName: 'Group name',
|
||||||
|
jobName: 'Job name',
|
||||||
|
executionAt: 'Start execution time',
|
||||||
|
taskBatchStatus: 'Task Batch Status',
|
||||||
|
operationReason: 'Reason for operation',
|
||||||
|
form: {
|
||||||
|
groupName: 'Please enter group name',
|
||||||
|
jobName: 'Please enter job name',
|
||||||
|
taskBatchStatus: 'Please enter state'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
form: {
|
form: {
|
||||||
|
@ -269,6 +269,7 @@ const local: App.I18n.Schema = {
|
|||||||
workflow_batch: '执行批次',
|
workflow_batch: '执行批次',
|
||||||
job: '定时任务',
|
job: '定时任务',
|
||||||
job_task: '任务管理',
|
job_task: '任务管理',
|
||||||
|
job_batch: '执行批次',
|
||||||
'manage_user-detail': '用户详情',
|
'manage_user-detail': '用户详情',
|
||||||
manage_role: '角色管理',
|
manage_role: '角色管理',
|
||||||
manage_menu: '菜单管理',
|
manage_menu: '菜单管理',
|
||||||
@ -364,6 +365,7 @@ const local: App.I18n.Schema = {
|
|||||||
retryTask: '重试任务',
|
retryTask: '重试任务',
|
||||||
retryTaskTip: '总任务量: 重试/回调任务量',
|
retryTaskTip: '总任务量: 重试/回调任务量',
|
||||||
jobTask: '定时任务',
|
jobTask: '定时任务',
|
||||||
|
jobBatch: '任务批次',
|
||||||
jobTaskTip: '成功率:总完成/总调度量',
|
jobTaskTip: '成功率:总完成/总调度量',
|
||||||
onlineServiceCount: '总在线机器',
|
onlineServiceCount: '总在线机器',
|
||||||
onlineServiceTip: '总在线机器:注册到系统的客户端和服务端之和',
|
onlineServiceTip: '总在线机器:注册到系统的客户端和服务端之和',
|
||||||
@ -878,6 +880,19 @@ const local: App.I18n.Schema = {
|
|||||||
cron: 'CRON表达式',
|
cron: 'CRON表达式',
|
||||||
workflow: '工作流'
|
workflow: '工作流'
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
jobBatch: {
|
||||||
|
title: '任务批次列表',
|
||||||
|
groupName: '组名称',
|
||||||
|
jobName: '任务名称',
|
||||||
|
executionAt: '开始执行时间',
|
||||||
|
taskBatchStatus: '状态',
|
||||||
|
operationReason: '操作原因',
|
||||||
|
form: {
|
||||||
|
groupName: '请输入组名称',
|
||||||
|
jobName: '请输入任务名称',
|
||||||
|
taskBatchStatus: '请输入状态'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
form: {
|
form: {
|
||||||
|
@ -31,6 +31,7 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
|
|||||||
group: () => import("@/views/group/index.vue"),
|
group: () => import("@/views/group/index.vue"),
|
||||||
home: () => import("@/views/home/index.vue"),
|
home: () => import("@/views/home/index.vue"),
|
||||||
job_task: () => import("@/views/job/task/index.vue"),
|
job_task: () => import("@/views/job/task/index.vue"),
|
||||||
|
job_batch: () => import("@/views/job/batch/index.vue"),
|
||||||
manage_menu: () => import("@/views/manage/menu/index.vue"),
|
manage_menu: () => import("@/views/manage/menu/index.vue"),
|
||||||
manage_role: () => import("@/views/manage/role/index.vue"),
|
manage_role: () => import("@/views/manage/role/index.vue"),
|
||||||
"manage_user-detail": () => import("@/views/manage/user-detail/[id].vue"),
|
"manage_user-detail": () => import("@/views/manage/user-detail/[id].vue"),
|
||||||
|
@ -211,6 +211,16 @@ export const generatedRoutes: GeneratedRoute[] = [
|
|||||||
i18nKey: 'route.job_task',
|
i18nKey: 'route.job_task',
|
||||||
icon: 'octicon:tasklist'
|
icon: 'octicon:tasklist'
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'job_batch',
|
||||||
|
path: '/job/batch',
|
||||||
|
component: 'view.job_batch',
|
||||||
|
meta: {
|
||||||
|
title: 'job_batch',
|
||||||
|
i18nKey: 'route.job_batch',
|
||||||
|
icon: 'carbon:batch-job'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -114,14 +114,14 @@ function transformElegantRouteToVueRoute(
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add redirect to child
|
// add redirect to child
|
||||||
if (children?.length && !vueRoute.redirect) {
|
if (children?.length && !vueRoute.redirect) {
|
||||||
vueRoute.redirect = {
|
vueRoute.redirect = {
|
||||||
name: children[0].name
|
name: children[0].name
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (children?.length) {
|
if (children?.length) {
|
||||||
const childRoutes = children.flatMap(child => transformElegantRouteToVueRoute(child, layouts, views));
|
const childRoutes = children.flatMap(child => transformElegantRouteToVueRoute(child, layouts, views));
|
||||||
|
|
||||||
@ -165,6 +165,7 @@ const routeMap: RouteMap = {
|
|||||||
"home": "/home",
|
"home": "/home",
|
||||||
"job": "/job",
|
"job": "/job",
|
||||||
"job_task": "/job/task",
|
"job_task": "/job/task",
|
||||||
|
"job_batch": "/job/batch",
|
||||||
"login": "/login/:module(pwd-login)?",
|
"login": "/login/:module(pwd-login)?",
|
||||||
"manage": "/manage",
|
"manage": "/manage",
|
||||||
"manage_menu": "/manage/menu",
|
"manage_menu": "/manage/menu",
|
||||||
|
@ -10,3 +10,4 @@ export * from './retry-task';
|
|||||||
export * from './retry';
|
export * from './retry';
|
||||||
export * from './workflow';
|
export * from './workflow';
|
||||||
export * from './job';
|
export * from './job';
|
||||||
|
export * from './job-batch';
|
||||||
|
10
src/service/api/job-batch.ts
Normal file
10
src/service/api/job-batch.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { request } from '../request';
|
||||||
|
|
||||||
|
/** get Job page */
|
||||||
|
export function fetchGetJobBatchList(params?: Api.JobBatch.JobBatchSearchParams) {
|
||||||
|
return request<Api.JobBatch.JobBatchList>({
|
||||||
|
url: '/job/batch/list',
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
|
});
|
||||||
|
}
|
47
src/typings/api.d.ts
vendored
47
src/typings/api.d.ts
vendored
@ -916,6 +916,53 @@ declare namespace Api {
|
|||||||
type TriggerType = 2 | 3 | 99;
|
type TriggerType = 2 | 3 | 99;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* namespace JobBatch
|
||||||
|
*
|
||||||
|
* backend api module: "jobBatch"
|
||||||
|
*/
|
||||||
|
namespace JobBatch {
|
||||||
|
type CommonSearchParams = Pick<Common.PaginatingCommonParams, 'page' | 'size'>;
|
||||||
|
|
||||||
|
/** JobBatch */
|
||||||
|
type JobBatch = Common.CommonRecord<{
|
||||||
|
/** 组名称 */
|
||||||
|
groupName: string;
|
||||||
|
/** 任务名称 */
|
||||||
|
jobName: string;
|
||||||
|
/** 工作流节点名称 */
|
||||||
|
nodeName: string;
|
||||||
|
/** 任务信息id */
|
||||||
|
jobId: string;
|
||||||
|
/** 状态 */
|
||||||
|
taskBatchStatus: Common.TaskBatchStatus;
|
||||||
|
/** 开始执行时间 */
|
||||||
|
executionAt: string;
|
||||||
|
/** 操作原因 */
|
||||||
|
operationReason: Common.OperationReason;
|
||||||
|
/** 执行器类型 */
|
||||||
|
executorType: Common.ExecutorType;
|
||||||
|
/** 执行器名称 */
|
||||||
|
executorInfo: string;
|
||||||
|
/** 工作流的回调节点信息 */
|
||||||
|
callback: object;
|
||||||
|
/** 名称 */
|
||||||
|
decision: object;
|
||||||
|
/** 工作流批次id */
|
||||||
|
workflowTaskBatchId: string;
|
||||||
|
/** 工作流节点id */
|
||||||
|
workflowNodeId: string;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
/** JobBatch search params */
|
||||||
|
type JobBatchSearchParams = CommonType.RecordNullable<
|
||||||
|
Pick<Api.JobBatch.JobBatch, 'groupName' | 'jobName' | 'taskBatchStatus'> & CommonSearchParams
|
||||||
|
>;
|
||||||
|
|
||||||
|
/** JobBatch list */
|
||||||
|
type JobBatchList = Common.PaginatingQueryRecord<JobBatch>;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* namespace WorkflowBatch
|
* namespace WorkflowBatch
|
||||||
*
|
*
|
||||||
|
14
src/typings/app.d.ts
vendored
14
src/typings/app.d.ts
vendored
@ -529,6 +529,7 @@ declare namespace App {
|
|||||||
retryTask: string;
|
retryTask: string;
|
||||||
retryTaskTip: string;
|
retryTaskTip: string;
|
||||||
jobTask: string;
|
jobTask: string;
|
||||||
|
jobBatch: string;
|
||||||
jobTaskTip: string;
|
jobTaskTip: string;
|
||||||
onlineServiceCount: string;
|
onlineServiceCount: string;
|
||||||
onlineServiceTip: string;
|
onlineServiceTip: string;
|
||||||
@ -1045,6 +1046,19 @@ declare namespace App {
|
|||||||
workflow: string;
|
workflow: string;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
jobBatch: {
|
||||||
|
title: string;
|
||||||
|
groupName: string;
|
||||||
|
jobName: string;
|
||||||
|
executionAt: string;
|
||||||
|
taskBatchStatus: string;
|
||||||
|
operationReason: string;
|
||||||
|
form: {
|
||||||
|
groupName: string;
|
||||||
|
jobName: string;
|
||||||
|
taskBatchStatus: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
form: {
|
form: {
|
||||||
required: string;
|
required: string;
|
||||||
|
126
src/views/job/batch/index.vue
Normal file
126
src/views/job/batch/index.vue
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
<script setup lang="tsx">
|
||||||
|
import { NButton, NTag } from 'naive-ui';
|
||||||
|
import { fetchGetJobBatchList } from '@/service/api';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
import { useAppStore } from '@/store/modules/app';
|
||||||
|
import { useTable } from '@/hooks/common/table';
|
||||||
|
import { operationReasonRecord } from '@/constants/business';
|
||||||
|
import JobBatchSearch from './modules/job-batch-search.vue';
|
||||||
|
|
||||||
|
const appStore = useAppStore();
|
||||||
|
|
||||||
|
const { columns, data, getData, loading, mobilePagination, searchParams, resetSearchParams } = useTable({
|
||||||
|
apiFn: fetchGetJobBatchList,
|
||||||
|
apiParams: {
|
||||||
|
page: 1,
|
||||||
|
size: 10,
|
||||||
|
groupName: null,
|
||||||
|
jobName: null,
|
||||||
|
taskBatchStatus: null
|
||||||
|
},
|
||||||
|
columns: () => [
|
||||||
|
{
|
||||||
|
key: 'id',
|
||||||
|
title: $t('common.index'),
|
||||||
|
align: 'center',
|
||||||
|
width: 64
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'groupName',
|
||||||
|
title: $t('page.jobBatch.groupName'),
|
||||||
|
align: 'left',
|
||||||
|
minWidth: 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'jobName',
|
||||||
|
title: $t('page.jobBatch.jobName'),
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'executionAt',
|
||||||
|
title: $t('page.jobBatch.executionAt'),
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'operationReason',
|
||||||
|
title: $t('page.jobBatch.operationReason'),
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 120,
|
||||||
|
render: row => {
|
||||||
|
if (row.operationReason === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const tagMap: Record<Api.Common.OperationReason, NaiveUI.ThemeColor> = {
|
||||||
|
0: 'default',
|
||||||
|
1: 'default',
|
||||||
|
2: 'error',
|
||||||
|
3: 'default',
|
||||||
|
4: 'default',
|
||||||
|
5: 'default',
|
||||||
|
6: 'default',
|
||||||
|
7: 'default',
|
||||||
|
8: 'default',
|
||||||
|
9: 'default',
|
||||||
|
10: 'default',
|
||||||
|
11: 'default',
|
||||||
|
12: 'default',
|
||||||
|
13: 'default',
|
||||||
|
14: 'default'
|
||||||
|
};
|
||||||
|
const label = $t(operationReasonRecord[row.operationReason!]);
|
||||||
|
|
||||||
|
return <NTag type={tagMap[row.operationReason!]}>{label}</NTag>;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'operate',
|
||||||
|
title: $t('common.operate'),
|
||||||
|
align: 'center',
|
||||||
|
width: 130,
|
||||||
|
render: row => (
|
||||||
|
<div class="flex-center gap-8px">
|
||||||
|
<NButton type="primary" ghost size="small" onClick={() => detail(row.id!)}>
|
||||||
|
{$t('common.detail')}
|
||||||
|
</NButton>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
function detail(id: string) {
|
||||||
|
console.log(id);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto">
|
||||||
|
<JobBatchSearch v-model:model="searchParams" @reset="resetSearchParams" @search="getData" />
|
||||||
|
<NCard
|
||||||
|
:title="$t('page.jobBatch.title')"
|
||||||
|
:bordered="false"
|
||||||
|
size="small"
|
||||||
|
class="sm:flex-1-hidden card-wrapper"
|
||||||
|
header-class="view-card-header"
|
||||||
|
>
|
||||||
|
<template #header-extra>
|
||||||
|
<TableHeaderOperation :loading="loading" :show-delete="false" :show-add="false" @refresh="getData" />
|
||||||
|
</template>
|
||||||
|
<NDataTable
|
||||||
|
:columns="columns"
|
||||||
|
:data="data"
|
||||||
|
:flex-height="!appStore.isMobile"
|
||||||
|
:scroll-x="962"
|
||||||
|
:loading="loading"
|
||||||
|
remote
|
||||||
|
:row-key="row => row.id"
|
||||||
|
:pagination="mobilePagination"
|
||||||
|
class="sm:h-full"
|
||||||
|
/>
|
||||||
|
</NCard>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped></style>
|
41
src/views/job/batch/modules/job-batch-search.vue
Normal file
41
src/views/job/batch/modules/job-batch-search.vue
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import TaskBatchStatus from '@/components/common/task-batch-status.vue';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: 'JobBatchSearch'
|
||||||
|
});
|
||||||
|
|
||||||
|
interface Emits {
|
||||||
|
(e: 'reset'): void;
|
||||||
|
(e: 'search'): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const emit = defineEmits<Emits>();
|
||||||
|
|
||||||
|
const model = defineModel<Api.JobBatch.JobBatchSearchParams>('model', { required: true });
|
||||||
|
|
||||||
|
function reset() {
|
||||||
|
emit('reset');
|
||||||
|
}
|
||||||
|
|
||||||
|
function search() {
|
||||||
|
emit('search');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<SearchForm :model="model" @search="search" @reset="reset">
|
||||||
|
<NFormItemGi span="24 s:12 m:6" :label="$t('page.jobBatch.groupName')" path="groupName" class="pr-24px">
|
||||||
|
<NInput v-model:value="model.groupName" :placeholder="$t('page.jobBatch.form.groupName')" />
|
||||||
|
</NFormItemGi>
|
||||||
|
<NFormItemGi span="24 s:12 m:6" :label="$t('page.jobBatch.jobName')" path="jobName" class="pr-24px">
|
||||||
|
<NInput v-model:value="model.jobName" :placeholder="$t('page.jobBatch.form.jobName')" />
|
||||||
|
</NFormItemGi>
|
||||||
|
<NFormItemGi span="24 s:12 m:6" :label="$t('page.jobBatch.taskBatchStatus')" path="taskBatchStatus" class="pr-24px">
|
||||||
|
<TaskBatchStatus v-model:value="model.taskBatchStatus" />
|
||||||
|
</NFormItemGi>
|
||||||
|
</SearchForm>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped></style>
|
Loading…
Reference in New Issue
Block a user