已成功将福祉车和急救转运任务的扩展信息分离到独立的数据库表中,实现数据结构的清晰隔离。
sys_task_emergency)用途: 存储急救转运任务的专属信息
核心字段:sql - 患者信息: patient_name, patient_phone, patient_gender, patient_condition等 - 转出医院: hospital_out_name, hospital_out_address, GPS坐标等 - 转入医院: hospital_in_name, hospital_in_address, GPS坐标等 - 费用信息: transfer_distance, transfer_price
SQL文件: sql/sys_task_emergency.sql
sys_task_welfare) ⭐ 新增用途: 存储福祉车任务的专属信息
核心字段:sql - 乘客信息: passenger_name, passenger_phone, passenger_age, passenger_gender等 - 特殊需求: special_needs - 服务信息: service_type (轮椅接送、担架转运等) - 接送地址: pickup_address, pickup_longitude, pickup_latitude - 目的地址: destination_address, destination_longitude, destination_latitude - 费用信息: service_distance, service_price
SQL文件: sql/sys_task_welfare.sql ⭐ 新建
表结构对比:
| 字段类别 | 急救转运表 | 福祉车表 |
|---------|-----------|---------|
| 核心信息 | 患者 | 乘客 |
| 地址类型 | 医院 | 普通地址 |
| 特色字段 | 病情、医院科室床号 | 特殊需求、服务类型 |
| 关联方式 | task_id (外键) | task_id (外键) |
SysTaskEmergency.java)位置: ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java
核心属性:java - PatientInfo: 患者信息(姓名、电话、性别、身份证、病情) - HospitalInfo Out: 转出医院信息 - HospitalInfo In: 转入医院信息 - 费用: transferDistance, transferPrice
SysTaskWelfare.java) ⭐ 新增位置: ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskWelfare.java
核心属性:java - 乘客信息: passengerContact, passengerPhone, passengerName, passengerAge, passengerGender - 特殊需求: specialNeeds - 服务类型: serviceType - 接送地址: pickupAddress, pickupLongitude, pickupLatitude - 目的地址: destinationAddress, destinationLongitude, destinationLatitude - 费用: serviceDistance, servicePrice
SysTaskEmergencyMapper.javaSysTaskEmergencyMapper.xmlSysTaskWelfareMapper.javaSysTaskWelfareMapper.xml方法对比:java // 都提供相同的CRUD方法 - selectByTaskId(Long taskId) - insert(entity) - update(entity) - deleteByTaskId(Long taskId)
急救转运:java if ("EMERGENCY_TRANSFER".equals(createVO.getTaskType())) { saveEmergencyInfo(task.getTaskId(), createVO); }
福祉车:java if ("WELFARE".equals(createVO.getTaskType())) { saveWelfareInfo(task.getTaskId(), createVO); }
急救转运 - saveEmergencyInfo():java private void saveEmergencyInfo(Long taskId, TaskCreateVO createVO) { SysTaskEmergency emergencyInfo = new SysTaskEmergency(); // 设置患者信息 // 设置转出医院信息 // 设置转入医院信息 // 设置费用信息 sysTaskEmergencyMapper.insertSysTaskEmergency(emergencyInfo); }
福祉车 - saveWelfareInfo() ⭐ 重构:java private void saveWelfareInfo(Long taskId, TaskCreateVO createVO) { SysTaskWelfare welfareInfo = new SysTaskWelfare(); // 设置乘客信息 // 设置地址信息 // 设置GPS坐标 // 设置距离和费用 sysTaskWelfareMapper.insertSysTaskWelfare(welfareInfo); }
selectSysTaskByTaskId() 方法:java if ("EMERGENCY_TRANSFER".equals(task.getTaskType())) { SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId); task.setEmergencyInfo(emergencyInfo); } else if ("WELFARE".equals(task.getTaskType())) { SysTaskWelfare welfareInfo = sysTaskWelfareMapper.selectSysTaskWelfareByTaskId(taskId); task.setWelfareInfo(welfareInfo); }
getTaskDetail() 方法同样进行了分离处理
新增两个独立的扩展信息字段:
public class SysTask extends BaseEntity {
// ... 基础字段 ...
/** 急救转运扩展信息 */
private SysTaskEmergency emergencyInfo;
/** 福祉车扩展信息 */
private SysTaskWelfare welfareInfo; // ⭐ 新增
// ... getter/setter ...
}
创建急救转运任务
↓
taskType = 'EMERGENCY_TRANSFER'
↓
保存 sys_task 主表
↓
调用 saveEmergencyInfo()
↓
保存到 sys_task_emergency 表
↓
查询时加载 emergencyInfo
↓
返回完整急救转运任务
创建福祉车任务
↓
taskType = 'WELFARE'
↓
保存 sys_task 主表
↓
调用 saveWelfareInfo()
↓
保存到 sys_task_welfare 表 ⭐ 独立表
↓
查询时加载 welfareInfo ⭐ 独立字段
↓
返回完整福祉车任务
主表 (sys_task):sql task_id = 1 task_type = 'EMERGENCY_TRANSFER' task_status = 'PENDING' departure_address = NULL (不使用,用扩展表的医院地址) destination_address = NULL
扩展表 (sys_task_emergency):sql task_id = 1 patient_name = '李四' patient_phone = '13800138000' hospital_out_name = '广州市第一人民医院' hospital_in_name = '广东省人民医院' transfer_distance = 5.2 transfer_price = 800
主表 (sys_task):sql task_id = 2 task_type = 'WELFARE' task_status = 'PENDING' departure_address = '广州市天河区...' (可选,主要用扩展表) destination_address = '广州市越秀区...'
扩展表 (sys_task_welfare) ⭐:sql task_id = 2 passenger_name = NULL (可选) passenger_contact = '张三' passenger_phone = '13800138000' pickup_address = '广州市天河区XX路123号' destination_address = '广州市越秀区YY路456号' service_distance = 5.2 service_price = 300
sql/sys_task_welfare.sql - 福祉车扩展表结构ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskWelfare.javaruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskWelfareMapper.javaruoyi-system/src/main/resources/mapper/system/SysTaskWelfareMapper.xmlSysTask.java - 添加 welfareInfo 字段SysTaskServiceImpl.java - 分离保存和查询逻辑# 创建福祉车扩展表
mysql -u root -p your_database < sql/sys_task_welfare.sql
cd d:\project\急救转运\code\Api\RuoYi-Vue-master
mvn clean package -DskipTests
bin\run.bat
-- 验证急救转运任务
SELECT
t.task_id,
t.task_type,
e.patient_name,
e.hospital_out_name
FROM sys_task t
LEFT JOIN sys_task_emergency e ON t.task_id = e.task_id
WHERE t.task_type = 'EMERGENCY_TRANSFER';
-- 验证福祉车任务
SELECT
t.task_id,
t.task_type,
w.passenger_contact,
w.pickup_address,
w.destination_address
FROM sys_task t
LEFT JOIN sys_task_welfare w ON t.task_id = w.task_id
WHERE t.task_type = 'WELFARE';
sys_task_emergency 表emergencyInfo 字段有数据welfareInfo 字段为 nullsys_task_welfare 表 (不是emergency表)welfareInfo 字段有数据emergencyInfo 字段为 null-- 急救转运任务不应该在福祉车表中有数据
SELECT COUNT(*) FROM sys_task_welfare
WHERE task_id IN (
SELECT task_id FROM sys_task WHERE task_type = 'EMERGENCY_TRANSFER'
);
-- 预期结果: 0
-- 福祉车任务不应该在急救转运表中有数据
SELECT COUNT(*) FROM sys_task_emergency
WHERE task_id IN (
SELECT task_id FROM sys_task WHERE task_type = 'WELFARE'
);
-- 预期结果: 0
✅ 前端代码完全兼容,无需任何修改!
原因:
1. 前端提交的数据格式不变
2. 后端自动根据 taskType 选择正确的扩展表
3. 返回的JSON结构保持兼容
sys_task_emergency 表
├── 急救转运数据 (患者、医院)
└── 福祉车数据 (乘客) ❌ 混在一起
sys_task_emergency 表
└── 急救转运数据 (患者、医院) ✅ 专用
sys_task_welfare 表
└── 福祉车数据 (乘客、地址) ✅ 专用
优点总结:
- ✅ 数据结构清晰,业务逻辑分离
- ✅ 性能更优,按需加载
- ✅ 易于扩展和维护
- ✅ 符合单一职责原则
实施完成时间: 2025-10-16
实施状态: ✅ 已完成
测试状态: ⏳ 待测试