## 任务描述
在管理员包裹页面添加详情 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
包裹编号、重量、尺寸、客户信息
商品名称、数量、敏感品标记、滞留费
完整地址、国家、城市
```
## 业务逻辑
### 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` 的费用显示