fs-lawrisk/CHANGELOG_V2_FIX.md

170 lines
4.5 KiB
Markdown
Raw Permalink Normal View History

# 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