From fa3ac93010bea3805438ee3ab0a182bfbf7423da Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期一, 27 五月 2024 16:19:31 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/dashboard/control/index.vue |  513 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 513 insertions(+), 0 deletions(-)

diff --git a/src/views/dashboard/control/index.vue b/src/views/dashboard/control/index.vue
new file mode 100644
index 0000000..9cda79a
--- /dev/null
+++ b/src/views/dashboard/control/index.vue
@@ -0,0 +1,513 @@
+<template>
+  <a-modal v-model:visible="visible" centered :mask="true" :maskClosable="false" :keyboard="false" :closable="false" :cancelText="null" title="璀﹀憡"
+           @ok="hideModal" @cancel="cnacelModal" >
+    <a-card>
+       <div class="indented-text">鍦ㄤ娇鐢ㄨ繙绋嬫帶鍒惰澶囧墠锛岃纭繚鏈哄櫒鍛ㄥ洿娌℃湁鍏朵粬浜哄憳銆傚缓绔嬩竴涓畨鍏ㄥ尯鍩燂紝纭繚娌℃湁浜鸿兘澶熻繘鍏ヨ鍖哄煙锛岄槻姝笉蹇呰鐨勪激瀹炽��</div>
+      <div style="display: flex; justify-content: space-between; padding-top: 20px; "> 
+        <p style="font-weight: bold;" >璇疯緭鍏ュ瘑鐮侊細</p>
+        <p style="color: red">{{ error }}</p>
+      </div>
+       <div >
+        <a-input-password v-model:value="password" placeholder="璇疯緭鍏ュ瘑鐮侊紒"></a-input-password>
+       </div>
+    </a-card>
+
+  </a-modal>
+  <div class="app">
+    <a-row>
+      <div style="width: 60%">
+      <a-card title="鐓ф槑" >
+      <div class="light-box">
+        <div v-for="item in lightList" :key="item.identifier"  class="center">
+          <!-- <a-button v-if="item.type == 0"  type="primary" class="com-btn"
+                  @click="deviceClick(item)">
+          {{ item.name }}
+        </a-button> -->
+          <div v-if="item.type==0" @click="deviceClick(item)">
+            <div   :class="[ item.value?'lightOn':'lightOff' ,'device']">
+
+              
+            </div>
+            <div class="text-center">{{ item.name }}</div>
+              
+            </div>
+        </div>
+       
+      </div>
+    </a-card>
+  </div>
+  <div style="width: 40%">
+    <a-card title="鐩戞帶" style=" margin-left: 10px;">
+      <div class="monitor-box">
+        <div v-for="item in lightList" :key="item.identifier" class="center" >
+          <div v-if="item.type==1" @click="deviceClick(item)">
+            <div   :class="[ item.value?'camOn':'camOff' ,'device']">
+
+              
+            </div>
+            <div class="text-center">{{ item.name }}</div>
+            </div>
+      </div>
+      </div>
+    </a-card>
+</div>
+    </a-row>
+ <a-row>
+      <div style="width: 50%">
+<a-card title="鎸囦护" style="margin-top: 10px; ">
+      <div class="com-box">
+        <!-- <a-button v-for="item in comList" :key="item.id" type="primary" class="com-btn"
+                  @click="comClick(item)">
+          {{ item.title }}
+        </a-button> -->
+        <div style="width: 500px;"  >
+        
+        <a-row class="button-row">
+          <a-button type="primary" :disabled="btnDisabled"  @click="clickButton(1010, '骞茬嚗鍚姩')" class="com-btn">  
+            <div> <PlayCircleOutlined style="font-size: 20px;" /> </div>
+          <div>  骞茬嚗鍚姩 </div>
+          
+        </a-button>
+        <!-- <a-button type="normal" @click="clickButton(1012)" class="com-btn">
+          <div> <SplitCellsOutlined style="font-size: 20px;" /> </div>
+          <div>  鍚庨棬寮�鍏� </div>
+          
+        </a-button> -->
+        <a-button type="default" :disabled="btnDisabled"  @click="clickButton(1003,'婊氱瓛鍗�')" class="com-btn w300">
+          <div> <UpCircleOutlined style="font-size: 20px;" /> </div>
+          <div>  婊氱瓛鍗� </div>
+          
+        </a-button>
+        <a-button type="normal" :disabled="btnDisabled" @click="clickButton(1016,'娓呴櫎')" class="com-btn">
+          <div> <ClearOutlined style="font-size: 20px;" /> </div>
+          <div>  娓呴櫎 </div>
+          
+        </a-button>
+        </a-row>
+        <a-row class="button-row">
+          <a-button type="normal" :disabled="btnDisabled"  @click="clickButton(1005,'婊氱瓛姝h浆')" class="com-btn h100">
+            <div>  <RedoOutlined style="font-size: 20px;" /> </div>
+            <div> 婊氱瓛姝h浆 </div>
+        </a-button>
+          <a-button type="danger" :disabled="btnDisabled"  @click="clickButton(1007,'鍋滄')" class="com-btn h100 w300 " >
+            <div> <PauseCircleOutlined style="font-size: 20px;" />  </div>
+            <div>  鍋滄 </div>
+        </a-button>
+        <a-button type="normal" :disabled="btnDisabled"  @click="clickButton(1006,'婊氱瓛鍙嶈浆')" class="com-btn h100">
+          <div> <UndoOutlined style="font-size: 20px;" /> </div>
+          <div>  婊氱瓛鍙嶈浆 </div>
+        </a-button>
+        </a-row>
+        <a-row class="button-row">
+          <a-button type="success" :disabled="btnDisabled"  @click="clickButton(1015,'鍑烘枡')" class="com-btn">
+            <div> <DownloadOutlined style="font-size: 20px;" /> </div>
+            <div>  鍑烘枡 </div>
+          
+        </a-button>
+        <!-- <a-button type="normal" @click="clickButton(1010)" class="com-btn">
+          <div> <SplitCellsOutlined style="font-size: 20px;" /> </div>
+          <div>  鍓嶉棬寮�鍏� </div>
+        </a-button> -->
+        <a-button type="normal" :disabled="btnDisabled"  @click="clickButton(1004,'婊氱瓛闄�')" class="com-btn w300">
+          <div> <DownCircleOutlined style="font-size: 20px;" /> </div>
+          <div>  婊氱瓛闄� </div>
+        </a-button>
+        <a-button type="normal" :disabled="btnDisabled"  @click="clickButton(1013,'鐑鍚姩')" class="com-btn">
+          <div> <FireOutlined style="font-size: 20px;" /> </div>
+            <div>  鐑鍚姩 </div>
+          
+        </a-button>
+      </a-row>
+       
+        </div>
+
+
+      </div>
+    </a-card>
+    </div>
+    <div style="width: 50%">
+    <a-card title="鐘舵��" style="margin-left: 10px;margin-top:10px">
+      <div class="com-box">
+        <div>
+      <div>
+          <a-button type="warning" :disabled="btnDisabled"  @click="clickButton(1017,'鎵嬪姩/鑷姩')" class="com-btn">
+            <div> <SyncOutlined style="font-size: 20px;" /> </div>
+          <div>  鎵嬪姩/鑷姩 </div>
+          
+        </a-button>
+       
+      </div>
+      <div>
+        <a-button type="info" :disabled="btnDisabled"  @click="clickButton(1014, '寮�闂ㄨ瀵�')" class="com-btn">
+          <div> <SettingOutlined style="font-size: 20px;" /> </div>
+          <div>  寮�闂ㄨ瀵� </div>
+          
+        </a-button>
+       
+      </div>
+      <div>
+        <a-button type="normal" @click="lock()" class="com-btn">
+          <div> <Icon :icon="lockIcon" :size="28" /> </div>
+          <div>  {{lockText}} </div>
+          
+        </a-button>
+      </div>
+      </div>
+    </div>
+    </a-card>
+  </div>
+    </a-row>
+    
+    <a-card title="鎺у埗鍙�" style="margin-top: 10px; ">
+      <div class="log-box">
+        <p v-for="log in logList" :key="log"> {{ log }}</p>
+      </div>
+
+    </a-card>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from "vue";
+import { sendCommand, sendWriteCommand, listAll } from "./api";
+import { useGlobSetting } from '/@/hooks/setting';
+import { connectWebSocket, onWebSocket } from '/@/hooks/web/useWebSocket';
+import { useUserStore } from '/@/store/modules/user';
+import { RedoOutlined ,SettingOutlined, UndoOutlined,FireOutlined, SplitCellsOutlined, DownloadOutlined, PauseCircleOutlined,ClearOutlined, SyncOutlined,PlayCircleOutlined, SwapOutlined , UpCircleOutlined, DownCircleOutlined, LeftCircleOutlined, RightCircleOutlined} from '@ant-design/icons-vue';
+import { router } from '/@/router'
+const error = ref('')
+const lockIcon = ref('tdesign:lock-off')
+const lockText = ref('瑙i攣')
+const password = ref()
+const visible = ref<boolean>(false);
+  const glob = useGlobSetting();
+interface Commant {
+  id: number;
+  title: string;
+  icon: string;
+}
+
+interface Device {
+  name: string;
+  identifier: string;
+  value: boolean;
+  sort_order: number;
+}
+const userStore = useUserStore();
+const logList = ref<string[]>([]);
+const comList = ref<Commant[]>([
+  {
+    id: 1010,
+    title: "骞茬嚗鍚姩",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1007,
+    title: "鍋滄杩愯",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1013,
+    title: "鐑鍚姩",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1012,
+    title: "鍚庨棬寮�鍏�",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1003,
+    title: "婊氱瓛鍗�",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1004,
+    title: "婊氱瓛闄�",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1005,
+    title: "婊氱瓛姝h浆",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1006,
+    title: "婊氱瓛鍙嶈浆",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1014,
+    title: "寮�闂ㄨ瀵�",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1015,
+    title: "鍑烘枡",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1016,
+    title: "娓呴櫎",
+    icon: "caret-right-outlined"
+  }, {
+    id: 1017,
+    title: "鎵嬪姩/鑷姩",
+    icon: "caret-right-outlined"
+  }]);
+
+const btnDisabled = ref(true)
+const lightList = ref<Device[]>([]);
+const monitorList = ref<Device[]>([]);
+
+function lock() {
+  btnDisabled.value = !btnDisabled.value
+  lockIcon.value = btnDisabled.value?'tdesign:lock-off':'tdesign:lock-on'
+  lockText.value = btnDisabled.value?'瑙i攣': '閿佸畾'
+  if (btnDisabled.value) {
+    showModal()
+  }
+}
+
+function comClick(item) {
+  addLog("鍙戦��", item.title);
+  //鍙戦�佹寚浠�
+  sendCmd(item);
+}
+
+/**
+ * 鍙戦�佹寚浠�
+ * @param item
+ */
+function sendCmd(item) {
+  var params = { msg: item.title, code: item.id, tenantId: 1003, machineId: "GM001" };
+  sendCommand(params).then(res => {
+    if (res.success) {
+      addLog("鍝嶅簲", res.message);
+      console.info(res);
+    } else {
+      console.info(res);
+      addLog("鍝嶅簲", res.message);
+    }
+
+  });
+}
+
+/**
+ * 娣诲姞log
+ * @param type
+ * @param msg
+ */
+function addLog(type, msg) {
+  //鍙戦�乴og
+  const date = new Date();
+  const format = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")} ${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}:${date.getSeconds().toString().padStart(2, "0")}`;
+  const log = format + " " + type + ":" + msg;
+  logList.value.unshift(log);
+}
+
+const showModal = () => {
+  visible.value = true;
+};
+
+const cnacelModal = () => {
+  router.back()
+}
+
+const hideModal = () => {
+  if(!password.value || password.value.length<=0) {
+    error.value="璇疯緭鍏ュ瘑鐮侊紒"
+  }else
+  if(password.value === 'LBit@123') {
+    visible.value = false;
+    password.value = ''
+    error.value = ''
+  } else {
+    error.value = '瀵嗙爜閿欒锛�'
+  }
+  
+  
+};
+
+/**
+ * 鏌ヨ鐏拰鎽勫儚澶村垪琛�
+ */
+function queryDevice() {
+  listAll({}).then(res => {
+    console.log("ress000:",res);
+    lightList.value = res
+  })
+
+
+}
+
+function clickButton(cmd, msg) {
+  console.log("target::::",cmd);
+  let tenantId = userStore.getTenant;
+  var params = { msg: msg, code: cmd, tenantId: tenantId, machineId: "GM001" };
+  sendCommand(params).then(res => {
+    if (res.success) {
+      addLog("鍝嶅簲", res.message);
+      console.info(res);
+    } else {
+      console.info(res);
+      addLog("鍝嶅簲", res.message);
+    }
+
+  });
+}
+
+
+
+
+function deviceClick(item) {
+  //console.log("item===",item.value);
+  let params = {code: item.identifier, msg: !item.value}
+  sendWriteCommand(params).then(res => {
+    console.log("鍐欐寚浠ょ粨鏋滐細锛�", res)
+    if(res.success) {
+      lightList.value.forEach(device => {
+          if(device.identifier == item.identifier) {
+            device.value = !item.value
+          }
+        })
+    }
+  }) 
+
+}
+
+    // 鍒濆鍖� WebSocket
+    function initWebSocket() {
+
+        let user = userStore.getUserInfo;
+        let tenantId = user.loginTenantId;
+
+        console.log(user);
+        // WebSocket涓庢櫘閫氱殑璇锋眰鎵�鐢ㄥ崗璁湁鎵�涓嶅悓锛寃s绛夊悓浜巋ttp锛寃ss绛夊悓浜巋ttps
+         let url = glob.domainUrl?.replace('https://', 'wss://').replace('http://', 'ws://') + '/drySocket/' + tenantId;
+        
+         connectWebSocket(url);
+         onWebSocket(onWebSocketMessage);
+      }
+
+      function onWebSocketMessage(data) {
+        console.log("drysocket:data::",data)
+        lightList.value.forEach(item => {
+          if(item.identifier == data.identifier) {
+            item.value = data.value
+          }
+        })
+      }
+
+      function keydown(e) {
+        error.value = ''
+        if(e.keyCode == 13) {
+          hideModal()
+        }
+      }
+
+onMounted(() => {
+  showModal();
+  initWebSocket();
+  window.addEventListener('keydown', keydown)
+});
+
+queryDevice()
+
+
+</script>
+
+<style lang="less" scoped>
+.app {
+  margin: 10px;
+}
+
+.com-box {
+  // margin-left: 200px;
+
+  display: flex;
+  justify-content: center;
+  
+  .com-btn {
+    border-radius: 5px;
+    width: 100px;
+    margin: 10px;
+    height: 70px;
+  }
+}
+
+.button-row {
+  display: flex; justify-content: space-between;
+}
+
+.log-box {
+  min-height: 150px;
+  max-height: 150px;
+  overflow-y: auto;
+}
+.indented-text {
+  text-indent: 20px;
+  font-size: 16px;
+}
+
+.light-box {
+  display: flex;
+  justify-items: center;
+justify-content: center;
+  flex-wrap: wrap;
+
+}
+.center {
+  display: flex;
+justify-items: center;
+justify-content: center;
+}
+
+.text-center {
+  text-align: center;
+}
+
+.lightOn {
+    background-image: url(/src/assets/images/dry/control/light.png);
+    background-repeat: no-repeat;
+		background-size: 50px;
+		/* border-radius: 10px; */
+		background-position: 48px 0px;
+  }
+  .lightOff {
+    background-image: url(/src/assets/images/dry/control/light-close.png);
+    background-repeat: no-repeat;
+		background-size: 50px;
+		/* border-radius: 10px; */
+		background-position: 48px 0px;
+  }
+
+  .camOn {
+    background-image: url(/src/assets/images/dry/control/cam1.png);
+    background-repeat: no-repeat;
+		background-size: 50px;
+		/* border-radius: 10px; */
+		background-position: 48px 0px;
+  }
+  .camOff {
+    background-image: url(/src/assets/images/dry/control/cam0.png);
+    background-repeat: no-repeat;
+		background-size: 50px;
+		/* border-radius: 10px; */
+		background-position: 48px 0px;
+  }
+
+
+.device {
+  width: 150px; height: 60px; 
+  
+}
+
+.h100 {
+  height: 70px !important;
+}
+
+.w300 {
+  width: 100px !important;
+}
+
+.monitor-box {
+  display: flex;
+  justify-items: center;
+justify-content: center;
+flex-wrap: wrap;
+  
+}
+
+
+</style>

--
Gitblit v1.9.3