hejianhao
2026-04-21 2a46bf06f001423160b6cec1a408e0482944d8a3
fix: 修复车辆信息同步与订单状态一致性问题

修复 WebSocket 事件处理中车辆信息与当前订单不匹配的问题。当收到新订单或取消订单时,确保车辆信息与当前订单 ID 严格对应,避免显示错误车辆信息。

- 修改 `isSameOrder` 逻辑,明确处理空值情况
- 在订单变更时同步清理车辆信息
- 添加订单 ID 校验,防止异步请求返回过时数据
- 优化存储同步,确保订单 ID 一致性
3个文件已修改
26 ■■■■■ 已修改文件
src/robotaxi/pages/begin-route/hooks/use-order-actions.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-web-socket-events.ts 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/index.tsx 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-order-actions.ts
@@ -25,6 +25,8 @@
  setTripStatus: (value: number) => void;
  /** 订单设置 */
  setOrderId: (value: string) => void;
  /** 车辆信息设置 */
  setVehicleInfo: (value: any) => void;
  /** 下单提交设置 */
  setCallSubmitting: (value: boolean) => void;
  /** 取消类型设置 */
@@ -173,6 +175,7 @@
   */
  const clearActiveOrderRuntime = () => {
    deps.setOrderId('');
    deps.setVehicleInfo({});
    clearOrderTripStorage();
    Taro.removeStorageSync('pickupEndTime');
    Taro.removeStorageSync('waitingTimerStartAt');
src/robotaxi/pages/begin-route/hooks/use-web-socket-events.ts
@@ -42,7 +42,8 @@
    payload?.content?.orderId || payload?.orderId || fallbackOrderId || Taro.getStorageSync('orderId');
const isSameOrder = (incomingOrderId: string, currentOrderId: string) => {
    if (!incomingOrderId || !currentOrderId) return true;
    if (!incomingOrderId && !currentOrderId) return true;
    if (!incomingOrderId || !currentOrderId) return false;
    return String(incomingOrderId) === String(currentOrderId);
};
@@ -86,20 +87,21 @@
    lastFetchedVehicleOrderIdRef: any
) => {
    if (!effectiveOrderId) return;
    const vehicleInfoEmpty =
        !deps.vehicleInfo ||
        (!deps.vehicleInfo.plateNumber && !deps.vehicleInfo.vehicleCode && !deps.vehicleInfo.vehicleColor && !deps.vehicleInfo.vehiclePictures);
    const shouldFetchVehicle =
        lastFetchedVehicleOrderIdRef.current !== effectiveOrderId &&
        (vehicleInfoEmpty || deps.orderId !== effectiveOrderId);
    const shouldFetchVehicle = lastFetchedVehicleOrderIdRef.current !== effectiveOrderId;
    if (deps.orderId !== effectiveOrderId) {
        deps.setOrderId(effectiveOrderId);
        Taro.setStorageSync('orderId', effectiveOrderId);
    }
    if (!shouldFetchVehicle) return;
    lastFetchedVehicleOrderIdRef.current = effectiveOrderId;
    const requestedOrderId = String(effectiveOrderId);
    queryVehicleByOrderId({ orderId: effectiveOrderId })
        .then((res: any) => {
            const latestOrderId = String(Taro.getStorageSync('orderId') || '');
            if (latestOrderId !== requestedOrderId) {
                return;
            }
            deps.setVehicleInfo(res);
        })
        .catch(() => { });
@@ -109,6 +111,7 @@
    if (!payload?.showCancelPopup) return;
    if (changeStatusOld === 4 || changeStatusOld === 5) {
        deps.setOrderId('');
        deps.setVehicleInfo({});
        clearOrderTripStorage();
        Taro.removeStorageSync('pickupEndTime');
        Taro.removeStorageSync('waitingTimerStartAt');
@@ -346,8 +349,13 @@
                return;
            }
            lastFetchedVehicleOrderIdRef.current = null;
            const requestedOrderId = String(currentOrderId || '');
            queryVehicleByOrderId({ orderId: currentOrderId })
                .then((res: any) => {
                    const latestOrderId = String((depsRef.current.orderId || Taro.getStorageSync('orderId') || ''));
                    if (!requestedOrderId || latestOrderId !== requestedOrderId) {
                        return;
                    }
                    currentDeps.setVehicleInfo(res);
                })
                .catch(() => { });
src/robotaxi/pages/begin-route/index.tsx
@@ -393,6 +393,7 @@
    cancelType,
    setTripStatus,
    setOrderId,
    setVehicleInfo,
    setCallSubmitting,
    setCancelType,
    setShowCancelPopup,