## 任务描述 在管理员包裹页面添加详情 Modal,实现报价和发货功能。 ## 技术细节 - **文件位置**:`frontend/src/views/admin/AdminParcels.vue` - **新增组件**:包裹详情 Modal - **API 调用**: - `GET /api/v1/admin/parcels/{id}/details` - 获取详情 - `POST /api/v1/admin/parcels/{id}/quote` - 提交报价 - `POST /api/v1/admin/parcels/{id}/ship` - 提交发货 ## UI 设计 ### 1. 表格中添加"详情"按钮 ```vue ``` ### 2. 详情 Modal 结构 ```vue
包裹编号、重量、尺寸、客户信息
商品名称、数量、敏感品标记、滞留费
完整地址、国家、城市
滞留费:${{ storageFee }} (自动计算)
总费用:${{ totalFee }}
中间物流单号:{{ parcelDetail.parcel.internal_tracking_no }}
``` ## 业务逻辑 ### 1. 打开详情 ```javascript const openParcelDetail = async (parcelId) => { loading.value = true try { const data = await adminService.getParcelDetails(parcelId) parcelDetail.value = data storageFee.value = data.storage_fees.total_fee_usd showDetailModal.value = true } catch (err) { error.value = '获取包裹详情失败' } finally { loading.value = false } } ``` ### 2. 提交报价 ```javascript const submitQuote = async () => { try { await adminService.quoteParcel(parcelDetail.value.parcel.id, { shipping_fee_usd: parseFloat(shippingFee.value), remote_area_fee_usd: parseFloat(remoteAreaFee.value) || 0 }) successMessage.value = '报价提交成功' showDetailModal.value = false await fetchParcels() } catch (err) { error.value = '报价提交失败' } } ``` ### 3. 提交发货 ```javascript const submitShip = async () => { try { await adminService.shipParcel(parcelDetail.value.parcel.id, { international_tracking_no: internationalTrackingNo.value }) successMessage.value = '发货成功' showDetailModal.value = false await fetchParcels() } catch (err) { error.value = '发货失败' } } ``` ## 完成标准 - [ ] 详情 Modal UI 实现完成且美观 - [ ] 报价表单实现(自动计算总费用) - [ ] 发货表单实现 - [ ] 商品列表显示敏感品标记 - [ ] 滞留费明细显示清晰 - [ ] API 调用正确 - [ ] 错误处理完善 - [ ] 前端类型定义更新(`frontend/src/types/api.d.ts`) - [ ] 前端服务更新(`frontend/src/services/admin.js`) ## 参考 - 设计文档:`docs/PARCEL_MANAGEMENT_DESIGN.md` 第 4.3.2 节 - 现有代码:`frontend/src/views/parcel/ParcelPage.vue` 的费用显示