# Change: 单卡资产分配功能

## Why

平台和代理商需要将单卡（未绑定设备的 IoT 卡）分销给下级代理，实现资产的层级流转。当前系统只有企业卡授权功能（授权企业可见特定卡），缺少代理商之间的卡所有权转移功能。

业务场景：
- 平台批量导入卡后，分销给一级代理
- 一级代理继续分销给二级代理
- 上级可以回收已分销的卡
- 查看卡的分配/回收历史记录

## What Changes

### 新增功能

**单卡分配 API**
- `POST /api/admin/iot-cards/standalone/allocate` - 批量分配单卡给直属下级店铺
- `POST /api/admin/iot-cards/standalone/recall` - 批量回收已分配的单卡

**分配记录查询 API**
- `GET /api/admin/asset-allocation-records` - 分配记录列表（支持分页和筛选）
- `GET /api/admin/asset-allocation-records/:id` - 分配记录详情

**分配方式支持**
- ICCID 列表选择
- ICCID 号段范围（起始~结束）
- 筛选条件批量（运营商、批次号等）

### 业务规则

**分配规则**
- 只能分配给直属下级店铺，不可跨级
- 平台只能分配在库(status=1)的卡
- 代理可以分配已分销(status=2)的卡（继续往下分销）
- 分配后状态变更：在库(1)→已分销(2)，已分销(2)保持不变
- 分配后 shop_id 变更为目标店铺 ID

**回收规则**
- 只有上级可以回收，代理不能主动退回
- 平台回收：shop_id 变为 NULL
- 店铺回收：shop_id 变为执行回收的店铺 ID
- 只能回收直属下级的卡，不可跨级回收

**可见性**
- 分配后上级仍能看到和管理（通过数据权限机制实现）

**注意**
- 本次只做单卡分配，设备卡分配暂不实现
- 分配不涉及费用，纯资产所有权转移

## Capabilities

### New Capabilities

- `asset-allocation-record`: 资产分配记录管理，包含分配记录的查询功能

### Modified Capabilities

- `iot-card`: 新增单卡分配和回收功能

## Impact

### API 影响
- 新增：`POST /api/admin/iot-cards/standalone/allocate`
- 新增：`POST /api/admin/iot-cards/standalone/recall`
- 新增：`GET /api/admin/asset-allocation-records`
- 新增：`GET /api/admin/asset-allocation-records/:id`

### 代码影响
- `internal/handler/admin/iot_card.go`：新增 AllocateCards、RecallCards 方法
- `internal/handler/admin/asset_allocation_record.go`：新增（分配记录 Handler）
- `internal/service/iot_card/service.go`：新增分配、回收业务逻辑
- `internal/service/asset_allocation_record/service.go`：新增（分配记录 Service）
- `internal/store/postgres/iot_card_store.go`：新增批量更新 shop_id 方法
- `internal/store/postgres/asset_allocation_record_store.go`：新增（分配记录 Store）
- `internal/model/dto/iot_card_dto.go`：新增分配、回收相关 DTO
- `internal/model/dto/asset_allocation_record_dto.go`：新增（分配记录 DTO）
- `internal/routes/asset_allocation_record.go`：新增（分配记录路由）

### 数据库影响
- 无表结构变更（使用现有 `tb_iot_card` 和 `tb_asset_allocation_record` 表）
