Files
ccdi/docs/design/2026-03-23-credit-parsing-mock-server-design.md

296 lines
10 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.
# 征信解析 Mock Server 设计方案
## 1. 背景
当前仓库已经有一个基于 FastAPI 的 [lsfx-mock-server](/Users/wkc/Desktop/ccdi/ccdi/lsfx-mock-server),用于模拟流水分析平台接口。本次新增需求来自以下两份输入材料:
- `assets/征信解析/征信解析接口payload.xlsx`
- `assets/征信解析/HTML引擎服务_ 接口设计说明书_1.docx`
根据说明书,本次目标接口为 `POST /xfeature-mngs/conversation/htmlEval`,请求格式为 `form-data`,核心入参为 `model``file``hType`,返回结构为 `message``status_code``payload`。根据 Excel本次 `payload` 至少覆盖 30 个征信指标字段,分布在 `lx_header``lx_debt``lx_publictype` 三个主题域对象下。
本次工作目标不是实现真实 HTML 解析能力,而是在现有 Mock 服务中补齐一个“结构正确、返回稳定、便于联调”的征信解析接口。
## 2. 目标
- 在现有 [lsfx-mock-server](/Users/wkc/Desktop/ccdi/ccdi/lsfx-mock-server) 中新增征信解析 Mock 能力。
- 实现说明书中的单一核心接口 `POST /xfeature-mngs/conversation/htmlEval`
- 支持 `model``file``hType``form-data` 请求。
- 成功返回时输出与 Excel 字段定义一致的 `payload` 结构。
-`model + hType + 文件名` 生成稳定随机结果,保证同一请求重复调用结果一致。
- 提供最小调试能力,包括健康检查接口和按参数触发失败码。
## 3. 非目标
- 不解析真实 HTML 内容,不从文件正文抽取字段。
- 不新增说明书之外的业务接口。
- 不为每个字段单独编写硬编码生成逻辑。
- 不引入独立新项目或第二套运行框架。
- 不设计复杂的动态配置平台或可视化管理后台。
## 4. 方案对比
### 4.1 方案 A最短硬编码
直接在现有路由文件中追加征信接口,并把随机生成逻辑写在单个函数或单个 service 内。
优点:
- 实现最快。
缺点:
- 路由层会掺杂业务规则。
- 后续补错误码、字段规则、样例模板时可维护性差。
### 4.2 方案 B模块化扩展
在现有 [lsfx-mock-server](/Users/wkc/Desktop/ccdi/ccdi/lsfx-mock-server) 中新增独立的征信解析路由、service 和配置文件,复用当前 FastAPI 应用和启动方式。
优点:
- 保持实现路径最短。
- 复用现有工程基础设施和依赖。
- 征信解析逻辑与现有 LSFX Mock 逻辑隔离,后续扩展清晰。
缺点:
- 需要增加少量模块文件和配置文件。
### 4.3 方案 C全配置驱动
把 Excel 字段直接转换为运行时元数据,服务根据配置动态生成字段、校验和示例响应。
优点:
- 后续字段调整灵活。
缺点:
- 引入额外抽象,超出本次“最短路径实现”的边界。
## 5. 推荐方案
采用方案 B。
原因如下:
- 与用户确认的边界一致:直接扩展现有工程,不新建独立服务。
- 可以在不影响已有 LSFX Mock 链路的前提下补齐征信解析能力。
- 代码结构清晰,后续如果字段扩充或错误码增加,仍可局部修改。
## 6. 模块边界与目录设计
征信解析能力直接并入现有 [lsfx-mock-server](/Users/wkc/Desktop/ccdi/ccdi/lsfx-mock-server),但采用独立模块组织,避免与现有银行流水 Mock 逻辑混杂。
建议落点如下:
- `lsfx-mock-server/routers/credit_api.py`
- `lsfx-mock-server/services/credit_payload_service.py`
- `lsfx-mock-server/services/credit_debug_service.py`
- `lsfx-mock-server/config/credit_feature_schema.json`
- `lsfx-mock-server/config/credit_response_examples.json`
职责划分如下:
- `credit_api.py`:负责 HTTP 路由、`form-data` 入参接收、响应结构封装。
- `credit_payload_service.py`负责稳定随机种子生成、字段分组、payload 生成。
- `credit_debug_service.py`:负责调试标记识别、错误码映射、健康检查响应。
- `credit_feature_schema.json`:记录字段归属、类型、枚举范围等元数据。
- `credit_response_examples.json`:保存成功和失败响应模板,保证结构统一。
## 7. 接口设计
### 7.1 接口定义
- 方法:`POST`
- 路径:`/xfeature-mngs/conversation/htmlEval`
- Content-Type`multipart/form-data`
### 7.2 请求参数
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ---- | ---- | ---- |
| `model` | `String` | 是 | 查询主题域,当前只接受 `LXCUSTALL` |
| `file` | `File` | 是 | HTML 文件,仅校验上传存在 |
| `hType` | `String` | 是 | 报文类型,只接受 `PERSON``ENTERPRISE` |
说明:接口说明书的参数表明确 `hType` 当前支持 `PERSON/ENTERPRISE`,但错误码表中 `ERR_10003` 的文案写为“报文类型无效仅支持JSON/XML”。本设计将该差异视为原始文档歧义校验逻辑以参数表为准失败时的返回码与返回信息沿用错误码表定义。
### 7.3 成功响应
成功时统一返回:
```json
{
"message": "成功",
"payload": {
"lx_header": {},
"lx_debt": {},
"lx_publictype": {}
},
"status_code": "0"
}
```
### 7.4 失败响应
失败时统一返回:
```json
{
"message": "关键参数缺失,参数名: model",
"payload": null,
"status_code": "ERR_99999"
}
```
## 8. Payload 生成设计
### 8.1 生成原则
- 不解析真实 HTML 文件内容。
- 仅基于 `model + hType + 文件名` 计算稳定随机种子。
- 同一组输入每次调用返回相同结果。
- 不同 `model``hType` 或文件名组合返回不同结果。
### 8.2 字段分组
根据 Excel本次最小字段集合如下
- `lx_header`
- `query_cert_no`
- `query_cust_name`
- `report_time`
- `lx_debt`
- 房贷、车贷、经营贷、消费贷、其他贷款、非银行、信用卡等余额/金额/状态字段
- `lx_publictype`
- 民事判决、强制执行、行政处罚的记录数和金额字段
### 8.3 类型规则
为避免 30 个字段写成 30 段硬编码分支schema 只保留最小类型抽象:
- `string`
- `amount`
- `count`
- `status`
生成规则如下:
- `string`:生成符合业务格式的字符串。
- `amount`:生成非负金额字符串,保留两位小数。
- `count`:生成非负整数。
- `status`:严格从 schema 枚举中选值,当前为 `正常``逾期``不良`
### 8.4 头信息字段规则
虽然不解析真实 HTML头信息字段仍需保证格式可用
- `query_cert_no`:生成合法格式的证件号码样式字符串。
- `query_cust_name`:生成脱敏风格或常见中文姓名样式字符串。
- `report_time`:生成合法日期字符串,例如 `YYYY-MM-DD`
## 9. 错误处理设计
错误处理只覆盖说明书已明确的最小集合,不新增自定义协议。
| 场景 | 返回码 | 返回信息 |
| ---- | ------ | -------- |
| 缺少 `model``file``hType` | `ERR_99999` | `关键参数缺失,参数名: XX` |
| `model` 不为 `LXCUSTALL` | `ERR_10002` | `无效的主题域` |
| `hType` 不为 `PERSON``ENTERPRISE` | `ERR_10003` | `报文类型无效仅支持JSON/XML` |
| 调试标记触发无效证件号类错误 | `ERR_10001` | `无效的证件号码` |
| 调试标记触发机构号错误 | `ERR_10004` | `无效机构号或行社号` |
| 调试标记触发权限错误 | `ERR_10005` | `无权限访问` |
| 调试标记触发服务异常 | `ERR_10006` | `尽调报告生成异常:异步事件发送失败` |
调试标记建议复用现有 Mock 服务习惯,通过 `model` 中包含类似 `error_ERR_10001` 的值触发对应错误响应。
## 10. 调试能力设计
本次只提供最小调试能力:
- 提供健康检查接口,例如 `GET /credit/health`
- 支持通过特定 `model` 值触发失败码。
- 不额外增加复杂调试参数。
- 不支持运行时在线修改字段配置。
这样既能满足联调和测试,又不会偏离主业务接口行为。
## 11. 配置组织设计
Excel 文件只作为需求输入,不作为运行时依赖。服务运行时改为读取项目内的 JSON schema。
`credit_feature_schema.json` 建议字段结构如下:
```json
[
{
"domain": "lx_header",
"field": "query_cert_no",
"type": "string"
},
{
"domain": "lx_debt",
"field": "uncle_bank_house_state",
"type": "status",
"options": ["正常", "逾期", "不良"]
}
]
```
这样可以保证:
- 扩充字段时只需要补 schema。
- 生成逻辑聚焦类型,不直接绑定具体字段数量。
- 响应结构仍保持说明书和 Excel 要求。
## 12. 测试与验收设计
测试边界保持最短闭环:
- 单元测试
- 成功响应结构正确。
- 同一输入返回稳定随机一致结果。
- 不同输入返回不同随机结果。
- 调试标记能返回预期错误码。
- 接口测试
- `multipart/form-data` 上传可被正确接收。
- 缺参时返回说明书约定格式。
- 健康检查接口返回可用状态。
验收重点如下:
- 调用方按说明书格式发起请求时,能拿到合法 JSON 响应。
- `payload` 字段结构与 Excel 保持一致。
- 同一组请求参数重复调用时结果一致。
- 参数异常时返回约定错误码与错误信息。
## 13. 文档与实施计划要求
按仓库约定,设计确认后需要继续产出两份实施计划:
- 后端实施计划:`docs/plans/backend/`
- 前端实施计划:`docs/plans/frontend/`
由于本次主体是 Mock 服务开发,前端计划可聚焦联调接入、调试入口或调用说明,不扩展无关页面开发。
后续进入实现阶段后,还需补充本次改动的实施记录到 `docs/reports/implementation/`
## 14. 实现落点
预计涉及如下文件范围:
- 新增 `lsfx-mock-server/routers/credit_api.py`
- 新增 `lsfx-mock-server/services/credit_payload_service.py`
- 新增 `lsfx-mock-server/services/credit_debug_service.py`
- 新增 `lsfx-mock-server/config/credit_feature_schema.json`
- 新增 `lsfx-mock-server/config/credit_response_examples.json`
- 按需修改 `lsfx-mock-server/main.py` 或路由注册入口
- 新增对应测试文件
## 15. 结论
本方案采用“在现有 Mock 服务中模块化扩展征信解析能力”的方式,以单接口、稳定随机、最小调试能力为边界完成征信解析 Mock Server 建设。该方案满足当前联调目标,同时避免引入真实 HTML 解析和过度设计,符合最短路径实现要求。