| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- import { ref, onMounted, onUnmounted, onShow } from 'vue'
- import {
- useInit,
- useGlobalEvent,
- updateActivePageOnShow,
- cleanupOnPageUnload
- } from '@/utils/useBarcodeModule.js'
- /**
- * Vue3 Composable - 条码扫描
- * @param {Object} options 配置选项
- * @param {Function} options.onScan 扫描成功回调
- * @param {Function} options.onError 扫描失败回调
- * @param {boolean} options.autoInit 是否自动初始化
- */
- export function useBarcode(options = {}) {
- const {
- onScan,
- onError,
- autoInit = false
- } = options
- // 响应式状态
- const isScanning = ref(false)
- const isInitialized = ref(false)
- const scanResult = ref(null)
- const scanHistory = ref([])
- const error = ref(null)
- // 内部状态
- let removeListener = null
- /**
- * 初始化扫描器
- */
- const init = async () => {
- try {
- if (isInitialized.value) {
- console.warn('扫描器已经初始化')
- return true
- }
- useInit()
- isInitialized.value = true
- error.value = null
-
- console.log('扫描器初始化成功')
- return true
- } catch (err) {
- error.value = err
- if (onError) {
- onError(err)
- }
- console.error('扫描器初始化失败:', err)
- return false
- }
- }
- /**
- * 开始扫描
- */
- const startScan = async () => {
- try {
- // 确保扫描器已初始化
- if (!isInitialized.value) {
- const success = await init()
- if (!success) return false
- }
- if (isScanning.value) {
- console.warn('扫描器已经在运行中')
- return true
- }
- // 注册扫描事件监听
- removeListener = useGlobalEvent(handleScanResult)
- isScanning.value = true
- error.value = null
- console.log('开始扫描监听')
- return true
- } catch (err) {
- error.value = err
- if (onError) {
- onError(err)
- }
- console.error('开始扫描失败:', err)
- return false
- }
- }
- /**
- * 停止扫描
- */
- const stopScan = () => {
- try {
- if (removeListener) {
- removeListener()
- removeListener = null
- }
-
- isScanning.value = false
- console.log('停止扫描监听')
- return true
- } catch (err) {
- error.value = err
- if (onError) {
- onError(err)
- }
- console.error('停止扫描失败:', err)
- return false
- }
- }
- /**
- * 处理扫描结果
- */
- const handleScanResult = (result) => {
- try {
- console.log('收到扫描结果:', result)
-
- // 解析扫描结果
- const barcode = result.barcode || result.data || result.code || String(result)
- const timestamp = new Date().toLocaleString()
-
- const scanData = {
- barcode,
- timestamp,
- rawData: result
- }
-
- // 更新状态
- scanResult.value = scanData
-
- // 添加到历史记录
- scanHistory.value.unshift(scanData)
-
- // 限制历史记录数量
- if (scanHistory.value.length > 100) {
- scanHistory.value = scanHistory.value.slice(0, 100)
- }
-
- // 执行回调
- if (onScan) {
- onScan(scanData)
- }
-
- error.value = null
-
- } catch (err) {
- error.value = err
- if (onError) {
- onError(err)
- }
- console.error('处理扫描结果失败:', err)
- }
- }
- /**
- * 清空扫描历史
- */
- const clearHistory = () => {
- scanHistory.value = []
- scanResult.value = null
- }
- /**
- * 清理资源
- */
- const cleanup = () => {
- stopScan()
- cleanupOnPageUnload()
- }
- // 生命周期钩子
- onMounted(() => {
- if (autoInit) {
- init()
- }
- })
- onShow(() => {
- // 页面显示时更新活跃页面
- updateActivePageOnShow()
- })
- onUnmounted(() => {
- cleanup()
- })
- // 返回API
- return {
- // 状态
- isScanning,
- isInitialized,
- scanResult,
- scanHistory,
- error,
-
- // 方法
- init,
- startScan,
- stopScan,
- clearHistory,
- cleanup
- }
- }
|