Idempotency-Key,重试不重复执行;② Webhook 出站白名单 / 防 SSRF(FR-26):告警地址须命中出站白名单且禁止内网保留段;③ 流程节点失败重试(FR-27):节点级重试次数/间隔/退避/超时 + 整流程失败策略(中止/跳过/告警后继续);④ 禁止绑定草稿流程(FR-28):仅已发布流程可被任务绑定,草稿保存不误伤线上。schedule_type(cron / once),一次性任务存为 fire_once_time(datetime)并在到期后自动结束,与 XXL-JOB 模型一致;② 时区(P1):任务新增 timezone 字段,每天 HH:MM 等语义以任务时区为基准,规避多厂区错时;③ 周字段映射(P1):明确存储口径与 Quartz 的双向映射规则(0=周日…6=周六 ↔ 1=SUN…7=SAT)。新增 FR-23(一次性任务,P0)、FR-24(任务时区,P1);验收标准加严。本文件定义 MES(制造执行系统)中「定时任务」模块的功能范围、业务流程、数据模型与交互规范,作为前端(Vben Admin)、后端调度/流程服务与测试验收的统一依据。原型见随附《MES定时任务模块_交互原型.html》。
MES 中大量运维与业务流程需周期性自动执行。当前任务散落在各微服务、由各团队手工维护 Cron,缺乏统一管控,存在不可视、不可控、无告警、难排查、高风险等问题。此外,两类新诉求凸显:
| 术语 | 定义 |
|---|---|
| 调度引擎 | 按 Cron 触发任务/流程执行的底层服务(类 Quartz / XXL-JOB 风格)。 |
| Cron 表达式 | 6 段(秒 分 时 日 月 周)时间表达式,描述周期型触发。本模块周字段采用 0=周日 … 6=周六(见 §6.2.3 映射规则)。 |
| 调度类型 schedule_type | 区分任务触发方式:cron=按周期(存 Cron 表达式);once=一次性(存 fire_once_time 指定日期时刻,触发后自动结束)。 |
| 时区 timezone | 任务周期/触发时刻的解释基准(IANA 时区,如 Asia/Shanghai)。「每天 08:00」等语义均以任务时区为准,规避多厂区错时。 |
| 简单模式 / 专家模式 | 简单模式以「频率预设 + 中文可读描述」配置周期;专家模式直接编辑原生 Cron 表达式。两者等价互转。 |
| FlowNode(流程节点) | 流程编排中的最小执行单元;一个任务可绑定一条由多个 FlowNode 组成的执行流。 |
| 流程编排(Flow) | 由开始/结束节点及若干业务节点组成的有向执行流,支持顺序与条件分支(轻量 DAG)。 |
| 开放 API | 对外暴露的 REST 接口,用于触发任务/流程、查询状态与日志。 |
| API Token | 调用开放 API 的凭证,带作用域(scope)与有效期,Bearer 方式鉴权。 |
| Misfire 策略 | 调度错过触发时点后的补偿策略:立即执行一次 / 下次触发 / 丢弃。 |
| 角色 | 职责 | 权限要点 |
|---|---|---|
| 系统管理员 | 全量配置与兜底 | 全部操作:增删改、启停、手动/API 触发、流程编排、Token 管理、审计。 |
| MES 运维 | 日常监控与干预 | 查看、执行一次、启停、查看日志;不可建/删系统级任务与 Token。 |
| 业务配置员 | 在授权范围内配置 | 仅可在被授予「任务类型」内新建/编辑/启停业务任务与流程节点。 |
| 集成开发者 | 对接外部系统 | 管理 API Token、查看端点文档;仅能在授权作用域内触发/查询。 |
| 审计员 | 合规检视 | 只读 + 日志查看 + 操作审计,无写权限。 |
| 编号 | 功能 | 优先级 | 说明 | 关键验收点 |
|---|---|---|---|---|
| FR-01 | 任务列表 | P0 | 分页展示全部任务,含状态、Cron、下次执行时间。 | 字段完整、可分页排序。 |
| FR-02 | 搜索与筛选 | P0 | 按任务名/类型/状态/任务组筛选。 | 组合筛选结果准确。 |
| FR-03 | 新建任务 | P0 | 支持执行方式:单任务 / 流程(绑定 Flow)。 | 提交后即时生效。 |
| FR-04 | 编辑任务 | P0 | 修改任意可编辑字段并热更新。 | 运行中任务修改后不丢状态。 |
| FR-05 | 启停任务 | P0 | 暂停/恢复单个任务调度。 | 暂停后不再触发。 |
| FR-06 | 手动执行一次 | P0 | 立即触发一次(不影响周期)。 | 执行类型标记「手动」。 |
| FR-07 | 删除任务 | P1 | 软删除并清理调度注册。 | 删除后日志保留。 |
| FR-21 | Cron 双模式易用 | P0 | 「简单模式」= 频率向导(按频率类别选择 + 时/分/星期/日期控件)+ 常用快捷一键套用,自动生成表达式并展示中文描述;「专家模式」原生 6 段 Cron;两种模式均实时预览「未来 5 次触发」。 | 向导生成的表达式与专家模式一致;中文描述与实际调度一致;下次触发按向导状态精确推算。 |
| FR-23 | 一次性任务(schedule_type=once) | P0 | 新增独立于 Cron 的「仅一次」调度类型:用户指定日期时刻(fire_once_time),系统到点触发一次后自动置为「已完成/已结束」,不再重复。到期前可编辑/取消。 | 仅一次任务不存 Cron 表达式;触发后状态正确流转;编辑回显日期时刻;到期后不可重复触发。 |
| FR-24 | 任务时区 | P1 | 任务可指定 timezone(默认 Asia/Shanghai / 厂区本地时区);周期与触发时刻按时区解释,多厂区各自一致。 | 同一 Cron 在不同时区展示/触发时刻正确;时区变更后下次触发重算。 |
| FR-08 | Cron 校验 | P0 | 实时语法校验,非法拦截提交。 | 非法表达式不可保存。 |
| FR-09 | 任务类型模板 | P1 | 预置 MES 任务类型,带出默认配置。 | 选类型带出默认值。 |
| FR-10 | 执行日志 | P0 | 记录每次执行时间、耗时、状态、触发类型。 | 日志可查、可筛选、可导出。 |
| FR-11 | 异常详情 | P1 | 查看失败任务的异常栈。 | 异常信息完整。 |
| FR-12 | 失败告警 | P1 | 失败按渠道(站内/邮件/Webhook)通知。 | 失败触发通知。 |
| FR-13 | 任务详情 | P1 | 概览:状态、Cron 可读描述、下次/上次执行、连续失败。 | 信息聚合准确。 |
| FR-14 | 并发控制 | P1 | 禁止/允许并发执行。 | 禁止时上一次未完则跳过。 |
| FR-15 | Misfire 策略 | P2 | 立即/下次/丢弃三种补偿。 | 重启后按策略补偿。 |
| FR-16 | 操作审计 | P2 | 记录增删改启停/API 触发与操作人。 | 审计可回溯。 |
| FR-17 | 批量操作 | P2 | 列表多选批量启停/删除。 | 批量结果一致。 |
| FR-18 | 调度监控看板 | P2 | 成功率、失败 TOP、近 24h 执行量。 | 指标与日志一致。 |
| FR-19 | FlowNode 流程编排 | P1 | 任务可绑定由多节点(采集/转换/校验/API调用/脚本/条件/通知)组成的执行流,支持顺序与条件分支。 | 流程按节点顺序/分支正确执行,节点失败可定位。 |
| FR-22 | API 调用节点 | P1 | FlowNode 支持 API 调用节点(方法/URL/Header/Body),打通对外集成。 | 节点按配置调用外部接口并记录响应。 |
| FR-20 | 开放 API 接入 | P1 | 提供 REST API 供外部触发任务/流程、查询状态与日志;API Token 鉴权 + 作用域。 | 合法 Token 可触发并查询,无 Token/越权被拒。 |
| FR-25 | API 触发幂等 | P2 | 开放 API 触发任务/流程支持 Idempotency-Key(或请求指纹);同一 key 在 TTL(默认 24h)内重复提交仅执行一次,重复请求直接返回既有执行记录;TTL 外视为新请求重新执行。 | 网络重试不重复执行;重复请求返回既有执行 ID/状态;越 TTL 重新执行。 |
| FR-26 | Webhook 出站白名单(防 SSRF) | P2 | 配置 Webhook 告警地址时,目标 URL 须命中「出站地址白名单」(域名/网段/IP),且禁止指向内网保留地址段(10/8、172.16/12、192.168/16、127/8、169.254/16 等);不命中或命中内网段则拒绝保存/发送;发送失败有重试上限。 | 内网地址被拒;非白名单域名被拒;白名单内正常送达。 |
| FR-27 | 流程节点失败重试 | P2 | FlowNode 支持按节点配置重试次数、重试间隔(固定/指数退避)、单节点超时(ms);整流程可配置失败策略(遇节点失败即中止 / 跳过继续 / 告警后继续)。 | 节点失败按策略重试/跳过/中止;超时中断;策略生效。 |
| FR-28 | 禁止绑定草稿流程 | P2 | 任务(流程方式)保存时校验所绑流程 status=已发布(PUBLISHED);草稿态流程不可被绑定;流程编辑「另存为草稿」不影响已发布版本,发布需显式动作。 | 绑草稿流程被拒;已发布流程可绑定;草稿保存不误伤线上。 |
表单在 v1.0 基础上新增「执行方式」:
| 字段 | 类型 | 必填 | 规则 / 默认值 |
|---|---|---|---|
| 任务名称 | 文本 | 是 | 唯一,2–50 字。 |
| 执行方式 | 单选 | 是 | 单任务(直接调用目标)/ 流程(绑定一条 Flow,见 §6.5)。 |
| 任务类型 | 下拉 | 是 | 见 §6.4 枚举;流程方式下可留空。 |
| 调用目标 / 绑定流程 | — | 是 | 单任务=Bean/URL;流程=选择 Flow。 |
| 调用参数 | JSON | 否 | 合法 JSON。 |
| Cron 表达式 | 双模式 | 是 | 见 §6.2;含中文可读描述。 |
| 并发/Misfire/告警 | — | — | 同 v1.0。 |
触发方式分两类,由 schedule_type 区分:周期型(cron)走下方双模式配置;一次性(once)走独立「仅一次」表单(见 §6.2.4),二者不共用表达式。所有周期型任务后台统一存为 Cron 表达式并冗余一份中文可读描述。
① 常用快捷(一键套用):在向导上方提供高频预设 chips,点击即套用,覆盖一线最高频场景:每 5 分钟、每 30 分钟、每小时整点、每天 08:00、每天 20:00、每周一 09:00、工作日 08:30、每月 1 号 00:00。
② 频率向导(可视化配置):按「业务语言」选择,全程不接触原生 Cron 语法:
| 频率类别 | 向导控件 | 生成的 Cron(6 段) | 中文可读描述 |
|---|---|---|---|
| 每隔几分钟 | 间隔 chips(1/5/10/15/30 分钟) | 0 0/N * * * ? | 每 N 分钟执行一次 |
| 每小时 | 分钟下拉(0–59) | 0 M * * * ? | 每小时的第 M 分钟 / 整点执行 |
| 每天 | 时、分下拉 | 0 M H * * ? | 每天 HH:MM:00 执行 |
| 每周 | 星期多选 + 时、分下拉 | 0 M H ? * DOW | 每[周X、周Y] HH:MM:00 执行 |
| 每月 | 月内日期下拉 + 时、分下拉 | 0 M H D * ? | 每月 D 号 HH:MM:00 执行 |
时区说明:上述「每天 / 每周 / 每月」等时刻均以任务 timezone 字段为基准(FR-24,默认 Asia/Shanghai)。跨厂区部署时,各厂区任务以其本地时区解释 Cron,避免统一服务器时区带来的错时问题。
向导与「专家模式」下的 6 段表达式双向互转:编辑已有任务时,系统尝试将存量 Cron 反解析回最接近的向导配置;无法精确对应的复杂表达式(如多个不规则取值、步进组合)自动回退到专家模式,不丢配置。
每周一、周三、周五 09:30:00 执行」,随向导选择实时刷新。0=周日 … 6=周六(与 JS/标准一致)。若调度内核为 Quartz(1=SUN…7=SAT),在落库/对接时按下方映射做双向转换,该约定须在 API 契约评审时锁定:| 含义 | 本系统存储值 | Quartz 值 |
|---|---|---|
| 周日 | 0 | 1 |
| 周一 | 1 | 2 |
| 周二 | 2 | 3 |
| 周三 | 3 | 4 |
| 周四 | 4 | 5 |
| 周五 | 5 | 6 |
| 周六 | 6 | 7 |
针对「某年某月某日某时执行一次」场景,不使用 Cron 表达式,而是独立表单选择日期 + 时刻(fire_once_time)。系统到点触发一次后,任务状态流转为「已结束」,不重复调度;到期前可编辑日期时刻或取消。
mes_job.schedule_type='once'、fire_once_time=datetime、cron_expression 留空。| 类型编码 | 名称 | 典型调用目标 | 默认周期 |
|---|---|---|---|
| EQUIP_COLLECT | 设备数据采集 | equipCollectionJob.collect | 每 1 分钟 |
| REPORT_GEN | 生产报表生成 | reportJob.daily | 每日 08:00 |
| WMS_WARN | 库存预警检查 | wmsWarnJob.check | 每 30 分钟 |
| WO_ESCALATE | 工单超时升级 | woEscalateJob.run | 每 15 分钟 |
| ERP_SYNC | ERP 订单同步 | erpSyncJob.sync | 每日 02:30 |
| DATA_ARCHIVE | 历史数据归档 | archiveJob.archive | 每日 03:00 |
| QMS_AGG | 质量数据汇总 | qmsAggJob.aggregate | 每日 12:00 |
| MAINT_REMIND | 保养计划提醒 | maintRemindJob.remind | 每周一 09:00 |
当任务「执行方式 = 流程」时,绑定一条 Flow。Flow 由节点构成,MVP 支持顺序执行与条件分支(轻量 DAG)。
| 节点类型 | 说明 | 关键配置 |
|---|---|---|
| START / END | 流程起止 | — |
| COLLECT 采集 | 采集设备/接口数据 | 数据源、模式 |
| TRANSFORM 转换 | 数据清洗/映射 | 规则 / 脚本 |
| VALIDATE 校验 | 业务规则校验 | 校验表达式 |
| API_CALL API调用 | 调用外部 REST 接口 | 方法、URL、Header、Body(FR-22) |
| SCRIPT 脚本 | 自定义逻辑 | 语言、代码 |
| CONDITION 条件分支 | 按表达式分流 | 表达式、true→、false→ |
| NOTIFY 通知 | 发送通知 | 渠道、模板 |
编排交互:以「节点列表 + 连接线」方式呈现(后续增强为拖拽画布);支持新增/删除/排序节点、配置节点参数、设置分支条件。每个节点独立记录执行状态与耗时,便于失败定位。
为提升流程健壮性,每个节点可独立配置重试与超时(FR-27),整流程再统一约定失败处置方式:
| 配置项 | 说明 | 取值 / 默认 |
|---|---|---|
节点重试次数 retry_count | 节点执行失败后的重试上限 | 0–5,默认 0(不重试) |
重试间隔 retry_interval | 两次重试之间的间隔 | 毫秒,默认 1000 |
退避策略 retry_backoff | 间隔是否随次数增长 | fixed 固定 / exponential 指数退避(默认 fixed) |
节点超时 timeout_ms | 单节点执行超时,超时即判失败并走重试/失败策略 | 毫秒,默认 30000 |
整流程失败策略 on_node_failure | 任一节点失败(重试后仍失败)时的处置 | 0=中止 / 1=跳过继续 / 2=告警后继续(默认 0 中止) |
对外暴露 REST 接口,供 ERP / WMS / 低代码等外部系统触发与查询;采用 Bearer Token 鉴权,Token 带作用域与有效期。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/v1/mes/jobs/{jobId}/trigger | 触发指定任务一次(触发类型记 API);支持 Idempotency-Key 请求头(FR-25)。 |
| GET | /api/v1/mes/jobs/{jobId} | 查询任务定义与当前状态/下次执行。 |
| GET | /api/v1/mes/jobs/{jobId}/logs | 查询该任务执行日志(分页)。 |
| POST | /api/v1/mes/flows/{flowId}/run | 触发指定流程执行。 |
| GET | /api/v1/mes/flows/{flowId}/status | 查询流程执行状态与各节点进度。 |
Token 管理:列表展示名称、作用域(任务组/流程)、有效期、状态;可创建/吊销;密钥仅创建时明文展示一次。
外网调用方常因网络抖动重试 POST 触发请求,若不幂等会导致同一业务事件被重复执行。约定如下:
Idempotency-Key: <唯一串>(建议 UUID 或「业务单号+动作」);也可由网关按 Token + jobId/flowId + Body 指纹 自动生成。mes_job_log.idempotency_key,便于审计与排查。失败告警支持站内 / 邮件 / Webhook 三渠道(FR-12)。其中 Webhook 是最易引入 SSRF 风险的入口:恶意或误配的回调地址可能指向内网元数据服务(如 169.254.169.254)或内部系统,造成信息泄露或服务被打。规范如下(FR-26):
mes_outbound_whitelist 表,未命中拒绝保存与发送。| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| task_name | varchar | 任务名称(唯一) |
| invoke_mode | tinyint | 0=单任务 1=流程 |
| task_type | varchar | MES 任务类型(单任务时有值) |
| task_group | varchar | 任务组 |
| invoke_target | varchar | 调用目标(单任务时有值) |
| flow_id | bigint | 绑定流程 ID(流程方式时有值) |
| invoke_params | text | 调用参数(JSON) |
| schedule_type | tinyint | 0=周期(cron) 1=一次性(once) |
| cron_expression | varchar | 周期型任务存 Cron 表达式;一次性任务留空 |
| fire_once_time | datetime | 一次性任务触发时刻;周期型为空 |
| timezone | varchar | IANA 时区(如 Asia/Shanghai),周期解释基准(FR-24) |
| cron_human_desc | varchar | 中文可读描述,周期型有效;如「每天 08:00:00 执行」 |
| status | tinyint | 0=运行中 1=已暂停 |
| concurrent / misfire_policy | tinyint | 并发 / Misfire 策略 |
| alarm_enabled / alarm_channels | — | 失败告警开关与渠道 |
| next_exec_time | datetime | 下次执行(冗余) |
| remark / creator / updater / 时间戳 | — | 备注与审计 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| job_id / job_name / job_group | — | 关联任务 |
| flow_id | bigint | 关联流程(流程任务时有值) |
| execute_type | tinyint | 0=自动 1=手动 2=API |
| start_time / end_time / duration_ms | — | 起止与耗时 |
| status | tinyint | 0=成功 1=失败 |
| fail_node | varchar | 失败节点 ID(流程任务时有值) |
| exception_msg | text | 异常栈 |
| idempotency_key | varchar | 幂等键(API 触发时有值,FR-25) |
| 实体 | 字段 | 说明 |
|---|---|---|
| mes_flow | id, name, remark, status(0=草稿 DRAFT / 1=已发布 PUBLISHED), on_node_failure(0中止/1跳过/2告警后继续), create_time | 流程定义(仅 PUBLISHED 可被任务绑定,FR-28) |
| mes_flow_node | id, flow_id, node_type, node_name, config(JSON), order_no, next_node_id, condition_expr, retry_count, retry_interval, retry_backoff(fixed/exponential), timeout_ms | 流程节点(顺序/分支 + 重试/超时,FR-27) |
| mes_outbound_whitelist | id, type(0域名/1 IP/2 CIDR), value, enabled, remark, create_time | Webhook 出站白名单(FR-26,防 SSRF) |
| 字段 | 类型 | 说明 |
|---|---|---|
| id / token_name | — | 主键与名称 |
| token | varchar | 凭证(密文存储,仅创建时明文展示) |
| scope | varchar | 作用域(任务组/流程 ID 列表) |
| expire_time / status | — | 有效期与启用状态 |
schedule_type=once 任务不写 Cron 表达式,仅存 fire_once_time;到点触发一次后状态流转为「已结束」且不再触发;编辑回显日期时刻而非 Cron;过期时间提示准确。| 阶段 | 范围 | 交付物 |
|---|---|---|
| M1(基础+易用) | FR-01~08、10、13、21、23、24 | 任务增删改查、启停、手动执行、Cron 双模式易用、一次性任务、任务时区、日志、详情。 |
| M2(编排+集成) | FR-09、11、12、14、19、22、20 | 任务类型模板、异常详情、失败告警、并发、FlowNode 流程编排 + API 调用节点、开放 API + Token。 |
| M3(治理) | FR-15、16、17、18、25、26、27、28 | Misfire、审计、批量操作、调度监控看板;API 触发幂等、Webhook 出站白名单(防 SSRF)、流程节点重试、禁止绑定草稿流程。 |