# 医院搜索优化说明
## 需求背景
在急救转运任务创建页面中,医院选择功能需要优化用户体验:
1. 初始状态下显示前100条医院数据,方便用户快速选择常用医院
2. 只有在用户输入搜索关键词后才去服务端搜索,减少不必要的请求
## 实现方案
### 前端优化
#### 1. 数据结构调整
**文件**: `app/pages/task/create-emergency.vue`
新增数据字段:
```javascript
data() {
return {
// ... 其他字段
defaultHospitals: [], // 默认的100条医院数据
}
}
```
#### 2. 页面加载时获取默认数据
在 `onLoad` 生命周期中调用:
```javascript
onLoad(options) {
// ... 其他初始化代码
// 加载默认医院列表(前100条)
this.loadDefaultHospitals()
}
```
#### 3. 加载默认医院列表方法
```javascript
// 加载默认医院列表(前100条)
loadDefaultHospitals() {
// 传入空字符串获取前100条
searchHospitals('').then(response => {
this.defaultHospitals = response.data || []
// 同时初始化两个搜索结果为默认数据
this.hospitalOutResults = [...this.defaultHospitals]
this.hospitalInResults = [...this.defaultHospitals]
}).catch(error => {
console.error('加载默认医院列表失败:', error)
this.defaultHospitals = []
})
}
```
#### 4. 输入框获得焦点时显示默认数据
**转出医院:**
```javascript
// 转出医院输入框获得焦点
onHospitalOutFocus() {
// 如果没有搜索关键词,显示默认的100条数据
if (!this.hospitalOutSearchKeyword || this.hospitalOutSearchKeyword.trim() === '') {
this.hospitalOutResults = [...this.defaultHospitals]
}
this.showHospitalOutResults = true
}
```
**转入医院:**
```javascript
// 转入医院输入框获得焦点
onHospitalInFocus() {
// 如果没有搜索关键词,显示默认的100条数据
if (!this.hospitalInSearchKeyword || this.hospitalInSearchKeyword.trim() === '') {
this.hospitalInResults = [...this.defaultHospitals]
}
this.showHospitalInResults = true
}
```
#### 5. 搜索逻辑优化
**转出医院搜索:**
```javascript
// 转出医院搜索
onHospitalOutSearch(e) {
const keyword = e.detail.value
this.hospitalOutSearchKeyword = keyword
// 防抖处理
if (this.searchTimer) {
clearTimeout(this.searchTimer)
}
// 如果关键词为空,显示默认100条
if (!keyword || keyword.trim() === '') {
this.hospitalOutResults = [...this.defaultHospitals]
this.showHospitalOutResults = true
return
}
// 有关键词时,去服务端搜索
this.searchTimer = setTimeout(() => {
this.searchHospitalOut(keyword)
}, 300)
}
```
**转入医院搜索:**
```javascript
// 转入医院搜索
onHospitalInSearch(e) {
const keyword = e.detail.value
this.hospitalInSearchKeyword = keyword
// 防抖处理
if (this.searchTimer) {
clearTimeout(this.searchTimer)
}
// 如果关键词为空,显示默认100条
if (!keyword || keyword.trim() === '') {
this.hospitalInResults = [...this.defaultHospitals]
this.showHospitalInResults = true
return
}
// 有关键词时,去服务端搜索
this.searchTimer = setTimeout(() => {
this.searchHospitalIn(keyword)
}, 300)
}
```
#### 6. 模板绑定焦点事件
**转出医院输入框:**
```html
```
**转入医院输入框:**
```html
```
### 后端优化
#### 修改SQL查询返回条数
**文件**: `ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml`
将 `TOP 50` 修改为 `TOP 100`:
```xml
```
## 功能流程
### 1. 页面初始化流程
```
页面加载 (onLoad)
↓
调用 loadDefaultHospitals()
↓
请求后端 searchHospitals('')
↓
获取前100条医院数据
↓
保存到 defaultHospitals
↓
同时初始化 hospitalOutResults 和 hospitalInResults
```
### 2. 用户点击输入框流程
```
用户点击输入框
↓
触发 @focus 事件
↓
调用 onHospitalOutFocus 或 onHospitalInFocus
↓
检查是否有搜索关键词
↓
【无关键词】显示默认100条数据
【有关键词】保持当前搜索结果
↓
显示下拉列表
```
### 3. 用户输入搜索流程
```
用户输入关键词
↓
触发 @input 事件
↓
调用 onHospitalOutSearch 或 onHospitalInSearch
↓
【关键词为空】显示默认100条数据
【关键词不为空】防抖300ms后请求服务端搜索
↓
更新搜索结果列表
↓
显示下拉列表
```
## 优化效果
### 1. 性能优化
- ✅ 减少服务端请求:初始状态不需要搜索,只需加载一次默认数据
- ✅ 防抖优化:用户输入时300ms防抖,避免频繁请求
- ✅ 本地缓存:默认数据缓存在前端,重复点击输入框无需请求
### 2. 用户体验优化
- ✅ 快速选择:点击输入框立即显示100条常用医院
- ✅ 精准搜索:输入关键词后实时搜索,支持医院名称、地址、简称
- ✅ 流畅交互:无需等待,点击即显示
### 3. 数据优化
- ✅ 数据量合理:100条数据既能满足常用选择,又不会过多影响性能
- ✅ 自动排序:按医院名称排序,便于查找
- ✅ 状态过滤:只显示有效状态的医院(HospState为NULL或1)
## 注意事项
1. **数据源切换**:HospDataMapper 使用 `@DataSource(DataSourceType.SQLSERVER)` 注解,查询SQL Server数据库
2. **SQL语法**:使用SQL Server语法 `TOP 100` 和 `LIKE '%' + #{keyword} + '%'`
3. **空关键词处理**:后端支持空关键词查询,返回前100条数据
4. **数组拷贝**:使用 `[...this.defaultHospitals]` 进行数组拷贝,避免引用问题
## 测试建议
### 功能测试
1. 页面加载后,点击医院输入框,应显示100条医院数据
2. 输入关键词,应根据关键词实时搜索并显示结果
3. 清空关键词,应恢复显示100条默认数据
4. 选择医院后,应自动填充医院名称和地址
### 性能测试
1. 观察页面加载时是否只请求一次默认数据
2. 观察输入时是否有防抖效果(快速输入不应频繁请求)
3. 观察点击输入框时是否复用缓存数据
### 兼容性测试
1. 测试H5端功能是否正常
2. 测试微信小程序端功能是否正常
3. 测试不同网络环境下的加载速度
## 相关文件
### 前端文件
- `app/pages/task/create-emergency.vue` - 急救转运任务创建页面
- `app/api/hospital.js` - 医院API接口
### 后端文件
- `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/HospDataController.java` - 医院控制器
- `ruoyi-system/src/main/java/com/ruoyi/system/mapper/HospDataMapper.java` - 医院Mapper接口
- `ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml` - 医院Mapper XML
- `ruoyi-system/src/main/java/com/ruoyi/system/domain/HospData.java` - 医院实体类
## 版本历史
- **v1.0** (2025-10-19): 初始版本,实现医院搜索优化功能