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