与管理后台“数据统计”按数采员筛选时完全一致,使用现有统计 SQL 里的 collector_operator_id 口径。
Synapse Operator Portal
+数采员个人数据产量设计
++ 本文档固化“数采员登录 Synapse 后查看自己每天数据产量”的产品口径、页面范围、API 形态和实现边界。 + 目标是在不影响管理后台统计页的前提下,复用现有数据生产统计能力。 +
+ +1. 已确认决策
+新增数采员门户页面 /operator/production,侧边栏文案为“我的产量”。数采员门户不再保留原普通生产仪表板入口。
默认展示“今天”。其他时间筛选交互尽量与管理后台统计页面一致。
+“今天”按浏览器本地时区切日,趋势接口继续传 timezone_offset。
保留摘要卡、趋势图、维度分布。不做明细表,不做 CSV 导出。
+个人页不展示云同步率,不展示云同步状态筛选,也不提供按云同步状态分布。
++ 注意:当前口径会沿用管理后台统计页的现有归属方式。它通过 episode/workstation/data_collector 关系得出数采员, + 不在本次需求中新增 episode 历史归属快照字段。 +
+2. 页面设计
+ +2.1 路由与文案
+| 位置 | +内容 | +
|---|---|
| 路由 | +/operator/production |
+
| 侧边栏 | +我的产量 | +
| 页面标题 | +我的数据产量 | +
| 趋势区标题 | +产量趋势 | +
| 分布区标题 | +维度分布 | +
2.2 页面模块
+| 模块 | +内容 | +默认行为 | +
|---|---|---|
| 摘要卡 | +数据条数、总时长、总大小、QA 通过率 | +基于当前时间范围和筛选条件展示 | +
| 产量趋势 | +数量 / 时长 / 大小 三个视图 | +默认展示数量 | +
| 维度分布 | +设备 ID、设备类型、场景、SOP、QA 状态 | +默认按设备 ID | +
2.3 筛选项
+时间筛选与管理后台统计页保持一致,默认值改为今天。高级筛选保留以下 5 项:
++ 场景 + SOP + 设备 ID + 设备类型 + QA 状态 +
+不显示“数采员”筛选,因为后端永远强制当前登录数采员 scope。不显示“云同步状态”筛选。
+ +2.4 空态与错误态
+-
+
- 当前时间范围没有数据时,摘要卡显示 0 或空值格式化后的 0。 +
- 趋势图展示空时间轴或 0 值,不弹错误提示。 +
- 维度分布展示“暂无数据”。 +
- 只有接口失败、登录过期或权限异常时显示错误 banner。 +
3. API 设计
+ +3.1 新增路径
+新增 operator 专用统计路径,复用管理后台数据生产统计 handler 的核心查询逻辑。
+GET /api/v1/operator/statistics/data-production/summary
+GET /api/v1/operator/statistics/data-production/trend
+GET /api/v1/operator/statistics/data-production/breakdown
+
+ 3.2 不提供的路径
+-
+
- 不提供
details,因为个人页不展示明细表。
+ - 不提供
export,因为个人页不做 CSV 导出。
+
3.3 认证与权限
+| 规则 | +说明 | +
|---|---|
| 认证 | +JWTAuth |
+
| 角色 | +RequireRole("data_collector") |
+
| 本人 scope | +后端从 JWT claims 读取 OperatorID,强制覆盖查询中的 collector_operator_id。 |
+
| 越权参数 | +如果请求传入其他 collector_operator_id,不返回 403,直接忽略并仍然查询本人。 |
+
3.4 查询参数
+保留管理后台统计接口已有参数中的子集:
+| 参数 | +用途 | +个人页状态 | +
|---|---|---|
start_time, end_time |
+ 统计时间范围,RFC3339 | +保留 | +
granularity |
+ 趋势粒度:hour/day/week/month | +保留 | +
timezone_offset |
+ 趋势本地时间分桶 | +trend 保留 | +
scene_id, sop_id |
+ 场景与 SOP 筛选 | +保留 | +
robot_device_id, robot_type_id |
+ 设备筛选 | +保留 | +
qa_status |
+ QA 状态筛选 | +保留 | +
collector_operator_id |
+ 数采员筛选 | +请求中忽略,由后端强制为本人 | +
cloud_synced |
+ 云同步状态筛选 | +个人页不传、不展示 | +
4. 实现建议
+ +4.1 Keystone
+-
+
- 在
DataProductionStatisticsHandler中新增 operator 注册方法,例如RegisterOperatorRoutes。
+ - 新增 scope helper:解析通用 query 后,将
CollectorOperatorIDs覆盖为[]string{claims.OperatorID}。
+ - operator 的
summary、trend、breakdown复用现有查询与 response 结构。
+ - 不要把 admin 路由改成 data_collector 可访问,避免污染管理后台权限边界。 +
- 新增测试覆盖:data_collector 传入别人
collector_operator_id时仍只查询本人。
+
4.2 Synapse
+-
+
- 新增 API wrapper,例如
operatorDataProductionStatistics.js,endpoint 指向/operator/statistics/data-production。
+ - 新增页面
OperatorDataProduction.vue,新写个人页,不大拆管理后台统计页。
+ - 在
router/index.js增加/operator/production路由。
+ - 在
OperatorSidebar.vue增加“我的产量”入口。
+ - 复用现有格式化函数、ECharts 初始化思路、
RemoteSelect组件和管理后台统计页的筛选交互。
+
+ 前端页面应是管理后台统计页的个人精简版,而不是抽象出一个大而全的共享组件。 + 这样可以降低对现有 admin 页面的回归风险。 +
+5. 验收清单
+-
+
- 数采员登录后可从侧边栏进入“我的产量”。 +
- 默认时间范围为今天,并按浏览器本地时区切日。 +
- 页面展示 4 个摘要卡:数据条数、总时长、总大小、QA 通过率。 +
- 趋势图支持数量、时长、大小切换,默认数量。 +
- 维度分布支持设备 ID、设备类型、场景、SOP、QA 状态,默认设备 ID。 +
- 高级筛选支持场景、SOP、设备 ID、设备类型、QA 状态。 +
- 个人页不展示数采员筛选、云同步指标、云同步筛选、明细表、CSV 导出。 +
- 请求中手动传入其他
collector_operator_id时,后端仍返回当前登录数采员的数据。
+ - 没有数据时页面正常显示 0 和“暂无数据”,不报错。 +
- admin 数据统计页行为保持不变。 +