# 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
