From 7d851b39e8e9bd3053c74fc4721e960e6742137c Mon Sep 17 00:00:00 2001 From: shark Date: Sun, 17 May 2026 22:38:05 +0800 Subject: [PATCH 01/17] feat(production): add big screen overview API --- .../synapse-production-big-screen-tasks.md | 414 +++++++ docs/designs/synapse-production-big-screen.md | 1024 +++++++++++++++++ internal/api/handlers/production_dashboard.go | 610 +++++++++- .../api/handlers/production_dashboard_test.go | 70 +- 4 files changed, 2115 insertions(+), 3 deletions(-) create mode 100644 docs/designs/synapse-production-big-screen-tasks.md create mode 100644 docs/designs/synapse-production-big-screen.md diff --git a/docs/designs/synapse-production-big-screen-tasks.md b/docs/designs/synapse-production-big-screen-tasks.md new file mode 100644 index 0000000..fa6d33d --- /dev/null +++ b/docs/designs/synapse-production-big-screen-tasks.md @@ -0,0 +1,414 @@ + + +# Synapse 生产大屏任务拆解 + +**Scope:** Keystone `worktree2` 与 Synapse `worktree2` 后续开发任务 + +## 1. 目的 + +本文档把 `synapse-production-big-screen.md` 中的设计和技术方案拆成可执行开发任务。它不重复设计愿景,只定义开发顺序、依赖关系、修改范围、验收标准和推荐 PR 切分。 + +后续开发应同时参考: + +- `docs/designs/synapse-production-big-screen.md` +- 本任务拆解文档 + +## 2. 拆分原则 + +- 先数据契约,再前端数据层,再页面布局,最后动画和验收。 +- 每个任务尽量能独立验证,避免一个 PR 同时大改后端、数据层、布局和动画。 +- 第一版以 MVP 为目标,不新增告警表,不做独立告警栏,不做视频转码服务,不引入 WebSocket 和重型动画库。 +- 前端优先消费聚合 API;只有 API 不可用或字段暂缺时使用集中 fallback。 +- 改动优先复用现有文件和模式,避免新建过多平行体系。 + +## 3. 推荐 PR 切分 + +| PR | 任务 | 仓库 | 是否阻塞后续 | 目标 | +|---|---|---|---|---| +| PR-1 | 后端 overview 聚合 API | `keystone-worktree2` | 是 | 建立大屏数据契约 | +| PR-2 | 前端 overview 数据层 | `synapse-worktree2` | 是 | 建立 API client、adapter、fallback | +| PR-3 | 大屏响应式基础布局 | `synapse-worktree2` | 是 | 页面能展示完整数据区域 | +| PR-4 | Video Flight Stage MVP | `synapse-worktree2` | 否 | 实现预览轮播状态机和 fallback | +| PR-5 | 图表、设备、任务流打磨 | `synapse-worktree2` | 否 | 补齐生产指挥中心信息密度 | +| PR-6 | 电视视口和稳定性验收 | `synapse-worktree2`,必要时 `keystone-worktree2` | 否 | 修正响应式、性能和边界问题 | + +如果需要更快出第一版展示,PR-3 可以先接 mock/fallback 数据并与 PR-2 并行,但最终必须回到 overview API 契约。 + +## 4. 任务清单 + +### T1. 后端 overview API 契约与基础响应 + +**仓库:** `keystone-worktree2` + +**目标:** 在现有 `ProductionDashboardHandler` 中新增面向大屏的 `GET /api/v1/production/dashboard/overview`。 + +**依赖:** 无。 + +**建议修改范围:** + +- `internal/api/handlers/production_dashboard.go` +- `internal/api/handlers/production_dashboard_test.go` +- `docs/docs.go`、`docs/swagger.*`,如果项目要求同步 Swagger + +**实现要点:** + +- 复用现有 `resolveProductionDashboardScope()`、查询参数解析、只读事务和 scope 过滤。 +- 新增 overview response structs。 +- 第一版返回完整结构,即使部分数组为空。 +- `summary`、`trend`、`task_status_distribution`、`devices`、`recent_tasks` 优先实现。 +- 第一版不返回独立 `alerts` 字段,不建设告警栏;设备离线、任务失败、接口降级等异常内联展示在顶部状态、设备状态和任务流中。 +- `previews.video_url` 可以为空,但如果非空必须是真实可播放视频 URL;为空时返回 episode/task 元信息和可解析的 `preview_url`,保证前端可复用数据预览页播放 MCAP 图像帧。 + +**验收标准:** + +- `GET /api/v1/production/dashboard/overview` 需要 JWT,允许 `admin` 和 `data_collector`。 +- `data_collector` 自动限定到绑定工位。 +- 空数据返回 200,数值为 0,数组为空。 +- 参数错误返回 400,未认证返回 401。 +- 响应包含 `generated_at`、`scope`、`summary`、`trend`、`task_status_distribution`、`quality`、`devices`、`recent_tasks`、`previews`。 +- `previews.video_url` 为空时仍有 `title`、`task_name`、`robot_name`、`station_name`、`status`、`created_at`;有 MCAP 时返回 `preview_url`;`video_url` 非空时必须是真实可播放视频。 + +**验证命令:** + +```bash +go test ./internal/api/handlers/... -run ProductionDashboard -v +gofmt -w internal/api/handlers/production_dashboard.go internal/api/handlers/production_dashboard_test.go +``` + +**风险:** + +- 今日任务和全量任务口径容易混淆;接口字段名必须明确。 +- 设备在线率需要确认规则,第一版可以沿用 workstation status。 + +### T2. 后端 overview 查询补齐 + +**仓库:** `keystone-worktree2` + +**目标:** 在 T1 基础上补齐更有展示价值的字段,不引入新表。 + +**依赖:** T1。 + +**建议修改范围:** + +- `internal/api/handlers/production_dashboard.go` +- `internal/api/handlers/production_dashboard_test.go` + +**实现要点:** + +- `trend` 增加 `failed`。 +- `devices.items` 增加 `current_task`、`station_name`、`last_seen_at`,字段缺失时返回空字符串。 +- `recent_tasks` 覆盖最近完成、失败、进行中的任务。 +- `quality.recent_failures` 如果查询成本可控则实现,否则保留空数组。 + +**验收标准:** + +- overview 中 `trend` 每个点包含 `completed`、`in_progress`、`pending`、`failed`。 +- `recent_tasks` 按最近更新时间倒序,受 `recent_limit` 限制。 +- 所有 limit 参数有上限,避免大屏接口返回过大。 + +**验证命令:** + +```bash +go test ./internal/api/handlers/... -run ProductionDashboard -v +go test ./... ./cmd/keystone-edge/... +``` + +**风险:** + +- `sync_logs` 或 episode join 较复杂时,异常状态可以先只通过任务流和设备状态表达,避免阻塞前端。 + +### T3. 前端 overview API client 与数据 adapter + +**仓库:** `synapse-worktree2` + +**目标:** 增加前端大屏数据入口,优先消费 overview API。 + +**依赖:** T1,或临时使用 mock 契约并在 T1 合入后对齐。 + +**建议修改范围:** + +- `src/api/productionDashboard.js` +- `src/features/production/useProductionBigScreenData.js` +- 可选:`src/features/production/productionBigScreenMock.js` + +**实现要点:** + +- `useProductionDashboardApi()` 增加 `overview(params)`。 +- 新增 composable 管理 `loading`、`error`、`lastUpdatedAt`、`usingFallback`、`overview`。 +- adapter 统一补默认值,避免模板写大量空值判断。 +- API 失败时保留上一份成功数据;无历史数据时使用集中 mock fallback。 +- 定时刷新默认 15s 或 30s,后续可配置。 + +**验收标准:** + +- API 成功、失败、空数据均返回稳定的数据结构。 +- fallback 数据集中定义,不散落在 Vue 模板。 +- composable `onUnmounted` 时清理 polling timer。 +- 不打断 Video Flight Stage 当前播放状态,数据层只更新队列数据。 + +**验证命令:** + +```bash +npm run build +``` + +**风险:** + +- 真实 API 字段和 mock 字段不一致会造成返工;adapter 必须成为唯一入口。 + +### T4. 大屏响应式基础布局 + +**仓库:** `synapse-worktree2` + +**目标:** 改造 `/admin/dashboard` 对应页面,建立生产指挥中心基础布局。此阶段先不追求复杂视频动画。 + +**依赖:** T3。 + +**建议修改范围:** + +- `src/views/FullscreenDashboard.vue` +- 可选:`src/components/production/BigScreenKpiStrip.vue` +- 可选:`src/components/production/BigScreenStatusRail.vue` +- 可选:`src/components/production/BigScreenTaskFeed.vue` +- 可选:`src/components/production/BigScreenTrendPanel.vue` +- `src/styles/dashboard-light.css` 或新建大屏专用 CSS 文件 + +**实现要点:** + +- 保留 `/admin/dashboard` 路由。 +- 建立顶部状态栏、KPI、中央舞台占位、趋势、设备状态和任务流;不设置独立告警栏。 +- 使用 CSS Grid、Flexbox、`clamp()`、`minmax()`、`aspect-ratio`。 +- 核心 KPI 和视频舞台在所有断点优先展示。 +- `1366x768` 下可减少列表条数,但不能横向滚动或文字重叠。 + +**验收标准:** + +- `1920x1080` 下首屏能看到 KPI、中央舞台、设备健康和异常状态。 +- `3840x2160` 下内容不显得过小或过空。 +- `1366x768` 下不横向滚动,不出现明显文字重叠。 +- 没有视频数据时中央舞台显示稳定占位。 + +**验证命令:** + +```bash +npm run build +``` + +**手动检查视口:** + +- `3840x2160` +- `2560x1440` +- `1920x1080` +- `1600x900` +- `1366x768` + +**风险:** + +- 如果一次拆太多组件,会增加 PR 审查成本;优先按职责拆少量组件。 + +### T5. Video Flight Stage MVP + +**仓库:** `synapse-worktree2` + +**目标:** 实现视频/预览轮播舞台状态机和克制飞行动效。 + +**依赖:** T3、T4。 + +**建议修改范围:** + +- `src/components/production/VideoFlightStage.vue` +- `src/views/FullscreenDashboard.vue` +- 大屏相关 CSS + +**实现要点:** + +- 状态机:`loading`、`entering`、`playing`、`leaving`、`error`。 +- 只播放当前条目;带真实 `video_url` 时使用 `