From b8fbf5280762e4a81cf5b92f3c59a66afc918777 Mon Sep 17 00:00:00 2001
From: Gary Gu <garygu@Garydebijibendiannao.local>
Date: Thu, 29 May 2025 10:56:41 +0800
Subject: [PATCH] feat: 甘特图嵌入开发
---
src/views/EquipmentView.vue | 443 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 403 insertions(+), 40 deletions(-)
diff --git a/src/views/EquipmentView.vue b/src/views/EquipmentView.vue
index 7b2233b..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,6 +171,7 @@
<script>
import V2Echarts from "@/components/V2Echarts.vue";
+ import { HomeAPI } from "@/api/home";
export default {
name: "EquipmentView",
components: {
@@ -184,44 +185,36 @@
},
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",
@@ -308,8 +301,8 @@
{
id: "lixianChartBox",
name: "总离线",
- value: 5,
- percentage: 33,
+ value: 0,
+ percentage: 0,
options: {
tooltip: {
trigger: "item",
@@ -397,7 +390,7 @@
id: "baojingChartBox",
name: "总报警",
value: 0,
- percentage: 20,
+ percentage: 0,
options: {
tooltip: {
trigger: "item",
@@ -507,12 +500,382 @@
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;
},
--
Gitblit v1.9.3