liaof
2026-07-28 c9d82adb64bf77de3bd4a5435967c4d914fcfe9a
Merge branch 'fix-0726-toby' into 'feature_v2.4.0_ui'

[ai-coding] auto commit for merge request (何宏文)

See merge request robotaxi1/xp-robotaxi-miniprogram!171
6个文件已修改
202 ■■■■■ 已修改文件
src/robotaxi/pages/begin-route/components/css-folder/cancel-popup.less 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/css-folder/evaluate-popup.less 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/css-folder/service-route-change.less 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/evaluate-popup.tsx 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/select-map-site/index.less 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/site-search/index.less 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/components/css-folder/cancel-popup.less
@@ -124,7 +124,7 @@
            .cancel-btn-cancel {
                flex: 1;
                border: 2px solid #141E27;
                border: 4px solid #141E27;
                border-radius: 1000px;
                font-size: 32px;
                line-height: 104px;
@@ -139,7 +139,7 @@
                flex: 1;
                text-align: center;
                border-radius: 1000px;
                border: 2px solid #141E27;
                border: 4px solid #141E27;
                font-size: 32px;
                line-height: 104px;
                text-align: center;
src/robotaxi/pages/begin-route/components/css-folder/evaluate-popup.less
@@ -22,7 +22,7 @@
        right: 0;
        background: #F1F5FA;
        border-radius: 60px 60px 0 0;
        padding: 42px 0 88px 0;
        padding: 64px 0 88px 0;
        .evaluate-rating-switcher,
        .content-box {
@@ -40,13 +40,12 @@
        }
        &-close {
            display: flex;
            justify-content: flex-end;
            padding-right: 34px;
            position: absolute;
            top: 34px;
            right: 34px;
            image {
                width: 36px;
                height: 36px;
                width: 40px;
                height: 40px;
            }
        }
@@ -68,7 +67,7 @@
        }
        .evaluate-rating-switcher {
            margin-top: 18px;
            padding: 0 49px;
            display: flex;
            flex-direction: column;
@@ -194,14 +193,14 @@
                    padding: 24px;
                    padding-bottom: 16px;
                    font-size: 28px;
                    color: rgba(0, 0, 0, 0.9);
                    color: rgba(20, 30, 39, 0.4);
                    height: 196px;
                }
                .placeholder-class {
                    font-size: 28px;
                    line-height: 44px;
                    color: rgba(0, 0, 0, 0.25);
                    color: rgba(20, 30, 39, 0.4);
                }
                .evaluate-problem-desc-count {
@@ -211,7 +210,7 @@
                    font-size: 20px;
                    line-height: 20px;
                    letter-spacing: normal;
                    color: rgba(0, 0, 0, 0.25);
                    color: rgba(20, 30, 39, 0.4);
                }
            }
@@ -223,17 +222,17 @@
                &-item {
                    position: relative;
                    width: 208px;
                    height: 208px;
                    border-radius: 16px;
                    // overflow: hidden;
                    width: 196px;
                    height: 196px;
                    border-radius: 32px;
                    overflow: hidden;
                    background: rgba(0, 0, 0, 0.03);
                }
                &-img {
                    flex-shrink: 0;
                    width: 208px;
                    height: 208px;
                    width: 196px;
                    height: 196px;
                    object-fit: cover;
                }
