1. 后端
插件化手册
  • FH2 插件开发手册
    • 产品简介
    • 典型场景
    • 发版说明
    • 快速开始
      • 快速开始总览
      • 第一个插件
      • 后端插件
      • 全栈闭环
    • AI辅助开发
      • AI 开发 Skill
      • 安装与复验
      • 第一个工程
      • 真实需求示例:现场问题上报
      • 改造已有工程
      • 调试与交付
    • 开发指南
      • 开发指南
      • 基础概念
        • 基础概念总览
        • 什么是插件开发
        • 平台架构
        • 前端宿主、扩展点与能力
        • 后端运行时、入口与权限
        • 开发流程
        • 安全与隔离
        • 支持范围与问题反馈
      • 开发指南
        • 开发指南总览
        • 前端插件
          • 前端插件深度指南
          • 前端工程结构
          • 插件清单(fh2-plugin.json)
          • 入口与生命周期
          • 界面与状态
          • 多宿主插件
          • 跨宿主通信服务
          • HTTP、WebSocket 与事件
          • 存储、Blob 与定时器
          • 工具链与本地调试页面
        • 后端插件
          • 后端开发深度指南
          • 后端插件的结构
          • 后端源清单 fh2-plugin.json
          • HTTP 接口处理函数
          • 消息订阅与事件处理函数
          • ctx 与能力注入
          • 数据存储与缓存
          • 流程编排
          • 触发方式
          • 连接外部系统
          • 流程编排练习(DAG)
        • 前后端协作
          • 前后端协作总览
          • 前后端共享契约
          • 端到端幂等
          • 事件、通知与状态
          • 统一错误模型
          • 链路标识与诊断日志
        • 完整练习
          • 环境准备
          • 第一个前端插件
          • 第一个后端插件
          • 第一个全栈插件
      • 能力总览
        • 能力地图
        • 能力可用性矩阵
        • 前端能力
          • 平台通用能力
            • 平台通用能力总览
            • 基础运行时:HTTP、事件、WebSocket 与存储
            • 导航、位置与通知
            • 弹窗、音频与剪贴板
            • 地图能力
            • 项目设备能力
            • WPMZ 与航线预览
            • 受控对象上传
          • 项目宿主
            • 项目宿主总览
            • 项目上下文
            • 项目侧边栏入口
            • 项目插件路由
            • 项目工作区
          • 消息宿主
            • 消息宿主总览
            • 消息告警弹层
            • 消息导航与通知
          • 计划库宿主
            • 计划库宿主总览
            • 计划库表单上下文
            • 计划库表单扩展
            • 校验、提交与 `biz_ext`
          • 驾驶舱
            • 驾驶舱插件能力总览
            • 驾驶舱扩展点
            • 上下文与遥测
            • 相机、检测与 AI
            • 场景几何与直播指针
            • 飞控、云台与任务
            • 驾驶舱平台事件
        • 后端能力
          • 后端能力地图
          • 后端能力总览
          • 配置、受管出网与集成连接
          • 事件与流程
          • 飞行任务与违停巡逻
          • 数据存储
          • 媒体与前端通知
          • 资源租约
          • 作业、目标轨迹与视频处理
      • 调试与测试
        • 调试与测试总览
        • 快速入门排错
        • 本地开发
        • Web IDE:打开工程与保存改动
        • 工作流编辑器:节点、接线与交付
        • 知识与 MCP:先判断需要哪一层事实
        • 前端本地调试
        • 后端运行时与流程调试
        • 模拟数据与测试数据
        • 集成测试与 E2E
        • 日志与链路追踪
        • 常见问题排查
      • 完整示例
        • 示例与案例总览
        • 项目侧边栏与工作区
        • 消息告警卡片
        • 计划表单任务清单
        • 驾驶舱动作与左侧面板
        • 最小后端插件
        • 最小全栈插件
        • 多宿主插件实战
        • 事故快处
        • 交通抓拍
        • 违停巡逻完整案例
      • 构建发布与安全
        • 构建、发布与安全
        • 质量门禁
        • 行业包构建与打包
        • 能力版本发布
        • 安装、升级与回滚
        • 安全基线
      • API参考
        • API 参考总览
        • 前端
          • 前端 API 参考
          • 前端插件清单结构
          • 前端 SDK API
          • 前端扩展点目录
          • 前端能力目录
          • 前端平台事件目录
          • 跨宿主通信服务 API
          • 工具链命令行参考(`fh2-plugin`)
        • 后端
          • 后端 API 参考
          • 后端插件源清单
          • 后端 HTTP 接口参考
          • 后端事件消费参考
          • 后端脚本上下文(`ctx`)
          • 后端数据存储
          • 流程编排语言
          • 流程触发器参考
          • 后端能力目录
          • 后端 HTTP API
        • 共享契约
          • 共享契约参考
          • 类型与契约目录
          • 错误模型
          • 版本兼容性
      • 附录
        • 错误码
        • 术语表
        • 常见问题
  1. 后端

