# 文件上传接口改造需求（给后端）

> 提单时间：2026-05-11
> 提单方：前端
> 涉及模块：`rdms-system-boot` 文件模块
> 背景：业务表单（如新建/编辑任务）的附件采用「即传即存」交互，但表单可能被用户取消或关闭。前端需要在合适时机调用删除接口清理孤儿文件。当前 `/system/file/upload` 只返回 url，前端拿不到 fileId，无法触发删除。

---

## 1. 改造：`POST /system/file/upload`

**路径 / 方法 / 入参全部保持不变**，仅修改返回结构。

### 1.1 现状返回

```json
{
  "code": 0,
  "msg": "",
  "data": "http://192.168.1.107:9009/rdms/20260508/xxx.jpg?X-Amz-..."
}
```

### 1.2 目标返回

```json
{
  "code": 0,
  "msg": "",
  "data": {
    "id": "10001",
    "url": "http://192.168.1.107:9009/rdms/20260508/xxx.jpg?X-Amz-..."
  }
}
```

### 1.3 字段说明

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 即 `infra_file.id`，**必须以字符串形式返回**，不要返回 number |
| url | string | 是 | 文件访问 URL，含义与现状完全一致（私有桶带签名，公开桶裸 URL） |

### 1.4 关键约束

- **`id` 必须是 string，不是 number**。原因：`infra_file.id` 是 Long 类型，超过 JS 安全整数（2^53）时 JSON number 会精度丢失。前端项目 ID 统一按字符串接收。
- 该改动**不兼容老返回结构**，前端会同步切换。
- App 端 `/app-api/system/file/upload` 前端目前未使用，可暂不改；若希望对称建议一起改。

---

## 2. 确认：`DELETE /system/file/delete`

接口已存在（见 `system-file-api.md` §4.3.5），无需新建，但需确认以下两点：

### 2.1 权限

- 业务用户角色需具备 `system:file:delete` 权限码，**或**该接口允许"删除自己上传的文件"无需该权限码。
- 期望：当前业务用户能直接调通 `DELETE /admin-api/system/file/delete?id=xxx`。

### 2.2 幂等性（删不存在的文件）

- 当前文档里删不存在的文件返回错误码 `1001003001 / 文件不存在`。
- 期望：**幂等返回 `code: 0`**（更佳），或维持现状（前端会把该错误码当作"已删除"吞掉，也能接受）。

### 2.3 入参

保持现状不变：

```
DELETE /admin-api/system/file/delete?id=10001
```

---

## 3. 不在本次范围（避免误解）

以下事项**本次不做**，属于后续「治本方案」范畴，请勿顺手改动：

- 不需要在 `infra_file` 表加 `status`（temp / committed）字段
- 不需要加业务引用关系表
- 不需要做孤儿文件定时清理 cron
- 不需要改 `/presigned-url` 与 `/create`
- 不需要改 App 端 `/upload` 鉴权策略

---

## 4. 联调要点

1. 改造完成后请提供测试环境，前端会同步发版。
2. 接口返回的 `id` 请确保转为字符串再 JSON 序列化（不要直接序列化 Long）。
3. 若返回里 `id` 是 number 类型，前端视为联调未通过。

---

## 5. 一句话总结

> `/system/file/upload` 返回结构从 `string` 改成 `{ id: string, url: string }`，`id` 是 `infra_file.id` 的字符串形式。其它接口不动。
