From 13c960a2b6bb54797bdbd03aa3184af507d94a9b Mon Sep 17 00:00:00 2001
From: 卢春龙 <lucl@xiaopeng.com>
Date: 星期一, 20 四月 2026 10:42:28 +0800
Subject: [PATCH] Merge branch 'feature_pr_fix' into 'develop'

---
 src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts |   70 ++++++++++++++++++++++++++++++++++-
 1 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts b/src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts
index 315d301..b278b54 100644
--- a/src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts
+++ b/src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts
@@ -49,7 +49,10 @@
 
     const mapRectRef = useRef<any>(null);
     const viewportKeyRef = useRef<string>('');
+    const orderDetailViewportLockedRef = useRef(false);
     const tripStatus6ViewportLockedRef = useRef(false);
+    const orderDetailEnterSignatureRef = useRef('');
+    const orderDetailRouteUpdatedAfterEnterRef = useRef(false);
 
     const isAndroid = useMemo(() => {
         try {
@@ -183,6 +186,22 @@
         return { points, keyParts };
     };
 
+    const buildOrderDetailRouteSignature = (pickupSite: any, dropoffSite: any) => {
+        const firstPoint = deps.routePoints[0];
+        const lastPoint = deps.routePoints[deps.routePoints.length - 1];
+        return [
+            deps.routePoints.length,
+            firstPoint?.latitude ?? '',
+            firstPoint?.longitude ?? '',
+            lastPoint?.latitude ?? '',
+            lastPoint?.longitude ?? '',
+            pickupSite?.latitude ?? '',
+            pickupSite?.longitude ?? '',
+            dropoffSite?.latitude ?? '',
+            dropoffSite?.longitude ?? '',
+        ].join('|');
+    };
+
     const updateViewportByPayload = (viewportType: string, points: any[]) => {
         const mapCtx = Taro.createMapContext('map');
         const bottomPadding = computeBottomPadding(points, viewportType);
@@ -263,10 +282,44 @@
         const { points, keyParts } = buildViewportPayload(viewportType, pickupSite, dropoffSite);
         if (points.length === 0) return;
         const nextKey = keyParts.join('|');
-        if (nextKey === viewportKeyRef.current) return;
+        if (nextKey === viewportKeyRef.current) {
+            if (mapScale < DROPOFF_MAX_SCALE) {
+                setMapScale(DROPOFF_MAX_SCALE);
+            }
+            return;
+        }
         viewportKeyRef.current = nextKey;
         updateViewportByPayload(viewportType, points);
-    }, [deps.tripStatus, deps.statusRule?.viewport, deps.endSite?.latitude, deps.endSite?.longitude]);
+    }, [deps.tripStatus, deps.statusRule?.viewport, deps.endSite?.latitude, deps.endSite?.longitude, mapScale]);
+
+    useEffect(() => {
+        if (![8, 9].includes(deps.tripStatus)) {
+            orderDetailViewportLockedRef.current = false;
+            orderDetailRouteUpdatedAfterEnterRef.current = false;
+            orderDetailEnterSignatureRef.current = '';
+            return;
+        }
+        const { pickupSite, dropoffSite } = resolveViewportSites();
+        orderDetailEnterSignatureRef.current = buildOrderDetailRouteSignature(pickupSite, dropoffSite);
+        orderDetailRouteUpdatedAfterEnterRef.current = false;
+        orderDetailViewportLockedRef.current = false;
+        viewportKeyRef.current = '';
+        setMapScale(14);
+    }, [deps.tripStatus]);
+
+    useEffect(() => {
+        if (![8, 9].includes(deps.tripStatus)) return;
+        const { pickupSite, dropoffSite } = resolveViewportSites();
+        const currentSignature = buildOrderDetailRouteSignature(pickupSite, dropoffSite);
+        if (!orderDetailEnterSignatureRef.current) {
+            orderDetailEnterSignatureRef.current = currentSignature;
+            return;
+        }
+        if (currentSignature === orderDetailEnterSignatureRef.current) return;
+        orderDetailRouteUpdatedAfterEnterRef.current = true;
+        orderDetailViewportLockedRef.current = false;
+        viewportKeyRef.current = '';
+    }, [deps.tripStatus, deps.routePoints, deps.startSite?.latitude, deps.startSite?.longitude, deps.endSite?.latitude, deps.endSite?.longitude]);
 
     useEffect(() => {
         const { pickupSite, dropoffSite } = resolveViewportSites();
@@ -274,6 +327,14 @@
         if (viewportType === 'dropoff') return;
         const { points, keyParts } = buildViewportPayload(viewportType, pickupSite, dropoffSite);
         if (points.length === 0) return;
+        if (
+            [8, 9].includes(deps.tripStatus) &&
+            viewportType === 'order_detail' &&
+            orderDetailViewportLockedRef.current &&
+            orderDetailRouteUpdatedAfterEnterRef.current
+        ) {
+            return;
+        }
         if (deps.tripStatus === 6 && viewportType === 'route' && tripStatus6ViewportLockedRef.current) return;
         const nextKey = keyParts.join('|');
         if (nextKey === viewportKeyRef.current) return;
@@ -281,6 +342,10 @@
         updateViewportByPayload(viewportType, points);
         if (deps.tripStatus === 6 && viewportType === 'route') {
             tripStatus6ViewportLockedRef.current = true;
+        }
+        if ([8, 9].includes(deps.tripStatus) && viewportType === 'order_detail') {
+            const hasOrderDetailRouteAfterEnter = orderDetailRouteUpdatedAfterEnterRef.current && deps.routePoints.length > 0;
+            orderDetailViewportLockedRef.current = hasOrderDetailRouteAfterEnter;
         }
     }, [deps.tripStatus, deps.statusRule, deps.routePoints, deps.walkingPoints, deps.startSite?.latitude, deps.startSite?.longitude, deps.endSite?.latitude, deps.endSite?.longitude, deps.vehicleLocation, deps.longitude, deps.latitude, mapBottomPadding]);
 
@@ -309,6 +374,7 @@
         setShowLocationFlag,
         mapRectRef,
         viewportKeyRef,
+        orderDetailViewportLockedRef,
         tripStatus6ViewportLockedRef,
         isAndroid,
         resolveSafeBottomInset,

--
Gitblit v1.7.1