From 97bdf81d742340f45ca8a83621addb5052ab1b7c Mon Sep 17 00:00:00 2001 From: sige Date: Thu, 23 May 2024 20:21:43 +0800 Subject: [PATCH] =?UTF-8?q?#102=20=E6=B6=88=E6=AF=92=E5=BC=80=E5=A7=8B?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E8=B0=83=E7=94=A8=E6=B6=88=E6=AF=92=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E5=A4=B1=E8=B4=A5=E9=9C=80=E8=A6=81=E5=BC=B9=E6=A1=86?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=B8=94=E4=B8=8D=E8=B7=B3=E8=BD=AC=E5=88=B0=E6=B6=88?= =?UTF-8?q?=E6=AF=92=E5=A4=84=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 40 ++++++++++++++++++++++++++--- src/components/MyModal.vue | 11 ++++++++ src/components/Operator.vue | 58 ++++++++++++++++++++---------------------- src/store/modules/websocket.js | 29 ++++++++++++++++++--- src/utils/MyModal.js | 29 +++++++++++++++++++++ 5 files changed, 131 insertions(+), 36 deletions(-) create mode 100644 src/utils/MyModal.js diff --git a/src/App.vue b/src/App.vue index 4d73cf6..fa8a94a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,7 +1,41 @@ - - + \ No newline at end of file diff --git a/src/components/MyModal.vue b/src/components/MyModal.vue index 161a9ad..6fec489 100644 --- a/src/components/MyModal.vue +++ b/src/components/MyModal.vue @@ -16,6 +16,9 @@
取消
确定
+
+
确定
+
@@ -34,6 +37,14 @@ const props = defineProps({ const visible = ref(props.visible); // watch visible watch(() => props.visible, val => visible.value = val); +// expose public functions +defineExpose({show}); + +// show dialog +function show() { + emits('update:visible', true); + visible.value = true; +} // action ok function actionOk() { diff --git a/src/components/Operator.vue b/src/components/Operator.vue index d398db5..e5f0245 100644 --- a/src/components/Operator.vue +++ b/src/components/Operator.vue @@ -503,6 +503,7 @@ import { import { startDisinfectionJSON, getStateJSON } from '@/mock/command' import { showSuccessToast, showFailToast } from 'vant' import { time_To_hhmmss } from '@/utils' +import MyModal from '../utils/MyModal' const operatorStore = useOperatorStore() const webSocketStore = useWebSocketStore() @@ -590,38 +591,35 @@ const changePreVal = val => { } const startDisinfect = () => { - // 改变开始消毒状态 如果已经开始则不可点击 - // 选择预设 而后开始消毒 - // preVisible.value = true - operatorStore.updateShowStartReady(true) - // 十秒以后隐藏遮罩 - setTimeout(() => { - operatorStore.updateShowStartReady(false) - }, 10000) - realStart() - // envirVisible.value = true + realStart(); } -const realStart = () => { - localStorage.setItem('logVal', logVal.value) - if ( - operatorStore.disinfectStatus == 0 || - operatorStore.disinfectStatus == 5 - ) { - localStorage.removeItem('bin') - localStorage.removeItem('envir1') - localStorage.removeItem('envir2') - webSocketStore.sendCommandMsg( - startDisinfectionJSON( - parseInt(logVal.value), - parseInt(roomSize.value), - parseInt(envirVal.value), - sealStore.airInletProportionalValue, - sealStore.airOutletProportionalValue, - ), - ) - props.changeShowOperator(false) - } +// 开始消毒 +async function realStart() { + operatorStore.updateShowStartReady(true) + localStorage.setItem('logVal', logVal.value) + if ( operatorStore.disinfectStatus == 0 || operatorStore.disinfectStatus == 5 ) { + localStorage.removeItem('bin') + localStorage.removeItem('envir1') + localStorage.removeItem('envir2') + + try { + await webSocketStore.call('startDisinfection', { + loglevel : parseInt(logVal.value), + roomVolume : parseInt(roomSize.value), + envirVal : parseInt(envirVal.value), + airInletProportionalValve : sealStore.airInletProportionalValue, + airOutletProportionalValve : sealStore.airOutletProportionalValue, + }); + } catch ( e ) { + operatorStore.updateShowStartReady(false) + await MyModal.error(`无法开始消毒 : ${e.message || e}`); + return ; + } + + operatorStore.updateShowStartReady(false) + props.changeShowOperator(false) + } } const showLogPicker = () => { diff --git a/src/store/modules/websocket.js b/src/store/modules/websocket.js index b06b32e..235b82b 100644 --- a/src/store/modules/websocket.js +++ b/src/store/modules/websocket.js @@ -24,6 +24,8 @@ export const useWebSocketStore = defineStore({ socketCommandInstance: null, // 事件上报websocket 实例 socketEventInstance: null, + // Event Handlers + eventHandlers : {}, // Call ID Counter callIdCounter : 0, @@ -31,12 +33,22 @@ export const useWebSocketStore = defineStore({ callPromiseHandlers : {}, // Call Param Merge Commands callparamMergeCmds : [ - 'cleanDisinfectionRecord', + 'cleanDisinfectionRecord', 'startDisinfection' ], } }, // actions actions: { + // register event handler + registerEventHandler( event, handler ) { + this.eventHandlers[event] = this.eventHandlers[event] || []; + this.eventHandlers[event].push(handler); + }, + + + + + initCommandSocket() { const url = import.meta.env.VITE_BASE_WS1_URL const init = new Socket(url) @@ -66,7 +78,7 @@ export const useWebSocketStore = defineStore({ if ( 0 === response.ackcode ) { handler.resolve(response); } else { - handler.reject(response.reason); + handler.reject(response.ackDisplayInfo); } return; } @@ -388,9 +400,20 @@ export const useWebSocketStore = defineStore({ const settingStore = useSettingStore() const operatorStore = useOperatorStore() const echartsStore = useEchartsStore() + + let $this = this; init.ws.onmessage = function (ev) { - // console.log(JSON.parse(ev.data)) const { command, timeStamp } = JSON.parse(ev.data) + if ( undefined !== $this.eventHandlers[command] ) { + let data = JSON.parse(ev.data); + data = data.data; + for ( const handler of $this.eventHandlers[command] ) { + handler(data); + } + return ; + } + + switch (command) { case 'RealtimeSensorDataReport': const { sensor_data } = JSON.parse(ev.data) diff --git a/src/utils/MyModal.js b/src/utils/MyModal.js new file mode 100644 index 0000000..3ee50e6 --- /dev/null +++ b/src/utils/MyModal.js @@ -0,0 +1,29 @@ +import { createApp, h } from 'vue'; +import MyModalComponent from 'cpns/MyModal.vue'; +export default class MyModal { + // show error message + static error( message ) { + return new Promise( resolve => { + const modalContainer = document.createElement('div'); + document.body.appendChild(modalContainer); + const modalApp = createApp({ + render() { + return h(MyModalComponent, { + ref : 'modal', + icon : 'warning', + type : 'info', + content : message, + onOk : () => { + modalApp.unmount(); + document.body.removeChild(modalContainer); + resolve(); + } + }); + }, + }); + + const vm = modalApp.mount(modalContainer); + vm.$refs.modal.show(); + }); + } +} \ No newline at end of file