373 lines
8.9 KiB
Markdown
373 lines
8.9 KiB
Markdown
|
|
# 运送清单管理功能完善 - 实施总结
|
|||
|
|
|
|||
|
|
## 📋 任务概述
|
|||
|
|
|
|||
|
|
完善运送清单管理系统的待完善功能,封装API接口,添加后端服务日志信息。
|
|||
|
|
|
|||
|
|
## ✅ 已完成的功能
|
|||
|
|
|
|||
|
|
### 1. 前端 API 接口封装
|
|||
|
|
|
|||
|
|
**文件**: `pc-cattle-transportation/src/api/shipping.js`
|
|||
|
|
|
|||
|
|
新增以下 API 接口:
|
|||
|
|
|
|||
|
|
- `updateDeliveryStatus(data)` - 修改运送清单状态
|
|||
|
|
- `deleteDeliveryLogic(id)` - 逻辑删除运送清单
|
|||
|
|
- `downloadDeliveryPackage(id)` - 打包下载运送清单文件
|
|||
|
|
- `getDeliveryDetail(id)` - 获取运送清单详情(用于编辑)
|
|||
|
|
- `updateDeliveryInfo(data)` - 更新运送清单信息
|
|||
|
|
|
|||
|
|
### 2. 后端 API 实现
|
|||
|
|
|
|||
|
|
**文件**: `tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/controller/DeliveryController.java`
|
|||
|
|
|
|||
|
|
#### 2.1 修改状态接口 (updateStatus)
|
|||
|
|
|
|||
|
|
- **路径**: `POST /delivery/updateStatus`
|
|||
|
|
- **权限**: `@SaCheckPermission("delivery:edit")`
|
|||
|
|
- **功能**: 修改运送清单状态(1-准备中,2-运输中,3-已结束)
|
|||
|
|
- **日志增强**:
|
|||
|
|
- 记录运单ID和新状态
|
|||
|
|
- 记录原状态和新状态
|
|||
|
|
- 状态验证(1-3)
|
|||
|
|
- 运单存在性检查
|
|||
|
|
- 详细的成功/失败日志
|
|||
|
|
|
|||
|
|
#### 2.2 逻辑删除接口 (deleteLogic)
|
|||
|
|
|
|||
|
|
- **路径**: `POST /delivery/deleteLogic`
|
|||
|
|
- **权限**: `@SaCheckPermission("delivery:delete")`
|
|||
|
|
- **功能**: 逻辑删除运送清单(保留历史记录,不清空设备绑定)
|
|||
|
|
- **日志增强**:
|
|||
|
|
- 记录运单ID和运单号
|
|||
|
|
- 权限检查日志
|
|||
|
|
- 删除操作结果日志
|
|||
|
|
|
|||
|
|
#### 2.3 打包下载接口 (downloadPackage)
|
|||
|
|
|
|||
|
|
- **路径**: `GET /delivery/downloadPackage`
|
|||
|
|
- **权限**: `@SaCheckPermission("delivery:view")`
|
|||
|
|
- **功能**: 打包运送清单的所有文件(图片、视频、信息)为ZIP压缩包
|
|||
|
|
- **包含内容**:
|
|||
|
|
- **运送清单信息.txt**: 包含基础信息、重量信息、状态信息
|
|||
|
|
- **照片文件夹**:
|
|||
|
|
- 检疫票
|
|||
|
|
- 纸质磅单
|
|||
|
|
- 空车过磅车头照片
|
|||
|
|
- 装车过磅车头照片
|
|||
|
|
- 装车过磅磅单
|
|||
|
|
- 车头照片
|
|||
|
|
- 车尾照片
|
|||
|
|
- 司机身份证照片
|
|||
|
|
- 到地磅单
|
|||
|
|
- 到地车辆过重磅车头照片
|
|||
|
|
- **视频文件夹**:
|
|||
|
|
- 空车过磅视频
|
|||
|
|
- 装车过磅视频
|
|||
|
|
- 装车视频
|
|||
|
|
- 消毒槽视频
|
|||
|
|
- 牛只装车环视视频
|
|||
|
|
- 卸牛视频
|
|||
|
|
- 到地过磅视频
|
|||
|
|
- **日志增强**:
|
|||
|
|
- 记录运单ID和运单号
|
|||
|
|
- 记录每个文件的下载状态
|
|||
|
|
- 记录照片和视频的成功添加数量
|
|||
|
|
- 记录最终ZIP文件大小
|
|||
|
|
- 详细的错误日志
|
|||
|
|
|
|||
|
|
### 3. 前端功能完善
|
|||
|
|
|
|||
|
|
#### 3.1 运送清单列表页面 (attestation.vue)
|
|||
|
|
|
|||
|
|
**文件**: `pc-cattle-transportation/src/views/entry/attestation.vue`
|
|||
|
|
|
|||
|
|
新增功能按钮(操作列宽度扩展至 350px):
|
|||
|
|
|
|||
|
|
1. **查看设备** - 跳转到设备管理页面
|
|||
|
|
```javascript
|
|||
|
|
const viewDevices = (row) => {
|
|||
|
|
router.push({
|
|||
|
|
path: '/entry/devices',
|
|||
|
|
query: { deliveryId: row.id, deliveryNumber: row.deliveryNumber }
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **编辑** - 调用编辑对话框
|
|||
|
|
```javascript
|
|||
|
|
const editDelivery = async (row) => {
|
|||
|
|
if (editDialogRef.value && editDialogRef.value.open) {
|
|||
|
|
editDialogRef.value.open(row.id);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **修改状态** - 弹出输入框修改状态
|
|||
|
|
- 调用 `updateDeliveryStatus` API
|
|||
|
|
- 输入验证(1-3)
|
|||
|
|
- 实时刷新列表
|
|||
|
|
|
|||
|
|
4. **打包文件** - 下载运送清单压缩包
|
|||
|
|
- 调用 `downloadDeliveryPackage` API
|
|||
|
|
- 文件命名:`运送清单_{运单号}_{时间戳}.zip`
|
|||
|
|
- 自动下载到本地
|
|||
|
|
- 加载状态显示
|
|||
|
|
|
|||
|
|
5. **删除** - 逻辑删除运送清单
|
|||
|
|
- 调用 `deleteDeliveryLogic` API
|
|||
|
|
- 二次确认
|
|||
|
|
- 实时刷新列表
|
|||
|
|
|
|||
|
|
**组件引入**:
|
|||
|
|
- 导入 `editDialog` 组件
|
|||
|
|
- 添加 `editDialogRef` 引用
|
|||
|
|
|
|||
|
|
#### 3.2 设备管理页面 (devices.vue)
|
|||
|
|
|
|||
|
|
**新建文件**: `pc-cattle-transportation/src/views/entry/devices.vue`
|
|||
|
|
|
|||
|
|
功能特性:
|
|||
|
|
|
|||
|
|
1. **页面头部**:
|
|||
|
|
- 显示运单号
|
|||
|
|
- 返回按钮
|
|||
|
|
|
|||
|
|
2. **设备统计卡片**:
|
|||
|
|
- 智能主机数量
|
|||
|
|
- 智能耳标数量
|
|||
|
|
- 智能项圈数量
|
|||
|
|
- 设备总数
|
|||
|
|
|
|||
|
|
3. **设备列表Tab**:
|
|||
|
|
- **智能主机Tab**: 显示所有智能主机设备
|
|||
|
|
- **智能耳标Tab**: 显示所有智能耳标设备(分页)
|
|||
|
|
- **智能项圈Tab**: 显示所有智能项圈设备(分页)
|
|||
|
|
|
|||
|
|
4. **设备操作**:
|
|||
|
|
- **解绑设备**: 调用 `unbindDevice` API
|
|||
|
|
- 二次确认
|
|||
|
|
- 实时刷新对应列表
|
|||
|
|
|
|||
|
|
5. **数据展示**:
|
|||
|
|
- 设备ID/SN
|
|||
|
|
- 运单号
|
|||
|
|
- 重量(耳标)
|
|||
|
|
- 车牌号
|
|||
|
|
- 绑定时间
|
|||
|
|
|
|||
|
|
## 🎨 UI 优化
|
|||
|
|
|
|||
|
|
### 状态显示
|
|||
|
|
|
|||
|
|
**更新文件**: `pc-cattle-transportation/src/views/entry/attestation.vue`
|
|||
|
|
|
|||
|
|
状态文本和颜色映射:
|
|||
|
|
- **1 - 准备中**: 蓝色 (info)
|
|||
|
|
- **2 - 运输中**: 橙色 (warning)
|
|||
|
|
- **3 - 已结束**: 绿色 (success)
|
|||
|
|
|
|||
|
|
搜索下拉选项也已同步更新。
|
|||
|
|
|
|||
|
|
## 📊 日志增强
|
|||
|
|
|
|||
|
|
### 后端日志规范
|
|||
|
|
|
|||
|
|
所有新增/修改的后端方法都添加了详细的日志:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
System.out.println("=== 功能名称 ===");
|
|||
|
|
System.out.println("参数1: " + value1);
|
|||
|
|
System.out.println("参数2: " + value2);
|
|||
|
|
// ... 业务逻辑
|
|||
|
|
System.out.println("SUCCESS: 操作成功");
|
|||
|
|
// 或
|
|||
|
|
System.out.println("ERROR: 错误信息");
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
日志包含:
|
|||
|
|
- 功能标题(用 === 分隔)
|
|||
|
|
- 输入参数
|
|||
|
|
- 中间处理步骤
|
|||
|
|
- 查询结果
|
|||
|
|
- 成功/失败状态
|
|||
|
|
- 异常堆栈
|
|||
|
|
|
|||
|
|
### 前端日志
|
|||
|
|
|
|||
|
|
前端关键操作也添加了 `console.log` 日志:
|
|||
|
|
- API 调用参数
|
|||
|
|
- 响应数据
|
|||
|
|
- 错误信息
|
|||
|
|
|
|||
|
|
## 🔧 技术实现细节
|
|||
|
|
|
|||
|
|
### 文件下载实现
|
|||
|
|
|
|||
|
|
使用 Spring 的 `HttpServletResponse` 直接写入ZIP流:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|||
|
|
ZipOutputStream zipOut = new ZipOutputStream(byteArrayOutputStream);
|
|||
|
|
|
|||
|
|
// 1. 添加信息文本
|
|||
|
|
addDeliveryInfoToZip(zipOut, delivery);
|
|||
|
|
|
|||
|
|
// 2. 下载并添加图片/视频
|
|||
|
|
addFileToZip(zipOut, fileUrl, fileName);
|
|||
|
|
|
|||
|
|
// 3. 设置响应头并输出
|
|||
|
|
response.setContentType("application/zip");
|
|||
|
|
response.setHeader("Content-Disposition", "attachment; filename=" + encodedFileName);
|
|||
|
|
out.write(zipBytes);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 前端文件下载
|
|||
|
|
|
|||
|
|
使用 Blob 和 URL.createObjectURL:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
const blob = new Blob([res], { type: 'application/zip' });
|
|||
|
|
const url = window.URL.createObjectURL(blob);
|
|||
|
|
const link = document.createElement('a');
|
|||
|
|
link.href = url;
|
|||
|
|
link.download = fileName;
|
|||
|
|
link.click();
|
|||
|
|
window.URL.revokeObjectURL(url);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📝 API 接口文档
|
|||
|
|
|
|||
|
|
### 1. 修改状态
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
POST /api/delivery/updateStatus
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
Request Body:
|
|||
|
|
{
|
|||
|
|
"id": 95,
|
|||
|
|
"status": 2
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Response:
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "状态更新成功"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 逻辑删除
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
POST /api/delivery/deleteLogic?id=95
|
|||
|
|
|
|||
|
|
Response:
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "运单删除成功"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 打包下载
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
GET /api/delivery/downloadPackage?id=95
|
|||
|
|
|
|||
|
|
Response: application/zip (Binary file stream)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## ✨ 权限控制
|
|||
|
|
|
|||
|
|
所有新增的功能都添加了权限控制:
|
|||
|
|
|
|||
|
|
- `delivery:edit` - 修改状态
|
|||
|
|
- `delivery:delete` - 删除运单
|
|||
|
|
- `delivery:view` - 查看和下载
|
|||
|
|
- `entry:device` - 查看设备
|
|||
|
|
- `entry:edit` - 编辑运单
|
|||
|
|
- `entry:status` - 修改状态
|
|||
|
|
- `entry:download` - 打包下载
|
|||
|
|
|
|||
|
|
## 🚀 部署说明
|
|||
|
|
|
|||
|
|
### 后端部署
|
|||
|
|
|
|||
|
|
1. 清理编译缓存:
|
|||
|
|
```bash
|
|||
|
|
cd tradeCattle
|
|||
|
|
mvn clean
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. 重新编译:
|
|||
|
|
```bash
|
|||
|
|
mvn compile
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. 重启服务
|
|||
|
|
|
|||
|
|
### 前端部署
|
|||
|
|
|
|||
|
|
前端代码已更新,刷新浏览器即可。
|
|||
|
|
|
|||
|
|
## 📦 文件清单
|
|||
|
|
|
|||
|
|
### 新建文件
|
|||
|
|
|
|||
|
|
- `pc-cattle-transportation/src/views/entry/devices.vue` - 设备管理页面
|
|||
|
|
|
|||
|
|
### 修改文件
|
|||
|
|
|
|||
|
|
- `pc-cattle-transportation/src/api/shipping.js` - API接口封装
|
|||
|
|
- `pc-cattle-transportation/src/views/entry/attestation.vue` - 运送清单列表页
|
|||
|
|
- `tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/controller/DeliveryController.java` - 运送清单控制器
|
|||
|
|
|
|||
|
|
## 🎯 测试建议
|
|||
|
|
|
|||
|
|
1. **修改状态功能**:
|
|||
|
|
- 测试状态 1/2/3 的切换
|
|||
|
|
- 测试无效状态值的验证
|
|||
|
|
- 验证列表实时刷新
|
|||
|
|
|
|||
|
|
2. **逻辑删除功能**:
|
|||
|
|
- 测试删除确认
|
|||
|
|
- 验证权限控制
|
|||
|
|
- 确认删除后列表刷新
|
|||
|
|
|
|||
|
|
3. **打包下载功能**:
|
|||
|
|
- 测试包含所有文件的运单
|
|||
|
|
- 测试部分文件缺失的运单
|
|||
|
|
- 验证ZIP文件完整性
|
|||
|
|
- 检查文件命名
|
|||
|
|
|
|||
|
|
4. **编辑功能**:
|
|||
|
|
- 测试编辑对话框打开
|
|||
|
|
- 验证数据回填
|
|||
|
|
- 测试保存后刷新
|
|||
|
|
|
|||
|
|
5. **查看设备功能**:
|
|||
|
|
- 测试设备列表显示
|
|||
|
|
- 测试设备解绑
|
|||
|
|
- 验证设备统计数据
|
|||
|
|
|
|||
|
|
## 📌 注意事项
|
|||
|
|
|
|||
|
|
1. 打包下载功能会从URL下载文件,需要确保文件URL可访问
|
|||
|
|
2. 文件下载失败不会中断整个流程,会记录警告日志
|
|||
|
|
3. 逻辑删除不会清空设备绑定关系,保留历史记录
|
|||
|
|
4. 物理删除会清空设备的 `delivery_id`、`weight` 和 `car_number`
|
|||
|
|
|
|||
|
|
## 🎉 总结
|
|||
|
|
|
|||
|
|
所有待完善功能已全部实现,包括:
|
|||
|
|
- ✅ 前端API接口封装
|
|||
|
|
- ✅ 后端API实现(修改状态、逻辑删除、打包下载)
|
|||
|
|
- ✅ 前端功能完善(编辑、查看设备)
|
|||
|
|
- ✅ 创建设备管理页面
|
|||
|
|
- ✅ 添加详细日志信息
|
|||
|
|
- ✅ 修复代码风格问题
|
|||
|
|
|
|||
|
|
系统功能更加完善,用户体验得到显著提升!
|
|||
|
|
|