chen.llin
5 天以前 b4a14804f37d0d715af1f00ccb9e1621d238cc58
异常处理
2个文件已修改
233 ■■■■■ 已修改文件
App.vue 149 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/rfid-input-helper.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
App.vue
@@ -9,44 +9,96 @@
            
            // #ifdef APP-PLUS
            // 全局初始化RFID模块(应用启动时初始化,关闭app时关闭)
            console.log('[App] 初始化RFID模块...');
            const uhfModel = uni.requireNativePlugin("iData-UHFPlugin-UHFModule");
            const globalEvent = uni.requireNativePlugin('globalEvent');
            const modal = uni.requireNativePlugin('modal');
            // 注意:RFID初始化采用异步方式,不阻塞页面加载
            // 即使RFID初始化失败,也不影响页面正常使用
            console.log('[App] 开始异步初始化RFID模块(不阻塞页面加载)...');
            
            if (!uhfModel) {
                console.error('[App] RFID插件未找到');
            } else {
                // 监听上电事件
                let isPowerOn = false;
                globalEvent.addEventListener('POWEREvent', function(e) {
                    console.log('[App] POWEREvent:', JSON.stringify(e));
                    if (e && e.status === 'connected') {
                        isPowerOn = true;
                        console.log('[App] ✓✓✓ RFID模块已上电成功!');
                    } else {
                        isPowerOn = false;
                        console.log('[App] ✗ RFID模块未上电');
            // 使用setTimeout确保不阻塞主线程
            setTimeout(() => {
                try {
                    const uhfModel = uni.requireNativePlugin("iData-UHFPlugin-UHFModule");
                    const globalEvent = uni.requireNativePlugin('globalEvent');
                    const modal = uni.requireNativePlugin('modal');
                    if (!uhfModel) {
                        console.warn('[App] ⚠ RFID插件未找到,页面可正常使用(RFID功能不可用)');
                        return;
                    }
                });
                // 初始化RFID模块(使用SLR模块,与测试页面一致)
                uhfModel.initUHF(1, (ret) => {
                    console.log('[App] initUHF result:', ret);
                    if (ret && typeof ret === 'string' && ret.includes('success')) {
                        console.log('[App] ✓ RFID模块初始化成功');
                    } else {
                        console.warn('[App] ⚠ RFID模块初始化失败:', ret);
                    // 监听上电事件
                    let isPowerOn = false;
                    const powerEventHandler = function(e) {
                        console.log('[App] POWEREvent:', JSON.stringify(e));
                        if (e && e.status === 'connected') {
                            isPowerOn = true;
                            console.log('[App] ✓✓✓ RFID模块已上电成功!');
                        } else {
                            isPowerOn = false;
                            console.log('[App] ✗ RFID模块未上电');
                        }
                    };
                    globalEvent.addEventListener('POWEREvent', powerEventHandler);
                    // 保存事件处理器引用,用于清理
                    this.powerEventHandler = powerEventHandler;
                    // 设置超时机制:如果10秒内没有初始化成功,允许页面继续使用
                    const initTimeout = setTimeout(() => {
                        console.warn('[App] ⚠ RFID模块初始化超时(10秒),页面可正常使用(RFID功能可能不可用)');
                        if (modal) {
                            modal.toast({
                                message: 'RFID初始化超时,页面可正常使用',
                                duration: 2
                            });
                        }
                    }, 10000); // 10秒超时
                    // 初始化RFID模块(使用SLR模块,与测试页面一致)
                    try {
                        uhfModel.initUHF(1, (ret) => {
                            clearTimeout(initTimeout); // 清除超时定时器
                            console.log('[App] initUHF result:', ret);
                            if (ret && typeof ret === 'string' && ret.includes('success')) {
                                console.log('[App] ✓ RFID模块初始化成功');
                            } else {
                                console.warn('[App] ⚠ RFID模块初始化失败:', ret);
                                if (modal) {
                                    modal.toast({
                                        message: 'RFID初始化失败,页面可正常使用',
                                        duration: 2
                                    });
                                }
                            }
                        });
                    } catch (initError) {
                        clearTimeout(initTimeout); // 清除超时定时器
                        console.error('[App] ⚠ RFID模块初始化异常:', initError);
                        console.warn('[App] ⚠ 页面可正常使用(RFID功能不可用)');
                        if (modal) {
                            modal.toast({
                                message: 'RFID初始化异常,页面可正常使用',
                                duration: 2
                            });
                        }
                    }
                });
                // 保存引用,用于onExit时关闭
                this.uhfModel = uhfModel;
                this.globalEvent = globalEvent;
            }
                    // 保存引用,用于onExit时关闭
                    this.uhfModel = uhfModel;
                    this.globalEvent = globalEvent;
                } catch (error) {
                    console.error('[App] ⚠ RFID模块初始化过程出错:', error);
                    console.warn('[App] ⚠ 页面可正常使用(RFID功能不可用)');
                }
            }, 100); // 延迟100ms执行,确保不阻塞页面加载
            
            // 启动全局RFID输入助手(用于自动填入输入框)
            startRFIDInputHelper();
            // 使用try-catch确保即使RFID助手启动失败也不影响页面
            try {
                startRFIDInputHelper();
            } catch (error) {
                console.error('[App] ⚠ RFID输入助手启动失败:', error);
                console.warn('[App] ⚠ 页面可正常使用(RFID扫描功能不可用)');
            }
            // #endif
            
            // 注意:以下代码已废弃,改为上面的全局初始化方式
@@ -348,16 +400,29 @@
        onExit: function() {
            console.log('App Exit')
            // #ifdef APP-PLUS
            // 停止全局RFID输入助手
            stopRFIDInputHelper();
            // 关闭RFID模块
            if (this.uhfModel && this.uhfModel.closeUHF) {
                this.uhfModel.closeUHF();
                console.log('[App] ✓ RFID模块已关闭');
            // 停止全局RFID输入助手(使用try-catch确保即使失败也不影响退出)
            try {
                stopRFIDInputHelper();
            } catch (e) {
                console.warn('[App] ⚠ 停止RFID输入助手失败:', e);
            }
            if (this.globalEvent) {
                this.globalEvent.removeEventListener('POWEREvent');
            // 关闭RFID模块(使用try-catch确保即使失败也不影响退出)
            try {
                if (this.uhfModel && this.uhfModel.closeUHF) {
                    this.uhfModel.closeUHF();
                    console.log('[App] ✓ RFID模块已关闭');
                }
            } catch (e) {
                console.warn('[App] ⚠ 关闭RFID模块失败:', e);
            }
            try {
                if (this.globalEvent && this.powerEventHandler) {
                    this.globalEvent.removeEventListener('POWEREvent', this.powerEventHandler);
                }
            } catch (e) {
                console.warn('[App] ⚠ 移除POWEREvent监听失败:', e);
            }
            // #endif
        }
common/rfid-input-helper.js
@@ -14,6 +14,7 @@
/**
 * 初始化RFID助手(只初始化插件引用和事件监听,不初始化RFID模块)
 * RFID模块由App.vue全局初始化,这里只负责监听按键和读取标签
 * 注意:即使初始化失败,也不抛出异常,确保不影响页面使用
 */
function initRFIDForInput() {
    try {
@@ -22,28 +23,34 @@
        modal = uni.requireNativePlugin('modal');
        
        if (!uhfModel) {
            console.warn('[RFIDInputHelper] RFID插件未找到');
            console.warn('[RFIDInputHelper] ⚠ RFID插件未找到,RFID扫描功能不可用,但页面可正常使用');
            return false;
        }
        
        // 监听上电事件(监听全局上电状态,RFID模块由App.vue初始化)
        globalEvent.addEventListener('POWEREvent', function(e) {
            console.log('[RFIDInputHelper] POWEREvent:', JSON.stringify(e));
            if (e && e.status === 'connected') {
                isPowerOn = true;
                console.log('[RFIDInputHelper] ✓ RFID模块已上电');
            } else {
                isPowerOn = false;
                console.log('[RFIDInputHelper] ✗ RFID模块未上电');
            }
        });
        try {
            globalEvent.addEventListener('POWEREvent', function(e) {
                console.log('[RFIDInputHelper] POWEREvent:', JSON.stringify(e));
                if (e && e.status === 'connected') {
                    isPowerOn = true;
                    console.log('[RFIDInputHelper] ✓ RFID模块已上电');
                } else {
                    isPowerOn = false;
                    console.log('[RFIDInputHelper] ✗ RFID模块未上电');
                }
            });
        } catch (eventError) {
            console.warn('[RFIDInputHelper] ⚠ 添加POWEREvent监听失败:', eventError);
            console.warn('[RFIDInputHelper] ⚠ RFID扫描功能可能不可用,但页面可正常使用');
        }
        
        // 注意:RFID模块由App.vue在onLaunch时全局初始化
        // 这里只负责监听按键和读取标签,不初始化RFID模块
        
        return true;
    } catch (error) {
        console.error('[RFIDInputHelper] 初始化失败:', error);
        console.error('[RFIDInputHelper] ⚠ 初始化失败:', error);
        console.warn('[RFIDInputHelper] ⚠ RFID扫描功能不可用,但页面可正常使用');
        return false;
    }
}
@@ -128,25 +135,46 @@
 * 读取RFID标签(单标签读,无过滤)
 */
function readRFIDTag() {
    if (!uhfModel) {
        // 如果模块未初始化,尝试初始化
        uhfModel = uni.requireNativePlugin("iData-UHFPlugin-UHFModule");
    try {
        if (!uhfModel) {
            console.warn('[RFIDInputHelper] RFID模块未找到');
            modal.toast({
                message: 'RFID模块未找到',
                duration: 1.5
            });
            // 如果模块未初始化,尝试初始化
            try {
                uhfModel = uni.requireNativePlugin("iData-UHFPlugin-UHFModule");
            } catch (e) {
                console.warn('[RFIDInputHelper] ⚠ RFID模块未找到:', e);
            }
            if (!uhfModel) {
                console.warn('[RFIDInputHelper] RFID模块未找到');
                if (modal) {
                    modal.toast({
                        message: 'RFID模块未找到',
                        duration: 1.5
                    });
                }
                return;
            }
        }
        // 检查RFID是否已上电(RFID模块由App.vue全局初始化)
        if (!isPowerOn) {
            console.warn('[RFIDInputHelper] RFID未上电,无法扫描');
            if (modal) {
                modal.toast({
                    message: 'RFID正在上电,请稍候...',
                    duration: 1.5
                });
            }
            return;
        }
    }
    // 检查RFID是否已上电(RFID模块由App.vue全局初始化)
    if (!isPowerOn) {
        modal.toast({
            message: 'RFID正在上电,请稍候...',
            duration: 1.5
        });
    } catch (error) {
        console.error('[RFIDInputHelper] ⚠ 读取RFID标签前检查失败:', error);
        console.warn('[RFIDInputHelper] ⚠ RFID扫描功能不可用,但页面可正常使用');
        if (modal) {
            modal.toast({
                message: 'RFID扫描功能不可用',
                duration: 1.5
            });
        }
        return;
    }