| | |
| | | </view> |
| | | <view class="buttons"> |
| | | <button class="btn-b" size="mini" type="default" @tap="getList()">条码生成</button> |
| | | <button class="btn-c" size="mini" type="default" @tap="search">打印</button> |
| | | <button class="btn-c" size="mini" type="default" @tap="searchLabelPrinter()">搜索打印机</button> |
| | | </view> |
| | | </view> |
| | | |
| | | <view style="width: 100%;height: 16rpx;background-color: #e5e5e5;"></view> |
| | | |
| | | <view class="list" v-for="(item,index) in listData" :key="index" @tap="toSon(item)"> |
| | | <view class="list" v-for="(item,index) in listData" :key="index"> |
| | | <uni-card :title="item.物料代码" :extra="'No. ' + Number(index+1)" style="margin: 10px;"> |
| | | <view class="card-detail"> |
| | | <view class="detail"> |
| | |
| | | <text>条码编号:</text>{{item.条码编号}} |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="detail" style="text-align: right;" @tap.stop="labelPrint(item)"><text style="color: orange;">点击打印条码</text></view> |
| | | </uni-card> |
| | | </view> |
| | | |
| | | <view class="over" v-if="listData.length == 0">暂无数据</view> |
| | | <view class="over" v-if="listData.length != 0">已到底</view> |
| | | |
| | | <!-- 打印机选择列表 --> |
| | | <view v-if="maskShow" class="uni-mask" @tap="maskShow = false"> |
| | | <scroll-view class="uni-scroll_box" scroll-y> |
| | | <view class="uni-list-box" v-for="(device, index) in discoveredDevices" :key="index" @tap="connectBT(device)"> |
| | | <view class="uni-list_name">名称:{{ device.name }}</view> |
| | | <view class="uni-list_item">{{ connectedDeviceId === device.address?'已连接':'未连接' }}</view> |
| | | </view> |
| | | </scroll-view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getUserInfo } from "@/utils/auth.js"; |
| | | import bluetoothTool from '@/plugins/BluetoothTool.js' |
| | | import permission from '@/plugins/permission.js' |
| | | import { |
| | | InputImage |
| | | } from '@psdk/frame-imageb'; |
| | | import { |
| | | ConnectedDevice, |
| | | Lifecycle, |
| | | Raw, |
| | | FakeConnectedDevice, |
| | | WriteOptions, |
| | | } from '@psdk/frame-father'; |
| | | import { |
| | | CBar, |
| | | CBox, |
| | | CForm, |
| | | CImage, |
| | | CLine, |
| | | CCodeRotation, |
| | | CCodeType, |
| | | CPage, |
| | | CText, |
| | | CFont, |
| | | CBold, |
| | | CRotation, |
| | | CInverse, |
| | | CMag, |
| | | CQRCode, |
| | | CCorrectLevel, |
| | | CSN, |
| | | CStatus, |
| | | } from "@psdk/cpcl"; |
| | | import { |
| | | EImage |
| | | } from "@psdk/esc"; |
| | | export default { |
| | | data() { |
| | | return { |
| | |
| | | }, |
| | | sWhere:'', |
| | | listData:[], |
| | | printItem:'', |
| | | |
| | | maskShow:false, |
| | | discoveredDevices: [], // 查询到的设备 |
| | | connectedDeviceId: "" |
| | | } |
| | | }, |
| | | onLoad(e) { |
| | |
| | | this.linterid = e.linterid |
| | | this.HEntryID = e.hsubid |
| | | this.getData() |
| | | |
| | | //#ifdef APP-PLUS |
| | | // 蓝牙 |
| | | bluetoothTool.init({ |
| | | listenBTStatusCallback: (state) => { |
| | | if (state == 'STATE_ON') { |
| | | console.log(state); |
| | | } |
| | | }, |
| | | discoveryDeviceCallback: this.onDevice, |
| | | discoveryFinishedCallback: function() { |
| | | console.log("搜索完成"); |
| | | }, |
| | | readDataCallback: function(dataByteArr) { |
| | | /* if(that.receiveDataArr.length >= 200) { |
| | | that.receiveDataArr = []; |
| | | } |
| | | that.receiveDataArr.push.apply(that.receiveDataArr, dataByteArr); */ |
| | | console.log("读取完成" + dataByteArr); |
| | | }, |
| | | connExceptionCallback: function(e) { |
| | | console.log(e); |
| | | } |
| | | }); |
| | | //#endif |
| | | }, |
| | | methods: { |
| | | getData(){ |
| | |
| | | success: (res) => { |
| | | if(res.data.count == 1){ |
| | | var data = res.data.data |
| | | console.log(data) |
| | | this.baseInfo = { |
| | | HMainID:data[0].linterid, |
| | | HSubID:data[0].HEntryID, |
| | |
| | | HMaterName:data[0].物料名称, |
| | | HMaterModel:data[0].规格型号, |
| | | HQty:data[0].数量, |
| | | HSupID:data[0].HSupID, |
| | | SHdate:data[0].审核日期, |
| | | } |
| | | }else{ |
| | | uni.showToast({ |
| | |
| | | success: (res) => { |
| | | if(res.data.count == 1){ |
| | | this.listData = res.data.data |
| | | console.log(this.listData) |
| | | }else{ |
| | | uni.showToast({ |
| | | title:res.data.Message, |
| | |
| | | }) |
| | | }, |
| | | }); |
| | | } |
| | | }, |
| | | async checkPermission() { // 授权 |
| | | try { |
| | | let checkResult = await permission.androidPermissionCheck("bluetooth"); |
| | | console.log("检测信息:", checkResult); |
| | | if (checkResult.code == 1) { |
| | | let result = checkResult.data; |
| | | if (result == 1) { |
| | | console.log("授权成功!"); |
| | | } |
| | | if (result == 0) { |
| | | console.log("授权已拒绝!"); |
| | | } |
| | | if (result == -1) { |
| | | console.log("您已永久拒绝权限,请在应用设置中手动打开!"); |
| | | } |
| | | } |
| | | } catch (err) { |
| | | console.log("授权失败:", err); |
| | | } |
| | | }, |
| | | async searchLabelPrinter() { |
| | | // 查找打印机 |
| | | var that = this |
| | | // 使用openBluetoothAdapter 接口,免去主动申请权限的麻烦 |
| | | uni.openBluetoothAdapter({ |
| | | success: async (res) => { |
| | | await this.checkPermission(); |
| | | console.log('start discovery devices'); |
| | | this.discoveredDevices = []; |
| | | console.log(res) |
| | | bluetoothTool.discoveryNewDevice(); |
| | | this.maskShow = true |
| | | }, |
| | | fail: async (e) => { |
| | | console.error(e) |
| | | switch (e.code) { |
| | | case "10009": |
| | | this.showToast("此设备不支持设备搜索功能!"); |
| | | break; |
| | | default: |
| | | console.error(e); |
| | | } |
| | | } |
| | | }) |
| | | |
| | | }, |
| | | onDevice(device) { |
| | | console.log("监听寻找到新设备的事件---------------") |
| | | console.log(device) |
| | | if (typeof device === 'undefined') return; |
| | | if (typeof device.name === 'undefined') return; |
| | | console.log(device.name); |
| | | if (device.name === '') return; |
| | | if (device.name === null) return; |
| | | if (device.name.toUpperCase().endsWith('_BLE') || |
| | | device.name.toUpperCase().endsWith('-LE') || |
| | | device.name.toUpperCase().endsWith('-BLE')) return; |
| | | const isDuplicate = this.discoveredDevices.find(item => item.address === device.address); |
| | | if (isDuplicate) return; |
| | | this.discoveredDevices.push(device); |
| | | }, |
| | | connectBT(device) { |
| | | const vm = this; |
| | | uni.showLoading({ |
| | | title: '连接中' |
| | | }); |
| | | bluetoothTool.connDevice(device.address, (result) => { |
| | | console.log(result) |
| | | uni.hideLoading() |
| | | if (result) { |
| | | // // console.log(result); |
| | | bluetoothTool.cancelDiscovery(); |
| | | // console.log(vm.$printer) |
| | | vm.$printer.init(new FakeConnectedDevice()); |
| | | vm.connectedDeviceId = device.address; |
| | | uni.showToast({ |
| | | icon: 'none', |
| | | title: '连接成功' |
| | | }) |
| | | this.maskShow = false |
| | | } else { |
| | | uni.showToast({ |
| | | icon: 'none', |
| | | title: '连接失败' |
| | | }) |
| | | } |
| | | }); |
| | | }, |
| | | stopSearchBT() { |
| | | console.log("停止搜寻附近的蓝牙外围设备---------------") |
| | | bluetoothTool.cancelDiscovery(); |
| | | }, |
| | | closeBluetooth() { |
| | | console.log("停止蓝牙连接") |
| | | const vm = this; |
| | | if (vm.connectedDeviceId != '') { |
| | | bluetoothTool.closeBtSocket(); |
| | | vm.connectedDeviceId = ""; |
| | | } |
| | | }, |
| | | labelPrint(item) { |
| | | // 打印 |
| | | this.printItem = item |
| | | // 检查蓝牙连接 |
| | | let btStatus = bluetoothTool.getBluetoothStatus() |
| | | if(btStatus != true) { |
| | | this.showToast("蓝牙连接异常!") |
| | | return |
| | | } |
| | | |
| | | // 检查是否连接设备 |
| | | let pairedDevices = bluetoothTool.getPairedDevices() |
| | | if(pairedDevices.length < 1) { |
| | | this.showToast("无设备连接!") |
| | | return |
| | | } |
| | | |
| | | // 检查表单项是否有空值 |
| | | for (var key in this.hform) { |
| | | if (this.hform[key] == "") { |
| | | // todo 提示表单项不能为空 |
| | | this.showToast("表单不能有空值!") |
| | | return |
| | | } |
| | | } |
| | | this.printWrite() |
| | | }, |
| | | showToast(msg, status = "none") { |
| | | uni.showToast({ |
| | | title: msg, |
| | | icon: status, |
| | | duration: 2000 |
| | | }); |
| | | }, |
| | | ///转成安卓有符号的 |
| | | 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; |
| | | }, |
| | | async printWrite(type = "cpcl") { |
| | | const vm = this; |
| | | console.log("开始打印------------------") |
| | | switch (type) { |
| | | case "cpcl": |
| | | await vm.writeCpclModel(); |
| | | break; |
| | | } |
| | | }, |
| | | async writeCpclModel() { |
| | | const vm = this; |
| | | try { |
| | | const cpcl = await vm.$printer.cpcl().clear() |
| | | .page(new CPage({ |
| | | width: 608, |
| | | height: 300 |
| | | })) |
| | | .qrcode(new CQRCode({ |
| | | x: 450, |
| | | y: 30, |
| | | width: 5, |
| | | content: vm.printItem.条码编号, |
| | | codeRotation: CCodeRotation.ROTATION_0, |
| | | level: CCorrectLevel.L |
| | | })) |
| | | .text(new CText({ |
| | | x: 24, |
| | | y: 40, |
| | | content: vm.baseInfo.SHdate?"审核日期: " + vm.baseInfo.SHdate : "审核日期: ", |
| | | font: CFont.TSS24 |
| | | })) |
| | | .text(new CText({ |
| | | x: 24, |
| | | y: 80, |
| | | content: "物料编码: " + vm.printItem.物料代码, |
| | | font: CFont.TSS24 |
| | | })) |
| | | .text(new CText({ |
| | | x: 24, |
| | | y: 120, |
| | | content: "物料名称: " + vm.printItem.物料名称, |
| | | font: CFont.TSS24 |
| | | })) |
| | | .text(new CText({ |
| | | x: 24, |
| | | y: 160, |
| | | content: "规格型号: " + vm.printItem.规格型号, |
| | | font: CFont.TSS24 |
| | | })) |
| | | .text(new CText({ |
| | | x: 24, |
| | | y: 200, |
| | | content: "物料数量: " + vm.baseInfo.HQty, |
| | | font: CFont.TSS24 |
| | | })) |
| | | .text(new CText({ |
| | | x: 24, |
| | | y: 240, |
| | | content: "条码数量: " + vm.printItem.数量, |
| | | font: CFont.TSS24 |
| | | })) |
| | | |
| | | .form(new CForm()) //标签纸需要加定位指令 |
| | | .print(); |
| | | console.log(cpcl.command().string()); |
| | | var binary = cpcl.command().binary(); |
| | | await this.sendMessage(Array.from(this.uint8ArrayToSignedArray(binary))); |
| | | } catch (e) { |
| | | console.error(e); |
| | | uni.showToast({ |
| | | title: '失败', |
| | | }); |
| | | } |
| | | }, |
| | | async sendMessage(cmd) { |
| | | console.log(cmd); |
| | | const result = bluetoothTool.sendByteData(cmd); |
| | | uni.showToast({ |
| | | icon: 'none', |
| | | title: result ? '发送成功!' : '发送失败...' |
| | | }) |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .uni-mask { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | bottom: 0; |
| | | z-index: 9999; |
| | | display: flex; |
| | | align-items: center; |
| | | width: 100%; |
| | | background: rgba(0, 0, 0, 0.6); |
| | | padding: 0 30rpx; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .uni-scroll_box { |
| | | height: 60%; |
| | | background: #fff; |
| | | border-radius: 20rpx; |
| | | } |
| | | .uni-list-box { |
| | | margin: 0 20rpx; |
| | | padding: 15rpx 0; |
| | | border-bottom: 1px #f5f5f5 solid; |
| | | box-sizing: border-box; |
| | | } |
| | | .uni-list:last-child { |
| | | border: none; |
| | | } |
| | | .uni-list_name { |
| | | font-size: 30rpx; |
| | | color: #333; |
| | | } |
| | | .uni-list_item { |
| | | font-size: 24rpx; |
| | | color: #555; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | .operation-zone { |
| | | display: flex; |
| | | justify-content: space-around; |
| | | margin-top: 10rpx; |
| | | |
| | | .op1 { |
| | | border: 1px solid #41a863; |
| | | color: #41a863; |
| | | } |
| | | |
| | | .op4 { |
| | | border: 1px solid #da0000; |
| | | color: #da0000; |
| | | } |
| | | |
| | | } |
| | | |
| | | </style> |