Files
2026-07-27 16:46:15 +08:00

44 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 通知失败筛选与诊断连续性审计
## 结论
事件中心的通知搜索与送达状态筛选已经从“只过滤当前 20 条”下沉到服务端完整范围。接口在分页前统一执行搜索、阅读状态和送达状态过滤,因此列表、总数、页码与空状态使用同一份结果,不再出现“当前页 0 条、总数仍为 9 条、却提示继续翻页”的矛盾。
生产存储也不再把通知统一映射为“已送达”:数据库中的 `failed` 会保留为失败,其余站内通知按可见投递结果归一为已送达。失败详情明确说明当前只提供诊断与刷新,不会自动重发;事件、收件人和服务商证据继续保留,并提供关联事件入口。后端尚无通知重发接口和幂等键,因此本轮没有伪造不安全的“重试”动作。
## 交互步骤与证据
1. **失败筛选基线(不健康)**
选择“仅发送失败”后,旧实现只过滤当前页,页面同时显示“本页 0 条”和“共 9 条”,但分页已经是 `1/1`
![旧版失败筛选矛盾状态](./01-before-failed-filter-desktop.png)
2. **完整范围失败筛选(健康)**
同一桌面尺寸下,服务端返回完整范围的真实结果:空状态、`共 0 条 · 本页 0 条``1/1` 完全一致,并提供“查看全部通知”恢复入口。
![新版完整范围失败筛选](./02-after-failed-filter-desktop.png)
3. **移动端恢复入口(健康)**
390 × 844 下,搜索、阅读状态、送达状态与恢复入口保持单列可触达,没有横向滚动或被固定导航遮挡。
![移动端失败筛选](./03-after-failed-filter-mobile.png)
4. **完整范围搜索(健康)**
搜索“氢”由服务端返回 1 条结果,列表与 `共 1 条 · 本页 1 条` 同步,证明搜索不是当前页二次过滤。
![服务端完整范围搜索](./04-after-server-search-desktop.png)
5. **前后视觉对照(健康)**
相同 1440 × 900 状态下,对照确认总数与空状态的逻辑断层已消失。
![失败筛选前后对照](./05-before-after-failed-filter-comparison.jpg)
## 验证
- 事件中心专项43 项通过。
- Web 正式套件78 个测试文件、508 项通过。
- API`go test ./...` 全量通过。
- 生产构建TypeScript、Vite 构建与发布资产门禁通过。
- 浏览器1440 × 900 桌面、390 × 844 手机真实本地前后端联调通过。
## 无障碍与证据边界
- 搜索框、阅读状态、送达状态、恢复按钮和分页保留可访问名称;移动端主要触控目标可完整触达。
- 当前 Mock 数据没有真实服务商失败样本,所以截图证明的是完整范围筛选、可信计数和恢复入口;失败详情的“只读诊断、不会重发”、关联事件与刷新动作由组件回归测试覆盖。
- 本轮未执行屏幕阅读器或真实键盘全流程测试,不能把 DOM 语义检查等同于辅助技术验收。