Files
junhong_cmp_fiber/.scratch/ur98-exchange-inherit-shop/issues/02-atomic-exchange-completion-with-shop-inheritance.md
2026-07-23 13:11:21 +09:00

2.5 KiB
Raw Blame History

02 — 以归属继承原子完成换货

What to build: 运营人员可用平台库存或同店铺新资产完成物流或直接换货;系统在一次原子操作中让新资产继承旧资产店铺及直接派生的多租户字段,保留旧资产归属历史,记录可追溯的换货分配和审计事实。其他店铺资产被统一拒绝;重复或并发完成不会重复迁移资料、写分配记录或产生资金副作用。

Blocked by: 01 — 换货分配记录与归属校正发布基础。

Status: ready-for-agent

架构通道: 复杂写(Handler → Application UseCase → Exchange Domain → Repository/Infrastructure)。

完整业务边界: 收口物流确认完成及直接换货即时完成:锁定换货单与新旧资产,校验类型、状态、归属、占用和客户绑定,同步新资产归属与派生租户字段,写换货分配记录,迁移客户绑定,按 migrate_data 迁移既有资料,推进新旧资产和换货单状态,并在同一事务写入关键 Audit Event。

明确不迁移: 不迁移创建、发货、取消等未触碰换货规则,不迁移资产详情前代/后代 Query不回填历史换货归属不重构非本完整用例涉及的资产、钱包、套餐模块。

  • 新资产为平台库存或已属旧资产店铺时可换入;属于其他店铺时返回统一 403 且不泄露店铺信息、无任何副作用;旧资产 shop_id 保持不变。
  • 无论 migrate_data 为 true 或 false新资产的归属状态、shop_id 和所有直接派生租户字段均与旧资产当前归属一致;旧资产目标归属为空时,新资产保持平台库存语义。
  • 客户绑定始终在完成时迁移;仅在 migrate_data=true 时迁移钱包余额、套餐使用、累计数据和普通业务标签,目标数据冲突沿用既有安全校验而不覆盖。
  • 使用锁内最新状态校验和状态条件更新保证幂等:重复或并发完成仅执行一次归属同步、客户迁移、资料迁移、分配记录和审计副作用,其余请求返回已完成的幂等成功结果。
  • 在各关键步骤注入失败时,资产、绑定、钱包、套餐、标签、分配记录、换货状态和 Audit Event 全部回滚;卡与设备、物流与直接换货、两种 migrate_data 分支均有事务集成测试。
  • 架构约束:归属、状态、迁移和并发不变量完整收口在 Exchange DomainApplication 只编排事务与端口,旧 Service 至多作为转发门面,不保留第二套完成逻辑。