170 lines
4.5 KiB
Markdown
170 lines
4.5 KiB
Markdown
|
|
# V2 API 许可证名称匹配和审批部门显示修复总结
|
|||
|
|
|
|||
|
|
## 提交信息
|
|||
|
|
- **Commit**: 60b94d8
|
|||
|
|
- **日期**: 2025-12-23
|
|||
|
|
- **类型**: feat (新功能)
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
### 1. 许可证名称匹配问题
|
|||
|
|
用户查询"药品经营许可"时,系统无法直接匹配到数据库中的"药品经营许可证",导致触发LLM而不是直接数据库查询。
|
|||
|
|
|
|||
|
|
### 2. 审批部门显示问题
|
|||
|
|
查询"营业执照"时,返回的 `unit_name` 字段为 `null`,即使已经导入了审批部门数据。
|
|||
|
|
|
|||
|
|
## 根本原因
|
|||
|
|
|
|||
|
|
1. **严格的精确匹配**: `find_permit_contexts_by_name` 只支持完全相同的名称匹配
|
|||
|
|
2. **缺失的数据表**: `permit_approval_departments` 表不存在
|
|||
|
|
3. **错误的SQL语法**: 模糊匹配使用了 `||` 连接符,在某些数据库中不兼容
|
|||
|
|
4. **缺少数据**: 即使表存在,也没有审批部门映射数据
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 1. 许可证名称前缀匹配 (licensing_repo.py)
|
|||
|
|
|
|||
|
|
**修改函数**: `find_permit_contexts_by_name`
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 添加前缀匹配逻辑
|
|||
|
|
if not rows and len(permit_name) >= 2:
|
|||
|
|
sql_fuzzy = """
|
|||
|
|
SELECT ... FROM ... WHERE p.name LIKE %s
|
|||
|
|
"""
|
|||
|
|
cur.execute(sql_fuzzy, (permit_name + "%",))
|
|||
|
|
rows = cur.fetchall()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**效果**:
|
|||
|
|
- "药品经营许可" 现在可以匹配 "药品经营许可证"
|
|||
|
|
- "营业执照" 可以匹配 "营业执照(副本)"等
|
|||
|
|
|
|||
|
|
### 2. 审批部门表自动创建 (licensing_repo.py)
|
|||
|
|
|
|||
|
|
**新增函数**:
|
|||
|
|
- `_create_permit_approval_departments_schema()`: 创建表结构
|
|||
|
|
- `_ensure_permit_approval_departments_schema()`: 确保表存在
|
|||
|
|
|
|||
|
|
**表结构**:
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE IF NOT EXISTS permit_approval_departments (
|
|||
|
|
id uuid PRIMARY KEY,
|
|||
|
|
permit_name text NOT NULL,
|
|||
|
|
department_name text NOT NULL,
|
|||
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|||
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 修复SQL JOIN逻辑 (licensing_repo.py)
|
|||
|
|
|
|||
|
|
**修改前**:
|
|||
|
|
```sql
|
|||
|
|
LEFT JOIN permit_approval_departments pad
|
|||
|
|
ON (pad.permit_name = p.name OR p.name LIKE pad.permit_name || '%')
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改后**:
|
|||
|
|
```sql
|
|||
|
|
LEFT JOIN permit_approval_departments pad
|
|||
|
|
ON (p.name = pad.permit_name OR p.name LIKE CONCAT(pad.permit_name, '%'))
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**改进**:
|
|||
|
|
- 使用 `CONCAT()` 函数,兼容性更好
|
|||
|
|
- 支持精确匹配和前缀匹配
|
|||
|
|
|
|||
|
|
### 4. 新增管理API端点 (v2.py)
|
|||
|
|
|
|||
|
|
**端点**: `POST /fs-ai-asistant/api/workflow/lawrisk/admin/approval-departments/setup`
|
|||
|
|
|
|||
|
|
**功能**:
|
|||
|
|
- 自动插入常见的审批部门映射
|
|||
|
|
- 支持更新已存在的映射
|
|||
|
|
- 返回操作统计信息
|
|||
|
|
|
|||
|
|
**预置映射**:
|
|||
|
|
- 营业执照 → 市场监管部门
|
|||
|
|
- 食品经营许可证 → 市场监管部门
|
|||
|
|
- 药品经营许可证 → 市场监管部门
|
|||
|
|
- 医疗器械经营许可证 → 市场监管部门
|
|||
|
|
- 特种设备使用登记 → 市场监管部门
|
|||
|
|
|
|||
|
|
### 5. 更新 .gitignore
|
|||
|
|
|
|||
|
|
**新增规则**:
|
|||
|
|
```gitignore
|
|||
|
|
# 临时脚本
|
|||
|
|
analyze_*.py
|
|||
|
|
final_importer.py
|
|||
|
|
ultimate_importer.py
|
|||
|
|
*_importer.py
|
|||
|
|
|
|||
|
|
# Excel文件(除模板外)
|
|||
|
|
*.xlsx
|
|||
|
|
!样表.xlsx
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 文件变更
|
|||
|
|
|
|||
|
|
### 修改的文件
|
|||
|
|
1. `lawrisk/services/licensing_repo.py` (+1200行)
|
|||
|
|
- 新增审批部门表管理
|
|||
|
|
- 修复许可证名称匹配逻辑
|
|||
|
|
- 修复SQL JOIN语法
|
|||
|
|
|
|||
|
|
2. `lawrisk/api/v2.py` (+89行)
|
|||
|
|
- 新增审批部门设置API端点
|
|||
|
|
|
|||
|
|
3. `.gitignore` (+9行)
|
|||
|
|
- 添加临时文件忽略规则
|
|||
|
|
|
|||
|
|
4. `docs/API_V2.md` (更新)
|
|||
|
|
- 文档更新
|
|||
|
|
|
|||
|
|
5. `static/db_admin.html` (更新)
|
|||
|
|
- 前端界面调整
|
|||
|
|
|
|||
|
|
## 测试验证
|
|||
|
|
|
|||
|
|
### 测试场景1: 前缀匹配
|
|||
|
|
**输入**: "药品经营许可"
|
|||
|
|
**预期**: 直接返回"药品经营许可证"的数据,不触发LLM
|
|||
|
|
**结果**: ✅ 通过
|
|||
|
|
|
|||
|
|
### 测试场景2: 审批部门显示
|
|||
|
|
**输入**: "营业执照"
|
|||
|
|
**预期**: `unit_name` 返回 "市场监管部门"
|
|||
|
|
**结果**: ✅ 通过
|
|||
|
|
|
|||
|
|
### 测试场景3: 精确匹配优先
|
|||
|
|
**输入**: "营业执照"(数据库中存在完全相同的名称)
|
|||
|
|
**预期**: 优先返回精确匹配结果
|
|||
|
|
**结果**: ✅ 通过
|
|||
|
|
|
|||
|
|
## 影响范围
|
|||
|
|
|
|||
|
|
### 正面影响
|
|||
|
|
1. ✅ 提升用户体验:减少不必要的LLM调用
|
|||
|
|
2. ✅ 提高响应速度:直接数据库查询比LLM快
|
|||
|
|
3. ✅ 降低成本:减少LLM API调用
|
|||
|
|
4. ✅ 数据完整性:审批部门信息正确显示
|
|||
|
|
|
|||
|
|
### 潜在风险
|
|||
|
|
1. ⚠️ 前缀匹配可能返回多个结果(已通过精确匹配优先缓解)
|
|||
|
|
2. ⚠️ 需要定期维护审批部门映射表
|
|||
|
|
|
|||
|
|
## 后续建议
|
|||
|
|
|
|||
|
|
1. **数据维护**: 定期更新 `permit_approval_departments` 表
|
|||
|
|
2. **监控**: 监控前缀匹配的准确率
|
|||
|
|
3. **扩展**: 考虑添加同义词匹配功能
|
|||
|
|
4. **文档**: 更新API文档,说明新的匹配逻辑
|
|||
|
|
|
|||
|
|
## 相关链接
|
|||
|
|
|
|||
|
|
- Commit: 60b94d8
|
|||
|
|
- 相关Issue: V2 API Search Logic
|
|||
|
|
- 测试环境: http://127.0.0.1:5000
|