fix: allow expired members to buy new plans
This commit is contained in:
+16
@@ -2172,3 +2172,19 @@
|
||||
- 方案:下单和支付都只把仍在有效期或宽限期内的权益视为当前权益;支付发放时在同一事务内把同产品自然到期但仍标记为 `active` 的历史权益收敛为 `expired`,再创建目标套餐新权益。
|
||||
- 兼容边界:有效/宽限期内的跨套餐仍拒绝;同套餐有效权益继续续订;不实现升级、降级、差价或退款,不改支付验签、点数账本、API 契约或数据库结构。
|
||||
- 基线:执行 `./init.ps1` 通过,Python 3.12.3,依赖已满足,`manage.py check` 0 issues。本阶段只登记任务,尚未修改代码。
|
||||
|
||||
## 2026-07-23 开工:T-634 过期会员允许购买其他套餐
|
||||
|
||||
- 状态:DOING。
|
||||
- 实施范围:统一软件下单、支付入账与订阅授权的“当前可用权益”口径;支付事务内收敛自然到期状态,并补齐过期跨套餐、过期同套餐、有效跨套餐和支付失败不改历史状态测试。
|
||||
- 边界:不改接口、数据库结构、支付验签、支付金额与交易号校验、点数账本或订阅强制模式。
|
||||
|
||||
## 2026-07-23 完成:T-634 过期会员允许购买其他套餐
|
||||
|
||||
- 实现:`create_software_order()` 和支付发放统一只查询 `status=active` 且 `grace_expires_at > now` 的当前可用权益。支付订单创建阶段保持只读,不会因用户尚未付款而修改历史权益。
|
||||
- 支付事务:订单状态、通道、金额和交易号校验通过后,锁定同账号同产品权益,把 `grace_expires_at <= now` 但仍为 `active` 的历史权益更新为 `expired`,再按当前可用权益决定创建新权益、续订同套餐或拒绝有效跨套餐。
|
||||
- 兼容:已过期同套餐和不同套餐都创建新权益;有效/宽限期内的同套餐仍续订、不同套餐仍返回 `plan_change_not_supported`。支付幂等、金额校验、微信网关、软件订单快照和点数账本未改;无迁移、无 API 契约变化。
|
||||
- 测试:SQLite `SoftwareOrderServiceTests` 8 条通过,其中新增 5 条缺陷回归;非并发 licensing 与软件支付回调 API 扩大回归 40 条通过。既有 SQLite 并发回归因表级锁报 `database table is locked`,符合该测试必须在 MySQL 行锁环境运行的既有事实。
|
||||
- MySQL 验证尝试:在 `185.216.248.75` 的 `/tmp` 临时代码副本请求创建唯一测试库 `test_cmhub_t634_base`,MySQL 连接成功但项目账号无建库权限,测试未进入迁移或断言;临时代码目录已删除,生产 `cmhub` 库未修改。
|
||||
- 静态验证:`py_compile`、`manage.py check`、`./init.ps1` 和 `git diff --check` 通过;`makemigrations --check --dry-run` 为 No changes detected,但检查旧本地 MySQL 迁移历史时收到连接拒绝 warning;本任务不包含迁移。
|
||||
- 发布状态:代码与文档已完成,尚未部署到线上服务。
|
||||
|
||||
Reference in New Issue
Block a user