# 寄车带货功能接口文档

## 功能概述
寄车带货功能基于固定多站点路线，司机发车时生成专属二维码，用户扫码后可直接填写起始站点创建寄货订单，司机端实时查看货物状态。

## 数据库表结构

### 1. 司机发车任务表 (tbl_dzbc_driver_trip)
- id: 编号
- trip_no: 任务编号（唯一）
- path_id: 路线ID
- path_name: 路线名称
- driver_id: 司机ID
- driver_name: 司机姓名
- driver_phone: 司机电话
- car_id: 车辆ID
- car_plate: 车牌号
- start_time: 出发时间
- end_time: 到达时间
- status: 状态（0-待发车，1-运行中，2-已完成，3-已取消）
- qr_code: 二维码内容
- current_site_id: 当前站点ID
- current_site_name: 当前站点名称
- cargo_count: 货物数量
- cargo_total_price: 货物总价（分）
- remark: 备注
- ext1, ext2: 扩展字段

### 2. 货物订单表 (tbl_dzbc_cargo_order)
- id: 编号
- order_no: 订单编号（唯一）
- trip_id: 司机任务ID
- trip_no: 任务编号
- user_id: 用户ID
- user_name: 用户姓名
- user_phone: 用户电话
- sender_name: 发货人姓名
- sender_phone: 发货人电话
- receiver_name: 收货人姓名
- receiver_phone: 收货人电话
- from_site_id: 起始站点ID
- from_site_name: 起始站点名称
- to_site_id: 送达站点ID
- to_site_name: 送达站点名称
- price: 价格（分）
- pay_status: 支付状态（0-待支付，1-已支付）
- pay_time: 支付时间
- pay_trade_no: 支付交易号
- status: 订单状态（0-待发货，1-已取货，2-运输中，3-已送达，4-已取消）
- cargo_count: 货物数量
- cargo_weight: 货物重量
- cargo_value: 货物价值
- remark: 备注
- ext1, ext2: 扩展字段

### 3. 货物详情表 (tbl_dzbc_cargo_item)
- id: 编号
- order_id: 订单ID
- order_no: 订单编号
- cargo_name: 货物名称
- cargo_type: 货物类型
- quantity: 数量
- unit: 单位
- weight: 重量
- length: 长度
- width: 宽度
- height: 高度
- value: 价值
- image_urls: 图片地址
- remark: 备注
- ext1, ext2: 扩展字段

## 业务流程

### 司机端流程

1. **创建发车任务**
   - 司机选择路线、车辆
   - 设置出发时间
   - 生成唯一任务编号和二维码

2. **开始发车**
   - 更新任务状态为"运行中"
   - 二维码开始有效

3. **到达站点**
   - 更新当前站点
   - 标记该站点的订单为"已取货"

4. **完成任务**
   - 更新任务状态为"已完成"
   - 二维码失效

### 用户端流程

1. **扫码下单**
   - 扫描司机生成的二维码
   - 自动获取任务信息（路线、站点列表）

2. **填写订单信息**
   - 选择起始站点、送达站点（从路线站点中选择）
   - 填写发货人、收货人信息
   - 填写货物详情（名称、数量、重量等）
   - 上传货物图片

3. **确认价格**
   - 系统根据站点价格自动计算费用
   - 用户确认并支付

4. **等待取货和配送**
   - 实时查看订单状态
   - 司机到达起始站点后标记为"已取货"
   - 货物到达目的地后标记为"已送达"

## 接口列表

### 司机任务管理

#### 1. 创建发车任务
```
POST /system/dzbc/driverTrip
```

请求体：
```json
{
  "pathId": 1,
  "driverId": 10,
  "carId": 1,
  "startTime": "2024-02-20 08:00:00"
}
```

