238 lines
7.1 KiB
JavaScript
238 lines
7.1 KiB
JavaScript
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();
|
||
}
|
||
}
|
||
}
|
||
},
|
||
}
|
||
}) |