@@ -277,8 +276,8 @@
                &-delete {
                    position: absolute;
                    top: -10px;
                    right: -10px;
                    top: 4px;
                    right: 4px;
                    z-index: 2;
                    .delete-icon {
@@ -299,14 +298,14 @@
                &-upload {
                    flex-shrink: 0;
                    width: 208px;
                    height: 208px;
                    width: 196px;
                    height: 196px;
                    display: flex;
                    flex-direction: column;
                    align-items: center;
                    justify-content: center;
                    gap: 8px;
                    border-radius: 16px;
                    border-radius: 32px;
                    background: #E8ECF1;
                    &-img {
@@ -314,11 +313,13 @@
                        height: 48px;
                    }
                    &-count {
                        font-size: 24px;
                        line-height: 40px;
                    &-text {
                        font-family: PingFang SC;
                        font-size: 20px;
                        font-weight: normal;
                        line-height: 32px;
                        letter-spacing: normal;
                        color: rgba(0, 0, 0, 0.25);
                        color: rgba(20, 30, 39, 0.5);
                    }
                }
            }
@@ -330,16 +331,24 @@
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 32px 80px;
            gap: 16px;
            box-sizing: border-box;
            z-index: 2;
            font-size: 30px;
            letter-spacing: normal;
            color: #FFFFFF;
            text-align: center;
            border-radius: 1000px;
            background: #141E27;
            &-btn {
                width: 100%;
                height: 104px;
                display: flex;
                justify-content: center;
                align-items: center;
                padding: 32px 80px;
                gap: 16px;
                box-sizing: border-box;
                z-index: 2;
                font-size: 30px;
                letter-spacing: normal;
                color: #FFFFFF;
                text-align: center;
                border-radius: 1000px;
                background: #D6D9DC;
            }
        }
        .ok-btn {
src/robotaxi/pages/begin-route/components/css-folder/service-route-change.less
@@ -125,28 +125,31 @@
    .service-route-select-footer {
        display: flex;
        justify-content: space-between;
        gap: 24px;
        gap: 22px;
        margin-top: 48px;
        font-size: 28px;
        font-weight: normal;
        font-size: 32px;
        font-weight: 500;
        text-align: center;
        .service-route-select-footer-item-cancel {
            flex: 1;
            color: rgba(0, 0, 0, 0.9);
            border-radius: 16px;
            color: #141E27;
            border-radius: 1000px;
            box-sizing: border-box;
            border: 2px solid rgba(0, 0, 0, 0.9);
            line-height: 92px;
            border: 4px solid #141E27;
            line-height: 104px;
            height: 104px;
        }
        .service-route-select-footer-item-confirm {
            flex: 1;
            color: #FFFFFF;
            border-radius: 16px;
            line-height: 92px;
            border-radius: 20px;
            background: linear-gradient(102deg, #8475FF 0%, #7DD6FF 102%);
            border-radius: 1000px;
            line-height: 104px;
            border: 4px solid #141E27;
            box-sizing: border-box;
            height: 104px;
            background: #141E27;
        }
    }
}
src/robotaxi/pages/begin-route/components/evaluate-popup.tsx
@@ -45,6 +45,8 @@
    const isSubmittingRef = useRef(false); // 同步提交锁,防止快速重复点击导致的并发提交
    const ratingSwitchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null); // 评分切换过渡计时器
    const ratingOptionsRequestIdRef = useRef(0); // 拉取问题类型请求序号,避免异步串台
    const ratingTouchStartRef = useRef<{ x: number; y: number } | null>(null); // 弹窗区域滑动起点
    const ratingTouchMoveRef = useRef<{ x: number; y: number } | null>(null); // 弹窗区域滑动过程点
    const {
        images: pictures,
        uploading,
@@ -64,7 +66,7 @@
        1: {
            title: '“不满意,我要吐槽”',
            summary: '不满意,我要吐槽',
            placeholder: '请详描述您遇到的问题(可添加相关截图辅助说明)'
            placeholder: '请描述您的建议或问题'
        },
        2: {
            title: '“一般般,还需努力”',
@@ -79,7 +81,7 @@
    }[currentOrderRating] || {
        title: '“不满意,我要吐槽”',
        summary: '不满意,我要吐槽',
        placeholder: '请详描述您遇到的问题(可添加相关截图辅助说明)'
        placeholder: '请描述您的建议或问题'
    };
    const evaluateDimensionMap: Record<number, number> = {
        3: 1,
@@ -113,6 +115,65 @@
            setSelectedRating(rating);
            ratingSwitchTimerRef.current = null;
        }, 120);
    };
    const getTouchPoint = (touch: any) => ({
        x: Number(touch?.pageX ?? touch?.clientX ?? touch?.x ?? 0),
        y: Number(touch?.pageY ?? touch?.clientY ?? touch?.y ?? 0)
    });
    /**
     * 评分区域:记录滑动起点。
     */
    const handleRatingTouchStart = (e: any) => {
        const touch = e?.touches?.[0];
        if (!touch) {
            return;
        }
        const point = getTouchPoint(touch);
        ratingTouchStartRef.current = point;
        ratingTouchMoveRef.current = point;
    };
    /**
     * 弹窗区域:实时记录滑动坐标,兼容部分端 changedTouches 缺失。
     */
    const handleRatingTouchMove = (e: any) => {
        const touch = e?.touches?.[0];
        if (!touch) {
            return;
        }
        ratingTouchMoveRef.current = getTouchPoint(touch);
    };
    /**
     * 评分区域:左右滑动切换满意度。
     */
    const handleRatingTouchEnd = (e: any) => {
        const start = ratingTouchStartRef.current;
        ratingTouchStartRef.current = null;
        if (!start || isRatingSwitching) {
            return;
        }
        const touch = e?.changedTouches?.[0];
        const point = touch ? getTouchPoint(touch) : ratingTouchMoveRef.current;
        if (!point) {
            return;
        }
        const endX = point.x;
        const endY = point.y;
        const deltaX = endX - start.x;
        const deltaY = endY - start.y;
        const minSwipeDistance = 24;
        // 只响应明显的水平滑动,避免与纵向滚动或点击冲突。
        if (Math.abs(deltaX) < minSwipeDistance || Math.abs(deltaX) <= Math.abs(deltaY)) {
            return;
        }
        const direction = deltaX < 0 ? 1 : -1; // 左滑=下一档,右滑=上一档
        const nextRating = Math.min(3, Math.max(1, selectedRating + direction));
        handleSelectRating(nextRating);
    };
    const toggleFeedbackType = (typeId: unknown) => {
@@ -256,9 +317,15 @@
    return (
        <View className='evaluate-popup' catchMove onClick={(e) => e.stopPropagation()}>
            <View className='evaluate-mask' onClick={onClose}></View>
            <View className={`evaluate-content ${isRatingSwitching ? 'is-rating-switching' : ''}`} animation={animationData}>
            <View
                className={`evaluate-content ${isRatingSwitching ? 'is-rating-switching' : ''}`}
                animation={animationData}
                onTouchStart={handleRatingTouchStart}
                onTouchMove={handleRatingTouchMove}
                onTouchEnd={handleRatingTouchEnd}
            >
                <View className='evaluate-content-close'>
                    <Image onClick={onClose} src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/close-icon.png" />
                    <Image onClick={onClose} src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/v2/close-fill-20260726.svg" />
                </View>
                <View className='evaluate-rating-switcher'>
                    <View className='evaluate-rating-switcher-title'>您对本次行程满意吗?</View>
@@ -281,7 +348,7 @@
                <View className='content-box'>
                    {!hideFeedbackType && (
                        <View className='evaluate-problem-type'>
                            <View className='evaluate-problem-type-title'>反馈的问题类型:</View>
                            <View className='evaluate-problem-type-content'>
                                {typeOptions.map((item) => (
                                    <View key={item?.id} className={`evaluate-problem-type-content-item ${selectedTypeIds.includes(normalizeFeedbackTypeId(item?.id)) && 'active-tag'}`} onClick={() => toggleFeedbackType(item?.id)}>
@@ -335,8 +402,8 @@
                        {
                            pictures.length < 3 && (
                                <View className='evaluate-problem-pic-box-upload' onClick={chooseAndUpload}>
                                    <Image className='evaluate-problem-pic-box-upload-img' src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/upload-icon.png" />
                                    <View className='evaluate-problem-pic-box-upload-count'>{pictures.length}/3</View>
                                    <Image className='evaluate-problem-pic-box-upload-img' src="https://s.xiaopeng.com/xp-fe/robot-taxi/imgs/v2/add-icon-20260726.svg" />
                                    <View className='evaluate-problem-pic-box-upload-text'>上传图片/视频</View>
                                </View>
                            )
                        }
src/robotaxi/pages/select-map-site/index.less
@@ -397,7 +397,7 @@
            margin-top: 32px;
            font-size: 32px;
            font-weight: 500;
            color: #141E27;
            color: @gold-text;
            display: flex;
            align-items: center;
            height: 120px;
@@ -435,10 +435,11 @@
            align-items: center;
            border-radius: 1000px;
            box-sizing: border-box;
            border: 2px solid #141E27;
            font-size: 28px;
            border: 4px solid #141E27;
            font-size: 32px;
            letter-spacing: normal;
            color: #141E27;
            font-weight: 760;
        }
        .no-confirm {
src/robotaxi/pages/site-search/index.less
@@ -45,8 +45,8 @@
    }
    .end-icon {
      background: @black-text-main;
    }
      background: @gold-light ;
    }
    .search-input {
      flex: 1;