Keystone / Synapse Development Design
+数据明细中心
+在数据运维下新增统一的 episode 明细工作台,承接原质检中心、云同步中心和数据生产统计明细卡片的“查看、筛选、单条操作”需求。第一版只做分页明细、筛选、单条质检/同步操作和历史抽屉,不做批量、不做顶部统计卡、不做导出。
+背景
+质检中心、云同步中心和数据生产统计中的明细记录卡片都在解决同一类需求:查看和筛选 episode 级别的数据记录。三处各自维护明细列表会造成字段、筛选、分页、操作栏和状态语义重复。
+本设计将 episode 明细查看能力收敛到一个新页面:数据明细。质检和同步不再作为独立列表页面存在,而是成为数据明细中的筛选维度、状态列和行级操作。
数据明细 只负责 episode 明细查询和单条操作;统计页继续负责汇总、趋势和分布。
+ 目标与非目标
+目标
+-
+
- 新增 Synapse 管理后台
数据运维 / 数据明细页面。
+ - 默认展示全部 episode,按
created_at DESC, id DESC分页。
+ - 支持 QA 状态、云同步状态、时间、场景、设备类型、设备 ID 和数采员筛选。 +
- 表格展示 episode 基础信息、最近 QA、云同步状态和创建时间。 +
- 行级支持详情、预览、下载、重新质检、同步/重新同步/重试、QA 历史和同步历史。 +
- 新增统一列表 API:
GET /api/v1/data-ops/episodes。
+ - 删除前端
质检中心和云同步中心页面入口。
+ - 删除数据生产统计中的明细记录卡片。 +
非目标
+-
+
- 第一版不做批量质检。 +
- 第一版不做批量同步。 +
- 第一版不做顶部统计卡或状态汇总卡。 +
- 第一版不做 CSV/筛选结果导出。 +
- 第一版不一步到位清理全部旧后端 API。 +
- 第一版不支持 data_collector、display 或其他非 admin 角色。 +
- 第一版不在主列表展示 MCAP、sidecar、cloud destination 等长路径字段。 +
筛选设计
+筛选交互参考 DataProductionStatistics.vue:基础筛选 + 高级筛选 + RemoteSelect 多选。用户看到名称,API 传稳定 ID 或业务标识。
基础筛选
+复用统计页的时间 presets 和自定义时间输入。数据明细默认不限最近 7 天,仍按分页加载全部数据。
+查询时重置到第一页;重置清空筛选并回到默认排序。
+高级筛选
+| 筛选项 | +UI | +API 参数 | +规则 | +
|---|---|---|---|
| 场景 | +RemoteSelect 多选 |
+ scene_id=12,13 |
+ 下拉显示场景名称,传场景 ID。 | +
| 设备类型 | +RemoteSelect 多选 |
+ robot_type_id=3,5 |
+ 下拉显示设备类型名称/型号,传 robot_type ID。 | +
| 设备 ID | +RemoteSelect 多选 |
+ robot_device_id=robot-001,robot-002 |
+ 精确匹配 robots.device_id。 |
+
| 数采员 | +RemoteSelect 多选 |
+ collector_operator_id=op001,op002 |
+ 精确匹配 data_collectors.operator_id。 |
+
| QA 状态 | +多选 | +qa_status=failed,pending_qa |
+ 直接复用 episodes.qa_status,支持逗号多选。 |
+
| 云同步状态 | +多选 | +sync_status=not_started,failed |
+ 复用当前同步状态,并补充 not_started。 |
+
QA 状态筛选
+云同步状态筛选
+表格与行级操作
+表格列
+| 列 | +内容 | +说明 | +
|---|---|---|
| Episode | +episode_id + numeric id |
+ 主标识,点击详情。 | +
| 任务 | +task_public_id / task_id |
+ 展示任务业务 ID,缺失时回退 numeric ID。 | +
| 场景 | +scene_name |
+ 第一版不强制展示 subscene。 | +
| 机器人 | +robot_type + robot_device_id |
+ 设备类型和设备 ID 上下两行展示。 | +
| 采集员 | +collector_operator_id |
+ 展示工号。 | +
| QA 状态 | +qa_status + quality_flag 摘要 |
+ 状态 badge + 一行质量说明。 | +
| 最近质检 | +latest_qa_check |
+ 展示检查项、通过/失败、时间和摘要。 | +
| 云同步 | +sync_status + latest_sync_log |
+ 状态沿用云同步中心,缺少日志时为 not_started。 |
+
| 创建时间 | +created_at |
+ 默认排序字段。 | +
| 操作 | +固定在最右侧 | +sticky action column,和其他管理表格一致。 | +
不进入主列表的字段
+操作列
+直接展示 详情、预览、更多。其他操作放入更多菜单,避免操作列过宽。
| 操作 | +位置 | +规则 | +
|---|---|---|
| 详情 | +直接按钮 | +跳转现有 EpisodeDetail。 |
+
| 预览 | +直接按钮 | +qa_status=failed 时禁用,后端仍为最终门禁。 |
+
| 下载 MCAP | +更多菜单 | +qa_status=failed 时禁用。 |
+
| 下载 JSON | +更多菜单 | +不受 MCAP QA 失败影响。 | +
| 重新质检 | +更多菜单 | +qa_status=qa_running 时禁用;复用现有 QA suite API。 |
+
| 同步 / 重试 / 重新同步 | +更多菜单 | +按 sync_status 和 cloud_synced 选择文案;QA 未通过时禁用。 |
+
| QA 历史 | +更多菜单 | +当前页右侧抽屉展示。 | +
| 同步历史 | +更多菜单 | +当前页右侧抽屉展示。 | +
后端 API
+第一版新增统一列表 API;单条 QA 和同步操作暂时复用现有 API,不一步到位迁移到 data-ops 命名空间。
列表接口
+GET /api/v1/data-ops/episodes
+ ?limit=20
+ &offset=0
+ &created_at_from=2026-06-01T00:00:00Z
+ &created_at_to=2026-06-06T23:59:59Z
+ &qa_status=failed,pending_qa
+ &sync_status=not_started,failed
+ &scene_id=12,13
+ &robot_type_id=3,5
+ &robot_device_id=robot-001,robot-002
+ &collector_operator_id=op001,op002
+
+ 响应示例
+{
+ "items": [
+ {
+ "id": 123,
+ "episode_id": "ep_20260606_001",
+ "task_id": 88,
+ "task_public_id": "task_20260606_001",
+ "scene_name": "pick",
+ "robot_type_id": 3,
+ "robot_type": "arm_bot",
+ "robot_device_id": "robot-001",
+ "collector_operator_id": "op001",
+ "qa_status": "failed",
+ "quality_flag": "MCAP integrity check failed: tail magic mismatch",
+ "latest_qa_check": {
+ "check_name": "mcap_magic",
+ "passed": false,
+ "details": "MCAP integrity check failed: tail magic mismatch",
+ "checked_at": "2026-06-06T09:30:00Z"
+ },
+ "sync_status": "not_started",
+ "latest_sync_log": null,
+ "cloud_synced": false,
+ "duration_sec": 30.5,
+ "file_size_bytes": 123456789,
+ "labels": ["recalled_batch"],
+ "created_at": "2026-06-06T09:20:00Z"
+ }
+ ],
+ "total": 1234,
+ "limit": 20,
+ "offset": 0,
+ "hasNext": true,
+ "hasPrev": false
+}
+
+ 复用的现有单条能力
+| 能力 | +接口 | +说明 | +
|---|---|---|
| 重新质检 | +POST /api/v1/qa/episodes/:id/run |
+ 运行完整 QA suite。 | +
| QA 历史 | +GET /api/v1/qa/episodes/:id/checks |
+ 右侧抽屉展示。 | +
| 同步 | +POST /api/v1/sync/episodes/:id |
+ 未同步或失败重试时使用。 | +
| 重新同步 | +POST /api/v1/sync/episodes/:id/resync |
+ 已同步时使用。 | +
| 同步历史 | +GET /api/v1/sync/episodes/:id/logs |
+ 右侧抽屉展示。 | +
| 同步状态 | +GET /api/v1/sync/episodes/:id/status |
+ EpisodeDetail 可继续使用;数据明细列表由统一 API 返回。 | +
查询策略与数据库压力控制
+统一 API 不能写成一个巨型 join。后端应采用分页主查询 + 当前页附加状态查询的方式,把 QA 和同步查询限制在当前页 episode IDs 内。
+从 episodes 出发按筛选和排序查出 20/50 条 episode。
提取当前页 episode IDs,后续查询只围绕这些 ID。
+按 episode_id IN (...) 查询每个 episode 最新 QA 记录。
按 episode_id IN (...) 查询每个 episode 最新 sync log。
在 Go 侧组装 latest_qa_check、sync_status 和 latest_sync_log。
同步状态映射
+| 条件 | +sync_status |
+ 展示 | +
|---|---|---|
| 无 sync log | +not_started |
+ 未同步 | +
latest sync log = pending |
+ pending |
+ 已入队 | +
latest sync log = in_progress |
+ in_progress |
+ 同步中 | +
latest sync log = completed |
+ completed |
+ 已同步 | +
latest sync log = failed |
+ failed |
+ 失败 | +
索引建议
+-
+
- 确认
episodes(created_at, id)或等价索引用于默认排序。
+ - 确认
episodes(qa_status, created_at, id)或现有 QA 状态索引能支撑筛选。
+ - 确认
qa_checks(episode_id, checked_at, id)支撑当前页 latest QA 查询。
+ - 确认
sync_logs(episode_id, id)或sync_logs(episode_id, started_at, id)支撑当前页 latest sync 查询。
+
前端实现
+| 文件/模块 | +动作 | +说明 | +
|---|---|---|
src/views/admin/data-ops/DataDetails.vue |
+ 新增 | +不要把 QACenter.vue 改名硬扩展;新页面从 episode 综合视角实现。 |
+
src/api/dataOps.js |
+ 新增 | +封装 GET /data-ops/episodes。 |
+
src/components/layout/AdminSidebar.vue |
+ 调整 | +数据运维下只保留 数据明细。 |
+
src/router/index.js |
+ 调整 | +新增 /admin/data-details,删除 qa-center 和 cloud-sync 路由。 |
+
src/views/admin/qa/QACenter.vue |
+ 删除 | +页面不再保留。 | +
src/views/admin/sync/CloudSyncCenter.vue |
+ 删除 | +页面不再保留。 | +
src/api/qa.js |
+ 保留 | +DataDetails 和 EpisodeDetail 仍复用单条 QA 操作/历史。 | +
src/api/sync.js |
+ 保留 | +DataDetails 和 EpisodeDetail 仍复用单条同步操作/历史。 | +
页面交互
+-
+
- 筛选 UI 参考数据生产统计页,使用基础筛选和可折叠高级筛选。 +
- 表格操作列固定在最右侧,横向滚动时始终展示。 +
- QA 历史和同步历史使用右侧抽屉,不离开当前筛选上下文。 +
- 详情跳转现有 EpisodeDetail。 +
- EpisodeDetail 保留现有操作,并与 DataDetails 共用文案和状态规则。 +
数据生产统计调整
+数据生产统计 后续只回答汇总、趋势、分布和统计导出,不再展示具体 episode 明细。
明细记录卡片、明细表格、明细分页、明细 API 调用,以及只服务明细表格的状态和 formatter。
+顶部筛选器、汇总指标、趋势图、维度分布和统计导出能力。
+测试计划
+Keystone
+-
+
GET /api/v1/data-ops/episodes默认分页返回全部 episode。
+ - 支持
qa_status多选筛选。
+ - 支持
sync_status多选筛选,包含not_started。
+ - 支持时间范围、scene_id、robot_type_id、robot_device_id 和 collector_operator_id 筛选。 +
- 列表响应包含当前页 latest QA 和 latest sync。 +
- 无 sync log 的 episode 返回
sync_status=not_started。
+ - 复杂筛选下 total、hasNext、hasPrev 正确。 +
Synapse
+-
+
- 数据运维菜单只展示
数据明细。
+ /admin/data-details页面可分页加载。
+ - 筛选 UI 参考数据生产统计页,可查询和重置。 +
- 操作列固定在最右侧。 +
- 详情、预览、下载、重新质检、同步/重试/重新同步按状态启用/禁用。 +
- QA 历史和同步历史抽屉可打开并展示数据。 +
- 数据生产统计不再展示明细记录卡片。 +
已确认决策
+-
+
- 新增页面名称为
数据明细,路由为/admin/data-details。
+ - 后续不保留
质检中心和云同步中心页面,不考虑旧路由兼容。
+ - 数据生产统计删除明细记录卡片,只保留聚合能力。 +
- 默认展示全部 episode,按
created_at DESC, id DESC分页。
+ - 第一版保留
total,但不做顶部统计卡和多状态聚合 count。
+ - 后端新增统一列表 API,但查询实现必须采用分页主查询 + 当前页 QA/sync 附加查询。 +
- 筛选 UI 参考数据生产统计页,API 参数使用
scene_id和robot_type_id。
+ - QA 状态直接复用
episodes.qa_status。
+ - 云同步状态复用
pending/in_progress/completed/failed,额外补not_started。
+ - 第一版不做批量、不做导出、不支持非 admin 角色。 +
- 旧单条 QA/sync API 暂时保留并复用,后续再分阶段清理旧列表 API。 +