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 的错误描述
2.5 KiB
2.5 KiB
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