All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m12s
1. 修正 retail_price 架构:
- 删除 batch-pricing 接口的 pricing_target 字段和 retail_price 分支
(上级只能改下级成本价,不能改零售价)
- 新增 PATCH /api/admin/packages/:id/retail-price 接口
(代理自己改自己的零售价,校验 retail_price >= cost_price)
2. 清理旧微信 YAML 配置(已全部迁移到数据库 tb_wechat_config):
- 删除 config.yaml 中 wechat.official_account 配置节
- 删除 NewOfficialAccountApp() 旧工厂函数
- 清理 personal_customer service 中的死代码(旧登录/绑定微信方法)
- 清理 docker-compose.prod.yml 中旧微信环境变量和证书挂载注释
3. 归档四个已完成提案到 openspec/changes/archive/
4. 新增前端接口变更说明文档(docs/前端接口变更说明.md)
5. 修正归档提案和 specs 中关于 pricing_target 的错误描述
76 lines
2.5 KiB
Markdown
76 lines
2.5 KiB
Markdown
# exchange-order-model Specification
|
||
|
||
## Purpose
|
||
|
||
定义换货单(ExchangeOrder)数据模型、状态常量、状态机流转规则及换货单号生成规则,作为换货系统的核心数据基础。
|
||
|
||
## Requirements
|
||
|
||
### Requirement: ExchangeOrder 换货单模型定义
|
||
|
||
系统 SHALL 定义 `ExchangeOrder` 模型并映射到 `tb_exchange_order`,用于承载客户端换货完整生命周期。
|
||
|
||
模型字段 MUST 至少包含:
|
||
- 基础:`id`、`created_at`、`updated_at`、`deleted_at`、`creator`、`updater`
|
||
- 单号:`exchange_no`
|
||
- 旧资产:`old_asset_type`、`old_asset_id`、`old_asset_identifier`
|
||
- 新资产:`new_asset_type`、`new_asset_id`、`new_asset_identifier`
|
||
- 收货:`recipient_name`、`recipient_phone`、`recipient_address`
|
||
- 物流:`express_company`、`express_no`
|
||
- 迁移:`migrate_data`、`migration_completed`、`migration_balance`
|
||
- 业务:`exchange_reason`、`remark`、`status`
|
||
- 多租户:`shop_id`
|
||
|
||
`ExchangeOrder` SHALL 嵌入 `BaseModel` 并实现 `TableName() string`,返回 `tb_exchange_order`。
|
||
|
||
#### Scenario: 创建换货单模型实例
|
||
- **WHEN** 系统创建新的换货单记录
|
||
- **THEN** 记录 MUST 同时包含旧资产快照、收货信息占位、迁移状态字段和多租户字段
|
||
|
||
---
|
||
|
||
### Requirement: 换货状态常量定义
|
||
|
||
系统 MUST 使用 int 常量定义换货状态:
|
||
- `1` 待填写信息
|
||
- `2` 待发货
|
||
- `3` 已发货待确认
|
||
- `4` 已完成
|
||
- `5` 已取消
|
||
|
||
#### Scenario: 状态常量一致性
|
||
- **WHEN** Service、Store、Handler 读取或更新换货状态
|
||
- **THEN** 各层 MUST 使用统一常量值,禁止硬编码散落魔法数字
|
||
|
||
---
|
||
|
||
### Requirement: 换货状态机流转规则
|
||
|
||
系统 SHALL 执行以下状态机:
|
||
- 创建换货单后:`1`
|
||
- 客户填写收货信息后:`1 -> 2`
|
||
- 后台发货后:`2 -> 3`
|
||
- 后台确认完成后:`3 -> 4`
|
||
- 取消:仅允许 `1/2 -> 5`
|
||
|
||
系统 MUST 禁止非法流转(如 `3 -> 5`、`4 -> 2`)。
|
||
|
||
#### Scenario: 已发货不可取消
|
||
- **WHEN** 换货单状态为 `3` 且请求取消
|
||
- **THEN** 系统 MUST 拒绝并返回状态流转非法错误
|
||
|
||
---
|
||
|
||
### Requirement: 换货单号生成规则
|
||
|
||
系统 MUST 为每个换货单生成全局可追踪单号,格式为:`EXC + 时间戳片段 + 随机数片段`。
|
||
|
||
生成规则 SHALL 满足:
|
||
- 前缀固定为 `EXC`
|
||
- 包含日期/时间信息用于人工排查
|
||
- 包含随机片段降低并发冲突概率
|
||
|
||
#### Scenario: 生成换货单号
|
||
- **WHEN** 后台发起换货并创建新单
|
||
- **THEN** 系统 MUST 生成形如 `EXC20260319XXXXXX` 的单号并写入 `exchange_no`
|