{"status":"active","message":"自动打码脚本有重要更新，建议您立即升级以获取最新功能和修复。\n<p style=\"color: red;\">更新日志输出优化，避免日志输出过多导致页面数据沉积卡顿</p>","latest_version":"1.0.0.0.06","update_url":"https://abcdc.top/jj/auto_kuayutongxun.user.js","force_update":false,"update_modal_code":"// update.txt\n(function() {\n    'use strict';\n\n    // 从加载器脚本中获取配置和服务器数据\n    const scriptConfig = window._myDynamicScriptConfig;\n    if (!scriptConfig || !scriptConfig.serverData) {\n        console.error('[Update Modal] 无法获取脚本配置或服务器数据。');\n        return;\n    }\n\n    const serverData = scriptConfig.serverData;\n    const currentLoaderVersion = scriptConfig.currentLoaderVersion;\n    const functionalScriptCode = serverData.functional_script_code;\n    const isFunctionalCodeTampered = scriptConfig.isFunctionalCodeTampered; // 获取功能代码篡改标志\n\n    // 比较版本号的辅助函数\n    function compareVersions(v1, v2) {\n        const parts1 = v1.split('.').map(Number);\n        const parts2 = v2.split('.').map(Number);\n        for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {\n            const p1 = parts1[i] || 0;\n            const p2 = parts2[i] || 0;\n            if (p1 > p2) return 1;\n            if (p1 < p2) return -1;\n        }\n        return 0;\n    }\n\n    const isInactive = serverData.status === 'inactive';\n    const needsUpdate = serverData.latest_version && compareVersions(serverData.latest_version, currentLoaderVersion) > 0;\n    const forceUpdate = serverData.force_update;\n    const updateUrl = serverData.update_url;\n    const message = serverData.message;\n\n    // 注入 CSS 样式 (如果尚未注入)\n    if (!document.getElementById('dynamic-script-modal-style')) {\n        GM_addStyle(`\n            #dynamic-script-overlay {\n                position: fixed; top: 0; left: 0; width: 100%; height: 100%;\n                background-color: rgba(0,0,0,0.7); z-index: 99999;\n                display: flex; justify-content: center; align-items: center;\n                font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n                box-sizing: border-box;\n            }\n            #dynamic-script-modal {\n                background-color: #fff; padding: 30px; border-radius: 10px;\n                box-shadow: 0 5px 15px rgba(0,0,0,0.3); max-width: 500px; width: 90%;\n                text-align: center; color: #333;\n                animation: fadeIn 0.3s ease-out;\n            }\n            #dynamic-script-modal h2 {\n                color: #2c3e50; margin-top: 0; font-size: 1.8em;\n            }\n            #dynamic-script-modal p {\n                font-size: 1.1em; line-height: 1.6; margin-bottom: 25px;\n                white-space: pre-wrap; /* 保持消息中的换行 */\n            }\n            .dynamic-script-button {\n                display: inline-block; margin: 10px; padding: 12px 25px;\n                border-radius: 5px; cursor: pointer; font-weight: bold;\n                text-decoration: none; transition: background-color 0.3s ease, transform 0.2s ease;\n                font-size: 1em; border: none;\n            }\n            .dynamic-script-button.primary {\n                background-color: #007bff; color: white;\n            }\n            .dynamic-script-button.primary:hover {\n                background-color: #0056b3; transform: translateY(-1px);\n            }\n            .dynamic-script-button.secondary {\n                background-color: #6c757d; color: white;\n            }\n            .dynamic-script-button.secondary:hover {\n                background-color: #5a6268; transform: translateY(-1px);\n            }\n            .dynamic-script-button.danger {\n                background-color: #dc3545; color: white;\n            }\n            .dynamic-script-button.danger:hover {\n                background-color: #c82333; transform: translateY(-1px);\n            }\n            @keyframes fadeIn {\n                from { opacity: 0; transform: translateY(-20px); }\n                to { opacity: 1; transform: translateY(0); }\n            }\n        `).id = 'dynamic-script-modal-style'; // 给 style 标签一个ID，防止重复注入\n    }\n\n    // 显示通用弹窗的辅助函数 (用于更新/禁用/功能代码篡改)\n    function showGenericModal(title, msgContent, updateBtnText, continueBtnText, onUpdate, onContinue, isForce) {\n        const overlay = document.createElement('div');\n        overlay.id = 'dynamic-script-overlay';\n        const modal = document.createElement('div');\n        modal.id = 'dynamic-script-modal';\n\n        const h2 = document.createElement('h2');\n        h2.textContent = title;\n        const p = document.createElement('p');\n        p.innerHTML = msgContent;\n\n        modal.appendChild(h2);\n        modal.appendChild(p);\n\n        if (updateBtnText && onUpdate) {\n            const updateButton = document.createElement('a');\n            updateButton.href = updateUrl; // 使用全局的 updateUrl\n            updateButton.target = '_blank';\n            updateButton.textContent = updateBtnText;\n            updateButton.className = 'dynamic-script-button primary';\n            updateButton.addEventListener('click', () => {\n                overlay.remove();\n                document.body.style.overflow = '';\n                onUpdate();\n            });\n            modal.appendChild(updateButton);\n        }\n\n        if (!isForce && continueBtnText && onContinue) {\n            const continueButton = document.createElement('button');\n            continueButton.textContent = continueBtnText;\n            continueButton.className = 'dynamic-script-button secondary';\n            continueButton.addEventListener('click', () => {\n                overlay.remove();\n                document.body.style.overflow = '';\n                onContinue();\n            });\n            modal.appendChild(continueButton);\n        }\n\n        overlay.appendChild(modal);\n        document.body.appendChild(overlay);\n        if (isForce) {\n            document.body.style.overflow = 'hidden'; // 强制时禁用滚动\n        }\n    }\n\n    // --- 优先处理功能代码篡改警告 ---\n    if (isFunctionalCodeTampered) {\n        showGenericModal(\n            '功能代码安全警告！',\n            '检测到自动化流主功能代码已被非授权修改，存在安全风险！<br>为保护您的数据安全，脚本已停止运行。<br>请立即访问更新地址重新安装脚本。',\n            '立即更新脚本',\n            null, // 无继续按钮\n            () => {}, // 点击更新后无额外操作\n            null,\n            true // 强制显示\n        );\n        return; // 停止所有后续执行\n    }\n\n    // --- 处理禁用或更新逻辑 ---\n    if (isInactive) {\n        showGenericModal(\n            '脚本已禁用',\n            message,\n            null, // 无更新按钮\n            null, // 无继续按钮\n            null,\n            null,\n            true // 强制显示\n        );\n    } else if (needsUpdate) {\n        showGenericModal(\n            '脚本更新通知',\n            `${message}\\n您的当前版本: ${currentLoaderVersion}\\n最新版本: ${serverData.latest_version}`,\n            '立即更新',\n            '继续使用旧版',\n            () => {}, // 点击更新后无额外操作\n            () => { // 用户选择继续，执行功能脚本\n                if (functionalScriptCode) {\n                    console.log('[Update Modal] 用户选择继续使用旧版。正在执行功能脚本...');\n                    eval(functionalScriptCode);\n                } else {\n                    console.warn('[Update Modal] 未找到功能脚本代码。');\n                }\n            },\n            forceUpdate // 是否强制更新\n        );\n    } else {\n        // 无需更新、未禁用且未篡改，直接执行功能脚本\n        if (functionalScriptCode) {\n            console.log('[Update Modal] 无需更新，脚本已激活且完整性检查通过。正在执行功能脚本...');\n            eval(functionalScriptCode);\n        } else {\n            console.warn('[Update Modal] 未找到功能脚本代码。');\n        }\n    }\n})();","update_modal_code_hash":"fda213d524e53de0b37bd75b37a4944c9ad43a060fed15f9c4ccefaad40aceda","functional_script_code":"(function() {\n    'use strict';\n\n    // --- 统一的 GM 函数获取 ---\n    const scriptConfig = window._myDynamicScriptConfig;\n    const GM_funcs = scriptConfig && scriptConfig.GM ? scriptConfig.GM : {\n        getValue: GM_getValue,\n        setValue: GM_setValue,\n        addStyle: GM_addStyle,\n        notification: GM_notification,\n        registerMenuCommand: GM_registerMenuCommand,\n        deleteValue: GM_deleteValue\n    };\n\n    const {\n        getValue: GM_getValue,\n        setValue: GM_setValue,\n        addStyle: GM_addStyle,\n        notification: GM_notification,\n        registerMenuCommand: GM_registerMenuCommand,\n        deleteValue: GM_deleteValue\n    } = GM_funcs;\n\n    // --- Salesmartly Helper 常量和状态 ---\n    const SS_MIN_PHONE_LEN = 9;\n    const SS_MAX_PHONE_LEN = 15;\n    const SS_PENDING_OPERATION_KEY = 'ss_pending_operation_value';\n    const SS_PANEL_POSITION_KEY = 'ss_panel_position';\n    const SS_TARGET_MEMBER_ID_KEY = 'ss_target_member_id';\n    const SS_PANEL_DEFAULT_WIDTH = '380px';\n    const SS_PANEL_EXPANDED_WIDTH = '600px';\n\n    let ss_currentMemberId = null;\n    let ss_currentVipLevel = null;\n    let ss_panelInstance = null;\n    let ss_allMemberPageInitialized = false;\n    let ss_withdrawManagePageInitialized = false;\n    let ss_isCorrectingCard = false;\n\n    // --- Cross-Domain Communication 常量和状态 ---\n    const COM_DISPLAY_MESSAGE_LIMIT = 15;\n    const COM_RESULT_CARD_PREFIX = 'COM_RESULT_CARD:';\n    const COM_CHAT_IS_MINIMIZED_KEY = 'com_chat_is_minimized';\n    const COM_FLOATING_CHAT_POSITION_KEY = 'com_floating_chat_position';\n    const COM_DEFAULT_FLOATING_WIDTH = '200px';\n    const COM_DEFAULT_FLOATING_HEIGHT = '363px';\n\n    let com_chatWindow = null;\n    let com_currentDomain = 'unknown';\n    let com_pageVersion = 'unknown';\n    let com_isMinimized = false;\n\n    // --- 样式注入 (保持不变) ---\n    GM_addStyle(`\n        /* Salesmartly Helper Styles */\n        #ss-member-panel { position:fixed;top:50%;left:50%;transform:translate(-50%,-50%); width:${SS_PANEL_DEFAULT_WIDTH}; background:white;border-radius:12px;box-shadow:0 8px 30px rgba(0,0,0,0.18);z-index:10000; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif; overflow:hidden;display:none; transition:width .3s ease, transform .3s ease; cursor:move; display:flex; flex-direction: row; }\n        .ss-panel-header{background:linear-gradient(135deg,#409eff,#66b1ff);color:white; padding:18px 24px;font-size:18px;font-weight:600;display:flex; justify-content:space-between;align-items:center;box-shadow:0 2px 10px rgba(0,0,0,0.15); cursor:move; flex-shrink: 0; width: 100%; }\n        .ss-close-btn{background:rgba(255,255,255,0.2);border:none;color:white; font-size:24px;width:32px;height:32px;border-radius:50%;cursor:pointer; display:flex;align-items:center;justify-content:center;transition:background .3s;z-index:10}\n        .ss-close-btn:hover{background:rgba(255,255,255,0.3)}\n        .ss-panel-main-wrapper { display: flex; flex-direction: column; flex-shrink: 0; width: ${SS_PANEL_DEFAULT_WIDTH}; max-height: 70vh; overflow-y: auto; }\n        .ss-panel-body{ padding:24px; flex-grow: 1; }\n        .ss-expanded-actions { flex-shrink: 0; width: 220px; padding: 24px; background-color: #f0f2f5; border-left: 1px solid #e0e0e0; box-sizing: border-box; max-height: 70vh; overflow-y: auto; display: none; flex-direction: column; gap: 10px; }\n        .ss-input-group{margin-bottom:24px}\n        .ss-input-label{display:block;margin-bottom:10px;font-size:15px;color:#606266;font-weight:500}\n        .ss-id-input{width:100%;padding:12px 16px;border:1px solid #dcdfe6;border-radius:6px; font-size:15px;box-sizing:border-box;transition:all .3s;background-color:#f8fafc}\n        .ss-id-input:focus{border-color:#409eff;outline:none;box-shadow:0 0 0 3px rgba(64,158,255,.2);background-color:#fff}\n        .ss-submit-btn{width:100%;padding:14px;background:linear-gradient(135deg,#409eff,#66b1ff); color:white;border:none;border-radius:6px;font-size:15px;font-weight:500;cursor:pointer; transition:all .3s;box-shadow:0 4px 12px rgba(64,158,255,.3)}\n        .ss-submit-btn:hover{transform:translateY(-2px);box-shadow:0 6px 16px rgba(64,158,255,.4)}\n        .ss-submit-btn:active{transform:translateY(0)}\n        .ss-submit-btn:disabled{background:#c0c4cc;transform:none;box-shadow:none;cursor:not-allowed}\n        .ss-status-message{margin-top:20px;padding:12px;border-radius:6px;font-size:14px;text-align:center;display:none}\n        .ss-status-success{background:#f0f9eb;color:#67c23a;border:1px solid #e1f3d8}\n        .ss-status-error{background:#fef0f0;color:#f56c6c;border:1px solid #fde2e2}\n        .ss-floating-btn{position:fixed;bottom:40px;right:40px;width:60px;height:60px; background:linear-gradient(135deg,#409eff,#66b1ff);color:white;border-radius:50%; display:flex;align-items:center;justify-content:center;font-size:26px;font-weight:bold; cursor:pointer;box-shadow:0 6px 16px rgba(64,158,255,.4);z-index:9999;transition:all .3s}\n        .ss-floating-btn:hover{transform:scale(1.1) rotate(5deg);box-shadow:0 8px 20px rgba(64,158,255,.5)}\n        .ss-floating-btn:active{transform:scale(1)}\n        .ss-result-container{margin-top:20px;padding:18px;background-color:#f8fafc;border-left:4px solid #409eff;border-radius:8px;box-shadow:inset 0 1px 3px rgba(0,0,0,0.05)}\n        .ss-result-title{font-weight:700;margin-bottom:12px;color:#409eff;font-size:16px;display:flex;align-items:center}\n        .ss-result-title svg{margin-right:8px}\n        .ss-result-content{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px}\n        .ss-result-item{display:flex;align-items:center}\n        .ss-result-label{font-weight:500;margin-right:6px;color:#606266;font-size:14px;white-space:nowrap}\n        .ss-result-value{font-weight:600;color:#67c23a;font-size:14px}\n        .ss-vip-value{color:#e6a23c}\n        .ss-order-status{color:#f56c6c;font-weight:600;margin-top:15px}\n        .ss-vip2-action{color:#f56c6c;font-weight:600;margin-top:12px;padding:10px; background:rgba(245,108,108,.1);border-radius:6px;text-align:center;animation:pulse 1.5s infinite}\n        @keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.02)}100%{transform:scale(1)}}\n        .ss-progress-container{margin-top:15px;height:6px;background:#e4e7ed;border-radius:3px;overflow:hidden}\n        .ss-progress-bar{height:100%;background:linear-gradient(90deg,#409eff,#66b1ff);width:0%;transition:width .3s}\n        .ss-return-btn{margin-top:15px;padding:10px 15px;background:linear-gradient(135deg,#67c23a,#85ce61); color:white;border:none;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer; transition:all .3s;text-align:center;display:none}\n        .ss-return-btn:hover{transform:translateY(-2px);box-shadow:0 4px 10px rgba(103,194,58,.3)}\n        .ss-order-status-value{font-weight:700;padding:8px 12px;border-radius:6px;background:#f8f8f8; margin-top:5px;display:inline-block}\n        .ss-status-approved{color:#67c23a;background:rgba(103,194,58,.1)}\n        .ss-status-rejected{color:#f56c6c;background:rgba(245,108,108,.1)}\n        .ss-status-pending{color:#e6a23c;background:rgba(230,162,60,.1)}\n        .ss-copyable{cursor:pointer;position:relative;display:inline-block;padding:2px 6px;border-radius:4px;transition:all .2s}\n        .ss-copyable:hover{background-color:rgba(64,158,255,.1)}\n        .ss-copyable:active{transform:scale(.98)}\n        .ss-copyable::after{content:'📋';margin-left:4px;font-size:12px;opacity:.6}\n        .ss-copyable:hover::after{opacity:1}\n        .ss-input-with-expand-btn { display: flex; align-items: center; width: 100%; }\n        .ss-expand-input-btn { margin-left: 8px; padding: 0; background: #409eff; color: white; border: none; border-radius: 6px; font-size: 16px; cursor: pointer; transition: background .3s; display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; box-sizing: border-box; flex-shrink: 0; }\n        .ss-expand-input-btn:hover { background: #66b1ff; }\n        .ss-cancel-btn { background: #f56c6c; color: white; border: none; border-radius: 6px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all .3s; padding: 10px 15px; margin-left: 10px; display: flex; align-items: center; justify-content: center; box-shadow:0 4px 12px rgba(245,108,108,.3); }\n        .ss-cancel-btn:hover { background: #f78989; transform: translateY(-2px); box-shadow:0 6px 16px rgba(245,108,108,.4); }\n        .ss-cancel-btn:active { transform: translateY(0); }\n        .ss-cancel-btn svg { width: 1em; height: 1em; fill: currentColor; margin-right: 5px; }\n        /* Cross-Domain Communication Styles */\n        #com-floating-chat-window { position: fixed; background: white; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.25); z-index: 100001; overflow: hidden; font-family: Arial, sans-serif; display: block; resize: both; min-width: 150px; min-height: 100px; padding: 0; right: 20px; bottom: 20px; width: ${COM_DEFAULT_FLOATING_WIDTH}; height: ${COM_DEFAULT_FLOATING_HEIGHT}; left: auto; top: auto; transition: all 0.2s ease; }\n        #com-floating-chat-window.minimized { height: auto !important; min-height: unset; width: auto !important; min-width: unset; resize: none; box-shadow: 0 2px 8px rgba(0,0,0,0.15); }\n        #com-floating-chat-window.minimized #com-message-area, #com-floating-chat-window.minimized #com-query-status { display: none !important; }\n        #com-floating-chat-window .com-header { background: linear-gradient(135deg,#3498db,#2980b9); color: white; padding: 8px 12px; font-weight: bold; font-size: 14px; display: flex; justify-content: space-between; align-items: center; cursor: move; user-select: none; border-top-left-radius: 8px; border-top-right-radius: 8px; }\n        #com-floating-chat-window .com-header-controls { display: flex; align-items: center; gap: 5px; }\n        .com-minimize-btn { background: rgba(255,255,255,0.2); border: none; color: white; font-size: 18px; width: 24px; height: 24px; border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background .3s; }\n        .com-minimize-btn:hover { background: rgba(255,255,255,0.3); }\n        #com-floating-chat-window #com-message-area { height: calc(100% - 38px - 28px); padding: 10px; overflow-y: auto; background: #fafafa; font-size: 13px; }\n        #com-floating-chat-window #com-query-status { position: absolute; bottom: 0; left: 0; right: 0; background: #f0f0f0; padding: 5px 8px; font-size: 12px; color: #666; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; height: 28px; box-sizing: border-box; }\n        .com-message{margin-bottom:6px;padding:4px 6px;background:#f5f5f5;border-radius:2px;word-break:break-word;}\n        .com-new-message{animation:highlight 1.5s;}\n        @keyframes highlight{0%{background:rgba(255,255,0,0.5);}100%{background:#f5f5f5;}}\n        .com-message-time{font-size:11px;color:#777;text-align:right;margin-top:2px;}\n        .com-system-message{color:#7f8c8d;font-style:italic;}\n        .com-copy-id,.com-popup-copy-id{cursor:pointer;text-decoration:underline;color:#3498db;font-weight:bold;}\n        .com-copy-id.copied,.com-popup-copy-id.copied{color:#2ecc71!important;}\n        .com-popup-message{position:fixed;top:20px;left:50%;transform:translateX(-50%);background:#fff;border:1px solid #ddd;border-radius:5px;padding:10px;box-shadow:0 2px 10px rgba(0,0,0,0.2);z-index:100000;max-width:80%;animation:fadeOut 5s forwards;}\n        @keyframes fadeOut{0%,90%{opacity:1;}100%{opacity:0;visibility:hidden;}}\n        .com-handshake-btn, .com-toggle-log-btn{padding:3px 8px;background:#2980b9;color:#fff;border:none;border-radius:3px;cursor:pointer;font-size:12px;}\n        .com-handshake-btn {background:#2ecc71;}\n        .com-handshake-status{font-size:12px;margin-left:5px;}\n        .com-status-online{color:#2ecc71;font-weight:bold;}\n        .com-status-offline{color:#e74c3c;}\n        .com-remark-btn-marked {outline: 4px solid #FF0000 !important;outline-offset: 3px !important;box-shadow: 0 0 12px rgba(255, 0, 0, 0.8),0 0 24px rgba(255, 0, 0, 0.5),inset 0 0 6px rgba(255, 0, 0, 0.3) !important;border-radius: 4px !important;background: rgba(255, 0, 0, 0.08) !important;}\n        .com-remark-btn-marked::before {content: attr(data-btn-index) !important;position: absolute !important;top: -28px !important;left: 50% !important;transform: translateX(-50%) !important;background: #FF0000 !important;color: white !important;padding: 4px 10px !important;font-size: 12px !important;border-radius: 4px !important;white-space: nowrap !important;font-weight: bold !!important;z-index: 10001 !important;border: 2px solid #FF0000 !important;box-shadow: 0 2px 8px rgba(255, 0, 0, 0.4) !important;}\n        .com-result-card { background: #e8f5e9; border: 1px solid #a5d6a7; border-radius: 8px; padding: 8px; margin-bottom: 10px; font-size: 13px; color: #388e3c; box-shadow: 0 2px 5px rgba(0,0,0,0.08); display: grid; grid-template-columns: repeat(2, 1fr); gap: 6px 8px; word-break: break-word; }\n        .com-card-item { display: flex; flex-direction: column; align-items: flex-start; }\n        .com-card-label { font-weight: bold; color: #1b5e20; margin-right: 0; margin-bottom: 2px; white-space: normal; }\n        .com-card-value { color: #388e3c; white-space: normal; }\n        .com-card-value.vip { color: #e6a23c; }\n        .com-card-value.status-ok { color: #67c23a; }\n        .com-card-value.status-warn { color: #e6a23c; }\n        .com-card-value.status-error { color: #f56c6c; }\n        .com-card-value.order-status { font-weight: bold; padding: 4px 8px; border-radius: 4px; background: rgba(103,194,58,.1); display: inline-block; margin-top: 2px; }\n        .com-card-value.order-status.pending { background: rgba(230,162,60,.1); color: #e6a23c; }\n        .com-card-value.order-status.rejected { background: rgba(245,108,108,.1); color: #f56c6c; }\n        .com-card-value.order-status.approved { background: rgba(103,194,58,.1); color: #67c23a; }\n        @media (max-width: 380px) { .com-result-card { grid-template-columns: 1fr; } }\n        \n        \n        \n        \n        \n        \n    /* ID自动提取相关样式 */\n    .ss-auto-extract-checkbox {\n        width: 18px;\n        height: 18px;\n        cursor: pointer;\n        accent-color: #409eff;\n        transition: all 0.3s ease;\n    }\n    \n    .ss-auto-extract-checkbox:hover {\n        transform: scale(1.1);\n    }\n    \n    .ss-auto-extract-checkbox:checked {\n        background-color: #409eff;\n        border-color: #409eff;\n    }\n    \n    .ss-input-label {\n        display: block;\n        margin-bottom: 10px;\n        font-size: 14px;\n        color: #606266;\n        font-weight: 500;\n    }\n    \n    /* ID输入框错误状态 */\n    .ss-id-input.ss-input-error {\n        border-color: #f56c6c !important;\n        background-color: #fef0f0 !important;\n        box-shadow: 0 0 0 3px rgba(245, 108, 108, 0.2) !important;\n    }\n    \n    .ss-input-error-tip {\n        color: #f56c6c;\n        font-size: 12px;\n        margin-top: 6px;\n        display: none;\n        padding: 4px 8px;\n        background-color: #fef0f0;\n        border-radius: 4px;\n        border-left: 3px solid #f56c6c;\n    }\n    \n    .ss-input-error-tip.show {\n        display: block;\n    }\n    \n    .ss-input-error-tip strong {\n        font-weight: 600;\n    }\n    `);\n\n    // --- 通用工具函数 ---\n    function delay(ms) { return new Promise(r => setTimeout(r, ms)); }\n    function copyToClipboard(text, successMsg = '已复制', errorMsg = '复制失败，请手动复制') {\n        const ta = document.createElement('textarea');\n        ta.value = text;\n        ta.style.position = 'fixed';\n        document.body.appendChild(ta);\n        ta.select();\n        try {\n            document.execCommand('copy');\n            ss_showStatusMessage(successMsg, true);\n        } catch (err) {\n            ss_showStatusMessage(errorMsg, false);\n            Logger.error('Script: Failed to copy to clipboard', err);\n        }\n        document.body.removeChild(ta);\n    }\n    async function findElementWithRetry({ selector, filter, description = \"元素\", maxRetries = 10, interval = 500, context = document }) {\n        for (let i = 1; i <= maxRetries; i++) {\n            const els = Array.from(context.querySelectorAll(selector));\n            const el = filter ? els.find(filter) : els[0];\n            if (el) return el;\n            if (i < maxRetries) await delay(interval); // Polling delay to wait for element to appear\n        }\n        throw new Error(`${description}未找到，请确保页面已完全加载或尝试刷新`);\n    }\n\n    // 🔧 参考auto_jukuan(2).txt：查找按钮的辅助函数（支持在div/span内查找文本）\n    function findButtonByText(text, options = {}) {\n        const {\n            parent = document,\n            exactMatch = false,\n            includeDisabled = false\n        } = options;\n\n        // 策略1: 优先查找 el-form-item 包含的按钮\n        const formItems = parent.querySelectorAll('.el-form-item');\n        for (const item of formItems) {\n            if (item.textContent && item.textContent.trim().includes(text)) {\n                // 深入查找内部所有按钮元素\n                const buttons = item.querySelectorAll('button, [role=\"button\"]');\n                for (const btn of buttons) {\n                    const btnText = btn.textContent.trim();\n                    const spanText = btn.querySelector('span')?.textContent.trim() || '';\n                    const matchedText = exactMatch ? (btnText === text || spanText === text) : (btnText.includes(text) || spanText.includes(text));\n                    \n                    // 检查是否禁用\n                    if (matchedText && (includeDisabled || !btn.disabled)) {\n                        return btn;\n                    }\n                }\n            }\n        }\n\n        // 策略2: 查找 button.el-button\n        const buttons = parent.querySelectorAll('button.el-button' + (includeDisabled ? '' : ':not(:disabled)'));\n        for (const btn of buttons) {\n            const btnText = btn.textContent.trim();\n            if (exactMatch ? btnText === text : btnText.includes(text)) {\n                return btn;\n            }\n            // 检查按钮内部的span文本\n            const span = btn.querySelector('span');\n            if (span) {\n                const spanText = span.textContent.trim();\n                if (exactMatch ? spanText === text : spanText.includes(text)) {\n                    return btn;\n                }\n            }\n        }\n\n        // 策略3: 查找任何包含文本的可点击元素\n        const allElements = parent.querySelectorAll('*');\n        for (const el of allElements) {\n            if (el.textContent && el.textContent.trim().includes(text)) {\n                const isClickable = el.tagName === 'BUTTON' || \n                                   el.getAttribute('role') === 'button' ||\n                                   el.classList.contains('el-button') ||\n                                   el.onclick;\n                if (isClickable) {\n                    return el;\n                }\n            }\n        }\n\n        return null;\n    }\n\n    // 🔧 参考所有会员页面：在scrollbar-flex-content的div内查找tags-li子div中的文字\n    function findTabByTextInScrollbar(text) {\n        // 查找 class=\"scrollbar-flex-content\" 的div\n        const scrollbarContent = document.querySelector('.scrollbar-flex-content');\n        if (!scrollbarContent) {\n            Logger.log(`Script: 未找到 .scrollbar-flex-content 元素`);\n            return null;\n        }\n\n        // 查找该div内所有 class=\"tags-li\" 的子div\n        const tagsLiElements = scrollbarContent.querySelectorAll('.tags-li');\n        if (tagsLiElements.length === 0) {\n            Logger.log(`Script: 未找到 .tags-li 元素`);\n            return null;\n        }\n\n        Logger.log(`Script: 找到 ${tagsLiElements.length} 个 .tags-li 元素`);\n\n        // 深入每个tags-li子div内查找文字\n        for (const tagLi of tagsLiElements) {\n            // 获取该div内显示的完整文本\n            const textContent = tagLi.textContent || tagLi.innerText || '';\n            const trimmedText = textContent.trim();\n\n            Logger.log(`Script: .tags-li 文本内容: \"${trimmedText}\"`);\n\n            // 检查是否包含目标文字\n            if (trimmedText.includes(text)) {\n                // 查找可点击的元素（a标签或button）\n                const clickable = tagLi.querySelector('a, button, [role=\"button\"]');\n                if (clickable) {\n                    Logger.log(`Script: 找到匹配的 .tags-li 元素，包含文字: \"${trimmedText}\"`);\n                    return clickable;\n                } else {\n                    // 如果没有可点击元素，直接返回整个div\n                    Logger.log(`Script: 找到匹配的 .tags-li 元素（无点击元素），包含文字: \"${trimmedText}\"`);\n                    return tagLi;\n                }\n            }\n        }\n\n        Logger.log(`Script: 未找到包含文字 \"${text}\" 的 .tags-li 元素`);\n        return null;\n    }\n\n    // --- Salesmartly Helper 核心功能函数 ---\n    function ss_createHeaderIndexMap(tableSelector = '.el-table') {\n        const headerCells = document.querySelectorAll(`${tableSelector} .el-table__header-wrapper th`);\n        if (!headerCells.length) { Logger.error('Script:无法找到表头，无法动态匹配列。'); return null; }\n        const map = {};\n        headerCells.forEach((th, index) => {\n            const cellContent = th.querySelector('.cell');\n            if (cellContent) {\n                const headerText = cellContent.textContent.trim();\n                if (headerText) { map[headerText] = index; }\n            }\n        });\n        return map;\n    }\n\n    function ss_showStatusMessage(msg, ok = true) {\n        const el = document.getElementById('ss-status-message');\n        if (!el) return;\n        el.textContent = msg;\n        el.className = `ss-status-message ${ok ? 'ss-status-success' : 'ss-status-error'}`;\n        el.style.display = 'block';\n        setTimeout(() => el.style.display = 'none', 5000);\n    }\n\n    async function ss_autoFillWithdrawPage(targetId) {\n        try {\n            const val = targetId || GM_getValue(SS_TARGET_MEMBER_ID_KEY, '');\n            if (!val) { Logger.log('Script: No target member ID found for withdraw page auto-fill.'); return '未找到目标会员ID'; }\n            Logger.log(`Script: Auto-filling withdraw page with ID: ${val}`);\n            ss_showStatusMessage(`正在填充提现页面: ${val}`);\n\n            // 🔧 参考 auto_jukuan(2).txt：多策略查找输入框\n            let input = null;\n            \n            // 策略1: 查找 el-form-item 包含的输入框\n            const formItems = document.querySelectorAll('.el-form-item');\n            for (const item of formItems) {\n                const inputEl = item.querySelector('.el-input__inner');\n                if (inputEl) {\n                    const placeholder = (inputEl.placeholder || '').toLowerCase();\n                    if (placeholder.includes('会员') || placeholder.includes('id')) {\n                        input = inputEl;\n                        Logger.log(`Script: 通过el-form-item找到输入框，placeholder: ${inputEl.placeholder}`);\n                        break;\n                    }\n                }\n            }\n            \n            // 策略2: 查找所有 el-input__inner 元素\n            if (!input) {\n                const allInputs = document.querySelectorAll('.el-input__inner');\n                for (const inp of allInputs) {\n                    const placeholder = (inp.placeholder || '').toLowerCase();\n                    if (placeholder.includes('会员') || placeholder.includes('id')) {\n                        input = inp;\n                        Logger.log(`Script: 通过全局查找找到输入框，placeholder: ${inp.placeholder}`);\n                        break;\n                    }\n                }\n            }\n            \n            if (!input) {\n                Logger.error('Script: 未找到会员ID输入框');\n                return '未找到会员ID输入框';\n            }\n            \n            // 🔧 参考 auto_jukuan(2).txt：填充输入框\n            Logger.log(`Script: 找到输入框，准备填充值 \"${val}\"`);\n            input.focus();\n            await delay(50);\n            \n            // 清空现有值\n            input.value = '';\n            input.dispatchEvent(new Event('input', { bubbles: true }));\n            input.dispatchEvent(new Event('change', { bubbles: true }));\n            await delay(100);\n            \n            // 填充新值\n            input.value = val;\n            input.dispatchEvent(new Event('input', { bubbles: true }));\n            input.dispatchEvent(new Event('change', { bubbles: true }));\n            input.blur();\n            await delay(300);\n\n            // 🔧 参考 auto_jukuan(2).txt：使用 findButtonByText 查找搜索按钮\n            Logger.log('Script: 开始查找搜索按钮...');\n            const searchButton = findButtonByText('搜索', { parent: document, includeDisabled: false });\n            \n            if (!searchButton) {\n                Logger.error('Script: 未找到搜索按钮');\n                return '未找到搜索按钮';\n            }\n            \n            Logger.log(`Script: 找到搜索按钮，准备点击`);\n            \n            // 确保按钮可点击\n            if (searchButton.disabled) {\n                Logger.log('Script: 搜索按钮被禁用，尝试启用');\n                searchButton.disabled = false;\n                searchButton.removeAttribute('disabled');\n                searchButton.setAttribute('aria-disabled', 'false');\n            }\n            \n            // 点击搜索按钮\n            searchButton.click();\n            Logger.log('Script: 已点击搜索按钮');\n            await delay(2000); // 等待数据加载\n\n            // 提取订单状态\n            let statusCheckAttempts = 0;\n            const maxStatusCheckAttempts = 20;\n            let currentStatus = '还未操作';\n            \n            Logger.log('Script: 开始等待搜索结果...');\n            while (statusCheckAttempts < maxStatusCheckAttempts) {\n                currentStatus = ss_getLatestOrderStatus();\n                if (currentStatus !== '还未操作' && currentStatus !== '获取状态失败' && !currentStatus.includes('无法解析表头') && !currentStatus.includes('列未找到')) {\n                    break;\n                }\n                await delay(500);\n                statusCheckAttempts++;\n            }\n\n            Logger.log(`Script: 最终获取到的订单状态: ${currentStatus}`);\n            ss_showStatusMessage(`最新订单状态: ${currentStatus}`);\n            const statusEl = document.getElementById('ss-order-status-value');\n            if (statusEl) statusEl.textContent = currentStatus;\n            const orderStatusDiv = document.getElementById('ss-order-status');\n            if (orderStatusDiv) orderStatusDiv.style.display = 'block';\n            const returnBtn = document.getElementById('ss-return-btn');\n            if (returnBtn) returnBtn.style.display = 'block';\n\n            return currentStatus;\n        } catch (e) {\n            ss_showStatusMessage(`提现页面自动填充失败: ${e.message}`, false);\n            Logger.error('Script: ss_autoFillWithdrawPage error:', e);\n            return `提现页面自动填充失败: ${e.message}`;\n        }\n    }\n\n    function ss_returnToAllMembersPage() {\n        try {\n            Logger.log('Script: Attempting to return to all members page.');\n            const tab = document.querySelector('a.tags-li-title[href=\"/user-manage/all-member\"]');\n            if (tab) {\n                tab.click();\n                ss_showStatusMessage('正在返回所有会员页面...', true);\n            } else if (window.location.pathname !== '/user-manage/all-member') {\n                window.location.href = '/user-manage/all-member';\n            } else {\n                ss_showStatusMessage('已在所有会员页面', true);\n            }\n        } catch (e) {\n            ss_showStatusMessage(`返回所有会员页面失败: ${e.message}`, false);\n            Logger.error('Script: ss_returnToAllMembersPage error:', e);\n        }\n    }\n\n    function ss_getLatestOrderStatus() {\n        try {\n            const rows = document.querySelectorAll('.el-table__body-wrapper tbody tr');\n            if (!rows.length) return '还未操作';\n            const headerMap = ss_createHeaderIndexMap();\n            if (!headerMap) return '获取状态失败 (无法解析表头)';\n            const statusIndex = headerMap['订单状态'] ?? headerMap['审核状态'];\n            if (statusIndex === undefined) {\n                Logger.error('Script: 在提现页面表头中未找到 \"状态\" 或 \"审核状态\" 列。');\n                return '获取状态失败 (列未找到)';\n            }\n            const cell = rows[0].querySelectorAll('td')[statusIndex];\n            return (cell?.textContent || '未知').trim();\n        } catch (e) {\n            Logger.error('Script: ss_getLatestOrderStatus error:', e);\n            return '获取状态失败';\n        }\n    }\n\n    function ss_checkSearchResults(val) {\n        // 增加对 Loading 状态的检测，如果正在加载，视为未找到，等待下一次轮询\n        if (document.querySelector('.el-loading-mask') && document.querySelector('.el-loading-mask').style.display !== 'none') {\n            Logger.log('Script: 搜索结果数据加载中...');\n            return { found: false, message: '数据加载中...' };\n        }\n\n        const rows = document.querySelectorAll('.el-table__body-wrapper tbody tr');\n        if (rows.length === 0) {\n            Logger.log('Script: 未找到匹配数据。');\n            return { found: false, message: '未找到匹配数据' };\n        }\n        if (rows.length > 1) {\n            Logger.log(`Script: 找到多个匹配项(${rows.length}个)，请精确查询。`);\n            return { found: false, message: `找到多个匹配项(${rows.length}个)，请精确查询` };\n        }\n        const matchedRow = rows[0];\n        const headerMap = ss_createHeaderIndexMap();\n        if (!headerMap) {\n            Logger.error('Script: 无法解析表格列，请检查页面结构。');\n            return { found: false, message: '无法解析表格列，请检查页面结构。' };\n        }\n        const COLS = { ID: '会员ID', VIP: 'VIP等级', BALANCE: '余额', STATUS: '状态', RECHARGE: '总充值金额' };\n        const cells = matchedRow.querySelectorAll('td');\n        const getData = (colName, defaultValue = '未知') => {\n            const index = headerMap[colName];\n            if (index !== undefined && cells[index]) { return cells[index].textContent.trim() || defaultValue; }\n            Logger.warn(`Script: 在表头中未找到列 \"${colName}\" 或单元格不存在。`);\n            return defaultValue;\n        };\n        const memberId = getData(COLS.ID, '-');\n        \n        // 如果会员ID无法提取，或者提取到的值是默认值，则认为未找到有效结果\n        if (memberId === '-' || memberId === '未知') {\n             Logger.warn('Script: 找到了匹配行，但无法提取关键的\"会员ID\"信息。');\n             return { found: false, message: '找到了匹配行，但无法提取关键的\"会员ID\"信息。' };\n        }\n        \n        // 如果是会员ID查询，进行精确比对，防止旧数据残留\n        if (val.length === 8 && /^\\d+$/.test(val) && memberId !== val) {\n             Logger.warn(`Script: 搜索值 (${val}) 是会员ID，但表格中显示的会员ID (${memberId}) 不匹配，可能是旧数据残留。`);\n             return { found: false, message: '结果ID不匹配，可能是旧数据。' };\n        }\n        // 如果是手机号或G+账号查询，只要有结果且不报错，就认为是成功\n        // 因为手机号和G+账号不会直接显示在表格的“会员ID”列，所以无法进行精确匹配\n        // 只要表格有数据且没有加载中，就认为是成功查询到了\n        \n        Logger.log(`Script: 搜索结果校验成功。会员ID: ${memberId}`);\n        return {\n            found: true, memberId, vipLevel: getData(COLS.VIP), balance: getData(COLS.BALANCE),\n            status: getData(COLS.STATUS), totalRecharge: getData(COLS.RECHARGE)\n        };\n    }\n\n    // 🔄 关键修复：执行查询操作\n    async function ss_executeOperation(programmaticValue = null) {\n        const isProgrammaticQuery = programmaticValue !== null;\n        const inp = document.getElementById('ss-member-id');\n        const rawVal = programmaticValue || (inp ? inp.value.trim() : '');\n        let searchOptionText = '', searchPlaceholderText = '';\n\n        if (document.getElementById('ss-member-panel')) {\n            ['ss-result-container', 'ss-vip2-action', 'ss-order-status'].forEach(id => {\n                const el = document.getElementById(id);\n                if (el) el.style.display = 'none';\n            });\n            const resetBtnGroup = document.querySelector('.ss-reset-btn-group');\n            if (resetBtnGroup) resetBtnGroup.style.display = 'none';\n            const returnBtn = document.getElementById('ss-return-btn');\n            if (returnBtn) returnBtn.style.display = 'block';\n            ss_updateProgressBar(0);\n        }\n\n        if (/^[gG]\\d+$/.test(rawVal)) { searchOptionText = '会员账号'; searchPlaceholderText = '会员账号'; }\n        else if (rawVal.length === 8 && /^\\d+$/.test(rawVal)) { searchOptionText = '会员ID'; searchPlaceholderText = '会员ID'; }\n        else if (rawVal.length >= SS_MIN_PHONE_LEN && rawVal.length <= SS_MAX_PHONE_LEN && /^\\d+$/.test(rawVal)) { searchOptionText = '电话号码'; searchPlaceholderText = '电话号码'; }\n        else {\n            const errorMsg = `请输入8位会员ID、${SS_MIN_PHONE_LEN}~${SS_MAX_PHONE_LEN}位手机号码或G+账号`;\n            if (document.getElementById('ss-member-panel')) {\n                ss_showStatusMessage(errorMsg, false);\n                if (inp) inp.focus();\n            }\n            Logger.error(`Script: 输入值 \"${rawVal}\" 不符合查询格式。`);\n            return { success: false, message: errorMsg };\n        }\n\n        const btn = document.getElementById('ss-submit-btn');\n        if (btn) {\n            btn.disabled = true;\n            btn.textContent = '处理中...';\n        }\n        Logger.log(`Script: 开始执行操作，查询值: \"${rawVal}\", 类型: \"${searchOptionText}\"`);\n\n        try {\n            if (window.location.pathname !== '/user-manage/all-member') {\n                Logger.log('Script: 当前不在会员管理页面，正在尝试跳转。');\n                if (document.getElementById('ss-member-panel')) ss_showStatusMessage('检测到不在会员管理页面，正在切换...', true);\n                const allMemberTab = await findElementWithRetry({ selector: 'a.tags-li-title[href=\"/user-manage/all-member\"]', description: '所有会员页签' });\n                if (allMemberTab) {\n                    allMemberTab.click();\n                    GM_setValue(SS_PENDING_OPERATION_KEY, rawVal);\n                    await delay(300); // 等待页面跳转指令被浏览器处理，确保GM_setValue在跳转前完成\n                    return { success: false, message: '正在跳转到会员管理页面' };\n                } else {\n                    GM_setValue(SS_PENDING_OPERATION_KEY, rawVal);\n                    window.location.href = '/user-manage/all-member';\n                    await delay(300); // 等待页面跳转指令被浏览器处理\n                    return { success: false, message: '正在跳转到会员管理页面' };\n                }\n            }\n\n            // 1. 选择查询类型\n            const dropdown = await findElementWithRetry({ selector: '.el-select .el-input__inner[placeholder=\"请选择\"]', description: '查询类型下拉框' });\n            Logger.log(`Script: 点击查询类型下拉框。`);\n            dropdown.click();\n            await delay(100); // 等待下拉菜单UI完全展开\n\n            const option = await findElementWithRetry({ selector: '.el-select-dropdown__item', filter: el => el.textContent.includes(searchOptionText), description: `查询类型选项 (${searchOptionText})` });\n            Logger.log(`Script: 选择查询类型 \"${searchOptionText}\"。`);\n            option.click();\n            await delay(200); // 等待类型切换完成，可能导致输入框变化或重置，给Vue等框架时间同步状态\n            if (document.getElementById('ss-member-panel')) ss_updateProgressBar(20);\n\n            // 2. 填充输入框\n            const inputPage = await findElementWithRetry({ selector: '.el-input__inner', filter: el => (el.placeholder || '').includes(searchPlaceholderText), description: `页面输入框 (${searchPlaceholderText})` });\n            \n            Logger.log(`Script: 找到输入框，准备填充值 \"${rawVal}\"。`);\n            \n            // 模拟用户输入行为，确保前端框架捕获到所有事件\n            inputPage.focus();\n            await delay(50); // 输入框聚焦后，短暂等待以确保焦点状态稳定\n\n            // 清空现有值\n            inputPage.value = '';\n            inputPage.dispatchEvent(new Event('input', { bubbles: true }));\n            inputPage.dispatchEvent(new Event('change', { bubbles: true }));\n            await delay(100); // 关键：等待Vue等框架处理输入框的清空操作，避免旧值残留\n\n            // 填充新值\n            inputPage.value = rawVal;\n            inputPage.dispatchEvent(new Event('input', { bubbles: true }));\n            inputPage.dispatchEvent(new Event('change', { bubbles: true }));\n            await delay(100); // 关键：等待Vue等框架处理新值的填充，确保数据模型更新\n            \n            inputPage.blur(); // 模拟失去焦点，这通常会触发验证或数据同步\n            await delay(100); // 关键：失去焦点后给框架更多时间同步数据，确保v-model更新完成\n\n            if (document.getElementById('ss-member-panel')) ss_updateProgressBar(40);\n\n            // 3. 点击搜索按钮\n            const searchBtn = await findElementWithRetry({ selector: '.el-form-item__content .el-button.el-button--primary', filter: b => b.textContent.includes('搜'), description: '搜索按钮' });\n            if (searchBtn.disabled) { searchBtn.disabled = false; searchBtn.setAttribute('aria-disabled', 'false'); }\n            Logger.log('Script: 点击搜索按钮。');\n            searchBtn.click();\n            if (document.getElementById('ss-member-panel')) ss_updateProgressBar(60);\n\n            // 4. 等待搜索结果\n            // 强制等待一段时间，确保页面开始加载新数据，避免读取旧数据\n            await delay(1100); // 关键：点击搜索后较长的初始等待，覆盖网络请求、服务器响应和UI开始渲染的时间\n\n            let searchResultAttempts = 0;\n            const maxSearchResultAttempts = 30; // 增加重试次数\n            let result = { found: false, message: '搜索结果超时或未找到' };\n            Logger.log('Script: 等待搜索结果...');\n\n            while (searchResultAttempts < maxSearchResultAttempts) {\n                // 检查是否有加载遮罩层，如果有则继续等待\n                const loadingMask = document.querySelector('.el-loading-mask');\n                if (loadingMask && loadingMask.style.display !== 'none') {\n                    Logger.log('Script: 检测到数据加载中，继续等待...');\n                    await delay(500); // Polling delay to wait for loading mask to disappear\n                    searchResultAttempts++;\n                    continue;\n                }\n\n                result = ss_checkSearchResults(rawVal);\n                if (result.found) {\n                    Logger.log('Script: 搜索结果校验成功。');\n                    break;\n                }\n                Logger.log(`Script: 搜索结果未找到或不匹配，重试 ${searchResultAttempts + 1}/${maxSearchResultAttempts}...`);\n                await delay(500); // Polling delay to re-check search results\n                searchResultAttempts++;\n            }\n\n            if (!result.found) {\n                Logger.error(`Script: 搜索失败: ${result.message}`);\n                if (document.getElementById('ss-member-panel')) {\n                    ss_showStatusMessage(`失败: ${result.message}`, false);\n                    const returnBtn = document.getElementById('ss-return-btn');\n                    if (returnBtn) returnBtn.style.display = 'block';\n                }\n                return { success: false, message: result.message };\n            }\n\n            if (document.getElementById('ss-member-panel')) {\n                const vipEl = document.getElementById('ss-result-vip');\n                if (vipEl) vipEl.textContent = result.vipLevel;\n                const balanceEl = document.getElementById('ss-result-balance');\n                if (balanceEl) balanceEl.textContent = result.balance;\n                const statusEl = document.getElementById('ss-result-status');\n                if (statusEl) statusEl.textContent = result.status;\n                const resultContainer = document.getElementById('ss-result-container');\n                if (resultContainer) resultContainer.style.display = 'block';\n                ss_updateProgressBar(80);\n            }\n\n            ss_currentMemberId = result.memberId;\n            ss_currentVipLevel = result.vipLevel;\n            const resetBtnGroup = document.querySelector('.ss-reset-btn-group');\n            if (resetBtnGroup) resetBtnGroup.style.display = 'flex';\n\n            const m = result.vipLevel.match(/\\d+/);\n            const vipNum = m ? parseInt(m[0]) : 0;\n            let displayIdText;\n            if (vipNum >= 2) {\n                displayIdText = `${result.memberId} V${vipNum}`;\n            } else if (vipNum === 0) {\n                displayIdText = result.memberId;\n            } else {\n                displayIdText = `${result.memberId} ${result.totalRecharge}`;\n            }\n\n            if (document.getElementById('ss-member-panel')) {\n                const dispEl = document.getElementById('ss-result-id');\n                if (dispEl) {\n                    dispEl.textContent = displayIdText;\n                    dispEl.onclick = () => copyToClipboard(displayIdText);\n                }\n            }\n\n            let latestOrderStatus = '未涉及提现';\n            if (vipNum >= 2) {\n                Logger.log(`Script: 检测到VIP2等级 (${result.vipLevel})，准备跳转提现管理页面。`);\n                if (document.getElementById('ss-member-panel')) {\n                    const vip2Action = document.getElementById('ss-vip2-action');\n                    if (vip2Action) vip2Action.style.display = 'block';\n                }\n                GM_setValue(SS_TARGET_MEMBER_ID_KEY, result.memberId);\n                \n                // 🔧 修复：使用 findTabByTextInScrollbar 函数在 scrollbar-flex-content div 内查找 tags-li 子div中的文字\n                const tab = findTabByTextInScrollbar('提现订单列表');\n                if (!tab) {\n                    Logger.error('Script: 提现订单列表按键未找到');\n                    if (document.getElementById('ss-member-panel')) {\n                        ss_showStatusMessage('操作失败: 提现订单列表按键未找到，请确保页面已完全加载或尝试刷新', false);\n                    }\n                    return { success: false, message: '操作失败: 提现订单列表按键未找到，请确保页面已完全加载或尝试刷新' };\n                }\n                \n                Logger.log('Script: 找到提现订单列表按键，准备点击');\n                tab.click();\n                if (document.getElementById('ss-member-panel')) ss_showStatusMessage('VIP2，正在跳转提现管理页面...', true);\n                if (document.getElementById('ss-member-panel')) ss_updateProgressBar(85);\n\n                // 🔧 修复：等待300ms后直接执行输入和搜索操作\n                await delay(300);\n\n                Logger.log('Script: 开始执行提现页面自动填充...');\n\n                // 🔧 修复：确保传递会员ID参数\n                const targetMemberId = GM_getValue(SS_TARGET_MEMBER_ID_KEY, '');\n                Logger.log(`Script: 从存储中获取会员ID: ${targetMemberId}`);\n                \n                if (targetMemberId) {\n                    latestOrderStatus = await ss_autoFillWithdrawPage(targetMemberId);\n                    Logger.log(`Script: ss_autoFillWithdrawPage 返回结果: ${latestOrderStatus}`);\n                } else {\n                    Logger.error('Script: 未找到目标会员ID，无法自动填充');\n                    latestOrderStatus = '未找到目标会员ID';\n                }\n            }\n\n            if (document.getElementById('ss-member-panel')) {\n                ss_showStatusMessage(`查询成功！VIP等级: ${result.vipLevel}`, true);\n                ss_updateProgressBar(100);\n                const returnBtn = document.getElementById('ss-return-btn');\n                if (returnBtn) returnBtn.style.display = 'block';\n            }\n\n            if (vipNum >= 2) {\n                Logger.log('Script: VIP2操作完成，返回所有会员页面。');\n                ss_returnToAllMembersPage();\n            }\n\n            Logger.log('Script: 操作成功完成。');\n            return {\n                success: true,\n                memberId: result.memberId,\n                displayId: displayIdText,\n                vipLevel: result.vipLevel,\n                balance: result.balance,\n                status: result.status,\n                totalRecharge: result.totalRecharge,\n                latestOrderStatus: latestOrderStatus\n            };\n        } catch (e) {\n            const errorMsg = `操作失败: ${e.message}`;\n            if (document.getElementById('ss-member-panel')) {\n                ss_showStatusMessage(errorMsg, false);\n                const returnBtn = document.getElementById('ss-return-btn');\n                if (returnBtn) returnBtn.style.display = 'block';\n            }\n            Logger.error('Script: ss_executeOperation failed:', e);\n            return { success: false, message: errorMsg };\n        } finally {\n            if (btn) {\n                btn.disabled = false;\n                btn.textContent = '提交';\n            }\n            GM_setValue(SS_PENDING_OPERATION_KEY, '');\n        }\n    }\n\n    async function ss_resetPassword(type) {\n        let memberIdToUse = ss_currentMemberId;\n        if (!memberIdToUse) {\n            const inp = document.getElementById('ss-member-id');\n            if (inp && inp.value.trim().length === 8 && /^\\d+$/.test(inp.value.trim())) {\n                memberIdToUse = inp.value.trim();\n            }\n        }\n\n        if (!memberIdToUse) { ss_showStatusMessage('请先查询会员或在会员信息输入框输入有效的8位会员ID', false); return; }\n        try {\n            ss_showStatusMessage(`正在重置${type === 'login' ? '登录' : '提款'}密码...`);\n            const memberIdCell = await findElementWithRetry({\n                selector: '.el-table__body-wrapper tbody tr td',\n                filter: el => el.textContent.trim() === memberIdToUse,\n                description: `会员ID ${memberIdToUse} 的表格单元格`\n            });\n            const row = memberIdCell.closest('tr');\n            if (!row) throw new Error('未找到会员ID所在的行');\n            const detailClickable = row.querySelector('span.special.pointer') || row.querySelector('button.el-button--text') || row.querySelector('td:first-child');\n            if (!detailClickable) throw new Error('未找到用于打开详情的点击元素');\n            detailClickable.click();\n            await delay(1300); // 等待会员详情弹窗完全加载并渲染\n\n            const container = await findElementWithRetry({ selector: 'div.small-box', filter: el => el.querySelector('.box-head')?.textContent.trim() === '账户安全', description: '账户安全面板' });\n            const form = container.querySelector('form.form-box');\n            if (!form) throw new Error('未找到安全面板表单');\n\n            const key = type === 'login' ? '登录密码' : '提现密码';\n            const item = Array.from(form.querySelectorAll('.el-form-item')).find(d => d.querySelector('label.el-form-item__label')?.textContent.includes(key));\n            if (!item) throw new Error(`未找到\"${key}\"项`);\n\n            const edit = item.querySelector('button.el-button--primary.is-text');\n            if (!edit) throw new Error('未找到编辑按钮');\n            edit.click(); await delay(1000); // 点击编辑后，等待输入框变为可编辑状态\n\n            const input = item.querySelector('input.el-input__inner:not([disabled])');\n            if (!input) throw new Error('未找到可编辑输入框');\n            input.value = '123456';\n            input.dispatchEvent(new Event('input', { bubbles: true })); await delay(200); // 模拟输入后，等待Vue等框架处理input事件\n\n            const save = Array.from(item.querySelectorAll('button.el-button--primary.is-text')).find(b => b.textContent.trim() === '保存');\n            if (!save) throw new Error('未找到保存按钮');\n            save.click();\n            await delay(1000); // 点击保存后，等待数据提交和UI更新（如成功提示）\n\n            const closeButtonInBoxBot = await findElementWithRetry({\n                selector: '.box-bot button.el-button--primary',\n                filter: el => el.textContent.includes('关闭'),\n                description: '弹窗内的关闭按钮',\n                maxRetries: 5,\n                interval: 300 // Polling interval to find the close button\n            });\n\n            if (closeButtonInBoxBot) {\n                closeButtonInBoxBot.click();\n                Logger.log('Script: 已点击弹窗内的\"关闭\"按钮。');\n            } else {\n                Logger.warn('Script: 未找到弹窗内的\"关闭\"按钮，尝试点击头部\"X\"按钮。');\n                const headerCloseBtn = document.querySelector('.el-dialog__headerbtn button.el-dialog__close');\n                if (headerCloseBtn) {\n                    headerCloseBtn.click();\n                    Logger.log('Script: 作为备用，已点击弹窗头部的\"X\"按钮。');\n                } else {\n                    Logger.error('Script: 未找到任何关闭弹窗的按钮。');\n                }\n            }\n\n            ss_showStatusMessage(`${key}重置成功！新密码：123456`, true);\n        } catch (e) {\n            ss_showStatusMessage(`重置${type === 'login' ? '登录' : '提款'}密码失败: ${e.message}`, false);\n            Logger.error('Script: ss_resetPassword error:', e);\n        }\n    }\n\n    // 🔄 新增：在提现页面进行搜索的函数 (新版新增)\n    async function ss_searchInWithdrawPage(memberId, cardNumber) {\n        try {\n            ss_showStatusMessage(`正在提现页面搜索会员ID: ${memberId}...`, true);\n\n            // 找到提现页面的输入框\n            const withdrawInput = await findElementWithRetry({\n                selector: '.el-input__inner',\n                filter: el => (el.placeholder || '').includes('会员ID'),\n                description: '提现页面会员ID输入框',\n                maxRetries: 10,\n                interval: 500\n            });\n\n            // 清空输入框并填入新的会员ID\n            withdrawInput.value = '';\n            withdrawInput.focus();\n            await delay(50); // 聚焦后短暂等待，确保焦点稳定\n            withdrawInput.value = memberId;\n            \n            // 触发输入事件以确保系统识别\n            withdrawInput.dispatchEvent(new Event('input', { bubbles: true }));\n            withdrawInput.dispatchEvent(new Event('change', { bubbles: true }));\n            withdrawInput.dispatchEvent(new Event('blur', { bubbles: true }));\n            await delay(500); // 模拟用户输入和失去焦点后，等待Vue等框架处理数据同步\n\n            ss_showStatusMessage(`已填入会员ID: ${memberId}，正在搜索...`, true);\n            \n\n            // 找到并点击搜索按钮\n            const searchBtn = await findElementWithRetry({\n                selector: '.el-button.el-button--primary',\n                filter: b => b.textContent.includes('搜'),\n                description: '提现页面搜索按钮',\n                maxRetries: 5,\n                interval: 300\n            });\n\n            if (searchBtn.disabled) {\n                searchBtn.disabled = false;\n                searchBtn.setAttribute('aria-disabled', 'false');\n            }\n            \n            searchBtn.click();\n            ss_showStatusMessage('已点击搜索按钮，等待搜索结果...', true);\n            \n            // 等待搜索结果\n            await delay(1000); // 点击搜索后，等待数据从服务器加载并渲染到表格\n\n        } catch (e) {\n            Logger.error('Script: ss_searchInWithdrawPage error:', e);\n            throw new Error(`提现页面搜索失败: ${e.message}`);\n        }\n    }\n\n// 🔄 改进的修正卡号函数 - 添加严格的成功提示验证\nasync function ss_performCardCorrectionInWithdrawPage(memberId, newCardNumber) {\n    const MAX_RETRY_ATTEMPTS = 3; // 最多重试3次\n    let currentAttempt = 0;\n\n    async function executeCardCorrectionWithValidation() {\n        currentAttempt++;\n        Logger.log(`[修正卡号] 开始第 ${currentAttempt} 次尝试`);\n\n        try {\n            ss_showStatusMessage(`正在提现页面为会员 ${memberId} 修正卡号为 ${newCardNumber}...`, true);\n\n            // 1. 找到会员ID所在的行\n            const headerMap = ss_createHeaderIndexMap();\n            if (!headerMap) throw new Error('无法解析提现表格表头');\n            const memberIdColIndex = headerMap['会员ID'];\n            if (memberIdColIndex === undefined) throw new Error('提现表格中未找到\"会员ID\"列');\n\n            const memberRow = await findElementWithRetry({\n                selector: '.el-table__body-wrapper tbody tr',\n                filter: row => {\n                    const cells = row.querySelectorAll('td');\n                    return cells[memberIdColIndex] && cells[memberIdColIndex].textContent.trim() === memberId;\n                },\n                description: `会员ID ${memberId} 在提现列表中的行`,\n                maxRetries: 10,\n                interval: 400\n            });\n\n            if (!memberRow) throw new Error(`未在提现列表中找到会员ID ${memberId} 的行`);\n\n            // 2. 点击该行的详情按钮\n            const detailClickable = memberRow.querySelector('span.special.pointer') ||\n                                    memberRow.querySelector('button.el-button--text') ||\n                                    memberRow.querySelector(`td:nth-child(${memberIdColIndex + 1})`);\n            \n            if (!detailClickable) throw new Error('未找到用于打开提现详情的点击元素');\n            \n            detailClickable.click();\n            ss_showStatusMessage('已点击详情，等待会员信息弹窗...', true);\n            await delay(400);\n\n            const dialog = await findElementWithRetry({\n                selector: '.el-overlay-dialog',\n                filter: el => el.querySelector('.el-dialog__title')?.textContent.includes('会员信息'),\n                description: '会员信息弹窗',\n                maxRetries: 15,\n                interval: 100\n            });\n\n            if (!ss_isCorrectingCard) throw new Error('操作已取消');\n\n            // 3. 处理账号状态 - 添加成功提示验证\n            ss_showStatusMessage('正在处理账号状态...', true);\n            \n            const accountStatusItem = await findElementWithRetry({\n                selector: '.el-form-item',\n                filter: item => item.querySelector('.el-form-item__label')?.textContent.includes('账号状态:'),\n                context: dialog,\n                description: '账号状态表单项',\n                maxRetries: 10,\n                interval: 150\n            });\n\n            const accountStatusEditBtn = accountStatusItem.querySelector('button.el-button--primary.is-text');\n            if (accountStatusEditBtn && accountStatusEditBtn.textContent.includes('编辑')) {\n                accountStatusEditBtn.click();\n                ss_showStatusMessage('已点击编辑...', true);\n                await delay(200);\n            }\n\n            const accountStatusInput = await findElementWithRetry({\n                selector: 'input.el-input__inner[placeholder*=\"请选择账号状态\"]',\n                context: accountStatusItem,\n                description: '账号状态选择输入框',\n                maxRetries: 15,\n                interval: 200\n            });\n            \n            accountStatusInput.click();\n            ss_showStatusMessage('已点击下拉框...', true);\n            await delay(300);\n\n            const restoreNormalOption = await findElementWithRetry({\n                selector: '.el-select-dropdown__item',\n                filter: el => el.textContent.includes('恢复正常'),\n                description: '\"恢复正常\"选项',\n                maxRetries: 20,\n                interval: 120,\n                context: document.body\n            });\n            \n            restoreNormalOption.click();\n            ss_showStatusMessage('已选择恢复正常...', true);\n            await delay(100);\n\n            // 保存账号状态 - 验证成功提示\n            const accountStatusSaveBtn = await findElementWithRetry({\n                selector: 'button.el-button--primary.is-text',\n                filter: btn => btn.textContent.includes('保存'),\n                context: accountStatusItem,\n                description: '保存按钮',\n                maxRetries: 10,\n                interval: 100\n            });\n            \n            accountStatusSaveBtn.click();\n            ss_showStatusMessage('已保存账号状态，等待成功提示...', true);\n            \n            // 严格验证成功提示\n            const accountStatusSuccess = await com_waitForSuccessMessage('操作成功！', 15, 100);\n            if (!accountStatusSuccess) {\n                throw new Error('账号状态保存失败：未检测到成功提示');\n            }\n            Logger.log('[修正卡号] ✓ 账号状态保存成功');\n            await delay(600);\n\n            if (!ss_isCorrectingCard) throw new Error('操作已取消');\n\n            // 4. 切换到提现账户tab\n            ss_showStatusMessage('切换到提现账户tab...', true);\n            await delay(400);\n            \n            const withdrawAccountTab = await findElementWithRetry({\n                selector: '.el-tabs__item',\n                filter: tab => tab.textContent.includes('提现账户'),\n                context: dialog,\n                description: '提现账户tab',\n                maxRetries: 10,\n                interval: 100\n            });\n            \n            withdrawAccountTab.click();\n            await delay(500);\n\n            if (!ss_isCorrectingCard) throw new Error('操作已取消');\n\n            // 5. 查找修改按钮\n            ss_showStatusMessage('查找修改按钮...', true);\n            \n            const modifyBtn = await findElementWithRetry({\n                selector: 'button.el-button--primary.is-text',\n                filter: btn => btn.querySelector('span')?.textContent.trim() === '修改',\n                context: dialog,\n                description: '修改按钮',\n                maxRetries: 20,\n                interval: 100\n            });\n\n            if (!modifyBtn) throw new Error('未找到修改按钮');\n            \n            modifyBtn.click();\n            ss_showStatusMessage('已点击修改，等待编辑弹窗...', true);\n            await delay(500);\n\n            if (!ss_isCorrectingCard) throw new Error('操作已取消');\n\n            // 6. 监测编辑弹窗\n            ss_showStatusMessage('监测编辑弹窗...', true);\n            \n            const allDialogs = Array.from(document.querySelectorAll('.el-overlay-dialog'));\n            const editDialog = allDialogs[allDialogs.length - 1];\n            \n            if (!editDialog) throw new Error('未找到编辑弹窗');\n\n            // 查找PIX账号输入框\n            const pixAccountInput = await findElementWithRetry({\n                selector: 'input.el-input__inner[placeholder*=\"请输入PIX账号\"]',\n                context: editDialog,\n                description: 'PIX账号输入框',\n                maxRetries: 20,\n                interval: 100\n            });\n\n            if (!ss_isCorrectingCard) throw new Error('操作已取消');\n\n            // 7. 填写PIX账号\n            ss_showStatusMessage(`填写PIX账号: ${newCardNumber}...`, true);\n            \n            pixAccountInput.focus();\n            await delay(80);\n            \n            pixAccountInput.select();\n            pixAccountInput.value = '';\n            pixAccountInput.value = newCardNumber;\n            \n            pixAccountInput.dispatchEvent(new Event('input', { bubbles: true }));\n            pixAccountInput.dispatchEvent(new Event('change', { bubbles: true }));\n            pixAccountInput.dispatchEvent(new Event('blur', { bubbles: true }));\n            \n            Logger.log(`[修正卡号] PIX账号填充完成: ${newCardNumber}`);\n            await delay(200);\n\n            if (!ss_isCorrectingCard) throw new Error('操作已取消');\n\n            // 8. 查找并点击提交按钮\n            ss_showStatusMessage('查找提交按钮...', true);\n            \n            const submitBtn = await findElementWithRetry({\n                selector: 'button.el-button',\n                filter: btn => btn.textContent.includes('提交'),\n                context: editDialog,\n                description: '提交按钮',\n                maxRetries: 15,\n                interval: 100\n            });\n\n            if (!submitBtn) throw new Error('未找到提交按钮');\n            \n            submitBtn.click();\n            ss_showStatusMessage('已提交，等待成功提示...', true);\n            Logger.log('[修正卡号] 已点击提交按钮');\n            \n            // 严格验证成功提示 - 关键步骤\n            const submitSuccess = await com_waitForSuccessMessage('操作成功！', 15, 100);\n            if (!submitSuccess) {\n                throw new Error('PIX账号提交失败：未检测到成功提示或收到错误提示');\n            }\n            Logger.log('[修正卡号] ✓ PIX账号提交成功');\n            await delay(500);\n\n            if (!ss_isCorrectingCard) throw new Error('操作已取消');\n\n            ss_showStatusMessage('✓ PIX账号更新成功！', true);\n            Logger.log('[修正卡号] ✓ 所有步骤完成');\n\n            if (!ss_isCorrectingCard) throw new Error('操作已取消');\n\n            // 10. 关闭编辑弹窗\n            ss_showStatusMessage('关闭编辑弹窗...', true);\n            await delay(300);\n            \n            const editCloseIcon = editDialog.querySelector('i.el-icon.el-dialog__close');\n            const editCloseBtn = editCloseIcon ? editCloseIcon.closest('button') : null;\n            \n            if (editCloseBtn) {\n                editCloseBtn.click();\n                Logger.log('[修正卡号] 已点击编辑弹窗关闭按钮');\n                await delay(300);\n            }\n\n            // 11. 关闭主弹窗\n            ss_showStatusMessage('关闭主弹窗...', true);\n            \n            const mainCloseIcon = dialog.querySelector('i.el-icon.el-dialog__close');\n            const mainCloseBtn = mainCloseIcon ? mainCloseIcon.closest('button') : null;\n            \n            if (mainCloseBtn) {\n                mainCloseBtn.click();\n                Logger.log('[修正卡号] 已点击主弹窗关闭按钮');\n                await delay(300);\n            }\n\n            ss_showStatusMessage('✓ 修正卡号完成！', true);\n            GM_notification({\n                title: '✓ 修正卡号成功',\n                text: `会员ID: ${memberId}\\n新卡号: ${newCardNumber}`,\n                timeout: 1000\n            });\n\n            Logger.log(`[修正卡号] 第 ${currentAttempt} 次尝试 - 操作完成`);\n            return true;\n\n        } catch (e) {\n            Logger.error(`[修正卡号] 第 ${currentAttempt} 次尝试失败: ${e.message}`);\n            ss_showStatusMessage(`修正卡号失败 (${currentAttempt}/${MAX_RETRY_ATTEMPTS}): ${e.message}`, false);\n\n            // 尝试关闭可能的弹窗\n            try {\n                const openDialogs = document.querySelectorAll('.el-overlay-dialog');\n                openDialogs.forEach(dialog => {\n                    const closeIcon = dialog.querySelector('i.el-icon.el-dialog__close');\n                    const closeBtn = closeIcon ? closeIcon.closest('button') : null;\n                    if (closeBtn) closeBtn.click();\n                });\n            } catch (closeError) {\n                Logger.error('[修正卡号] 关闭弹窗时出错:', closeError);\n            }\n\n            // 重试机制\n            if (currentAttempt < MAX_RETRY_ATTEMPTS) {\n                Logger.log(`[修正卡号] 将在2秒后进行第 ${currentAttempt + 1} 次尝试...`);\n                ss_showStatusMessage(`将在2秒后重试...`, false);\n                await delay(2000);\n                return executeCardCorrectionWithValidation();\n            } else {\n                Logger.error(`[修正卡号] 已达到最大重试次数 ${MAX_RETRY_ATTEMPTS}，放弃`);\n                ss_showStatusMessage(`已达到最大重试次数，操作放弃`, false);\n                return false;\n            }\n        }\n    }\n\n    try {\n        ss_isCorrectingCard = true;\n        ss_toggleCorrectionModeUI(false);\n        const result = await executeCardCorrectionWithValidation();\n        if (!result) {\n            ss_showStatusMessage('修正卡号操作失败，请查看详细日志', false);\n        }\n    } catch (e) {\n        Logger.error('[修正卡号] 外层异常:', e);\n        ss_showStatusMessage(`修正卡号异常: ${e.message}`, false);\n    } finally {\n        ss_isCorrectingCard = false;\n        ss_toggleCorrectionModeUI(true);\n    }\n}\n\n// 新增：严格的成功提示验证函数\nasync function com_waitForSuccessMessage(expectedText = '操作成功！', maxAttempts = 15, interval = 100) {\n    Logger.log(`[成功提示验证] 开始等待: \"${expectedText}\"`);\n    \n    for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n        // 查找所有成功消息\n        const messages = document.querySelectorAll('.el-message.el-message--success');\n        \n        Logger.log(`[成功提示验证] 尝试 ${attempt}/${maxAttempts}: 发现 ${messages.length} 条成功消息`);\n        \n        for (const msg of messages) {\n            const content = msg.querySelector('.el-message__content');\n            if (content) {\n                const text = content.textContent.trim();\n                Logger.log(`[成功提示验证] 检测到消息: \"${text}\"`);\n                \n                // 严格匹配预期的消息文本\n                if (text === expectedText) {\n                    Logger.log(`[成功提示验证] ✓ 匹配成功！`);\n                    // 等待消息消失\n                    await delay(500);\n                    return true;\n                } else {\n                    Logger.warn(`[成功提示验证] ✗ 消息不匹配，期望: \"${expectedText}\", 实际: \"${text}\"`);\n                    return false;\n                }\n            }\n        }\n        \n        if (attempt < maxAttempts) {\n            await delay(interval);\n        }\n    }\n    \n    Logger.error(`[成功提示验证] ✗ 在 ${maxAttempts} 次尝试后未找到预期的成功提示`);\n    return false;\n}\n\n    // 控制UI元素禁用/启用状态的函数\n    function ss_toggleCorrectionModeUI(enabled) {\n        const panel = document.getElementById('ss-member-panel');\n        if (!panel) return;\n\n        const buttons = panel.querySelectorAll('button:not(.ss-close-btn):not(.ss-cancel-btn)');\n        buttons.forEach(btn => btn.disabled = !enabled);\n\n        const inputs = panel.querySelectorAll('input.ss-id-input');\n        inputs.forEach(input => input.disabled = !enabled);\n\n        const expandInputBtn = document.getElementById('ss-expand-input-btn');\n        if (expandInputBtn) expandInputBtn.disabled = !enabled;\n\n        const floatingBtn = document.querySelector('.ss-floating-btn');\n        if (floatingBtn) floatingBtn.style.display = enabled ? 'flex' : 'none';\n\n        const correctCardBtnContainer = document.getElementById('ss-correct-card-btn-container');\n        if (correctCardBtnContainer) {\n            let cancelBtn = document.getElementById('ss-cancel-card-correction-btn');\n            if (enabled) {\n                if (cancelBtn) cancelBtn.remove();\n            } else {\n                if (!cancelBtn) {\n                    cancelBtn = document.createElement('button');\n                    cancelBtn.id = 'ss-cancel-card-correction-btn';\n                    cancelBtn.className = 'ss-cancel-btn';\n                    cancelBtn.innerHTML = `\n                        <svg viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm192 612.6L612.6 704 512 603.4 411.4 704 310.6 612.6 411.4 512 310.6 411.4 411.4 310.6 512 411.4 612.6 310.6 704 411.4 603.4 512l100.6 100.6z\" fill=\"white\"></path>\n                        </svg>\n                        取消\n                    `;\n                    cancelBtn.addEventListener('click', () => {\n                        ss_isCorrectingCard = false;\n                        ss_showStatusMessage('修正卡号操作已手动取消。', false);\n                        ss_toggleCorrectionModeUI(true);\n                        const dialogs = document.querySelectorAll('.el-overlay-dialog');\n                        dialogs.forEach(dialog => {\n                            const closeIcon = dialog.querySelector('i.el-icon.el-dialog__close');\n                            const closeBtn = closeIcon ? closeIcon.closest('button') : null;\n                            if (closeBtn) closeBtn.click();\n                        });\n                    });\n                    correctCardBtnContainer.appendChild(cancelBtn);\n                }\n            }\n        }\n    }\n\n    // 🔄 改进的修正卡号触发函数 (新版完整实现)\n    async function ss_correctCardNumber() {\n        if (ss_isCorrectingCard) {\n            ss_showStatusMessage('修正卡号操作正在进行中，请勿重复点击或先取消。', false);\n            return;\n        }\n\n        // 获取额外输入框中的卡号\n        const extraInput = document.getElementById('ss-extra-input');\n        let cardNumber = extraInput ? extraInput.value.trim() : '';\n\n        cardNumber = cardNumber.replace(/\\D/g, '');\n\n        if (!cardNumber || cardNumber.length !== 11) {\n            ss_showStatusMessage('请输入11位纯数字卡号', false);\n            return;\n        }\n\n        // 获取主输入框中的会员ID - 使用当前值，不依赖之前保存的值\n        const memberIdInput = document.getElementById('ss-member-id');\n        const memberId = memberIdInput ? memberIdInput.value.trim() : '';\n\n        if (!memberId || memberId.length !== 8 || !/^\\d+$/.test(memberId)) {\n            ss_showStatusMessage('请在会员信息输入框输入有效的8位会员ID', false);\n            return;\n        }\n\n        // 保存当前要修正的信息到全局变量，而不是GM_setValue\n        ss_isCorrectingCard = true;\n        ss_toggleCorrectionModeUI(false);\n\n        ss_showStatusMessage(`正在准备为会员 ${memberId} 修正卡号为 ${cardNumber}...`, true);\n        \n        ss_showStatusMessage('正在跳转提现管理页面...', true);\n        \n        try {\n            // 🔧 同步 auto_kuayutongxun.txt 的修复：使用 findTabByTextInScrollbar 函数查找\"提现订单列表\"按键\n            const tab = findTabByTextInScrollbar('提现订单列表');\n            if (!tab) {\n                Logger.error('Script: 提现订单列表按键未找到');\n                ss_showStatusMessage('操作失败: 提现订单列表按键未找到，请确保页面已完全加载或尝试刷新', false);\n                ss_isCorrectingCard = false;\n                ss_toggleCorrectionModeUI(true);\n                return;\n            }\n            \n            Logger.log('Script: 找到提现订单列表按键，准备点击');\n            tab.click();\n            \n            // 🔧 同步 auto_kuayutongxun.txt 的修复：等待300ms后直接执行搜索操作\n            await delay(300);\n\n            // 在提现页面进行搜索 - 直接使用 memberId 和 cardNumber，不依赖任何保存的值\n            await ss_searchInWithdrawPage(memberId, cardNumber);\n\n            // 执行修正卡号操作\n            await ss_performCardCorrectionInWithdrawPage(memberId, cardNumber);\n        } catch (e) {\n            ss_showStatusMessage(`跳转提现页面失败: ${e.message}`, false);\n            ss_isCorrectingCard = false;\n            ss_toggleCorrectionModeUI(true);\n        }\n    }\n\n    async function ss_creditScoreRefusal() {\n        // 获取额外输入框中的拒款原因\n        const extraInput = document.getElementById('ss-extra-input');\n        const refusalReason = extraInput ? extraInput.value.trim() : '';\n        if (!refusalReason) {\n            ss_showStatusMessage('请输入拒款原因', false);\n            return;\n        }\n\n        // 获取主输入框中的会员ID - 使用当前值\n        const memberIdInput = document.getElementById('ss-member-id');\n        const memberId = memberIdInput ? memberIdInput.value.trim() : '';\n\n        if (!memberId || memberId.length !== 8 || !/^\\d+$/.test(memberId)) {\n            ss_showStatusMessage('请在会员信息输入框输入有效的8位会员ID', false);\n            return;\n        }\n\n        ss_currentMemberId = memberId;\n\n        ss_showStatusMessage(`正在为会员 ${ss_currentMemberId} 执行信誉分拒款，原因: ${refusalReason}...`, true);\n        GM_notification({\n            title: '信誉分拒款',\n            text: `模拟：会员 ${ss_currentMemberId} 已因信誉分拒款，原因: ${refusalReason}`,\n            timeout: 5000\n        });\n    }\n\n    function ss_updateProgressBar(p) { const bar = document.getElementById('ss-progress-bar'); if (bar) bar.style.width = `${p}%`; }\n\n    // --- Salesmartly Helper UI 初始化 ---\nfunction ss_initializeCoreUI() {\n    if (document.getElementById('ss-member-panel')) return;\n\n    const panel = document.createElement('div');\n    panel.id = 'ss-member-panel';\n    panel.innerHTML = `\n        <div class=\"ss-panel-main-wrapper\">\n            <div class=\"ss-panel-header\">\n                <span>会员ID/手机/账号查询工具</span>\n                <button class=\"ss-close-btn\">×</button>\n            </div>\n            <div class=\"ss-panel-body\">\n                <div class=\"ss-input-group\">\n                    <label class=\"ss-input-label\">\n                        <div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 10px;\">\n                            <input type=\"checkbox\" id=\"ss-auto-extract-toggle\" class=\"ss-auto-extract-checkbox\" title=\"启用自动提取8位ID\">\n                            <span style=\"font-weight: 500; color: #409eff; font-size: 15px;\">ID</span>\n                            <span style=\"color: #909399; font-size: 12px;\">(启用自动提取)</span>\n                        </div>\n                        请输入8位会员ID、${SS_MIN_PHONE_LEN}~${SS_MAX_PHONE_LEN}位手机号码或G+账号\n                    </label>\n                    <div class=\"ss-input-with-expand-btn\">\n                        <input type=\"text\" class=\"ss-id-input\" id=\"ss-member-id\" placeholder=\"例如:12345678, 13800138000 或 G12345678\" maxlength=\"${SS_MAX_PHONE_LEN + 1}\">\n                        <button class=\"ss-expand-input-btn\" id=\"ss-expand-input-btn\">▶</button>\n                    </div>\n                    <div class=\"ss-input-error-tip\" id=\"ss-input-error-tip\"></div>\n                </div>\n                <button class=\"ss-submit-btn\" id=\"ss-submit-btn\">提交</button>\n                <div class=\"ss-reset-btn-group\" style=\"margin-top:16px;display:none;justify-content:space-between;\">\n                    <button class=\"ss-submit-btn\" id=\"ss-reset-login-btn\" style=\"width:48%;\">重置登录密码</button>\n                    <button class=\"ss-submit-btn\" id=\"ss-reset-withdraw-btn\" style=\"width:48%;\">重置提款密码</button>\n                </div>\n                <div class=\"ss-result-container\" id=\"ss-result-container\" style=\"display:none;\">\n                    <div class=\"ss-result-title\">\n                        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z\" stroke=\"#409eff\" stroke-width=\"2\"/><path d=\"M12 16V12\" stroke=\"#409eff\" stroke-width=\"2\" stroke-linecap=\"round\"/><path d=\"M12 8H12.01\" stroke=\"#409eff\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>\n                        会员信息\n                    </div>\n                    <div class=\"ss-result-content\">\n                        <div class=\"ss-result-item\"><span class=\"ss-result-label\">搜索值:</span><span class=\"ss-copyable\" id=\"ss-result-id\">-</span></div>\n                        <div class=\"ss-result-item\"><span class=\"ss-result-label\">VIP等级：</span><span class=\"ss-result-value ss-vip-value\" id=\"ss-result-vip\">-</span></div>\n                        <div class=\"ss-result-item\"><span class=\"ss-result-label\">账户余额：</span><span class=\"ss-result-value\" id=\"ss-result-balance\">-</span></div>\n                        <div class=\"ss-result-item\"><span class=\"ss-result-label\">会员状态：</span><span class=\"ss-result-value\" id=\"ss-result-status\">-</span></div>\n                    </div>\n                    <div class=\"ss-vip2-action\" id=\"ss-vip2-action\" style=\"display:none;\">\n                        检测到VIP2等级，正在跳转提现管理页面...\n                        <div class=\"ss-progress-container\"><div class=\"ss-progress-bar\" id=\"ss-progress-bar\"></div></div>\n                    </div>\n                    <div class=\"ss-order-status\" id=\"ss-order-status\" style=\"display:none;\">\n                        <div class=\"ss-result-item\"><span class=\"ss-result-label\">最新订单状态：</span></div>\n                        <div class=\"ss-order-status-value\" id=\"ss-order-status-value\">-</div>\n                    </div>\n                    <button class=\"ss-return-btn\" id=\"ss-return-btn\">返回所有会员页面</button>\n                </div>\n                <div class=\"ss-status-message\" id=\"ss-status-message\"></div>\n            </div>\n        </div>\n        <div id=\"ss-expanded-actions\" class=\"ss-expanded-actions\">\n            <div class=\"ss-input-group\">\n                <label class=\"ss-input-label\">额外操作输入</label>\n                <input type=\"text\" class=\"ss-id-input\" id=\"ss-extra-input\" placeholder=\"正确提款账号\">\n            </div>\n            <div style=\"display:flex; align-items:center; width:100%;\" id=\"ss-correct-card-btn-container\">\n                <button class=\"ss-submit-btn\" id=\"ss-correct-card-btn\" style=\"flex-grow:1;\">修正卡号</button>\n            </div>\n            <button class=\"ss-submit-btn\" id=\"ss-credit-refusal-btn\">信誉分拒款</button>\n        </div>`;\n    document.body.appendChild(panel);\n    ss_panelInstance = panel;\n\n    const floatingBtn = document.createElement('div');\n    floatingBtn.className = 'ss-floating-btn';\n    floatingBtn.innerHTML = 'ID';\n    floatingBtn.title = '打开查询工具';\n    document.body.appendChild(floatingBtn);\n\n    floatingBtn.addEventListener('click', () => { panel.style.display = 'flex'; document.getElementById('ss-member-id').focus(); });\n    panel.querySelector('.ss-close-btn').addEventListener('click', () => panel.style.display = 'none');\n    document.getElementById('ss-submit-btn').addEventListener('click', () => ss_executeOperation());\n    document.getElementById('ss-member-id').addEventListener('keypress', e => { if (e.key === 'Enter') ss_executeOperation(); });\n    document.getElementById('ss-reset-login-btn').addEventListener('click', () => ss_resetPassword('login'));\n    document.getElementById('ss-reset-withdraw-btn').addEventListener('click', () => ss_resetPassword('withdraw'));\n    document.getElementById('ss-return-btn').addEventListener('click', ss_returnToAllMembersPage);\n\n    // ===== 新增：ID自动提取功能 =====\n    const autoExtractToggle = document.getElementById('ss-auto-extract-toggle');\n    const memberIdInput = document.getElementById('ss-member-id');\n    const errorTipElement = document.getElementById('ss-input-error-tip');\n\n    // 从GM存储中恢复复选框状态\n    const savedToggleState = GM_getValue('ss_auto_extract_enabled', false);\n    autoExtractToggle.checked = savedToggleState;\n\n    // 复选框变化事件\n    autoExtractToggle.addEventListener('change', (e) => {\n        const isEnabled = e.target.checked;\n        GM_setValue('ss_auto_extract_enabled', isEnabled);\n        Logger.log(`[自动提取] 功能已${isEnabled ? '启用' : '禁用'}`);\n        \n        // 清除错误提示\n        ss_clearInputError();\n        \n        ss_showStatusMessage(`ID自动提取已${isEnabled ? '启用' : '禁用'}`, true);\n    });\n\n    // 粘贴事件监听\n    memberIdInput.addEventListener('paste', async (e) => {\n        if (!autoExtractToggle.checked) {\n            Logger.log('[自动提取] 功能未启用，允许正常粘贴');\n            ss_clearInputError();\n            return;\n        }\n\n        // 阻止默认粘贴行为\n        e.preventDefault();\n\n        // 获取粘贴的内容\n        const pastedText = (e.clipboardData || window.clipboardData).getData('text');\n        \n        if (!pastedText) {\n            Logger.warn('[自动提取] 粘贴内容为空');\n            ss_showStatusMessage('粘贴内容为空', false);\n            ss_setInputError('粘贴内容为空');\n            return;\n        }\n\n        Logger.log(`[自动提取] 原始粘贴内容: \"${pastedText}\"`);\n\n        // 提取所有连续数字序列\n        const result = ss_extractDigitSequence(pastedText);\n\n        Logger.log(`[自动提取] 处理结果:`, result);\n\n        if (result.isValid && result.extractedValue) {\n            // 有效的8位数字\n            memberIdInput.value = result.extractedValue;\n            memberIdInput.dispatchEvent(new Event('input', { bubbles: true }));\n            memberIdInput.dispatchEvent(new Event('change', { bubbles: true }));\n            ss_clearInputError();\n            Logger.log(`[自动提取] ✓ 成功提取: \"${result.extractedValue}\"`);\n            ss_showStatusMessage(`✓ 自动提取成功: ${result.extractedValue}`, true);\n        } else {\n            // 非8位数字 或 多于8位数字\n            memberIdInput.value = result.extractedValue;\n            memberIdInput.dispatchEvent(new Event('input', { bubbles: true }));\n            memberIdInput.dispatchEvent(new Event('change', { bubbles: true }));\n            ss_setInputError(result.errorMessage);\n            Logger.warn(`[自动提取] ✗ 错误: ${result.errorMessage}`);\n            ss_showStatusMessage(`⚠️ ${result.errorMessage}`, false);\n        }\n    });\n\n    // 在输入框获得焦点时清除错误提示\n    memberIdInput.addEventListener('focus', () => {\n        ss_clearInputError();\n    });\n\n    // 在输入框内容改变时检查错误状态\n    memberIdInput.addEventListener('input', () => {\n        if (memberIdInput.classList.contains('ss-input-error')) {\n            // 如果当前有错误，检查是否需要清除\n            const currentValue = memberIdInput.value.trim();\n            if (currentValue === '' || /^\\d{8}$/.test(currentValue) || /^[gG]\\d+$/.test(currentValue) || \n                (currentValue.length >= SS_MIN_PHONE_LEN && currentValue.length <= SS_MAX_PHONE_LEN && /^\\d+$/.test(currentValue))) {\n                ss_clearInputError();\n            }\n        }\n    });\n\n    const expandInputBtn = document.getElementById('ss-expand-input-btn');\n    const expandedActions = document.getElementById('ss-expanded-actions');\n    const correctCardBtn = document.getElementById('ss-correct-card-btn');\n    const creditRefusalBtn = document.getElementById('ss-credit-refusal-btn');\n    const ssPanelMainWrapper = panel.querySelector('.ss-panel-main-wrapper');\n\n    let isExpanded = false;\n    expandInputBtn.addEventListener('click', () => {\n        isExpanded = !isExpanded;\n        if (isExpanded) {\n            expandedActions.style.display = 'flex';\n            panel.style.width = SS_PANEL_EXPANDED_WIDTH;\n            ssPanelMainWrapper.style.width = SS_PANEL_DEFAULT_WIDTH;\n            expandInputBtn.textContent = '◀';\n        } else {\n            expandedActions.style.display = 'none';\n            panel.style.width = SS_PANEL_DEFAULT_WIDTH;\n            expandInputBtn.textContent = '▶';\n        }\n    });\n\n    correctCardBtn.addEventListener('click', ss_correctCardNumber);\n    creditRefusalBtn.addEventListener('click', ss_creditScoreRefusal);\n\n    ss_makePanelDraggable(panel);\n}\n\n\n// 新增：清除输入框错误状态函数\nfunction ss_clearInputError() {\n    const memberIdInput = document.getElementById('ss-member-id');\n    const errorTipElement = document.getElementById('ss-input-error-tip');\n    \n    if (memberIdInput) {\n        memberIdInput.classList.remove('ss-input-error');\n    }\n    \n    if (errorTipElement) {\n        errorTipElement.classList.remove('show');\n        errorTipElement.innerHTML = '';\n    }\n}\n\n// 新增：设置输入框错误状态函数\nfunction ss_setInputError(errorMessage) {\n    const memberIdInput = document.getElementById('ss-member-id');\n    const errorTipElement = document.getElementById('ss-input-error-tip');\n    \n    if (memberIdInput) {\n        memberIdInput.classList.add('ss-input-error');\n    }\n    \n    if (errorTipElement) {\n        errorTipElement.classList.add('show');\n        errorTipElement.innerHTML = `<strong>⚠️ 输入异常:</strong> ${errorMessage}`;\n    }\n}\n\n// 新增：智能提取数字序列的函数\nfunction ss_extractDigitSequence(text) {\n    if (!text || typeof text !== 'string') {\n        Logger.warn('[提取函数] 输入文本无效');\n        return {\n            isValid: false,\n            extractedValue: '',\n            errorMessage: '粘贴内容无效'\n        };\n    }\n\n    // 移除所有空格和换行符\n    const cleanedText = text.trim();\n    \n    Logger.log(`[提取函数] 清理后文本: \"${cleanedText}\"`);\n\n    // 使用正则表达式查找所有连续数字序列（可能是任意长度）\n    const digitPattern = /\\d+/g;\n    const allDigitSequences = cleanedText.match(digitPattern);\n\n    if (!allDigitSequences || allDigitSequences.length === 0) {\n        Logger.log('[提取函数] 未找到任何数字序列');\n        return {\n            isValid: false,\n            extractedValue: '',\n            errorMessage: '粘贴内容中没有数字'\n        };\n    }\n\n    Logger.log(`[提取函数] 找到的所有数字序列: ${allDigitSequences.join(', ')}`);\n\n    // 检查是否存在紧挨着的数字（即一个连续的数字序列）\n    if (allDigitSequences.length === 1) {\n        const digitSeq = allDigitSequences[0];\n        Logger.log(`[提取函数] 检测到单一数字序列: \"${digitSeq}\" (长度: ${digitSeq.length})`);\n\n        if (digitSeq.length === 8) {\n            // 完美的8位数字\n            Logger.log(`[提取函数] ✓ 完美匹配8位数字: \"${digitSeq}\"`);\n            return {\n                isValid: true,\n                extractedValue: digitSeq,\n                errorMessage: null\n            };\n        } else if (digitSeq.length < 8) {\n            // 少于8位\n            Logger.warn(`[提取函数] ✗ 数字不足: 仅${digitSeq.length}位`);\n            return {\n                isValid: false,\n                extractedValue: digitSeq,\n                errorMessage: `输入的数字仅有 <strong>${digitSeq.length} 位</strong>，需要 8 位会员ID、${SS_MIN_PHONE_LEN}~${SS_MAX_PHONE_LEN}位手机号码或G+账号`\n            };\n        } else {\n            // 多于8位\n            Logger.warn(`[提取函数] ✗ 数字过多: ${digitSeq.length}位`);\n            return {\n                isValid: false,\n                extractedValue: digitSeq,\n                errorMessage: `输入的数字有 <strong>${digitSeq.length} 位</strong>，不符合规范。需要 8 位会员ID、${SS_MIN_PHONE_LEN}~${SS_MAX_PHONE_LEN}位手机号码或G+账号`\n            };\n        }\n    } else {\n        // 多个数字序列 - 找到第一个8位的，或返回最长的\n        Logger.log(`[提取函数] 检测到多个数字序列，共 ${allDigitSequences.length} 个`);\n\n        // 首先尝试找8位的\n        const eightDigitSeq = allDigitSequences.find(seq => seq.length === 8);\n        if (eightDigitSeq) {\n            Logger.log(`[提取函数] ✓ 在多个序列中找到8位数字: \"${eightDigitSeq}\"`);\n            return {\n                isValid: true,\n                extractedValue: eightDigitSeq,\n                errorMessage: null\n            };\n        }\n\n        // 如果没有8位的，返回第一个序列（并标记为错误）\n        const firstSeq = allDigitSequences[0];\n        Logger.warn(`[提取函数] ✗ 多个序列中未找到8位数字，返回第一个: \"${firstSeq}\" (${firstSeq.length}位)`);\n        \n        const allSeqsInfo = allDigitSequences.map(seq => `${seq}(${seq.length}位)`).join('、');\n        \n        return {\n            isValid: false,\n            extractedValue: firstSeq,\n            errorMessage: `检测到多个数字序列: ${allSeqsInfo}。需要单个 8 位会员ID、${SS_MIN_PHONE_LEN}~${SS_MAX_PHONE_LEN}位手机号码或G+账号`\n        };\n    }\n}\n\n\n\n\n\n\n    function ss_makePanelDraggable(panel) {\n        const header = panel.querySelector('.ss-panel-header');\n        let dragging = false, offsetX, offsetY;\n        header.addEventListener('mousedown', e => {\n            if (e.button !== 0 || ss_isCorrectingCard) return;\n            dragging = true;\n            offsetX = e.clientX - panel.getBoundingClientRect().left;\n            offsetY = e.clientY - panel.getBoundingClientRect().top;\n            panel.style.cursor = 'grabbing'; panel.style.transition = 'none';\n        });\n        document.addEventListener('mousemove', e => {\n            if (!dragging) return;\n            let x = e.clientX - offsetX, y = e.clientY - offsetY;\n            x = Math.max(0, Math.min(x, window.innerWidth - panel.offsetWidth));\n            y = Math.max(0, Math.min(y, window.innerHeight - panel.offsetHeight));\n            panel.style.left = `${x}px`; panel.style.top = `${y}px`; panel.style.transform = 'none';\n        });\n        document.addEventListener('mouseup', () => {\n            if (dragging) {\n                dragging = false;\n                panel.style.cursor = 'default'; panel.style.transition = 'width .3s ease, transform .3s ease';\n                GM_setValue(SS_PANEL_POSITION_KEY, { left: panel.style.left, top: panel.style.top });\n            }\n        });\n        const saved = GM_getValue(SS_PANEL_POSITION_KEY, null);\n        if (saved) {\n            panel.style.left = saved.left; panel.style.top = saved.top; panel.style.transform = 'none';\n        }\n    }\n\n    // --- 修复的关键函数：提现管理页面初始化 - 只处理VIP2自动查询，不处理卡号修正 ---\n    async function ss_withdrawManagePageInit() {\n        if (ss_withdrawManagePageInitialized) return;\n        ss_withdrawManagePageInitialized = true;\n        Logger.log('Script: Initializing for /finance-center/withdraw-manage page.');\n        \n        // 只处理VIP2自动填充和搜索，不处理卡号修正\n        const pendingId = GM_getValue(SS_TARGET_MEMBER_ID_KEY, '');\n        if (pendingId) {\n            Logger.log(`Script: Pending ID found for withdraw page: ${pendingId}. Auto-filling...`);\n            await ss_autoFillWithdrawPage(pendingId);\n            // 清除此ID，确保不会重复使用\n            GM_deleteValue(SS_TARGET_MEMBER_ID_KEY);\n        }\n    }\n\n    async function ss_allMemberPageInit() {\n        if (ss_allMemberPageInitialized) return;\n        ss_allMemberPageInitialized = true;\n        Logger.log('Script: Initializing for /user-manage/all-member page.');\n        const pendingValue = GM_getValue(SS_PENDING_OPERATION_KEY, '');\n        if (pendingValue) {\n            Logger.log(`Script: Pending operation found: ${pendingValue}.`);\n            if (ss_panelInstance) ss_panelInstance.style.display = 'flex';\n            const memberIdInput = document.getElementById('ss-member-id');\n            if (memberIdInput) {\n                memberIdInput.value = pendingValue;\n                ss_showStatusMessage(`检测到待处理查询，正在执行: ${pendingValue}`);\n                await delay(500); // 等待UI显示待处理消息，确保用户可以看到\n                ss_executeOperation();\n            }\n        }\n    }\n\n    // --- Salesmartly Helper 路由/路径变化处理器 ---\n    function ss_handlePathChange() {\n        const path = window.location.pathname;\n\n        if (path === '/user-manage/all-member') {\n            if (!ss_allMemberPageInitialized && (document.querySelector('.el-table__header-wrapper') || document.querySelector('.el-input__inner[placeholder*=\"会员ID\"]'))) {\n                ss_allMemberPageInit();\n            }\n        } else {\n            ss_allMemberPageInitialized = false;\n        }\n\n        if (path === '/finance-center/withdraw-manage') {\n            if (!ss_withdrawManagePageInitialized && (document.querySelector('.el-table__header-wrapper') || document.querySelector('.el-input__inner[placeholder*=\"会员ID\"]'))) {\n                ss_withdrawManagePageInit();\n            }\n        } else {\n            ss_withdrawManagePageInitialized = false;\n        }\n    }\n\n    // --- Cross-Domain Communication Logger ---\n    const Logger = {\n        KEY: 'com_console_logging_enabled',\n        isConsoleLoggingEnabled: false,\n        init() { this.isConsoleLoggingEnabled = GM_getValue(this.KEY, false); },\n        toggle() { this.isConsoleLoggingEnabled = !this.isConsoleLoggingEnabled; GM_setValue(this.KEY, this.isConsoleLoggingEnabled); if (this.isConsoleLoggingEnabled) { console.log('[通信脚本] 控制台日志已开启。'); } return this.isConsoleLoggingEnabled; },\n        log(...args) { if (this.isConsoleLoggingEnabled) { console.log('[通信脚本]', ...args); } },\n        error(...args) { if (this.isConsoleLoggingEnabled) { console.error('[通信脚本]', ...args); } },\n        warn(...args) { if (this.isConsoleLoggingEnabled) { console.warn('[通信脚本]', ...args); } }\n    };\n\n    // --- Cross-Domain Communication Domain Config ---\n    const DomainConfig = {\n        FRONTEND_KEY:'frontend_domains',\n        BACKEND_KEY :'backend_domains',\n        getFrontendDomains(){ const s=GM_getValue(this.FRONTEND_KEY,''); return s? s.split(','): []; },\n        getBackendDomains(){  const s=GM_getValue(this.BACKEND_KEY,''); return s? s.split(','): []; },\n        addDomain(domain,isFront){\n            const key = isFront? this.FRONTEND_KEY: this.BACKEND_KEY;\n            const arr = GM_getValue(key,'').split(',').filter(Boolean);\n            if (!arr.includes(domain)) { arr.push(domain); GM_setValue(key, arr.join(',')); return true; }\n            return false;\n        },\n        initMenuCommands(){\n            const self = this;\n            GM_registerMenuCommand('添加前台域名',()=>{ const d = prompt('请输入前台域名 (客服系统):', location.hostname); if (d && self.addDomain(d, true)) alert(`已添加前台域名: ${d}`); });\n            GM_registerMenuCommand('添加后台域名',()=>{ const d = prompt('请输入后台域名 (管理系统):', location.hostname); if (d && self.addDomain(d, false)) alert(`已添加后台域名: ${d}`); });\n            GM_registerMenuCommand('查看域名配置',()=>{ alert(`前台(客服):\\n${self.getFrontendDomains().join('\\n')||'无'}\\n\\n后台(管理):\\n${self.getBackendDomains().join('\\n')||'无'}`); });\n            GM_registerMenuCommand('重置域名配置',()=>{ if (confirm('确定重置所有域名配置？')) { GM_setValue(self.FRONTEND_KEY,''); GM_setValue(self.BACKEND_KEY,''); GM_deleteValue(COM_CHAT_IS_MINIMIZED_KEY); GM_deleteValue(COM_FLOATING_CHAT_POSITION_KEY); alert('域名配置及通信窗口状态已重置'); } });\n            GM_registerMenuCommand('‼️ 清理通信缓存', () => {\n                if (confirm('这将清除当前的会话ID和消息历史，用于解决连接问题。确定吗？')) {\n                    const sid = GM_getValue('current_session_id');\n                    if (sid) { GM_deleteValue(sid); }\n                    GM_deleteValue('current_session_id');\n                    GM_deleteValue('last_message_id');\n                    alert('通信缓存已清理。请刷新页面。');\n                    location.reload();\n                }\n            });\n            GM_registerMenuCommand('切换控制台日志', () => {\n                const enabled = Logger.toggle();\n                GM_notification({\n                    title: '通信脚本日志',\n                    text: `控制台日志已${enabled ? '开启' : '关闭'}。`,\n                    timeout: 2000\n                });\n            });\n        }\n    };\n\n    // --- Cross-Domain Communication 初始化 ---\n    function com_init() {\n        Logger.init();\n        DomainConfig.initMenuCommands();\n\n        const host = location.hostname;\n        const fds = DomainConfig.getFrontendDomains();\n        const bds = DomainConfig.getBackendDomains();\n\n        if (fds.includes(host)) com_currentDomain = 'salesmartly';\n        else if (bds.includes(host)) com_currentDomain = 'admin';\n        else {\n            const isFront = confirm(`检测到新域名: ${host}\\n\\n确定=前台客服，取消=后台管理`);\n            if (DomainConfig.addDomain(host, isFront)) { alert(`已添加域名 ${host} 为${isFront?'前台客服':'后台管理'}，刷新中...`); setTimeout(()=> location.reload(), 800); }\n            return;\n        }\n\n        com_pageVersion = com_detectPageVersion();\n        Logger.log(`[系统] 检测到页面版本: ${com_pageVersion}, 域名: ${com_currentDomain}`);\n\n        const floatingWindow = document.createElement('div');\n        floatingWindow.id = 'com-floating-chat-window';\n        floatingWindow.innerHTML = `\n            <div class=\"com-header\">\n                <span id=\"com-chat-title\">${com_currentDomain === 'salesmartly' ? '客服端' : '管理后台'}</span>\n                <div class=\"com-header-controls\">\n                    <button class=\"com-minimize-btn\">−</button>\n                </div>\n            </div>\n            <div class=\"com-content\" id=\"com-message-area\"></div>\n            <div class=\"com-query-status\" id=\"com-query-status\">请选择会员ID或手机号码开始查询</div>\n        `;\n        document.body.appendChild(floatingWindow);\n\n        const floatingHeader = floatingWindow.querySelector('.com-header');\n        const messageArea = floatingWindow.querySelector('#com-message-area');\n        const statusDiv = floatingWindow.querySelector('#com-query-status');\n        const comMinimizeBtn = floatingWindow.querySelector('.com-minimize-btn');\n        const headerControls = floatingWindow.querySelector('.com-header-controls');\n\n        com_makeDraggableAndResizable(floatingWindow, floatingHeader);\n\n        com_isMinimized = GM_getValue(COM_CHAT_IS_MINIMIZED_KEY, false);\n        const savedPosition = GM_getValue(COM_FLOATING_CHAT_POSITION_KEY, null);\n\n        if (com_isMinimized) {\n            floatingWindow.classList.add('minimized');\n            comMinimizeBtn.textContent = '□';\n            floatingWindow.style.resize = 'none';\n        } else {\n            comMinimizeBtn.textContent = '−';\n            floatingWindow.style.resize = 'both';\n        }\n\n        if (savedPosition) {\n            floatingWindow.style.left = savedPosition.left;\n            floatingWindow.style.top = savedPosition.top;\n            floatingWindow.style.width = savedPosition.width;\n            floatingWindow.style.height = savedPosition.height;\n            floatingWindow.style.right = 'auto';\n            floatingWindow.style.bottom = 'auto';\n        } else {\n            floatingWindow.style.right = '20px';\n            floatingWindow.style.bottom = '20px';\n            floatingWindow.style.width = COM_DEFAULT_FLOATING_WIDTH;\n            floatingWindow.style.height = COM_DEFAULT_FLOATING_HEIGHT;\n            floatingWindow.style.left = 'auto';\n            floatingWindow.style.top = 'auto';\n        }\n\n        comMinimizeBtn.addEventListener('click', () => {\n            com_toggleMinimizeMaximize(floatingWindow, comMinimizeBtn);\n        });\n\n        function createLogToggleButton() {\n            const btn = document.createElement('button');\n            btn.className = 'com-toggle-log-btn';\n            const updateText = () => { btn.textContent = Logger.isConsoleLoggingEnabled ? '日志:开' : '日志:关'; };\n            btn.addEventListener('click', (e) => { e.stopPropagation(); Logger.toggle(); updateText(); });\n            updateText();\n            return btn;\n        }\n        const logToggleBtn = createLogToggleButton();\n\n        function createDisplayMessageFunction(contentDiv) {\n            return function(msg, isNew = true, isSys = false) {\n                const div = document.createElement('div');\n                div.className = 'com-message' + (isNew ? ' com-new-message' : '') + (isSys ? ' com-system-message' : '');\n                const html = msg.replace(/(\\d{7,8}(?:\\s+\\S+)?)/g, m => `<span class=\"com-copy-id\" data-id=\"${m.trim()}\">${m}</span>`);\n                div.innerHTML = `<div>${html}</div><div class=\"com-message-time\">${new Date().toLocaleTimeString()}</div>`;\n                div.querySelectorAll('.com-copy-id').forEach(el => {\n                    el.addEventListener('click', e => {\n                        const id = e.target.dataset.id;\n                        navigator.clipboard.writeText(id).then(() => {\n                            e.target.classList.add('copied');\n                            setTimeout(() => e.target.classList.remove('copied'), 1000);\n                            if (com_currentDomain === 'salesmartly') {\n                                if (com_pageVersion === 'new') {\n                                    com_handleCustomerSystemIdCopyNew(id);\n                                } else {\n                                    com_handleCustomerSystemIdCopyOld(id);\n                                }\n                            }\n                        });\n                    });\n                });\n                contentDiv.appendChild(div);\n\n                if (contentDiv.children.length > COM_DISPLAY_MESSAGE_LIMIT) {\n                    contentDiv.removeChild(contentDiv.firstChild);\n                }\n\n                contentDiv.scrollTop = contentDiv.scrollHeight;\n            };\n        }\n\n        function displayResultCard(data) {\n            const card = document.createElement('div');\n            card.className = 'com-result-card com-new-message';\n            card.innerHTML = `\n                <div class=\"com-card-item\"><span class=\"com-card-label\">搜索值:</span><span class=\"com-card-value com-copy-id\" data-id=\"${data.displayId}\">${data.displayId}</span></div>\n                <div class=\"com-card-item\"><span class=\"com-card-label\">VIP等级:</span><span class=\"com-card-value vip\">${data.vipLevel}</span></div>\n                <div class=\"com-card-item\"><span class=\"com-card-label\">账户余额:</span><span class=\"com-card-value\">${data.balance}</span></div>\n                <div class=\"com-card-item\"><span class=\"com-card-label\">会员状态:</span><span class=\"com-card-value status-${data.status === '正常' ? 'ok' : 'warn'}\">${data.status}</span></div>\n                <div class=\"com-card-item\"><span class=\"com-card-label\">总充值:</span><span class=\"com-card-value\">${data.totalRecharge}</span></div>\n                <div class=\"com-card-item\"><span class=\"com-card-label\">提现状态:</span><span class=\"com-card-value order-status ${com_getStatusClass(data.latestOrderStatus)}\">${data.latestOrderStatus}</span></div>\n            `;\n            messageArea.appendChild(card);\n\n            card.querySelectorAll('.com-copy-id').forEach(el => {\n                el.addEventListener('click', e => {\n                    const id = e.target.dataset.id;\n                    navigator.clipboard.writeText(id).then(() => {\n                        e.target.classList.add('copied');\n                        setTimeout(() => e.target.classList.remove('copied'), 1000);\n                        if (com_currentDomain === 'salesmartly') {\n                            if (com_pageVersion === 'new') {\n                                com_handleCustomerSystemIdCopyNew(id);\n                            } else {\n                                com_handleCustomerSystemIdCopyOld(id);\n                            }\n                        }\n                    });\n                });\n            });\n\n            if (messageArea.children.length > COM_DISPLAY_MESSAGE_LIMIT) {\n                messageArea.removeChild(messageArea.firstChild);\n            }\n            messageArea.scrollTop = messageArea.scrollHeight;\n        }\n\n        function com_getStatusClass(status) {\n            if (status.includes('成功') || status.includes('通过') || status.includes('已完成')) return 'approved';\n            if (status.includes('失败') || status.includes('拒绝')) return 'rejected';\n            if (status.includes('处理中') || status.includes('待')) return 'pending';\n            return '';\n        }\n\n        if (com_currentDomain === 'salesmartly') {\n            headerControls.prepend(logToggleBtn);\n            com_chatWindow = {\n                displayMessage: createDisplayMessageFunction(messageArea),\n                displayResultCard: displayResultCard,\n                updateStatus(txt){ statusDiv.textContent = txt; }\n            };\n\n            if (com_pageVersion === 'new') {\n                function tryMoveToNewPage() {\n                    const viewListList = document.querySelector('.view-list__area__list');\n                    if (viewListList) {\n                        const loadingDiv = viewListList.querySelector('.loading');\n                        if (loadingDiv) {\n                            Logger.log('[新版] ✓ 通信窗口已创建，初始化备注功能');\n                            com_initNewVersionRemarkFunction();\n                            return true;\n                        }\n                    }\n                    return false;\n                }\n\n                if (!tryMoveToNewPage()) {\n                    Logger.log('[新版] 等待页面完全加载，启动定时检查（3秒间隔）...');\n                    let checkCount = 0;\n                    const moveCheckInterval = setInterval(() => {\n                        checkCount++;\n                        if (tryMoveToNewPage()) {\n                            clearInterval(moveCheckInterval);\n                        } else if (checkCount >= 20) {\n                            clearInterval(moveCheckInterval);\n                            Logger.log('[新版] ✗ 检查超过60秒，停止定时检查');\n                        }\n                    }, 3000); // Polling delay to check for new page elements\n                }\n\n                function com_initNewVersionRemarkFunction() {\n                    Logger.log('[新版备注] 初始化备注功能...');\n                    const customerBtns = document.querySelectorAll('a.customer__btn');\n                    if (customerBtns.length === 0) {\n                        Logger.log('[新版备注] 未找到 customer__btn 元素');\n                        return;\n                    }\n                    Logger.log(`[新版备注] 找到 ${customerBtns.length} 个 customer__btn 元素`);\n                    customerBtns.forEach((btn, index) => {\n                        const btnIndex = index + 1;\n                        btn.classList.add('com-remark-btn-marked');\n                        btn.style.position = 'relative';\n                        btn.setAttribute('data-btn-index', `按钮#${btnIndex}`);\n                        if (index === 1) {\n                            btn.id = 'com-new-version-remark-btn';\n                            Logger.log(`[新版备注] ✓ 第 ${btnIndex} 个按钮被设为主备注按钮`);\n                        }\n                    });\n                }\n\n                const observer = new MutationObserver(() => {\n                    const unmarkedBtns = document.querySelectorAll('a.customer__btn:not(.com-remark-btn-marked)');\n                    if (unmarkedBtns.length > 0) {\n                        Logger.log(`[新版备注] 检测到 ${unmarkedBtns.length} 个新的未标记备注按钮，重新初始化...`);\n                        com_initNewVersionRemarkFunction();\n                    }\n                });\n\n                setTimeout(() => {\n                    observer.observe(document.body, {\n                        childList: true,\n                        subtree: true,\n                        attributes: true,\n                        attributeFilter: ['class']\n                    });\n                    Logger.log('[新版备注] 已启动 DOM 监听');\n                }, 1000); // 延迟启动DOM观察器，确保页面初步加载完成\n            }\n        }\n        else {\n            const handshakeBtn = document.createElement('button');\n            handshakeBtn.className = 'com-handshake-btn';\n            handshakeBtn.textContent = '连接';\n            const handshakeStatus = document.createElement('span');\n            handshakeStatus.className = 'com-handshake-status com-status-offline';\n            handshakeStatus.textContent = '离线';\n\n            headerControls.prepend(handshakeBtn, logToggleBtn);\n            headerControls.appendChild(handshakeStatus);\n\n            com_chatWindow = {\n                handshakeBtn, handshakeStatus,\n                displayMessage: createDisplayMessageFunction(messageArea),\n                displayResultCard: displayResultCard,\n                updateStatus(txt){ statusDiv.textContent = txt; },\n                setConnected(on){ handshakeStatus.textContent = on?'在线':'离线'; handshakeStatus.className = `com-handshake-status ${on?'com-status-online':'com-status-offline'}`; handshakeBtn.textContent = on?'已连接':'连接'; }\n            };\n            handshakeBtn.addEventListener('click', ()=>{\n                com_chatWindow.displayMessage('正在强制创建新会话并连接...',true,true);\n                MessageManager.createNewSession();\n                MessageManager.startPolling();\n                MessageManager.send('HANDSHAKE_REQUEST', true);\n            });\n        }\n\n        MessageManager.init();\n        MessageManager.startPolling();\n\n        if (com_currentDomain === 'salesmartly') {\n            com_setupTextSelectionListener();\n            setTimeout(() => {\n                Logger.log(\"客服端自动发送握手请求...\");\n                MessageManager.send('HANDSHAKE_REQUEST', true);\n            }, 1500); // 延迟发送握手请求，确保通信机制完全初始化\n        } else {\n            com_chatWindow.displayMessage('请点击 \"连接\" 按钮与客服端建立通信', false, true);\n        }\n    }\n\n    // --- Cross-Domain Communication Page Version Detection ---\n    function com_detectPageVersion() {\n        if (window.location.pathname.includes('/next/chat')) {\n            return 'new';\n        }\n        if (window.location.pathname.includes('/chat') && !window.location.pathname.includes('/next/chat')) {\n            return 'old';\n        }\n        if (document.querySelector('#viewListArea.view-list__area')) {\n            return 'new';\n        }\n        if (document.querySelector('#view_list_content_scroll')) {\n            return 'old';\n        }\n        return 'unknown';\n    }\n\n    // --- Cross-Domain Communication Remark Handling (New Version) ---\n    async function com_handleCustomerSystemIdCopyNew(idWithInfo) {\n        Logger.log(`[新版备注] 处理ID信息: ${idWithInfo}`);\n        const remarkBtn = document.getElementById('com-new-version-remark-btn');\n        if (!remarkBtn) {\n            Logger.error('[新版备注] 未找到标记的备注按钮');\n            GM_notification({ title: '❌ 备注失败', text: '未找到备注按钮，请刷新页面。', timeout: 2000 });\n            return;\n        }\n        Logger.log('[新版备注] 已找到备注按钮（按钮#2），准备点击...');\n        com_chatWindow.displayMessage(`[新版] 正在打开备注窗口...`, true, true);\n        remarkBtn.click();\n\n        let popupAttempts = 0;\n        const maxPopupAttempts = 10;\n        const tryFillAndSave = async () => {\n            const popup = document.querySelector('.arco-trigger-popup.arco-trigger-position-left.arco-popover.g-popover-no-title[style*=\"pointer-events: auto\"]');\n            if (!popup) {\n                if (popupAttempts < maxPopupAttempts) {\n                    popupAttempts++;\n                    await delay(50); // Polling delay to wait for the remark popup to appear\n                    return tryFillAndSave();\n                } else {\n                    Logger.error('[新版备注] 未找到指定的备注弹窗');\n                    com_chatWindow.displayMessage(`[错误] 未找到备注弹窗，请手动操作`, true, true);\n                    GM_notification({ title: '❌ 备注失败', text: '未找到备注弹窗，请手动打开。', timeout: 2000 });\n                    return;\n                }\n            }\n            Logger.log('[新版备注] ✓ 找到指定的备注弹窗');\n            const input = popup.querySelector('.arco-input-wrapper input.arco-input[type=\"text\"]');\n            if (!input) {\n                Logger.error('[新版备注] 未在弹窗中找到输入框');\n                com_chatWindow.displayMessage(`[错误] 未找到备注输入框，请手动操作`, true, true);\n                GM_notification({ title: '❌ 备注失败', text: '未找到备注输入框。', timeout: 2000 });\n                return;\n            }\n            Logger.log('[新版备注] ✓ 找到输入框');\n            input.value = ''; input.focus(); input.value = idWithInfo;\n            ['input', 'change', 'blur', 'focus'].forEach(eventType => input.dispatchEvent(new Event(eventType, { bubbles: true, cancelable: true })));\n            input.dispatchEvent(new InputEvent('input', { bubbles: true, cancelable: true, data: idWithInfo }));\n            Logger.log(`[新版备注] ✓ 已清空并填入备注信息: ${idWithInfo}`);\n            com_chatWindow.displayMessage(`[新版] ✓ 已自动填入备注: ${idWithInfo}，自动提交中...`, true, true);\n            GM_notification({ title: '✓ 已填入备注', text: `已填入: ${idWithInfo}\\n正在自动保存...`, timeout: 2000 });\n            com_findAndClickSaveButton(popup, idWithInfo);\n        };\n        tryFillAndSave();\n    }\n\n    async function com_findAndClickSaveButton(popup, idWithInfo) {\n        const footerDiv = popup.querySelector('.popover-form__footer');\n        if (!footerDiv) { Logger.error('[新版备注] 未找到 popover-form__footer div'); return; }\n        Logger.log('[新版备注] ✓ 找到 popover-form__footer');\n        const buttons = footerDiv.querySelectorAll('button.arco-btn');\n        if (buttons.length < 2) { Logger.error(`[新版备注] 按钮数量不足，期望至少2个，实际: ${buttons.length}`); return; }\n        const saveBtn = buttons[1];\n        const btnText = saveBtn.textContent.trim();\n        Logger.log(`[新版备注] 第二个按钮文本: \"${btnText}\"`);\n        if (btnText === '保存' || saveBtn.classList.contains('arco-btn-primary')) {\n            Logger.log('[新版备注] ✓ 确认找到保存按钮，立即点击...');\n            saveBtn.click();\n            await delay(10); // 短暂等待，确保点击事件被浏览器处理\n            const mouseDownEvent = new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window });\n            const mouseUpEvent = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window });\n            saveBtn.dispatchEvent(mouseDownEvent);\n            saveBtn.dispatchEvent(mouseUpEvent);\n            Logger.log('[新版备注] ✓ 已点击保存按钮');\n            com_monitorPopupClose(idWithInfo);\n        } else {\n            Logger.error(`[新版备注] 第二个按钮不是保存按钮，文本为: ${btnText}`);\n            let saveBtnFound = false;\n            buttons.forEach((btn, idx) => {\n                if (btn.textContent.includes('保存')) {\n                    Logger.log(`[新版备注] 在第 ${idx + 1} 个按钮找到\"保存\"文本`);\n                    btn.click();\n                    saveBtnFound = true;\n                    com_monitorPopupClose(idWithInfo);\n                }\n            });\n            if (!saveBtnFound) {\n                Logger.error('[新版备注] 未找到包含\"保存\"文本的按钮');\n                com_chatWindow.displayMessage(`[新版] 未找到保存按钮，请手动点击保存`, true, true);\n            }\n        }\n    }\n\n    function com_monitorPopupClose(idWithInfo) {\n        let closeCheckAttempts = 0;\n        const maxCloseCheckAttempts = 20;\n        const checkPopupClosed = setInterval(() => {\n            const popupStillOpen = document.querySelector('.arco-trigger-popup.arco-trigger-position-left.arco-popover.g-popover-no-title[style*=\"pointer-events: auto\"]');\n            closeCheckAttempts++;\n            if (!popupStillOpen) {\n                clearInterval(checkPopupClosed);\n                Logger.log('[新版备注] ✓ 备注弹窗已关闭，保存成功');\n                com_chatWindow.displayMessage(`✓ 备注已保存: ${idWithInfo}`, true, true);\n                GM_notification({ title: '✓ 备注保存成功', text: `已为ID ${idWithInfo} 添加备注。`, timeout: 2000 });\n            } else if (closeCheckAttempts >= maxCloseCheckAttempts) {\n                clearInterval(checkPopupClosed);\n                Logger.log('[新版备注] ⚠️ 弹窗未在规定时间内关闭，可能已保存');\n                com_chatWindow.displayMessage(`⚠️ 操作完成，弹窗关闭状态未确认`, true, true);\n            }\n        }, 100); // Polling delay to check if the remark popup has closed\n    }\n\n    // --- Cross-Domain Communication Remark Handling (Old Version) ---\n    function com_handleCustomerSystemIdCopyOld(id) {\n        const btn = document.querySelector('.ivu-poptip-rel .ivu-icon-ios-create-outline');\n        if (!btn) {\n            GM_notification({ title: '备注失败', text: '未找到备注触发按钮。', timeout: 2000 });\n            return;\n        }\n        btn.click();\n        let obs = null;\n        let attempts = 0;\n        const maxAttempts = 20;\n        const checkDelay = 100;\n\n        const tryFillAndSave = () => {\n            const ta = document.querySelector('.ivu-poptip-body textarea.ivu-input');\n            const ok = document.querySelector('div._ss_34TnJEW3 button.ivu-btn-primary');\n            if (ta && ok) {\n                if (obs) obs.disconnect();\n                ta.value = id;\n                com_triggerInputEvent(ta);\n                ok.click();\n                com_chatWindow.displayMessage(`已为ID ${id} 添加备注`, true, true);\n                GM_notification({ title: '备注成功', text: `已为ID ${id} 添加备注。`, timeout: 2000 });\n            } else if (attempts < maxAttempts) {\n                attempts++;\n                setTimeout(tryFillAndSave, checkDelay); // Polling delay to check for remark textarea/OK button\n            } else {\n                if (obs) obs.disconnect();\n                GM_notification({ title: '备注超时', text: `未能为ID ${id} 找到备注输入框或确定按钮。`, timeout: 3000 });\n            }\n        };\n\n        obs = new MutationObserver((mutations, observer)=>{\n            const poptipBodyAppeared = Array.from(mutations).some(mutation => mutation.addedNodes.length > 0 && document.querySelector('.ivu-poptip-body'));\n            if (poptipBodyAppeared) {\n                observer.disconnect();\n                attempts = 0;\n                tryFillAndSave();\n            }\n        });\n        obs.observe(document.body, { childList: true, subtree: true, attributes: true });\n        setTimeout(()=>{ if (obs && attempts === 0) { obs.disconnect(); GM_notification({ title: '备注失败', text: `未能检测到备注弹窗的出现。`, timeout: 3000 }); } }, 5000);\n    }\n\n    function com_triggerInputEvent(el){ ['input','change','keyup'].forEach(ev=>el.dispatchEvent(new Event(ev,{bubbles:true,cancelable:true}))); }\n\n    // --- Cross-Domain Communication Message Manager ---\n    const MessageManager = {\n        sessionId: null, lastMessageId: 0, pollingInterval: null,\n        init(){\n            this.sessionId = GM_getValue('current_session_id', '');\n            this.lastMessageId = parseInt(GM_getValue('last_message_id', '0'), 10);\n            if (!this.sessionId) {\n                this.createNewSession();\n            } else {\n                Logger.log(`已恢复会话: ${this.sessionId}`);\n                com_chatWindow.displayMessage('会话已恢复', false, true);\n                com_chatWindow.setConnected && com_chatWindow.setConnected(true);\n\n                try {\n                    const storedMessages = JSON.parse(GM_getValue(this.sessionId, '[]'));\n                    storedMessages.forEach(msg => {\n                        if (msg.isSystem) {\n                            com_chatWindow.displayMessage(msg.message, false, true);\n                        } else if (msg.message.startsWith(COM_RESULT_CARD_PREFIX)) {\n                            try {\n                                const cardData = JSON.parse(msg.message.substring(COM_RESULT_CARD_PREFIX.length));\n                                com_chatWindow.displayResultCard(cardData);\n                            } catch (e) {\n                                Logger.error(\"解析结果卡片消息失败:\", e);\n                                com_chatWindow.displayMessage(`[错误] 无法显示结果卡片: ${msg.message}`, false, true);\n                            }\n                        }\n                        else {\n                            const from = msg.domain === 'salesmartly' ? '客服' : '管理';\n                            com_chatWindow.displayMessage(`[${from}] ${msg.message}`, false);\n                        }\n                    });\n                } catch (e) {\n                    Logger.error(\"加载历史消息时出错:\", e);\n                }\n            }\n        },\n        createNewSession(){\n            this.sessionId = 'session_' + Date.now();\n            GM_setValue('current_session_id', this.sessionId);\n            GM_setValue(this.sessionId, '[]');\n            this.lastMessageId = 0;\n            GM_setValue('last_message_id', '0');\n            Logger.log(`已创建新会话: ${this.sessionId}`);\n            com_chatWindow.displayMessage('新会话已创建', true, true);\n            com_chatWindow.setConnected && com_chatWindow.setConnected(true);\n        },\n        send(msg, isSys=false){\n            try{\n                if (!this.sessionId) { Logger.error(\"发送失败: sessionId 为空。\"); return false; }\n                const arr = JSON.parse(GM_getValue(this.sessionId,'[]'));\n                const o = { id: Date.now(), domain: com_currentDomain, message: msg, time: new Date().toLocaleTimeString(), isSystem: isSys };\n                const na = [...arr.slice(-COM_DISPLAY_MESSAGE_LIMIT), o];\n                GM_setValue(this.sessionId, JSON.stringify(na));\n                GM_setValue('last_message_id', o.id.toString());\n                this.lastMessageId = o.id;\n                if (!isSys && !msg.startsWith(COM_RESULT_CARD_PREFIX)) com_chatWindow.displayMessage('[发送] ' + msg, true);\n                return true;\n            } catch(e){\n                Logger.error(\"发送消息时出错:\", e);\n                return false;\n            }\n        },\n        poll(){\n            try{\n                if (!this.sessionId) { return; }\n                const arr = JSON.parse(GM_getValue(this.sessionId,'[]'));\n                const nm = arr.filter(m=>m.id>this.lastMessageId && m.domain!==com_currentDomain);\n                nm.forEach(m=>{\n                    this.processMessage(m);\n                    if (m.id > this.lastMessageId) this.lastMessageId = m.id;\n                });\n                GM_setValue('last_message_id', this.lastMessageId.toString());\n            } catch(e){\n                Logger.error(\"轮询消息时出错:\", e);\n            }\n        },\n        async processMessage(m){\n            if (m.isSystem) {\n                if (m.message === 'HANDSHAKE_REQUEST') {\n                    Logger.log(\"收到握手请求，正在响应...\");\n                    this.send('HANDSHAKE_RESPONSE: 连接成功', true);\n                    com_chatWindow.setConnected && com_chatWindow.setConnected(true);\n                } else if (m.message.startsWith('HANDSHAKE_RESPONSE')) {\n                    com_chatWindow.setConnected && com_chatWindow.setConnected(true);\n                    com_chatWindow.displayMessage(m.message, true, true);\n                } else if (m.message.startsWith(COM_RESULT_CARD_PREFIX)) {\n                    try {\n                        const cardData = JSON.parse(m.message.substring(COM_RESULT_CARD_PREFIX.length));\n                        com_chatWindow.displayResultCard(cardData);\n                    } catch (e) {\n                        Logger.error(\"解析结果卡片消息失败:\", e);\n                        com_chatWindow.displayMessage(`[错误] 无法显示结果卡片: ${m.message}`, true, true);\n                    }\n                } else {\n                    com_chatWindow.displayMessage(m.message, true, true);\n                }\n                return;\n            }\n\n            // Admin side processing for query requests\n            if (com_currentDomain === 'admin' && (/\\d{7,8}/.test(m.message) || /\\d{9,15}/.test(m.message) || /^[gG]\\d+$/.test(m.message))) {\n                com_chatWindow.updateStatus(`收到查询请求: ${m.message}`);\n                com_chatWindow.displayMessage(`[收到查询] ${m.message}`, true, true);\n\n                const memberIdInput = document.getElementById('ss-member-id');\n                if (memberIdInput) {\n                    // 确保输入框可见并聚焦\n                    if (ss_panelInstance) ss_panelInstance.style.display = 'flex';\n                    memberIdInput.focus();\n                    \n                    // 模拟用户输入，确保Vue正确绑定\n                    memberIdInput.value = '';\n                    memberIdInput.dispatchEvent(new Event('input', { bubbles: true }));\n                    memberIdInput.dispatchEvent(new Event('change', { bubbles: true }));\n                    await delay(100); // 关键：等待Vue等框架处理输入框的清空操作，避免旧值残留\n\n                    memberIdInput.value = m.message;\n                    memberIdInput.dispatchEvent(new Event('input', { bubbles: true }));\n                    memberIdInput.dispatchEvent(new Event('change', { bubbles: true }));\n                    await delay(200); // 关键：等待Vue等框架处理新值的填充，确保数据模型更新\n                    memberIdInput.blur(); // 模拟失去焦点\n                    await delay(300); // 关键：失去焦点后给框架更多时间同步数据，确保v-model更新完成\n                }\n\n                const result = await ss_executeOperation(m.message);\n                if (result.success) {\n                    com_chatWindow.updateStatus(`查询成功: ${result.memberId}`);\n                    this.send(COM_RESULT_CARD_PREFIX + JSON.stringify(result), true);\n                } else {\n                    com_chatWindow.updateStatus(`查询失败: ${result.message}`);\n                    this.send(`[后台查询失败] ${result.message}`, true);\n                }\n                return;\n            }\n\n            // General message display for both domains\n            const from = m.domain === 'salesmartly' ? '客服' : '管理';\n            com_chatWindow.displayMessage(`[${from}] ${m.message}`, true);\n        },\n        startPolling(){\n            this.stopPolling();\n            this.pollingInterval = setInterval(()=>this.poll(), 800); // 定期轮询GM存储，检查是否有新消息\n        },\n        stopPolling(){\n            if (this.pollingInterval) clearInterval(this.pollingInterval);\n        }\n    };\n\n    // --- Floating Chat Window Logic ---\n    function com_makeDraggableAndResizable(element, handle) {\n        let isDragging = false;\n        let startX, startY;\n        let initialMouseX, initialMouseY;\n\n        handle.addEventListener('mousedown', (e) => {\n            if (e.button !== 0) return;\n            if (element.classList.contains('minimized')) return;\n\n            isDragging = true;\n            initialMouseX = e.clientX;\n            initialMouseY = e.clientY;\n            startX = element.offsetLeft;\n            startY = element.offsetTop;\n\n            element.style.cursor = 'grabbing';\n            element.style.transition = 'none';\n\n            function onMouseMove(e) {\n                if (!isDragging) return;\n                let newX = startX + (e.clientX - initialMouseX);\n                let newY = startY + (e.clientY - initialMouseY);\n\n                newX = Math.max(0, Math.min(newX, window.innerWidth - element.offsetWidth));\n                newY = Math.max(0, Math.min(newY, window.innerHeight - element.offsetHeight));\n\n                element.style.left = `${newX}px`;\n                element.style.top = `${newY}px`;\n                element.style.right = 'auto';\n                element.style.bottom = 'auto';\n            }\n\n            function onMouseUp() {\n                if (!isDragging) return;\n                isDragging = false;\n                element.style.cursor = 'grab';\n                element.style.transition = 'all 0.2s ease';\n\n                GM_setValue(COM_FLOATING_CHAT_POSITION_KEY, {\n                    left: element.style.left,\n                    top: element.style.top,\n                    width: element.style.width,\n                    height: element.style.height\n                });\n\n                document.removeEventListener('mousemove', onMouseMove);\n                document.removeEventListener('mouseup', onMouseUp);\n            }\n\n            document.addEventListener('mousemove', onMouseMove);\n            document.addEventListener('mouseup', onMouseUp);\n        });\n    }\n\n    function com_toggleMinimizeMaximize(windowEl, btnEl) {\n        const isMinimized = windowEl.classList.toggle('minimized');\n        GM_setValue(COM_CHAT_IS_MINIMIZED_KEY, isMinimized);\n\n        btnEl.textContent = isMinimized ? '□' : '−';\n        windowEl.style.resize = isMinimized ? 'none' : 'both';\n\n        if (!isMinimized) {\n            const savedPosition = GM_getValue(COM_FLOATING_CHAT_POSITION_KEY, null);\n            if (savedPosition && savedPosition.height && savedPosition.width) {\n                windowEl.style.width = savedPosition.width;\n                windowEl.style.height = savedPosition.height;\n            } else {\n                windowEl.style.width = COM_DEFAULT_FLOATING_WIDTH;\n                windowEl.style.height = COM_DEFAULT_FLOATING_HEIGHT;\n            }\n        } else {\n            const currentPosition = {\n                left: windowEl.style.left,\n                top: windowEl.style.top,\n                width: windowEl.style.width,\n                height: windowEl.style.height\n            };\n            GM_setValue(COM_FLOATING_CHAT_POSITION_KEY, currentPosition);\n            windowEl.style.width = 'auto';\n            windowEl.style.height = 'auto';\n        }\n    }\n\n    // --- Cross-Domain Communication Text Selection Listener ---\n    function com_setupTextSelectionListener(){\n        document.addEventListener('mouseup', ()=>{\n            const txt = window.getSelection().toString().trim();\n            if ((txt.length === 8 && /^\\d+$/.test(txt)) || (txt.length >= SS_MIN_PHONE_LEN && txt.length <= SS_MAX_PHONE_LEN && /^\\d+$/.test(txt)) || /^[gG]\\d+$/.test(txt)) {\n                com_chatWindow.updateStatus(`已选择: ${txt}`);\n                MessageManager.send(txt);\n            }\n        });\n    }\n\n    // --- 主入口点 ---\n    function main() {\n        com_init();\n\n        if (com_currentDomain === 'admin') {\n            ss_initializeCoreUI();\n\n            const observer = new MutationObserver(() => ss_handlePathChange());\n            observer.observe(document.body, { childList: true, subtree: true });\n\n            ss_handlePathChange();\n        }\n    }\n\n    if (document.readyState !== 'complete') {\n        window.addEventListener('load', main);\n    } else {\n        setTimeout(main, 100); // 延迟执行主函数，确保DOM完全加载和渲染\n    }\n\n})();\n\n//现在这个脚本的“修正卡号”按键点击后的任务执行时候一定要监测最新出现的（<div id=\"message_461\" class=\"el-message el-message--success\" role=\"alert\" style=\"top: 16px; z-index: 4921;\"><!--v-if--><i class=\"el-icon el-message__icon el-message-icon--success\"><svg viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"currentColor\" d=\"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.272 38.272 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336L456.192 600.384z\"></path></svg></i><!-- Caution here, message could've been compromised, never use user's input as message --><p class=\"el-message__content\">操作成功！</p><!--v-if--></div>）这样的提示，不能有任何一个是非“操作成功！”的提示，如果出现，则要从头开始重新运行这个按键的任务流程，知道全部步骤都正常无误的运行","functional_script_code_hash":"081676be70e641270994247d3f96b0d5bff69ea2720163827fd750a28e20592c","loader_script_hash":"28ed0b64deceb2dcf682653e9de32ed00f5822bcf45fbfd3dd1b51e76df13725","config":{"feature_x_enabled":true,"keyword_list":["example","test"],"salesmartly_api_key":"YOUR_SALESMARTLY_API_KEY_IF_NEEDED"}}