All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 12m9s
H5 进入资产时已同步弹窗展示临期提醒,通知中心再记未读会重复提醒; 通知按剩余天数每天新增一条,保持未读会持续累积红点。 直发通知载荷新增可选 mark_read,仅临期个人通知设置,其他直发通知与店铺临期通知仍为未读。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 lines
2.7 KiB
Markdown
28 lines
2.7 KiB
Markdown
## 1. 停用个人客户预发布
|
||
|
||
- [x] 1.1 `internal/infrastructure/packageexpiry/reminder_publisher.go` 的 `Publish` 去掉给绑定客户批量写个人通知的循环,保留 `appendShopNotification`。
|
||
|
||
## 2. 进入资产时提醒
|
||
|
||
- [x] 2.1 `pkg/constants/redis.go` 新增去重键(客户 ID + 资产标识 + 上海日期)及 TTL 计算(当天结束加缓冲)。
|
||
- [x] 2.2 资产信息服务按当前资产复用 `packageexpiry` 最终到期推算;命中窗口时依次:检查键 → 经 Outbox 写 `package.expiring` 个人通知(事件号 `pex:资产:到期日:剩余天数:客户`)→ `SET NX` → 抢到才返回字段;写通知失败不占键不返回;Redis 不可用按未提醒处理。
|
||
- [x] 2.3 资产信息响应 DTO 新增临期提醒字段(剩余天数、到期时间、等级),更新接口说明。
|
||
|
||
## 3. 通知中心过滤
|
||
|
||
- [x] 3.1 个人通知列表、未读数与“全部已读”对 `type = package.expiring AND ref_type = asset` 只保留 `ref_key` 等于当前资产标识(卡 ICCID;设备虚拟号,空则 IMEI)的记录,其他类型不变,入参不变。
|
||
|
||
## 4. 文档与测试环境验证
|
||
|
||
- [x] 4.1 `gofmt`、`go build ./cmd/api ./cmd/worker`、`go run cmd/gendocs/main.go`。
|
||
- [x] 4.2 按 ENG-TEST-001(测试库 `junhong_cmp_test`、Redis DB 6)构造同一客户绑定两个临期资产:进入 A 只返回 A 的字段并新增 A 的通知,通知中心与未读数只含 A;在 A 中“全部已读”后 B 的临期通知仍未读;同一天再次进入 A 不返回字段、不新增通知;清理键模拟第二天后再次提醒;客户 B 进入 A 独立提醒一次;非临期通知不受过滤。
|
||
- [x] 4.3 手动触发每日扫描:不再给个人客户写临期通知,店铺通知照常。
|
||
- [ ] 4.4 运行 `openspec validate --all` 与 `./scripts/context-health.sh`。
|
||
|
||
## 5. 临期个人通知写入即已读
|
||
|
||
- [x] 5.1 `internal/application/notification/delivery.go`:直发载荷新增可选 `mark_read`(默认 false);`deliverOne` 标记为 true 时写 `is_read=true`、`read_at=now`;审计 `after_data` 按实际已读状态记录。
|
||
- [x] 5.2 `internal/infrastructure/packageexpiry/reminder_publisher.go` 的 `appendNotification` 设置 `mark_read=true`;`appendShopNotification` 不变。
|
||
- [ ] 5.3 测试环境验证(AGENTS.md 规定自动化测试 N/A,不写单元测试):临期个人通知以已读创建;换货发货、自动续费等直发通知仍为未读;店铺临期通知仍为未读。
|
||
- [ ] 5.4 `gofmt`、`go build ./cmd/api ./cmd/worker`、`go run cmd/gendocs/main.go`(已通过,接口文档无变化);部署后测试环境验证:进入卡 89860624590014594318(已造好临期数据,10-20 到期)后,新通知 `is_read=true`,个人未读数不变。
|