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. 后端能力

飞行任务与违停巡逻

后端插件要下发飞行任务、查任务进度、建巡逻会话、让飞机返航时,用的不是 JS 能力对象,而是流程 JSON 里的平台受控步(action)。平台在这些步骤上做审计和风控,脚本本身拿不到任何飞行函数——这是刻意的安全设计。

四个受控步#

动作(action)作用对应审计能力(流程元数据)
dispatch_mission按航线创建飞行任务device.mission:execute
query_flight_task查询任务状态(可长轮询)flight_task.detail:read
spawn_agent为任务创建巡逻会话agent.session:create
return_home命令飞机返航device.flight:return_home
⚠️ 表里的审计能力名是流程校验用的元数据,不能写进脚本 allowlist(写了装载失败)。它们也不对应任何可调用的 JS 对象。

部署依赖#

这四个步骤需要部署方接通能力提供方,且成组生效。插件声明了这些步骤不代表提供方已就绪;测试前请部署方确认各组接入的是实际服务还是模拟服务。
能力组必须同时就绪缺失时行为
飞行任务任务创建服务、任务查询服务整组使用模拟结果:下发返回模拟任务号,查询返回模拟终态
违停巡逻巡逻会话创建服务、返航服务整组使用模拟结果:建会话返回 skipped=patrol_not_configured
所以"流程跑通了"不等于"真的下发了任务"。测试环境验收要由部署方确认接入状态,并用任务和设备的权威状态验证结果,不能只看模拟返回值。两组互相独立,一组缺失不影响另一组。

dispatch_mission:下发任务#

inputs  = { waylineUuid, dockSn, projectUuid, lat?, lng?, recordId? }
outputs = { allowed, reasons, droneId, missionId? }
{
  "id": "dispatch",
  "action": "dispatch_mission",
  "inputs": {
    "waylineUuid": { "from": "steps.pick.waylineUuid" },
    "dockSn": { "from": "steps.pick.dockSn" },
    "projectUuid": { "from": "steps.pick.projectUuid" },
    "recordId": { "from": "trigger.eventId" }
  }
}
要点:
按 dockSn(机场 SN)选机场,不接收插件指定飞机(droneId 由平台返回)。
创建成功只表示任务已落库,下发设备是异步的——必须接 query_flight_task 确认。
创建任务不是幂等的更新或插入操作:重放可能多建任务。这一步被平台固定为不可重试,不要在流程里放宽重试。

query_flight_task:查询任务#

inputs  = { missionId, untilStatusIn?: number[], everySec?: number }
outputs = { taskStatus, taskName, taskType, beginAt, endAt, workflowUuid,
            currentWaypointIndex, totalWaypoints, exceptions, pollTimedOut? }
不给 untilStatusIn 时只查一次;给了就轮询到指定状态为止。
everySec 最小 5 秒(更小会被退回默认 15 秒);轮询期间有心跳,超时前返回最后状态并置 pollTimedOut: true,不抛错。
状态是数字:过程态 0/2/9/10,终态 1/4/5/7/8。状态字面量由你的流程维护,下游枚举变化时要人工核对。

spawn_agent:创建巡逻会话#

inputs  = { taskUuid, projectUuid, dockSn, waylineUuid, flightId }
outputs = { sessionId, droneSn, containerName, drcAcquired, skipped, skipReason }
机场被占等业务分支返回 skipped=true 且 sessionId 为空——这不是错误,下游步骤要用 when 检查 sessionId 是否存在再决定走哪条路。

return_home:返航#

inputs  = { sessionId, flightId?, dockSn? }
outputs = { accepted, controlReleased }
{
  "id": "return",
  "action": "return_home",
  "trigger": "allDone",
  "needs": ["patrol"],
  "inputs": { "sessionId": { "from": "steps.spawn.sessionId" } },
  "when": { "field": "steps.spawn.sessionId", "op": "present" }
}
⚠️ 下游即使 HTTP 200,只要返回 accepted=false(比如没有控制权,指令没发出去,飞机可能还在天上),这一步就按失败处理并触发告警——这是有意的安全语义,不要捕获后当成功。

幂等与安全#

步骤幂等性注意
dispatch_mission不可重试(重放可能多建任务)靠上游业务 ID 去重
query_flight_task只读幂等默认重试安全
spawn_agent按不可重试处理下游可能"杀掉重起"
return_home不可重试accepted=false 必须当失败
插件不得绕过受控步骤直接调用下游飞行服务;部署方负责服务接入与访问控制。
步骤在后端运行时启动时装配,配置变化后由部署方重启。
涉及真实飞行的验证只在隔离项目和已获审批的设备上执行;模拟返回值不能作为设备完成证据。
流程 JSON 的写法(inputs 引用、when 条件、needs 依赖)见流程编排。

常见问题#

现象原因与处理
任务"下发成功"但飞机没动创建≠下发;接 query_flight_task 轮询终态
流程结束但没有实际任务下游服务未接通,可能整组使用模拟结果;请部署方确认接入状态,并查询权威任务状态
巡逻会话 sessionId 为空机场被占等业务分支,skipped=true;用 when 分流
return_home 步骤失败但 HTTP 是 200accepted=false:指令没被接受,当失败处理并告警
把 device.mission:execute 写进 allowlist 后起不来审计能力名不是脚本权限名;从 allowlist 里删掉
修改于 2026-10-22 03:39:57
上一页
事件与流程
下一页
数据存储
Built with