# 流水分析 Mock 服务器接口完整对齐设计

**日期：** 2026-03-04
**目标：** 根据 `兰溪-流水分析对接3.md` 文档，完整对齐所有接口实现

## 概述

本次更新将 Mock 服务器完全对齐最新的接口文档，包括新增缺失接口、完善响应字段、统一错误处理。采用渐进式更新策略，保持现有功能不受影响。

## 设计目标

1. **新增缺失接口** - 实现文档中的第5个接口（获取单个文件上传状态）
2. **响应字段完整** - 所有7个接口的响应字段完全对齐文档示例
3. **数据模型增强** - 扩展文件记录模型以支持完整字段
4. **错误码完善** - 补充文档中提到的所有错误码
5. **无测试依赖** - 按用户要求，不涉及测试用例更新

## 架构设计

### 总体架构

保持现有无数据库架构不变，通过内存数据结构增强支持完整字段存储。

```
┌─────────────────────────────────────────┐
│           FastAPI 应用                   │
├─────────────────────────────────────────┤
│  routers/api.py                         │
│  ├─ 7个接口路由（新增接口5）             │
│  └─ 错误标记检测                        │
├─────────────────────────────────────────┤
│  services/                              │
│  ├─ token_service.py                    │
│  ├─ file_service.py（增强）             │
│  │  ├─ FileRecord（扩展字段）           │
│  │  ├─ upload_file()（初始化完整字段）  │
│  │  ├─ get_upload_status()（新增）      │
│  │  └─ delete_files()                   │
│  └─ statement_service.py                │
├─────────────────────────────────────────┤
│  config/responses/                      │
│  ├─ token.json（更新）                  │
│  ├─ upload.json（更新）                 │
│  ├─ parse_status.json（更新）           │
│  ├─ bank_statement.json（更新）         │
│  └─ upload_status.json（新建）          │
├─────────────────────────────────────────┤
│  utils/                                 │
│  └─ error_simulator.py（补充错误码）    │
└─────────────────────────────────────────┘
```

## 核心设计

### 1. 数据模型扩展

#### FileRecord 扩展字段

在 `services/file_service.py` 中扩展 `FileRecord` 类：

**现有字段：**
- `log_id`, `group_id`, `file_name`, `status`, `upload_status_desc`, `parsing`

**新增字段（对齐文档）：**
- `account_no_list: List[str]` - 账号列表
- `enterprise_name_list: List[str]` - 主体名称列表
- `bank_name: str` - 银行名称（如 "ZJRCU", "ALIPAY", "BSX"）
- `real_bank_name: str` - 真实银行名称
- `template_name: str` - 模板名称（如 "ZJRCU_T251114"）
- `data_type_info: List[str]` - 数据类型（如 ["CSV", ","]）
- `file_size: int` - 文件大小（字节）
- `download_file_name: str` - 下载文件名
- `file_package_id: str` - 文件包ID（UUID格式）
- `file_upload_by: int` - 上传用户ID
- `file_upload_by_user_name: str` - 上传用户名
- `file_upload_time: str` - 上传时间（如 "2026-02-27 09:50:18"）
- `le_id: int` - 法律实体ID
- `login_le_id: int` - 登录法律实体ID
- `log_type: str` - 日志类型（如 "bankstatement"）
- `log_meta: str` - 日志元数据（JSON字符串）
- `lost_header: List[str]` - 丢失的头部信息
- `rows: int` - 行数
- `source: str` - 来源（如 "http"）
- `total_records: int` - 总记录数
- `trx_date_start_id: int` - 交易开始日期ID（如 20240201）
- `trx_date_end_id: int` - 交易结束日期ID（如 20240228）
- `is_split: int` - 是否分割（0或1）

#### 字段初始化策略

