| | |
| | | const [walkingTime, setWalkingTime] = useState<number>(0); |
| | | const [fareEstimate, setFareEstimate] = useState<any>({}); // 预估费用信息 |
| | | const [vehicleLocation, setVehicleLocation] = useState<{ latitude: number, longitude: number } | null>(null); |
| | | const [routeDistance, setRouteDistance] = useState<number | null>(null); // 路线距离 |
| | | const [vehicleDirection, setVehicleDirection] = useState<number | null>(null); |
| | | const [routeDistance, setRouteDistance] = useState<{ value: number; unit: 'km' | 'm' } | null>(null); // 路线距离 |
| | | const [routeDuration, setRouteDuration] = useState<number | null>(null); // 路线时间 |
| | | const [vehicleInfo, setVehicleInfo] = useState<any>({}); // 车辆信息 |
| | | const [orderId, setOrderId] = useState<string>(''); // 订单ID |
| | |
| | | } |
| | | }; |
| | | |
| | | // 归一化距离(公里) |
| | | // 归一化距离(公里或米) |
| | | const normalizeDistanceKm = (value: any) => { |
| | | const num = Number(value); |
| | | if (Number.isNaN(num)) { |
| | | return null; |
| | | } |
| | | return Number((num / 1000).toFixed(1)); |
| | | if (num >= 1000) { |
| | | return { value: Number((num / 1000).toFixed(1)), unit: 'km' as const }; |
| | | } |
| | | return { value: Math.max(0, Math.round(num)), unit: 'm' as const }; |
| | | }; |
| | | |
| | | // 归一化时间(秒) |
| | |
| | | const distanceKm = normalizeDistanceKm(distance); |
| | | if (distanceKm !== null) { |
| | | setRouteDistance(distanceKm); |
| | | Taro.setStorageSync('orderRouteDistance', distanceKm); |
| | | Taro.setStorageSync('orderRouteDistanceUnit', 'km'); |
| | | Taro.setStorageSync('orderRouteDistance', distanceKm.value); |
| | | Taro.setStorageSync('orderRouteDistanceUnit', distanceKm.unit); |
| | | } |
| | | const durationSeconds = normalizeDurationSeconds(duration); |
| | | if (durationSeconds !== null) { |
| | |
| | | // 优化订单状态回调中的车辆信息拉取逻辑 |
| | | orderStatusHandlerRef.current = (payload) => { |
| | | const mappedTripStatus = payload?.tripStatus; |
| | | console.log('payload?.tripStatus', payload?.tripStatus) |
| | | if (typeof mappedTripStatus === 'number') { |
| | | setTripStatus(mappedTripStatus); |
| | | } |
| | |
| | | |
| | | orderRouteHandlerRef.current = (payload) => { |
| | | const points = payload?.points || []; |
| | | if (tripStatusRef.current !== 5) { |
| | | // if (tripStatusRef.current !== 5) { |
| | | setTimeout(() => { |
| | | applyRoutePoints(points); |
| | | } else { |
| | | setRoutePoints([]); |
| | | setPolyline([]); |
| | | if ([4, 5, 6].includes(tripStatusRef.current)) { |
| | | const firstPoint = points?.[0]; |
| | | if (firstPoint && typeof firstPoint.latitude === 'number' && typeof firstPoint.longitude === 'number') { |
| | | setVehicleLocation({ latitude: firstPoint.latitude, longitude: firstPoint.longitude }); |
| | | } |
| | | } |
| | | }, 500); |
| | | // } else { |
| | | // setRoutePoints([]); |
| | | // setPolyline([]); |
| | | // } |
| | | const direction = payload?.direction; |
| | | if (typeof direction === 'number' && Number.isFinite(direction)) { |
| | | setVehicleDirection(direction); |
| | | } |
| | | const distance = Number(JSON.parse(payload?.content?.route)?.distance); |
| | | const duration = Number(JSON.parse(payload?.content?.route)?.duration); |
| | |
| | | setLatitude(e.latitude); |
| | | setLongitude(e.longitude); |
| | | const mapCtx = Taro.createMapContext('map'); |
| | | mapCtx.moveToLocation({ |
| | | latitude: e.latitude, |
| | | longitude: e.longitude, |
| | | mapCtx.includePoints({ |
| | | points: [{ |
| | | latitude: e.latitude, |
| | | longitude: e.longitude, |
| | | }], |
| | | padding: [50, 50, 500, 50] |
| | | }); |
| | | } |
| | | setElapsedSeconds(0); |
| | |
| | | height: 20, |
| | | anchor: { x: 0.5, y: 1 }, |
| | | zIndex: 3, |
| | | rotate: typeof vehicleDirection === 'number' ? vehicleDirection : 0, |
| | | name: '车辆位置', |
| | | customCallout: { anchorY: 50, anchorX: 0, display: 'ALWAYS' } |
| | | } : null; |
| | |
| | | } else { |
| | | setPolyline([]); |
| | | } |
| | | }, [tripStatus, shouldShowRoute, routePoints, walkingPoints, startSite?.name, startSite?.latitude, startSite?.longitude, endSite.name, endSite?.latitude, endSite?.longitude, vehicleLocation]); |
| | | }, [tripStatus, shouldShowRoute, routePoints, walkingPoints, startSite?.name, startSite?.latitude, startSite?.longitude, endSite.name, endSite?.latitude, endSite?.longitude, vehicleLocation, vehicleDirection]); |
| | | |
| | | const bindSocketListeners = () => { |
| | | if (!orderStatusBound.current && orderStatusHandlerRef.current) { |
| | |
| | | const routeType = cachedTripStatus <= 5 ? 1 : 2; |
| | | queryOrderRoute({ orderId: cachedOrderId, routeType }) |
| | | .then((res: any) => { |
| | | const data = res?.data ?? res?.result ?? res; |
| | | const data = res; |
| | | const rawPoints = Array.isArray(data?.polyline) ? data.polyline : []; |
| | | const points = rawPoints |
| | | .map((item: any) => ({ |
| | |
| | | const distanceKm = normalizeDistanceKm(distance); |
| | | if (distanceKm !== null) { |
| | | setRouteDistance(distanceKm); |
| | | Taro.setStorageSync('orderRouteDistance', distanceKm); |
| | | Taro.setStorageSync('orderRouteDistanceUnit', 'km'); |
| | | Taro.setStorageSync('orderRouteDistance', distanceKm.value); |
| | | Taro.setStorageSync('orderRouteDistanceUnit', distanceKm.unit); |
| | | } |
| | | const duration = Number(data?.duration); |
| | | const durationSeconds = normalizeDurationSeconds(duration); |
| | |
| | | Taro.setStorageSync('orderRouteDuration', durationSeconds); |
| | | Taro.setStorageSync('orderRouteDurationUnit', 's'); |
| | | } |
| | | setVehicleDirection(data?.direction); |
| | | }) |
| | | .catch(() => { }); |
| | | } |
| | |
| | | } |
| | | const storedDistance = Number(Taro.getStorageSync('orderRouteDistance')); |
| | | const storedDistanceUnit = Taro.getStorageSync('orderRouteDistanceUnit'); |
| | | const normalizedStoredDistance = storedDistanceUnit === 'km' ? storedDistance : normalizeDistanceKm(storedDistance); |
| | | if (normalizedStoredDistance !== null) { |
| | | setRouteDistance(normalizedStoredDistance); |
| | | 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'); |
| | |
| | | (item.name === '车辆位置' && [4, 6].includes(tripStatus)) && |
| | | <CoverView className="custom-callout-content"> |
| | | <CoverView className="car-time"> |
| | | <CoverView className="car-time-num">{routeDistance ?? 0}</CoverView> |
| | | <CoverView>公里</CoverView> |
| | | <CoverView className="car-time-num">{routeDistance?.value ?? 0}</CoverView> |
| | | <CoverView>{routeDistance?.unit === 'm' ? '米' : '公里'}</CoverView> |
| | | <CoverView className="car-time-num">{durationDisplay.value}</CoverView> |
| | | <CoverView>{durationDisplay.unit}</CoverView> |
| | | </CoverView> |