Files
junhong_cmp_fiber/openspec/specs/order-refund-exchange/spec.md
2026-08-18 16:15:46 +08:00

5.4 KiB
Raw Blame History

订单、退款与换货当前行为

Purpose

描述订单、退款、换货及订单套餐失效的当前可观察行为。

Requirements

Requirement: 订单、退款与换货状态门禁

系统 SHALL 仅允许待支付订单取消;退款申请按待审批、已通过、已拒绝、已退回流转,只有已退回申请可重新提交;换货按待填写信息、待发货、已发货、已完成或已取消流转,并拒绝与当前状态或流程类型不匹配的操作。

Scenario: 重复推进终态

  • GIVEN 退款或换货已进入不允许当前操作的状态
  • WHEN 再次审批、发货、完成、取消或重新提交
  • THEN 系统返回状态冲突且不重复改变资产、余额或业务状态

Requirement: 代理退款查询按所属店铺隔离

系统 SHALL 允许代理账号通过 GET /api/admin/refunds 查询其当前所属店铺的全部退款申请,并通过 GET /api/admin/refunds/{id} 查询其中任一申请详情,不以申请创建账号作为查询条件。该范围 SHALL 不包含下级代理店铺、其他店铺或未关联店铺的退款申请;代理账号未关联店铺时,列表 SHALL 为空且详情 SHALL 返回不存在。平台和超级管理员的既有退款查询范围 SHALL 保持不变。

Scenario: 查看同店铺其他账号提交的退款

  • GIVEN 当前代理所属店铺存在由另一账号创建的退款申请
  • WHEN 该代理查询退款列表或该申请详情
  • THEN 系统返回该退款申请

Scenario: 查询下级代理店铺的退款

  • GIVEN 当前代理的下级代理店铺存在退款申请
  • WHEN 当前代理查询退款列表或该申请详情
  • THEN 系统不返回该退款申请,详情查询返回不存在

Scenario: 未绑定店铺的代理查询退款

  • GIVEN 当前代理账号未关联店铺
  • WHEN 该代理查询退款列表或退款申请详情
  • THEN 系统返回空列表或不存在,且不泄露任何退款申请

Requirement: 历史待审批退款可主动接入企业微信审批

系统 SHALL 提供 POST /api/admin/refunds/{id}/trigger-approval,使具有既有退款管理访问权限的后台账号可为历史退款申请主动创建企业微信审批。系统 MUST 仅在退款申请状态为待审批且 approval_instance_id 为空时创建审批;审批发起人 MUST 使用该退款申请的原创建账号。创建成功后,系统 MUST 原子保存唯一审批实例、审批提交请求及退款申请的审批实例关联,并返回更新后的退款申请审批摘要。

Scenario: 主动发起历史退款审批成功

  • GIVEN 退款申请处于待审批状态、未关联审批实例,且其原创建账号和企业微信退款审批场景均可用
  • WHEN 有既有退款管理访问权限的后台账号请求 POST /api/admin/refunds/{id}/trigger-approval
  • THEN 系统创建以原创建账号为发起人的唯一企业微信审批并返回审批摘要,后续由既有可靠提交流程提交至企业微信

Scenario: 非待审批或已发起记录被拒绝

  • WHEN 请求主动发起的退款申请不是待审批状态或已关联审批实例
  • THEN 系统返回状态冲突且不创建新的审批实例或提交请求

Scenario: 并发主动发起同一退款审批

  • WHEN 两个请求同时为同一符合条件的退款申请主动发起审批
  • THEN 系统至多创建一个审批实例和一个审批提交请求,未成功创建关联的请求返回冲突

Scenario: 原创建人或审批渠道不可用

  • WHEN 退款申请原创建账号不可用,或企业微信退款审批场景不可用
  • THEN 系统返回相应错误,退款申请保持未关联审批实例,修复条件后可再次发起

可达操作索引

本节只用于入口导航,不是行为 Requirement业务义务以上述 Requirements 为准。

订单管理

GET /api/admin/orders(获取订单列表);POST /api/admin/orders(创建订单);GET /api/admin/orders/{id}(获取订单详情);POST /api/admin/orders/{id}/cancel(取消订单);POST /api/admin/orders/purchase-check(套餐购买预检)。

退款管理

GET /api/admin/refunds(退款申请列表);POST /api/admin/refunds(创建退款申请);GET /api/admin/refunds/{id}(退款申请详情);POST /api/admin/refunds/{id}/trigger-approval(补发历史退款审批);POST /api/admin/refunds/{id}/approve(审批通过退款申请);POST /api/admin/refunds/{id}/reject(审批拒绝退款申请);POST /api/admin/refunds/{id}/resubmit(重新提交退款申请);POST /api/admin/refunds/{id}/return(退回退款申请)。

换货管理

GET /api/admin/exchanges(获取换货单列表);POST /api/admin/exchanges(创建换货单);GET /api/admin/exchanges/{id}(获取换货单详情);POST /api/admin/exchanges/{id}/cancel(取消换货);POST /api/admin/exchanges/{id}/complete(确认换货完成);POST /api/admin/exchanges/{id}/renew(旧资产转新);POST /api/admin/exchanges/{id}/ship(换货发货)。

订单套餐失效

GET /api/admin/order-package-invalidate-tasks(查询订单套餐失效任务列表);POST /api/admin/order-package-invalidate-tasks(创建订单套餐批量失效任务);GET /api/admin/order-package-invalidate-tasks/{id}(查询订单套餐失效任务详情)。