- `bank_name`: 根据文件名推断（包含"支付宝"→"ALIPAY"，默认"ZJRCU"）
- `template_name`: 根据 bank_name 生成（如 "ZJRCU_T251114"）
- `file_package_id`: 生成随机UUID
- `file_upload_time`: 使用当前服务器时间
- `total_records`: 随机生成（100-300）
- `trx_date_start_id`/`trx_date_end_id`: 生成合理的日期范围
- 其他字段: 使用文档示例中的典型值

### 2. 新增接口实现

#### 接口5：GET `/watson/api/project/bs/upload`

**功能：** 获取单个文件上传后的状态

**请求参数：**
- `groupId` (int, 必填) - 项目ID
- `logId` (int, 可选) - 文件ID

**响应结构：**
```json
{
  "code": "200",
  "data": {
    "logs": [
      {
        "accountNoList": ["18785967364"],
        "bankName": "ALIPAY",
        "dataTypeInfo": ["CSV", ","],
        "downloadFileName": "支付宝.csv",
        "enterpriseNameList": ["曾孝成"],
        "fileSize": 16322,
        "fileUploadBy": 448,
        "fileUploadByUserName": "admin@support.com",
        "fileUploadTime": "2025-03-13 08:45:32",
        "isSplit": 0,
        "leId": 10741,
        "logId": 13994,
        "logMeta": "{\"lostHeader\":[],\"balanceAmount\":\"-1\"}",
        "logType": "bankstatement",
        "loginLeId": 10741,
        "lostHeader": [],
        "realBankName": "ALIPAY",
        "rows": 0,
        "source": "http",
        "status": -5,
        "templateName": "ALIPAY_T220708",
        "totalRecords": 127,
        "trxDateEndId": 20231231,
        "trxDateStartId": 20230102,
        "uploadFileName": "支付宝.pdf",
        "uploadStatusDesc": "data.wait.confirm.newaccount"
      }
    ],
    "status": "",
    "accountId": 8954,
    "currency": "CNY"
  },
  "status": "200",
  "successResponse": true
}
```

**实现逻辑：**
1. 路由：在 `routers/api.py` 添加 GET 路由
2. 服务：在 `file_service.py` 添加 `get_upload_status(groupId, logId)` 方法
3. 逻辑：
   - 如果提供 `logId`，返回该特定文件的状态
   - 如果不提供 `logId`，返回该项目的所有文件状态
   - 从 `file_records` 中查询并构建响应

**特殊处理：**
- `accountId` 和 `currency`: 从文件记录中提取或使用默认值（8954, "CNY"）
- 空主体标识：如果 `enterpriseNameList` 仅包含空字符串，表示流水文件未生成主体

### 3. 现有接口响应字段更新

#### 接口1：`/account/common/getToken`
- 确认 `data.analysisType` 类型为 Integer
- 保持其他字段不变

#### 接口2：`/watson/api/project/remoteUploadSplitFile`
- 补充 `accountsOfLog` 结构
- 完善 `uploadLogList` 中的所有字段
- 新增 `uploadStatus` 字段（固定值 1）

#### 接口3：`/watson/api/project/getJZFileOrZjrcuFile`
- 保持现有响应格式
- 返回 `{code, data: [logId数组], status, successResponse}`

#### 接口4：`/watson/api/project/upload/getpendings`
- 补充 `data.pendingList` 中的所有字段
- 确保包含 `isSplit`, `lostHeader`, `leId`, `loginLeId` 等

#### 接口6：`/watson/api/project/batchDeleteUploadFile`
- 注意 `code` 字段为 "200 OK" 而非 "200"
- 响应格式：`{code: "200 OK", data: {message: "delete.files.success"}, ...}`

#### 接口7：`/watson/api/project/getBSByLogId`
- 补充 `bankStatementList` 中每个对象的所有50+个字段
- 字段包括：accountId, accountMaskNo, accountingDate, balanceAmount, bank, bankStatementId, bankTrxNumber, batchId, cashType, crAmount, cretNo, currency, customerAccountMaskNo, customerBank, customerId, customerName, drAmount, groupId, leId, leName, transAmount, transFlag, trxDate, userMemo 等

### 4. 错误码完善

