| | |
| | | const [polyline, setPolyline] = useState<any[]>([]); // 路线 |
| | | const [startSite, setStartSite] = useState<any>(null); // 上车点 |
| | | const [endSite, setEndSite] = useState<any>({}); // 下车点 |
| | | const [tripStatus, setTripStatus] = useState<number>(Number(Taro.getStorageSync('tripStatus')) || 1); // 行程状态 1:发布行程 2:发布中 3:呼叫车中 4:车辆即将到达 5:车辆到达上车点 6:车辆行驶中 7:到达目的地 8:行程已结束 9:支付成功 |
| | | const [tripStatus, setTripStatus] = useState<number>(2); // 行程状态 1:发布行程 2:发布中 3:呼叫车中 4:车辆即将到达 5:车辆到达上车点 6:车辆行驶中 7:到达目的地 8:行程已结束 9:支付成功 |
| | | const [elapsedSeconds, setElapsedSeconds] = useState(0); // 等待计时秒数 |
| | | const [showCancelPopup, setShowCancelPopup] = useState(false); // 取消弹窗是否显示 |
| | | const [showAnnouncementsPopup, setShowAnnouncementsPopup] = useState(false); // 安全注意事项动画弹窗是否显示 |
| | |
| | | const [showPassengerNotice, setShowPassengerNotice] = useState(false); // 乘车需知弹窗是否显示 |
| | | const [cancelType, setCancelType] = useState(1); // 取消类型 |
| | | const [showEvaluatePopup, setShowEvaluatePopup] = useState(false); // 评价弹窗是否显示 |
| | | |
| | | const router = Taro.useRouter(); |
| | | const [routePoints, setRoutePoints] = useState<any[]>([]); // 路线点集合 |
| | | |
| | | |
| | | // 监听行程状态,处理等待计时 |
| | |
| | | if (s && s.latitude && s.longitude) { |
| | | setLatitude(s.latitude); |
| | | setLongitude(s.longitude); |
| | | |
| | | // 增加延迟,确保地图上下文就绪 |
| | | setTimeout(() => { |
| | | const mapCtx = Taro.createMapContext('map'); |
| | | mapCtx.moveToLocation({ |
| | | latitude: s.latitude, |
| | | longitude: s.longitude |
| | | }); |
| | | }, 500); |
| | | } |
| | | |
| | | setElapsedSeconds(0); |
| | |
| | | destination: `${endSite.longitude},${endSite.latitude}`, |
| | | success: function (data) { |
| | | const points = parseRouteToPoints(data); |
| | | setRoutePoints(points); |
| | | |
| | | setPolyline([{ |
| | | points: points, |
| | |
| | | width: 10, |
| | | arrowLine: true, |
| | | }]) |
| | | |
| | | // 设置起点和终点标记 |
| | | if (points.length > 0) { |
| | | const startPoint = points[0]; |
| | | const endPoint = points[points.length - 1]; |
| | | |
| | | // 检查 storage 中的 startSite 是否存在 |
| | | const s = Taro.getStorageSync('startSite'); |
| | | if ([1, 2, 3, 4, 7, 8].includes(tripStatus)) { |
| | | const isCar = [4, 7].includes(tripStatus); |
| | | |
| | | const startMarker: any = { |
| | | id: 1, |
| | | latitude: startPoint.latitude, |
| | | longitude: startPoint.longitude, |
| | | iconPath: isCar |
| | | ? 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e51e92e6-700d-4e83-b3e0-14e6f18e0b9a.png' |
| | | : 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/51e7cb75-72af-4994-9d6e-d999efb2fbc7.png', |
| | | width: isCar ? 40 : 22, |
| | | height: isCar ? 20 : 40, |
| | | anchor: { x: 0.5, y: 1 }, |
| | | zIndex: 2, |
| | | }; |
| | | |
| | | if (tripStatus === 4) { |
| | | startMarker.name = '车辆位置'; |
| | | startMarker.customCallout = { anchorY: 0, anchorX: 0, display: 'ALWAYS' }; |
| | | } else if (tripStatus !== 7) { |
| | | startMarker.name = s?.name || '当前位置'; |
| | | startMarker.customCallout = { anchorY: 8, anchorX: 0, display: 'ALWAYS' }; |
| | | } |
| | | |
| | | setMarkers([ |
| | | // 起点指针 |
| | | startMarker, |
| | | // 终点指针 |
| | | { |
| | | id: 2, |
| | | latitude: endPoint.latitude, |
| | | longitude: endPoint.longitude, |
| | | iconPath: 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/6a56b1eb-ec37-4839-8733-262942af070d.png', |
| | | width: 22, |
| | | height: 40, |
| | | anchor: { x: 0.5, y: 1 }, |
| | | zIndex: 2, |
| | | name: tripStatus === 7 ? '已到达' : endSite.name, |
| | | customCallout: { |
| | | anchorY: 8, |
| | | anchorX: 0, |
| | | display: 'ALWAYS' |
| | | } |
| | | }, |
| | | ]) |
| | | } |
| | | |
| | | // 调整视角以包含所有路线点 |
| | | const mapCtx = Taro.createMapContext('map'); |
| | | mapCtx.includePoints({ |
| | | points: points, |
| | | padding: [50, 50, 300, 50] |
| | | }) |
| | | } |
| | | }, |
| | | fail: function (info) { |
| | | console.log('规划失败', info) |
| | | } |
| | | }) |
| | | }, [tripStatus, endSite, startSite, longitude, latitude]) |
| | | }, [endSite.longitude, endSite.latitude, startSite?.longitude, startSite?.latitude, longitude, latitude]) |
| | | |
| | | // 生成标记点 |
| | | useEffect(() => { |
| | | if (routePoints.length > 0) { |
| | | const startPoint = routePoints[0]; |
| | | const endPoint = routePoints[routePoints.length - 1]; |
| | | |
| | | // 检查 storage 中的 startSite 是否存在 |
| | | const s = Taro.getStorageSync('startSite'); |
| | | if ([1, 2, 3, 4, 7, 8].includes(tripStatus)) { |
| | | const isCar = [4, 7].includes(tripStatus); |
| | | |
| | | const startMarker: any = { |
| | | id: Date.now() + 1, |
| | | latitude: startPoint.latitude, |
| | | longitude: startPoint.longitude, |
| | | iconPath: isCar |
| | | ? 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e51e92e6-700d-4e83-b3e0-14e6f18e0b9a.png' |
| | | : 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/51e7cb75-72af-4994-9d6e-d999efb2fbc7.png', |
| | | width: isCar ? 40 : 22, |
| | | height: isCar ? 20 : 40, |
| | | anchor: { x: 0.5, y: 1 }, |
| | | zIndex: 2, |
| | | }; |
| | | |
| | | if (tripStatus === 4) { |
| | | startMarker.name = '车辆位置'; |
| | | startMarker.customCallout = { anchorY: 0, anchorX: 0, display: 'ALWAYS' }; |
| | | } else if (tripStatus !== 7) { |
| | | startMarker.name = s?.name || '当前位置'; |
| | | startMarker.customCallout = { anchorY: 8, anchorX: 0, display: 'ALWAYS' }; |
| | | } |
| | | |
| | | setMarkers([ |
| | | // 起点指针 |
| | | startMarker, |
| | | // 终点指针 |
| | | { |
| | | id: Date.now() + 2, |
| | | latitude: endPoint.latitude, |
| | | longitude: endPoint.longitude, |
| | | iconPath: 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/6a56b1eb-ec37-4839-8733-262942af070d.png', |
| | | width: 22, |
| | | height: 40, |
| | | anchor: { x: 0.5, y: 1 }, |
| | | zIndex: 2, |
| | | name: tripStatus === 7 ? '已到达' : endSite.name, |
| | | customCallout: { |
| | | anchorY: 8, |
| | | anchorX: 0, |
| | | display: 'ALWAYS' |
| | | } |
| | | }, |
| | | ]) |
| | | } |
| | | } |
| | | }, [tripStatus, routePoints, startSite?.name, endSite.name]) |
| | | |
| | | // 调整视角 |
| | | useEffect(() => { |
| | | if (routePoints.length > 0) { |
| | | const mapCtx = Taro.createMapContext('map'); |
| | | if (tripStatus === 1 || tripStatus === 8) { |
| | | // 状态为1(发布行程)或8(行程已结束)时,展示整条路线 |
| | | mapCtx.includePoints({ |
| | | points: routePoints, |
| | | padding: [50, 50, 300, 50] |
| | | }) |
| | | } else if (tripStatus === 7) { |
| | | mapCtx.includePoints({ |
| | | points: [routePoints[routePoints.length - 1]], |
| | | padding: [50, 50, 600, 50] |
| | | }) |
| | | } else { |
| | | mapCtx.moveToLocation({ |
| | | longitude: routePoints[0].longitude, |
| | | latitude: routePoints[0].latitude |
| | | }) |
| | | } |
| | | } |
| | | }, [tripStatus, routePoints]) |
| | | |
| | | const formatTime = (sec: number) => { |
| | | const m = Math.floor(sec / 60); |
| | |
| | | |
| | | |
| | | const toBack = () => { |
| | | if (tripStatus == 1) { |
| | | |
| | | if (tripStatus == 9) { |
| | | Taro.removeStorageSync('tripStatus'); |
| | | Taro.removeStorageSync('endSite'); |
| | | } |
| | | Taro.switchTab({ |
| | | url: '/pages/robotaxi/home/index' |
| | |
| | | > |
| | | {/* 自定义callout */} |
| | | { |
| | | ![2, 3].includes(tripStatus) && markers.map((item) => { |
| | | markers.map((item, index) => { |
| | | const isWaiting = [2, 3].includes(tripStatus) && index === 0; |
| | | |
| | | if (isWaiting) { |
| | | return ( |
| | | <CoverView slot="callout" marker-id={item.id} key={item.id} className="waiting-callout"> |
| | | <CoverView className="waiting-callout-bg"> |
| | | <CoverImage className="waiting-callout-bg-img" src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/f55ce277-68de-4615-9c7c-807f588afaac.png" /> |
| | | <CoverView className="waiting-callout-bg-text">{formatTime(elapsedSeconds)}</CoverView> |
| | | </CoverView> |
| | | <CoverView className="waiting-callout-txt"> |
| | | <CoverView className="waiting-callout-txt-content">{item.name}</CoverView> |
| | | </CoverView> |
| | | </CoverView> |
| | | ) |
| | | } |
| | | |
| | | return ( |
| | | <CoverView slot="callout" marker-id={item.id} key={item.id} className="custom-callout"> |
| | | { |
| | |
| | | { |
| | | item.name === '车辆位置' && |
| | | <CoverView className="custom-callout-content"> |
| | | <Text className="car-time"><Text className="car-time-num">3</Text>公里<Text className="car-time-nuum">2</Text>分钟</Text> |
| | | <CoverView className="car-time"> |
| | | <CoverView className="car-time-num">3</CoverView> |
| | | <CoverView>公里</CoverView> |
| | | <CoverView className="car-time-num">2</CoverView> |
| | | <CoverView>分钟</CoverView> |
| | | </CoverView> |
| | | </CoverView> |
| | | } |
| | | { |
| | | item.name === '已到达' && |
| | | <CoverView className="custom-callout-content"> |
| | | 已到达 |
| | | <CoverView className="custom-callout-content-arrive">已到达</CoverView> |
| | | </CoverView> |
| | | } |
| | | </CoverView> |
| | | ) |
| | | }) |
| | | } |
| | | { |
| | | (tripStatus === 2 || tripStatus === 3) && markers.map((item) => { |
| | | if (item.id === 1) { |
| | | return ( |
| | | <CoverView slot="callout" marker-id={item.id} key={item.id} className="waiting-callout"> |
| | | {tripStatus === 3 && ( |
| | | <CoverView className="waiting-radiation-box"> |
| | | <CoverView className="waiting-radiation-ring"></CoverView> |
| | | <CoverView className="waiting-radiation-ring"></CoverView> |
| | | </CoverView> |
| | | )} |
| | | <CoverView className="waiting-callout-bg"> |
| | | <CoverImage className="waiting-callout-bg-img" src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/f55ce277-68de-4615-9c7c-807f588afaac.png" /> |
| | | <CoverView className="waiting-callout-bg-text">{formatTime(elapsedSeconds)}</CoverView> |
| | | </CoverView> |
| | | <CoverView className="waiting-callout-txt"> |
| | | <CoverView className="waiting-callout-txt-content">{item.name}</CoverView> |
| | | </CoverView> |
| | | </CoverView> |
| | | ) |
| | | } |
| | | return null |
| | | }) |
| | | } |
| | | {/* 选择城市 */} |