跳到主要内容

Cron API 参考

@vef-framework-react/cron 从包根部导出的全部内容,按源码分组: 权限API hooks页面辅助与表单模型组件类型。两个页面组件及其 props 见概览

QueryFunction<TData, TParams> / MutationFunction<TData, TParams> 是框架在 @vef-framework-react/core 中带 key 的函数形态;PaginatedQueryParams<TSearch>@vef-framework-react/components 的 ProTable 查询形态;ApiResult<T> 是标准响应信封。

权限

CRON_PERMISSIONS

const——持久化 cron 存储管理 API 的权限码,逐字镜像后端的 RequiredPermission 字符串。所有调度变更(create / update / delete / pause / resume / trigger_now)共享单一的 manage 权限码——没有按操作细分的码。见权限

Group.key权限码门控内容
schedule.querycron.schedule.query调度列表、详情、任务名列表、触发预览
schedule.managecron.schedule.manage创建、更新(含重命名)、删除、暂停、恢复、立即执行
run.querycron.run.query运行记录列表与单条运行查询

类型导出: CronPermissionstypeof CRON_PERMISSIONS)、SchedulePermissionCodesCronPermissions["schedule"])、RunPermissionCodesCronPermissions["run"])。

API hooks

查询基础设施

导出签名说明
API_PATHconst "/api"每个管理调用 POST 的框架 RPC 端点。
splitQueryParams<TSearch extends AnyObject>(queryParams: PaginatedQueryParams<TSearch>) => { params: Omit<PaginatedQueryParams<TSearch>, typeof SYMBOL_PAGINATION>; pagination: PaginationParams | undefined }把 ProTable 的 symbol 键查询参数拆分为普通搜索参数与分页元数据。排序 symbol 留在 params 上;JSON 序列化会丢弃它。

useScheduleApi

() => ScheduleApi——持久化调度存储(sys/cron/schedule)的查询与变更函数。以 name 寻址(没有按 id 的删除,也没有批量删除),每个变更在后端共享单一的 cron.schedule.manage 权限。

函数类型操作
findPageQueryFunction<PaginationResult<Schedule>, PaginatedQueryParams<ScheduleSearch>>find_page——把框架下拉的 isEnabled 开关字符串("true" / "false")转换为 wire eq 过滤器期望的真布尔值(未设置时丢弃)
getQueryFunction<ScheduleDetail, ScheduleNameParams>get——调度本身加下次触发时间预览
listJobsQueryFunction<string[]>list_jobs——应答节点上已注册的任务名(唯一合法的 jobName 取值)
previewFiresQueryFunction<PreviewFiresResult, PreviewFiresParams>preview_fires——校验与保存完全一致,无效表达式以业务错误返回
createMutationFunction<ApiResult<unknown>, ScheduleParams>create
updateMutationFunction<ApiResult<unknown>, ScheduleParams>update——可选的 newName 执行重命名
removeMutationFunction<ApiResult<unknown>, ScheduleNameParams>delete——发送 { name }
pauseMutationFunction<ApiResult<unknown>, ScheduleNameParams>pause
resumeMutationFunction<ApiResult<unknown>, ScheduleNameParams>resume
triggerNowMutationFunction<ApiResult<unknown>, ScheduleNameParams>trigger_now——经正常认领流程触发一次执行

useRunApi

() => RunApi——运行记录(sys/cron/run)的只读查询函数。详情视图通过 find_one 重新拉取完整行,因此总能展示完整、未截断的错误文本。

函数类型操作
findPageQueryFunction<PaginationResult<Run>, PaginatedQueryParams<RunSearch>>find_page
findOneQueryFunction<Run, RunIdParams>find_one

页面辅助与表单模型

对外导出,宿主可以按完全相同的语义重建或扩展调度表单。

ScheduleFormValues

调度表单的值。触发器以编辑器的值+单位形态持有,超时以值+单位对持有,params 以原始 JSON 文本持有——提交时全部折叠为 API 模型。originalName 是编辑时捕获的寻址名称,改动过的 name 因此会变成一次重命名(newName)。