#### 当前错误码（已有）
- 40101: appId错误
- 40102: appSecretCode错误
- 40104: 可使用项目次数为0，无法创建项目
- 40105: 只读模式下无法新建项目
- 40106: 错误的分析类型，不在规定的取值范围内
- 40107: 当前系统不支持的分析类型
- 40108: 当前用户所属行社无权限
- 501014: 无行内流水文件

#### 新增错误码
- 40100: 未知异常

#### 错误响应格式
```json
{
  "code": "错误码",
  "message": "错误描述",
  "status": "错误码",
  "successResponse": false
}
```

#### 错误触发机制
- 在任意字符串参数中包含 `error_XXXX` 标记
- 例如：`projectNo: "test_error_40100"` 触发 40100 错误

### 5. 请求头处理

#### X-Xencio-Client-Id
- **策略：** 不验证，接受任意值
- **原因：** 简化测试，不需要记住特定的 client-id
- **实现：** FastAPI 不检查该请求头

## 实施计划

### 步骤1：数据模型扩展
- **文件：** `services/file_service.py`
- **内容：** 扩展 `FileRecord` 类，添加所有新字段
- **验证：** 启动服务无报错

### 步骤2：文件服务增强
- **文件：** `services/file_service.py`
- **内容：**
  - 在 `upload_file()` 方法中初始化所有新字段
  - 添加 `get_upload_status()` 方法
  - 更新 `delete_files()` 方法以处理新增字段
- **验证：** 上传文件后能返回完整字段

### 步骤3：新增接口路由
- **文件：** `routers/api.py`
- **内容：** 添加 GET `/watson/api/project/bs/upload` 路由
- **验证：** 访问 `/docs` 能看到新接口

### 步骤4：响应模板更新
- **文件：**
  - `config/responses/token.json`
  - `config/responses/upload.json`
  - `config/responses/parse_status.json`
  - `config/responses/bank_statement.json`
  - 新建 `config/responses/upload_status.json`
- **内容：** 补充所有缺失字段，对齐文档示例
- **验证：** 调用接口返回完整字段

### 步骤5：错误码补充
- **文件：** `utils/error_simulator.py`
- **内容：** 添加 40100 错误码
- **验证：** 使用 `error_40100` 能触发对应错误

### 步骤6：文档更新
- **文件：**
  - `CLAUDE.md`
  - `README.md`（如存在）
- **内容：** 添加新接口说明，更新注意事项

## 文件变更清单

```
services/file_service.py              [修改] - 数据模型和服务方法
routers/api.py                         [修改] - 新增接口路由
utils/error_simulator.py               [修改] - 新增错误码
config/responses/token.json            [修改] - 完善响应字段
config/responses/upload.json           [修改] - 完善响应字段
config/responses/parse_status.json     [修改] - 完善响应字段
config/responses/bank_statement.json   [修改] - 完善响应字段
config/responses/upload_status.json    [新建] - 接口5响应模板
CLAUDE.md                              [修改] - 更新接口说明
README.md                              [修改] - 更新项目说明（如存在）
```

## 风险评估

### 低风险
- 数据模型扩展：仅添加字段，不影响现有功能
- 响应模板更新：仅添加字段，向后兼容
- 错误码补充：新增错误码，不影响现有错误处理

### 需注意
- 文件上传逻辑：需要确保所有新字段都正确初始化
- 时间格式：确保 `file_upload_time` 使用正确的格式
- 字段类型：确保 Integer 字段不使用字符串

## 成功标准

1. 所有7个接口都能正常调用
2. 每个接口的响应字段完全对齐文档示例
3. 错误标记机制在所有接口中都能正常工作
4. 新增的 40100 错误码能正确触发
5. 服务启动无报错，能正常处理请求

## 后续工作

本次更新完成后，Mock 服务器将完全对齐接口文档，可以支持前端开发和集成测试。后续可根据实际使用情况：
- 调整字段生成逻辑（如更真实的数据）
- 添加更多银行的模板支持
- 优化错误场景的模拟
