Files
leaudit-platform-backend/docs/合同模板搜索合同起草/合同模板前端切换新接口改造清单.md

254 lines
5.9 KiB
Markdown

## 目标
`contract-template` 相关页面从旧的 PostgREST 直连方式切换到新的 FastAPI 业务接口,范围仅覆盖:
- 模板分类
- 模板列表
- 模板搜索
- 模板详情
本清单不包含“起草合同”能力,后续会作为独立模块重新开发。
## 当前前端依赖点
当前前端核心依赖集中在:
- `legal-platform-frontend/lib/api/legacy/contract-template/templates.ts`
这个文件现在直接调用:
- `/api/postgrest/proxy/contract_categories`
- `/api/postgrest/proxy/contract_templates`
受影响页面:
- `app/(audit)/contract-template/search/page.tsx`
- `app/(audit)/contract-template/search/results/page.tsx`
- `app/(audit)/contract-template/list/page.tsx`
- `app/(audit)/contract-template/detail/[id]/page.tsx`
## 推荐新接口
建议前端最终切换为:
1. `GET /api/v3/contract-templates/categories`
2. `GET /api/v3/contract-templates`
3. `GET /api/v3/contract-templates/search`
4. `GET /api/v3/contract-templates/{id}`
## 改造步骤
### 第 1 步:新增新接口客户端文件
建议新增:
- `legal-platform-frontend/lib/api/contract-template/index.ts`
职责:
- 仅封装新的业务后端接口
- 不再依赖 `postgrest-client.ts`
- 返回字段尽量与页面现有消费结构兼容
建议方法:
- `getContractTemplateCategories`
- `getContractTemplateList`
- `searchContractTemplateList`
- `getContractTemplateDetail`
### 第 2 步:定义前端接口类型
建议在新客户端文件中定义或复用以下类型:
- `ContractTemplateCategory`
- `ContractTemplateListItem`
- `ContractTemplatePage`
- `ContractTemplateDetail`
- `ContractTemplateSearchResult`
字段建议优先与新后端对齐,然后在页面边界做一次轻量转换,避免业务层长期保留 snake_case 和 camelCase 混用。
### 第 3 步:改造搜索首页
文件:
- `app/(audit)/contract-template/search/page.tsx`
当前行为:
-`getContractCategoriesWithCount`
改造后:
- 改为调用 `getContractTemplateCategories`
- 直接消费后端返回的 `templateCount`
页面影响:
- `transformCategory` 中的 `template_count` 改为新接口字段
### 第 4 步:改造列表页
文件:
- `app/(audit)/contract-template/list/page.tsx`
当前行为:
-`getContractTemplates`
- 同时调 `getContractCategoriesWithCount`
改造后:
- 列表数据改为 `getContractTemplateList`
- 分类数据改为 `getContractTemplateCategories`
注意事项:
- 当前页面把 `sortBy=relevance` 映射成 `id.asc`,这是旧 PostgREST 兼容逻辑
- 切换新接口后应明确排序语义:
- `relevance` 仅搜索场景有效
- 列表页默认建议改为 `updated_at desc`
### 第 5 步:改造搜索结果页
文件:
- `app/(audit)/contract-template/search/results/page.tsx`
当前行为:
-`searchContractTemplates`
- 额外循环所有分类,再逐类搜索统计命中数
改造后:
- 改为一次调用 `searchContractTemplateList`
- 直接使用后端返回的 `categoryStats`
收益:
- 避免当前每次搜索都发起多次分类二次查询
- 页面搜索耗时会明显降低
### 第 6 步:改造详情页
文件:
- `app/(audit)/contract-template/detail/[id]/page.tsx`
当前行为:
-`getContractTemplate`
改造后:
- 改为调用 `getContractTemplateDetail`
注意事项:
- 页面中依赖:
- `template_code`
- `file_path`
- `pdf_file_path`
- `placeholder_schema`
- `category.name`
- `category.description`
- 新接口最好直接扁平返回,前端减少再拼装
### 第 7 步:保留旧文件作为过渡,避免一次性大改
建议不要立刻删除:
- `lib/api/legacy/contract-template/templates.ts`
更稳妥的做法:
1. 新建新接口客户端文件
2. 页面逐个切换
3. 确认没有页面再引用旧文件
4. 再删除旧实现
## 字段映射建议
建议后端返回使用 camelCase 还是 snake_case,前后端尽量统一一次定死。
如果后端沿用当前 Python VO 风格的 snake_case,那么前端建议统一在 API client 中做转换:
- `template_code -> templateCode`
- `category_id -> categoryId`
- `file_path -> filePath`
- `pdf_file_path -> pdfFilePath`
- `placeholder_schema -> placeholderSchema`
- `updated_at -> updatedAt`
不要把这类转换分散在页面组件里。
## 具体函数替换建议
当前旧函数:
- `getContractCategories`
- `getContractCategoriesWithCount`
- `getContractTemplates`
- `getContractTemplate`
- `searchContractTemplates`
建议替换为新函数:
- `getContractTemplateCategories`
- `getContractTemplateList`
- `getContractTemplateDetail`
- `searchContractTemplateList`
## 风险点
1. 排序语义变化
- 旧逻辑混入了 PostgREST 风格排序拼接
- 新接口需要明确合法排序字段白名单
2. 搜索分类统计变化
- 旧页面自己循环查询分类统计
- 新接口如果不返回 `categoryStats`,页面逻辑还要保留一部分旧实现
3. 详情页字段结构变化
- 旧页面默认拿 `template.category?.name`
- 新接口若改成扁平字段,需要同步调整页面 transform
4. token 传递方式变化
- 旧实现依赖 `postgrest-client.ts`
- 新接口应统一走 `axios-client.ts` 或新业务客户端
## 建议落地顺序
1. 新增 `lib/api/contract-template/index.ts`
2. 先切 `search/page.tsx`
3. 再切 `list/page.tsx`
4. 再切 `search/results/page.tsx`
5. 最后切 `detail/[id]/page.tsx`
6. 全部验证通过后删除旧 `legacy/contract-template/templates.ts`
## 验收标准
1. `contract-template/search` 能正常展示分类和数量
2. `contract-template/list` 能分页、筛选、排序
3. `contract-template/search/results` 能搜索并展示分类统计
4. `contract-template/detail/[id]` 能正常查看详情与预览
5. 页面不再直接请求 `/api/postgrest/proxy/contract_categories`
6. 页面不再直接请求 `/api/postgrest/proxy/contract_templates`