# 变更提案: admin-frontend-dashboard-rank-24h-compare

## 元信息
```yaml
类型: 缺陷修复
方案类型: implementation
优先级: P1
状态: 已完成
创建: 2026-04-24
```

---

## 1. 需求

### 背景
用户反馈 `admin-frontend` 仪表盘中的“节点流量排行 / 用户流量排行”在 `24h` 视图下，右侧趋势百分比始终显示 `0%`。当前期望是：`24h` 口径应与“昨天同日统计”做对比，而不是固定归零。

### 目标
- 修复 `24h` 排行涨跌百分比的对比窗口。
- 保持本轮范围最小，只处理 `24h` 口径，不改动 `7天 / 30天` 的既有对比方式。
- 为排行项补充 hover 详情卡，并把当前流量值移动到右侧强化展示。

### 约束条件
```yaml
范围约束: 仅修复 admin 仪表盘 traffic rank 的 24h 对比逻辑
技术约束: 后端做 24h 定点修复，前端仅做排行 hover 信息与右侧值展示的增量调整
业务约束: 24h 必须与昨天整日统计对比；7天/30天 本轮保持现状
验证约束: 本地无 composer vendor，无法直接跑 Laravel/PHPUnit；优先执行 admin-frontend 构建验证
```

### 验收标准
- [ ] `stat/getTrafficRank` 在单日窗口下返回的 `change` 不再因昨日统计行被排除而全部回退为 `0`
- [ ] 节点排行与用户排行共用同一修复逻辑
- [ ] 排行项 hover 时可看到“当前流量 / 上期流量 / 变化率”详情
- [ ] 当前流量值固定在排行项右侧，视觉上不再被节点名吞没
- [ ] `admin-frontend` 构建通过
- [ ] `.helloagents` 变更记录已同步

---

## 2. 方案

### 根因
后端 `StatUserJob / StatServerJob` 会把日统计记录写入当天 `00:00:00` 的 `record_at`。现有 `getTrafficRank` 在单日窗口下使用“当前秒级跨度回推上一窗口”的方式计算：

- 当前窗口：`2026-04-24 00:00:00 ~ 2026-04-24 23:59:59`
- 旧逻辑上一窗口起点：`2026-04-23 00:00:01`

这样会把昨天 `00:00:00` 的整日统计记录排除掉，导致 `previousValue = 0`，最终 `change` 全部落回 `0`。

### 修复策略
1. 在 `StatController` 中新增单独的对比窗口解析方法。
2. 当当前窗口是单日口径时，上一窗口直接固定为 `start_time - 86400 ~ start_time`，精确命中昨天整日统计。
3. 多日窗口沿用现有等跨度逻辑，避免超出本轮范围。
4. 前端排行项补充 `ElTooltip` 悬浮详情卡，并将当前流量值右移到独立右侧列。
5. 增加单元测试覆盖窗口计算规则，便于后续回归。

---

## 3. 技术决策

### admin-frontend-dashboard-rank-24h-compare#D001: 仅修复 24h 与昨天对比逻辑，7天/30天 保持现状
**日期**: 2026-04-24
**状态**: ✅采纳
**背景**: 用户在确认阶段明确选择“只修复 24h，对昨天同时间窗口比较；7天 / 30天 保持现状”。
**决策**: 后端只对单日窗口切换为“昨天整日”比较，多日窗口不在本轮调整。
**理由**: 与用户确认范围一致，改动最小，回归风险最低。

### admin-frontend-dashboard-rank-24h-compare#D002: 排行项补充 hover 详情卡，并将当前流量右移显示
**日期**: 2026-04-24
**状态**: ✅采纳
**背景**: 用户补充要求鼠标移入节点排行时展示“当前 / 上期 / 变化率”，并指出当前流量值放在左侧不够明显。
**决策**: 节点 / 用户排行统一复用 tooltip 详情卡，同时把当前流量值移到右侧与涨跌列组合显示。
**理由**: 复用同一排行结构即可满足需求，且不会引入新的页面层级或交互负担。
