8.9 KiB
运送清单管理功能完善 - 实施总结
📋 任务概述
完善运送清单管理系统的待完善功能,封装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):
-
查看设备 - 跳转到设备管理页面
const viewDevices = (row) => { router.push({ path: '/entry/devices', query: { deliveryId: row.id, deliveryNumber: row.deliveryNumber } }); }; -
编辑 - 调用编辑对话框
const editDelivery = async (row) => { if (editDialogRef.value && editDialogRef.value.open) { editDialogRef.value.open(row.id); } }; -
修改状态 - 弹出输入框修改状态
- 调用
updateDeliveryStatusAPI - 输入验证(1-3)
- 实时刷新列表
- 调用
-
打包文件 - 下载运送清单压缩包
- 调用
downloadDeliveryPackageAPI - 文件命名:
运送清单_{运单号}_{时间戳}.zip - 自动下载到本地
- 加载状态显示
- 调用
-
删除 - 逻辑删除运送清单
- 调用
deleteDeliveryLogicAPI - 二次确认
- 实时刷新列表
- 调用
组件引入:
- 导入
editDialog组件 - 添加
editDialogRef引用
3.2 设备管理页面 (devices.vue)
新建文件: pc-cattle-transportation/src/views/entry/devices.vue
功能特性:
-
页面头部:
- 显示运单号
- 返回按钮
-
设备统计卡片:
- 智能主机数量
- 智能耳标数量
- 智能项圈数量
- 设备总数
-
设备列表Tab:
- 智能主机Tab: 显示所有智能主机设备
- 智能耳标Tab: 显示所有智能耳标设备(分页)
- 智能项圈Tab: 显示所有智能项圈设备(分页)
-
设备操作:
- 解绑设备: 调用
unbindDeviceAPI - 二次确认
- 实时刷新对应列表
- 解绑设备: 调用
-
数据展示:
- 设备ID/SN
- 运单号
- 重量(耳标)
- 车牌号
- 绑定时间
🎨 UI 优化
状态显示
更新文件: pc-cattle-transportation/src/views/entry/attestation.vue
状态文本和颜色映射:
- 1 - 准备中: 蓝色 (info)
- 2 - 运输中: 橙色 (warning)
- 3 - 已结束: 绿色 (success)
搜索下拉选项也已同步更新。
📊 日志增强
后端日志规范
所有新增/修改的后端方法都添加了详细的日志:
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流:
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:
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- 打包下载
🚀 部署说明
后端部署
-
清理编译缓存:
cd tradeCattle mvn clean -
重新编译:
mvn compile -
重启服务
前端部署
前端代码已更新,刷新浏览器即可。
📦 文件清单
新建文件
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/2/3 的切换
- 测试无效状态值的验证
- 验证列表实时刷新
-
逻辑删除功能:
- 测试删除确认
- 验证权限控制
- 确认删除后列表刷新
-
打包下载功能:
- 测试包含所有文件的运单
- 测试部分文件缺失的运单
- 验证ZIP文件完整性
- 检查文件命名
-
编辑功能:
- 测试编辑对话框打开
- 验证数据回填
- 测试保存后刷新
-
查看设备功能:
- 测试设备列表显示
- 测试设备解绑
- 验证设备统计数据
📌 注意事项
- 打包下载功能会从URL下载文件,需要确保文件URL可访问
- 文件下载失败不会中断整个流程,会记录警告日志
- 逻辑删除不会清空设备绑定关系,保留历史记录
- 物理删除会清空设备的
delivery_id、weight和car_number
🎉 总结
所有待完善功能已全部实现,包括:
- ✅ 前端API接口封装
- ✅ 后端API实现(修改状态、逻辑删除、打包下载)
- ✅ 前端功能完善(编辑、查看设备)
- ✅ 创建设备管理页面
- ✅ 添加详细日志信息
- ✅ 修复代码风格问题
系统功能更加完善,用户体验得到显著提升!