急救转运任务中的医院信息来自 SQL Server 的 hosp_data 表,前端通过搜索选择医院。为了便于数据关联查询和分析,需要在 sys_task_emergency 表中不仅保存医院名称,还需要保存医院ID。
sys_task_emergency 表中添加 hospital_out_id 和 hospital_in_id 字段文件路径:sql/add_hospital_id_fields.sql
-- 1. 添加转出医院ID字段
ALTER TABLE sys_task_emergency
ADD COLUMN hospital_out_id BIGINT COMMENT '转出医院ID(关联hosp_data表的HospID)' AFTER hospital_out_name;
-- 2. 添加转入医院ID字段
ALTER TABLE sys_task_emergency
ADD COLUMN hospital_in_id BIGINT COMMENT '转入医院ID(关联hosp_data表的HospID)' AFTER hospital_in_name;
-- 3. 创建索引以提升查询性能
CREATE INDEX idx_hospital_out_id ON sys_task_emergency(hospital_out_id);
CREATE INDEX idx_hospital_in_id ON sys_task_emergency(hospital_in_id);
| 字段名 | 类型 | 说明 | 允许NULL |
|---|---|---|---|
| hospital_out_id | BIGINT | 转出医院ID,关联 hosp_data.HospID | 是 |
| hospital_in_id | BIGINT | 转入医院ID,关联 hosp_data.HospID | 是 |
为什么允许 NULL?
- 历史数据可能只有医院名称没有ID
- 用户可能手动输入医院名称而不是从列表选择
- 保持数据兼容性
文件:ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java
/** 转出医院ID(关联hosp_data表的HospID) */
private Long hospitalOutId;
/** 转入医院ID(关联hosp_data表的HospID) */
private Long hospitalInId;
// 添加对应的 getter 和 setter 方法
文件:ruoyi-system/src/main/resources/mapper/system/SysTaskEmergencyMapper.xml
ResultMap 添加映射:xml <result property="hospitalOutId" column="hospital_out_id" /> <result property="hospitalInId" column="hospital_in_id" />
SQL 查询添加字段:xml hospital_out_id, hospital_in_id
Insert 和 Update 添加字段处理:xml <if test="hospitalOutId != null">hospital_out_id,</if> <if test="hospitalInId != null">hospital_in_id,</if>
文件:ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskCreateVO.java
HospitalInfo 内部类添加字段:
```java
public static class HospitalInfo {
private Long id; // 医院ID(关联hosp_data表的HospID)
private String name;
private String department;
// ... 其他字段
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
```
文件:ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
saveEmergencyInfo 方法:
```java
// 设置转出医院信息
if (createVO.getHospitalOut() != null) {
emergencyInfo.setHospitalOutId(createVO.getHospitalOut().getId());
emergencyInfo.setHospitalOutName(createVO.getHospitalOut().getName());
// ... 其他字段
}
// 设置转入医院信息
if (createVO.getHospitalIn() != null) {
emergencyInfo.setHospitalInId(createVO.getHospitalIn().getId());
emergencyInfo.setHospitalInName(createVO.getHospitalIn().getName());
// ... 其他字段
}
```
文件:app/pages/task/create-emergency.vue
taskForm 初始化:javascript hospitalOut: { id: null, // 医院ID name: '', department: '', bedNumber: '', address: '' }, hospitalIn: { id: null, // 医院ID name: '', department: '', bedNumber: '', address: '' },
医院选择方法:
```javascript
// 选择转出医院
selectHospitalOut(hospital) {
this.taskForm.hospitalOut.id = hospital.hospId // 保存医院ID
this.taskForm.hospitalOut.name = hospital.hospName
this.taskForm.hospitalOut.address = hospital.hospAddress
// ... 其他逻辑
}
// 选择转入医院
selectHospitalIn(hospital) {
this.taskForm.hospitalIn.id = hospital.hospId // 保存医院ID
this.taskForm.hospitalIn.name = hospital.hospName
this.taskForm.hospitalIn.address = hospital.hospAddress
// ... 其他逻辑
}
```
# 方式1:命令行执行
mysql -u root -p ruoyi < sql/add_hospital_id_fields.sql
# 方式2:数据库客户端
source d:/project/急救转运/code/Api/RuoYi-Vue-master/sql/add_hospital_id_fields.sql
# 微信小程序版本
npm run build:mp-weixin
```
3. 部署到服务器
验证数据库
sql SELECT task_id, hospital_out_id, hospital_out_name, hospital_in_id, hospital_in_name FROM sys_task_emergency ORDER BY id DESC LIMIT 10;
预期结果
hospital_out_id 和 hospital_in_id 应该有值hosp_data 表中的 HospID-- 查询任务及其关联的医院详细信息
SELECT
e.task_id,
e.hospital_out_id,
ho.HospName AS hospital_out_name,
ho.HospAddress AS hospital_out_address,
e.hospital_in_id,
hi.HospName AS hospital_in_name,
hi.HospAddress AS hospital_in_address
FROM sys_task_emergency e
LEFT JOIN hosp_data ho ON e.hospital_out_id = ho.HospID
LEFT JOIN hosp_data hi ON e.hospital_in_id = hi.HospID
WHERE e.task_id = <任务ID>;
有了医院ID后,可以进行更深入的数据分析:
-- 转出医院转运量统计
SELECT
e.hospital_out_id,
h.HospName,
COUNT(*) AS transfer_count
FROM sys_task_emergency e
LEFT JOIN hosp_data h ON e.hospital_out_id = h.HospID
WHERE e.hospital_out_id IS NOT NULL
GROUP BY e.hospital_out_id, h.HospName
ORDER BY transfer_count DESC
LIMIT 20;
-- 转入医院转运量统计
SELECT
e.hospital_in_id,
h.HospName,
COUNT(*) AS transfer_count
FROM sys_task_emergency e
LEFT JOIN hosp_data h ON e.hospital_in_id = h.HospID
WHERE e.hospital_in_id IS NOT NULL
GROUP BY e.hospital_in_id, h.HospName
ORDER BY transfer_count DESC
LIMIT 20;
-- 最常见的转运路线
SELECT
e.hospital_out_id,
ho.HospName AS from_hospital,
e.hospital_in_id,
hi.HospName AS to_hospital,
COUNT(*) AS route_count,
AVG(e.transfer_distance) AS avg_distance,
AVG(e.transfer_price) AS avg_price
FROM sys_task_emergency e
LEFT JOIN hosp_data ho ON e.hospital_out_id = ho.HospID
LEFT JOIN hosp_data hi ON e.hospital_in_id = hi.HospID
WHERE e.hospital_out_id IS NOT NULL
AND e.hospital_in_id IS NOT NULL
GROUP BY e.hospital_out_id, ho.HospName, e.hospital_in_id, hi.HospName
HAVING route_count > 5
ORDER BY route_count DESC
LIMIT 50;
-- 按医院区域统计转运量
SELECT
h.HospCity AS city,
h.HospCounty AS district,
COUNT(*) AS total_count,
SUM(CASE WHEN e.hospital_out_id = h.HospID THEN 1 ELSE 0 END) AS out_count,
SUM(CASE WHEN e.hospital_in_id = h.HospID THEN 1 ELSE 0 END) AS in_count
FROM hosp_data h
LEFT JOIN sys_task_emergency e ON h.HospID IN (e.hospital_out_id, e.hospital_in_id)
GROUP BY h.HospCity, h.HospCounty
ORDER BY total_count DESC;
本次更新为 sys_task_emergency 表添加了医院ID字段,实现了:
所有代码变更已完成,执行数据库脚本后即可使用新功能!🚀