This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-08-11
|
||||
@@ -0,0 +1,38 @@
|
||||
## Context
|
||||
|
||||
当前临期资产查询已统一筛选最终到期可精确推算、剩余 0 至 15 个上海自然日的卡和设备,并在同一投影中计算颜色等级。提醒候选在此结果上再次限定为 15、7、3 天,造成 14、13 至 0 天的大多数日期漏发。
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:**
|
||||
- 让临期窗口内的资产每天产生一次可幂等投递的提醒。
|
||||
- 保持既有列表范围、颜色等级、通知接收人和 Outbox 投递链路。
|
||||
|
||||
**Non-Goals:**
|
||||
- 不修改临期窗口长度、颜色阈值、通知模板、接收人解析或数据库结构。
|
||||
- 不补写历史漏发日期;上线后的当天扫描按当前剩余天数创建一次提醒。
|
||||
|
||||
## Decisions
|
||||
|
||||
### 复用临期列表候选集
|
||||
|
||||
提醒候选直接保留统一临期查询返回的全部项目,不再按 15、7、3 天二次筛选。该查询已经排除负天数、超过 15 天和不可精确推算的资产,避免维护第二套范围规则。
|
||||
|
||||
备选方案是在提醒查询中复制范围条件;该方案会与列表规则漂移,予以排除。
|
||||
|
||||
### 以既有事件身份实现每日幂等
|
||||
|
||||
继续使用包含最终到期日期和剩余天数的事件身份。剩余天数每天变化,因此每日扫描产生当天的一次提醒;同日重试仍命中同一身份,不重复投递。
|
||||
|
||||
备选方案是新增扫描日期字段或去重表;现有事件身份已满足每日去重,无需新增持久化事实。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- [通知量从三个节点增加到最多十六天] → 保持当前异步 Outbox 批量投递与接收人幂等。
|
||||
- [部署前已错过的历史扫描不会自动回补] → 上线后可执行一次手动扫描,生成当天仍在窗口内资产的提醒。
|
||||
|
||||
## Migration Plan
|
||||
|
||||
1. 部署 Worker 与 API 代码。
|
||||
2. 执行一次手动临期扫描,验证窗口内资产生成当天提醒。
|
||||
3. 回滚时恢复原代码;不涉及 Schema 或数据回滚。
|
||||
@@ -0,0 +1,26 @@
|
||||
## Why
|
||||
|
||||
套餐临期提醒当前只在剩余 15、7、3 个上海自然日时发送,导致处于其他临期天数的资产没有每日提醒。临期颜色分级与提醒频率是不同规则,需恢复 0 至 15 天内每日提醒。
|
||||
|
||||
## What Changes
|
||||
|
||||
- 每日临期扫描对最终到期时间可精确推算、剩余 0 至 15 个上海自然日的资产每天创建提醒。
|
||||
- 保持粉色(8 至 15 天)、紫色(4 至 7 天)、红色(0 至 3 天)仅作为列表展示分级,不参与提醒候选筛选。
|
||||
- 更新手动扫描、任务与接口说明,明确其执行每日临期提醒扫描。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
无。
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
- `notification-delivery`: 套餐临期通知的发送条件由三个固定节点改为临期窗口内每日发送。
|
||||
- `asset-device`: 临期资产列表的颜色等级继续仅表示展示等级,不作为提醒触发条件。
|
||||
|
||||
## Impact
|
||||
|
||||
- `internal/query/packageexpiry` 的提醒候选筛选。
|
||||
- 临期提醒任务、路由 OpenAPI 文案及站内通知 Outbox 事件数量。
|
||||
- 不新增依赖、接口字段或数据库 Schema。
|
||||
@@ -0,0 +1,9 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 临期颜色等级仅用于展示
|
||||
系统 SHALL 对剩余 8 至 15 个上海自然日的临期资产返回粉色等级、对剩余 4 至 7 天返回紫色等级、对剩余 0 至 3 天返回红色等级。颜色等级 MUST 不改变资产是否进入每日临期提醒扫描的条件。
|
||||
|
||||
#### Scenario: 红色资产仍每日提醒
|
||||
- **GIVEN** 一项资产剩余 2 个上海自然日且存在有效通知接收人
|
||||
- **WHEN** 查询临期资产列表并执行每日临期扫描
|
||||
- **THEN** 列表返回红色等级,且扫描创建当天的套餐临期通知
|
||||
@@ -0,0 +1,14 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 套餐临期每日站内提醒
|
||||
系统 SHALL 在每日扫描时,向最终到期时间可精确推算且剩余 0 至 15 个上海自然日的资产所属店铺后台接收人及其有效个人客户接收人创建套餐临期站内通知。系统 MUST 对同一资产、同一最终到期日期、同一剩余天数和同一接收人保持幂等。
|
||||
|
||||
#### Scenario: 临期窗口内连续两日提醒
|
||||
- **GIVEN** 一项资产的最终到期时间可精确推算,昨天剩余 3 个上海自然日,今天剩余 2 个上海自然日,且两日均有有效接收人
|
||||
- **WHEN** 每日临期扫描分别执行
|
||||
- **THEN** 系统分别创建昨天和今天的套餐临期通知
|
||||
|
||||
#### Scenario: 不在临期窗口的资产
|
||||
- **GIVEN** 一项资产剩余超过 15 个上海自然日、已经到期或最终到期时间不可精确推算
|
||||
- **WHEN** 每日临期扫描执行
|
||||
- **THEN** 系统不为该资产创建套餐临期通知
|
||||
@@ -0,0 +1,10 @@
|
||||
## 1. 每日临期提醒
|
||||
|
||||
- [x] 1.1 移除提醒候选的 15、7、3 天节点筛选,复用 0 至 15 天的统一临期候选集。
|
||||
- [x] 1.2 保持既有 Outbox 事件身份,确认同日重试去重且相邻日期可各发送一次。
|
||||
|
||||
## 2. 契约与验证
|
||||
|
||||
- [x] 2.1 将任务、路由及接口生成文案改为“每日临期提醒扫描”,保留颜色阈值说明。
|
||||
- [x] 2.2 使用剩余 2 天的设备验证扫描生成当天通知,并验证同日重复扫描不重复创建事件。
|
||||
- [x] 2.3 运行 gofmt、go build、文档生成、OpenSpec 校验与上下文健康检查。
|
||||
Reference in New Issue
Block a user