|
|
@@ -0,0 +1,700 @@
|
|
|
+# Ai-DOP 第三方对接模拟器建设方案
|
|
|
+
|
|
|
+| 项 | 内容 |
|
|
|
+|---|---|
|
|
|
+| 文档定位 | 第三方对接模拟器总体方案 |
|
|
|
+| 编制日期 | 2026-09-30 |
|
|
|
+| 状态 | 初版方案,待按配套任务书实施 |
|
|
|
+| 业务依据 | [`Ai-DOP第三方对接业务数据详表-业务页.md`](./Ai-DOP第三方对接业务数据详表-业务页.md) |
|
|
|
+| 技术依据 | [`Ai-DOP第三方对接业务数据详表-技术页.md`](./Ai-DOP第三方对接业务数据详表-技术页.md)、[`Ai-DOP第三方系统集成指南.md`](./Ai-DOP第三方系统集成指南.md) |
|
|
|
+| 配套任务书 | [`Ai-DOP第三方对接模拟器初步执行任务书.md`](./Ai-DOP第三方对接模拟器初步执行任务书.md) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 0. 一句话
|
|
|
+
|
|
|
+建设一个独立运行的本地第三方系统模拟器,用同一套可追踪业务样例分别模拟:
|
|
|
+
|
|
|
+1. 第三方数据库供 Ai-DOP 同步,即 `DB_SYNC`;
|
|
|
+2. 第三方查询 API 供 Ai-DOP 主动拉取,即 `API_PULL`;
|
|
|
+3. 第三方主动调用 Ai-DOP 标准接口推数,即 `API_INBOUND`。
|
|
|
+
|
|
|
+第一阶段以“能真实完成三种对接方式的基础联调”为目标;第二阶段再补场景编排、故障注入、自动对账、更多数据库方言与持续回归。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 背景与问题
|
|
|
+
|
|
|
+Ai-DOP 已具备三种入站方式,但当前联调资产分散:
|
|
|
+
|
|
|
+- API 主动拉取 Mock 位于 `doc/db/mdp/mock_api/`;
|
|
|
+- API 推数客户端位于 `tools/mock/inbound/push_demo.py`;
|
|
|
+- 数据库模拟脚本只登记过 Mock 来源,尚未形成完整的“样例 → 源表 → 同步 → 验收”工具;
|
|
|
+- 各工具没有统一页面、统一样例目录、统一运行编号和统一结果解释;
|
|
|
+- 接口成功、配置开通、数据真正进入贴源与标准层经常被混成一个结论。
|
|
|
+
|
|
|
+因此,测试人员需要在多个脚本、配置页和数据库查询之间来回切换,难以快速回答:
|
|
|
+
|
|
|
+- 当前失败是模拟端没启动、Ai-DOP 代码不支持、配置没开通,还是数据未跑通?
|
|
|
+- 同一业务对象用数据库同步、接口拉取、接口推送时,最终是否落到一致的数据语义?
|
|
|
+- HTTP 202 是否只是接收成功,还是下游贴源、转换和指标也成功?
|
|
|
+- 当前业务数据详表中的对象,哪些能通过哪种方式验证?
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 建设目标
|
|
|
+
|
|
|
+### 2.1 第一阶段目标:基础联调可用
|
|
|
+
|
|
|
+第一阶段交付一个独立本地可视化工具,做到:
|
|
|
+
|
|
|
+1. 启停第三方 Mock API;
|
|
|
+2. 初始化并装载第三方 MySQL 模拟源库;
|
|
|
+3. 使用真实签名调用 Ai-DOP API_INBOUND;
|
|
|
+4. 三种方式共用同一套 canonical 业务样例;
|
|
|
+5. 按业务对象查看请求、响应、耗时、运行编号与可解释结果;
|
|
|
+6. 能验证业务页、技术页中各数据包在三种方式下的可达性;
|
|
|
+7. 明确区分“代码无能力”“配置未开通”“数据未跑通”;
|
|
|
+8. 不接触生产凭据,不把测试数据伪装成真实业务数据。
|
|
|
+
|
|
|
+第一阶段不是完整自动化测试平台,不要求把所有标准层、KPI 和看板对账全部自动化。
|
|
|
+
|
|
|
+### 2.2 第二阶段目标:可重复的集成回归平台
|
|
|
+
|
|
|
+第二阶段在第一阶段基础上增加:
|
|
|
+
|
|
|
+- 跨对象业务场景编排;
|
|
|
+- 错误签名、超时、重复、乱序、分页、断点续传等故障注入;
|
|
|
+- 标准层、DWD、KPI、看板结果自动对账;
|
|
|
+- SQL Server 数据库方言回归;
|
|
|
+- CLI/CI 无界面执行;
|
|
|
+- 报告导出、历史对比与脱敏留证;
|
|
|
+- Docker 化与一键环境初始化;
|
|
|
+- 对当前无 API_INBOUND 契约的业务对象,在 Ai-DOP 先完成契约扩展后纳入推数回归。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 明确不做
|
|
|
+
|
|
|
+### 3.1 第一阶段不做
|
|
|
+
|
|
|
+- 不模拟 Ai-DOP 向第三方回写的出站接口;
|
|
|
+- 不直接写 Ai-DOP 贴源表、标准表、DWD 或 KPI 表;
|
|
|
+- 不绕过现有 `MdpDbPullExecutor`、`MdpApiPullExecutor`、`MdpInboundController`;
|
|
|
+- 不为不存在的 API_INBOUND 对象伪造接口;
|
|
|
+- 不自动修改生产环境的数据源、实体、授权或开放身份;
|
|
|
+- 不持久化 AccessSecret、数据库密码、JWT、连接串;
|
|
|
+- 不以 HTTP 200/202 单独宣称“业务已跑通”;
|
|
|
+- 不在第一阶段同时模拟 MySQL、SQL Server、Oracle、PostgreSQL 四种数据库。
|
|
|
+
|
|
|
+### 3.2 第二阶段另立项的 Ai-DOP 能力缺口
|
|
|
+
|
|
|
+下列对象当前没有 API_INBOUND 推送契约,模拟器不能代替 Ai-DOP 实现它们:
|
|
|
+
|
|
|
+- 销售订单头;
|
|
|
+- 合同评审环节;
|
|
|
+- 发货计划与发货单;
|
|
|
+- 工序级日计划与排产结果;
|
|
|
+- 物料需求计划;
|
|
|
+- 采购申请;
|
|
|
+- 交货计划;
|
|
|
+- 现存量快照;
|
|
|
+- 过程检验;
|
|
|
+- 成品入库。
|
|
|
+
|
|
|
+它们在第一阶段仍可通过 `DB_SYNC` 或 `API_PULL` 模拟;若要支持第三方主动推送,须先完成 Ai-DOP 契约与贴源配置扩展。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 现状取证
|
|
|
+
|
|
|
+能力结论必须分代码层、配置层、数据层。
|
|
|
+
|
|
|
+### 4.1 代码层
|
|
|
+
|
|
|
+#### 数据库同步
|
|
|
+
|
|
|
+- 执行器:`server/Plugins/Admin.NET.Plugin.AiDOP/DataPlatform/Executors/MdpDbPullExecutor.cs`;
|
|
|
+- 实施名:`DB_SYNC`;
|
|
|
+- 连接工厂:`MdpSourceScopeFactory.cs`;
|
|
|
+- 代码支持 MySQL、SQL Server、Oracle、PostgreSQL;
|
|
|
+- 增量依赖 `mdp_entity.incr_column` 与 `last_cursor`;
|
|
|
+- MySQL 与 SQL Server 有不同分页 SQL。
|
|
|
+
|
|
|
+结论:代码层已有数据库同步能力。第一阶段用 MySQL 覆盖主路径,第二阶段补 SQL Server 方言回归。
|
|
|
+
|
|
|
+可重跑检索:
|
|
|
+
|
|
|
+```text
|
|
|
+rg "SupportedType.*DB_SYNC|class MdpDbPullExecutor|MapDbType" server/Plugins/Admin.NET.Plugin.AiDOP
|
|
|
+```
|
|
|
+
|
|
|
+#### 主动接口拉取
|
|
|
+
|
|
|
+- 执行器:`server/Plugins/Admin.NET.Plugin.AiDOP/DataPlatform/Executors/MdpApiPullExecutor.cs`;
|
|
|
+- 实施名:`API_PULL`;
|
|
|
+- 当前采用 GET;
|
|
|
+- 支持 `NONE`、Bearer/Token、Basic、APIKey、OAuth2 等鉴权配置;
|
|
|
+- 支持 `response_data_path`、`dedup_key_path`;
|
|
|
+- 增量模式会附加 cursor 参数;
|
|
|
+- 当前不是通用多页循环客户端,Mock 必须按现有契约一次返回本批数据。
|
|
|
+
|
|
|
+结论:代码层已有 API 拉取能力,现有 `doc/db/mdp/mock_api/mock_server.py` 可作为基础。
|
|
|
+
|
|
|
+可重跑检索:
|
|
|
+
|
|
|
+```text
|
|
|
+rg "class MdpApiPullExecutor|response_data_path|dedup_key_path|cursor" server/Plugins/Admin.NET.Plugin.AiDOP
|
|
|
+```
|
|
|
+
|
|
|
+#### 第三方接口推送
|
|
|
+
|
|
|
+`server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/MdpInboundController.cs` 已提供:
|
|
|
+
|
|
|
+1. `POST /api/mdp/inbound/{entityCode}`;
|
|
|
+2. `GET /api/mdp/inbound/{entityCode}/schema`;
|
|
|
+3. `GET /api/mdp/inbound/receipts/{syncBatchId}`;
|
|
|
+4. `POST /api/mdp/inbound/{entityCode}/snapshots`;
|
|
|
+5. `POST /api/mdp/inbound/{entityCode}/snapshots/{snapshotId}/commit`;
|
|
|
+6. `POST /api/mdp/inbound/{entityCode}/bulk`;
|
|
|
+7. `GET /api/mdp/inbound/{entityCode}/digest`。
|
|
|
+
|
|
|
+认证使用 `InboundSignature`,签名字串为:
|
|
|
+
|
|
|
+```text
|
|
|
+METHOD&path&accessKey×tamp&nonce&bodySha256&idempotencyKey
|
|
|
+```
|
|
|
+
|
|
|
+结论:代码层已有统一推数、验签、幂等、回执、快照、bulk 和 digest 能力。
|
|
|
+
|
|
|
+可重跑检索:
|
|
|
+
|
|
|
+```text
|
|
|
+rg "Http(Post|Get)|InboundSignature|Idempotency-Key" server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/MdpInboundController.cs server/Plugins/Admin.NET.Plugin.AiDOP/DataPlatform/Inbound
|
|
|
+```
|
|
|
+
|
|
|
+### 4.2 配置层
|
|
|
+
|
|
|
+#### DB_SYNC / API_PULL
|
|
|
+
|
|
|
+必须存在:
|
|
|
+
|
|
|
+- `mdp_source`:来源类型、连接方式、数据库或 API 配置;
|
|
|
+- `mdp_entity`:源表/API path、目标贴源表、业务键、增量列、批次参数;
|
|
|
+- 租户标准对象来源登记;
|
|
|
+- 触发该对象拉取的模块重建或同步入口。
|
|
|
+
|
|
|
+#### API_INBOUND
|
|
|
+
|
|
|
+必须同时满足:
|
|
|
+
|
|
|
+1. 代码有字段契约;
|
|
|
+2. `mdp_entity.inbound_enabled=1`;
|
|
|
+3. `mdp_inbound_grant` 有当前 AccessKey 与 entityCode 授权;
|
|
|
+4. `SysOpenAccess` 有同 AccessKey 的开放身份和绑定租户。
|
|
|
+
|
|
|
+当前迁移脚本曾为联调来源准备最多 20 个实体授权,但运行环境不得仅凭脚本推定已开通。模拟器必须通过 schema 与预检结果实测。
|
|
|
+
|
|
|
+### 4.3 数据层
|
|
|
+
|
|
|
+本次只读查询:
|
|
|
+
|
|
|
+```sql
|
|
|
+SELECT status, COUNT(*)
|
|
|
+FROM mdp_inbound_request
|
|
|
+GROUP BY status;
|
|
|
+```
|
|
|
+
|
|
|
+返回空结果集,说明当前目标库尚无可分组的入站请求流水。该结论只表示数据未真实跑过,不表示代码没有能力。
|
|
|
+
|
|
|
+DB_SYNC / API_PULL 的真实运行情况需在实施前重跑:
|
|
|
+
|
|
|
+```sql
|
|
|
+SELECT source_code, status, COUNT(*) AS cnt,
|
|
|
+ MAX(end_time) AS latest_end
|
|
|
+FROM mdp_sync_log
|
|
|
+GROUP BY source_code, status
|
|
|
+ORDER BY source_code, status;
|
|
|
+```
|
|
|
+
|
|
|
+并按目标贴源表检查来源分布、最新业务日期和样例业务键。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 总体架构
|
|
|
+
|
|
|
+```mermaid
|
|
|
+flowchart LR
|
|
|
+ subgraph simulator [第三方对接模拟器]
|
|
|
+ ControlPanel[本地可视化控制台]
|
|
|
+ SampleCatalog[统一业务样例目录]
|
|
|
+ MockDb[(MySQL模拟源库)]
|
|
|
+ MockApi[第三方查询API]
|
|
|
+ InboundClient[第三方签名推数客户端]
|
|
|
+ RunStore[本地脱敏运行记录]
|
|
|
+ ControlPanel --> SampleCatalog
|
|
|
+ ControlPanel --> MockDb
|
|
|
+ ControlPanel --> MockApi
|
|
|
+ ControlPanel --> InboundClient
|
|
|
+ ControlPanel --> RunStore
|
|
|
+ end
|
|
|
+
|
|
|
+ subgraph aidop [Ai-DOP]
|
|
|
+ DbExecutor[MdpDbPullExecutor]
|
|
|
+ ApiExecutor[MdpApiPullExecutor]
|
|
|
+ InboundApi[MdpInboundController]
|
|
|
+ Staging[(mdp_stg贴源)]
|
|
|
+ Transform[标准层转换与模块重建]
|
|
|
+ end
|
|
|
+
|
|
|
+ MockDb -->|DB_SYNC| DbExecutor
|
|
|
+ MockApi -->|API_PULL| ApiExecutor
|
|
|
+ InboundClient -->|API_INBOUND| InboundApi
|
|
|
+ DbExecutor --> Staging
|
|
|
+ ApiExecutor --> Staging
|
|
|
+ InboundApi --> Staging
|
|
|
+ Staging --> Transform
|
|
|
+```
|
|
|
+
|
|
|
+### 5.1 独立工具而非 Ai-DOP 内置页面
|
|
|
+
|
|
|
+选择独立工具的原因:
|
|
|
+
|
|
|
+- 被测系统与模拟第三方系统边界清晰;
|
|
|
+- 能真实验证网络、鉴权与协议,不与 Ai-DOP 登录态混用;
|
|
|
+- Secret 可留在本地服务进程内,不进入浏览器;
|
|
|
+- 可同时提供数据库、HTTP 查询 API、签名推数三类外部能力;
|
|
|
+- 后续可独立容器化或交付第三方现场使用;
|
|
|
+- 不新增 Ai-DOP 业务菜单和 FUNC 编号。
|
|
|
+
|
|
|
+### 5.2 技术形态
|
|
|
+
|
|
|
+第一阶段优先使用 Python 实现,复用现有 `push_demo.py` 和 `mock_server.py` 的协议代码:
|
|
|
+
|
|
|
+```text
|
|
|
+tools/integration-simulator/
|
|
|
+├─ app.py # 本地控制服务与页面
|
|
|
+├─ clients/
|
|
|
+│ ├─ inbound_client.py # HMAC 签名与七类推数操作
|
|
|
+│ └─ aidop_probe.py # 只读预检
|
|
|
+├─ providers/
|
|
|
+│ ├─ mock_api.py # API_PULL 对端
|
|
|
+│ └─ mock_db.py # MySQL 建表、装载、清理
|
|
|
+├─ catalog/
|
|
|
+│ ├─ entities.json # 对象与三通道能力矩阵
|
|
|
+│ └─ samples/*.json # canonical 样例
|
|
|
+├─ static/ # 本地页面资源
|
|
|
+├─ tests/
|
|
|
+└─ README.md
|
|
|
+```
|
|
|
+
|
|
|
+不要求另起完整 Vue/npm 工程。页面只承担配置、编辑样例、发起操作和显示结果。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 三种方式的第一阶段设计
|
|
|
+
|
|
|
+### 6.1 DB_SYNC
|
|
|
+
|
|
|
+#### 模拟端
|
|
|
+
|
|
|
+- 使用独立 MySQL schema,例如 `aidop_integration_sim`;
|
|
|
+- 按 canonical 样例生成第三方源表;
|
|
|
+- 每张表必须有稳定业务键;
|
|
|
+- 增量对象必须有单调递增时间列;
|
|
|
+- 支持重置、装载、追加、更新四种动作;
|
|
|
+- 所有业务键以 `SIM-{runId}-` 开头;
|
|
|
+- 模拟库只充当第三方源库,不写 Ai-DOP 库。
|
|
|
+
|
|
|
+#### Ai-DOP 侧前置
|
|
|
+
|
|
|
+- `mdp_source.source_type=DB`;
|
|
|
+- `conn_mode=EXTERNAL`;
|
|
|
+- 配置测试数据库连接;
|
|
|
+- `mdp_entity.source_table_name`、`target_table_name`、`incr_column`、业务键正确;
|
|
|
+- 按既有模块入口触发同步或重建。
|
|
|
+
|
|
|
+#### 基础验收
|
|
|
+
|
|
|
+- 连接测试成功;
|
|
|
+- 首次同步写入贴源;
|
|
|
+- 再次同步不重复;
|
|
|
+- 更新增量列后只处理新增/更新数据;
|
|
|
+- `mdp_sync_log` 有可解释状态;
|
|
|
+- 贴源行 `source_system` 为专用模拟来源。
|
|
|
+
|
|
|
+### 6.2 API_PULL
|
|
|
+
|
|
|
+#### 模拟端
|
|
|
+
|
|
|
+- 提供 GET 接口;
|
|
|
+- 支持 `data.list` 响应路径;
|
|
|
+- 每行带稳定 `bizKey` 或配置对应去重路径;
|
|
|
+- 支持 cursor 入参;
|
|
|
+- 支持 NONE、Bearer/Token、Basic、APIKey 的基础联调;
|
|
|
+- 可返回 200、401、403、429、500 和延迟响应;
|
|
|
+- 第一阶段每次返回完整当前批,不实现复杂多页循环。
|
|
|
+
|
|
|
+#### Ai-DOP 侧前置
|
|
|
+
|
|
|
+- `mdp_source.source_type=API`;
|
|
|
+- 配置 base URL 与鉴权;
|
|
|
+- `mdp_entity.source_api_path`;
|
|
|
+- `response_data_path`;
|
|
|
+- `dedup_key_path`;
|
|
|
+- 增量对象配置 cursor 语义。
|
|
|
+
|
|
|
+#### 基础验收
|
|
|
+
|
|
|
+- Ai-DOP 能带正确认证调用 Mock;
|
|
|
+- 能从 `data.list` 取行;
|
|
|
+- 去重键稳定;
|
|
|
+- cursor 能推进;
|
|
|
+- 鉴权失败和服务端错误有可解释结果;
|
|
|
+- 贴源数据与 canonical 样例一致。
|
|
|
+
|
|
|
+### 6.3 API_INBOUND
|
|
|
+
|
|
|
+#### 模拟端
|
|
|
+
|
|
|
+- 本地服务读取 AccessKey 与 Secret;
|
|
|
+- Secret 只驻留服务端内存;
|
|
|
+- 自动生成 timestamp、nonce、body SHA256、幂等键和 HMAC 签名;
|
|
|
+- 支持契约版本头;
|
|
|
+- 支持全部七类入站操作;
|
|
|
+- 允许编辑 JSON 或 NDJSON;
|
|
|
+- 支持重复发送相同幂等键;
|
|
|
+- 不在页面或运行日志显示 Secret。
|
|
|
+
|
|
|
+#### Ai-DOP 侧前置
|
|
|
+
|
|
|
+- 开放身份已绑定测试租户;
|
|
|
+- grant 与 entityCode 已授权;
|
|
|
+- entity 已开启 inbound;
|
|
|
+- 来源为专用 `API_INBOUND` 测试来源;
|
|
|
+- 限流与 IP 白名单允许本机测试。
|
|
|
+
|
|
|
+#### 基础验收
|
|
|
+
|
|
|
+- schema 可读;
|
|
|
+- 普通推数返回 202;
|
|
|
+- receipt 可按批次查询;
|
|
|
+- 相同幂等键同报文返回幂等回放;
|
|
|
+- 相同幂等键不同报文返回冲突;
|
|
|
+- 错误签名、过期时间戳、nonce 重放被拒;
|
|
|
+- bulk、快照和 digest 可完成基础成功用例;
|
|
|
+- `mdp_inbound_request` 与贴源数据可对账。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 业务范围
|
|
|
+
|
|
|
+### 7.1 统一业务样例目录
|
|
|
+
|
|
|
+样例目录以业务页第 5 章确认表和技术页字段为基线,至少覆盖:
|
|
|
+
|
|
|
+- 物料、客户、供应商、货源清单、库位、员工;
|
|
|
+- 销售订单头、销售订单行、合同评审、齐套核验;
|
|
|
+- 生产工单、工序计划、工单用料、报工;
|
|
|
+- 交货计划、采购订单、采购申请、收货、供应商发货、来料检验、退货、欠料;
|
|
|
+- 出入库流水、库存期初、月度库存金额、现存量;
|
|
|
+- 成品报检、成品入库、成品结存;
|
|
|
+- 业务页明确要求的关联日期、数量、状态、业务类型、审核状态。
|
|
|
+
|
|
|
+同一场景中的订单号、工单号、采购单号、物料编码必须可关联。
|
|
|
+
|
|
|
+### 7.2 API_INBOUND 当前 26 个代码契约
|
|
|
+
|
|
|
+第一阶段模拟器须识别:
|
|
|
+
|
|
|
+```text
|
|
|
+MDM_ITEM
|
|
|
+MDM_CUSTOMER
|
|
|
+MDM_SUPPLIER
|
|
|
+MDM_LOCATION
|
|
|
+MDM_SOURCE_LIST
|
|
|
+MDM_EMPLOYEE_HEADCOUNT
|
|
|
+S1_SALES_ORDER_ENTRY
|
|
|
+S1_REQUIREMENT_EXAMINE_RESULT
|
|
|
+S1_REQUIREMENT_EXAMINE_DETAIL
|
|
|
+S2_WORK_ORDER_SCHEDULE
|
|
|
+S3_PURCHASE_ORDER
|
|
|
+S3_PURCHASE_RECEIPT
|
|
|
+S4_SHIPMENT
|
|
|
+S4_IQC
|
|
|
+S4_RETURN
|
|
|
+S4_SHORTAGE
|
|
|
+S5_WORK_ORDER_BOM
|
|
|
+S5_INVENTORY_TXN
|
|
|
+S5_INVENTORY_OPENING_BALANCE
|
|
|
+S5_INVENTORY_BALANCE_MONTHLY
|
|
|
+S6_WORK_ORDER_LINE
|
|
|
+S6_REPORT_TXN
|
|
|
+S7_FQC_TASK_TXN
|
|
|
+S7_SALES_ORDER_LINE
|
|
|
+S7_FINISHED_ONHAND
|
|
|
+S7_FINISHED_OPENING_BALANCE
|
|
|
+```
|
|
|
+
|
|
|
+支持某 entityCode 不等于运行配置已开通。预检结果必须分别显示:
|
|
|
+
|
|
|
+- `CODE_SUPPORTED`;
|
|
|
+- `CONFIG_NOT_REGISTERED`;
|
|
|
+- `CONFIG_NOT_ENABLED`;
|
|
|
+- `GRANT_MISSING`;
|
|
|
+- `READY`;
|
|
|
+- `DATA_NOT_RUN`;
|
|
|
+- `RUN_SUCCEEDED`;
|
|
|
+- `RUN_FAILED`。
|
|
|
+
|
|
|
+### 7.3 通道能力矩阵
|
|
|
+
|
|
|
+| 对象类型 | DB_SYNC | API_PULL | API_INBOUND |
|
|
|
+|---|:---:|:---:|:---:|
|
|
|
+| 技术页已开通的 20 个推数对象 | 可模拟 | 可模拟 | 可模拟 |
|
|
|
+| 客户/供应商/库位/货源 | 可模拟 | 可模拟 | 代码有契约,配置可能未开 |
|
|
|
+| 齐套结果头/明细 | 可模拟 | 可模拟 | 代码有契约,贴源配置待核 |
|
|
|
+| 销售订单头/合同评审 | 可模拟 | 可模拟 | 当前无契约 |
|
|
|
+| 交货计划/MRP/采购申请 | 可模拟 | 可模拟 | 当前无契约 |
|
|
|
+| 工序计划/排产 | 可模拟 | 可模拟 | 当前无契约 |
|
|
|
+| 现存量/过程检验/成品入库 | 可模拟 | 可模拟 | 当前无契约 |
|
|
|
+
|
|
|
+### 7.4 第一阶段跨对象基础场景
|
|
|
+
|
|
|
+至少提供三组样例:
|
|
|
+
|
|
|
+1. **订单制造链**:物料 → 销售订单 → 工单 → 工单用料 → 报工;
|
|
|
+2. **采购执行链**:供应商 → 采购订单 → 供应商发货 → 收货/IQC → 退货;
|
|
|
+3. **库存与成品链**:期初 → v2 出入库流水 → 成品报检 → 成品结存。
|
|
|
+
|
|
|
+API_INBOUND 无对应契约的节点必须在运行图中显示“该通道不支持”,不能跳过后仍宣称全链路完整。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. 页面设计
|
|
|
+
|
|
|
+### 8.1 首页
|
|
|
+
|
|
|
+显示:
|
|
|
+
|
|
|
+- Ai-DOP 目标地址;
|
|
|
+- 模拟数据库状态;
|
|
|
+- Mock API 状态;
|
|
|
+- API_INBOUND 凭证是否已加载;
|
|
|
+- 三种方式的可用对象数量;
|
|
|
+- 最近运行结果。
|
|
|
+
|
|
|
+### 8.2 对象测试页
|
|
|
+
|
|
|
+用户选择:
|
|
|
+
|
|
|
+- 业务对象;
|
|
|
+- 对接方式;
|
|
|
+- 样例;
|
|
|
+- 运行编号;
|
|
|
+- 契约版本;
|
|
|
+- 操作类型。
|
|
|
+
|
|
|
+页面展示:
|
|
|
+
|
|
|
+- 请求/源数据预览;
|
|
|
+- 预检结果;
|
|
|
+- 执行结果;
|
|
|
+- 脱敏 Headers;
|
|
|
+- HTTP 状态和响应;
|
|
|
+- 后续人工核验提示;
|
|
|
+- 明确的代码/配置/数据层结论。
|
|
|
+
|
|
|
+### 8.3 环境安全页
|
|
|
+
|
|
|
+- 只允许 `localhost`、明确的开发/UAT 地址;
|
|
|
+- 生产目标默认阻断;
|
|
|
+- Secret 只从环境变量或启动输入读取;
|
|
|
+- 页面不可读取 Secret;
|
|
|
+- 运行记录自动脱敏;
|
|
|
+- 不提供“保存密码”按钮。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 9. 安全与数据隔离
|
|
|
+
|
|
|
+1. 测试数据业务键统一加 `SIM-{runId}-`;
|
|
|
+2. 默认只允许测试租户;
|
|
|
+3. 三种通道使用不同 `source_code`,共享一个测试 `system_code`;
|
|
|
+4. 模拟数据库与 Ai-DOP 数据库必须是不同 schema/连接;
|
|
|
+5. 不在 Git 中写入任何密码、Secret、JWT 或真实连接串;
|
|
|
+6. 导出报告不含认证头、Secret、数据库密码和完整敏感 payload;
|
|
|
+7. 删除测试数据不由模拟器直接执行,第一阶段只提供运行编号和清理清单;
|
|
|
+8. API_INBOUND 不接受 body 中任意 tenantId 改变目标租户;
|
|
|
+9. 生产 URL 必须显式传入二次解锁参数方可调用,且第一阶段验收禁止使用生产。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 10. 两阶段交付
|
|
|
+
|
|
|
+### 10.1 第一阶段:基础实现
|
|
|
+
|
|
|
+交付:
|
|
|
+
|
|
|
+- 独立本地控制台;
|
|
|
+- MySQL 模拟源库;
|
|
|
+- 第三方 Mock GET API;
|
|
|
+- API_INBOUND 签名客户端;
|
|
|
+- 统一样例目录;
|
|
|
+- 三通道对象能力矩阵;
|
|
|
+- 三种方式的基础成功/失败用例;
|
|
|
+- API_INBOUND 26 契约与 7 类操作;
|
|
|
+- 三组跨对象基础场景;
|
|
|
+- 脱敏运行记录;
|
|
|
+- 启动与配置说明;
|
|
|
+- 人工 SQL/API 验收清单。
|
|
|
+
|
|
|
+完成条件:
|
|
|
+
|
|
|
+- 任一具备配置的对象可选择三种方式之一执行;
|
|
|
+- 同一 canonical 样例可供三种方式转换使用;
|
|
|
+- 三条路径均经过 Ai-DOP 真实执行器;
|
|
|
+- 结果能明确定位到代码、配置或数据层;
|
|
|
+- 不依赖修改 Ai-DOP 业务代码即可完成基础联调。
|
|
|
+
|
|
|
+### 10.2 第二阶段:增强
|
|
|
+
|
|
|
+交付:
|
|
|
+
|
|
|
+- SQL Server 模拟库;
|
|
|
+- 场景编排与依赖自动排序;
|
|
|
+- 并发、限流、超时、乱序、断点、重试和错误注入;
|
|
|
+- 自动查询标准层、DWD、KPI 与看板 API;
|
|
|
+- 三通道同业务结果差异报告;
|
|
|
+- 历史报告与趋势;
|
|
|
+- CLI/CI;
|
|
|
+- Docker Compose;
|
|
|
+- Playwright 页面回归;
|
|
|
+- 契约漂移检测;
|
|
|
+- 当前无 API_INBOUND 契约对象的扩展项目衔接。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 11. 验收口径
|
|
|
+
|
|
|
+### 11.1 代码层验收
|
|
|
+
|
|
|
+- DB_SYNC 确实经过 `MdpDbPullExecutor`;
|
|
|
+- API_PULL 确实经过 `MdpApiPullExecutor`;
|
|
|
+- API_INBOUND 确实经过 `MdpInboundController`;
|
|
|
+- 未新增直接写 Ai-DOP 业务表的旁路;
|
|
|
+- 签名算法有固定向量测试;
|
|
|
+- canonical 样例到三种通道的适配有单元测试。
|
|
|
+
|
|
|
+### 11.2 配置层验收
|
|
|
+
|
|
|
+- 每个对象显示来源、实体、目标贴源、业务键、增量列;
|
|
|
+- API_INBOUND 显示 entity 是否启用及 grant 是否可用;
|
|
|
+- 配置未开时明确停止,不自动改生产配置;
|
|
|
+- 同一标准对象不会误把三种来源同时设为生产权威。
|
|
|
+
|
|
|
+### 11.3 数据层验收
|
|
|
+
|
|
|
+- DB_SYNC:`mdp_sync_log`、游标、贴源来源分布可对账;
|
|
|
+- API_PULL:贴源 raw_data、业务键、cursor 可对账;
|
|
|
+- API_INBOUND:request、receipt、accepted/rejected、贴源可对账;
|
|
|
+- 三种方式都能查到最新业务日期;
|
|
|
+- “未产生数据”不能写成“代码未实现”。
|
|
|
+
|
|
|
+### 11.4 第一阶段完成判据
|
|
|
+
|
|
|
+第一阶段完成不等于所有 KPI 已有值。完成判据是:
|
|
|
+
|
|
|
+1. 三种入站方式都至少有一个对象真实跑通;
|
|
|
+2. 业务/技术详表的全部数据包都有通道能力标记;
|
|
|
+3. API_INBOUND 的已存在 26 个代码契约都能执行 schema 预检;
|
|
|
+4. 已配置的推数实体能执行普通 POST;
|
|
|
+5. 七类推数操作均有基础测试;
|
|
|
+6. 未配置或无契约对象能得到正确的分层结论;
|
|
|
+7. 三组基础业务场景可以装载和执行;
|
|
|
+8. 凭据与测试数据隔离要求全部满足。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 12. 反向影响推演
|
|
|
+
|
|
|
+### 12.1 代码调用面
|
|
|
+
|
|
|
+- DB_SYNC 会经过所有调用 `MdpSourcePullDispatcher` 的模块同步/重建入口;
|
|
|
+- API_PULL 与 DB_SYNC 共用分发和贴源写入;
|
|
|
+- API_INBOUND 进入接收、镜像、中立投影和模块重建;
|
|
|
+- 第一阶段不修改这些主链,只新增独立工具。
|
|
|
+
|
|
|
+结论:**无主链代码改动;真实模拟流量会触发既有同步和重建。**
|
|
|
+
|
|
|
+### 12.2 数据契约面
|
|
|
+
|
|
|
+- 三种方式最终写同类贴源与标准对象;
|
|
|
+- 错误业务键可能覆盖同来源旧数据;
|
|
|
+- 日期、数量、业务类型、审核状态缺失会导致 HTTP 成功但指标无值;
|
|
|
+- `S5_INVENTORY_TXN` 周转类场景必须使用 v2 中立契约。
|
|
|
+
|
|
|
+结论:**需同步维护统一样例目录和字段映射;业务键必须测试隔离。**
|
|
|
+
|
|
|
+### 12.3 多数据源面
|
|
|
+
|
|
|
+- 三种来源不能用同一 `source_code`;
|
|
|
+- 同一标准对象生产时只能有一个权威来源;
|
|
|
+- 模拟运行只能使用测试来源,不得改变现有 T8、165、自建单或真实第三方来源。
|
|
|
+
|
|
|
+结论:**需三个测试 source_code 和共同 system_code;不得抢占生产来源。**
|
|
|
+
|
|
|
+### 12.4 多租户 / Domain 面
|
|
|
+
|
|
|
+- API_INBOUND 租户由开放身份决定;
|
|
|
+- DB_SYNC/API_PULL 按来源、实体和租户来源登记决定;
|
|
|
+- Domain 是业务域字段,不得替代 tenant_id;
|
|
|
+- canonical 样例必须可配置 Domain,但不能由此跨租户。
|
|
|
+
|
|
|
+结论:**只允许测试租户;运行前必须显示最终目标租户。**
|
|
|
+
|
|
|
+### 12.5 运行面
|
|
|
+
|
|
|
+- 需要本地 MySQL、Python Mock 服务和 Ai-DOP 开发/UAT 环境;
|
|
|
+- 真实请求会占用限流、nonce、同步任务和重建队列;
|
|
|
+- 大批量运行可能影响共享开发库;
|
|
|
+- 生产地址和凭据必须硬阻断。
|
|
|
+
|
|
|
+结论:**第一阶段默认低频单批,批量压测放第二阶段。**
|
|
|
+
|
|
|
+### 12.6 验证面
|
|
|
+
|
|
|
+- 现有 `push_demo.py` 仅覆盖推数部分场景;
|
|
|
+- 现有 `mock_api` 可复用但缺统一控制与结果分层;
|
|
|
+- 模拟 DB 尚缺完整样例物化;
|
|
|
+- 当前缺三通道同样例自动比较。
|
|
|
+
|
|
|
+结论:**第一阶段补基础守卫与人工对账,第二阶段补全链自动对账。**
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 13. 风险与控制
|
|
|
+
|
|
|
+| 风险 | 控制 |
|
|
|
+|---|---|
|
|
|
+| 测试数据污染真实业务 | 专用租户、来源、`SIM-{runId}` 业务键 |
|
|
|
+| Secret 泄漏 | 只在本地服务内存,日志和报告脱敏 |
|
|
|
+| 配置没开被误判为代码缺失 | 三层状态码与 schema 预检 |
|
|
|
+| HTTP 成功被误判为业务出数 | 第一阶段报告分“摄取成功”和“下游待核” |
|
|
|
+| 三种来源相互覆盖 | 不同 source_code,共同 system_code,仅测试来源 |
|
|
|
+| 大量数据触发重建压力 | 第一阶段单批低频,默认限制行数 |
|
|
|
+| API_PULL Mock 超出执行器能力 | 严格遵循现有 GET、data path、cursor 契约 |
|
|
|
+| MySQL 单引擎不能代表 SQL Server | 明确列为第二阶段方言回归 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 14. 决策结论
|
|
|
+
|
|
|
+1. 模拟器作为独立工具建设,不进入 Ai-DOP 菜单;
|
|
|
+2. 第一阶段同时覆盖 DB_SYNC、API_PULL、API_INBOUND;
|
|
|
+3. 第一阶段数据库模拟只做 MySQL,SQL Server 放第二阶段;
|
|
|
+4. 三种方式共用 canonical 样例,但保持独立 source_code;
|
|
|
+5. API_INBOUND 覆盖现有 26 个代码契约与 7 类操作;
|
|
|
+6. 业务页中无推送契约的对象仍通过 DB_SYNC/API_PULL 测试;
|
|
|
+7. 第一阶段不改 Ai-DOP 业务主链,不自动写生产配置;
|
|
|
+8. 方案实施以配套初步任务书为准。
|