2026-06-25
✅ 确认:司机自行改派功能确实只能改派同线路同时段的司机
司机自行改派 (Driver Reassign Self) 是指当司机提交改派申请时,可以选择指定的司机来接单,而不是让调度中心分配。
文件: DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java
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() // 排除当前司机
);
```
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、开始时间、结束时间)
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
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);
}
}
}
司机自行改派时,可选择的司机必须满足以下**所有条件**:
b.lineId = #{lineId}lineShift.getId() == map.get("id")a.day = #{day}a.driverId != #{driverId}laveSeat >= orderCrossCity.getPeopleNumber()(第882行)endTime > currentTime(第851行)接口: 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),由调度中心根据更复杂的规则进行分配。