跨城出行司机自行改派功能复查报告

复查日期

2026-06-25

复查结论

✅ 确认:司机自行改派功能确实只能改派同线路同时段的司机


功能说明

司机自行改派 (Driver Reassign Self) 是指当司机提交改派申请时,可以选择指定的司机来接单,而不是让调度中心分配。


代码实现分析

核心方法位置

文件: DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java

关键方法

1. queryDriver() 方法(第827行)

功能: 查询可改派的司机列表

实现逻辑:
```java
// 第837行:获取同线路同时段的班次
List lineShifts = lineShiftMapper.getOtherDriverLineShift(orderCrossCity.getLineShiftDriverId());

// 第838行:查询同线路的其他司机(排除当前司机)
List<Map<String, Object>> s = lineSiteMapper.queryOtherDriver(
orderCrossCity.getLineId(), // 同线路
sdf.parse(day), // 当天
orderCrossCity.getDriverId() // 排除当前司机
);
```

2. getOtherDriverLineShift() SQL查询

文件: DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftMapper.xml

SQL(第29-40行):
sql select t2.id, t2.lineId, t2.startTime, t2.endTime, t2.carNum, t2.state, t2.insertTime from t_line_shift_driver t1 left join t_line_shift t2 on t1.lineShiftId = t2.id where t1.id = #{lineShiftDriverId}

作用: 根据当前订单的 lineShiftDriverId 查询出该司机所属的班次信息(包含线路ID、开始时间、结束时间)

3. queryOtherDriver() SQL查询

文件: DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineSiteMapper.xml

SQL(第59-97行):
sql select b.id as id, a.id as lineShiftDriverId, CONCAT(b.startTime, '-', b.endTime) as startTime, c.headImgUrl as headImgUrl, ... (司机和车辆信息) from t_line_shift_driver a left join t_line_shift b on (a.lineShiftId = b.id) left join t_driver c on (a.driverId = c.id) ... (车辆品牌型号等) where 1 = 1 and b.lineId = #{lineId} -- ✅ 限制:同线路 and a.day = #{day} -- ✅ 限制:同一天 and a.driverId != #{driverId} -- ✅ 排除:当前司机 order by b.startTime

4. 筛选逻辑(第846-893行)

for (LineShift lineShift : lineShifts) {  // 遍历当前司机的班次
    // ... 验证班次是否已过期 ...
    
    for (Map<String, Object> map : s) {  // 遍历其他司机
        // 第885行:关键判断 - 只有班次ID相同才会添加到列表
        if (lineShift.getId().intValue() == Integer.valueOf(map.get("id").toString()).intValue()) {
            // 匹配到同时段的司机
            list.add(data);
        }
    }
}

限制条件总结

司机自行改派时,可选择的司机必须满足以下**所有条件**:

1. ✅ 同线路 (Same Line)

  • 条件:b.lineId = #{lineId}
  • 说明:只能改派给同一条跨城线路的司机

2. ✅ 同时段 (Same Shift)

  • 条件:lineShift.getId() == map.get("id")
  • 说明:只能改派给相同发车时段(startTime-endTime)的司机
  • 例如:如果当前订单是"08:00-09:00"时段,只能改派给同样是"08:00-09:00"时段的司机

3. ✅ 同一天 (Same Day)

  • 条件:a.day = #{day}
  • 说明:只能改派给当天排班的司机

4. ✅ 排除当前司机 (Exclude Current Driver)

  • 条件:a.driverId != #{driverId}
  • 说明:不能改派给自己

5. ✅ 有剩余座位 (Has Available Seats)

  • 条件:laveSeat >= orderCrossCity.getPeopleNumber()(第882行)
  • 说明:目标司机的剩余座位必须能容纳订单的乘客数

6. ✅ 未在服务中 (Not In Service)

  • 条件:查询订单状态为5(服务中)的订单(第878行)
  • 说明:如果司机当前时段已有服务中的订单,则不可选

7. ✅ 班次未过期 (Shift Not Expired)

  • 条件:endTime > currentTime(第851行)
  • 说明:班次的结束时间必须晚于当前时间

8. ✅ 不在限制接单范围内 (Not In Restricted Area)

  • 条件:Redis中配置的车辆限制(第841-845行)
  • 说明:某些特定车型可能被限制接单

业务场景示例

场景1:改派成功

  • 当前订单: 北京→天津线路,08:00-09:00时段,5座车,3名乘客
  • 可选司机:
  • 司机A:北京→天津,08:00-09:00,5座车,剩余4个座位 ✅
  • 司机B:北京→天津,08:00-09:00,7座车,剩余5个座位 ✅

场景2:改派失败(不同时段)

  • 当前订单: 北京→天津线路,08:00-09:00时段
  • 无法选择的司机:
  • 司机C:北京→天津,**10:00-11:00**时段 ❌(时段不同)
  • 司机D:北京→天津,**07:00-08:00**时段 ❌(时段不同)

场景3:改派失败(不同线路)

  • 当前订单: 北京→天津线路,08:00-09:00时段
  • 无法选择的司机:
  • 司机E:**北京→上海**,08:00-09:00时段 ❌(线路不同)

场景4:改派失败(座位不足)

  • 当前订单: 5名乘客
  • 无法选择的司机:
  • 司机F:同线路同时段,但只剩余3个座位 ❌(座位不足)

API接口

接口: POST /api/orderCrossCity/reassignOrderCrossCityReassign

参数:
- orderIds - 订单ID(可多个,逗号分隔)
- payType - 改派支付方式(1=微信,2=支付宝,3=余额)
- reason - 改派原因
- remark - 备注
- nowDriverId - 指定的新司机ID(可选)

流程:
1. 如果 nowDriverId 为空 → 提交给调度中心分配
2. 如果 nowDriverId 有值 → 司机自行改派,直接指定司机


数据表关系

t_order_cross_city (跨城订单表)
  └─ lineShiftDriverId → t_line_shift_driver (班次司机关联表)
       ├─ lineShiftId → t_line_shift (班次表)
       │    ├─ lineId (线路ID)
       │    ├─ startTime (开始时间)
       │    └─ endTime (结束时间)
       ├─ driverId → t_driver (司机表)
       ├─ day (排班日期)
       ├─ totalSeat (总座位数)
       └─ laveSeat (剩余座位数)

总结

✅ 确认结论: 司机自行改派功能的限制是正确的,**只能改派给同线路同时段的司机**。

这样的设计是合理的,因为:
1. 保证服务连续性: 同时段的司机能够按时发车,不影响乘客行程
2. 避免资源冲突: 不同时段的司机可能已有其他安排
3. 简化调度逻辑: 同线路同时段的改派不需要重新计算价格和路线
4. 用户体验: 乘客的发车时间不会因为改派而改变

如果需要改派给不同时段或不同线路的司机,应该通过调度中心来处理(不指定 nowDriverId),由调度中心根据更复杂的规则进行分配。