From 4821db6b6faf0f83936d0aab204d8b7163ceafde Mon Sep 17 00:00:00 2001 From: Dengchao Date: Wed, 14 Oct 2026 01:07:33 +0800 Subject: [PATCH 1/2] feat(job): clarify trigger taxonomy filters --- CHANGELOG.md | 1 + src/api/job.ts | 6 ++ .../queries/useJobDefinitionsPaged.ts | 13 ++- src/locales/en-US.ts | 22 +++-- src/locales/zh-CN.ts | 22 +++-- src/types/api.generated.ts | 26 +++++- src/views/job/JobDefinitionList.vue | 85 +++++++++++-------- .../components/JobDefinitionTaxonomyCell.vue | 19 +++++ .../JobDefinitionTaxonomyFilters.vue | 61 +++++++++++++ .../JobDefinitionTriggerModeField.vue | 19 +++++ src/views/job/jobDefinitionDisplay.ts | 16 ++++ src/views/job/jobEditFormTypes.ts | 1 + .../job/useJobDefinitionTaxonomyQuery.ts | 18 ++++ 13 files changed, 254 insertions(+), 55 deletions(-) create mode 100644 src/views/job/components/JobDefinitionTaxonomyCell.vue create mode 100644 src/views/job/components/JobDefinitionTaxonomyFilters.vue create mode 100644 src/views/job/components/JobDefinitionTriggerModeField.vue create mode 100644 src/views/job/jobDefinitionDisplay.ts create mode 100644 src/views/job/useJobDefinitionTaxonomyQuery.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 000a7e18..50e30300 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [Unreleased] +- 作业定义列表新增触发模式和上游依赖展示/服务端分页筛选,新建表单可配置触发模式;修正调度类型提示把事件入口混为一谈的问题,并同步中英文案与后端 OpenAPI 生成类型。 - 修复统一文档站搜索索引随后端历史设计稿增长而超出全量 CI 预算:带日期的设计稿保留页面和标题搜索,当前设计、API 与运维文档仍全文索引,不放宽既有体积上限。 - 明确个人展示时区与平台业务时区的使用边界,在桌面和移动端提供说明、筛选器显示时区提示,并统一维护页更新时间的展示时区。 - 维护模式支持计划开始时间:开始前展示公告与倒计时,到点后以服务端 `active` 状态统一触发路由降级、写请求拦截和重点写操作禁用;同步后端 OpenAPI 生成类型并补回归测试。 diff --git a/src/api/job.ts b/src/api/job.ts index 73dca096..981d609d 100644 --- a/src/api/job.ts +++ b/src/api/job.ts @@ -51,6 +51,8 @@ export interface JobDefinitionListParams { pageSize: number jobCode?: string scheduleType?: 'CRON' | 'FIXED_RATE' | 'MANUAL' + triggerMode?: 'SCHEDULED' | 'API' | 'MANUAL' | 'EVENT' | 'MIXED' + hasUpstreamDependency?: boolean monitoringCategory?: 'SCHEDULED' | 'DEPENDENCY' | 'RUNTIME_ONLY' exactJobCode?: string dependsOnJobCode?: string @@ -93,6 +95,10 @@ export const jobApi = { ...(params.dependsOnJobCode ? { dependsOnJobCode: params.dependsOnJobCode } : {}), ...(params.includeDisabled ? { includeDisabled: true } : {}), ...(params.scheduleType ? { scheduleType: params.scheduleType } : {}), + ...(params.triggerMode ? { triggerMode: params.triggerMode } : {}), + ...(params.hasUpstreamDependency != null + ? { hasUpstreamDependency: params.hasUpstreamDependency } + : {}), ...(params.monitoringCategory ? { monitoringCategory: params.monitoringCategory } : {}), ...(params.enabled != null ? { enabled: params.enabled } : {}), }) diff --git a/src/composables/queries/useJobDefinitionsPaged.ts b/src/composables/queries/useJobDefinitionsPaged.ts index 2511e302..b7348696 100644 --- a/src/composables/queries/useJobDefinitionsPaged.ts +++ b/src/composables/queries/useJobDefinitionsPaged.ts @@ -4,7 +4,7 @@ import { jobApi, type JobDefinitionListParams } from '@/api/job' import { useTenantStore } from '@/stores/tenant' /** - * 服务端分页版 Job 定义查询。page / pageSize / jobCode / enabled 变化时自动重取, + * 服务端分页版 Job 定义查询。分页、作业编码、启用、调度、触发模式和依赖条件变化时自动重取, * 切租户也会自动失效(tenantId 进 queryKey)。保留上一页数据减少翻页时的闪烁。 * * @example @@ -21,6 +21,9 @@ export function useJobDefinitionsPaged(args: { pageSize: Ref jobCode?: Ref enabled?: Ref + scheduleType?: Ref + triggerMode?: Ref + hasUpstreamDependency?: Ref tenantIdOverride?: Ref }) { const tenant = useTenantStore() @@ -34,6 +37,9 @@ export function useJobDefinitionsPaged(args: { args.pageSize.value, args.jobCode?.value ?? null, args.enabled?.value ?? null, + args.scheduleType?.value ?? null, + args.triggerMode?.value ?? null, + args.hasUpstreamDependency?.value ?? null, ]), queryFn: () => { const params: JobDefinitionListParams = { @@ -44,6 +50,11 @@ export function useJobDefinitionsPaged(args: { const code = args.jobCode?.value?.trim() if (code) params.jobCode = code if (args.enabled?.value != null) params.enabled = args.enabled.value + if (args.scheduleType?.value) params.scheduleType = args.scheduleType.value + if (args.triggerMode?.value) params.triggerMode = args.triggerMode.value + if (args.hasUpstreamDependency?.value != null) { + params.hasUpstreamDependency = args.hasUpstreamDependency.value + } return jobApi.listDefinitionsPaged(params) }, placeholderData: keepPreviousData, diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index f476fc90..41637cae 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -1964,11 +1964,7 @@ const messages: Messages = { FILE_ARRIVAL: 'File arrival', DEPENDENCY: 'Dependency', }, - triggerMode: { - AUTO: 'Auto', - MANUAL: 'Manual', - MIXED: 'Mixed', - }, + triggerMode: { SCHEDULED: 'Scheduled', API: 'API', MANUAL: 'Manual', EVENT: 'Event', MIXED: 'Mixed' }, scheduleType: { CRON: 'Cron', FIXED_RATE: 'Fixed Rate', @@ -3915,8 +3911,15 @@ const messages: Messages = { queueTip: 'Scheduling queue — controls concurrency and priority', queuePlaceholder: 'Select queueCode', scheduleTypeLabel: 'Schedule type', - scheduleTypeTip: 'CRON / EVENT / MANUAL', + scheduleTypeTip: 'Time plan: CRON / fixed rate / MANUAL (no automatic schedule); use trigger mode for event or API.', scheduleTypePlaceholder: 'Select schedule type', + triggerModeLabel: 'Trigger mode', + triggerModeTip: 'Declared definition entry; see instance trigger type for the actual run source.', + triggerModePlaceholder: 'Select trigger mode', + dependencyLabel: 'Upstream dependency', + dependencyTip: 'One same-tenant, same-business-date upstream readiness dependency.', + hasDependency: 'Has upstream dependency', + noDependency: 'No upstream dependency', colJobCode: 'Job Code', colJobName: 'Name', colJobType: 'Type', @@ -3924,6 +3927,8 @@ const messages: Messages = { colWorkerGroup: 'Worker Group', colQueue: 'Queue', colScheduleType: 'Schedule type', + colTriggerMode: 'Trigger mode', + colDependency: 'Upstream dependency', colExecutionMode: 'Execution mode', colEnabled: 'Enabled', colScheduleExpr: 'Schedule expr', @@ -4121,7 +4126,8 @@ const messages: Messages = { fieldTimezone: 'Timezone', placeholderTimezone: 'e.g. Asia/Shanghai', fieldDependsOnJobCode: 'Upstream Job', - placeholderDependsOnJobCode: 'Upstream jobCode to wait for; empty = no dependency', + placeholderDependsOnJobCode: + 'Wait for same-business-date upstream success; empty = no dependency', fieldCalendarCode: 'Business Calendar', placeholderCalendar: 'calendarCode reference; empty = no working-day restriction', fieldWindowCode: 'Batch Window', @@ -4134,7 +4140,7 @@ const messages: Messages = { fieldRetryMaxCount: 'Max Retry Count', fieldTimeoutSeconds: 'Timeout (seconds)', fieldTriggerMode: 'Trigger Mode', - placeholderTriggerMode: 'SCHEDULED / MANUAL / EVENT / CATCH_UP / API', + placeholderTriggerMode: 'SCHEDULED / API / MANUAL / EVENT / MIXED', fieldDagEnabled: 'DAG Enabled', fieldExecutionHandler: 'Execution Handler', placeholderExecutionHandler: 'Handler bean / key', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 1a8e3ecb..2f751c68 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -1888,11 +1888,7 @@ export default { FILE_ARRIVAL: '文件到达', DEPENDENCY: '依赖', }, - triggerMode: { - AUTO: '自动', - MANUAL: '手动', - MIXED: '混合', - }, + triggerMode: { SCHEDULED: '定时', API: 'API', MANUAL: '手动', EVENT: '事件', MIXED: '混合' }, scheduleType: { CRON: 'Cron', FIXED_RATE: '固定间隔', @@ -3814,8 +3810,16 @@ export default { queueTip: '调度队列,控制并发和执行优先级', queuePlaceholder: '请选择', scheduleTypeLabel: '调度类型', - scheduleTypeTip: 'CRON 定时触发 / EVENT 事件触发 / MANUAL 手动触发', + scheduleTypeTip: + '时间调度方式:CRON / 固定频率 / 手动(无自动时间计划);事件或 API 等入口看触发模式。', scheduleTypePlaceholder: '请选择调度类型', + triggerModeLabel: '触发模式', + triggerModeTip: '作业定义声明的触发入口;单次运行的实际来源请看运行实例触发类型。', + triggerModePlaceholder: '请选择触发模式', + dependencyLabel: '上游依赖', + dependencyTip: '当前定义支持单个同租户、同业务日的上游作业成功就绪依赖。', + hasDependency: '有上游依赖', + noDependency: '无上游依赖', colJobCode: '作业编码', colJobName: '名称', colJobType: '类型', @@ -3823,6 +3827,8 @@ export default { colWorkerGroup: 'Worker 组', colQueue: '队列', colScheduleType: '调度类型', + colTriggerMode: '触发模式', + colDependency: '上游依赖', colExecutionMode: '执行模式', colEnabled: '启用', colScheduleExpr: '调度表达式', @@ -4060,7 +4066,7 @@ export default { fieldTimezone: '时区', placeholderTimezone: '如 Asia/Shanghai', fieldDependsOnJobCode: '上游作业', - placeholderDependsOnJobCode: '依赖的上游 jobCode,空表示不等待', + placeholderDependsOnJobCode: '等待同业务日上游作业成功就绪;空表示无依赖', fieldCalendarCode: '业务日历', placeholderCalendar: '关联 calendarCode,空表示不约束工作日', fieldWindowCode: '批次窗口', @@ -4073,7 +4079,7 @@ export default { fieldRetryMaxCount: '最大重试次数', fieldTimeoutSeconds: '超时(秒)', fieldTriggerMode: '触发模式', - placeholderTriggerMode: 'SCHEDULED / MANUAL / EVENT / CATCH_UP / API', + placeholderTriggerMode: 'SCHEDULED / API / MANUAL / EVENT / MIXED', fieldDagEnabled: '启用 DAG', fieldExecutionHandler: '执行处理器', placeholderExecutionHandler: '处理器 bean / key', diff --git a/src/types/api.generated.ts b/src/types/api.generated.ts index b6ec52b1..33ae77ae 100644 --- a/src/types/api.generated.ts +++ b/src/types/api.generated.ts @@ -8985,10 +8985,14 @@ export interface components { jobName?: string bizType?: string scheduleExpr?: string - /** @description 上游作业编码;填写后 scheduled fire 前等待同 bizDate 上游就绪。 */ + /** @description 单个同租户上游作业编码;scheduled fire 等待同一 bizDate 上游成功就绪,不支持可配置的依赖结果条件。 */ dependsOnJobCode?: string timezone?: string - triggerMode?: string + /** + * @description 作业定义声明的触发入口分类;不代表某次实例的实际触发来源,后者见 triggerType。 + * @enum {string} + */ + triggerMode?: 'SCHEDULED' | 'API' | 'MANUAL' | 'EVENT' | 'MIXED' /** @description 平台管理的物理 Worker 分组;租户管理员创建时须省略。 */ workerGroup?: string /** @description 平台管理的物理队列;租户管理员创建时须省略。 */ @@ -9069,10 +9073,14 @@ export interface components { bizType?: string scheduleType?: string scheduleExpr?: string - /** @description 上游作业编码;填写后 scheduled fire 前等待同 bizDate 上游就绪。 */ + /** @description 单个同租户上游作业编码;scheduled fire 等待同一 bizDate 上游成功就绪,不支持可配置的依赖结果条件。 */ dependsOnJobCode?: string timezone?: string - triggerMode?: string + /** + * @description 作业定义声明的触发入口分类;不代表某次实例的实际触发来源,后者见 triggerType。 + * @enum {string} + */ + triggerMode?: 'SCHEDULED' | 'API' | 'MANUAL' | 'EVENT' | 'MIXED' /** @description 平台管理的物理 Worker 分组;租户管理员不可更改现有值。 */ workerGroup?: string /** @description 平台管理的物理队列;租户管理员不可更改现有值。 */ @@ -9144,6 +9152,7 @@ export interface components { id: number tenantId: string jobCode: string + /** @description 单个同租户上游作业编码;scheduled fire 等待同一 bizDate 上游成功就绪,不支持可配置的依赖结果条件。 */ dependsOnJobCode: string jobName: string jobType: string @@ -9155,6 +9164,11 @@ export interface components { timezone?: string calendarCode: string windowCode: string + /** + * @description 作业定义声明的触发入口分类;不代表某次实例的实际触发来源,后者见 triggerType。 + * @enum {string} + */ + triggerMode: 'SCHEDULED' | 'API' | 'MANUAL' | 'EVENT' | 'MIXED' retryPolicy: string /** Format: int32 */ retryMaxCount: number @@ -16797,6 +16811,10 @@ export interface operations { includeDisabled?: boolean /** @description Filter by schedule type: CRON, FIXED_RATE, or MANUAL. */ scheduleType?: 'CRON' | 'FIXED_RATE' | 'MANUAL' + /** @description Filter by the job definition's declared trigger entry mode. */ + triggerMode?: 'SCHEDULED' | 'API' | 'MANUAL' | 'EVENT' | 'MIXED' + /** @description Filter by whether a same-tenant upstream job dependency is configured. */ + hasUpstreamDependency?: boolean /** @description Filter by monitoring matrix category. DEPENDENCY selects jobs with an upstream dependency; SCHEDULED selects standalone CRON jobs; RUNTIME_ONLY selects standalone non-CRON jobs. */ monitoringCategory?: 'SCHEDULED' | 'DEPENDENCY' | 'RUNTIME_ONLY' /** @description Filter by enabled status. Defaults to true (only enabled records returned unless overridden). */ diff --git a/src/views/job/JobDefinitionList.vue b/src/views/job/JobDefinitionList.vue index aec9d83e..86e9acd1 100644 --- a/src/views/job/JobDefinitionList.vue +++ b/src/views/job/JobDefinitionList.vue @@ -140,6 +140,11 @@ :options="scheduleTypeOptions" /> + @@ -163,7 +168,6 @@ + +