import { ref, computed, onUnmounted } from "vue"; 
 | 
import { onShow, onHide } from "@dcloudio/uni-app"; 
 | 
import RoutingInspectionApi from "@/api/routingInspection/routingInspection"; 
 | 
  
 | 
/** 
 | 
 * 扫码数据接口 
 | 
 */ 
 | 
interface ScanCodeData { 
 | 
  uid?: string; 
 | 
  deviceModel?: string; 
 | 
  [key: string]: any; 
 | 
} 
 | 
  
 | 
// 全局监听器状态映射(确保每个事件名只有一个监听器) 
 | 
const globalListeners = new Map<string, boolean>(); 
 | 
  
 | 
// 添加一个全局的捕获所有扫码事件的监听器(用于调试) 
 | 
let debugListenerInitialized = false; 
 | 
  
 | 
const initDebugListener = () => { 
 | 
  if (debugListenerInitialized) return; 
 | 
   
 | 
  // 监听所有可能的扫码事件 
 | 
  const eventNames = ["scan", "scanIndex", "scanJX", "scanLS"]; 
 | 
  eventNames.forEach((eventName) => { 
 | 
    uni.$on(eventName, (data: any) => { 
 | 
      console.log(`🔍 [全局调试] 捕获到 ${eventName} 事件:`, data); 
 | 
    }); 
 | 
  }); 
 | 
   
 | 
  debugListenerInitialized = true; 
 | 
  console.log("🔍 [全局调试] 调试监听器已初始化"); 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * 扫码管理 Composable 
 | 
 * 统一管理扫码事件监听、缓存存储和数据读取 
 | 
 * 全局监听器,不随页面切换而关闭 
 | 
 * @param eventName 监听的事件名称,默认为 "scan" 
 | 
 */ 
 | 
export function useScanCode(eventName: string = "scan") { 
 | 
  // 当前扫码的设备 UID 
 | 
  const deviceUid = ref<string>(""); 
 | 
  // 当前扫码的机台型号 
 | 
  const deviceModel = ref<string>(""); 
 | 
  // 完整的扫码数据 
 | 
  const scanData = ref<ScanCodeData>({}); 
 | 
  // 保存事件名称 
 | 
  const currentEventName = eventName; 
 | 
  
 | 
  /** 
 | 
   * 从本地缓存加载扫码数据 
 | 
   */ 
 | 
  const loadFromCache = () => { 
 | 
    try { 
 | 
      const cachedData = uni.getStorageSync("scanCodeData"); 
 | 
      if (cachedData) { 
 | 
        scanData.value = cachedData; 
 | 
        deviceUid.value = cachedData.uid || ""; 
 | 
        deviceModel.value = cachedData.deviceModel || ""; 
 | 
        console.log("[useScanCode] 从缓存加载扫码数据:", cachedData); 
 | 
        return cachedData; 
 | 
      } 
 | 
    } catch (error) { 
 | 
      console.error("[useScanCode] 读取缓存失败:", error); 
 | 
    } 
 | 
    return null; 
 | 
  }; 
 | 
  
 | 
  /** 
 | 
   * 保存扫码数据到缓存 
 | 
   */ 
 | 
  const saveToCache = (data: ScanCodeData) => { 
 | 
    try { 
 | 
      uni.setStorageSync("scanCodeData", data); 
 | 
      console.log("[useScanCode] 已保存到缓存:", data); 
 | 
      return true; 
 | 
    } catch (error) { 
 | 
      console.error("[useScanCode] 保存缓存失败:", error); 
 | 
      return false; 
 | 
    } 
 | 
  }; 
 | 
  
 | 
  /** 
 | 
   * 清空扫码数据和缓存 
 | 
   */ 
 | 
  const clearScanData = () => { 
 | 
    try { 
 | 
      uni.removeStorageSync("scanCodeData"); 
 | 
      deviceUid.value = ""; 
 | 
      deviceModel.value = ""; 
 | 
      scanData.value = {}; 
 | 
      console.log("[useScanCode] 已清空扫码数据"); 
 | 
    } catch (error) { 
 | 
      console.error("[useScanCode] 清空缓存失败:", error); 
 | 
    } 
 | 
  }; 
 | 
  
 | 
  /** 
 | 
   * 验证二维码(仅调用接口,不处理返回结果) 
 | 
   */ 
 | 
  const validateQRCode = async (uid: string): Promise<void> => { 
 | 
    try { 
 | 
      console.log("[useScanCode] 调用验证二维码接口, deviceUid:", uid); 
 | 
      await RoutingInspectionApi.assertScanQR({ deviceUid: uid }); 
 | 
      console.log("[useScanCode] 验证接口调用完成"); 
 | 
    } catch (error: any) { 
 | 
      console.error("[useScanCode] 验证接口调用异常:", error); 
 | 
      // 即使异常也不影响后续流程 
 | 
    } 
 | 
  }; 
 | 
  
 | 
  /** 
 | 
   * 处理扫码事件 
 | 
   */ 
 | 
  const handleScanEvent = async (params: any) => { 
 | 
    console.log(`========== [useScanCode][${currentEventName}] 收到扫码事件 ==========`); 
 | 
    console.log(`[useScanCode][${currentEventName}] 接收参数:`, params); 
 | 
    console.log(`[useScanCode][${currentEventName}] 触发时间:`, new Date().toLocaleTimeString()); 
 | 
  
 | 
    try { 
 | 
      if (!params?.code) { 
 | 
        console.warn("[useScanCode] 扫码内容为空"); 
 | 
        return; 
 | 
      } 
 | 
  
 | 
      let codeObj: ScanCodeData = {}; 
 | 
      try { 
 | 
        codeObj = JSON.parse(params.code); 
 | 
        console.log("[useScanCode] 解析后的对象:", codeObj); 
 | 
      } catch (err) { 
 | 
        console.error("[useScanCode] JSON 解析失败:", err); 
 | 
        console.log("[useScanCode] 原始字符串:", params.code); 
 | 
        // 如果不是 JSON,尝试作为普通字符串处理 
 | 
        codeObj = { code: params.code }; 
 | 
      } 
 | 
  
 | 
      // 检查是否有必要的字段(uid 或 deviceModel) 
 | 
      if (!codeObj.uid && !codeObj.deviceModel) { 
 | 
        console.warn("[useScanCode] 扫码数据缺少 uid 和 deviceModel,不保存缓存"); 
 | 
        uni.showToast({ 
 | 
          title: "扫码数据无效", 
 | 
          icon: "none", 
 | 
        }); 
 | 
        return; 
 | 
      } 
 | 
  
 | 
      // 更新本地状态 
 | 
      scanData.value = codeObj; 
 | 
      deviceUid.value = codeObj.uid || ""; 
 | 
      deviceModel.value = codeObj.deviceModel || ""; 
 | 
  
 | 
      // 保存到缓存 
 | 
      saveToCache(codeObj); 
 | 
  
 | 
      // 如果有 uid,调用验证接口(不等待结果) 
 | 
      if (codeObj.uid) { 
 | 
        validateQRCode(codeObj.uid); 
 | 
      } 
 | 
  
 | 
      // 显示成功提示 
 | 
      uni.showToast({ 
 | 
        title: "扫码成功", 
 | 
        icon: "success", 
 | 
      }); 
 | 
  
 | 
      console.log("[useScanCode] 扫码数据已更新:", { 
 | 
        uid: deviceUid.value, 
 | 
        deviceModel: deviceModel.value, 
 | 
      }); 
 | 
    } catch (error) { 
 | 
      console.error("[useScanCode] 处理扫码数据异常:", error); 
 | 
    } 
 | 
  }; 
 | 
  
 | 
  /** 
 | 
   * 启用扫码监听(全局,每次都重新注册以确保有效) 
 | 
   */ 
 | 
  const enableListener = () => { 
 | 
    // 先移除可能存在的旧监听器 
 | 
    uni.$off(currentEventName, handleScanEvent); 
 | 
    // 添加新的监听器 
 | 
    uni.$on(currentEventName, handleScanEvent); 
 | 
    // 标记为全局已启用 
 | 
    globalListeners.set(currentEventName, true); 
 | 
    console.log( 
 | 
      `[useScanCode][${currentEventName}] ✅ 全局监听器已启用/刷新(不会随页面切换关闭)` 
 | 
    ); 
 | 
  }; 
 | 
  
 | 
  /** 
 | 
   * 禁用扫码监听(仅用于应用退出时清理,正常页面切换不调用) 
 | 
   */ 
 | 
  const disableListener = () => { 
 | 
    if (!globalListeners.get(currentEventName)) { 
 | 
      console.log(`[useScanCode][${currentEventName}] 监听器未启用,跳过`); 
 | 
      return; 
 | 
    } 
 | 
  
 | 
    uni.$off(currentEventName, handleScanEvent); 
 | 
    globalListeners.delete(currentEventName); 
 | 
    console.log(`[useScanCode][${currentEventName}] ❌ 全局监听器已禁用`); 
 | 
  }; 
 | 
  
 | 
  /** 
 | 
   * 设置页面生命周期钩子(全局监听器模式) 
 | 
   * 监听器全局启用一次,不随页面切换关闭 
 | 
   * @param options 配置选项 
 | 
   */ 
 | 
  const setupLifecycle = ( 
 | 
    options: { 
 | 
      loadCacheOnShow?: boolean; // 是否在 onShow 时加载缓存 
 | 
    } = {} 
 | 
  ) => { 
 | 
    const { loadCacheOnShow = true } = options; 
 | 
  
 | 
    // 只在 onShow 时加载缓存,不禁用监听器 
 | 
    if (loadCacheOnShow) { 
 | 
      onShow(() => { 
 | 
        console.log(`[useScanCode][${currentEventName}] onShow 触发`); 
 | 
        loadFromCache(); 
 | 
      }); 
 | 
    } 
 | 
  
 | 
    // 注意:不再在 onHide 和 onUnmounted 中禁用监听器 
 | 
    // 监听器保持全局激活状态 
 | 
  }; 
 | 
  
 | 
  // 页面加载时自动从缓存读取 
 | 
  loadFromCache(); 
 | 
  
 | 
  return { 
 | 
    // 状态 
 | 
    deviceUid, 
 | 
    deviceModel, 
 | 
    scanData, 
 | 
    // 计算属性 
 | 
    hasScanned: computed(() => !!deviceUid.value), 
 | 
    displayText: computed(() => deviceModel.value || "未扫码"), 
 | 
    // 方法 
 | 
    loadFromCache, 
 | 
    saveToCache, 
 | 
    clearScanData, 
 | 
    validateQRCode, 
 | 
    enableListener, 
 | 
    disableListener, 
 | 
    setupLifecycle, 
 | 
  }; 
 | 
} 
 |