zrg
2025-09-05 46cc7a29dc1f9b3dffee5cdcb9b7f9dfdac3b16d
components/labelPrinterComponent/labelPrinterComponent.vue
@@ -1,10 +1,12 @@
<template>
   <view>
      <uni-popup ref="popup" type="bottom" @close="popupCloseHandler">
         <view style="height: 80vh; background-color: #fff;">
            <blueToothConnectorVue></blueToothConnectorVue>
   <view class="container" :hidden="isPopup === false">
      <uni-popup ref="popup" type="bottom" popupshow @change="popupChange">
         <view style="height: 80vh; background-color: #fff; padding-bottom: 2rem;">
            <blueToothConnectorVue ref="bt"></blueToothConnectorVue>
         </view>
      </uni-popup>
      <!-- 使用uni-popup类的组件时,当popup不显示时,组件树中没有popup内的模组,无法使用ref调用模组内的函数,故需要在外部挂载一个透明的组件 -->
      <blueToothConnectorVue style="display: none;position: absolute; bottom: 0;right: 0;" ref="bt2"></blueToothConnectorVue>
   </view>
</template>
@@ -25,11 +27,19 @@
      Commander,
   } from '@psdk/frame-father';
   import blueToothConnectorVue from '../../components/blueToothConnector/blueToothConnector.vue';
   import {
      CStatus
   } from '@psdk/cpcl';
   import {
      CommonUtils
   } from '../../utils/common';
