From a3e27f5cab583debe11a9c62d8cc0115783b0791 Mon Sep 17 00:00:00 2001
From: Gary Gu <garygu@Garydebijibendiannao.local>
Date: Wed, 28 May 2025 16:59:43 +0800
Subject: [PATCH] fix: 优化实况UI放大缩小

---
 src/views/EquipmentView.vue |  460 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 419 insertions(+), 41 deletions(-)

diff --git a/src/views/EquipmentView.vue b/src/views/EquipmentView.vue
index dd39b73..b307bf8 100644
--- a/src/views/EquipmentView.vue
+++ b/src/views/EquipmentView.vue
@@ -18,21 +18,21 @@
               <img class="w-[24px] h-[24px]" src="../assets/images/backgrounds/shishirenshu.png" alt="" />
               <span class="satalabel ml-[8px]">实时人数</span>
             </div>
-            <div class="value text-[#00FFFF] text-[28px] font-bold">62</div>
+            <div class="value text-[#00FFFF] text-[28px] font-bold">{{ userData.RealtimeUserNumber }}</div>
           </div>
           <div class="stat-item mb-[10px]">
             <div class="stat-info">
               <img class="w-[24px] h-[24px]" src="../assets/images/backgrounds/people.png" alt="" />
               <span class="satalabel ml-[8px]">今日累计/人次</span>
             </div>
-            <div class="value text-[#FFD500] text-[28px] font-bold">62</div>
+            <div class="value text-[#FFD500] text-[28px] font-bold">{{ userData.TodayUserNumber }}</div>
           </div>
           <div class="stat-item">
             <div class="stat-info">
               <img class="w-[24px] h-[24px]" src="../assets/images/backgrounds/zaigang.png" alt="" />
               <span class="satalabel ml-[8px]">在岗总数</span>
             </div>
-            <div class="value text-[#FFD500] text-[28px] font-bold">62</div>
+            <div class="value text-[#FFD500] text-[28px] font-bold">{{ userData.DutyUserTotle }}</div>
           </div>
         </div>
       </div>
@@ -49,7 +49,7 @@
         >
         </div>
         <div class="equipment-status" :style="sectionStyle">
-          <el-select v-model="equipmentSelected" placeholder="请选择">
+          <el-select v-model="deviceSelected" placeholder="请选择" @change="handleSelectChange">
             <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
           <div
@@ -114,7 +114,7 @@
             <div class="env-info">
               <span class="envlabel">大气温度</span>
               <div class="envvalue" :style="enviorStyle">
-                <span class="envvalue-text">5°C</span>
+                <span class="envvalue-text">{{ evnData.Tmp + "°C" }}</span>
               </div>
             </div>
           </div>
@@ -123,7 +123,7 @@
             <div class="env-info">
               <span class="envlabel">大气湿度</span>
               <div class="envvalue" :style="enviorStyle">
-                <span class="envvalue-text">22.9%</span>
+                <span class="envvalue-text">{{ evnData.Rh + "%" }}</span>
               </div>
             </div>
           </div>
@@ -132,7 +132,7 @@
             <div class="env-info">
               <span class="envlabel">PM2.5</span>
               <div class="envvalue" :style="enviorStyle">
-                <span class="envvalue-text">10 μg/m³</span>
+                <span class="envvalue-text">{{ evnData.Pm25 + "μg/m³" }}</span>
               </div>
             </div>
           </div>
@@ -141,7 +141,7 @@
             <div class="env-info">
               <span class="envlabel">PM10</span>
               <div class="envvalue" :style="enviorStyle">
-                <span class="envvalue-text">13 μg/m³</span>
+                <span class="envvalue-text">{{ evnData.Pm10 + "μg/m³" }}</span>
               </div>
             </div>
           </div>
@@ -150,7 +150,7 @@
             <div class="env-info">
               <span class="envlabel">风力</span>
               <div class="envvalue" :style="enviorStyle">
-                <span class="envvalue-text">3级</span>
+                <span class="envvalue-text">{{ evnData.Ws }}</span>
               </div>
             </div>
           </div>
@@ -159,7 +159,7 @@
             <div class="env-info">
               <span class="envlabel">风向</span>
               <div class="envvalue" :style="enviorStyle">
