12 KiB
12 KiB
流水分析 Mock 服务器接口完整对齐设计
日期: 2026-03-04
目标: 根据 兰溪-流水分析对接3.md 文档,完整对齐所有接口实现
概述
本次更新将 Mock 服务器完全对齐最新的接口文档,包括新增缺失接口、完善响应字段、统一错误处理。采用渐进式更新策略,保持现有功能不受影响。
设计目标
- 新增缺失接口 - 实现文档中的第5个接口(获取单个文件上传状态)
- 响应字段完整 - 所有7个接口的响应字段完全对齐文档示例
- 数据模型增强 - 扩展文件记录模型以支持完整字段
- 错误码完善 - 补充文档中提到的所有错误码
- 无测试依赖 - 按用户要求,不涉及测试用例更新
架构设计
总体架构
保持现有无数据库架构不变,通过内存数据结构增强支持完整字段存储。
┌─────────────────────────────────────────┐
│ 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- 上传用户IDfile_upload_by_user_name: str- 上传用户名file_upload_time: str- 上传时间(如 "2026-02-27 09:50:18")le_id: int- 法律实体IDlogin_le_id: int- 登录法律实体IDlog_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: 生成随机UUIDfile_upload_time: 使用当前服务器时间total_records: 随机生成(100-300)trx_date_start_id/trx_date_end_id: 生成合理的日期范围- 其他字段: 使用文档示例中的典型值
2. 新增接口实现
接口5:GET /watson/api/project/bs/upload
功能: 获取单个文件上传后的状态
请求参数:
groupId(int, 必填) - 项目IDlogId(int, 可选) - 文件ID
响应结构:
{
"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
}
实现逻辑:
- 路由:在
routers/api.py添加 GET 路由 - 服务:在
file_service.py添加get_upload_status(groupId, logId)方法 - 逻辑:
- 如果提供
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: 未知异常
错误响应格式
{
"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.jsonconfig/responses/upload.jsonconfig/responses/parse_status.jsonconfig/responses/bank_statement.json- 新建
config/responses/upload_status.json
- 内容: 补充所有缺失字段,对齐文档示例
- 验证: 调用接口返回完整字段
步骤5:错误码补充
- 文件:
utils/error_simulator.py - 内容: 添加 40100 错误码
- 验证: 使用
error_40100能触发对应错误
步骤6:文档更新
- 文件:
CLAUDE.mdREADME.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 字段不使用字符串
成功标准
- 所有7个接口都能正常调用
- 每个接口的响应字段完全对齐文档示例
- 错误标记机制在所有接口中都能正常工作
- 新增的 40100 错误码能正确触发
- 服务启动无报错,能正常处理请求
后续工作
本次更新完成后,Mock 服务器将完全对齐接口文档,可以支持前端开发和集成测试。后续可根据实际使用情况:
- 调整字段生成逻辑(如更真实的数据)
- 添加更多银行的模板支持
- 优化错误场景的模拟