hejianhao
2026-05-28 1229817aed4faf1583c1b6094145bc7f0129488e
fix(robotaxi): 修复地图坐标类型问题并优化附近站点埋点上报

添加埋点数据预处理逻辑,对nearby_pickup_stations字段仅保留id、name、latitude、longitude、electronicAreaId指定字段并限制上报数量为5
修复站点经纬度为字符串类型导致的地图无法正确居中问题,统一站点数据处理格式
2个文件已修改
70 ■■■■■ 已修改文件
src/pages/robotaxi/home/index.tsx 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/Robotaxi-public-method.ts 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/robotaxi/home/index.tsx
@@ -40,6 +40,7 @@
import { checkOtp, toH5 } from '../../../utils/tools';
import { getCityLocation } from '../../../utils/Robotaxi-public-method';
import {
  HOME_MAP_ID,
  HOME_ORDER_STATUS,
  MARKER_TAP_SETTLE_DELAY,
  OVERLAY_ANCHOR_INIT_DELAY,
@@ -354,6 +355,22 @@
  };
  /**
   * 统一标准化站点坐标,避免字符串坐标导致地图中心未正确同步。
   */
  const normalizeSiteMarker = (site: any) => {
    const latitude = Number(site?.latitude);
    const longitude = Number(site?.longitude);
    if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) {
      return null;
    }
    return {
      ...site,
      latitude,
      longitude
    };
  };
  /**
   * 点击站点 marker 后同步地图中心与吸附站点。
   */
  const handleMarkerTap = (event: any) => {
@@ -370,19 +387,28 @@
      return;
    }
    const normalizedTargetMarker = normalizeSiteMarker(targetMarker);
    if (!normalizedTargetMarker) {
      return;
    }
    shouldIgnoreRegionChange.current = true;
    setShowToolTip(false);
    setBounce(true);
    setLatitude(targetMarker.latitude);
    setLongitude(targetMarker.longitude);
    setLatitude(normalizedTargetMarker.latitude);
    setLongitude(normalizedTargetMarker.longitude);
    Taro.createMapContext(HOME_MAP_ID).moveToLocation({
      latitude: normalizedTargetMarker.latitude,
      longitude: normalizedTargetMarker.longitude
    });
    setTimeout(() => {
      setBounce(false);
      setIsAdsorbed(true);
      setCurrentSite(targetMarker);
      setPreferredStartSite(targetMarker);
      Taro.setStorageSync('startSite', targetMarker);
      writeHomeStartSiteDisplayState(targetMarker, HOME_START_SITE_SOURCE_MANUAL_SELECTED);
      setCurrentSite(normalizedTargetMarker);
      setPreferredStartSite(normalizedTargetMarker);
      Taro.setStorageSync('startSite', normalizedTargetMarker);
      writeHomeStartSiteDisplayState(normalizedTargetMarker, HOME_START_SITE_SOURCE_MANUAL_SELECTED);
      setShowToolTip(true);
    }, MARKER_TAP_SETTLE_DELAY);
  };
src/utils/Robotaxi-public-method.ts
@@ -1123,6 +1123,36 @@
  return Object.prototype.toString.call(value) === '[object Object]';
};
/** nearby_pickup_stations 埋点允许保留的字段。 */
const NEARBY_PICKUP_STATION_REPORT_KEYS = ['id', 'name', 'latitude', 'longitude', 'electronicAreaId'] as const;
/** nearby_pickup_stations 埋点最多保留的站点数量。 */
const MAX_NEARBY_PICKUP_STATIONS_REPORT_COUNT = 5;
/** 过滤 nearby_pickup_stations,仅保留约定字段。 */
const filterNearbyPickupStationsForReport = (value: any) => {
  if (!Array.isArray(value)) {
    return value;
  }
  return value.slice(0, MAX_NEARBY_PICKUP_STATIONS_REPORT_COUNT).map((item) => {
    if (Object.prototype.toString.call(item) !== '[object Object]') {
      return item;
    }
    return NEARBY_PICKUP_STATION_REPORT_KEYS.reduce((result: Record<string, any>, key) => {
      result[key] = item?.[key];
      return result;
    }, {});
  });
};
/** 预处理埋点字段:按字段规则裁剪后再进入序列化流程。 */
const preprocessReportValue = (key: string, value: any) => {
  if (key === 'nearby_pickup_stations') {
    return filterNearbyPickupStationsForReport(value);
  }
  return value;
};
/** 序列化单个埋点字段,避免对象被底层隐式转成 [object Object]。 */
const serializeReportValue = (value: any) => {
  if (!isStructuredReportValue(value)) {
@@ -1141,7 +1171,7 @@
    return {};
  }
  return Object.keys(para).reduce((result: Record<string, any>, key: string) => {
    result[key] = serializeReportValue(para[key]);
    result[key] = serializeReportValue(preprocessReportValue(key, para[key]));
    return result;
  }, {});
};