-                <span class="envvalue-text">北风</span>
+                <span class="envvalue-text">{{ evnData.Wd }}</span>
               </div>
             </div>
           </div>
@@ -171,51 +171,50 @@
 
 <script>
   import V2Echarts from "@/components/V2Echarts.vue";
+  import { HomeAPI } from "@/api/home";
   export default {
     name: "EquipmentView",
     components: {
       V2Echarts,
     },
+    props: {
+      selectedId: {
+        type: String,
+        default: "",
+      },
+    },
     data() {
       return {
-        equipmentSelected: "",
-        options: [
-          {
-            value: "选项1",
-            label: "黄金糕",
-          },
-          {
-            value: "选项2",
-            label: "双皮奶",
-          },
-          {
-            value: "选项3",
-            label: "蚵仔煎",
-          },
-          {
-            value: "选项4",
-            label: "龙须面",
-          },
-          {
-            value: "选项5",
-            label: "北京烤鸭",
-          },
-        ],
+        evnData: {
+          Tmp: "0",
+          Rh: "0",
+          Pm25: "0",
+          Pm10: "0",
+          Ws: "0",
+          Wd: "无",
+        },
+        userData: {
+          RealtimeUserNumber: 0,
+          TodayUserNumber: 0,
+          DutyUserTotle: 0,
+        },
+        deviceSelected: "",
+        options: [],
         backgroundImage: new URL("@/assets/images/backgrounds/cover_bg.png", import.meta.url).href,
         titleImage: new URL("@/assets/images/titles/renyuan.png", import.meta.url).href,
         middleImage: new URL("@/assets/images/titles/shebei.png", import.meta.url).href,
         bottomImage: new URL("@/assets/images/titles/huanjing.png", import.meta.url).href,
         bgImage: new URL("@/assets/images/titles/title_second.png", import.meta.url).href,
         enviorImage: new URL("@/assets/images/titles/wendu_bg.png", import.meta.url).href,
-        deviceOnline: 1,
-        deviceTotal: 27,
+        deviceOnline: 0,
+        deviceTotal: 0,
         currentTab: "塔吊监控",
         circleItems: [
           {
             id: "zaixianChartBox",
             name: "总在线",
-            value: 22,
-            percentage: 81.5,
+            value: 0,
+            percentage: 0,
             options: {
               tooltip: {
                 trigger: "item",
@@ -302,8 +301,8 @@
           {
             id: "lixianChartBox",
             name: "总离线",
-            value: 5,
-            percentage: 33,
+            value: 0,
+            percentage: 0,
             options: {
               tooltip: {
                 trigger: "item",
@@ -391,7 +390,7 @@
             id: "baojingChartBox",
             name: "总报警",
             value: 0,
-            percentage: 20,
+            percentage: 0,
             options: {
               tooltip: {
                 trigger: "item",
@@ -496,7 +495,387 @@
         };
       },
     },
+    watch: {
+      selectedId: {
+        handler(newVal) {
+          console.log("设备界面接收到的数据:", newVal);
+          // 处理数据变化的逻辑
+          this.getDeviceTypes(newVal);
+          this.getEnvData(newVal);
+          this.getUserData(newVal);
+        },
+        deep: true, // 深度监听对象内部变化
+        immediate: true, // 立即执行一次
+      },
+    },
+    mounted() {},
     methods: {
+      /**
+       * 处理设备选择变化
+       * @param val
+       */
+      handleSelectChange(val) {
+        this.getDeviceState(val);
+        // this.getEnvData(val);
+        // this.getUserData(val);
+      },
+      /**
+       * 获取人员数据
+       * @param bindId
+       */
+      getUserData(bindId) {
+        const params = {
+          bindId,
+        };
+        HomeAPI.GetJSCUserManage(params).then((res) => {
+          if (res.Ret === 1) {
+            const result = res.Data;
+            if (result) {
+              this.userData = result;
+            } else {
+              this.userData = {
+                RealtimeUserNumber: 0,
+                TodayUserNumber: 0,
+                DutyUserTotle: 0,
+              };
+            }
+          }
+        });
+      },
+      /**
+       * 获取环境数据
+       */
+      getEnvData(bindId) {
+        const params = {
+          bindId,
+        };
+        HomeAPI.GetJSCEnvMonitor(params).then((res) => {
+          if (res.Ret === 1) {
+            const result = res.Data;
+            if (result) {
+              this.evnData = result;
+            } else {
+              this.evnData = {
+                Tmp: "0",
+                Rh: "0",
+                Pm25: "0",
+                Pm10: "0",
+                Ws: "0",
+                Wd: "无",
+              };
+            }
+          }
+        });
+      },
+      /**
+       * 获取设备类型
+       * @param bindId
+       */
+      getDeviceTypes(bindId) {
+        const params = {
+          bindId,
+        };
+        HomeAPI.GetDeviceType(params).then((res) => {
+          if (res.Ret === 1) {
+            const result = res.Data;
+            if (result.length > 0) {
+              this.options = result.map((item) => ({
+                value: item.Id,
+                label: item.Name,
+              }));
+              this.deviceSelected = this.options[0].value; // 默认选中第一个项目
+              this.getDeviceState(this.deviceSelected);
+            } else {
+              this.options = [];
+            }
+          }
+        });
+      },
+      /**
+       * 获取设备状态
+       * @param deviceTypeId
+       */
+      getDeviceState(deviceTypeId) {
+        const params = {
+          bindId: this.selectedId || "",
+          deviceTypeId,
+        };
+        HomeAPI.GetJSCDeviceState(params).then((res) => {
+          if (res.Ret === 1) {
+            const result = res.Data;
+            if (result) {
+              this.deviceOnline = result.TotalOnlineNumber;
+              this.deviceTotal = result.TotalOnlineNumber + result.TotalOfflineNumber;
+              this.circleItems = [
+                {
+                  id: "zaixianChartBox",
+                  name: "总在线",
+                  value: result.TotalOnlineNumber,
+                  percentage: result.TotalOnlineRate,
+                  options: {
+                    tooltip: {
+                      trigger: "item",
+                      show: false,
+                    },
+                    legend: {
+                      itemWidth: 8,
+                      itemHeight: 8,
+                      top: "5%",
+                      left: "center",
+                      show: false,
+                    },
+                    series: [
+                      {
+                        type: "pie",
+                        radius: ["70%", "80%"],
+                        center: ["50%", "50%"],
+                        avoidLabelOverlap: false,
+                        hoverAnimation: false,
+                        startAngle: 90,
+                        itemStyle: {
+                          normal: {
+                            label: {
+                              show: false,
+                            },
+                            labelLine: {
+                              show: false,
+                            },
+                            shadowBlur: 40,
+                            borderWidth: 5,
+                            shadowColor: "rgba(0, 0, 0, 0)", // 边框阴影
+                          },
+                        },
+                        data: [
+                          {
+                            value: 100,
+                            name: "",
+                            itemStyle: {
+                              color: "#234E84",
+                            },
+                          },
+                        ],
+                      },
+                      {
+                        type: "pie",
+                        radius: ["70%", "100%"],
+                        center: ["50%", "50%"],
+                        avoidLabelOverlap: false,
+                        hoverAnimation: false,
+                        startAngle: 90,
+                        itemStyle: {
+                          normal: {
+                            label: {
+                              show: false,
+                            },
+                            labelLine: {
+                              show: false,
+                            },
+                            shadowBlur: 40,
+                            borderWidth: 10,
+                            shadowColor: "rgba(0, 0, 0, 0)", // 边框阴影
+                          },
+                        },
+                        data: [
+                          {
+                            value: result.TotalOnlineRate,
+                            name: "",
+                            itemStyle: {
+                              color: "#00FFFF",
+                            },
+                          },
+                          {
+                            value: 100 - result.TotalOnlineRate,
+                            name: "",
+                            itemStyle: {
+                              color: "transparent",
+                            },
+                          },
+                        ],
+                      },
+                    ],
+                  },
+                },
+                {
+                  id: "lixianChartBox",
+                  name: "总离线",
+                  value: result.TotalOfflineNumber,
+                  percentage: result.TotalOfflineRate,
+                  options: {
+                    tooltip: {
+                      trigger: "item",
+                      show: false,
+                    },
+                    legend: {
+                      itemWidth: 8,
+                      itemHeight: 8,
+                      top: "5%",
+                      left: "center",
+                      show: false,
+                    },
+                    series: [
+                      {
+                        type: "pie",
+                        radius: ["70%", "80%"],
+                        center: ["50%", "50%"],
+                        avoidLabelOverlap: false,
+                        hoverAnimation: false,
+                        startAngle: 90,
+                        itemStyle: {
+                          normal: {
+                            label: {
+                              show: false,
+                            },
+                            labelLine: {
+                              show: false,
+                            },
+                            shadowBlur: 40,
+                            borderWidth: 5,
+                            shadowColor: "rgba(0, 0, 0, 0)", // 边框阴影
+                          },
+                        },
+                        data: [
+                          {
+                            value: 100,
+                            name: "",
+                            itemStyle: {
+                              color: "#234E84",
+                            },
+                          },
+                        ],
+                      },
+                      {
+                        type: "pie",
+                        radius: ["70%", "100%"],
+                        center: ["50%", "50%"],
+                        avoidLabelOverlap: false,
+                        hoverAnimation: false,
+                        startAngle: 90,
+                        itemStyle: {
+                          normal: {
+                            label: {
+                              show: false,
+                            },
+                            labelLine: {
+                              show: false,
+                            },
+                            shadowBlur: 40,
+                            borderWidth: 10,
+                            shadowColor: "rgba(0, 0, 0, 0)", // 边框阴影
+                          },
+                        },
+                        data: [
+                          {
+                            value: result.TotalOfflineRate,
+                            name: "",
+                            itemStyle: {
+                              color: "#00FFFF",
+                            },
+                          },
+                          {
+                            value: 100 - result.TotalOfflineRate,
+                            name: "",
+                            itemStyle: {
+                              color: "transparent",
+                            },
+                          },
+                        ],
+                      },
+                    ],
+                  },
+                },
+                {
+                  id: "baojingChartBox",
+                  name: "总报警",
+                  value: result.TotalAlarmsNumber,
+                  percentage: result.TotalAlarmsRate,
+                  options: {
+                    tooltip: {
+                      trigger: "item",
+                      show: false,
+                    },
+                    legend: {
+                      itemWidth: 8,
+                      itemHeight: 8,
+                      top: "5%",
+                      left: "center",
+                      show: false,
+                    },
+                    series: [
+                      {
+                        type: "pie",
+                        radius: ["70%", "80%"],
+                        center: ["50%", "50%"],
+                        avoidLabelOverlap: false,
+                        hoverAnimation: false,
+                        startAngle: 90,
+                        itemStyle: {
+                          normal: {
+                            label: {
+                              show: false,
+                            },
+                            labelLine: {
+                              show: false,
+                            },
+                            shadowBlur: 40,
+                            borderWidth: 5,
+                            shadowColor: "rgba(0, 0, 0, 0)", // 边框阴影
+                          },
+                        },
+                        data: [
+                          {
+                            value: 100,
+                            name: "",
+                            itemStyle: {
+                              color: "#234E84",
+                            },
+                          },
+                        ],
+                      },
+                      {
+                        type: "pie",
+                        radius: ["70%", "100%"],
+                        center: ["50%", "50%"],
+                        avoidLabelOverlap: false,
+                        hoverAnimation: false,
+                        startAngle: 90,
+                        itemStyle: {
+                          normal: {
+                            label: {
+                              show: false,
+                            },
+                            labelLine: {
+                              show: false,
+                            },
+                            shadowBlur: 40,
+                            borderWidth: 10,
+                            shadowColor: "rgba(0, 0, 0, 0)", // 边框阴影
+                          },
+                        },
+                        data: [
+                          {
+                            value: result.TotalAlarmsRate,
+                            name: "",
+                            itemStyle: {
+                              color: "#00FFFF",
+                            },
+                          },
+                          {
+                            value: 100 - result.TotalAlarmsRate,
+                            name: "",
+                            itemStyle: {
+                              color: "transparent",
+                            },
+                          },
+                        ],
+                      },
+                    ],
+                  },
+                },
+              ];
+            }
+          }
+        });
+      },
       handleControlBtnClick(tab) {
         this.currentTab = tab;
       },
@@ -749,5 +1128,4 @@
   .progress-inner {
     display: none;
   }
-
 </style>

--
Gitblit v1.9.3