## 目标
- 补齐工作台 4 个模块的真实数据接口与前端对接：订单转化漏斗、活动中奖分析、用户概述、抽奖动态文案完善。

## 后端接口设计（统一前缀 `/api/admin/dashboard`）
### 1) 订单转化漏斗 `GET /order_funnel`
- 入参：`rangeType=today|7d|30d|custom`，`start/end`（custom 时必填）
- 出参：`FunnelData[]`（与 `web/admin/src/api/operations.ts` 定义一致）
- 统计口径：
  - 访问用户：优先取 `log_request` 中 `path LIKE '/api/app/%'` 的唯一访问（去重 `tid` 或 IP/UA），范围时间内（`internal/repository/mysql/model/log_request.gen.go:13-27`）
  - 下单用户：`orders.created_at` 范围内下单的唯一用户数（`orders.status` 任意）（`internal/repository/mysql/model/orders.gen.go:13-33`）
  - 支付用户：`orders.status=2`（已支付）范围内唯一用户数
  - 完成订单：订单完成的判定（二选一并取并集）：`orders.status=2 AND is_consumed=1` 或存在 `shipping_records.status IN (2,3)`（已发货/已签收）（`internal/repository/mysql/model/shipping_records.gen.go:13-31`）
- 返回各阶段 `count`，并计算 `rate`（相对上一阶段）与 `lostCount`。

### 2) 活动中奖分析 `GET /activity_prize_analysis`
- 入参：`activity_id`（必填），可选 `rangeType`
- 出参：`ActivityPrizeAnalysis`（`activity` + `prizes[]` + `summary`，与前端类型一致）
- 统计口径：
  - 奖品模板：`activity_reward_settings`（`issue_id` 归属同活动的期）（`internal/repository/mysql/model/activity_reward_settings.gen.go:13-27`）
  - 中奖统计：`activity_draw_logs` 按 `reward_id` 分组统计 `winCount`（`is_winner=1`），`drawCount` 为期内抽奖总次数（`internal/repository/mysql/model/activity_draw_logs.gen.go:13-24`）
  - 概率（设置）：`weight/Σweight*100`（模板无显式概率字段，采用权重归一化）
  - 概率（实际）：`winCount/drawCount*100`
  - 成本：若模板 `product_id` 非空，关联 `products.price` 作为单件成本（`internal/repository/mysql/model/products.gen.go:13-25`）；否则成本为 0 或采用等级默认表（可配置）
  - 活动信息：`activities` + `activity_issues` 组合（名称、时间范围、参与人数=distinct `user_id`，总抽奖次数）

### 3) 用户概述 `GET /user_overview`
- 入参：`rangeType`
- 出参：包含：
  - `chart`: 最近 N 个时间桶（默认 9 个月）用户注册量序列（来源 `users.created_at`）
  - `metrics`: `totalUsers`（系统总量）、`totalVisits`（`log_request` 中 `/api/app/%` 请求计数）、`dailyVisits`（当天 `/api/app/%`）、`weeklyGrowth`（近 7 天 vs 上 7 天访问增幅）
- 说明：若实际“访问”定义需更严格，可后续改为埋点表；当前采用请求日志近似。

### 4) 抽奖动态增强 `GET /draw_stream`（已有）
- 增加字段：`activityName`、`issueNumber`、`prizeName`（中奖时）
- 数据来源：`activity_issues`、`activities`、`activity_reward_settings.name`
- 现有实现位置：`internal/api/admin/dashboard_admin.go:270-317`（将补充字段）

### 5) 通用
- 时间范围工具沿用：`parseRange/previousWindow/daysBetween`（`internal/api/admin/dashboard_admin.go:365-417`），对 `custom` 做 30 天上限；趋势分桶工具已实现（`normalizeGranularity/buildBuckets`）。
- 路由注册：在 `adminAuthApiRouter` 添加新端点（参考 `internal/router/router.go:63` 附近已有 dashboard 路由）。

## 前端改动
- 文件：`web/admin/src/api/operations.ts`
  - `fetchOrderFunnel(range)` → `GET admin/dashboard/order_funnel`
  - `fetchActivityList()` → `GET admin/dashboard/activities`（返回 `id,name,type,start,end,status,totalDraws,totalParticipants`；也可直接用现有 `GET /api/admin/activities` 的列表按需映射）
  - `fetchActivityPrizeAnalysis(activityId)` → `GET admin/dashboard/activity_prize_analysis`
  - `fetchUserOverview(range)`（新增） → `GET admin/dashboard/user_overview`
- 组件对接：
  - `order-funnel.vue` 已调用 `fetchOrderFunnel`（`web/admin/src/views/dashboard/console/modules/order-funnel.vue:148-153`），直接切换数据源即可。
  - `activity-prize-analysis.vue` 使用 `fetchActivityList/fetchActivityPrizeAnalysis`（`web/admin/src/views/dashboard/console/modules/activity-prize-analysis.vue:219-225`、`344-357`、`367-375`），切换到真实 API。
  - `active-user.vue` 当前为静态数据（`web/admin/src/views/dashboard/console/modules/active-user.vue:31-46`），改为使用 `fetchUserOverview` 渲染条形图与 4 个指标。
  - `dynamic-stats.vue` 增强显示中奖文案：“用户在【活动-期】中奖【奖品名】”（使用新增字段），保留参与与中奖标签（`web/admin/src/views/dashboard/console/modules/dynamic-stats.vue`）。

## 返回示例
- `GET /api/admin/dashboard/order_funnel`：`[{"stage":"访问用户","count":12580,"rate":100,"lostCount":0}, ...]`
- `GET /api/admin/dashboard/activity_prize_analysis`：结构与前端定义一致，概率为权重归一化。
- `GET /api/admin/dashboard/user_overview`：`{"chart":[{"date":"2025-03","value":1200},...],"metrics":{"totalUsers":12345,"totalVisits":45678,"dailyVisits":1234,"weeklyGrowth":"+8%"}}`
- `GET /api/admin/dashboard/draw_stream`：增加 `activityName/issueNumber/prizeName` 字段。

## 验收
- 工作台四模块均显示真实数据；各接口性能在默认范围（≤30 天）内响应合理。
- 环比与趋势计算准确；异常/空数据有合理降级。

## 后续可选优化
- 为 `log_request.created_at`、`orders.created_at`、`shipping_records.status`、`activity_draw_logs.created_at` 增加索引。
- 活动奖品“成本”可从商品资料或运营配置独立维护，避免 0 值。

确认后我将：
1. 补充 3 个新端点与 `draw_stream` 字段；注册路由；
2. 替换 `operations.ts` 的 Mock 为真实请求；
3. 调整前端 3 个模块的渲染逻辑；
4. 进行构建与联调，提供验证指令与预览链接。