草庐IT

【vue+蓝牙扫码枪】实现扫码录入发票信息,光标自动聚焦,列表中连续录入

花椒和蕊 2023-09-06 原文

上周给了我一把扫码枪,给了份说明书,说了一下如何开机,关机和连蓝牙

然后关于扫码枪的就没了

虽然没有搞过,但是搜一搜文章,了解了解,也是能搞出来的。

借鉴了这篇文章,感兴趣的可以戳这里,扫码枪【1】:vue中扫码枪的运用

博主说的挺明了的,扫码枪扫出来的信息会在有光标的输入框内显示,并且扫码枪自己做了一件事,就是扫码完成后自动触发input输入框的enter(键盘回车)事件

所以我们要做两件事,第一:让鼠标自动聚焦到输入框;第二:在回车事件中处理数据

我手上的应该就是普通的扫码枪,关于扫码枪的说明书,上面有很多条形码,主要说说我用到了哪些

首先开机需要按下扳机3秒,会听到开机声音

蓝牙usb接口要插在电脑上,然后扫“蓝牙键盘模式”条形码,链接蓝牙。

蓝牙连完注意有一个坑,我之前不知道,花了很多时间再找哪里出了问题

当我正常扫码的时候,输入框内会把扫到的信息都展示出来,但就是不触发enter键盘回车事件,一直在排查代码问题,最后才发现,说明书上有个“添加回车”条形码,这个也要扫一下

不用扫码枪的时候要扫“关机”条形码

注意点说完了,下面开始贴代码

我的需求是在一个弹窗里有扫码枪按钮和一个列表,列表里可以连续扫码录入,初次点“扫码枪”按钮新增一行并自动聚焦,扫完后再自动新增一行并自动聚焦,当点确认的时候把列表数据给后台,处理完后自动在页面的列表上新增我们扫出来的数据。

1、点扫码枪按钮,在列表内新增一条并自动聚焦

 <el-button
        class="UpButton ml5"
        size="mini"
        type="primary"
        title="扫码枪"
        icon="el-icon-full-screen"
        @click="openScanner"
        >扫码枪
      </el-button>
  <el-table
      ref="elTable"
      class="mt5"
      style="margin-top: 0px"
      :height="462"
      border
      :header-cell-style="{
        'text-align': 'center',
        'background-color': '#f8f8f9',
      }"
      :data="totalHandList"
    >
      <el-table-column
        align="center"
        :show-overflow-tooltip="true"
        prop="name"
        label="xxx"
        width="200"
      >     
        <template slot-scope="scope">
              <el-input
            class="input_scanner"
            v-model="scope.row.code"
            @keyup.enter.native="inputDown(scope.row)"
            :ref="'Input_' + scope.$index"
          ></el-input>        
        </template>
      </el-table-column>
         </el-table>
     <div class="scanner_text">
      <p>提示:扫描后,数据会自动显示在上方,请将输入法切换至英文状态下!</p>
      <p>支持增值税普通发票、增值税电子普通发票!</p>
    </div>        

注:因为还有其他设备共用这个弹窗,所以我用了计算属性,当切换到其他设备时,要删掉在扫码枪时多增的那条空白数据

  data() {
    return {
      //动态高度
      screenHeight: "",
      scannerList: [], //扫码枪数据源
      falseList: [], //假数据   
    };
  },

注:计算属性不需要在data中定义,后期删除的时候也不能删totalHandList,而是要去删除原数组
handFileList是其他硬件要绑的数组,可忽略

  computed: {
    totalHandList() {
      return [...this.handFileList, ...this.scannerList, ...this.falseList];
    },
  },
    // 打开扫码枪
    openScanner() {
      this.scannerFlag = true;//不重要
      this.$emit("closeScann", 1);//触发父组件事件,不重要
      if (this.falseList.length > 0) return;//防止点扫码枪重复新增
      this.falseList.push({
        name: "",
        percentage: 0,
        invoiceDate: "",
        invoiceCode: "",
        invoiceNumber: "",
        seller: "",
        pretaxAmount: "",
        total: "",
        flag: "scanner",
        code: "",
      });
      //给最后一行加光标
      this.$nextTick(() => {
        this.$refs["Input_" + (this.totalHandList.length - 1)].focus();
      });
    },

2、处理键盘回车事件,给input绑定好事件后,这个事件是扫码枪自动触发的
增值税电子专用发票当扫二维码的时候,可以扫出五大项,发票代码,发票号码,发票日期、校验码和不含税金额,并且除了这五项,还会有类型,可以区分是哪种发票的类型,这个要具体看情况,不清楚是不是通用的。五大项的排序位置是固定的,所以我这里是按顺序截取

 // 扫码枪自动开启enter事件
    async inputDown(row) {
      row.dealcode = row.code.split(",");     
      row.invoiceType = row.dealcode[1];
      row.invoiceCode = row.dealcode[2];
      row.invoiceNumber = row.dealcode[3];
      row.pretaxAmount = row.dealcode[4];
      row.invoiceDate = this.isYmd(row.dealcode[5]);
      row.checkCode = row.dealcode[6].substring(
        row.dealcode[6].length - 6,
        row.dealcode[6].length
      ); 
      let obj = {
        invoiceType: row.invoiceType,
        invoiceCode: row.invoiceCode,
        invoiceNumber: row.invoiceNumber,
        pretaxAmount: row.pretaxAmount,
        invoiceDate: row.invoiceDate,
        checkCode: row.checkCode,
      };
      const data = await checkScanner(obj);
      if (data.code == 200) {
        if (data.invoiceIndex.ocrResult == "重复录入") {
          this.$message.warning(
            `${data.invoiceIndex.ocrResult}!${data.invoiceIndex.ocrResultCreatName}已经录入!`
          );
          this.falseList[0].code = "";
        } else {
          this.scannerList.push({
            name: "",      
            percentage: 100,
            response: {
              msg: data.invoiceIndex.ocrResult,
              invoiceIndex: data.invoiceIndex,
            },
          });
          this.falseList[0] = {
            name: "",
            percentage: 0,
            invoiceDate: "",
            invoiceCode: "",
            invoiceNumber: "",
            seller: "",
            pretaxAmount: "",
            total: "",      
            flag: "scanner",
            code: "",
          };
          this.inputblur();
        }
      }
    },

说下日期处理,我们拿到的发票日期是这样的,‘20221125’,要处理成‘2022-11-25’

   // 处理日期格式
    isYmd(date) {
      if (!date) return this.$message.warning("请将输入法切换至英文状态下!");

      var partten = /(\d{4})(\d{2})(\d{2})/;
      var formateDate = date.replace(partten, "$1-$2-$3");
      return formateDate;
    },

    // 输入框失焦
    inputblur() {
      this.$nextTick(() => {
        this.$refs["Input_" + (this.totalHandList.length - 1)].focus();
      });
    },

3、删除,对原数组进行删除

    /** 删除 */
    handleDelete(row, index) {      
      if (row.uid) {
        this.handFileList = this.handFileList.filter((item) => {
          return item.uid !== row.uid;
        });
      }
      this.scannerList = this.scannerList.filter((item) => {
        return (
          item.response.invoiceIndex.invoiceNumber !==
          row.response.invoiceIndex.invoiceNumber
        );
      });
      this.falseList = [];
    },

应该没啥落的了,有问题,欢迎沟通

有关【vue+蓝牙扫码枪】实现扫码录入发票信息,光标自动聚焦,列表中连续录入的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - RVM 使用列表[0] - 2

    是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

随机推荐