import _ from "lodash"; import { dayjs } from "element-plus"; 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: uuidv4(), state: () => ({ online: false, // 在线状态 ws: null, // websocket实例 uuid: "", // 长连接唯一id heartbeatTimer: null, // 心跳计时器 orderList: [], }), 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连接"); const protocols = []; // 可选的子协议数组 const options = { // 自动重新连接的选项(可选) connectionTimeout: 1000, maxRetries: 100, }; this.ws = new ReconnectingWebSocket(wsUrl, protocols, options); } else { console.log("重新连接ws"); this.wsReconnect(); } this.ws.addEventListener("open", (event) => { console.log("wss连接成功"); this.online = true; // 清除心跳 this.clearHeartBeat(); console.log(this); 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) // 打印标签小票 if (!this.orderList.some((el) => el == data.orderInfo.orderNo)) { // console.log("打印", data); printStore.labelPrint(data); printStore.pushReceiptData(data); this.orderList.push(data.orderInfo.orderNo); if (this.orderList.length > 30) { this.orderList.splice(0, 1); } } } 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; }, }, });