| | |
| | | import suggest from '../../../robotaxi/assets/suggest.png' |
| | | import originIcon from '../../../robotaxi/assets/origin-icon.png' |
| | | import wsManager from '../../../utils/websocket'; |
| | | import { getWalkingRoute, formatDurationToClock, formatDateTime, getStoredRoutePoints, clearOrderTripStorage } from '../../../utils/Robotaxi-public-method'; |
| | | import { getWalkingRoute, formatDurationToClock, formatDateTime, clearOrderTripStorage } from '../../../utils/Robotaxi-public-method'; |
| | | import { |
| | | saveOrder, |
| | | queryRouteAndFare, |
| | |
| | | const distanceKm = normalizeDistanceKm(distance); |
| | | if (distanceKm !== null) { |
| | | setRouteDistance(distanceKm); |
| | | Taro.setStorageSync('orderRouteDistance', distanceKm.value); |
| | | Taro.setStorageSync('orderRouteDistanceUnit', distanceKm.unit); |
| | | } |
| | | const durationSeconds = normalizeDurationSeconds(duration); |
| | | if (durationSeconds !== null) { |
| | | setRouteDuration(durationSeconds); |
| | | Taro.setStorageSync('orderRouteDuration', durationSeconds); |
| | | Taro.setStorageSync('orderRouteDurationUnit', 's'); |
| | | } |
| | | if (Array.isArray(points) && points.length > 0) { |
| | | applyRoutePoints(points); |
| | |
| | | |
| | | }).catch(() => { |
| | | }); |
| | | }; |
| | | |
| | | const requestOrderRoute = (targetOrderId: string, status: number) => { |
| | | const routeType = status <= 5 ? 1 : 2; |
| | | queryOrderRoute({ orderId: targetOrderId, routeType }) |
| | | .then((res: any) => { |
| | | const data = res; |
| | | const rawPoints = Array.isArray(data?.polyline) ? data.polyline : []; |
| | | const points = rawPoints |
| | | .map((item: any) => ({ |
| | | longitude: Number(item?.longitude), |
| | | latitude: Number(item?.latitude), |
| | | })) |
| | | .filter((item: any) => Number.isFinite(item.longitude) && Number.isFinite(item.latitude)); |
| | | if (points.length > 0) { |
| | | if (status === 5) { |
| | | const last = points[points.length - 1]; |
| | | setVehicleLocation({ latitude: last.latitude, longitude: last.longitude }); |
| | | } else { |
| | | applyRoutePoints(points); |
| | | const first = points[0]; |
| | | setVehicleLocation({ latitude: first.latitude, longitude: first.longitude }); |
| | | } |
| | | } |
| | | const distance = Number(data?.distance); |
| | | const distanceKm = normalizeDistanceKm(distance); |
| | | if (distanceKm !== null) { |
| | | setRouteDistance(distanceKm); |
| | | } |
| | | const duration = Number(data?.duration); |
| | | const durationSeconds = normalizeDurationSeconds(duration); |
| | | if (durationSeconds !== null) { |
| | | setRouteDuration(durationSeconds); |
| | | } |
| | | setVehicleDirection(data?.direction); |
| | | }) |
| | | .catch(() => { }); |
| | | }; |
| | | |
| | | // 计算“当前位置→上车点”的步行路径 |
| | |
| | | const distanceKm = normalizeDistanceKm(distance); |
| | | if (distanceKm !== null) { |
| | | setRouteDistance(distanceKm); |
| | | Taro.setStorageSync('orderRouteDistance', distanceKm.value); |
| | | Taro.setStorageSync('orderRouteDistanceUnit', distanceKm.unit); |
| | | } |
| | | const durationSeconds = normalizeDurationSeconds(duration); |
| | | if (durationSeconds !== null) { |
| | | setRouteDuration(durationSeconds); |
| | | Taro.setStorageSync('orderRouteDuration', durationSeconds); |
| | | Taro.setStorageSync('orderRouteDurationUnit', 's'); |
| | | } |
| | | const isHoldMapStatus = [5, 6].includes(tripStatusRef.current); |
| | | // 仅在呼叫及后续阶段允许展示路线 |
| | |
| | | } |
| | | }); |
| | | |
| | | // 监听tripStatus变化,应用存储的路线点 |
| | | useEffect(() => { |
| | | if (tripStatus === 4 || tripStatus === 5) { |
| | | setRoutePoints([]); |
| | | setPolyline([]); |
| | | return; |
| | | } |
| | | const storedPoints = getStoredRoutePoints(tripStatus); |
| | | applyRoutePoints(storedPoints); |
| | | }, [tripStatus]); |
| | | |
| | | // 在tripStatus=1时也绘制预估路线与步行路线 |
| | | useEffect(() => { |
| | | const s = Taro.getStorageSync('startSite'); |
| | |
| | | .catch(() => { }); |
| | | } |
| | | if (cachedOrderId && [4, 5, 6, 7, 8].includes(cachedTripStatus)) { |
| | | const routeType = cachedTripStatus <= 5 ? 1 : 2; |
| | | queryOrderRoute({ orderId: cachedOrderId, routeType }) |
| | | .then((res: any) => { |
| | | const data = res; |
| | | const rawPoints = Array.isArray(data?.polyline) ? data.polyline : []; |
| | | const points = rawPoints |
| | | .map((item: any) => ({ |
| | | longitude: Number(item?.longitude), |
| | | latitude: Number(item?.latitude), |
| | | })) |
| | | .filter((item: any) => Number.isFinite(item.longitude) && Number.isFinite(item.latitude)); |
| | | if (points.length > 0) { |
| | | if (cachedTripStatus === 5) { |
| | | const last = points[points.length - 1]; |
| | | setVehicleLocation({ latitude: last.latitude, longitude: last.longitude }); |
| | | } else { |
| | | applyRoutePoints(points); |
| | | const first = points[0]; |
| | | setVehicleLocation({ latitude: first.latitude, longitude: first.longitude }); |
| | | } |
| | | const cached = Taro.getStorageSync('orderRoutePoints') || {}; |
| | | cached[String(routeType)] = points; |
| | | cached.latest = points; |
| | | Taro.setStorageSync('orderRoutePoints', cached); |
| | | Taro.setStorageSync('orderRouteLatestType', routeType); |
| | | } |
| | | const distance = Number(data?.distance); |
| | | const distanceKm = normalizeDistanceKm(distance); |
| | | if (distanceKm !== null) { |
| | | setRouteDistance(distanceKm); |
| | | Taro.setStorageSync('orderRouteDistance', distanceKm.value); |
| | | Taro.setStorageSync('orderRouteDistanceUnit', distanceKm.unit); |
| | | } |
| | | const duration = Number(data?.duration); |
| | | const durationSeconds = normalizeDurationSeconds(duration); |
| | | if (durationSeconds !== null) { |
| | | setRouteDuration(durationSeconds); |
| | | Taro.setStorageSync('orderRouteDuration', durationSeconds); |
| | | Taro.setStorageSync('orderRouteDurationUnit', 's'); |
| | | } |
| | | setVehicleDirection(data?.direction); |
| | | }) |
| | | .catch(() => { }); |
| | | requestOrderRoute(cachedOrderId, cachedTripStatus); |
| | | } |
| | | |
| | | if (s && s.latitude && s.longitude) { |
| | |
| | | setLongitude(s.longitude); |
| | | } else { |
| | | getLocationInfo(); |
| | | } |
| | | const storedPoints = getStoredRoutePoints(tripStatus); |
| | | if (cachedTripStatus === 4 || cachedTripStatus === 5) { |
| | | applyRoutePoints([]); |
| | | } else { |
| | | applyRoutePoints(storedPoints); |
| | | } |
| | | const storedDistance = Number(Taro.getStorageSync('orderRouteDistance')); |
| | | const storedDistanceUnit = Taro.getStorageSync('orderRouteDistanceUnit'); |
| | | if (storedDistanceUnit === 'km' || storedDistanceUnit === 'm') { |
| | | if (!Number.isNaN(storedDistance)) { |
| | | setRouteDistance({ value: storedDistance, unit: storedDistanceUnit }); |
| | | } |
| | | } else { |
| | | const normalizedStoredDistance = normalizeDistanceKm(storedDistance); |
| | | if (normalizedStoredDistance !== null) { |
| | | setRouteDistance(normalizedStoredDistance); |
| | | } |
| | | } |
| | | const storedDuration = Number(Taro.getStorageSync('orderRouteDuration')); |
| | | const storedDurationUnit = Taro.getStorageSync('orderRouteDurationUnit'); |
| | | const normalizedStoredDuration = storedDurationUnit === 's' ? storedDuration : Math.round(storedDuration * 60); |
| | | if (!Number.isNaN(normalizedStoredDuration)) { |
| | | setRouteDuration(normalizedStoredDuration); |
| | | } |
| | | const originLng = s?.longitude || longitude; |
| | | const originLat = s?.latitude || latitude; |