卢春龙
2026-07-27 e0df67a9b7bc86ae907f2c267bd1f969e658b91d
Merge branch 'feature/xj-730-fragrance-hv' into 'feature_v2.4.0_ui'

feat: 优化空调、香氛卡片重复请求的问题 (甄雪君)

See merge request robotaxi1/xp-robotaxi-miniprogram!170
3个文件已修改
31 ■■■■■ 已修改文件
src/robotaxi/pages/begin-route/components/calling-car-modules/fragrance-control/index.tsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/calling-car-modules/seat-hv-control/index.tsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/calling-car-modules/temperature-control.tsx 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/calling-car-modules/fragrance-control/index.tsx
@@ -87,6 +87,9 @@
    // 正在下发的香型通道(该卡片显示 loading),空串表示无
    const [applyingChannelId, setApplyingChannelId] = useState('');
    const querySeqRef = useRef(0);
    // 记录本次接驾态周期内已查询过香氛状态的订单 ID,避免重复请求(同一订单在初始化恢复
    // 流程中 tripStatus/orderId/hasPreviousOrder 会分批异步更新,触发本 effect 多次)。
    const queriedOrderIdRef = useRef('');
    const { animationData, shouldRender } = useBottomPopupAnimation(panelVisible);
    const hasScents = scents.length > 0;
@@ -94,12 +97,19 @@
    // 进入接驾态查询香氛状态;连环单不查询、不展示
    useEffect(() => {
        if (tripStatus !== TripStatus.VehicleApproaching || hasPreviousOrder) {
            // 离开接驾态:重置去重标记,允许下次进入接驾态时重新查询一次。
            queriedOrderIdRef.current = '';
            return;
        }
        const targetOrderId = getOrderId(orderId);
        if (!targetOrderId) {
            return;
        }
        // 去重:同一订单在本次接驾态周期内只查询一次。
        if (queriedOrderIdRef.current === targetOrderId) {
            return;
        }
        queriedOrderIdRef.current = targetOrderId;
        const snapshotSeq = ++querySeqRef.current;
        queryCabinFragrance(targetOrderId).then((res: any) => {
            if (querySeqRef.current !== snapshotSeq) {
src/robotaxi/pages/begin-route/components/calling-car-modules/seat-hv-control/index.tsx
@@ -52,18 +52,28 @@
    // 正在下发的按钮标识 `${position}:${kind}`(该按钮显示 loading,其余按钮置灰防重复),空串表示无
    const [applyingKey, setApplyingKey] = useState('');
    const querySeqRef = useRef(0);
    // 记录本次接驾态周期内已查询过座椅状态的订单 ID,避免重复请求(同一订单在初始化恢复
    // 流程中 tripStatus/orderId/hasPreviousOrder 会分批异步更新,触发本 effect 多次)。
    const queriedOrderIdRef = useRef('');
    const hasSeats = seats.length > 0;
    // 进入接驾态且面板可见时查询座椅状态;连环单不查询、不展示
    useEffect(() => {
        if (!active || tripStatus !== TripStatus.VehicleApproaching || hasPreviousOrder) {
            // 面板隐藏或离开接驾态:重置去重标记,允许下次可见/进入接驾态时重新查询一次。
            queriedOrderIdRef.current = '';
            return;
        }
        const targetOrderId = getOrderId(orderId);
        if (!targetOrderId) {
            return;
        }
        // 去重:同一订单在本次接驾态周期内只查询一次。
        if (queriedOrderIdRef.current === targetOrderId) {
            return;
        }
        queriedOrderIdRef.current = targetOrderId;
        const snapshotSeq = ++querySeqRef.current;
        querySeatHv(targetOrderId).then((res: any) => {
            if (querySeqRef.current !== snapshotSeq) {
src/robotaxi/pages/begin-route/components/calling-car-modules/temperature-control.tsx
@@ -49,6 +49,9 @@
    const tempTimerRef = useRef<any>(null);
    const lastConfirmedTempRef = useRef<number | null>(null);
    const skipQueryOnThisCycleRef = useRef(false);
    // 记录本次接驾态周期内已查询过空调状态的订单 ID,避免同一订单在初始化过程中因
    // tripStatus/orderId/hasPreviousOrder 分批异步更新而重复触发查询。
    const queriedOrderIdRef = useRef('');
    const userActionSeqRef = useRef(0);
    const calibrationSeqRef = useRef(0);
    const { visibleLoadingKey: acLoadingKey, startLoading, stopLoading } = useMinimumSpinLoading<'ac'>();
@@ -281,6 +284,8 @@
    useEffect(() => {
        if (tripStatus !== TripStatus.VehicleApproaching) {
            // 离开接驾态:重置去重标记,允许下次进入接驾态时重新查询一次。
            queriedOrderIdRef.current = '';
            return;
        }
        // 连环派单场景:后端明确告知车辆仍在执行上一单(hasPreviousOrder 为 true)时,
@@ -296,6 +301,12 @@
        if (!targetOrderId) {
            return;
        }
        // 去重:同一订单在本次接驾态周期内只查询一次。tripStatus/pageDidShowVersion/hasPreviousOrder
        // 在页面初始化恢复流程中会分多次异步更新,但 orderId 不变时无需重复查询。
        if (queriedOrderIdRef.current === targetOrderId) {
            return;
        }
        queriedOrderIdRef.current = targetOrderId;
        const storageData = getAcStorage(targetOrderId);