73 lines
5.2 KiB
Markdown
73 lines
5.2 KiB
Markdown
|
|
# APS 对平台的契约草案(B0.2 → B5 输入)
|
|||
|
|
|
|||
|
|
> 两侧唯一的界面就是这份契约:平台通过 `providers/aps` 的适配器调它,APS 不 import 平台代码。首版**只读优先**——写能力先列出来定形状,实现放在 A6/B6 之后。
|
|||
|
|
>
|
|||
|
|
> 能力描述七要素见 `docs/spec/capability-description.md`(平台侧同一份规范)。
|
|||
|
|
|
|||
|
|
## 1 传输形状
|
|||
|
|
|
|||
|
|
| 项 | 约定 |
|
|||
|
|
| --- | --- |
|
|||
|
|
| 端点 | `POST /api/capabilities/{capabilityId}` |
|
|||
|
|
| 请求体 | `{ "params": {}, "executionId": "...", "idempotencyKey": "...", "deadlineAt": 0, "identity": { "accountId": "..." } }` |
|
|||
|
|
| 响应体 | 与平台 `contracts/schemas/receipt.schema.json` 的 `ExecutionReceipt` 同形:`{ executionId, status, result?, errorKind?, approvalId? }` |
|
|||
|
|
| 健康 | `GET /api/health` → `{ status: "ok"|"degraded"|"down", detail?, checkedAt }` |
|
|||
|
|
| 清单 | `GET /api/manifest` → `ProviderManifest`(id / displayName / version / platformVersion / requiresIdentity / auth / capabilities) |
|
|||
|
|
| 鉴权 | 服务间令牌 + 身份透传(`identity.accountId`)。**权限由 APS 自己校验**(D9:权限归业务系统),平台放行不代表 APS 放行 |
|
|||
|
|
| 超时 | `deadlineAt` 由平台给,APS 尽力遵守;超时不等于失败,平台按「结果未知」处理 |
|
|||
|
|
| 版本 | `platformVersion: 1`;能力 schema 只加不改,改语义换 capabilityId |
|
|||
|
|
|
|||
|
|
## 2 只读能力(B5 首批实现)
|
|||
|
|
|
|||
|
|
| capabilityId | 一句话用途(≤40 字) | effect | mode | 幂等 | 何时不用 | 同义词 |
|
|||
|
|
| --- | --- | --- | --- | --- | --- | --- |
|
|||
|
|
| `aps.master.query` | 查物料、工序、设备等主数据 | read | sync | none | 要改主数据请用主数据维护流程 | 主数据、基础资料、物料表 |
|
|||
|
|
| `aps.orders.query` | 查订单与交期承诺状态 | read | sync | none | 要看排产结果用 `aps.schedule.query` | 订单、交期、承诺日期 |
|
|||
|
|
| `aps.capacity.query` | 查产能池与负荷分布 | read | sync | none | 要看某版方案的负荷用 `aps.schedule.query` | 产能、负荷、能力池 |
|
|||
|
|
| `aps.calendar.query` | 查工厂日历、班次与换型字典 | read | sync | none | 不用于查排产结果 | 日历、班次、换型、setup |
|
|||
|
|
| `aps.routing.query` | 查工艺路线模板与工序顺序 | read | sync | none | 图纸解析在 `aps.drawing.parse` | 工艺路线、工序、路线模板 |
|
|||
|
|
| `aps.schedule.query` | 查现有排产方案与执行结果 | read | sync | none | 要新算一版用 `aps.schedule.preview` | 排产结果、计划、方案 |
|
|||
|
|
| `aps.exceptions.query` | 查缺料、冲突与超期等异常 | read | sync | none | 要看某个订单细节用 `aps.orders.query` | 异常、冲突、缺料、超期 |
|
|||
|
|
|
|||
|
|
参数 schema 一律:`{ "project": string(必填,默认当前项目), "filters": object(可选) }`,把枚举与单位写进描述;返回 `{ items: [], total: number, asOf: string }`(`asOf` 是数据时点,供界面显示"数据截至")。
|
|||
|
|
|
|||
|
|
## 3 草稿与写能力(形状先定,实现后置)
|
|||
|
|
|
|||
|
|
| capabilityId | 用途 | effect | mode | 幂等 | 说明 |
|
|||
|
|
| --- | --- | --- | --- | --- | --- |
|
|||
|
|
| `aps.schedule.preview` | 按当前数据试排一版,只出结果不发布 | draft | async | natural | 返回 `jobId`;结果进隔离草稿,不碰 APS 生产数据 |
|
|||
|
|
| `aps.schedule.publish` | 把指定版本方案发布到 APS | write | async | key | 必须带 `revision`(目标数据版本);平台侧先出确认卡(A4.4) |
|
|||
|
|
| `aps.orders.upsert` | 新增或修改订单 | write | sync | key | 需要业务系统的写权限;平台不代替它判断 |
|
|||
|
|
| `aps.drawing.parse` | 把图纸解析成工艺信息 | draft | async | natural | 入参是平台上传后的文件引用,APS 不接收文件本身 |
|
|||
|
|
|
|||
|
|
`draft` 与 `write` 的关键区别:`draft` 只写隔离草稿、不碰生产数据,因此不走确认卡;`write` 一律走确认卡(平台策略层已实现)。
|
|||
|
|
|
|||
|
|
## 4 错误映射
|
|||
|
|
|
|||
|
|
| APS 侧情况 | errorKind |
|
|||
|
|
| --- | --- |
|
|||
|
|
| 参数缺失、类型错、枚举越界 | `invalid_argument` |
|
|||
|
|
| 当前账号在该 APS 里没有这个权限 | `forbidden` |
|
|||
|
|
| 版本冲突、并发修改 | `conflict` |
|
|||
|
|
| 求解器等资源排队 | `rate_limited` |
|
|||
|
|
| APS 不可用、依赖系统不可用 | `unavailable` |
|
|||
|
|
| 超时、部分完成、无法判断 | `unknown_result` |
|
|||
|
|
|
|||
|
|
只有 `rate_limited` 与 `unavailable` 允许平台自动重试;其余一律不重试(平台 Core 已按此实现)。
|
|||
|
|
|
|||
|
|
## 5 与平台侧的对齐检查
|
|||
|
|
|
|||
|
|
| 检查 | 方式 |
|
|||
|
|
| --- | --- |
|
|||
|
|
| 清单形状 | `GET /api/manifest` 的返回能通过平台 `ProviderManifest` 类型校验 |
|
|||
|
|
| 能力描述七要素 | 跑平台 `pnpm check:capabilities` 同一套规则(B5 时把规则提到契约里,两侧共用) |
|
|||
|
|
| 契约测试 | 平台 `runProviderContract` 对 APS 适配器跑一遍(A2.4 已实现) |
|
|||
|
|
| 只读验收 | A5.6 在真实 APS 上完成一次查询并留证 |
|
|||
|
|
|
|||
|
|
## 6 待定
|
|||
|
|
|
|||
|
|
| 项 | 说明 | 定的时机 |
|
|||
|
|
| --- | --- | --- |
|
|||
|
|
| 契约用 HTTP 还是进程内 | 首版 Provider 可跑在平台信任域内(实施设计 5),跨进程是外部团队接入的形态 | B5 实现时按部署形态定 |
|
|||
|
|
| `aps.schedule.preview` 的结果存放 | 方案结果落 APS 库还是平台产物区 | B5 |
|
|||
|
|
| 图纸文件引用形式 | 平台产物 id 还是 URL | 与 `drawing.parse` 一起定 |
|