import { host } from "@/config/host"; import store from '@/store/index.js'; // #ifdef APP const sunmi_print = uni.requireNativePlugin('Sunmi-Print-Inner') const TTSSpeech = uni.requireNativePlugin('MT-TTS-Speech') // #endif const utils = { //一体机打印初始化 init: () => { // #ifdef APP return new Promise((relove, reject) => { sunmi_print.connect(res => { console.log(res) if (res.connect == 'hello') { console.log('打印机成功连接') relove(true) } else { relove(false) } }) }) // #endif }, //检查打印机状态 getstate: () => { // #ifdef APP return new Promise((relove, reject) => { sunmi_print.getPrinterStatus(result => { console.log('打印机当前状态是:' + result.status) if (result.status == 'running') { relove(true) } else { let title switch (result.status) { case 'offline': title = '打印机未连接' break case 'fault': title = '打印机故障' break case 'outpaper': title = '打印机缺纸' break case 'hot': title = '打印机过热' break case 'open': title = '打印机开盖' break case 'error': title = '未知错误' break } uni.showToast({ title, icon: 'error', }) relove(false) } }) }) // #endif }, //打印的内容 printxie: async obj => { // #ifdef APP let res = await sunmi_print.labelLocate() console.log(res) setTimeout(() => { sunmi_print.printText({ text: '日期:' + obj.rigthnumer + ' ', align: 2, size: 22, bold: true, underline: false, compact: false, skip: true, }) sunmi_print.printText({ text: obj.title, align: 1, size: 90, bold: true, underline: false, compact: true, skip: true, }) sunmi_print.printDividingline({ style: 0, height: '3', }), sunmi_print.printText({ text: `件数:${obj.number1}`, align: 0, size: 40, bold: true, underline: false, compact: true, skip: true, }) sunmi_print.printText({ text: obj.leftnumber, align: 0, size: 27, bold: true, underline: false, compact: true, skip: true, }) sunmi_print.labelOutput() }, 2000) // #endif }, // H5蓝牙打印初始化 initbl_App: () => { // #ifdef APP let deviceList = [] let main = plus.android.runtimeMainActivity() let Context = plus.android.importClass('android.content.Context') let BManager = main.getSystemService(Context.BLUETOOTH_SERVICE) plus.android.importClass(BManager) let BAdapter = BManager.getAdapter() plus.android.importClass(BAdapter) let lists = BAdapter.getBondedDevices() // let aaa = BAdapter.getProfileConnectionState() // console.log('aaa :>> ', aaa); // console.log('lists :>> ', lists); plus.android.importClass(lists) let iterator = lists.iterator() console.log('iterator :>> ', iterator) plus.android.importClass(iterator) while (iterator.hasNext()) { let d = iterator.next() plus.android.importClass(d) let temp = { name: d.getName(), address: d.getAddress(), status: d.getBondState(), uuids: d.getUuids(), op: d, } deviceList.push(temp) } // getProfileConnectionState return deviceList // #endif }, // 蓝牙打印初始化 initbl: () => { // #ifdef APP let deviceList = [] let main = plus.android.runtimeMainActivity() let Context = plus.android.importClass('android.content.Context') let BManager = main.getSystemService(Context.BLUETOOTH_SERVICE) plus.android.importClass(BManager) let BAdapter = BManager.getAdapter() plus.android.importClass(BAdapter) let lists = BAdapter.getBondedDevices() // let aaa = BAdapter.getProfileConnectionState() // console.log('aaa :>> ', aaa); // console.log('lists :>> ', lists); plus.android.importClass(lists) let iterator = lists.iterator() console.log('iterator :>> ', iterator) plus.android.importClass(iterator) while (iterator.hasNext()) { let d = iterator.next() plus.android.importClass(d) let temp = { name: d.getName(), address: d.getAddress(), status: d.getBondState(), uuids: d.getUuids(), op: d, } deviceList.push(temp) } // getProfileConnectionState return deviceList // #endif }, //给蓝牙打印机推送打印的内容 getbl: (dev, text) => { return new Promise((resolve, reject) => { try { // #ifdef APP uni.showLoading({ title: '打印中', mask: true, }) let main = plus.android.runtimeMainActivity() let BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter') let UUID = plus.android.importClass('java.util.UUID') let uuid = UUID.fromString('00001101-0000-1000-8000-00805F9B34FB') let BAdapter = BluetoothAdapter.getDefaultAdapter() let device = BAdapter.getRemoteDevice(dev.address) plus.android.importClass(device) let bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid) plus.android.importClass(bluetoothSocket) console.log('开始连接打印机:' + dev.name) if (!bluetoothSocket.isConnected()) { bluetoothSocket.connect() if (bluetoothSocket.isConnected()) { console.log('设备已连接,开始发送打印文件') let outputStream = bluetoothSocket.getOutputStream() plus.android.importClass(outputStream) // sb(outputStream); // text+='PRINT\r\n' console.log(text) let arrayBuffer = plus.android.invoke(text, 'getBytes', 'gbk') outputStream.write(arrayBuffer) // console.log(111111111); outputStream.flush() bluetoothSocket.close() if (!bluetoothSocket.isConnected()) { console.log('设备已关闭') } resolve(null) } else { uni.showToast({ title: '设备连接失败', icon: 'error', duration: 2000, }) reject(null) } } // #endif } catch (err) { reject(null) //TODO handle the exception } finally { uni.hideLoading() } }) }, //初始化tts语音引擎 inittts() { // #ifdef APP TTSSpeech.init(status => { if (status === 0) { console.log('引擎初始化成功') TTSSpeech.setSpeed(100) TTSSpeech.getInstallTTS(res => { console.log(JSON.stringify(res)) let flage = false res.forEach(v => { if (v.name == 'com.iflytek.speechcloud') { flage = true } console.log(v.label + ': ' + v.name) }) if (!flage) { // uni.showToast({ // title:'当前未安装语音引擎,前往安装中', // icon:'none' // }) uni.showModal({ title: '安装语音引擎', content: '请选择浏览器下载安装还是直接安装', cancelText: '浏览器安装', confirmText: '直接安装', success: function(res) { if (res.confirm) { var fileSaveUrl = plus.io.convertLocalFileSystemURL('static/TTS.apk') plus.runtime.install( //安装 fileSaveUrl, { force: true, }, function(res) { utils.showToast('更新成功,请重新打开APP') TTSSpeech.setEngine('com.iflytek.speechcloud') // plus.runtime.restart() plus.runtime.quit() } ) } else if (res.cancel) { setTimeout(() => { plus.runtime.openURL( 'http://htys.oss-cn-chengdu.aliyuncs.com/htys/5402c622c319fac17c50fe52581cb627.apk' ) setTimeout(() => { plus.runtime.quit() }, 2500) }, 1500) } }, }) } else { // uni.showToast({ // title:'' // }) } }) } else { console.log('引擎初始化失败') } }, 'com.iflytek.speechcloud') // #endif }, //语音播报 ttsspke: text => { // #ifdef APP console.log('语音播报') if (!text) { return } return TTSSpeech.speak({ text, }) // #endif }, //设置扫描的广播 setting: () => { // #ifdef APP let main = plus.android.runtimeMainActivity() let deviceAction = 'com.android.server.scannerservice.broadcast' let strdata = 'scannerdata' let Intent = plus.android.importClass('android.content.Intent') let intentSetting = new Intent('com.android.scanner.service_settings') //设置条码发送方式 //"FOCUS":焦点录入 //"BROADCAST":广播 //"EMUKEY":模拟按键 //"CLIPBOARD":剪贴板 intentSetting.putExtra('barcode_send_mode', 'BROADCAST') //设置Action intentSetting.putExtra('action_barcode_broadcast', deviceAction) //设置返回状态: getstringExtra键值 intentSetting.putExtra('key_barcode_broadcast', strdata) // 提交设置 console.log('广播动作:' + deviceAction + ',接受的标签值:' + strdata) main.sendBroadcast(intentSetting) // #endif }, //获取当前APP的版本信息 getversion: () => { return new Promise((relove, reject) => { // #ifdef APP // console.log('123123123') //获取当前的包名 let main = plus.android.runtimeMainActivity() let pkName = main.getPackageName() // 获取当前应用版本号 plus.runtime.getProperty(plus.runtime.appid, info => { console.log(info.version, pkName) let obj = { version: info.version, pkName, } relove(obj) }) // #endif }) }, //执行下载更新(apk和wgt都可以) updatefile: file => { // #ifdef APP const downloadTask = uni.downloadFile({ //执行下载 url: file, //下载地址 success: downloadResult => { //下载成功 if (downloadResult.statusCode == 200) { // console.log('downloadResult','downloadResult'); plus.runtime.install( //安装 downloadResult.tempFilePath, { force: true, }, function(res) { uni.showToast({ title: '安装成功', icon: 2000, duration: 1000, }) setTimeout(function() { plus.runtime.restart() }, 1100) } ) } }, }) var showLoading = plus.nativeUI.showWaiting('正在下载', { back: 'none', }) downloadTask.onProgressUpdate(res => { showLoading.setTitle(' 正在下载' + res.progress + '% ') if (res.progress == 100) { plus.nativeUI.closeWaiting() } }) // #endif }, //执行下载更新(无感)(wgt) updatefile1: file => { // #ifdef APP const downloadTask = uni.downloadFile({ //执行下载 url: file, //下载地址 success: downloadResult => { //下载成功 if (downloadResult.statusCode == 200) { // console.log('downloadResult','downloadResult'); plus.runtime.install( //安装 downloadResult.tempFilePath, { force: true, }, function(res) { setTimeout(function() { plus.runtime.restart() }, 1100) } ) } }, }) // var showLoading = plus.nativeUI.showWaiting("正在下载", {back: "none"}); // downloadTask.onProgressUpdate((res) => { // showLoading.setTitle(" 正在下载" + res.progress + "% "); // if (res.progress == 100) { // plus.nativeUI.closeWaiting(); // } // }); // #endif }, /** * 异步获取元素距离视口顶部的距离 * @param {String} className @return {Promise} (string) => promise */ getViewDistanceFormTop(className) { return new Promise((resolve, reject) => { uni.getSystemInfo({ success: resu => { let _height = '' const query = uni.createSelectorQuery() // 获取当前swiper距离顶部的位置 query.select(className).boundingClientRect() query.exec(res => { // 屏幕的高度减去当前swiper距离顶部的高度就是剩余屏幕的高度,然后动态赋值给swiperHeight _height = resu.windowHeight - res[0].top + 'px' console.log('页面的剩余高度', _height) resolve(_height) }) }, fail: res => { reject('') }, }) }) }, /** * 提示 * @param {String} content 提示的文字 */ handleToast(content, icon = 'none', isShowMsg = true) { if (isShowMsg) uni.showToast({ title: content, icon: icon, duration: 1500, }) // #ifdef APP this.ttsspke(content) // #endif }, /** 防抖函数 */ debounce(func, delay) { let timer if (!delay) delay = 500 return (function() { const context = this const args = arguments clearTimeout(timer) timer = setTimeout(function() { func.apply(context, args) // func(); console.log('timer :>> ', timer) clearTimeout(timer) }, delay) })() }, /** 是否为数字 */ isNumber(content) { return !isNaN(parseFloat(content)) && isFinite(content) }, /** 获取类型 */ getObjType(obj) { var toString = Object.prototype.toString var map = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Function]': 'function', '[object Array]': 'array', '[object Date]': 'date', '[object RegExp]': 'regExp', '[object Undefined]': 'undefined', '[object Null]': 'null', '[object Object]': 'object', } // if (obj instanceof Element) { // return 'element' // } return map[toString.call(obj)] }, /** 深拷贝 */ deepClone(data) { var type = this.getObjType(data) var obj if (type === 'array') { obj = [] } else if (type === 'object') { obj = {} } else { //不再具有下一层次 return data } if (type === 'array') { for (var i = 0, len = data.length; i < len; i++) { obj.push(this.deepClone(data[i])) } } else if (type === 'object') { for (var key in data) { obj[key] = this.deepClone(data[key]) } } return obj }, /** * 数字运算(主要用于小数点精度问题) * [see](https://juejin.im/post/6844904066418491406#heading-12) * @param {number} a 前面的值 * @param {"+"|"-"|"*"|"/"} type 计算方式 * @param {number} b 后面的值 * @example * ```js * // 可链式调用 * const res = computeNumber(1.3, "-", 1.2).next("+", 1.5).next("*", 2.3).next("/", 0.2).result; * console.log(res); * ``` */ computeNumber(a, type, b) { /** * 获取数字小数点的长度 * @param {number} n 数字 */ function getDecimalLength(n) { const decimal = n.toString().split('.')[1]; return decimal ? decimal.length : 0; } /** * 修正小数点 * @description 防止出现 `33.33333*100000 = 3333332.9999999995` && `33.33*10 = 333.29999999999995` 这类情况做的处理 * @param {number} n */ const amend = (n, precision = 15) => parseFloat(Number(n).toPrecision(precision)); const power = Math.pow(10, Math.max(getDecimalLength(a), getDecimalLength(b))); let result = 0; a = amend(a * power); b = amend(b * power); switch (type) { case '+': result = (a + b) / power; break; case '-': result = (a - b) / power; break; case '*': result = (a * b) / (power * power); break; case '/': result = a / b; break; } result = amend(result); return { /** 计算结果 */ result, /** * 继续计算 * @param {"+"|"-"|"*"|"/"} nextType 继续计算方式 * @param {number} nextValue 继续计算的值 */ next(nextType, nextValue) { return computeNumber(result, nextType, nextValue); }, }; }, handleUpload(fileList, index, option) { wx.uploadFile({ url: host + 'api/common/upload ', //仅为示例,非真实的接口地址 filePath: fileList[index], name: 'file', header: { Authorization: `Bearer ${uni.getStorageSync('token')}` }, formData: { 'user': 'test' }, success: (res) => { const data = res.data console.log('data :>> ', data); const response = JSON.parse(data) if (response.code === 1001) { store.commit('HANDLE_UPDATA_TOKEN', response.data) return this.handleUpload(fileList, index, option) } else if (response.code === 1002) { uni.reLaunch({ url: '/pages/login/login' }) return } else if (response.code !== 200) return option.successByUpload && option.successByUpload(res) this.handleWhileUpload(fileList, index + 1, option) } }) }, handleWhileUpload(fileList, startIndex = 0, option) { if (startIndex >= fileList.length) return option.allSuccess && option.allSuccess() this.handleUpload(fileList, startIndex, option) }, /** * 选择图片上传 * @param {Object} 配置 * successByUpload 每项文件上传成功后执行回调 * closeByUpload 每项文件上传失败后执行回调 * allSuccess 所有上传执行完毕后执行函数 * beforeUpload 上传前执行函数 */ handleUploadFile(option) { // #ifdef MP-WEIXIN wx.chooseImage({ success: (res) => { if (option.beforeUpload) { const _flag = option.beforeUpload(res) if (_flag === false) return } const tempFilePaths = res.tempFilePaths console.log('this :>> ', this); this.handleWhileUpload(tempFilePaths, 0, option) // wx.uploadFile({ // url: 'http://192.168.5.34:9922/api/common/upload', //仅为示例,非真实的接口地址 // filePath: tempFilePaths[0], // name: 'file', // header: { // Authorization: `Bearer ${token}` // }, // formData: { // 'user': 'test' // }, // success(res) { // const data = res.data // //do something // } // }) } }) // #endif // uni.chooseImage({ // count: 10, // success(files) { // console.log('files :>> ', files); // let token = uni.getStorageSync('token') // // uni.uploadFile({ url: 'http://192.168.5.34:9922/api/common/upload', filePath: files.tempFilePaths[0], header: { Authorization: `Bearer ${token}` } }) // // const formData = new FormData(); // // formData.append("id", uuidv4()); // // formData.append( // // "file", // // new Blob([files.tempFiles[0]]) // // ); // // console.log('formData :>> ', formData); // // postUpload({ file: new Blob([files.tempFiles[0]]) }).then((res) => { // // console.log("res", res); // // }); // // const blob = dataURLtoBlob(JSON.stringify(files.tempFiles[0])) // // postUpload({ file: blob }) // } // }) } } export default utils