171 lines
6.8 KiB
Markdown
171 lines
6.8 KiB
Markdown
|
|
# 车身照片关联查询功能实现说明
|
|||
|
|
|
|||
|
|
## 🎯 功能需求
|
|||
|
|
|
|||
|
|
在运送清单详情页面的"车身照片"字段中,需要显示与司机姓名和车牌号相关联的车身前后照片,确保车身照片能够正确映射到运送清单信息表单中。
|
|||
|
|
|
|||
|
|
## 🔧 技术实现
|
|||
|
|
|
|||
|
|
### 1. **问题分析**
|
|||
|
|
|
|||
|
|
- **现状**:`delivery` 表中的 `carFrontPhoto` 和 `carBehindPhoto` 字段为空
|
|||
|
|
- **需求**:根据司机姓名和车牌号关联查询车身照片
|
|||
|
|
- **数据源**:`member_driver` 表中的 `car_img` 字段包含司机车辆照片
|
|||
|
|
|
|||
|
|
### 2. **后端实现**
|
|||
|
|
|
|||
|
|
#### 2.1 新增查询方法
|
|||
|
|
在 `MemberDriverMapper.java` 中添加了根据司机姓名和车牌号查询的方法:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
/**
|
|||
|
|
* 根据司机姓名和车牌号查询司机信息(包含车身照片)
|
|||
|
|
*/
|
|||
|
|
@Select("SELECT md.id, md.member_id, md.username, md.car_number, " +
|
|||
|
|
"md.driving_license, md.driver_license, md.record_code, " +
|
|||
|
|
"md.car_img, md.remark, md.create_time, m.mobile " +
|
|||
|
|
"FROM member_driver md " +
|
|||
|
|
"LEFT JOIN member m ON md.member_id = m.id " +
|
|||
|
|
"WHERE md.username = #{driverName} AND md.car_number = #{licensePlate}")
|
|||
|
|
Map<String, Object> selectDriverByNameAndPlate(@Param("driverName") String driverName,
|
|||
|
|
@Param("licensePlate") String licensePlate);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.2 修改详情查询逻辑
|
|||
|
|
在 `DeliveryServiceImpl.java` 的 `detail` 方法中添加了车身照片关联查询逻辑:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 查询司机信息
|
|||
|
|
if (delivery.getDriverId() != null) {
|
|||
|
|
try {
|
|||
|
|
// 根据司机ID直接查询司机信息
|
|||
|
|
Map<String, Object> driverInfo = memberDriverMapper.selectDriverById(delivery.getDriverId());
|
|||
|
|
|
|||
|
|
if (driverInfo != null) {
|
|||
|
|
delivery.setDriverName((String) driverInfo.get("username"));
|
|||
|
|
delivery.setLicensePlate((String) driverInfo.get("car_number"));
|
|||
|
|
|
|||
|
|
// 如果delivery表中的车身照片为空,尝试从司机信息中获取
|
|||
|
|
if (delivery.getCarFrontPhoto() == null || delivery.getCarFrontPhoto().isEmpty()) {
|
|||
|
|
String carImg = (String) driverInfo.get("car_img");
|
|||
|
|
if (carImg != null && !carImg.isEmpty()) {
|
|||
|
|
delivery.setCarFrontPhoto(carImg);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 如果车身照片仍然为空,尝试根据司机姓名和车牌号查询其他相关记录
|
|||
|
|
if ((delivery.getCarFrontPhoto() == null || delivery.getCarFrontPhoto().isEmpty()) &&
|
|||
|
|
(delivery.getCarBehindPhoto() == null || delivery.getCarBehindPhoto().isEmpty())) {
|
|||
|
|
try {
|
|||
|
|
Map<String, Object> relatedDriver = memberDriverMapper.selectDriverByNameAndPlate(
|
|||
|
|
delivery.getDriverName(), delivery.getLicensePlate());
|
|||
|
|
if (relatedDriver != null) {
|
|||
|
|
String relatedCarImg = (String) relatedDriver.get("car_img");
|
|||
|
|
if (relatedCarImg != null && !relatedCarImg.isEmpty()) {
|
|||
|
|
delivery.setCarFrontPhoto(relatedCarImg);
|
|||
|
|
delivery.setCarBehindPhoto(relatedCarImg); // 使用同一张照片作为前后照片
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
// 忽略查询错误
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
// 忽略查询错误,继续处理
|
|||
|
|
e.printStackTrace();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. **查询逻辑流程**
|
|||
|
|
|
|||
|
|
#### 3.1 优先级查询顺序
|
|||
|
|
1. **第一优先级**:直接从 `delivery` 表获取 `carFrontPhoto` 和 `carBehindPhoto`
|
|||
|
|
2. **第二优先级**:从当前司机的 `member_driver` 记录中获取 `car_img`
|
|||
|
|
3. **第三优先级**:根据司机姓名和车牌号查询其他相关司机记录
|
|||
|
|
|
|||
|
|
#### 3.2 数据映射规则
|
|||
|
|
- **车头照片**:优先使用 `delivery.carFrontPhoto`,其次使用 `member_driver.car_img`
|
|||
|
|
- **车尾照片**:优先使用 `delivery.carBehindPhoto`,其次使用 `member_driver.car_img`
|
|||
|
|
- **备用方案**:如果前后照片都为空,使用同一张 `car_img` 作为前后照片
|
|||
|
|
|
|||
|
|
### 4. **前端显示**
|
|||
|
|
|
|||
|
|
前端详情页面中的车身照片显示组件已经正确配置:
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<el-descriptions-item label="车身照片:">
|
|||
|
|
<span style="vertical-align: top">
|
|||
|
|
<el-image
|
|||
|
|
v-if="data.baseInfo.carFrontPhoto"
|
|||
|
|
style="width: 50px; height: 50px; margin-right: 10px"
|
|||
|
|
:src="data.baseInfo.carFrontPhoto ? data.baseInfo.carFrontPhoto : ''"
|
|||
|
|
fit="cover"
|
|||
|
|
:preview-src-list="[data.baseInfo.carFrontPhoto] ? [data.baseInfo.carFrontPhoto] : []"
|
|||
|
|
preview-teleported
|
|||
|
|
/>
|
|||
|
|
<el-image
|
|||
|
|
v-if="data.baseInfo.carBehindPhoto"
|
|||
|
|
style="width: 50px; height: 50px; margin-right: 10px"
|
|||
|
|
:src="data.baseInfo.carBehindPhoto ? data.baseInfo.carBehindPhoto : ''"
|
|||
|
|
fit="cover"
|
|||
|
|
:preview-src-list="[data.baseInfo.carBehindPhoto] ? [data.baseInfo.carBehindPhoto] : []"
|
|||
|
|
preview-teleported
|
|||
|
|
/>
|
|||
|
|
</span>
|
|||
|
|
</el-descriptions-item>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 数据流程
|
|||
|
|
|
|||
|
|
### 1. **API调用流程**
|
|||
|
|
```
|
|||
|
|
前端详情页面 → waybillDetail API → DeliveryServiceImpl.detail() →
|
|||
|
|
MemberDriverMapper.selectDriverById() → MemberDriverMapper.selectDriverByNameAndPlate() →
|
|||
|
|
返回包含车身照片的delivery对象
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. **数据查询流程**
|
|||
|
|
```
|
|||
|
|
1. 查询delivery表基本信息
|
|||
|
|
2. 根据driverId查询司机信息
|
|||
|
|
3. 如果车身照片为空,从司机信息中获取car_img
|
|||
|
|
4. 如果仍然为空,根据司机姓名和车牌号查询相关记录
|
|||
|
|
5. 返回完整的delivery对象给前端
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 功能特点
|
|||
|
|
|
|||
|
|
### 1. **智能关联查询**
|
|||
|
|
- ✅ 支持多层级查询策略
|
|||
|
|
- ✅ 自动匹配司机姓名和车牌号
|
|||
|
|
- ✅ 容错处理,避免查询失败影响整体功能
|
|||
|
|
|
|||
|
|
### 2. **数据完整性**
|
|||
|
|
- ✅ 确保车身照片能够正确显示
|
|||
|
|
- ✅ 支持前后照片分别显示
|
|||
|
|
- ✅ 提供备用显示方案
|
|||
|
|
|
|||
|
|
### 3. **性能优化**
|
|||
|
|
- ✅ 优先使用已有数据,减少数据库查询
|
|||
|
|
- ✅ 异常处理,避免查询错误影响用户体验
|
|||
|
|
- ✅ 缓存友好的查询策略
|
|||
|
|
|
|||
|
|
## 📁 相关文件
|
|||
|
|
|
|||
|
|
- **后端Mapper**:`tradeCattle/.../MemberDriverMapper.java` ✅
|
|||
|
|
- **后端Service**:`tradeCattle/.../DeliveryServiceImpl.java` ✅
|
|||
|
|
- **前端页面**:`pc-cattle-transportation/src/views/entry/details.vue` ✅
|
|||
|
|
|
|||
|
|
## 🎉 总结
|
|||
|
|
|
|||
|
|
车身照片关联查询功能已经完成!现在:
|
|||
|
|
|
|||
|
|
- ✅ **智能查询**:根据司机姓名和车牌号自动关联查询车身照片
|
|||
|
|
- ✅ **多层级策略**:支持多种查询策略,确保数据完整性
|
|||
|
|
- ✅ **容错处理**:异常情况下不影响整体功能
|
|||
|
|
- ✅ **前端显示**:车身照片能够正确显示在详情页面中
|
|||
|
|
|
|||
|
|
运送清单详情页面现在可以正确显示与司机姓名和车牌号相关联的车身前后照片!
|