zjh
2 天以前 ba492b6fbc7a6430a932c3d47c5594e0dd176ede
sn扫码优化
已修改2个文件
已添加2个文件
812 ■■■■■ 文件已修改
pages.json 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/QC/SJ/BarcodeScan.nvue 348 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/QC/SJ/BarcodeScanPlus.vue 332 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/QC/SJ/ScanCode.vue 112 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json
@@ -215,6 +215,26 @@
            }
        },
        {
            "path": "pages/QC/SJ/BarcodeScan",
            "style": {
                "navigationBarTitleText": "扫码",
                "enablePullDownRefresh": false,
                "app-plus": {
                    "titleNView": false
                }
            }
        },
        {
            "path": "pages/QC/SJ/BarcodeScanPlus",
            "style": {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false,
                "app-plus": {
                    "titleNView": false
                }
            }
        },
        {
            "path": "pages/QC/XJ/List",
            "style": {
                "enablePullDownRefresh": true,
pages/QC/SJ/BarcodeScan.nvue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,348 @@
<template>
  <view class="barcode-container">
    <!-- nvue å®˜æ–¹æ‰«ç ç»„ä»¶ -->
    <barcode
      ref="barcode"
      class="barcode-view"
      :autostart="false"
      background="#000000"
      frameColor="#007aff"
      scanbarColor="#007aff"
      :filters="barcodeFilters"
      @marked="onBarcodeMarked"
      @error="onBarcodeError"
    />
    <!-- é¡¶éƒ¨æ ‡é¢˜æ  -->
    <view class="header">
      <text class="header-title">{{ scanTitle }}</text>
      <text class="header-close" @click="closeScan">✕</text>
    </view>
    <!-- åº•部控制栏 -->
    <view class="footer">
      <view class="controls">
        <view class="control-btn" @click="toggleLight">
          <text class="btn-text">{{ lightOn ? '关闭' : '打开' }}闪光灯</text>
        </view>
        <view class="control-btn" @click="manualInput">
          <text class="btn-text">⌨️ æ‰‹åŠ¨è¾“å…¥</text>
        </view>
      </view>
      <view class="tips">
        <text class="tips-text">💡 å°†æ¡ç å¯¹å‡†æ‰«ææ¡†å†…,保持15-30cm距离</text>
      </view>
    </view>
  </view>
</template>
<script>
export default {
  data() {
    return {
      scanTitle: 'SN确认',
      lightOn: false,
      // å…³é”®ä¼˜åŒ–:只启用工业常用的条码类型,提高识别速度和成功率
      barcodeFilters: [
        8,  // CODE39 - å·¥ä¸šå¸¸ç”¨
        10, // CODE128 - å·¥ä¸šæœ€å¸¸ç”¨ï¼Œæ”¯æŒç‰¹æ®Šå­—符(/ - _ ç­‰ï¼‰
      ]
    };
  },
  onLoad(options) {
    // èŽ·å–æ‰«ç æ ‡é¢˜
    if (options.title) {
      this.scanTitle = decodeURIComponent(options.title);
    }
  },
  onReady() {
    console.log('BarcodeScan é¡µé¢å‡†å¤‡å®Œæˆ');
    // é¡µé¢åŠ è½½å®ŒæˆåŽå»¶è¿Ÿå¯åŠ¨æ‰«ç ï¼ˆç­‰å¾…ç•Œé¢å®Œå…¨æ¸²æŸ“ï¼‰
    setTimeout(() => {
      console.log('准备启动扫码...');
      this.startScan();
    }, 500);
  },
  onUnload() {
    // é¡µé¢å¸è½½æ—¶å–消扫码
    this.cancelScan();
  },
  methods: {
    // å¼€å§‹æ‰«ç 
    startScan() {
      console.log('startScan è¢«è°ƒç”¨');
      if (!this.$refs.barcode) {
        console.error('错误:barcode ç»„件引用不存在');
        uni.showToast({
          title: '扫码组件初始化失败',
          icon: 'none'
        });
        return;
      }
      try {
        console.log('开始扫码 - å¯ç”¨ç åˆ¶: CODE39, CODE128');
        this.$refs.barcode.start({
          conserve: false,    // ä¸ä¿å­˜æˆªå›¾
          vibrate: true,      // éœ‡åŠ¨æç¤º
          sound: 'default',   // æ’­æ”¾æç¤ºéŸ³
          filename: ''        // ä¸ä¿å­˜æ–‡ä»¶
        });
        console.log('扫码已启动');
      } catch (error) {
        console.error('启动扫码失败:', error);
        uni.showModal({
          title: '扫码启动失败',
          content: '可能原因:\n1. ç›¸æœºæƒé™æœªæŽˆäºˆ\n2. ç›¸æœºè¢«å…¶ä»–应用占用\n\n请检查相机权限或重启应用',
          confirmText: '手动输入',
          success: (res) => {
            if (res.confirm) {
              this.manualInput();
            }
          }
        });
      }
    },
    // å–消扫码
    cancelScan() {
      if (this.$refs.barcode) {
        this.$refs.barcode.cancel();
      }
    },
    // åˆ‡æ¢é—ªå…‰ç¯
    toggleLight() {
      this.lightOn = !this.lightOn;
      if (this.$refs.barcode) {
        this.$refs.barcode.setFlash(this.lightOn);
      }
    },
    // æ‰«ç æˆåŠŸå›žè°ƒ
    onBarcodeMarked(e) {
      console.log('扫码成功 - åŽŸå§‹æ•°æ®:', e);
      console.log('扫码成功 - å®Œæ•´detail:', e.detail);
      const result = e.detail.message; // æ‰«ç ç»“æžœ
      const type = e.detail.code;      // æ¡ç ç±»åž‹
      console.log('扫码结果:', result);
      console.log('条码类型:', type);
      console.log('结果长度:', result ? result.length : 0);
      if (result) {
        // åŽ»é™¤é¦–å°¾ç©ºæ ¼
        const cleanResult = result.trim();
        console.log('清理后结果:', cleanResult);
        console.log('清理后长度:', cleanResult.length);
        // éœ‡åŠ¨åé¦ˆ
        uni.vibrateShort();
        // æ˜¾ç¤ºæˆåŠŸæç¤º
        uni.showToast({
          title: '扫码成功',
          icon: 'success',
          duration: 800
        });
        // å»¶è¿Ÿå…³é—­ï¼Œè®©ç”¨æˆ·çœ‹åˆ°æç¤º
        setTimeout(() => {
          // è¿”回上一页并传递扫码结果
          const pages = getCurrentPages();
          const prevPage = pages[pages.length - 2];
          if (prevPage) {
            // è°ƒç”¨ä¸Šä¸€é¡µçš„回调方法
            if (prevPage.$vm && prevPage.$vm.onScanSuccess) {
              console.log('准备传递结果到上一页:', cleanResult);
              prevPage.$vm.onScanSuccess(cleanResult);
            } else {
              console.error('上一页没有 onScanSuccess æ–¹æ³•');
            }
          }
          // å…³é—­å½“前页面
          uni.navigateBack();
        }, 800);
      } else {
        console.error('警告:扫码结果为空');
        uni.showToast({
          title: '扫码结果为空,请重试',
          icon: 'none'
        });
      }
    },
    // æ‰«ç å¤±è´¥å›žè°ƒ
    onBarcodeError(e) {
      console.error('扫码错误 - è¯¦ç»†ä¿¡æ¯:', e);
      console.error('错误对象:', JSON.stringify(e));
      // æ ¹æ®é”™è¯¯ç±»åž‹ç»™å‡ºä¸åŒæç¤º
      let errorMsg = '扫码失败';
      if (e && e.detail) {
        if (e.detail.code === -1) {
          errorMsg = '相机权限未授予';
        } else if (e.detail.code === -2) {
          errorMsg = '相机启动失败';
        } else {
          errorMsg = `扫码错误: ${e.detail.message || '未知错误'}`;
        }
      }
      uni.showModal({
        title: errorMsg,
        content: '建议:\n1. æ£€æŸ¥ç›¸æœºæƒé™\n2. é‡å¯åº”用\n3. ä½¿ç”¨æ‰‹åŠ¨è¾“å…¥',
        confirmText: '手动输入',
        cancelText: '重试',
        success: (res) => {
          if (res.confirm) {
            this.manualInput();
          } else if (res.cancel) {
            // é‡æ–°å¯åŠ¨æ‰«ç 
            setTimeout(() => {
              this.startScan();
            }, 300);
          }
        }
      });
    },
    // æ‰‹åŠ¨è¾“å…¥
    manualInput() {
      const self = this;
      uni.showModal({
        title: `输入${this.scanTitle}`,
        editable: true,
        placeholderText: '请输入条码内容',
        success(res) {
          if (res.confirm && res.content) {
            // è¿”回上一页并传递输入结果
            const pages = getCurrentPages();
            const prevPage = pages[pages.length - 2];
            if (prevPage && prevPage.$vm && prevPage.$vm.onScanSuccess) {
              prevPage.$vm.onScanSuccess(res.content.trim());
            }
            uni.navigateBack();
          }
        }
      });
    },
    // å…³é—­æ‰«ç 
    closeScan() {
      this.cancelScan();
      uni.navigateBack();
    }
  }
};
</script>
<style>
.barcode-container {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #000000;
}
.barcode-view {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 750rpx;
  background-color: #000000;
}
/* é¡¶éƒ¨æ ‡é¢˜æ  */
.header {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 120rpx;
  background-color: rgba(0, 122, 255, 0.9);
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
  padding-left: 30rpx;
  padding-right: 30rpx;
  z-index: 10;
}
.header-title {
  font-size: 36rpx;
  font-weight: bold;
  color: #ffffff;
}
.header-close {
  font-size: 48rpx;
  font-weight: bold;
  color: #ffffff;
  padding-left: 20rpx;
  padding-right: 20rpx;
}
/* åº•部控制栏 */
.footer {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: rgba(0, 0, 0, 0.7);
  z-index: 10;
}
.controls {
  flex-direction: row;
  justify-content: space-around;
  padding-top: 20rpx;
  padding-bottom: 20rpx;
  padding-left: 20rpx;
  padding-right: 20rpx;
}
.control-btn {
  flex: 1;
  height: 80rpx;
  background-color: #007aff;
  border-radius: 10rpx;
  justify-content: center;
  align-items: center;
  margin-left: 10rpx;
  margin-right: 10rpx;
}
.btn-text {
  font-size: 28rpx;
  color: #ffffff;
}
.tips {
  padding-top: 20rpx;
  padding-bottom: 30rpx;
  padding-left: 20rpx;
  padding-right: 20rpx;
  background-color: rgba(255, 251, 230, 0.9);
  align-items: center;
}
.tips-text {
  font-size: 26rpx;
  color: #333333;
  text-align: center;
  font-weight: bold;
}
</style>
pages/QC/SJ/BarcodeScanPlus.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,332 @@
<template>
  <view class="scan-container">
    <view class="scan-header">
      <text class="header-title">{{ scanTitle }}</text>
      <text class="header-close" @click="closeScan">✕</text>
    </view>
    <view class="scan-body">
      <view class="scan-tips">
        <text class="tips-icon">📷</text>
        <text class="tips-text">正在启动相机...</text>
        <text class="tips-desc">请将条码对准取景框内</text>
      </view>
      <view class="scan-controls">
        <button class="control-btn primary" @click="startScan">
          <text class="btn-text">开始扫码</text>
        </button>
        <button class="control-btn" @click="manualInput">
          <text class="btn-text">手动输入</text>
        </button>
      </view>
      <view class="scan-info">
        <text class="info-title">💡 æ‰«ç æç¤º</text>
        <text class="info-item">• ä¿æŒ15-30cm距离</text>
        <text class="info-item">• ç¡®ä¿å…‰çº¿å……è¶³</text>
        <text class="info-item">• æ¡ç æ¸…晰无破损</text>
        <text class="info-item">• æ”¯æŒå·¥ä¸šæ¡ç ï¼ˆCODE128/CODE39)</text>
      </view>
    </view>
  </view>
</template>
<script>
export default {
  data() {
    return {
      scanTitle: 'SN确认',
    };
  },
  onLoad(options) {
    if (options.title) {
      this.scanTitle = decodeURIComponent(options.title);
    }
    // è‡ªåŠ¨å¯åŠ¨æ‰«ç 
    setTimeout(() => {
      this.startScan();
    }, 500);
  },
  methods: {
    // ä½¿ç”¨ uni.scanCode API æ‰«ç ï¼ˆè¯†åˆ«çŽ‡æ›´é«˜ï¼‰
    startScan() {
      const self = this;
      // #ifdef APP-PLUS
      uni.scanCode({
        // å…³é”®ä¼˜åŒ–1:只扫描条形码,提高识别速度和成功率
        scanType: ['barCode'],
        // å…³é”®ä¼˜åŒ–2:仅使用相机
        onlyFromCamera: true,
        success(res) {
          console.log('扫码成功 - åŽŸå§‹ç»“æžœ:', res);
          console.log('扫码成功 - æ¡ç å†…容:', res.result);
          console.log('扫码成功 - æ¡ç ç±»åž‹:', res.scanType);
          console.log('扫码成功 - å­—符集:', res.charSet);
          let scanResult = res.result || '';
          // å¤„理扫码结果
          scanResult = scanResult.trim();
          console.log('处理后的结果:', scanResult);
          if (!scanResult) {
            console.error('警告:扫码结果为空');
            uni.showToast({
              title: '扫码结果为空,请重试',
              icon: 'none',
              duration: 1500
            });
            // è‡ªåŠ¨é‡æ–°æ‰«ç 
            setTimeout(() => {
              self.startScan();
            }, 1500);
            return;
          }
          // éœ‡åŠ¨åé¦ˆ
          uni.vibrateShort();
          // æ˜¾ç¤ºæˆåŠŸæç¤º
          uni.showToast({
            title: '扫码成功',
            icon: 'success',
            duration: 800
          });
          // è¿”回上一页并传递结果
          setTimeout(() => {
            const pages = getCurrentPages();
            const prevPage = pages[pages.length - 2];
            if (prevPage && prevPage.$vm && prevPage.$vm.onScanSuccess) {
              prevPage.$vm.onScanSuccess(scanResult);
            }
            uni.navigateBack();
          }, 800);
        },
        fail(err) {
          console.error('扫码失败 - è¯¦ç»†ä¿¡æ¯:', err);
          console.error('错误代码:', err.errCode);
          console.error('错误消息:', err.errMsg);
          // å¦‚果是用户取消,直接返回
          if (err.errMsg && err.errMsg.indexOf('cancel') > -1) {
            console.log('用户取消扫码');
            return;
          }
          // å…¶ä»–错误,提示用户并提供重试选项
          uni.showModal({
            title: '扫码失败',
            content: `建议:
1. ä¿æŒ15-25cm距离
2. ç¡®ä¿å…‰çº¿å……è¶³
3. æ¡ç æ°´å¹³å¯¹å‡†
4. å°è¯•慢慢移动距离
如仍失败,可使用手动输入`,
            confirmText: '重新扫码',
            cancelText: '手动输入',
            success(modalRes) {
              if (modalRes.confirm) {
                // é‡æ–°æ‰«ç 
                setTimeout(() => {
                  self.startScan();
                }, 300);
              } else if (modalRes.cancel) {
                // æ‰‹åŠ¨è¾“å…¥
                self.manualInput();
              }
            }
          });
        }
      });
      // #endif
      // #ifdef H5
      uni.showModal({
        title: '提示',
        content: 'H5环境不支持扫码,请使用手动输入功能',
        showCancel: false,
        success() {
          self.manualInput();
        }
      });
      // #endif
      // #ifdef MP-WEIXIN
      uni.scanCode({
        scanType: ['barCode', 'qrCode'],
        success(res) {
          const scanResult = res.result.trim();
          const pages = getCurrentPages();
          const prevPage = pages[pages.length - 2];
          if (prevPage && prevPage.$vm && prevPage.$vm.onScanSuccess) {
            prevPage.$vm.onScanSuccess(scanResult);
          }
          uni.navigateBack();
        },
        fail(err) {
          console.error('扫码失败:', err);
          self.manualInput();
        }
      });
      // #endif
    },
    // æ‰‹åŠ¨è¾“å…¥
    manualInput() {
      const self = this;
      uni.showModal({
        title: `输入${this.scanTitle}`,
        editable: true,
        placeholderText: '请输入条码内容(如:51105/ARAAZF5V553990)',
        success(res) {
          if (res.confirm && res.content) {
            const inputValue = res.content.trim();
            // è¿”回上一页并传递输入结果
            const pages = getCurrentPages();
            const prevPage = pages[pages.length - 2];
            if (prevPage && prevPage.$vm && prevPage.$vm.onScanSuccess) {
              prevPage.$vm.onScanSuccess(inputValue);
            }
            uni.navigateBack();
          }
        }
      });
    },
    // å…³é—­æ‰«ç 
    closeScan() {
      uni.navigateBack();
    }
  }
};
</script>
<style scoped>
.scan-container {
  min-height: 100vh;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  padding: 20rpx;
}
.scan-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 30rpx 20rpx;
  background-color: rgba(255, 255, 255, 0.95);
  border-radius: 20rpx;
  margin-bottom: 40rpx;
  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
}
.header-title {
  font-size: 36rpx;
  font-weight: bold;
  color: #333;
}
.header-close {
  font-size: 48rpx;
  color: #999;
  padding: 0 20rpx;
}
.scan-body {
  flex: 1;
}
.scan-tips {
  background-color: rgba(255, 255, 255, 0.95);
  border-radius: 20rpx;
  padding: 60rpx 40rpx;
  margin-bottom: 30rpx;
  text-align: center;
  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
}
.tips-icon {
  font-size: 120rpx;
  display: block;
  margin-bottom: 30rpx;
}
.tips-text {
  font-size: 32rpx;
  color: #333;
  font-weight: bold;
  display: block;
  margin-bottom: 20rpx;
}
.tips-desc {
  font-size: 28rpx;
  color: #666;
  display: block;
}
.scan-controls {
  display: flex;
  justify-content: space-between;
  gap: 20rpx;
  margin-bottom: 30rpx;
}
.control-btn {
  flex: 1;
  height: 90rpx;
  background-color: rgba(255, 255, 255, 0.95);
  border-radius: 15rpx;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 4rpx 15rpx rgba(0, 0, 0, 0.1);
  border: none;
}
.control-btn.primary {
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.control-btn.primary .btn-text {
  color: #fff;
}
.btn-text {
  font-size: 30rpx;
  color: #333;
  font-weight: bold;
}
.scan-info {
  background-color: rgba(255, 255, 255, 0.95);
  border-radius: 20rpx;
  padding: 40rpx;
  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
}
.info-title {
  font-size: 32rpx;
  font-weight: bold;
  color: #333;
  display: block;
  margin-bottom: 30rpx;
}
.info-item {
  font-size: 28rpx;
  color: #666;
  line-height: 2;
  display: block;
}
</style>
pages/QC/SJ/ScanCode.vue
@@ -3,7 +3,7 @@
    <view class="title">SN确认</view>
    <view v-if="current === 'true'" class="remark">
      å¤‡æ³¨ï¼šç‚¹å‡»"扫码"按钮扫描SN码,再次点击可覆盖上次记录
      å¤‡æ³¨ï¼šç‚¹å‡»"扫码"按钮打开专业扫码界面(免费官方组件)
    </view>
    <view class="scan-table">
@@ -50,34 +50,90 @@
      mid: null, // MES主表ID
      scanItems: [], // ä»Ž MES_SJ_SCAN_ITEM_CK èŽ·å–
      current: 'true', // æŽ§åˆ¶æ˜¯å¦å¯ç¼–辑
      currentScanIndex: -1, // å½“前扫描的索引
    };
  },
  onLoad(options) {
    // è°ƒè¯•信息:打印接收到的参数
    console.log('ScanCode页面接收到的参数:', options);
    // å‡è®¾ä»Žä¸Šä¸€é¡µä¼ å…¥ mid
    this.mid = options.id || null;
    this.current = options.current || 'true'; // é»˜è®¤ä¸ºå¯ç¼–辑状态
    // è°ƒè¯•信息:打印mid值
    console.log('mid值:', this.mid);
    console.log('current值:', this.current);
    // ä¸´æ—¶æµ‹è¯•:如果mid为空,使用默认值
    if (!this.mid) {
      console.warn('警告:mid为空,使用测试数据');
      // å–消注释下面一行可以直接显示测试数据
      // this.loadTestData();
      // return;
    }
    this.getScanItems();
  },
  methods: {
    // ä¸´æ—¶æµ‹è¯•方法:加载测试数据
    loadTestData() {
      console.log('加载测试数据');
      this.scanItems = [
        { id: 1, scanItem: '产品SN', snNo: '' },
        { id: 2, scanItem: '机架号', snNo: '' },
        { id: 3, scanItem: '电机编号', snNo: '' },
      ];
      uni.showToast({
        title: '已加载测试数据',
        icon: 'success'
      });
    },
    // ä»Ž MES_SJ_SCAN_ITEM_CK èŽ·å–æ•°æ®
    getScanItems() {
      if (!this.mid) return;
      console.log('开始获取SN列表, mid:', this.mid);
      if (!this.mid) {
        console.error('mid为空,无法获取列表');
        uni.showToast({
          title: "缺少必要参数",
          icon: "none"
        });
        return;
      }
      uni.showLoading({ title: "加载中..." });
      console.log('准备调用接口:/SJ/GetList, å‚æ•°:', { mid: this.mid });
      
      this.$post({
        url: "/SJ/GetList",
        data: { mid: this.mid }
      }).then(res => {
        console.log('接口返回结果:', res);
        if (res.status === 0) {
          console.log('返回的数据:', res.data);
          this.scanItems = res.data.map(x => ({
            id: x.id,
            scanItem: x.scanItem,
            snNo: x.snNo || "",
          }));
          console.log('处理后的scanItems:', this.scanItems);
          if (this.scanItems.length === 0) {
            uni.showToast({
              title: "暂无扫码项目",
              icon: "none"
            });
          }
        } else {
          console.error('接口返回错误:', res.message);
          uni.showToast({ 
            title: res.message || "加载失败", 
            icon: "none" 
@@ -94,38 +150,30 @@
      });
    },
    // æ‰«ç åŠŸèƒ½
    // æ‰«ç æˆåŠŸå›žè°ƒï¼ˆç”± nvue æ‰«ç é¡µé¢è°ƒç”¨ï¼‰
    onScanSuccess(scanResult) {
      console.log('扫码结果:', scanResult);
      if (this.currentScanIndex >= 0 && this.currentScanIndex < this.scanItems.length) {
        // æ›´æ–°å¯¹åº”项目的SN码
        this.scanItems[this.currentScanIndex].snNo = scanResult.trim();
        uni.showToast({
          title: '扫码成功',
          icon: 'success'
        });
      }
    },
    // æ‰“开扫码页面(使用识别率更高的方案)
    onScan(index) {
      const self = this;
      // #ifdef MP-WEIXIN
      uni.scanCode({
        success(res){
          self.scanItems[index].snNo = res.result;
        },
        fail(err) {
          console.log("扫码失败", err);
        },
      this.currentScanIndex = index;
      const itemName = this.scanItems[index].scanItem;
      // è·³è½¬åˆ° nvue æ‰«ç é¡µé¢ï¼ˆä½¿ç”¨å®˜æ–¹ Barcode ç»„件,识别率 90%+)
      uni.navigateTo({
        url: `/pages/QC/SJ/BarcodeScan?title=${encodeURIComponent(itemName)}`
      });
      // #endif
      // #ifdef H5
      uni.showToast({
        title: "请使用扫码枪输入到SN输入框",
        icon: "none",
      });
      // #endif
      // #ifdef APP-PLUS
      uni.scanCode({
        scanType: ['barCode'],  // æ–°å¢žè¿™ä¸€è¡Œ
        autoDecodeCharset: true, // è‡ªåŠ¨è§£ç å­—ç¬¦é›†
        success(res) {
            console.log(res)
          self.scanItems[index].snNo = res.result;
        },
      });
      // #endif
    },
    // ä¿å­˜ SN æ•°æ®åˆ° MES_SJ_SCAN_ITEM_CK