feat: 订单创建时快照买家手机号/昵称和套餐类型
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
新增字段: - tb_order: buyer_phone, buyer_nickname(个人客户下单时快照) - tb_order_item: package_type(套餐类型快照) 后台订单列表支持按 buyer_phone 精确过滤查询。 OpenSpec: order-buyer-snapshot
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: D1 创建套餐购买订单接口
|
||||
|
||||
系统 SHALL 允许个人客户发起套餐购买,创建待支付订单。下单时系统 MUST 自动查询买家手机号和昵称填入快照字段,查询失败时不阻塞下单流程。
|
||||
|
||||
#### Scenario: 创建套餐购买订单(正常流程)
|
||||
- **WHEN** 个人客户传入合法的套餐和资产标识符
|
||||
- **THEN** 系统创建待支付订单,响应包含 order_id、order_no、total_amount、payment_status
|
||||
|
||||
#### Scenario: 下单时买家快照被填充
|
||||
- **WHEN** 个人客户成功下单,系统能查询到该客户的主手机号
|
||||
- **THEN** 新创建订单的 buyer_phone 等于该客户的主手机号,buyer_nickname 等于该客户的昵称
|
||||
|
||||
#### Scenario: 买家信息查询失败时订单仍创建成功
|
||||
- **WHEN** 个人客户下单,查询手机号时数据库返回错误
|
||||
- **THEN** 系统创建订单成功,buyer_phone 为空,日志中记录警告信息
|
||||
|
||||
#### Scenario: 购买套餐时 OrderItem 含 package_type 快照
|
||||
- **WHEN** 个人客户购买套餐(套餐类型为 formal 或 addon)
|
||||
- **THEN** 新创建的 OrderItem 中 package_type 等于该套餐的 package_type 字段值
|
||||
@@ -0,0 +1,28 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 订单实体定义
|
||||
|
||||
系统 SHALL 定义订单(Order)实体,统一管理两种订单类型:套餐订单、号卡订单,并支持混合支付方式(钱包 + 在线支付)。
|
||||
|
||||
**修改说明(本次变更)**:
|
||||
- `Order` 新增 `buyer_phone`(varchar(20),NULL):下单时买家主手机号快照
|
||||
- `Order` 新增 `buyer_nickname`(varchar(100),NULL):下单时买家昵称快照
|
||||
- `OrderItem` 新增 `package_type`(varchar(20),NULL):套餐类型快照(formal / addon)
|
||||
|
||||
**支付规则(保持不变)**:
|
||||
- `wallet_payment_amount` + `online_payment_amount` = `amount`(订单总金额)
|
||||
- 当 `payment_method` 为 "wallet" 时,`wallet_payment_amount` = `amount`,`online_payment_amount` = 0
|
||||
- 当 `payment_method` 为 "online" 时,`online_payment_amount` = `amount`,`wallet_payment_amount` = 0
|
||||
- 混合支付时,`payment_method` 为 "mixed",两个字段都 > 0
|
||||
|
||||
#### Scenario: 全额钱包支付
|
||||
- **WHEN** 用户购买套餐,订单金额为 3000 分(30 元),选择钱包支付,钱包余额为 10000 分
|
||||
- **THEN** 系统创建订单,`amount` 为 3000,`payment_method` 为 "wallet",`wallet_payment_amount` 为 3000,`online_payment_amount` 为 0
|
||||
|
||||
#### Scenario: OrderItem 包含套餐类型快照
|
||||
- **WHEN** 下单时套餐的 package_type 为 "formal"
|
||||
- **THEN** 生成的 OrderItem 中 package_type 为 "formal"
|
||||
|
||||
#### Scenario: 套餐删除后 OrderItem 保留类型快照
|
||||
- **WHEN** 套餐被软删除后查询历史订单明细
|
||||
- **THEN** OrderItem 的 package_type 仍为下单时的快照值,不因套餐删除而变为空
|
||||
@@ -0,0 +1,52 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 订单买家快照字段
|
||||
系统 SHALL 在订单创建时将买家手机号和昵称快照到 `tb_order` 表,字段允许为空。
|
||||
|
||||
- `buyer_phone`:下单时买家主手机号快照(varchar(20),允许 NULL;代理商订单留空)
|
||||
- `buyer_nickname`:下单时买家昵称快照(varchar(100),允许 NULL)
|
||||
- `buyer_phone` 字段建普通索引以支持按手机号过滤
|
||||
|
||||
#### Scenario: 个人客户下单时快照手机号和昵称
|
||||
- **WHEN** 个人客户下单,系统能查询到该客户的主手机号和昵称
|
||||
- **THEN** 订单的 `buyer_phone` 和 `buyer_nickname` 被填充为查询结果
|
||||
|
||||
#### Scenario: 买家信息查询失败时不阻塞下单
|
||||
- **WHEN** 个人客户下单,但查询主手机号或昵称时发生错误(如数据库异常)
|
||||
- **THEN** 系统记录 warn 日志,订单正常创建,`buyer_phone`/`buyer_nickname` 为空
|
||||
|
||||
#### Scenario: 代理商订单不填充买家手机号
|
||||
- **WHEN** 代理商下单(buyer_type = agent)
|
||||
- **THEN** 订单的 `buyer_phone`、`buyer_nickname` 为 NULL
|
||||
|
||||
---
|
||||
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 查询订单列表
|
||||
|
||||
系统 SHALL 提供订单列表查询,支持按支付状态、订单类型、是否代购、买家手机号筛选。
|
||||
|
||||
#### Scenario: 个人客户查询自己的订单
|
||||
- **WHEN** 个人客户查询订单列表
|
||||
- **THEN** 系统只返回该客户的订单
|
||||
|
||||
#### Scenario: 代理查询店铺订单
|
||||
- **WHEN** 代理查询订单列表
|
||||
- **THEN** 系统返回该店铺及下级店铺的订单(包含代购订单和普通订单)
|
||||
|
||||
#### Scenario: 按代购类型筛选
|
||||
- **WHEN** 指定 is_purchase_on_behalf = true 筛选
|
||||
- **THEN** 系统只返回代购订单
|
||||
|
||||
#### Scenario: 按支付状态筛选
|
||||
- **WHEN** 指定支付状态筛选
|
||||
- **THEN** 系统只返回匹配状态的订单
|
||||
|
||||
#### Scenario: 按买家手机号精确过滤
|
||||
- **WHEN** 后台请求中传入 buyer_phone 参数
|
||||
- **THEN** 系统只返回 buyer_phone 精确匹配的订单
|
||||
|
||||
#### Scenario: 买家手机号过滤不返回空字段订单
|
||||
- **WHEN** 后台按 buyer_phone 过滤,部分历史订单该字段为 NULL
|
||||
- **THEN** 系统不返回 buyer_phone 为 NULL 的历史订单(精确匹配语义)
|
||||
Reference in New Issue
Block a user