hejianhao
2026-05-25 af6e89a9efa545b49c7a6091fece80888a714c55
修复(开始行程页钩子): 新增取消类型4处理并优化钩子逻辑

- 新增取消类型4处理,直接重启路线规划
- 添加150ms延迟到地图同步逻辑以减少卡顿
- 返回首页时保留当前上车点信息
- 修复车辆标记旋转归一化和地图视图闭包问题
5个文件已修改
71 ■■■■■ 已修改文件
src/robotaxi/pages/begin-route/hooks/use-map-markers.ts 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-order-cancel.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-page-actions.ts 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-vehicle-speed-scale.ts 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-map-markers.ts
@@ -4,6 +4,17 @@
const CHANGE_SITE_UP_ICON_URL = 'https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/change-site-up.png'; // 行程中修改目的地时的上车点图标
/**
 * 归一化车辆朝向,避免透传负数或超过 360 的角度。
 */
const normalizeMarkerRotate = (rotate: unknown) => {
  const numericRotate = Number(rotate);
  if (!Number.isFinite(numericRotate)) {
    return null;
  }
  return ((numericRotate % 360) + 360) % 360;
};
/**
 * 生成 marker 签名,供平移态判断结构是否实际变化。
 */
const buildMarkersSignature = (markers: any[], vehicleMarkerId: number, shouldUsePureTranslateCarMarker: boolean) => markers
@@ -201,12 +212,15 @@
        }
        markersSignatureRef.current = nextMarkersSignature;
        const mergedMarkers = [...nextMarkers];
        const latestVehicleLatitude = Number(deps.vehicleLocation?.latitude);
        const latestVehicleLongitude = Number(deps.vehicleLocation?.longitude);
        const latestVehicleRotate = normalizeMarkerRotate(deps.vehicleDirection);
        mergedMarkers[nextCarIndex] = {
          ...mergedMarkers[nextCarIndex],
          latitude: prevCar.latitude,
          longitude: prevCar.longitude,
          rotate: typeof mergedMarkers[nextCarIndex]?.rotate === 'number'
            ? mergedMarkers[nextCarIndex].rotate
          latitude: Number.isFinite(latestVehicleLatitude) ? latestVehicleLatitude : prevCar.latitude,
          longitude: Number.isFinite(latestVehicleLongitude) ? latestVehicleLongitude : prevCar.longitude,
          rotate: typeof latestVehicleRotate === 'number'
            ? latestVehicleRotate
            : prevCar.rotate
        };
        return mergedMarkers;
