hejianhao
2026-04-03 df7c8301893a767e5a70933db232ca679728718a
feat(后备箱控制): 增加后备箱状态轮询机制

- 新增 queryVehicleTrunkOpenStatus API 用于查询后备箱开启状态
- 后备箱控制操作后增加轮询逻辑,最多轮询3次,间隔2秒
- 根据轮询结果更新后备箱状态并显示相应提示
- 移除后备箱点击时的直接状态切换回调,改为依赖轮询结果
- 优化运营时间显示文本,明确区分工作日和周末
3个文件已修改
83 ■■■■■ 已修改文件
src/robotaxi/api/begin-route.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/calling-car.tsx 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/operating-area/index.tsx 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/api/begin-route.ts
@@ -64,6 +64,15 @@
    }, true);
}
// 查询后备箱开启状态
export const queryVehicleTrunkOpenStatus = async (payload) => {
    return request({
        url: _ROBOTAXI_HOST + '/vehicleConvoy/api/v1/mini-program/order/queryVehicleTrunkOpenStatus',
        method: 'GET',
        payload
    }, true);
}
// 获取自动结束行程时间
export const queryOrderFinishTime = async () => {
    return request({
src/robotaxi/pages/begin-route/components/calling-car.tsx
@@ -25,6 +25,7 @@
    setTemperature,
    unlockVehicle,
    queryTemperatureByOrderId,
    queryVehicleTrunkOpenStatus,
    queryOrderFinishTime,
    queryFareBreakdown,
    submitOrderComment,
@@ -96,6 +97,7 @@
    const [showDetail, setShowDetail] = useState(false); // 是否显示费用明细
    const countdownTimerRef = useRef<any>(null); // 倒计时定时器引用
    const finishCountdownTimerRef = useRef<any>(null); // 结束倒计时定时器引用
    const trunkPollTimerRef = useRef<any>(null); // 后备箱轮询定时器引用
    const tempTimerRef = useRef<any>(null); // 温度定时器引用
    const lastConfirmedTempRef = useRef<number>(); // 上一次确认的温度
    const countdownFinishedRef = useRef(false); // 倒计时是否结束
@@ -324,6 +326,9 @@
            if (finishCountdownTimerRef.current) {
                clearTimeout(finishCountdownTimerRef.current);
            }
            if (trunkPollTimerRef.current) {
                clearTimeout(trunkPollTimerRef.current);
            }
        };
    }, [tripStatus, estimatedWaitMinutes, orderId, finishCountdownEnabled]);
@@ -332,6 +337,9 @@
        return () => {
            if (tempTimerRef.current) {
                clearTimeout(tempTimerRef.current);
            }
            if (trunkPollTimerRef.current) {
                clearTimeout(trunkPollTimerRef.current);
            }
        };
    }, []);
@@ -475,11 +483,57 @@
                return;
            }
            if (doorType === 'trunk') {
                Taro.showToast({
                    title: trunkStatus ? '关闭成功' : '打开成功',
                    icon: 'none'
                });
                onSuccess?.();
                const loadingText = trunkStatus ? '正在关闭后备箱' : '正在开启后备箱';
                Taro.showLoading({ title: loadingText, mask: true });
                let pollCount = 0;
                const maxPolls = 3;
                const pollInterval = 2000; // 2秒
                const doPoll = () => {
                    queryVehicleTrunkOpenStatus({ orderId: targetOrderId }).then((pollRes: any) => {
                        const data = pollRes?.data ?? pollRes?.result ?? pollRes;
                        const value = data?.stateMap?.trunkAjarCloseSt?.value;
                        if (value === '0' || value === '1') {
                            // 0: 关闭, 1: 开启
                            const isOpen = value === '1';
                            setTrunkStatus(isOpen);
                            Taro.hideLoading();
                            Taro.showToast({
                                title: isOpen ? '打开成功' : '关闭成功',
                                icon: 'none'
                            });
                            onSuccess?.();
                        } else {
                            // 继续轮询
                            pollCount++;
                            if (pollCount < maxPolls) {
                                trunkPollTimerRef.current = setTimeout(doPoll, pollInterval);
                            } else {
                                Taro.hideLoading();
                                Taro.showToast({
                                    title: trunkStatus ? '关闭后备箱失败' : '开启后备箱失败',
                                    icon: 'none'
                                });
                            }
                        }
                    }).catch(() => {
                        pollCount++;
                        if (pollCount < maxPolls) {
                            trunkPollTimerRef.current = setTimeout(doPoll, pollInterval);
                        } else {
                            Taro.hideLoading();
                            Taro.showToast({
                                title: trunkStatus ? '关闭后备箱失败' : '开启后备箱失败',
                                icon: 'none'
                            });
                        }
                    });
                };
                // 延迟2秒后开始第一次轮询
                trunkPollTimerRef.current = setTimeout(doPoll, pollInterval);
            }
            if (doorType === 'door') {
                Taro.showToast({
@@ -493,7 +547,7 @@
            }
        }).catch(() => {
            Taro.showToast({
                title: res?.msg || '解锁失败,请重试或联系客服',
                title: '解锁失败,请重试或联系客服',
                icon: 'none'
            });
        });
@@ -601,7 +655,7 @@
                    {
                        tripStatus == 5 &&
                        <View className="car-card-arrive">
                            <View className={`car-card-arrive-item ${trunkStatus && 'close-btn-item'}`} onClick={() => handleUnlock('trunk', () => setTrunkStatus((prev) => !prev))}>
                            <View className={`car-card-arrive-item ${trunkStatus && 'close-btn-item'}`} onClick={() => handleUnlock('trunk')}>
                                {
                                    trunkStatus ?
                                        <Image className="car-card-arrive-item-img" src={require('../../../assets/trunk-open.png')} />
@@ -763,7 +817,7 @@
                    <View className="car-card-reach-text">点击按钮开车门</View>
                    <Image className='car-card-reach-img' src='https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/f4a18c3f-a2db-45e6-8967-1510355b5e3b.webp' />
                    <View className="car-card-reach-btn">
                        <View className={`car-card-reach-btn-item ${trunkStatus && 'close-btn-item'}`} onClick={() => handleUnlock('trunk', () => setTrunkStatus((prev) => !prev))}>
                        <View className={`car-card-reach-btn-item ${trunkStatus && 'close-btn-item'}`} onClick={() => handleUnlock('trunk')}>
                            {
                                trunkStatus ?
                                    <Image className="car-card-reach-btn-item-img" src={require('../../../assets/trunk-open.png')} />
src/robotaxi/pages/operating-area/index.tsx
@@ -342,13 +342,13 @@
  const renderOperatingTime = (info: any) => {
    if (!info?.rule) {
      return `全天`;
      return `工作日全天运营  周末全天运营`;
    }
    try {
      const rules = JSON.parse(info.rule);
      if (!Array.isArray(rules) || rules.length === 0) {
        return `全天`;
        return `工作日全天运营  周末全天运营`;
      }
      const getDayText = (typeStr: number[]) => {