Browse Source

Merge branch 'dev_20250213'

sunxiao 1 month ago
parent
commit
0824446143

+ 2 - 0
src/layout/components/HeaderGroup/index.vue

@@ -117,7 +117,9 @@ const logout = () => {
       // && voiceStore.AGENTSTATUS != 0 && !([100001, 100002].includes(Number(voiceStore.HSCTIERRORCODE)))
     if ( voiceStore.isAuthPane ) {
       sessionStorage.removeItem('VOICE_STATUS')
+      console.log(3)
       await voiceStore.unInit();
+      console.log(4)
     }
     userStore.logOut().then(() => {
       location.href = '/index';

+ 55 - 37
src/layout/index.vue

@@ -17,51 +17,69 @@ const audioRef = ref(null);
 
 const intervalTimer = ref(null);
 
-const init = () => {
-  workbenchApi.getSeatsByUser({ userId: useUser.id }).then(async({ data }) => {
-      if (!data) return;
-      
+let worker = null;
+const isInitInProgress = ref(false); // 防止 `init()` 被多次调用
+
+const init = async () => {
+  if (isInitInProgress.value) return; // 防止重复初始化
+  isInitInProgress.value = true;
+  
+  try {
+    const { data } = await workbenchApi.getSeatsByUser({ userId: useUser.id });
+    if (data) {
       await useVoice.HS_CTI_INSTANCE(data.outId);
       const voiceStatus = sessionStorage.getItem('VOICE_STATUS');
-      /**
-         * 如果用户在有登入的情况下,中途关闭麦克风,获取坐席状态仍是 1( getAgentStatus )
-         * HSCTIERRORCODE :- - 100001: SDK 状态不可用,CTIStatus 的状态为 Terminated 100002: 获取坐席媒体权限失败
-         * AGENTSTATUS : 1 置忙 2 置闲
-         * */ 
-        // console.log("坐席状态", useVoice.AGENTSTATUS);
-        // console.log("系统状态", useVoice.HSCTIERRORCODE);
-        // 目前先只考虑 100001 100002 错误码 处理
-        
-       setTimeout(async () => {
-          if ( [100001, 100002].includes( Number(useVoice.HSCTIERRORCODE) ) ) {
-            // 有错误
-            useVoice.systemState = false;
+      setTimeout(async () => {
+        if ( [100001, 100002].includes( Number(useVoice.HSCTIERRORCODE) ) ) {
+          useVoice.systemState = false;
+        } else {
+          await useVoice.getAgentStatus();
+          if ( voiceStatus && [1, 2].includes( Number(useVoice.AGENTSTATUS) )) {
+            voiceStatus == 'busy' ? useVoice.setBusy() : useVoice.setIdle();
           } else {
-            // 正常
-            await useVoice.getAgentStatus();
-            if ( voiceStatus && [1, 2].includes( Number(useVoice.AGENTSTATUS) )) {
-              voiceStatus === 'busy' ? useVoice.setBusy() : useVoice.setIdle();
-            } else {
-              useVoice.setIdle();
-            }
+            useVoice.setIdle();
           }
-       }, 1000);
-    })
-}
+        }
+      }, 2000);
+    }
+  } catch (error) {
+    console.error("Error in init:", error);
+  } finally {
+    isInitInProgress.value = false;
+    console.log("init complete");
+  }
 
-onMounted(() => {
-  if ( useVoice.isAuthPane ) {
-    init();
-    intervalTimer.value = setInterval(async () => {
-      const sdkRegister = Cookies.get('sdkRegister')
-      if (!sdkRegister && !useVoice.noiceBarVisibleState &&useVoice.AGENTSTATUS !=0) {
-        await useVoice.unInit()
-        init()
-      }
-    }, 2000);
+};
+const handleWorkerMessage = async (event) => {
+  if (event.data === "check" && useVoice.isAuthPane) {  
+    const sdkRegister = Cookies.get("sdkRegister");
+    if (!sdkRegister && !useVoice.noiceBarVisibleState && useVoice.AGENTSTATUS !== 0) {
+      console.log("Reinitializing...");
+      await useVoice.unInit();
+      await init();
+    }
+  }
+};
+
+onMounted(async() => {
+  if(useVoice.isAuthPane){
+    await init();
+    if (!worker) {
+      worker = new Worker(new URL("@/workers/worker.js", import.meta.url), { type: "module" });
+      worker.onmessage = handleWorkerMessage;
+      worker.postMessage("start");
+    }
   }
 })
 
+onUnmounted(() => {
+  if(worker && useVoice.isAuthPane){
+    worker.postMessage("stop");
+    worker.terminate();
+    worker = null;
+  }
+});
+
 </script>
 
 <template>

+ 1 - 3
src/store/modules/voice.js

@@ -171,7 +171,7 @@ const useVoiceStore = defineStore('voice', () => {
 
   // 卸载实例
   const unInit = async () => {
-    return HS_CTI.checkOut();
+    return HS_CTI.unInit();
   }
 
   // 下面开始事件监听
@@ -325,7 +325,6 @@ const useVoiceStore = defineStore('voice', () => {
           // 新增域名
           domainName: VITE_HS_CTI_BASE_URL,
         });
-  
         // 初始化操作
         await HS_CTI.init();
   
@@ -334,7 +333,6 @@ const useVoiceStore = defineStore('voice', () => {
   
         // 监听事件
         listenScoketEvent(CTIEvent);
-  
         // 成功完成初始化
         resolve(HS_CTI);
       } catch (error) {

+ 9 - 0
src/workers/worker.js

@@ -0,0 +1,9 @@
+self.onmessage = function (event) {
+    if (event.data === "start") {
+      self.timer = setInterval(() => {
+        self.postMessage("check");
+      }, 5000);
+    } else if (event.data === "stop") {
+      clearInterval(self.timer);
+    }
+}