字段类型说明
idstring?行 id(编辑时存在)。
originalNamestring?编辑时捕获的寻址名称。
namestring唯一的调度名称;编辑它即重命名。
jobNamestring已注册的任务处理器。
triggerTriggerFormValues编辑器形态的触发器。
startsAt / endsAtstring生效窗口(留空 = 该侧无界)。
misfirePolicyMisfirePolicyfire_now / skip
concurrencyPolicyConcurrencyPolicyforbid / allow
recoverboolean节点崩溃后重新触发(仅限幂等处理器)。
timeoutValue / timeoutUnitnumber / string以值+单位表示的按次运行超时(0 = 全局默认)。
paramsTextstring参数 JSON 文本。
enabledboolean启用状态。

表单模型函数

导出签名说明
SCHEDULE_FORM_DEFAULTSconst ScheduleFormValues新建调度的默认值(cron 触发器、fire_nowforbid、不恢复、零超时、启用)。
scheduleToFormValues(row: Schedule) => ScheduleFormValues把已保存的调度投影为可编辑的表单值(把 timeoutMs / everyMs 拆分为最易读的值+单位)。
scheduleToParams(values: ScheduleFormValues) => ScheduleParams把表单值转换为 API 参数: 以 originalName 寻址、经 newName 重命名,并折叠触发器、超时与参数。
parseJsonParams(text: string) => JsonParamsResult把参数文本框解析为 JSON 对象。空文本合法且完全省略参数;任何不是 JSON 对象的内容都被拒绝。
jsonParamsError(text: string) => string | undefinedparseJsonParams 的字段校验器形态: 无效时给出错误消息,有效时为 undefined
JsonParamsResult{ ok: true; value?: JsonObject } | { ok: false; error: string }解析参数文本框的结果。
TIMEOUT_UNIT_OPTIONSArray<{ label: string; value: string }>TIMEOUT_UNITS 派生的下拉选项。
useScheduleFormMutations() => { create: MutationFunction<ApiResult<unknown>, ScheduleFormValues>; update: MutationFunction<ApiResult<unknown>, ScheduleFormValues> }提交前把调度表单折叠为 API 参数(经 scheduleToParams)的表单变更——可直接插入 CrudPage.formMutationFns
useJobNames() => { options: Array<{ label: string; value: string }>; loading: boolean }已注册任务名的下拉选项(来自 list_jobs)。
ScheduleSceneValuesCrudBasicSceneFormValues<ScheduleFormValues, ScheduleFormValues>创建与更新共享调度表单形态。

组件

TriggerEditor

Props 以 TriggerEditorProps 导出。触发器编辑器: 一个类型切换(cron / interval / once),展开类型专属字段——cron 表达式 + 时区、间隔值 + 单位,或日期时间选择器——外加经 preview_fires、防抖(400 ms)的下次触发时间实时预览。预览对无效表达式内联渲染错误,生效窗口内没有触发时间时渲染空状态。

属性类型默认值说明
valueTriggerFormValues编辑器形态的触发器。
onChange(value: TriggerFormValues) => void每次编辑触发。
startsAtstring调度的生效窗口起点,回传进触发预览。
endsAtstring调度的生效窗口终点,回传进触发预览。

触发器辅助函数

导出签名说明
TriggerFieldsPick<Schedule, "kind" | "expr" | "timezone" | "everyMs" | "fireAt">调度行中描述其触发器的子集。
TriggerFormValues{ kind: TriggerKind; expr: string; timezone: string; intervalValue: number; intervalUnit: string; at: string }编辑器面向 UI 的值;间隔是值+单位对,提交时转换为 everyMs
DEFAULT_TRIGGERconst TriggerFormValues一个全新触发器: cron 类型、空表达式,并预填了一分钟一次的间隔,供用户切换类型时使用。
triggerToFormValues(schedule: TriggerFields) => TriggerFormValues把已保存的触发器投影为编辑器值。
triggerFormToParams(trigger: TriggerFormValues) => TriggerParams把编辑器值转换为 wire 参数,只保留所选类型需要的字段。
isTriggerComplete(trigger: TriggerFormValues) => boolean触发器是否已填到可以预览的程度: 有 cron 表达式、间隔不低于 1000 ms 下限,或选定了单次时间。
formatTriggerSummary(schedule: TriggerFields) => string调度行的一行式人性化触发摘要: cron 表达式(带时区)、间隔频率,或单次触发时间。

