# 客户端换货系统功能总结

## 1. 功能概述

本次实现完成了客户端换货系统的后台与客户端闭环能力，覆盖「后台建单 → 客户端填写收货信息 → 后台发货 → 后台确认完成（可选全量迁移） → 旧资产转新」完整流程。

## 2. 数据模型与迁移

- 新增 `tb_exchange_order` 表，承载换货生命周期全量字段：旧/新资产、收货信息、物流信息、迁移状态、业务状态、多租户字段。
- 保留历史能力：将旧表 `tb_card_replacement_record` 重命名为 `tb_card_replacement_record_legacy`。
- 新增迁移文件：
  - `000085_add_exchange_order.up/down.sql`
  - `000086_rename_card_replacement_to_legacy.up/down.sql`

## 3. 后端实现

### 3.1 Store 层

- 新增 `ExchangeOrderStore`：
  - 创建、按 ID 查询、分页列表查询
  - 条件状态流转更新（`WHERE status = fromStatus`）
  - 按旧资产查询进行中换货单（状态 `1/2/3`）

- 新增 `ResourceTagStore`：用于资源标签复制。

### 3.2 Service 层

- 新增 `internal/service/exchange/service.go`：
  - H1 创建换货单（资产存在校验、进行中校验、单号生成、状态初始化）
  - H2 列表查询
  - H3 详情查询
  - H4 发货（状态校验、同类型校验、新资产在库校验、物流与新资产快照写入）
  - H5 确认完成（状态校验，可选全量迁移）
  - H6 取消（仅允许 `1/2 -> 5`）
  - H7 转新（校验已换货状态、`generation+1`、状态重置、清理绑定、创建新钱包）
  - G1 查询待处理换货单
  - G2 提交收货信息（`1 -> 2`）

- 新增 `internal/service/exchange/migration.go`：
  - 单事务迁移实现
  - 钱包余额迁移并写入迁移流水
  - 套餐使用记录迁移（`tb_package_usage`）
  - 套餐日记录联动更新（`tb_package_usage_daily_record`）
  - 累计充值/首充字段复制（旧资产 -> 新资产）
  - 标签复制（`tb_resource_tag`）
  - 客户绑定 `virtual_no` 更新（`tb_personal_customer_device`）
  - 旧资产状态置为已换货（`asset_status=3`）
  - 换货单迁移结果回写（`migration_completed`、`migration_balance`）

## 4. Handler 与路由

### 4.1 后台换货接口

- 新增 `internal/handler/admin/exchange.go`
- 新增 `internal/routes/exchange.go`
- 注册接口（标签：`换货管理`）：
  - `POST /api/admin/exchanges`
  - `GET /api/admin/exchanges`
  - `GET /api/admin/exchanges/:id`
  - `POST /api/admin/exchanges/:id/ship`
  - `POST /api/admin/exchanges/:id/complete`
  - `POST /api/admin/exchanges/:id/cancel`
  - `POST /api/admin/exchanges/:id/renew`

### 4.2 客户端换货接口

- 新增 `internal/handler/app/client_exchange.go`
- 在 `internal/routes/personal.go` 注册：
  - `GET /api/c/v1/exchange/pending`
  - `POST /api/c/v1/exchange/:id/shipping-info`

## 5. 兼容与替换

- `iot_card_store.go` 的 `is_replaced` 过滤逻辑已切换至 `tb_exchange_order`。
- 业务主流程不再依赖旧换卡表（仅模型与 legacy 表保留用于历史数据）。

## 6. 启动装配与文档生成

已完成换货模块在以下位置的全链路接入：

- `internal/bootstrap/types.go`
- `internal/bootstrap/stores.go`
- `internal/bootstrap/services.go`
- `internal/bootstrap/handlers.go`
- `internal/routes/admin.go`
- `pkg/openapi/handlers.go`
- `cmd/api/docs.go`
- `cmd/gendocs/main.go`

## 7. 验证结果

- 已执行：`go build ./...`，编译通过。
- 已执行：数据库迁移 `make migrate-up`，版本到 `86`。
- 已完成：变更文件 LSP 诊断检查（无 error 级问题）。
