| | |
| | | : DEFAULT_REQUOTE_EXPIRE_SECONDS; // 重新报价有效期(秒) |
| | | const modifyDistanceLimitMeters = Number(distanceConfig?.xczSyDistance); // 修改目的地剩余里程限制(米) |
| | | const modifyDurationLimitMinutes = Number(distanceConfig?.xczSyTime); // 修改目的地剩余时间限制(分钟) |
| | | const effectiveModifyDestinationSocketStatus = useMemo(() => { |
| | | if (typeof modifyDestinationSocketStatus === 'number') { |
| | | return modifyDestinationSocketStatus; |
| | | } |
| | | const cachedSocketStatus = Taro.getStorageSync(MODIFY_DESTINATION_SOCKET_STATUS_KEY); |
| | | const cachedOrderId = String(cachedSocketStatus?.orderId || ''); |
| | | const currentOrderId = String(orderId || ''); |
| | | if (!cachedOrderId || !currentOrderId || cachedOrderId !== currentOrderId) { |
| | | return null; |
| | | } |
| | | const cachedStatus = Number(cachedSocketStatus?.status); |
| | | return Number.isFinite(cachedStatus) ? cachedStatus : null; |
| | | }, [modifyDestinationSocketStatus, orderId]); |
| | | const isTripStatusAllowModifyEntry = [TripStatus.VehicleApproaching, TripStatus.VehicleArrivedPickup, TripStatus.InService].includes(tripStatus); |
| | | |
| | | const showModifyDestination = useMemo(() => { |
| | | if (!isTripStatusAllowModifyEntry) { |
| | | return false; |
| | | } |
| | | if (modifyDestinationSocketStatus === 0) { |
| | | if (effectiveModifyDestinationSocketStatus === 0) { |
| | | return false; |
| | | } |
| | | if (tripStatus !== TripStatus.InService) { |
| | | return true; |
| | | } |
| | | if (modifyDestinationSocketStatus === 1) { |
| | | if (effectiveModifyDestinationSocketStatus === 1) { |
| | | return true; |
| | | } |
| | | const hasDistanceLimit = Number.isFinite(modifyDistanceLimitMeters) && modifyDistanceLimitMeters > 0; |
| | |
| | | }, [ |
| | | isTripStatusAllowModifyEntry, |
| | | tripStatus, |
| | | modifyDestinationSocketStatus, |
| | | effectiveModifyDestinationSocketStatus, |
| | | modifyDistanceLimitMeters, |
| | | modifyDurationLimitMinutes, |
| | | orderRouteMetrics?.distanceMeters, |
| | |
| | | }; |
| | | // 预览态下如果后端推送“不可修改”,立即退出预览态并恢复原路线 |
| | | useEffect(() => { |
| | | if (!isModifyDestinationReviewVisible || modifyDestinationSocketStatus !== 0) { |
| | | if (!isModifyDestinationReviewVisible || effectiveModifyDestinationSocketStatus !== 0) { |
| | | return; |
| | | } |
| | | handleModifyDestinationSocketDisabled(); |
| | | }, [ |
| | | isModifyDestinationReviewVisible, |
| | | modifyDestinationSocketStatus, |
| | | effectiveModifyDestinationSocketStatus, |
| | | previousEndSite, |
| | | previousFareEstimate, |
| | | previousRoutePoints, |
| | |
| | | ]); |
| | | // 确认修改前进行阈值校验,命中限制或接口失败都展示失败弹窗 |
| | | const handleConfirmModifyDestinationWithGuard = async (selectedRoute?: any) => { |
| | | if (modifyDestinationSocketStatus === 0) { |
| | | if (effectiveModifyDestinationSocketStatus === 0) { |
| | | handleModifyDestinationSocketDisabled(); |
| | | return; |
| | | } |
| | | const currentDistance = Number(orderRouteMetrics?.distanceMeters); |
| | | const currentDurationSeconds = Number(orderRouteMetrics?.durationSeconds); |
| | | const shouldBypassLocalLimit = effectiveModifyDestinationSocketStatus === 1; |
| | | const currentDistance = orderRouteMetrics?.distanceMeters; |
| | | const currentDurationSeconds = orderRouteMetrics?.durationSeconds; |
| | | const distanceLimit = Number(distanceConfig?.xczSyDistance); |
| | | const durationLimitMinutes = Number(distanceConfig?.xczSyTime); |
| | | const isTripInService = tripStatus === TripStatus.InService; |
| | | |
| | | const hitDistanceLimit = isTripInService |
| | | const hitDistanceLimit = !shouldBypassLocalLimit |
| | | && isTripInService |
| | | && Number.isFinite(distanceLimit) |
| | | && distanceLimit > 0 |
| | | && typeof currentDistance === 'number' |
| | | && Number.isFinite(currentDistance) |
| | | && currentDistance < distanceLimit; |
| | | const hitDurationLimit = isTripInService |
| | | const hitDurationLimit = !shouldBypassLocalLimit |
| | | && isTripInService |
| | | && Number.isFinite(durationLimitMinutes) |
| | | && durationLimitMinutes > 0 |
| | | && typeof currentDurationSeconds === 'number' |
| | | && Number.isFinite(currentDurationSeconds) |
| | | && (currentDurationSeconds / 60) < durationLimitMinutes; |
| | | |