import { nextTick } from "vue";
   export default {
      name: "lablePrinterComponent",
      data() {
         return {
            isPopup: false,
         };
      },
      props: {
@@ -46,97 +56,151 @@
         blueToothConnectorVue
      },
      methods: {
         openPopup(){
         async openPopup() {
            this.$refs.popup.open();
         },
         popupCloseHandler() {
            // 在popup中的操作针对ref bt对应的组件,需要将bt组件的状态与bt2进行一次同步
            this.$nextTick(() => {
               this.$refs.bt2 = this.$refs.bt
            })
            
         },
         async popupChange(e) {
            this.isPopup = e['show']
            await this.$nextTick()
         },
         async batchPrint(commandList) {
            console.log(this.$refs.bt2)
            let vm = this;
            let binarys = [];
            for (let command of commandList) {
               switch (vm.printMode) {
                  case "tspl":
                     let tspl = await vm.$printer.tspl().clear();
                     tspl.raw(Raw.text(command))
                     console.log("print command:\n" + tspl.command().string())
                     binarys.push(tspl.command().binary());
                     break;
                  case "cpcl":
                     let cpcl = await vm.$printer.cpcl().clear();
                     cpcl.raw(Raw.text(command))
                     console.log("print command:\n" + cpcl.command().string())
                     binarys.push(cpcl.command().binary());
                     break;
                  case "esc":
                     let esc = await vm.$printer.esc().clear();
                     esc.raw(Raw.text(command))
                     console.log("print command:\n" + esc.command().string())
                     binarys.push(esc.command().binary());
                     break;
                  default:
                     return uni.showToast({
                        icon: 'none',
                        title: 'printMode类型错误!'
                     })
               }
            }
            for(let binary of binarys){
                    try{
                        let sendSuccess = await this.$refs.bt2.sendMessage(binary);
                        console.log("发送是否成功: ", sendSuccess)
                        if(sendSuccess === false) {
                           return
                        }
                    }catch {
                        // 断开蓝牙连接
                        this.$refs.bt2.closeBluetooth()
                    }
            }
         },
         async execPrint() {
            try{
            // 检查蓝牙连接
            let btStatus = bluetoothTool.getBluetoothStatus()
            if (btStatus != true) {
               this.showToast("蓝牙连接异常!")
               return
            }
            // 检查是否连接设备
            let pairedDevices = bluetoothTool.getPairedDevices()
            if (pairedDevices.length < 1) {
               this.showToast("无设备连接!")
               return
            }
            try {
               if (typeof this.printInfo === 'function') {
                  // 传入的printInfo是函数,直接执行
                  let msg = await this.printInfo()
                  msg = this.uint8ArrayToSignedArray(msg)
                  console.log(msg)
                  this.sendMessage(msg)
               }
               else if (typeof this.printInfo === 'string') {
                  this.$refs.bt2.sendMessage(msg)
               } else if (typeof this.printInfo === 'string') {
                  // 传入的参数是字符串,则根据打印模式调用不同的打印API
                  // 这里的字符串需要对应打印模式
                  let printStr = this.printInfo.replace(/\n/g, "\r\n")
                  let vm = this;
                  let binary = null;
                  switch (vm.printMode) {
                     case "tspl":
                        const tspl = await vm.$printer.tspl().clear();
                        tspl.raw(Raw.text(printStr))
                        console.log("print command:",tspl.command().string())
                        binary = tspl.command().binary();
                        await vm.sendMessage(Array.from(vm.uint8ArrayToSignedArray(binary)));
                        break;
                     case "cpcl":
                        const cpcl = await vm.$printer.cpcl().clear();
                        console.log(cpcl)
                        cpcl.raw(Raw.text(printStr))
                        console.log("print command:\n",cpcl.command().string())
                        binary = cpcl.command().binary();
                        await vm.sendMessage(Array.from(vm.uint8ArrayToSignedArray(binary)));
                        break;
                     case "esc":
                        const esc = await vm.$printer.esc().clear();
                        esc.raw(Raw.text(printStr))
                        console.log("print command:\n",esc.command().string())
                        binary = esc.command().binary();
                        await vm.sendMessage(Array.from(vm.uint8ArrayToSignedArray(binary)));
                        break;
                     default:
                        return uni.showToast({
                           icon: 'none',
                           title: 'printMode类型错误!'
                        })
                  if (CommonUtils.isJson(this.printInfo) === true) {
                     // 如果需要批量传输,需要传JSON
                     let commandList = JSON.parse(this.printInfo)
                     for (let command of commandList) {
                        command.replace(/\n/g, "\r\n")
                     }
                     this.batchPrint(commandList)
                  } else {
                     let printStr = this.printInfo.replace(/\n/g, "\r\n")
                     let vm = this;
                     let binary = null;
                     switch (vm.printMode) {
                        case "tspl":
                           const tspl = await vm.$printer.tspl().clear();
                           tspl.raw(Raw.text(printStr))
                           console.log("print command:\n" + tspl.command().string())
                           binary = tspl.command().binary();
                           await this.$refs.bt2.sendMessage(binary);
                           break;
                        case "cpcl":
                           const cpcl = await vm.$printer.cpcl().clear();
                           cpcl.raw(Raw.text(printStr))
                           console.log("print command:\n" + cpcl.command().string())
                           binary = cpcl.command().binary();
                           await this.$refs.bt2.sendMessage(binary);
                           break;
                        case "esc":
                           const esc = await vm.$printer.esc().clear();
                           esc.raw(Raw.text(printStr))
                           console.log("print command:\n" + esc.command().string())
                           binary = esc.command().binary();
                           await this.$refs.bt2.sendMessage(binary);
                           break;
                        default:
                           return uni.showToast({
                              icon: 'none',
                              title: 'printMode类型错误!'
                           })
                     }
                  }
               }
               else {
               } else {
                  uni.showToast({
                     icon: 'none',
                     title: 'printInfo类型错误!'
                  })
               }
            }catch(e) {
            } catch (e) {
               console.error(e);
               uni.showToast({
                  icon: "none",
                  title: e
               })
            }
         },
         async sendMessage(cmd) {
            console.log(cmd);
            const result = bluetoothTool.sendByteData(cmd);
            uni.showToast({
               icon: 'none',
               title: result ? '发送成功!' : '发送失败...'
            })
         },
         uint8ArrayToSignedArray(uint8Array) {
            let signedArray = new Array(uint8Array.length);
            for (let i = 0; i < uint8Array.length; i++) {
               if (uint8Array[i] >= 128) {
                  signedArray[i] = uint8Array[i] - 256;
               } else {
                  signedArray[i] = uint8Array[i];
               }
            }
            return signedArray;
         },
      }
      },
   }
</script>
<style lang="scss">
<style lang="scss" scoped>
   * {
      box-sizing: border-box;
   }
   .container[hidden] {
      padding: 0 !important;
      height: 0 !important;
   }
</style>