ai-coding
2026-08-14 ef87aaa9808485e8dba649740dbce1c10b764d4e
feat: 使用固定车图,解决派车成功动效车图闪烁问题

Co-Authored-By: 卢春龙 <lucl@xiaopeng.com>
3个文件已修改
27 ■■■■■ 已修改文件
src/robotaxi/constants/assets.ts 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/calling-car.tsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/dispatch-transition-layer.tsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/constants/assets.ts
@@ -22,6 +22,18 @@
/** 默认车辆图(无实拍车图时的兜底)。 */
export const DEFAULT_VEHICLE_IMG = 'https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/v2/default-vehicle-img-20260724-v2.png';
/**
 * 是否使用接口(queryVehicleByOrderId)动态返回的车图。
 *
 * 背景:当前线上只有一种车型,产品要求统一用默认车图 DEFAULT_VEHICLE_IMG,
 *      暂不使用接口返回的动态车图(vehicleInfo.vehiclePictures.url)。
 *
 * 后续有新车型、需要按车型展示实拍车图时,把此开关改回 true 即可完全恢复动态车图逻辑,
 * 无需改动其余代码(车图渲染处 calling-car.tsx、dispatch-transition-layer.tsx 均已按此开关分流;
 * 默认车图 DEFAULT_VEHICLE_IMG 已在 constants/preload-assets.ts 静态预加载,展示无闪烁)。
 */
export const USE_DYNAMIC_VEHICLE_IMG = false;
/** 到达终点 / 行程结束卡片背景图。 */
export const TRIP_FINISHED_BG_IMG = 'https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/v2/trip-finished-20260703.png';
src/robotaxi/pages/begin-route/components/calling-car.tsx
@@ -6,7 +6,7 @@
import { useDispatchTransition } from '../hooks/use-dispatch-transition';
import DispatchTransitionLayer from './dispatch-transition-layer';
import { TripStatus } from '../../../constants/trip-status';
import { CARD_BG_IMG, DEFAULT_VEHICLE_IMG, TRIP_FINISHED_BG_IMG } from '../../../constants/assets';
import { CARD_BG_IMG, DEFAULT_VEHICLE_IMG, TRIP_FINISHED_BG_IMG, USE_DYNAMIC_VEHICLE_IMG } from '../../../constants/assets';
import { BLUETOOTH_ICON_OFF } from '../hooks/use-bluetooth-access'; // 蓝牙未开/未授权图标
import TripStatusHeader from './calling-car-modules/trip-status-header'; // 行程状态头
import VehicleInfoCard from './calling-car-modules/vehicle-info-card'; // 车辆信息卡片
@@ -317,7 +317,9 @@
            // 常驻车图:接驾/行程中/支付成功且有车牌时展示。转场期间车模兜底由 DispatchTransitionLayer 渲染。
            ([TripStatus.VehicleApproaching, TripStatus.VehicleArrivedPickup, TripStatus.InService, TripStatus.PaymentSuccess].includes(tripStatus) && vehicleInfo?.plateNumber) && <Image
              className='calling-car-vehicle-pic'
              src={safeParse(vehicleInfo?.vehiclePictures, {})?.url || DEFAULT_VEHICLE_IMG}
              // 当前只有一种车型,产品要求统一用默认车图(USE_DYNAMIC_VEHICLE_IMG=false);
              // 后续有新车型时把该开关改回 true 即恢复接口动态车图。详见 constants/assets.ts。
              src={USE_DYNAMIC_VEHICLE_IMG ? (safeParse(vehicleInfo?.vehiclePictures, {})?.url || DEFAULT_VEHICLE_IMG) : DEFAULT_VEHICLE_IMG}
            />
          }
          <View className='calling-car-content-box'>
src/robotaxi/pages/begin-route/components/dispatch-transition-layer.tsx
@@ -2,7 +2,7 @@
import { Image, Video } from "@tarojs/components";
import { safeParse } from '../../../../utils/Robotaxi-public-method';
import { DispatchPhase, DISPATCH_VIDEO_SRC, DISPATCH_VIDEO_POSTER, DISPATCH_VIDEO_END_POSTER } from '../hooks/use-dispatch-transition';
import { CARD_BG_IMG, DEFAULT_VEHICLE_IMG } from '../../../constants/assets';
import { CARD_BG_IMG, DEFAULT_VEHICLE_IMG, USE_DYNAMIC_VEHICLE_IMG } from '../../../constants/assets';
import { getPreloadedVideoSrc } from '../../../utils/video-preload';
type Props = {
@@ -71,8 +71,11 @@
  if (!shouldPlayEnter || transitionDone) return null;
  const vehiclePicSrc = safeParse(vehicleInfo?.vehiclePictures, {})?.url
    || DEFAULT_VEHICLE_IMG;
  // 当前只有一种车型,产品要求统一用默认车图(USE_DYNAMIC_VEHICLE_IMG=false);
  // 后续有新车型时把该开关改回 true 即恢复接口动态车图。详见 constants/assets.ts。
  const vehiclePicSrc = USE_DYNAMIC_VEHICLE_IMG
    ? (safeParse(vehicleInfo?.vehiclePictures, {})?.url || DEFAULT_VEHICLE_IMG)
    : DEFAULT_VEHICLE_IMG;
  // 优先用预下载好的本地视频路径(downloadFile 落地,无网络缓冲);未就绪回退 CDN URL。
  const videoSrc = getPreloadedVideoSrc(DISPATCH_VIDEO_SRC);