Files
ccdi/lsfx-mock-server/CLAUDE.md
2026-03-13 16:50:43 +08:00

173 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 项目概述
这是一个基于 FastAPI 的 Mock 服务器,用于模拟流水分析平台的 7 个核心接口。主要特点:
- **无数据库设计** - 使用内存存储,服务重启后数据丢失
- **配置驱动** - 响应数据来自 `config/responses/` 下的 JSON 模板
- **错误场景模拟** - 通过 `error_XXXX` 标记触发特定错误码
- **异步文件解析** - 使用 FastAPI BackgroundTasks 模拟 4 秒解析延迟
## 常用命令
### 开发运行
```bash
# 安装依赖
pip install -r requirements.txt
# 启动服务(普通模式)
python main.py
# 启动服务(热重载模式,推荐开发时使用)
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# 访问 API 文档
# Swagger UI: http://localhost:8000/docs
# ReDoc: http://localhost:8000/redoc
```
### 测试
```bash
# 运行所有测试
pytest tests/ -v
# 运行单个测试文件
pytest tests/test_api.py -v
# 生成覆盖率报告
pytest tests/ -v --cov=. --cov-report=html
```
### Docker 部署
```bash
# 构建镜像
docker build -t lsfx-mock-server .
# 运行容器
docker run -d -p 8000:8000 --name lsfx-mock lsfx-mock-server
# 或使用 Docker Compose
docker-compose up -d
```
## 架构设计
### 目录结构
```
lsfx-mock-server/
├── main.py # FastAPI 应用入口
├── config/
│ ├── settings.py # 全局配置(通过环境变量覆盖)
│ └── responses/ # JSON 响应模板token.json, upload.json 等)
├── models/
│ ├── request.py # Pydantic 请求模型
│ └── response.py # Pydantic 响应模型
├── services/ # 业务逻辑层(核心)
│ ├── token_service.py # Token 管理和项目创建
│ ├── file_service.py # 文件上传、解析状态、删除
│ └── statement_service.py # 银行流水查询和分页
├── routers/
│ └── api.py # API 路由定义7个接口
└── utils/
├── error_simulator.py # 错误场景检测和响应构建
└── response_builder.py # 从 JSON 模板构建响应
```
### 核心组件交互
1. **请求流程**:
- `routers/api.py` 接收请求 → 检查错误标记 → 调用 Service → 返回响应
2. **文件上传流程**:
- `FileService.upload_file()` 生成 logId → 存储初始记录 → 启动后台任务
- 后台任务: 延迟 4 秒 → 更新解析状态为完成
- 客户端轮询 `check_parse_status()` 查看是否解析完成
3. **错误触发机制**:
- 在任意字符串参数中包含 `error_XXXX`(如 `projectNo: "test_error_40101"`
- `ErrorSimulator.detect_error_marker()` 检测标记
- 返回预定义的错误响应(见 `error_simulator.py` ERROR_CODES
### 服务类职责
- **TokenService**: 管理 projectId 和 token 映射关系(内存字典)
- **FileService**: 管理文件记录、解析状态、支持后台任务
- `fetch_inner_flow()`: 返回随机 logId 数组(简化管理,不存储记录)
- **StatementService**: 从 JSON 模板读取流水数据并分页返回
## 开发指南
### 添加新接口
1.`models/request.py``models/response.py` 中定义数据模型(如果需要)
2.`services/` 中实现业务逻辑方法
3.`routers/api.py` 中添加路由处理函数
4.`config/responses/` 中添加 JSON 响应模板(可选)
5.`tests/` 中添加测试用例
### 修改响应数据
直接编辑 `config/responses/` 下的 JSON 文件,重启服务即可生效。无需修改代码。
### 添加新的错误码
`utils/error_simulator.py``ERROR_CODES` 字典中添加新条目:
```python
ERROR_CODES = {
"40101": {"code": "40101", "message": "appId错误"},
# 添加新的错误码...
}
```
### 配置管理
- 默认配置在 `config/settings.py` 中的 `Settings`
- 通过 `.env` 文件覆盖(参考 `.env.example`
- 重要配置项:
- `PARSE_DELAY_SECONDS`: 文件解析延迟秒数(默认 4
- `INITIAL_PROJECT_ID`: 项目ID起始值默认 1000
- `INITIAL_LOG_ID`: 文件ID起始值默认 10000
## 测试说明
- 测试框架: pytest + httpxFastAPI 测试客户端)
- 测试文件位于 `tests/` 目录
- `conftest.py` 包含测试夹具fixtures
- 所有 API 端点都有对应的集成测试
- 测试覆盖了成功场景和错误场景(通过 error_XXXX 标记)
## API 接口说明
7个核心接口
1. `/account/common/getToken` (POST) - 创建项目并获取 Token
2. `/watson/api/project/remoteUploadSplitFile` (POST) - 上传流水文件multipart/form-data
3. `/watson/api/project/getJZFileOrZjrcuFile` (POST) - 拉取行内流水
4. `/watson/api/project/upload/getpendings` (POST) - 检查文件解析状态
5. `/watson/api/project/bs/upload` (GET) - 获取单个文件上传后的状态(独立接口,基于 logId 生成确定性数据)
6. `/watson/api/project/batchDeleteUploadFile` (POST) - 批量删除文件
7. `/watson/api/project/getBSByLogId` (POST) - 获取银行流水(分页)
详细接口文档请访问 Swagger UI (`/docs`) 或查看 `assets/兰溪-流水分析对接3.md`
## 注意事项
- **数据持久化**: 所有数据存储在内存中,服务重启后数据丢失
- **响应字段完整性**: 所有接口响应字段完全对齐接口文档示例
- **并发安全**: 当前实现未考虑多线程安全,生产环境需要加锁
- **文件存储**: 上传的文件不实际保存,仅模拟元数据
- **错误标记**: 错误触发通过字符串匹配实现,确保测试数据唯一性
- **后台任务**: FastAPI BackgroundTasks 在同一进程内执行,不会阻塞响应
- **请求头处理**: X-Xencio-Client-Id 请求头不验证,接受任意值
- **行内流水接口特殊性**:
- 简化管理:不存储到 file_records
- 随机 logId无需持久化仅用于返回
- 无后续操作:不支持解析状态检查、删除或查询流水
- **获取单个文件上传状态接口特殊性**:
- 完全独立工作:不依赖文件上传记录
- 确定性数据生成:基于 logId 参数使用随机种子生成数据
- 相同 logId 一致性:相同 logId 每次查询返回相同的核心字段值
- 无 logId 场景:不带 logId 参数时返回空 logs 数组