返回：
```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "id": 1,
    "tripNo": "TRIP20240220080001234",
    "pathId": 1,
    "pathName": "福州市区环线",
    "driverId": 10,
    "driverName": "张司机",
    "driverPhone": "13800138000",
    "carId": 1,
    "carPlate": "闽A12345",
    "startTime": "2024-02-20 08:00:00",
    "status": 0,
    "qrCode": "https://xxx.com/qr/TRIP20240220080001234",
    "cargoCount": 0,
    "cargoTotalPrice": 0,
    "sites": [
      {
        "id": 1,
        "siteId": 1,
        "siteName": "火车站",
        "siteOrder": 1
      },
      {
        "id": 2,
        "siteId": 2,
        "siteName": "市政府",
        "siteOrder": 2
      },
      {
        "id": 3,
        "siteId": 3,
        "siteName": "仓山万达",
        "siteOrder": 3
      }
    ]
  }
}
```

#### 2. 开始发车
```
POST /system/dzbc/driverTrip/start/{id}
```

返回：
```json
{
  "code": 200,
  "msg": "操作成功"
}
```

#### 3. 到达站点
```
POST /system/dzbc/driverTrip/arrive/{id}?siteId=2
```

返回：
```json
{
  "code": 200,
  "msg": "操作成功"
}
```

#### 4. 完成任务
```
POST /system/dzbc/driverTrip/complete/{id}
```

#### 5. 取消任务
```
POST /system/dzbc/driverTrip/cancel/{id}
```

#### 6. 查询任务列表
```
GET /system/dzbc/driverTrip/list
```

查询参数：
- pathId: 路线ID
- driverId: 司机ID
- tripNo: 任务编号（模糊查询）
- status: 状态
- pageNum: 页码
- pageSize: 每页大小

#### 7. 查询任务详情
```
GET /system/dzbc/driverTrip/{id}
```

#### 8. 根据二维码查询任务（用户扫码）
```
GET /system/dzbc/driverTrip/qr/{tripNo}
```

说明：用户扫描二维码后，前端获取 tripNo 调用此接口，返回任务信息和路线站点列表。

返回示例：
```json
{
  "code": 200,
  "data": {
    "id": 1,
    "tripNo": "TRIP20240220080001234",
    "pathId": 1,
    "pathName": "福州市区环线",
    "driverId": 10,
    "driverName": "张司机",
    "driverPhone": "13800138000",
    "carId": 1,
    "carPlate": "闽A12345",
    "startTime": "2024-02-20 08:00:00",
    "status": 1,
    "currentSiteId": 1,
    "currentSiteName": "火车站",
    "cargoCount": 5,
    "cargoTotalPrice": 5000,
    "sites": [
      {
        "id": 1,
        "siteId": 1,
        "siteName": "火车站",
        "siteOrder": 1
      },
      {
        "id": 2,
        "siteId": 2,
        "siteName": "市政府",
        "siteOrder": 2
      },
      {
        "id": 3,
        "siteId": 3,
        "siteName": "仓山万达",
        "siteOrder": 3
      }
    ],
    "cargoOrders": [
      {
        "id": 1,
        "orderNo": "CARGO20240220081500001",
        "fromSiteName": "火车站",
        "toSiteName": "市政府",
        "price": 500,
        "status": 1
      }
    ]
  }
}
```

### 货物订单管理

#### 1. 提交货物订单
```
POST /system/dzbc/cargoOrder/submit
```

请求体：
```json
{
  "tripNo": "TRIP20240220080001234",
  "fromSiteId": 1,
  "toSiteId": 2,
  "senderName": "张三",
  "senderPhone": "13800138001",
  "receiverName": "李四",
  "receiverPhone": "13800138002",
  "items": [
    {
      "cargoName": "电脑",
      "cargoType": "电子产品",
      "quantity": 1,
      "unit": "台",
      "weight": 2.5,
      "length": 40,
      "width": 30,
      "height": 10,
      "value": 5000,
      "images": ["http://xxx.com/image1.jpg"],
      "remark": "小心轻放"
    }
  ],
  "remark": "请尽快送达"
}
```

