# 资产调拨和回收API文档

## 目录
- [资产调拨管理](#资产调拨管理)
- [资产回收管理](#资产回收管理)

---

## 资产调拨管理

### 1. 获取调拨单列表
**GET** `/api/v1/transfers`

**查询参数：**
- `skip` (int): 跳过条数，默认0
- `limit` (int): 返回条数，默认20，最大100
- `transfer_type` (string): 调拨类型（internal=内部调拨/external=跨机构调拨）
- `approval_status` (string): 审批状态（pending/approved/rejected/cancelled）
- `execute_status` (string): 执行状态（pending/executing/completed/cancelled）
- `source_org_id` (int): 调出网点ID
- `target_org_id` (int): 调入网点ID
- `keyword` (string): 搜索关键词（单号/标题）

**响应示例：**
```json
[
  {
    "id": 1,
    "order_code": "TO-20250124-00001",
    "source_org_id": 1,
    "target_org_id": 2,
    "transfer_type": "external",
    "title": "从总部向分公司调拨资产",
    "asset_count": 5,
    "apply_user_id": 1,
    "apply_time": "2025-01-24T10:00:00",
    "approval_status": "pending",
    "execute_status": "pending",
    "created_at": "2025-01-24T10:00:00"
  }
]
```

---

### 2. 获取调拨单统计
**GET** `/api/v1/transfers/statistics`

**查询参数：**
- `source_org_id` (int): 调出网点ID（可选）
- `target_org_id` (int): 调入网点ID（可选）

**响应示例：**
```json
{
  "total": 100,
  "pending": 10,
  "approved": 50,
  "rejected": 5,
  "executing": 15,
  "completed": 20
}
```

---

### 3. 获取调拨单详情
**GET** `/api/v1/transfers/{order_id}`

**路径参数：**
- `order_id` (int): 调拨单ID

**响应示例：**
```json
{
  "id": 1,
  "order_code": "TO-20250124-00001",
  "source_org_id": 1,
  "target_org_id": 2,
  "transfer_type": "external",
  "title": "从总部向分公司调拨资产",
  "asset_count": 5,
  "apply_user_id": 1,
  "apply_time": "2025-01-24T10:00:00",
  "approval_status": "approved",
  "approval_user_id": 2,
  "approval_time": "2025-01-24T11:00:00",
  "execute_status": "completed",
  "execute_user_id": 3,
  "execute_time": "2025-01-24T12:00:00",
  "remark": "调拨备注",
  "created_at": "2025-01-24T10:00:00",
  "updated_at": "2025-01-24T12:00:00",
  "source_organization": {
    "id": 1,
    "org_name": "总部",
    "org_type": "headquarters"
  },
  "target_organization": {
    "id": 2,
    "org_name": "北京分公司",
    "org_type": "branch"
  },
  "apply_user": {
    "id": 1,
    "real_name": "张三",
    "username": "zhangsan"
  },
  "items": [
    {
      "id": 1,
      "asset_id": 10,
      "asset_code": "ASSET001",
      "source_organization_id": 1,
      "target_organization_id": 2,
      "transfer_status": "completed"
    }
  ]
}
```

---

### 4. 获取调拨单明细
**GET** `/api/v1/transfers/{order_id}/items`

**路径参数：**
- `order_id` (int): 调拨单ID

**响应示例：**
```json
[
  {
    "id": 1,
    "order_id": 1,
    "asset_id": 10,
    "asset_code": "ASSET001",
    "source_organization_id": 1,
    "target_organization_id": 2,
    "transfer_status": "completed",
    "created_at": "2025-01-24T10:00:00"
  }
]
```

---

### 5. 创建调拨单
**POST** `/api/v1/transfers`

**请求体：**
```json
{
  "source_org_id": 1,
  "target_org_id": 2,
  "transfer_type": "external",
  "title": "从总部向分公司调拨资产",
  "asset_ids": [10, 11, 12, 13, 14],
  "remark": "调拨备注"
}
```

**字段说明：**
- `source_org_id` (int, 必填): 调出网点ID
- `target_org_id` (int, 必填): 调入网点ID
- `transfer_type` (string, 必填): 调拨类型
  - `internal`: 内部调拨
  - `external`: 跨机构调拨
- `title` (string, 必填): 标题
- `asset_ids` (array, 必填): 资产ID列表
- `remark` (string, 可选): 备注

**响应：** 返回创建的调拨单详情

---

### 6. 更新调拨单
**PUT** `/api/v1/transfers/{order_id}`

**路径参数：**
- `order_id` (int): 调拨单ID

**请求体：**
```json
{
  "title": "更新后的标题",
  "remark": "更新后的备注"
}
```

**字段说明：**
- `title` (string, 可选): 标题
- `remark` (string, 可选): 备注

**响应：** 返回更新后的调拨单详情

**限制：** 只有待审批状态的调拨单可以更新

---

### 7. 审批调拨单
**POST** `/api/v1/transfers/{order_id}/approve`

**路径参数：**
- `order_id` (int): 调拨单ID

**查询参数：**
- `approval_status` (string, 必填): 审批状态（approved/rejected）
- `approval_remark` (string, 可选): 审批备注

**响应：** 返回审批后的调拨单详情

**限制：**
- 只有待审批状态的调拨单可以审批
- 审批通过后可以开始执行调拨

---

### 8. 开始调拨
**POST** `/api/v1/transfers/{order_id}/start`

**路径参数：**
- `order_id` (int): 调拨单ID

**响应：** 返回开始执行后的调拨单详情

**限制：**
- 必须已审批通过
- 不能重复开始

---

### 9. 完成调拨
**POST** `/api/v1/transfers/{order_id}/complete`

**路径参数：**
- `order_id` (int): 调拨单ID

**响应：** 返回完成后的调拨单详情

**功能：**
- 自动更新资产所属机构
- 自动更新资产状态
- 更新明细状态为完成

**限制：** 只有pending或executing状态的调拨单可以完成

---

### 10. 取消调拨单
**POST** `/api/v1/transfers/{order_id}/cancel`

**路径参数：**
- `order_id` (int): 调拨单ID

**响应：** 204 No Content

**限制：** 已完成的调拨单无法取消

---

### 11. 删除调拨单
**DELETE** `/api/v1/transfers/{order_id}`

**路径参数：**
- `order_id` (int): 调拨单ID

**响应：** 204 No Content

**限制：** 只能删除已拒绝或已取消的调拨单

---

## 资产回收管理

### 1. 获取回收单列表
**GET** `/api/v1/recoveries`

**查询参数：**
- `skip` (int): 跳过条数，默认0
- `limit` (int): 返回条数，默认20，最大100
- `recovery_type` (string): 回收类型（user=使用人回收/org=机构回收/scrap=报废回收）
- `approval_status` (string): 审批状态（pending/approved/rejected/cancelled）
- `execute_status` (string): 执行状态（pending/executing/completed/cancelled）
- `keyword` (string): 搜索关键词（单号/标题）

**响应示例：**
```json
[
  {
    "id": 1,
    "order_code": "RO-20250124-00001",
    "recovery_type": "user",
    "title": "回收离职员工资产",
    "asset_count": 3,
    "apply_user_id": 1,
    "apply_time": "2025-01-24T10:00:00",
    "approval_status": "pending",
    "execute_status": "pending",
    "created_at": "2025-01-24T10:00:00"
  }
]
```

---

### 2. 获取回收单统计
**GET** `/api/v1/recoveries/statistics`

**响应示例：**
```json
{
  "total": 80,
  "pending": 8,
  "approved": 40,
  "rejected": 4,
  "executing": 12,
  "completed": 16
}
```

---

### 3. 获取回收单详情
**GET** `/api/v1/recoveries/{order_id}`

**路径参数：**
- `order_id` (int): 回收单ID

**响应示例：**
```json
{
  "id": 1,
  "order_code": "RO-20250124-00001",
  "recovery_type": "user",
  "title": "回收离职员工资产",
  "asset_count": 3,
  "apply_user_id": 1,
  "apply_time": "2025-01-24T10:00:00",
  "approval_status": "approved",
  "approval_user_id": 2,
  "approval_time": "2025-01-24T11:00:00",
  "execute_status": "completed",
  "execute_user_id": 3,
  "execute_time": "2025-01-24T12:00:00",
  "remark": "回收备注",
  "created_at": "2025-01-24T10:00:00",
  "updated_at": "2025-01-24T12:00:00",
  "apply_user": {
    "id": 1,
    "real_name": "张三",
    "username": "zhangsan"
  },
  "items": [
    {
      "id": 1,
      "asset_id": 10,
      "asset_code": "ASSET001",
      "recovery_status": "completed"
    }
  ]
}
```

---

### 4. 获取回收单明细
**GET** `/api/v1/recoveries/{order_id}/items`

**路径参数：**
- `order_id` (int): 回收单ID

**响应示例：**
```json
[
  {
    "id": 1,
    "order_id": 1,
    "asset_id": 10,
    "asset_code": "ASSET001",
    "recovery_status": "completed",
    "created_at": "2025-01-24T10:00:00"
  }
]
```

---

### 5. 创建回收单
**POST** `/api/v1/recoveries`

**请求体：**
```json
{
  "recovery_type": "user",
  "title": "回收离职员工资产",
  "asset_ids": [10, 11, 12],
  "remark": "回收备注"
}
```

**字段说明：**
- `recovery_type` (string, 必填): 回收类型
  - `user`: 使用人回收（从使用人处回收）
  - `org`: 机构回收（从机构回收）
  - `scrap`: 报废回收（报废资产回收）
- `title` (string, 必填): 标题
- `asset_ids` (array, 必填): 资产ID列表
- `remark` (string, 可选): 备注

**响应：** 返回创建的回收单详情

---

### 6. 更新回收单
**PUT** `/api/v1/recoveries/{order_id}`

**路径参数：**
- `order_id` (int): 回收单ID

**请求体：**
```json
{
  "title": "更新后的标题",
  "remark": "更新后的备注"
}
```

**字段说明：**
- `title` (string, 可选): 标题
- `remark` (string, 可选): 备注

**响应：** 返回更新后的回收单详情

**限制：** 只有待审批状态的回收单可以更新

---

### 7. 审批回收单
**POST** `/api/v1/recoveries/{order_id}/approve`

**路径参数：**
- `order_id` (int): 回收单ID

**查询参数：**
- `approval_status` (string, 必填): 审批状态（approved/rejected）
- `approval_remark` (string, 可选): 审批备注

**响应：** 返回审批后的回收单详情

**限制：**
- 只有待审批状态的回收单可以审批
- 审批通过后可以开始执行回收

---

### 8. 开始回收
**POST** `/api/v1/recoveries/{order_id}/start`

**路径参数：**
- `order_id` (int): 回收单ID

**响应：** 返回开始执行后的回收单详情

**限制：**
- 必须已审批通过
- 不能重复开始

---

### 9. 完成回收
**POST** `/api/v1/recoveries/{order_id}/complete`

**路径参数：**
- `order_id` (int): 回收单ID

**响应：** 返回完成后的回收单详情

**功能：**
- 自动更新资产状态为in_stock（普通回收）或scrapped（报废回收）
- 自动记录资产状态历史
- 更新明细状态为完成

**限制：** 只有pending或executing状态的回收单可以完成

---

### 10. 取消回收单
**POST** `/api/v1/recoveries/{order_id}/cancel`

**路径参数：**
- `order_id` (int): 回收单ID

**响应：** 204 No Content

**限制：** 已完成的回收单无法取消

---

### 11. 删除回收单
**DELETE** `/api/v1/recoveries/{order_id}`

**路径参数：**
- `order_id` (int): 回收单ID

**响应：** 204 No Content

**限制：** 只能删除已拒绝或已取消的回收单

---

## 业务流程说明

### 调拨流程
1. **创建调拨单**：选择调出/调入机构和资产
2. **审批调拨单**：管理员审批（通过/拒绝）
3. **开始调拨**：开始执行调拨操作
4. **完成调拨**：
   - 自动更新资产所属机构
   - 自动更新资产状态
   - 记录状态历史

### 回收流程
1. **创建回收单**：选择回收类型和资产
2. **审批回收单**：管理员审批（通过/拒绝）
3. **开始回收**：开始执行回收操作
4. **完成回收**：
   - 普通回收：资产状态变为in_stock
   - 报废回收：资产状态变为scrapped
   - 记录状态历史

### 状态说明

#### 调拨类型
- `internal`: 内部调拨（同一组织内调拨）
- `external`: 跨机构调拨（不同组织间调拨）

#### 回收类型
- `user`: 使用人回收（从使用人处回收资产）
- `org`: 机构回收（从机构回收资产）
- `scrap`: 报废回收（报废并回收资产）

#### 审批状态
- `pending`: 待审批
- `approved`: 已审批通过
- `rejected`: 已拒绝
- `cancelled`: 已取消

#### 执行状态
- `pending`: 待执行
- `executing`: 执行中
- `completed`: 已完成
- `cancelled`: 已取消

#### 调拨明细状态
- `pending`: 待调拨
- `transferring`: 调拨中
- `completed`: 已完成
- `failed`: 失败

#### 回收明细状态
- `pending`: 待回收
- `recovering`: 回收中
- `completed`: 已完成
- `failed`: 失败
