build_campaign_timeline flattens a campaign's child Runs into offset-sorted
per-Run entries (distinct from the report's 12-bucket aggregation), reusing a
shared _run_window_offset口径 so both views place a run identically. Exposes
GET /campaigns/{id}/timeline and the api.ts type/call. (v0.6 ticket 06)
1.5 KiB
1.5 KiB
07 — ①时间倍速反向输入
What to build: 让用户在新增活动时按「耗时」而非「倍速」思考。表单把裸的「时间倍速」输入换成「窗口长度(预设 6/12/24/48/72h)」+「希望加速后多久跑完」两项,系统实时派生并只读展示倍速与「加速后约 X 完成」;提交时前端把派生出的 time_scale 放进现有 payload(后端 API 契约与 time_scale 语义完全不变)。「实时」开关一键设为真实墙钟(倍速 ×1、禁用目标耗时输入)。目标耗时若 > 窗口(倍速 <1)表单校验拦截。活动列表/详情处也改用「加速后约 X 完成」展示,取代裸 ×N。
Blocked by: 无 —— 可立即开始(不依赖后端改动)。
Status: ready-for-agent
- 新增纯 util(如
campaignTime.ts):deriveTimeScale(windowSeconds, targetSeconds)与acceleratedDuration(windowSeconds, timeScale),作为唯一口径。 - 新增表单:窗口长度下拉 + 目标加速耗时(数值+单位,默认分钟)+「实时」开关;只读展示派生倍速与「加速后约 X 完成」。
- 校验:目标耗时 ≤ 窗口长度(倍速 ≥1),违反时拦截并给出提示(US-4)。
- 提交仍发
time_scale,POST /campaigns契约不变。 - 活动列表与详情用
acceleratedDuration展示「加速后约 X 完成」,替换裸倍速列。 npx tsc --noEmit+npm run build通过;浏览器实操验证派生/实时开关/校验/列表展示。