From e7c05e5d214a149bdaba12f2e84ad0e8136f8726 Mon Sep 17 00:00:00 2001
From: Gary Gu <garygu@Garydebijibendiannao.local>
Date: Wed, 28 May 2025 10:23:06 +0800
Subject: [PATCH] feat: 设备状态接口对接

---
 vite.config.js              |  209 ++++++++++----------
 src/views/EquipmentView.vue |  360 ++++++++++++++++++++++++++++++++---
 2 files changed, 437 insertions(+), 132 deletions(-)

diff --git a/src/views/EquipmentView.vue b/src/views/EquipmentView.vue
index 7b2233b..8a19837 100644
--- a/src/views/EquipmentView.vue
+++ b/src/views/EquipmentView.vue
@@ -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
@@ -171,6 +171,7 @@
 
 <script>
   import V2Echarts from "@/components/V2Echarts.vue";
+  import { HomeAPI } from "@/api/home";
   export default {
     name: "EquipmentView",
     components: {
@@ -184,44 +185,23 @@
     },
     data() {
       return {
-        equipmentSelected: "",
-        options: [
-          {
-            value: "选项1",
-            label: "黄金糕",
-          },
-          {
-            value: "选项2",
-            label: "双皮奶",
-          },
-          {
-            value: "选项3",
-            label: "蚵仔煎",
-          },
-          {
-            value: "选项4",
-            label: "龙须面",
-          },
-          {
-            value: "选项5",
-            label: "北京烤鸭",
-          },
-        ],
+        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",
@@ -308,8 +288,8 @@
           {
             id: "lixianChartBox",
             name: "总离线",
-            value: 5,
-            percentage: 33,
+            value: 0,
+            percentage: 0,
             options: {
               tooltip: {
                 trigger: "item",
@@ -397,7 +377,7 @@
             id: "baojingChartBox",
             name: "总报警",
             value: 0,
-            percentage: 20,
+            percentage: 0,
             options: {
               tooltip: {
                 trigger: "item",
@@ -507,12 +487,330 @@
         handler(newVal) {
           console.log("设备界面接收到的数据:", newVal);
           // 处理数据变化的逻辑
+          this.getDeviceTypes(newVal);
         },
         deep: true, // 深度监听对象内部变化
         immediate: true, // 立即执行一次
       },
     },
+    mounted() {},
     methods: {
+      /**
+       * 处理设备选择变化
+       * @param val
+       */
+      handleSelectChange(val) {
+        this.getDeviceState(val);
+      },
+      /**
+       * 获取设备类型
+       * @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;
       },
diff --git a/vite.config.js b/vite.config.js
index b0162fb..7857501 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -13,111 +13,118 @@
 
 import PluginForViteVue2 from "@vitejs/plugin-vue2";
 // 屏幕适配
-const px2rem = require("postcss-px2rem")
-    // 配置基本大小
+const px2rem = require("postcss-px2rem");
+// 配置基本大小
 const postcss = px2rem({
-    //配rem基准值 基准大小 baseSize
-    remUnit: 192, // 设稿尺1920/10
-})
+  //配rem基准值 基准大小 baseSize
+  remUnit: 192, // 设稿尺1920/10
+});
 
 export default defineConfig(({ mode }) => {
-    return {
-        resolve: {
-            alias: {
-                "@": path.resolve(__dirname, './src'),
-                "@css": path.resolve("./src/assets/css"),
-                'worker-loader': require.resolve('worker-loader'),
-            },
+  return {
+    resolve: {
+      alias: {
+        "@": path.resolve(__dirname, "./src"),
+        "@css": path.resolve("./src/assets/css"),
+        "worker-loader": require.resolve("worker-loader"),
+      },
+    },
+    worker: {
+      // 例如,设置一个worker的入口文件
+      // 注意:这是一个假设的配置,具体取决于worker-loader是否支持这样的配置
+      // entry: '/path/to/worker/entry.js',
+      options: { inline: true, name: "workerName.[hash].js" },
+    },
+    plugins: [PluginForViteVue2(), splitVendorChunkPlugin()],
+    css: {
+      preprocessorOptions: {
+        scss: {
+          additionalData: "@import '@css/sass.scss';",
         },
-        worker: {
-            // 例如,设置一个worker的入口文件
-            // 注意:这是一个假设的配置,具体取决于worker-loader是否支持这样的配置
-            // entry: '/path/to/worker/entry.js',
-            options: { inline: true, name: 'workerName.[hash].js' }
+      },
+      loaderOptions: {
+        postcss: {
+          plugins: [postcss],
         },
-        plugins: [PluginForViteVue2(), splitVendorChunkPlugin()],
-        css: {
-            preprocessorOptions: {
-                scss: {
-                    additionalData: "@import '@css/sass.scss';",
-                },
-            },
-            loaderOptions: {
-                postcss: {
-                    plugins: [postcss]
-                }
+      },
+    },
+    server: {
+      proxy: {
+        "^/api/": {
+          // target: "http://47.117.124.20:2002/",
+          target: "http://101.201.155.10:4011/",
+          rewrite: (path) => path.replace(/^\/api\//, ""),
+          changeOrigin: true, //通过浏览器查看像是"未生效",实际发送给后端的是更改过的Host(与target的host相同)
+        },
+      },
+      port: 8081,
+      host: "0.0.0.0",
+      cors: true,
+      open: true,
+    },
+    esbuild: {
+      treeShaking: true,
+      drop: mode === "production" ? ["console", "debugger"] : [],
+    },
+    chainWebpack(config) {
+      config.module
+        .rule("css")
+        .test(/\.css$/)
+        .oneOf("vue")
+        .use("px2rem-loader")
+        .loader("px2rem-loader")
+        .options({
+          remUnit: 192,
+        })
+        .end();
+    },
+    build: {
+      minify: "esbuild",
+      chunkSizeWarningLimit: 500, //kbs
+      rollupOptions: {
+        output: {
+          chunkFileNames: "assets/js/[name]-[hash].js",
+          entryFileNames: "assets/js/[name]-[hash].js",
+          assetFileNames: "assets/[ext]/[name]-[hash].[ext]",
+          // manualChunks(id) {
+          //   if (id.includes("/node_modules/")) {
+          //     const name = id.split("/node_modules/")[1].split("/")[0];
+          //     for (const key of Object.keys(ChunksMap)) {
+          //       if (ChunksMap[key].includes(name)) {
+          //         return key;
+          //       }
+          //     }
+          //     return "vendor";
+          //   }
+          // },
+
+          // eslint-disable-next-line no-unused-vars
+          // manualChunks(id, { getModuleInfo, getModuleIds }) {
+          //   const getShouldBeVendor = splitVendorChunk();
+          //   const chunkName = getShouldBeVendor(id, { getModuleInfo });
+          //   if (chunkName === "vendor") {
+          //     //1 在node_modules文件夹下
+          //     //2 不是css类请求
+          //     //3 是被静态引入的
+          //     return chunkName;
+          //   } else if (id.includes("src")) {
+          //     const moduleInfo = getModuleInfo(id);
+          //     // console.log(id, "importers", moduleInfo.importers);
+          //     // console.log(id, "dynamicImporters", moduleInfo.dynamicImporters);
+          //     if (moduleInfo.importers.length + moduleInfo.dynamicImporters.length > 1) {
+          //       return "manifest";
+          //     }
+          //   }
+          // },
+
+          // eslint-disable-next-line no-unused-vars
+          manualChunks(id) {
+            if (id.includes("/node_modules/")) {
+              return id.split("/node_modules/")[1].split("/")[0];
             }
+          },
         },
-        server: {
-            proxy: {
-                "^/api/": {
-                    // target: "http://47.117.124.20:2002/",
-                    target: "http://101.201.155.10:4011/",
-                    rewrite: (path) => path.replace(/^\/api\//, ""),
-                    changeOrigin: true, //通过浏览器查看像是"未生效",实际发送给后端的是更改过的Host(与target的host相同)
-                },
-            },
-            port: 3000,
-            host: "0.0.0.0",
-            cors: true,
-            open: true,
-        },
-        esbuild: {
-            treeShaking: true,
-            drop: mode === "production" ? ["console", "debugger"] : [],
-        },
-        chainWebpack(config) {
-            config.module.rule("css").test(/\.css$/).oneOf("vue").use("px2rem-loader").loader("px2rem-loader").options({
-                remUnit: 192,
-            }).end();
-        },
-        build: {
-            minify: "esbuild",
-            chunkSizeWarningLimit: 500, //kbs
-            rollupOptions: {
-                output: {
-                    chunkFileNames: "assets/js/[name]-[hash].js",
-                    entryFileNames: "assets/js/[name]-[hash].js",
-                    assetFileNames: "assets/[ext]/[name]-[hash].[ext]",
-                    // manualChunks(id) {
-                    //   if (id.includes("/node_modules/")) {
-                    //     const name = id.split("/node_modules/")[1].split("/")[0];
-                    //     for (const key of Object.keys(ChunksMap)) {
-                    //       if (ChunksMap[key].includes(name)) {
-                    //         return key;
-                    //       }
-                    //     }
-                    //     return "vendor";
-                    //   }
-                    // },
-
-                    // eslint-disable-next-line no-unused-vars
-                    // manualChunks(id, { getModuleInfo, getModuleIds }) {
-                    //   const getShouldBeVendor = splitVendorChunk();
-                    //   const chunkName = getShouldBeVendor(id, { getModuleInfo });
-                    //   if (chunkName === "vendor") {
-                    //     //1 在node_modules文件夹下
-                    //     //2 不是css类请求
-                    //     //3 是被静态引入的
-                    //     return chunkName;
-                    //   } else if (id.includes("src")) {
-                    //     const moduleInfo = getModuleInfo(id);
-                    //     // console.log(id, "importers", moduleInfo.importers);
-                    //     // console.log(id, "dynamicImporters", moduleInfo.dynamicImporters);
-                    //     if (moduleInfo.importers.length + moduleInfo.dynamicImporters.length > 1) {
-                    //       return "manifest";
-                    //     }
-                    //   }
-                    // },
-
-                    // eslint-disable-next-line no-unused-vars
-                    manualChunks(id) {
-                        if (id.includes("/node_modules/")) {
-                            return id.split("/node_modules/")[1].split("/")[0];
-                        }
-                    },
-                },
-            },
-        },
-    };
-});
\ No newline at end of file
+      },
+    },
+  };
+});

--
Gitblit v1.9.3