时长工具

DurationUnit——{ label: string; value: string; ms: number },一个可选的时间单位及其毫秒大小。

导出签名说明
INTERVAL_UNITSDurationUnit[]固定频率间隔触发器(everyMs)的单位: 秒 / 分钟 / 小时 / 天。
TIMEOUT_UNITSDurationUnit[]按次运行超时(timeoutMs)的单位: 毫秒 / 秒 / 分钟。
combineDurationMs(value: number, unit: string, units: DurationUnit[]) => number把以 unit 表示的值合成毫秒。未知单位回退为第一个(最小)单位;负值收敛为零。
splitDurationMs(ms: number, units: DurationUnit[]) => { value: number; unit: string }把毫秒拆分为能整除它的最粗单位,已保存的 everyMs/timeoutMs 因此能往返为最易读的值+单位。零映射为最小单位、值为零。

状态与格式化

导出签名说明
RunStatusBadge({ status: RunStatus }) => JSX.Element把一次运行的生命周期状态渲染为彩色标签。
EnabledTag({ enabled: boolean }) => JSX.Element启用 / 停用,成功/中性标签。
RUN_STATUS_COLORSRecord<RunStatus, string>每个运行状态的 antd Tag 颜色 token。
RUN_STATUS_LABELS / RUN_STATUS_OPTIONSRecord<RunStatus, string> / 选项数组文案与现成的下拉选项。
TRIGGER_KIND_LABELS / TRIGGER_KIND_OPTIONSRecord<TriggerKind, string> / 选项数组触发类型的文案与选项。
MISFIRE_POLICY_LABELS / MISFIRE_POLICY_OPTIONSRecord<MisfirePolicy, string> / 选项数组错过策略的文案与选项。
CONCURRENCY_POLICY_LABELS / CONCURRENCY_POLICY_OPTIONSRecord<ConcurrencyPolicy, string> / 选项数组并发策略的文案与选项。
formatTimestamp(value?: string | null) => string格式化无时区的本地墙钟时间戳(YYYY-MM-DD HH:mm:ss),为空时渲染破折号。
formatDuration(ms?: number | null) => string人性化运行时长: 不足一秒保持 ms,一分钟内变为 s,更长变为 min;缺失/为零渲染破折号。

RunDetailDrawer

运行详情抽屉,单独导出。它通过 find_one 重新拉取完整行,因此总能展示完整、未截断的错误文本。

属性类型默认值说明
runIdstring | null要展示的运行;null 保持抽屉关闭。
onClose() => void关闭处理函数。

类型

基础与 JSON

类型结构说明
CreationAudited{ id: string; createdAt?: string; createdBy?: string }镜像 orm.CreationAuditedModel
FullAuditedCreationAudited & { updatedAt?: string; updatedBy?: string }镜像 orm.FullAuditedModel
JsonValuestring | number | boolean | null | JsonValue[] | { [key: string]: JsonValue }
JsonObjectRecord<string, JsonValue>调度不透明 params 载荷所用的对象形态——在 Go 侧原样传递给任务处理器。

枚举

每个都逐字镜像一个 Go 枚举;显示文案与颜色在展示组件里。

导出说明
TRIGGER_KINDS / TriggerKind"cron" | "interval" | "once"调度如何计算触发时间。
MISFIRE_POLICIES / MisfirePolicy"fire_now" | "skip"如何处理节点宕机或调度暂停期间错过的触发: fire_now 立即把空档补跑一次,skip 直接丢弃。
CONCURRENCY_POLICIES / ConcurrencyPolicy"forbid" | "allow"上一次运行仍在进行时是否允许开始新一次: forbid 跳过重叠,allow 并行运行。
RUN_STATUSES / RunStatus"running" | "succeeded" | "failed" | "missed" | "skipped" | "abandoned" | "canceled"一条运行记录的生命周期状态。

