xiaokuaisong-shopapp/uniapp05/pinia/webSocket.js

238 lines
7.1 KiB
JavaScript
Raw Normal View History

2024-10-18 08:05:19 +00:00
import {
defineStore
} from 'pinia';
import {
getBaseUrl
} from "../API/api";
import jpPrinter from '../components/gprint/esc';
const backgroundAudioManager = uni.getBackgroundAudioManager();
export const websocketStore = defineStore('websocket', {
state: () => {
return {
isWebSocketConnected: false,
message: [],
orderId: '',
isPrinting: false,
requestQueue: new Array(),
isAlreadyPrinting: false
}
},
actions: {
async senBlData(deviceId, serviceId, characteristicId, uint8Array) {
let uint8Buf = Array.from(uint8Array);
function split_array(datas, size) {
let result = {};
let j = 0
for (let i = 0; i < datas.length; i += size) {
result[j] = datas.slice(i, i + size)
j++
}
return result
}
let sendloop = split_array(uint8Buf, 20);
// console.log(sendloop.length)
async function realWriteData(sendloop, i,retryCount = 3) {
if (retryCount === 0) {
console.error('打印失败');
return;
}
let data = sendloop[i]
if (typeof(data) == "undefined") {
return
}
let buffer = new ArrayBuffer(data.length)
let dataView = new DataView(buffer)
for (let j = 0; j < data.length; j++) {
dataView.setUint8(j, data[j]);
}
uni.writeBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
value: buffer,
success: res => {
realWriteData(sendloop, i + 1,);
},
fail:err=>{
console.error(err);
realWriteData(sendloop, i, retryCount - 1); // 递减重试次数并重试
}
})
}
let i = 0;
realWriteData(sendloop, i);
},
async onPrint(data) {
console.log(data);
this.message = data
let command = jpPrinter.createNew()
let deviceId = uni.getStorageSync('deviceId')
let serviceId = uni.getStorageSync('serviceId')
let characteristicId = uni.getStorageSync('characteristicId')
command.init(); //初始化打印机
command.setSelectJustification(1); //居中
command.setCharacterSize(17); //设置倍高倍宽
command.setText("结账单");
command.setPrint(); //打印并换行
command.setPrint();
command.setCharacterSize(14); //设置倍高倍宽
command.setText(`HD${data[0].pickupCode}`);
command.setPrint(); //打印并换行
command.setPrint();
command.setCharacterSize(0); //设置正常大小
command.setSelectJustification(0);
command.setText("菜品信息:");
command.setPrint();
command.setText("--------------------------------");
command.setPrint();
command.setText('名称')
command.setAbsolutePrintPosition(112);
command.setText('数量');
command.setAbsolutePrintPosition(224);
command.setText('价格');
command.setAbsolutePrintPosition(336);
command.setText('规格');
command.setPrint();
command.setPrint();
data[0].orderDetailsVOList.map(item => {
command.setText(item.dishesVO.dishesName)
command.setAbsolutePrintPosition(112);
command.setText('x' + item.quantity);
command.setAbsolutePrintPosition(224);
command.setText(item.price);
command.setAbsolutePrintPosition(336);
command.setText(item.dishesVO.isSpecification === 1 ? item.attributeNames : '暂无');
command.setPrint();
})
command.init(); //初始化打印机
if (data[0].pickupMethod === 1) {
command.setText("--------------------------------");
command.setPrint();
command.setText('打包费:')
command.setAbsolutePrintPosition(224);
command.setText((data[0].orderDetailsVOList.reduce((a, c) => a + c.dishesVO.packPrice, 0))
.toFixed(2))
command.setPrint();
command.setText("--------------------------------");
command.setPrint();
command.setText('合计:')
command.setAbsolutePrintPosition(112);
command.setText('x' + data[0].orderDetailsVOList.reduce((a, c) => a + c.quantity, 0));
command.setAbsolutePrintPosition(224);
command.setText((data[0].orderDetailsVOList.reduce((a, c) => a + c.subtotal, 0) + data[0]
.orderDetailsVOList.reduce((a, c) => a + c.dishesVO.packPrice, 0)).toFixed(2));
command.setPrint();
command.setPrint();
} else {
command.setText("--------------------------------");
command.setPrint();
command.setText('合计:')
command.setAbsolutePrintPosition(112);
command.setText('x' + data[0].orderDetailsVOList.reduce((a, c) => a + c.quantity, 0));
command.setAbsolutePrintPosition(224);
command.setText((data[0].orderDetailsVOList.reduce((a, c) => a + c.subtotal, 0)).toFixed(
2));
command.setPrint();
command.setPrint();
}
command.setPrint();
command.setPrint();
command.setSelectJustification(0); //设置居左
if(data[0].pickupTime!=null){
command.setText("取餐时间:" + data[0].pickupTime);
}
command.setPrint(); //打印并换行
command.setPrint();
command.setSelectJustification(0); //设置居左
command.setText("订单号:" + data[0].id);
command.setPrint(); //打印并换行
command.setPrint();
command.setSelectJustification(0); //设置居左
command.setText(`下单时间:${data[0].createTime.slice(0, 16).replace('T', '~')}`);
command.setPrint(); //打印并换行
command.setPrint();
command.setSelectJustification(0); //设置居左
command.setText(`支付时间:${data[0].updateTime.slice(0, 16).replace('T', '~')}`);
command.setPrint();
command.setPrint();
command.setSelectJustification(0); //设置居左
command.setText(`整单备注:${data[0].notes}`);
command.setPrint();
command.setPrint();
command.setPrint();
command.setPrint();
this.orderId = ''; // 假设orderId用于标识当前处理的订单用以区分不同打印任务
this.isPrinting = false; // 确保标志位复位
setTimeout(async () => {
await this.senBlData(deviceId, serviceId, characteristicId, command.getData())
}, 4000)
backgroundAudioManager.src = 'http://110.42.248.235:866/images/static/yuyin.mp3'
backgroundAudioManager.play()
},
async getMyOrders(data) {
if (!this.requestQueue.some(req => req === data)) { // 假设data对象有id属性
this.requestQueue.push(data);
if (!this.isPrinting) {
await this.processQueue();
}
} else {
console.warn('订单已存在');
}
},
async processQueue() {
while (this.requestQueue.length > 0) {
this.isPrinting = true;
const data = this.requestQueue.shift()
console.log(data)
try {
const res = await uni.request({
url: getBaseUrl() + '/orders/my/page',
method: 'POST',
data: {
id: data
},
header: {
'cookie': uni.getStorageSync('cookie')
},
});
console.log(res)
if (res.data.code === 1) {
this.message = res.data.data.records;
await this.onPrint(res.data.data.records);
} else {
console.error('请求失败,状态码:', res.data.code);
}
} catch (error) {
console.error('获取订单时发生错误:', error);
} finally {
this.isPrinting = false;
// 处理完当前请求后,检查队列是否还有剩余请求
if (this.requestQueue.length > 0) {
// 继续处理队列
await this.processQueue();
}
}
}
},
}
})