返回：
```json
{
  "code": 200,
  "data": {
    "id": 1,
    "orderNo": "CARGO20240220081500001",
    "tripId": 1,
    "tripNo": "TRIP20240220080001234",
    "userId": 1,
    "userName": "王五",
    "userPhone": "13800138003",
    "senderName": "张三",
    "senderPhone": "13800138001",
    "receiverName": "李四",
    "receiverPhone": "13800138002",
    "fromSiteId": 1,
    "fromSiteName": "火车站",
    "toSiteId": 2,
    "toSiteName": "市政府",
    "price": 500,
    "payStatus": 0,
    "status": 0,
    "cargoCount": 1,
    "cargoWeight": 2.5,
    "cargoValue": 5000,
    "items": [...]
  }
}
```

#### 2. 查询我的订单
```
GET /system/dzbc/cargoOrder/my/list
```

说明：获取当前登录用户的货物订单列表。

#### 3. 查询任务的订单列表
```
GET /system/dzbc/cargoOrder/trip/{tripId}
```

说明：司机端查看某个任务的所有货物订单。

#### 4. 更新订单状态
```
POST /system/dzbc/cargoOrder/status/{id}?status=1
```

状态说明：
- 0: 待发货
- 1: 已取货（司机到达起始站点）
- 2: 运输中（货物运输中）
- 3: 已送达（到达目的地）

#### 5. 查询订单列表（管理员/司机）
```
GET /system/dzbc/cargoOrder/list
```

查询参数：
- tripId: 任务ID
- userId: 用户ID
- status: 订单状态
- payStatus: 支付状态
- pageNum: 页码
- pageSize: 每页大小

#### 6. 查询订单详情
```
GET /system/dzbc/cargoOrder/{id}
```

## 价格计算规则

价格从 `tbl_dzbc_site_price` 表中查询，规则如下：

1. **查询条件**：
   - pathId: 任务对应的路线ID
   - fromSiteId: 用户选择的起始站点ID
   - toSiteId: 用户选择的送达站点ID

2. **返回结果**：
   - 如果找到匹配记录，直接使用该价格
   - 如果没有找到，提示用户无法配送该线路

3. **单位说明**：
   - 数据库存储的价格单位为"分"
   - 前端显示时转换为"元"

## 订单状态流转

```
待发货 (0)
    ↓ [司机到达起始站点，取货]
已取货 (1)
    ↓ [开始运输]
运输中 (2)
    ↓ [到达目的地]
已送达 (3)
    ↓
已取消 (4) [用户或管理员取消]
```

## 二维码说明

1. **生成时机**：创建发车任务时自动生成
2. **内容格式**：`https://xxx.com/qr/{tripNo}` 或直接使用 `tripNo`
3. **有效期**：从"开始发车"到"完成任务"期间有效
4. **使用方式**：
   - 前端生成二维码图片供司机展示
   - 用户扫码后获取 `tripNo`
   - 调用 `GET /system/dzbc/driverTrip/qr/{tripNo}` 获取任务信息

## 司机端显示内容

司机端需要实时显示：
1. 当前任务信息（路线、车辆、状态）
2. 当前站点
3. 货物订单列表：
   - 订单编号
   - 起始站点 → 送达站点
   - 发货人、收货人信息
   - 订单状态
   - 货物数量、重量
4. 统计信息：
   - 总订单数
   - 总金额
   - 各站点待取货数量

## 注意事项

1. **站点限制**：
   - 用户只能从任务对应的路线站点中选择
   - 不能选择路线外的站点

2. **时间限制**：
   - 只能在"运行中"状态下扫码下单
   - "待发车"和"已完成"状态不能下单

3. **价格设置**：
   - 需要预先在 `tbl_dzbc_site_price` 表中设置价格
   - 建议为任意两个站点都设置价格
   - 包括相邻站点和跨站点

4. **图片上传**：
   - 支持上传货物图片
   - 图片存储到 OSS
   - 多个图片用逗号分隔存储

5. **订单限制**：
   - 同一用户可以提交多个订单
   - 订单取消后不能恢复

