# 变更提案: admin-frontend-dashboard-rank-24h-compare ## 元信息 ```yaml 类型: 缺陷修复 方案类型: implementation 优先级: P1 状态: 已完成 创建: 2026-04-24 ``` --- ## 1. 需求 ### 背景 用户反馈 `admin-frontend` 仪表盘中的“节点流量排行 / 用户流量排行”在 `24h` 视图下,右侧趋势百分比始终显示 `0%`。当前期望是:`24h` 口径应与“昨天同日统计”做对比,而不是固定归零。 ### 目标 - 修复 `24h` 排行涨跌百分比的对比窗口。 - 保持本轮范围最小,只处理 `24h` 口径,不改动 `7天 / 30天` 的既有对比方式。 ### 约束条件 ```yaml 范围约束: 仅修复 admin 仪表盘 traffic rank 的 24h 对比逻辑 技术约束: 优先做后端定点修复,不改动前端排行展示结构 业务约束: 24h 必须与昨天整日统计对比;7天/30天 本轮保持现状 验证约束: 本地无 composer vendor,无法直接跑 Laravel/PHPUnit 全量测试 ``` ### 验收标准 - [ ] `stat/getTrafficRank` 在单日窗口下返回的 `change` 不再因昨日统计行被排除而全部回退为 `0` - [ ] 节点排行与用户排行共用同一修复逻辑 - [ ] 修改文件通过基础语法校验 - [ ] `.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. 增加单元测试覆盖窗口计算规则,便于后续回归。 --- ## 3. 技术决策 ### admin-frontend-dashboard-rank-24h-compare#D001: 仅修复 24h 与昨天对比逻辑,7天/30天 保持现状 **日期**: 2026-04-24 **状态**: ✅采纳 **背景**: 用户在确认阶段明确选择“只修复 24h,对昨天同时间窗口比较;7天 / 30天 保持现状”。 **决策**: 后端只对单日窗口切换为“昨天整日”比较,多日窗口不在本轮调整。 **理由**: 与用户确认范围一致,改动最小,回归风险最低。