126 lines
3.4 KiB
JavaScript
126 lines
3.4 KiB
JavaScript
import _ from "lodash";
|
|
import { defineStore } from "pinia";
|
|
import { useUser } from "@/store/user.js";
|
|
import { usePrint } from "@/store/print.js";
|
|
import { v4 as uuidv4 } from "uuid";
|
|
import useStorage from "@/utils/useStorage";
|
|
import ReconnectingWebSocket from "reconnecting-websocket";
|
|
import { ipcRenderer } from "electron";
|
|
|
|
export const useSocket = defineStore({
|
|
id: "socket",
|
|
state: () => ({
|
|
online: false, // 在线状态
|
|
ws: null, // websocket实例
|
|
uuid: "", // 长连接唯一id
|
|
heartbeatTimer: null, // 心跳计时器
|
|
}),
|
|
actions: {
|
|
// 创建uuid
|
|
createUUID() {
|
|
if (!useStorage.get("uuid")) {
|
|
ipcRenderer.send("getOSmacSync");
|
|
// useStorage.set("uuid", uuidv4());
|
|
ipcRenderer.on("getOSmacRes", (event, arg) => {
|
|
useStorage.set("uuid", arg);
|
|
this.uuid = useStorage.get("uuid");
|
|
});
|
|
} else {
|
|
this.uuid = useStorage.get("uuid");
|
|
}
|
|
},
|
|
// 关闭ws
|
|
close() {
|
|
console.log("关闭ws");
|
|
this.ws.close(1000);
|
|
// this.ws = null;
|
|
this.clearHeartBeat();
|
|
},
|
|
wsReconnect: _.throttle(
|
|
function () {
|
|
if (this.ws.readyState == ReconnectingWebSocket.OPEN) return;
|
|
this.ws.reconnect();
|
|
console.log("11111");
|
|
},
|
|
2000,
|
|
{ leading: true, trailing: false }
|
|
),
|
|
// 初始化
|
|
init(wsUrl = import.meta.env.VITE_API_WSS) {
|
|
this.createUUID();
|
|
|
|
const store = useUser();
|
|
const printStore = usePrint();
|
|
|
|
printStore.init();
|
|
|
|
if (this.ws == null) {
|
|
console.log("创建新的ws连接");
|
|
this.ws = new ReconnectingWebSocket(wsUrl);
|
|
} else {
|
|
console.log("重新连接ws");
|
|
this.wsReconnect();
|
|
}
|
|
|
|
this.ws.addEventListener("open", (event) => {
|
|
console.log("wss连接成功");
|
|
this.online = true;
|
|
// 清除心跳
|
|
this.clearHeartBeat();
|
|
this.ws.send(
|
|
JSON.stringify({
|
|
type: "connect",
|
|
shopId: store.userInfo.shopId,
|
|
clientId: this.uuid,
|
|
})
|
|
);
|
|
this.startheartbeat();
|
|
});
|
|
|
|
this.ws.addEventListener("message", (e) => {
|
|
let data = JSON.parse(e.data);
|
|
if (data.type == "order") {
|
|
console.log("接收消息", data);
|
|
this.ws.send(
|
|
JSON.stringify({
|
|
type: "send",
|
|
orderNo: data.orderInfo.orderNo,
|
|
})
|
|
);
|
|
// 接收订单消息,打印小票
|
|
// printBill(data)
|
|
// 打印标签小票
|
|
printStore.labelPrint(data);
|
|
} else if (data.type == "heartbeat") {
|
|
console.log("接收心跳");
|
|
}
|
|
});
|
|
|
|
this.ws.addEventListener("error", () => {
|
|
console.log("WebSocket连接发生错误");
|
|
this.online = false;
|
|
this.clearHeartBeat();
|
|
});
|
|
|
|
this.ws.addEventListener("error", (e) => {
|
|
console.log("ws关闭了", e);
|
|
this.online = false;
|
|
this.clearHeartBeat();
|
|
});
|
|
},
|
|
// 启动心跳连接
|
|
startheartbeat() {
|
|
this.heartbeatTimer = setInterval(() => {
|
|
console.log("发送心跳");
|
|
this.ws.send(JSON.stringify({ type: "heartbeat" }));
|
|
}, 10000);
|
|
},
|
|
// 清除心跳
|
|
clearHeartBeat() {
|
|
// 清除心跳
|
|
clearInterval(this.heartbeatTimer);
|
|
this.heartbeatTimer = null;
|
|
},
|
|
},
|
|
});
|