流程编排语言

流程是一个 JSON 文件:声明触发方式和一张步骤有向无环图,由平台持久化执行状态并调度步骤。这一页是字段参考;概念见流程指南。本地 dev 不执行流程,目标环境还须确认插件版本、持久化设施和能力提供方。
本文以 SDK / 工具链 1.0.0、后端契约 1.1.0 为范围。重试导出的说明与当前执行规则仍有差异,见重试边界;不能仅凭版本号或本地校验通过推断目标部署采用了同一策略。

顶层结构#

以下仅展示顶层字段;空 steps 不是可交付的完整流程。
{
  "name": "accident-response-cascade",
  "description": "事故联动处置",
  "trigger": {"stream": {"match": {"event_type": "traffic.accident"}}},
  "steps": []
}
字段必填说明
name✅流程的运行身份(跨包唯一),不是文件名
description说明
trigger✅触发器,见 流程触发器参考
steps✅步骤数组,见下文

步骤(FlowStep)#

下面是字段形状片段,不是完整可执行流程。尤其 dispatch_mission 是单次尝试动作,不能照抄其中的 maxAttempts: 3;用于该动作时须设为 1 或省略,并补齐动作所需输入及上游步骤。
{
  "id": "dispatch",
  "needs": ["ack"],
  "action": "dispatch_mission",
  "inputs": {"waylineUuid": {"from": "trigger.waylineUuid"}},
  "when": {"field": "steps.ack.confirmed", "op": "eq", "value": true},
  "timeoutSec": 60,
  "maxAttempts": 3
}
字段说明
id步骤标识,流程内唯一
needs依赖的步骤 ID(有向无环图的边);数组顺序只影响排序稳定性
trigger依赖达成条件:allSucceeded(默认,全部成功才执行)或 allDone(上游有终态就执行,适合收尾;其自身失败只记日志)
action动作:平台受控步(如 dispatch_mission)或 run_script;plugin.<名> 为已登记的插件自定义动作
inputs每项 {"const": ...} 或 {"from": "路径"},二选一
when执行条件,见下文
delaySec延迟执行秒数
await / callback等待信号声明,见下文
timeoutSec单步超时(最大 3600;默认 30 秒,非幂等步 60 秒)
maxAttempts最大尝试次数,含首次执行;未写或为 0 时使用动作基线。非幂等动作固定 1 次,其余动作的显式正值可调整,当前执行上限为 20;见下文

重试边界#

尝试次数不等于重试次数:最多 5 次尝试包含首次执行,最多发生 4 次重试。
动作默认最大尝试次数首次退避 / 倍率显式调整
run_script,包括经该动作执行的只读判定560 秒 / 2正值可收紧或放宽,执行时钳到 20
其他可重试动作51 秒 / 2正值可收紧或放宽,执行时钳到 20
dispatch_mission、spawn_agent、return_home1不重试不能放宽;大于 1 的声明会被后端发布校验拒绝
run_script 的重试会重新执行整段脚本,不是从上一次能力调用之后继续。已经成功的外部写入不会因此回滚;脚本须显式接入 run.idempotencyKey 并按业务唯一键去重。契约错误、业务结果不重试,其他错误按有效步骤策略处理,见错误模型。
当前重试导出仍可能把 run_script 的首次退避写成 1 秒,并把所有动作的尝试次数描述为“只能收紧”。这两项不能当作当前执行保证;目标部署的规则由部署方核对。上述默认值也不承诺固定总等待窗口,执行耗时、取消和实际重试策略都会影响最终时长。

