<template> <view class="print-index"> <navigator class="device-box row bothSide verCenter" url="/pages/tag/deviceList"> <view class="row verCenter"> <text class="iconfont icon-juxing7"></text> <text class="t1">连接设备</text> </view> <view class="row verCenter"> <template v-if="device_name != ''"> <text class="t2 active">{{ device_name }}</text> </template> <template v-else> <text class="t2">未连接</text> </template> <text class="iconfont icon-sanjiaoxing2"></text> </view> </navigator> <view class="print-form"> <view class="box row verCenter"> <view class="label">打印类型</view> <view class="tab row verCenter"> <view class="tab-pane row rowCenter verCenter" v-for="(item, index) in items_print_type" :key="index" :class="{ curr: index_print_type == index }" @click="change(index, 'print_type')">{{ item }}</view> </view> </view> <view class="box row verCenter"> <view class="row verCenter" style="flex:0 0 93%"> <view class="label">入仓号</view> <input type="text" v-model="form.erp_order_sn" placeholder-style="font-size:24rpx;color:#404547;" class="uni-input" placeholder="请输入入仓号" /> </view> <text class="scan iconfont icon-juxing6" @click="scanChange()"></text> </view> <view class="box row verCenter"> <view class="label">{{ text }}</view> <input type="number" v-model="form.label_num" placeholder-style="font-size:24rpx;color:#404547;" class="uni-input" placeholder="请输入" /> </view> <view class="box row verCenter"> <view class="label">批次</view> <view class="pick-box row"> <picker @change="bindPickerChangeBatch" :value="form.batch" :range="batchArr" class="picker"> <view class="uni-input">{{ batchArr[form.batch] }}</view> </picker> </view> </view> <view class="box row verCenter" v-if="index_print_type == 0"> <view class="label">卡板数</view> <view class="pick-box row"> <picker @change="bindPickerChange" :value="numberIndex" :range="numberArr" class="picker"> <view class="uni-input">{{ numberArr[numberIndex] }}</view> </picker> </view> </view> <template v-for="(item, index) in numberList" v-if="flag && index_print_type == 0"> <view class="box row verCenter"> <view class="label">第{{ index + 1 }}卡板数量</view> <input type="number" placeholder-style="font-size:24rpx;color:#404547;" class="uni-input" placeholder="请输入数量" @input="onInput($event, index)" /> </view> </template> </view> <view class="btn row rowCenter verCenter" @click="submit()">提交打印</view> </view> </template> <script> import { API } from '@/util/api.js'; import { getPlatform } from '@/util/util.js'; const ToBase64 = require('../../util/base64gb2312.js'); export default { data() { return { print_number: 0, serviceId: '', deviceId: '', device_name: '', characteristics: '', text: '标签数量', index: -1, index_erp_order_sn_pre: -1, index_print_type: 1, items_erp_order_sn_pre: ['A单号', 'B单号', 'D单号'], items_print_type: ['卡板', '散箱'], traySelectOption: [], sendData64: '', printLabelData: [], print_text: '总箱数', platform: '', wstyptll_id: '', batchArr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], flag: false, numberList: [], numberArr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], numberIndex: 0, form: { batch: 0, //批次 print_type: 2, //打印类型 erp_order_sn: '', //入仓号 label_num: '1', //总箱数 number: 1, numbers: [] } }; }, onLoad(option) { this.platform = getPlatform(); //停止搜索,节省系统资源 uni.stopBluetoothDevicesDiscovery({ success: res => { console.log('停止搜索', JSON.stringify(res.errMsg)); } }); try { uni.removeStorageSync('device'); } catch (e) { // error } }, onShow() { //获取已连接蓝牙设备信息 const deviceData = uni.getStorageSync('device') || ''; if (deviceData) { this.deviceId = deviceData.deviceId; this.serviceId = deviceData.serviceId; this.characteristics = deviceData.characteristics; this.device_name = deviceData.name; } else { this.deviceId = ''; this.device_name = ''; } }, methods: { scanChange() { uni.scanCode({ success: res => { if (res.errMsg == 'scanCode:ok') { this.form.erp_order_sn = res.result; } }, fail: function(res) { uni.showToast({ title: '扫码失败', icon: 'error' }); } }); }, /** * 卡板数监听 */ bindPickerChange(e) { this.numberIndex = Number(e.detail.value); this.form.number = Number(e.target.value) + 1; if (this.form.number > 1) { this.flag = true; this.numberList = []; this.form.numbers = []; for (var i = 0; i < this.form.number; i++) { if (i < this.form.number - 1) { this.numberList.push(i); this.form.numbers.push({ value: '' }); } } } else { this.flag = false; this.numberList = []; this.form.numbers = []; } }, /** * 批次监听 */ bindPickerChangeBatch(e) { this.form.batch = e.target.value; }, /** * 卡板数量list监听 */ onInput(e, index) { this.form.numbers[index].value = e.detail.value; }, submit() { if (!this.device_name) { uni.showModal({ title: '提示', content: '请连接蓝牙设备', showCancel: false, confirmText: '关闭', success: function(res) { if (res.confirm) { uni.navigateTo({ url: '/pages/tag/deviceList' }); } else if (res.cancel) { console.log('用户点击取消'); } } }); return false; } if (!this.form.erp_order_sn) { uni.showModal({ title: '提示', content: '请输入入仓号', showCancel: false }); return false; } if (!this.form.label_num) { uni.showModal({ title: '提示', content: '请输入' + this.text, showCancel: false }); return false; } if (!/(^[0-9]*$)/.test(this.form.label_num)) { uni.showModal({ title: '提示', content: this.text + '为纯数字', showCancel: false }); return false; } if (this.index_print_type == 0 && this.form.number > 1) { let label_num = this.form.label_num * 1; //总箱数 let num = 0; if (this.form.numbers.length > 0) { for (let i = 0; i < this.form.numbers.length; i++) { num += this.form.numbers[i].value * 1; } } if (label_num != num) { uni.showModal({ title: '提示', content: '卡板数量总和必须等于总箱数', showCancel: false }); return false; } } let params = Object.assign(this.form, { is_add: 0 }); this.request(API.checkRepeatPrintLabel, 'POST', params, true).then(res => { if (res.err_code === 0) { this.printLabelChange(); } else { uni.showModal({ title: '提示', content: res.err_msg, confirmText: '继续打印', success: res => { if (res.confirm) { this.printLabelChange(); } else if (res.cancel) { console.log('用户点击取消'); } } }); } }); }, printLabelChange() { this.request(API.printLabel, 'POST', this.form, true).then(res => { if (res.err_code === 0) { this.printLabelData = res.data; this.wstyptll_id = res.data[0].wstyptll_id; this.sendDataChange(); //发送数据 } else { uni.showModal({ title: '提示', content: res.err_msg, confirmText: '关闭' }); } }); }, /** * 向蓝牙发送数据 */ sendDataChange() { try { uni.showLoading({ title: '打印中...' }); console.log('第' + this.print_number + '次开始打印start...'); let data = []; if (this.printLabelData.length > 0) { data.push('! 60 200 200 300 1\r\n'); data.push('SETMAG 3 4\r\n'); data.push('T 7 0 10 20 ' + this.printLabelData[this.print_number].erp_order_sn + '\r\n'); data.push('SETMAG 0 0\r\n'); if (this.form.print_type == 1) { data.push('T 5 0 10 120 总箱数:' + this.printLabelData[this.print_number].label_num + '箱\r\n'); } else { data.push('T 5 0 10 120 箱号:' + this.printLabelData[this.print_number].label_sort + '/' + this.printLabelData[this.print_number].label_num + '\r\n'); } data.push('T 8 0 10 180 时间:' + this.printLabelData[this.print_number].create_time_cn + '\r\n'); data.push('T 8 0 10 220 仓库代码:' + this.printLabelData[this.print_number].warehouse_code + '\r\n'); data.push('T 8 0 10 260 流水号:' + this.printLabelData[this.print_number].wstyptll_id_sn + '\r\n'); data.push('SETMAG 4 1' + '\r\n'); data.push('T 8 0 350 30 ' + this.printLabelData[this.print_number].batch + '\r\n'); data.push('SETMAG 0 0' + '\r\n'); data.push('B QR 260 120 M 2 U 8\r\n'); data.push('MA,' + this.printLabelData[this.print_number]['box_code'] + '|\r\n'); data.push('ENDQR\r\n'); data.push('FORM\r\n'); data.push('PRINT\r\n'); } console.log(data.join('')); this.cutCommand(data.join('')); } catch (e) { uni.hideLoading(); uni.showModal({ title: '提示', content: '数据异常,请重试', showCancel: false, confirmText: '关闭' }); } }, /** * 分批传输数据 */ cutCommand: function(data) { var packageLength = 10; //安卓不超过10个字节传输 var sendData64 = []; if (this.platform == 'ios') { packageLength = 30; } console.log('package长度:' + packageLength); for (let i = 0; i < Math.ceil(data.length / packageLength); i++) { sendData64[i] = uni.base64ToArrayBuffer(ToBase64.encode64gb2312(data.substr(i * packageLength, packageLength))); } this.sendData64 = sendData64; console.log(sendData64); this.writeBLECharacteristicValue(1); }, /** * 写入二进制数据 */ writeBLECharacteristicValue(times) { var sendData64 = this.sendData64; if (sendData64.length >= times) { uni.writeBLECharacteristicValue({ deviceId: this.deviceId, serviceId: this.serviceId, characteristicId: this.characteristics, value: sendData64[times - 1], success: res => { this.writeBLECharacteristicValue(++times); }, fail: res => { uni.hideLoading(); uni.showModal({ title: '提示', content: '打印失败,请重新进入打印页面', showCancel: false, confirmText: '关闭', success: res => { if (res.confirm) { this.characteristics = ''; //连接蓝牙信息清空 this.deviceId = ''; //连接蓝牙信息清空 this.device_name = ''; //连接蓝牙信息清空 this.print_number = 0; //打印计数归零 this.printLabelData = []; //打印数据清空 this.sendData64 = ''; //发送蓝牙数据清空 this.delErpOrderSnCodeManage(); //及时作废 } else if (res.cancel) { console.log('用户点击取消'); } } }); } }); } else { this.print_number++; console.log('第' + this.print_number + '次传输完成end'); if (this.print_number < this.printLabelData.length) { this.sendDataChange(); } else { uni.hideLoading(); //重置 this.print_number = 0; //打印计数归零 this.printLabelData = []; //打印数据清空 this.sendData64 = ''; //发送蓝牙数据清空 uni.showModal({ title: '提示', content: '打印成功,请查看标签打印机', showCancel: false, confirmText: '关闭', success: function(res) { if (res.confirm) { console.log('用户点击确定'); } else if (res.cancel) { console.log('用户点击取消'); } } }); } } }, delErpOrderSnCodeManage() { this.request(API.delWstyptllIdErpOrderSnCodeManage, 'POST', { wstyptll_id: this.wstyptll_id }, false).then(res => { if (res.err_code === 0) { } else { uni.showModal({ title: '提示', content: res.err_msg, showCancel: false, confirmText: '关闭' }); } }); }, change(index, type) { if (type == 'print_type') { //打印类型 this.index_print_type = index; if (index == 0) { this.form.print_type = 1; this.text = '总箱数'; this.print_text = '总箱数'; this.numberIndex = 0; } else if (index == 1) { this.form.print_type = 2; this.text = '标签数量'; this.print_text = '箱号'; //置空卡板 this.flag = false; this.form.number = ''; this.form.numbers = []; } } } } }; </script> <style scoped lang="scss"> @import '../../assets/css/tag/print.scss'; </style>