通知失败幂等重试审计
日期:2026-07-23
范围:事件中心 → 通知记录 → 失败送达详情与人工重试
健康度
已从“失败只读诊断、外部渠道不可见”提升为可审计的受控恢复链路。核心权限、幂等、尝试上限、客户车辆范围与真假送达语义均有服务端约束。外部渠道的真实服务商投递仍由仓库之外的发送工作进程负责,因此本轮只承诺重新入队,不承诺已经送达。
发现与修复
- 生产查询原先固定筛选
in_app,短信、邮件和企业通讯失败无法进入通知中心;现在返回全部渠道,并支持按送达状态、阅读状态和关键字做完整范围筛选、分页与总数统计。 - 站内通知原先长期停留在
created,前端只能显示“发送中”;现在持久化写入即形成sent证据,外部渠道继续保持真实的reserved / failed / sent状态。 - 数据表原先缺少尝试次数、服务商消息 ID、失败原因、最近尝试与重试操作者;迁移
034_alert_notification_retry.sql补齐送达元数据和不可变重试审计。 - 新增失败通知安全重试:需要当前尝试序号、原因与幂等键,最多三次;相同幂等键只返回原回执,不重复入队。
- 重试权限仅开放给管理员和操作员;客户通知查询和已读写入均按授权 VIN 隔离。阅读状态只属于站内信,外部渠道明确显示“不适用”。
- 详情侧栏新增服务商证据、尝试次数、恢复提示、送达时间线和最近 20 条重试审计;确认窗在写入前展示渠道、收件人、尝试变化和不可提前标记成功的边界。
- 桌面侧栏初次视觉复核发现恢复卡的文案被三枚操作按钮挤成窄列,已改为“证据说明 + 独立操作行”,移动端使用 42px 以上操作目标并保持单列滚动。
证据
- 改造前,失败筛选没有可见记录:
01-before-failed-notification-empty.png - 桌面失败详情与修正后的恢复操作:
02-after-failed-notification-detail-desktop.png - 桌面安全重试确认:
03-after-retry-confirmation-desktop.png - 390 × 844 移动端详情与恢复操作:
04-after-failed-notification-mobile.png
验证
go test ./...:通过- Web 正式套件:78 个测试文件、518 项测试通过
- 事件中心专项:45 项测试通过
- 生产构建:Web、开放门户与 Go 二进制全部通过
- 真实浏览器:1440 × 900 与 390 × 844;确认窗只做视觉检查,没有提交真实重试
无障碍与限制
- 失败详情、恢复区域、审计区和确认窗具有明确 landmark、可访问名称与状态提示;主要动作均可由键盘聚焦,提交按钮会在原因不足时禁用。
- 移动端底部导航与详情固定说明之间没有横向溢出,长内容保持单一侧栏滚动。
- 本轮未执行屏幕阅读器人工走查,也未覆盖第三方短信、邮件或企业通讯服务商的生产凭据、限流、死信与回调;这些仍需在真实发送工作进程中验证。