# 物流轨迹自动加载优化 ## 优化目标 将物流轨迹从"手动点击查询"改为"打开详情自动加载",提升用户体验: 1. 打开订单详情时自动显示物流轨迹 2. 无需额外点击"查询轨迹"按钮 3. 保留"刷新轨迹"按钮用于手动更新 ## 用户体验对比 ### 优化前 ``` 用户操作流程: 1. 点击订单查看详情 2. 等待详情加载 3. 找到"查询轨迹"按钮 4. 点击"查询轨迹" 5. 等待轨迹加载 6. 查看物流信息 总步骤:6步 ``` ### 优化后 ``` 用户操作流程: 1. 点击订单查看详情 2. 等待详情和轨迹自动加载 3. 查看物流信息 总步骤:3步 减少:50%操作步骤 ``` ## 代码修改 ### 1. 自动加载逻辑 **文件**:`admin/src/views/consumer/prescription/order_list.vue` 在 `openDetail()` 函数中添加自动加载: ```typescript async function openDetail(id: number) { detailVisible.value = true detailData.value = null logisticsTracePayload.value = null detailLogisticsExpress.value = 'auto' detailLoading.value = true try { const res: any = await prescriptionOrderDetail({ id }) const d = res?.data ?? res ?? null detailData.value = d if (d) { detailLogisticsExpress.value = String(d.express_company || 'auto') || 'auto' // 如果有快递单号,自动加载物流轨迹 if (String(d.tracking_number || '').trim()) { fetchLogisticsTrace() } } } catch (e: any) { feedback.msgError(e?.message || '加载失败') detailVisible.value = false } finally { detailLoading.value = false } } ``` **关键点**: - 检查订单是否有快递单号 - 有快递单号时自动调用 `fetchLogisticsTrace()` - 无快递单号时不调用,避免无效请求 ### 2. UI调整 #### 按钮改为"刷新轨迹" ```vue 刷新轨迹 ``` **改动**: - 按钮文字:`查询轨迹` → `刷新轨迹` - 按钮类型:`type="primary"` → `type="default"`(降低视觉优先级) - 添加刷新图标:`` #### 添加加载状态提示 ```vue
正在加载物流轨迹...
``` **作用**: - 首次自动加载时显示加载提示 - 已有数据时不显示(避免闪烁) - 使用旋转动画图标 #### 导入图标 ```typescript import { Refresh, Loading } from '@element-plus/icons-vue' ``` ## 工作流程 ### 完整流程 ``` 用户点击"查看详情" ↓ 打开详情弹窗 ↓ 加载订单详情 ↓ 检查是否有快递单号? ↓ 有 自动调用 fetchLogisticsTrace() ↓ 显示"正在加载物流轨迹..." ↓ 查询数据库(优先) ↓ 有数据? ↓ 有 显示物流轨迹(13条记录) ↓ 显示数据来源和更新时间 ``` ### 手动刷新流程 ``` 用户点击"刷新轨迹"按钮 ↓ 重新调用 fetchLogisticsTrace() ↓ 查询数据库(优先) ↓ 无数据或需要更新? ↓ 是 调用快递100 API ↓ 更新数据库 ↓ 显示最新轨迹 ``` ## 性能优化 ### 1. 并行加载 订单详情和物流轨迹是并行加载的: - 订单详情:`prescriptionOrderDetail()` - 物流轨迹:`fetchLogisticsTrace()`(在详情加载完成后立即触发) 虽然不是完全并行,但由于物流查询从数据库读取(< 50ms),总体加载时间几乎不增加。 ### 2. 条件加载 只有在有快递单号时才加载物流轨迹: ```typescript if (String(d.tracking_number || '').trim()) { fetchLogisticsTrace() } ``` 避免无效请求。 ### 3. 数据库优先 物流查询优先从数据库读取: - 数据库查询:< 50ms - API查询:> 1000ms 大部分情况下都能从数据库快速获取数据。 ## 用户体验提升 ### 1. 减少操作步骤 - 从6步减少到3步 - 减少50%操作 ### 2. 信息即时可见 - 打开详情即可看到物流信息 - 无需额外操作 ### 3. 保留手动控制 - "刷新轨迹"按钮用于手动更新 - 切换快递公司后可重新查询 ### 4. 清晰的状态反馈 - 加载中:显示"正在加载物流轨迹..." - 加载完成:显示轨迹列表 - 数据来源:显示"[数据库]"或"[API实时]" - 更新时间:显示"最后更新:2026-04-07 17:14:16" ## 边界情况处理 ### 1. 无快递单号 - 不调用物流查询 - 不显示物流轨迹区域 ### 2. 数据库无数据 - 自动调用快递100 API - 显示"[API实时]"标签 ### 3. 查询失败 - 显示错误提示 - 保留"刷新轨迹"按钮供重试 ### 4. 已签收订单 - 显示完整历史轨迹 - 显示"已签收"状态 - 数据不会再自动更新(定时任务已停止) ## 测试场景 ### 场景1:有快递单号且数据库有数据 ``` 1. 打开订单详情 2. 自动显示"正在加载物流轨迹..." 3. < 50ms 后显示13条轨迹 4. 显示"[数据库]"标签 5. 显示"最后更新:2026-04-07 17:14:16" ``` ### 场景2:有快递单号但数据库无数据 ``` 1. 打开订单详情 2. 自动显示"正在加载物流轨迹..." 3. 调用快递100 API(> 1s) 4. 显示轨迹 5. 显示"[API实时]"标签 6. 数据保存到数据库 ``` ### 场景3:无快递单号 ``` 1. 打开订单详情 2. 不显示物流轨迹区域 3. 不发起任何物流查询请求 ``` ### 场景4:手动刷新 ``` 1. 订单详情已打开,轨迹已显示 2. 点击"刷新轨迹"按钮 3. 重新查询(优先数据库) 4. 更新显示 ``` ## 相关文件 ### 修改的文件 - `admin/src/views/consumer/prescription/order_list.vue` - 订单列表页面 ### 相关文档 - `EXPRESS_TRACKING_DATABASE_QUERY.md` - 数据库查询优化 - `EXPRESS_TRACKING_SYNC_COMPLETE.md` - 同步完成报告 - `EXPRESS_TRACKING_SYSTEM.md` - 系统架构 ## 总结 ✅ 打开详情自动加载物流轨迹 ✅ 减少50%用户操作步骤 ✅ 保留手动刷新功能 ✅ 添加加载状态提示 ✅ 优化按钮文字和样式 ✅ 条件加载,避免无效请求 ✅ 数据库优先,快速响应 **用户体验提升**: - 操作步骤:6步 → 3步 - 加载时间:< 50ms(数据库) - 信息可见性:立即可见 - 操作便捷性:无需额外点击 **下一步**: 1. 前端测试自动加载功能 2. 验证各种边界情况 3. 收集用户反馈 4. 可选:添加"自动刷新"开关(用户可选择是否自动加载)