zjk
2026-06-11 d0adc70b86f0d959715b0ca14ce36a9053053fca
feat: 修改分享行程时间问题
4个文件已修改
83 ■■■■■ 已修改文件
src/robotaxi/pages/share-trip/components/share-trip-view.tsx 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/share-trip/hooks/use-share-trip-runtime.ts 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/share-trip/hooks/use-view-delegates.tsx 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/share-trip/index.tsx 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/share-trip/components/share-trip-view.tsx
@@ -36,7 +36,8 @@
  goHome,
  handleContactService,
}: Props) {
  const durationDisplay = formatDurationDisplay(routeDuration); // 预计耗时展示文案
  const hasRouteDuration = typeof routeDuration === 'number' && Number.isFinite(routeDuration);
  const durationDisplay = hasRouteDuration ? formatDurationDisplay(routeDuration) : null; // 预计耗时展示文案
  if (isExpired) {
    return (
@@ -95,9 +96,15 @@
                <View className='calling-car-head'>
                  {tripData?.tripStatus === TripStatus.VehicleApproaching && (
                    <View className='calling-car-head-title'>
                      车辆还有
                      <View className='calling-car-head-title-eta'>{durationDisplay.value}</View>
                      {durationDisplay.unit}到达上车点
                      {durationDisplay ? (
                        <>
                          车辆还有
                          <View className='calling-car-head-title-eta'>{durationDisplay.value}</View>
                          {durationDisplay.unit}到达上车点
                        </>
                      ) : (
                        '车辆正在前往上车点'
                      )}
                    </View>
                  )}
                  {tripData?.tripStatus === TripStatus.VehicleArrivedPickup && (
src/robotaxi/pages/share-trip/hooks/use-share-trip-runtime.ts
@@ -229,7 +229,10 @@
      routeResponse?.points,
      routeResponse?.route?.polyline,
      routeResponse?.polyline,
      routeResponse?.content?.polyline,
      routeResponse?.content?.points,
      routeResponse?.data?.polyline,
      routeResponse?.data?.points,
    ];
    for (const candidate of candidates) {
      if (Array.isArray(candidate) && candidate.length > 0) {
@@ -243,8 +246,20 @@
   * 提取已服务轨迹点。
   */
  const extractServedPoints = (routeResponse: any) => {
    if (!Array.isArray(routeResponse?.servedPoints)) return [];
    return routeResponse.servedPoints.map(normalizePoint).filter(Boolean) as Array<{ longitude: number; latitude: number }>;
    const candidates = [
      routeResponse?.servedPoints,
      routeResponse?.served,
      routeResponse?.content?.servedPoints,
      routeResponse?.content?.served,
      routeResponse?.data?.servedPoints,
      routeResponse?.data?.served,
    ];
    for (const candidate of candidates) {
      if (Array.isArray(candidate) && candidate.length > 0) {
        return candidate.map(normalizePoint).filter(Boolean) as Array<{ longitude: number; latitude: number }>;
      }
    }
    return [];
  };
  /**
@@ -262,9 +277,17 @@
  const syncShareRoute = (routeResponse: any, mappedStatus: TripStatus, nextStartSite: any, nextEndSite: any) => {
    const extractedRoutePoints = extractRoutePoints(routeResponse);
    const servedPoints = extractServedPoints(routeResponse);
    const routeMeta = routeResponse?.content?.route || routeResponse?.route || routeResponse || {};
    const distance = normalizeDistanceKm(Number(routeMeta?.distance));
    const duration = normalizeDurationSeconds(Number(routeMeta?.duration));
    const routeMeta = routeResponse?.content?.route || routeResponse?.route || routeResponse?.content || routeResponse?.data || routeResponse || {};
    const distanceValue = getFieldValue(routeMeta, ['distance'])
      ?? getFieldValue(routeResponse?.content, ['distance'])
      ?? getFieldValue(routeResponse?.data, ['distance'])
      ?? getFieldValue(routeResponse, ['distance']);
    const durationValue = getFieldValue(routeMeta, ['duration'])
      ?? getFieldValue(routeResponse?.content, ['duration'])
      ?? getFieldValue(routeResponse?.data, ['duration'])
      ?? getFieldValue(routeResponse, ['duration']);
    const distance = normalizeDistanceKm(distanceValue);
    const duration = normalizeDurationSeconds(durationValue);
    deps.setRouteDistance(distance);
    deps.setRouteDuration(duration);
    applyRoutePointsRef.current(extractedRoutePoints);
src/robotaxi/pages/share-trip/hooks/use-view-delegates.tsx
@@ -21,9 +21,10 @@
};
export default function useViewDelegates(deps: Deps) {
    const durationDisplay = formatDurationDisplay(deps.routeDuration);
    const hasRouteDuration = typeof deps.routeDuration === 'number' && Number.isFinite(deps.routeDuration);
    const durationDisplay = hasRouteDuration ? formatDurationDisplay(deps.routeDuration) : null;
    const routeSummaryText =
        deps.routeDistance && deps.routeDuration !== null
        deps.routeDistance && durationDisplay
            ? `${durationDisplay.value}${durationDisplay.unit} ${deps.routeDistance.value}${
                  deps.routeDistance.unit === "m" ? "米" : "公里"
              }`
@@ -107,9 +108,9 @@
                                    style={{ marginLeft: "2.5px" }}
                                    className="car-time-num"
                                >
                                    {durationDisplay.value}
                                    {durationDisplay?.value ?? '--'}
                                </CoverView>
                                <CoverView>{durationDisplay.unit}</CoverView>
                                <CoverView>{durationDisplay?.unit || ''}</CoverView>
                            </CoverView>
                        </CoverView>
                    )}
@@ -158,9 +159,9 @@
                                {deps.routeDistance?.unit === "m" ? "米" : "公里"}
                            </View>
                            <View style={{ marginLeft: "2.5px" }} className="car-time-num">
                                {durationDisplay.value}
                                {durationDisplay?.value ?? '--'}
                            </View>
                            <View style={{ flexShrink: 0 }}>{durationDisplay.unit}</View>
                            <View style={{ flexShrink: 0 }}>{durationDisplay?.unit || ''}</View>
                        </View>
                    </View>
                </View>
src/robotaxi/pages/share-trip/index.tsx
@@ -78,17 +78,6 @@
    [tripStatus],
  ); // 当前状态渲染规则
  const shouldShowRoute = statusRule.showRoute; // 是否展示主路线
  const displayRouteDuration = useMemo(() => {
    if (routeDuration === null) {
      return null;
    }
    const normalizedDuration = Number(routeDuration);
    if (!Number.isFinite(normalizedDuration)) {
      return null;
    }
    // 分享行程统一按分钟展示,不展示秒数;不足 1 分钟时按 1 分钟兜底。
    return Math.max(60, normalizedDuration);
  }, [routeDuration]);
  const isAndroid = useMemo(() => {
    try {
@@ -134,6 +123,17 @@
    statusRule,
    shouldShowRoute,
  }); // 路线状态容器
  const displayRouteDuration = useMemo(() => {
    if (routeDuration === null) {
      return null;
    }
    const normalizedDuration = Number(routeDuration);
    if (!Number.isFinite(normalizedDuration)) {
      return null;
    }
    // 分享行程统一按分钟展示,不展示秒数;不足 1 分钟时按 1 分钟兜底。
    return Math.max(60, normalizedDuration);
  }, [routeDuration]);
  const { mapScale, updateMapViewportPadding } = useMapViewport({
    tripStatus,