# 接口参数对比检查报告 **检查时间**: 2026-03-03 **检查范围**: lsfx-mock-server 所有接口参数与文档对比 --- ## 📋 总览 | 接口序号 | 接口名称 | 状态 | 问题数量 | |---------|---------|------|---------| | 1 | 新建项目并获取token | ❌ **严重** | 5个问题 | | 2 | 上传文件接口 | ✅ 一致 | 0个问题 | | 3 | 拉取行内流水接口 | ✅ 一致 | 0个问题 | | 4 | 判断文件是否解析结束 | ✅ 一致 | 0个问题 | | 5 | 删除文件接口 | ⚠️ 额外实现 | 文档中未提及 | | 6 | 获取流水列表 | ✅ 一致 | 0个问题 | --- ## 1️⃣ 新建项目并获取token - ❌ **严重问题** ### 缺少的必填参数(3个) | 参数名 | 文档要求 | 代码实现 | 严重性 | |--------|---------|---------|--------| | **appId** | `String` 必填,固定值 `"remote_app"` | ❌ **缺失** | 🔴 高 - 认证参数 | | **appSecretCode** | `String` 必填,安全码 | ❌ **缺失** | 🔴 高 - 认证参数 | | **role** | `String` 必填,固定值 `"VIEWER"` | ❌ **缺失** | 🟡 中 - 权限参数 | ### 类型错误(1个) | 参数名 | 文档要求 | 代码实现 | 说明 | |--------|---------|---------|------| | **analysisType** | `String` 必填 | `Optional[int]` 可选 | 应改为 `str` 类型 | ### 必填性错误(1个) | 参数名 | 文档要求 | 代码实现 | 说明 | |--------|---------|---------|------| | **departmentCode** | 必填 | `Optional[str]` 可选 | 应改为必填 | ### 完整参数对比表(15个参数) | 序号 | 参数名 | 文档类型 | 文档必填 | 代码类型 | 代码必填 | 状态 | |-----|--------|---------|---------|---------|---------|------| | 1 | projectNo | String | ✅ 是 | str | ✅ 是 | ✅ | | 2 | entityName | String | ✅ 是 | str | ✅ 是 | ✅ | | 3 | userId | String | ✅ 是 | str | ✅ 是 | ✅ | | 4 | userName | String | ✅ 是 | str | ✅ 是 | ✅ | | 5 | **appId** | String | ✅ 是 | - | - | ❌ **缺失** | | 6 | **appSecretCode** | String | ✅ 是 | - | - | ❌ **缺失** | | 7 | **role** | String | ✅ 是 | - | - | ❌ **缺失** | | 8 | orgCode | String | ✅ 是 | str | ✅ 是 | ✅ | | 9 | entityId | String | 否 | Optional[str] | 否 | ✅ | | 10 | xdRelatedPersons | String | 否 | Optional[str] | 否 | ✅ | | 11 | jzDataDateId | String | 否 | Optional[str] | 否 | ✅ | | 12 | innerBSStartDateId | String | 否 | Optional[str] | 否 | ✅ | | 13 | innerBSEndDateId | String | 否 | Optional[str] | 否 | ✅ | | 14 | **analysisType** | String | ✅ 是 | Optional[int] | 否 | ⚠️ **类型错误** | | 15 | **departmentCode** | String | ✅ 是 | Optional[str] | 否 | ⚠️ **必填性错误** | --- ## 2️⃣ 上传文件接口 - ✅ **完全一致** ### 请求参数对比 | 参数名 | 文档类型 | 文档必填 | 代码类型 | 代码必填 | 状态 | |--------|---------|---------|---------|---------|------| | groupId | Int | ✅ 是 | int (Form) | ✅ 是 | ✅ | | file | File | ✅ 是 | UploadFile | ✅ 是 | ✅ | **结论**: 参数完全一致,无缺失。 --- ## 3️⃣ 拉取行内流水接口 - ✅ **完全一致** ### 请求参数对比 | 参数名 | 文档类型 | 文档必填 | 代码类型 | 代码必填 | 状态 | |--------|---------|---------|---------|---------|------| | groupId | Int | ✅ 是 | int | ✅ 是 | ✅ | | customerNo | String | ✅ 是 | str | ✅ 是 | ✅ | | dataChannelCode | String | ✅ 是 | str | ✅ 是 | ✅ | | requestDateId | Int | ✅ 是 | int | ✅ 是 | ✅ | | dataStartDateId | Int | ✅ 是 | int | ✅ 是 | ✅ | | dataEndDateId | Int | ✅ 是 | int | ✅ 是 | ✅ | | uploadUserId | int | ✅ 是 | int | ✅ 是 | ✅ | **结论**: 参数完全一致,无缺失。 --- ## 4️⃣ 判断文件是否解析结束 - ✅ **完全一致** ### 请求参数对比 | 参数名 | 文档类型 | 文档必填 | 代码类型 | 代码必填 | 状态 | |--------|---------|---------|---------|---------|------| | groupId | Int | ✅ 是 | int | ✅ 是 | ✅ | | inprogressList | String | ✅ 是 | str | ✅ 是 | ✅ | **结论**: 参数完全一致,无缺失。 --- ## 5️⃣ 删除文件接口 - ⚠️ **文档中未提及** ### 代码实现的参数 | 参数名 | 代码类型 | 代码必填 | |--------|---------|---------| | groupId | int | ✅ 是 | | logIds | List[int] | ✅ 是 | | userId | int | ✅ 是 | **结论**: 接口路径 `/watson/api/project/batchDeleteUploadFile` 在文档的调用流程中提到,但没有详细的参数说明文档。 --- ## 6️⃣ 获取流水列表 - ✅ **完全一致** ### 请求参数对比 | 参数名 | 文档类型 | 文档必填 | 代码类型 | 代码必填 | 状态 | |--------|---------|---------|---------|---------|------| | groupId | Int | ✅ 是 | int | ✅ 是 | ✅ | | logId | Int | ✅ 是 | int | ✅ 是 | ✅ | | pageNow | Int | ✅ 是 | int | ✅ 是 | ✅ | | pageSize | Int | ✅ 是 | int | ✅ 是 | ✅ | **结论**: 参数完全一致,无缺失。 --- ## 🎯 总结 ### ❌ **严重问题** **接口1 - 获取Token接口缺少3个关键认证参数:** - `appId` - 固定值 `"remote_app"` - `appSecretCode` - 安全码,格式为 `md5(projectNo + "_" + entityName + "_" + dXj6eHRmPv)` - `role` - 固定值 `"VIEWER"` 这3个参数缺失会导致接口调用失败(错误码 40101, 40102)。 ### ⚠️ **次要问题** 1. `analysisType` 类型应为 `str` 而非 `int` 2. `departmentCode` 应为必填而非可选 ### ✅ **正常接口** 其他5个接口参数完全一致,无缺失问题。 --- ## 📝 修复建议 ### 1. 修复 GetTokenRequest 模型 **当前代码:** ```python class GetTokenRequest(BaseModel): projectNo: str entityName: str userId: str userName: str orgCode: str entityId: Optional[str] = None xdRelatedPersons: Optional[str] = None jzDataDateId: Optional[str] = "0" innerBSStartDateId: Optional[str] = "0" innerBSEndDateId: Optional[str] = "0" analysisType: Optional[int] = -1 departmentCode: Optional[str] = None ``` **应修改为:** ```python class GetTokenRequest(BaseModel): projectNo: str = Field(..., description="项目编号,格式:902000_当前时间戳") entityName: str = Field(..., description="项目名称") userId: str = Field(..., description="操作人员编号,固定值") userName: str = Field(..., description="操作人员姓名,固定值") appId: str = Field("remote_app", description="应用ID,固定值") appSecretCode: str = Field(..., description="安全码,md5(projectNo + '_' + entityName + '_' + dXj6eHRmPv)") role: str = Field("VIEWER", description="角色,固定值") orgCode: str = Field(..., description="行社机构号,固定值") entityId: Optional[str] = Field(None, description="企业统信码或个人身份证号") xdRelatedPersons: Optional[str] = Field(None, description="信贷关联人信息") jzDataDateId: Optional[str] = Field("0", description="拉取指定日期推送过来的金综链流水") innerBSStartDateId: Optional[str] = Field("0", description="拉取行内流水开始日期") innerBSEndDateId: Optional[str] = Field("0", description="拉取行内流水结束日期") analysisType: str = Field("-1", description="分析类型,固定值") departmentCode: str = Field(..., description="客户经理所属营业部/分理处的机构编码") ``` ### 2. 注意事项 - `appSecretCode` 需要在服务端计算 MD5 值 - `appId` 和 `role` 虽然是固定值,但仍需在请求体中传递 - `analysisType` 应为字符串类型 `"-1"`,而不是整数 `-1` --- **检查完成时间**: 2026-03-03 **检查人员**: Claude Code