Files
smart_grid_iot/client/src/api/job.ts
T
andyesfly 22d27a940d feat: 重构勘察业务为明细模式并新增定时任务人性化配置
- 重构勘察业务:移除SOP相关表,新增勘察明细表支持建筑/楼层/房间/照片管理
- 新增定时任务人性化频率配置,支持分钟/小时/天/周/月/自定义六种模式
- 新增频率预览接口,支持配置转换为cron表达式与执行时间预览
- 更新系统品牌名称为鑫潼智电,修改全局标题与登录页文案
2026-10-17 10:08:42 +08:00

150 lines
3.5 KiB
TypeScript

import request from '@/utils/request';
export interface JobParamField {
key: string;
label: string;
type: 'number' | 'string';
min?: number;
max?: number;
placeholder?: string;
}
/** 频率类型:每N分钟 / 每N小时 / 每天 / 每周 / 每月 / 自定义 cron */
export type FreqType = 'minute' | 'hour' | 'day' | 'week' | 'month' | 'custom';
/** 频率配置(字段按 freqType 取用) */
export interface FreqConfig {
/** minute/hour:间隔数量 */
interval?: number;
/** hour:每小时的第几分钟 */
minute?: number;
/** day/week/month:执行时间点 HH:mm */
times?: string[];
/** week:星期,0=周日 ... 6=周六 */
weekdays?: number[];
/** month:日期 1-31 */
days?: number[];
/** custom:自定义 cron 表达式 */
expression?: string;
}
export interface JobItem {
id: number;
jobKey: string;
jobName: string;
cronExpression: string;
freqType: FreqType;
freqConfig: FreqConfig;
cronDescription?: string | null;
params: Record<string, any>;
retryTimes: number;
retryInterval: number;
status: number;
remark?: string;
lastRunAt?: string | null;
lastRunStatus?: number | null;
lastRunCostMs?: number | null;
lastError?: string | null;
createdAt?: string;
updatedAt?: string;
description?: string;
paramFields?: JobParamField[];
registered: boolean;
nextRunTime?: string | null;
}
export interface JobLogItem {
id: number;
jobId: number;
jobKey: string;
jobName: string;
triggerType: number;
status: number;
attempt: number;
startedAt?: string | null;
finishedAt?: string | null;
costMs?: number | null;
message?: string | null;
errorStack?: string | null;
createdAt?: string | null;
}
export interface JobRunResult {
status: number;
message: string;
costMs: number;
attempt: number;
}
export interface JobQuery {
page?: number;
pageSize?: number;
jobName?: string;
status?: number;
}
export interface JobLogQuery {
page?: number;
pageSize?: number;
status?: number;
triggerType?: number;
startDate?: string;
endDate?: string;
}
export interface UpdateJobPayload {
freqType: FreqType;
freqConfig: FreqConfig;
params: Record<string, any>;
retryTimes: number;
retryInterval: number;
remark?: string;
}
/** 频率预览结果:由后端由频率配置推导 cron、中文描述与未来执行时间 */
export interface CronPreviewResult {
valid: boolean;
error?: string | null;
cronExpression?: string | null;
description?: string | null;
nextRuns: string[];
}
export interface JobListResult {
list: JobItem[];
total: number;
page: number;
pageSize: number;
}
export interface JobLogListResult {
list: JobLogItem[];
total: number;
page: number;
pageSize: number;
}
export const jobApi = {
getJobList: (params: JobQuery) =>
request.get<JobListResult>('/jobs', { params }),
updateJob: (id: number, data: UpdateJobPayload) =>
request.put<JobItem>(`/jobs/${id}`, data),
/** 频率预览:人性化配置 → cron / 中文描述 / 未来 5 次执行时间 */
previewCron: (data: { freqType: FreqType; freqConfig: FreqConfig }) =>
request.post<CronPreviewResult>('/jobs/cron/preview', data),
changeJobStatus: (id: number, status: 0 | 1) =>
request.put<JobItem>(`/jobs/${id}/status`, { status }),
runJob: (id: number) =>
request.post<JobRunResult>(`/jobs/${id}/run`),
getJobLogs: (id: number, params: JobLogQuery) =>
request.get<JobLogListResult>(`/jobs/${id}/logs`, { params }),
clearJobLogs: (days = 90) =>
request.delete<{ deleted: number }>('/jobs/logs/clear', { params: { days } }),
};