输入路径(from)#

路径根内容
trigger.*触发输入(开放:声明是最低承诺,不限制额外字段)
steps.<id>.*前序步骤的输出;只能读 needs 传递闭包内的步骤
steps.<id>.$state步骤终态:succeeded / failed / skipped / timedOut / interrupted
run.now流程确定性时间(UTC RFC3339,重试不变)
run.idempotencyKey本步幂等键 <流程ID>:<步骤ID>
run.intervalSec仅 schedule 触发时存在
run_script 额外要求 inputs.script 为非空字符串 const(引用清单 scripts[] 里声明的脚本名)。

等待信号(await / callback)#

{
  "id": "wait-confirm",
  "action": "wait_signal",
  "await": {
    "signal": "acknowledge",
    "timeoutSec": 3600,
    "provides": [{"key": "confirmed", "type": "bool"}]
  }
}
字段说明
signal信号名;由调用方通过平台信号 API 投递
timeoutSec / timeoutSecFrom二选一;字面量 ≤0 表示无限等待,动态值取不到或 ≤0 立即超时,超 3600 钳为 3600
provides / optional必填 / 可缺的信号数据键,类型 string/number/bool/object/array
extraKeys'reject'(默认)或 'allow':多余键是拒绝还是放行
interruptedBy可中断本等待的信号

条件(when)#

叶子:{"field": "...", "op": "...", "value": ...},op 为 eq / ne / in / exists / blank / present。
组合:{"and": [...]} 或 {"or": [...]};三种形态三选一。
blank 视 null、缺失、空串、0、false 为空;present 相反。

平台受控步(受控动作)#

飞行和设备控制只能通过这些步骤完成,脚本拿不到对应能力:
动作(action)关键输入输出
dispatch_missionwaylineUuid、dockSn、projectUuid 必填allowed, reasons, droneId, missionId
query_flight_taskmissionId 必填;untilStatusIn/everySec 可选任务状态、名称、类型、时间、航点等
spawn_agenttaskUuid, projectUuid, dockSn, waylineUuid, flightIdsessionId, droneSn, drcAcquired, skipped…
return_homesessionId 必填accepted, controlReleased
update_event_statusstatus 必填eventStatus
wait_signal由 await 描述信号数据
run_scriptscript(const)+ 脚本 io.inputs由脚本 io.outputs 决定

最小示例#

workflows/capture-process.json:
{
  "name": "capture-process",
  "steps": [
    {
      "id": "process",
      "action": "run_script",
      "timeoutSec": 30,
      "maxAttempts": 1,
      "inputs": {
        "script": {"const": "process-capture"},
        "event_id": {"from": "trigger.event_id"},
        "idempotencyKey": {"from": "run.idempotencyKey"}
      }
    }
  ],
  "trigger": {"job": {"seed": ["event_id"]}}
}

常见问题#

现象原因与处理
装载报流程校验失败常见原因:inputs 同时写了 from 和 const、needs 指向不存在的步骤、run_script 的脚本名没在清单 scripts[] 声明
步骤一直不执行上游没达成 trigger 条件(默认 allSucceeded);或 when 条件不满足被跳过(终态 skipped)
信号等不到检查 await.signal 名称与投递方一致;看 steps.<id>.$state 是否 timedOut
想在流程里直接调飞行接口做不到;用受控步 dispatch_mission 等
修改于 2026-10-22 03:40:05
上一页
后端数据存储
下一页
流程触发器参考
Built with