调度

Schedule——sys/cron/schedule 中的一行持久化调度(继承 FullAudited)。时间戳是无时区的本地墙钟字符串(YYYY-MM-DD HH:mm:ss):

字段类型说明
namestring唯一的寻址名称。
jobNamestring已注册的任务处理器。
kindTriggerKind触发类型。
exprstringCron 表达式(非 cron 类型为空)。
timezonestringCron 时区(空 = 服务器时区)。
everyMsnumber间隔频率(非 interval 类型为 0)。
fireAtstring?once 的触发时间。
startsAt / endsAtstring?生效窗口。
paramsJsonObject?不透明的处理器载荷。
misfirePolicyMisfirePolicy错过触发的策略。
concurrencyPolicyConcurrencyPolicy重叠策略。
recoverboolean节点崩溃后重新触发。
timeoutMsnumber按次运行超时(0 = 全局默认)。
isEnabledbooleanfalse 时即暂停。
nextFireAtstring?触发游标。已暂停的调度会保留它,以便恢复时结算暂停造成的空档——列表因此在暂停期间隐藏它,因为它不会在那个时间触发。
lastFireAtstring?上次触发时间。
类型字段说明
TriggerParamskind: TriggerKindexpr?: stringtimezone?: stringeveryMs?: numberat?: string随保存提交的触发器定义。只填充所选类型需要的字段: cronexpr(+ 可选 timezone),intervaleveryMs(固定频率,最小 1000),onceat
ScheduleParamsname: stringnewName?: stringjobName: stringtrigger: TriggerParamsparams?: JsonObjectstartsAt?endsAt?string)、misfirePolicy?: MisfirePolicyconcurrencyPolicy?: ConcurrencyPolicyrecover?: booleantimeoutMs?: numberenabled?: boolean创建/更新载荷。以 name 寻址;更新时可选的 newName 重命名调度。
ScheduleSearchname?jobName?string)、kind?: TriggerKindisEnabled?: stringisEnabled"true" / "false" 的开关字符串——框架下拉的值是字符串——由 findPage 转换为 wire eq 过滤器期望的布尔值。
ScheduleNameParamsname: string按名称寻址的操作(get / delete / pause / resume / trigger_now)的载荷。
ScheduleDetailschedule: SchedulenextFires: string[]get 的结果;调度已暂停或已耗尽时 nextFires 为空。
PreviewFiresParamstrigger: TriggerParamsstartsAt?: stringendsAt?: string触发器的校验与保存完全一致,无效表达式以业务错误返回。
PreviewFiresResultnextFires: string[]生效窗口内的下一批触发时间。

运行记录

Run——sys/cron/run 中的一条运行记录(继承 CreationAudited)。只读:

字段类型说明
scheduleIdstring所属调度的 id。
scheduleNamestring所属调度的名称。
jobNamestring实际运行的处理器。
scheduledAtstring本次触发的计划时间。
statusRunStatus生命周期状态。
nodeIdstring认领本次运行的集群节点。
startedAt / finishedAtstring?实际执行边界。
durationMsnumber执行时长。
heartbeatAtstring?运行期间的最后一次心跳。
errorstring?失败文本(完整文本经 find_one 获取)。
missedCountnumber?missed 的运行: 被丢弃的触发次数。
类型字段说明
RunSearchscheduleName?jobName?string)、status?: RunStatusnodeId?: stringscheduledAtFrom?: stringscheduledAtTo?: stringscheduledAt* 字段为计划时间设界(gte / lte)。
RunIdParamsid: string单条运行查询(find_one)的寻址载荷。

页面 prop 类型(CronSchedulePagePropsCronRunPagePropsRunDetailDrawerProps)与各自组件一同导出——页面表格见概览