src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts
@@ -80,6 +80,12 @@
    const orderDetailEnterSignatureRef = useRef('');
    const orderDetailRouteUpdatedAfterEnterRef = useRef(false);
    const dynamicScaleHoldUntilRef = useRef(0); // 速度缩放暂停截止时间
    const vehicleLocationRef = useRef(deps.vehicleLocation); // 车辆位置 ref,供延时回调读取最新值
    const latitudeRef = useRef(deps.latitude); // 当前中心纬度 ref
    const longitudeRef = useRef(deps.longitude); // 当前中心经度 ref
    useEffect(() => { vehicleLocationRef.current = deps.vehicleLocation; }, [deps.vehicleLocation]);
    useEffect(() => { latitudeRef.current = deps.latitude; }, [deps.latitude]);
    useEffect(() => { longitudeRef.current = deps.longitude; }, [deps.longitude]);
    const isAndroid = useMemo(() => {
        try {
@@ -428,13 +434,13 @@
     * 行程动态缩放生效时,将地图中心跟随到车辆位置,确保车辆留在当前视野内。
     */
    const syncActiveTripViewportToVehicle = useCallback(() => {
        const vehicleLatitude = Number(deps.vehicleLocation?.latitude);
        const vehicleLongitude = Number(deps.vehicleLocation?.longitude);
        const vehicleLatitude = Number(vehicleLocationRef.current?.latitude);
        const vehicleLongitude = Number(vehicleLocationRef.current?.longitude);
        if (!Number.isFinite(vehicleLatitude) || !Number.isFinite(vehicleLongitude)) {
            return;
        }
        const currentLatitude = Number(deps.latitude);
        const currentLongitude = Number(deps.longitude);
        const currentLatitude = Number(latitudeRef.current);
        const currentLongitude = Number(longitudeRef.current);
        const hasLatitudeDelta = !Number.isFinite(currentLatitude) || Math.abs(currentLatitude - vehicleLatitude) >= ACTIVE_TRIP_VIEWPORT_SYNC_MIN_DELTA;
        const hasLongitudeDelta = !Number.isFinite(currentLongitude) || Math.abs(currentLongitude - vehicleLongitude) >= ACTIVE_TRIP_VIEWPORT_SYNC_MIN_DELTA;
        if (!hasLatitudeDelta && !hasLongitudeDelta) {
@@ -442,7 +448,7 @@
        }
        deps.setLatitude(vehicleLatitude);
        deps.setLongitude(vehicleLongitude);
    }, [deps.latitude, deps.longitude, deps.setLatitude, deps.setLongitude, deps.vehicleLocation?.latitude, deps.vehicleLocation?.longitude]);
    }, [deps.setLatitude, deps.setLongitude]);
    useEffect(() => {
        if ([TripStatus.InService, TripStatus.ArrivedDestination].includes(deps.tripStatus)) {
src/robotaxi/pages/begin-route/hooks/use-order-cancel.ts
@@ -116,6 +116,11 @@
   * 确认取消。
   */
  const handleConfirmCancel = async () => {
    if (deps.cancelType === 4) {
      restartPlanningRoute();
      return;
    }
    if (deps.cancelType === 5) {
      handleOpenCancelPopupWithType(5);
      return;
src/robotaxi/pages/begin-route/hooks/use-page-actions.ts
@@ -10,6 +10,10 @@
  MODIFY_DESTINATION_SESSION_KEY
} from '../constants/modify-destination';
import { clearPassedRouteCache } from './passed-route-cache';
import {
  HOME_START_SITE_SOURCE_MANUAL_SELECTED,
  writeHomeStartSiteDisplayState
} from '../../../../pages/robotaxi/home/hooks/use-home-start-site-display';
type Deps = {
  tripStatus: TripStatus;
@@ -23,6 +27,23 @@
 * 页面动作编排:统一处理服务入口、页面跳转、地图气泡点击行为。
 */
export default function usePageActions(deps: Deps) {
  /**
   * 线路预估页返回首页前,显式保留一次当前上车点,避免首页恢复流程把它当作普通未吸附态清掉。
   */
  const retainStartSiteForNextHome = () => {
    const latitude = Number(deps.startSite?.latitude);
    const longitude = Number(deps.startSite?.longitude);
    if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) {
      return;
    }
    writeHomeStartSiteDisplayState(
      deps.startSite,
      HOME_START_SITE_SOURCE_MANUAL_SELECTED,
      undefined,
      true
    );
  };
  /**
   * 清理修改目的地流程相关缓存,避免返回后残留会话影响后续流程。
   */
@@ -78,6 +99,9 @@
    clearModifyDestinationStorage();
    clearPassedRouteCache();
    if (deps.tripStatus === TripStatus.PaymentSuccess || deps.tripStatus === TripStatus.PublishRoute) {
      if (deps.tripStatus === TripStatus.PublishRoute) {
        retainStartSiteForNextHome();
      }
      clearOrderTripStorage();
      Taro.removeStorageSync('endSite');
    }
src/robotaxi/pages/begin-route/hooks/use-vehicle-speed-scale.ts
@@ -145,7 +145,9 @@
        return;
      }
      deps.setMapScale(clamp(nextBand.scale, SCALE_MIN, SCALE_MAX));
      deps.syncActiveTripViewportToVehicle();
      setTimeout(() => {
        deps.syncActiveTripViewportToVehicle();
      }, 150);
    }, Math.max(0, Math.ceil(delayMs)));
  };