212 lines
6.0 KiB
Vue
Raw Normal View History

2025-03-31 18:24:37 +08:00
<template>
2025-04-10 13:33:38 +08:00
<div class="container">
<el-row class="el-row" :gutter="20">
2025-04-10 19:00:17 +08:00
<el-col :span="6" class="el-row-left"
><DeviceInfo :deviceId="deviceInfo?.deviceId" :paging="devicePaging" :api="getdeviceList" :list="deviceData" @click="handelClickDevice"
/></el-col>
2025-04-10 13:33:38 +08:00
<el-col :span="18" class="el-row-right scrollbar">
<MonitoringTop :funcList="funcList" />
2025-04-10 19:00:17 +08:00
<div v-if="deviceInfo?.status == 2">
2025-03-31 18:24:37 +08:00
<div class="monitoringMap" id="mapcontainer"></div>
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="12">
2025-04-10 13:33:38 +08:00
<DeviceHistory @change="handelRadio">
2025-03-31 18:24:37 +08:00
<template #chart>
<div ref="chartRef" style="width: 100%; height: 100%"></div>
</template>
</DeviceHistory>
</el-col>
<el-col :span="12">
2025-04-10 13:33:38 +08:00
<DeviceRecord :deviceInfo="deviceInfo" />
2025-03-31 18:24:37 +08:00
</el-col>
</el-row>
</div>
<div v-else>
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="24" style="height: 400px">
2025-04-10 13:33:38 +08:00
<DeviceHistory @change="handelRadio">
2025-03-31 18:24:37 +08:00
<template #chart>
<div ref="chartRef" style="width: 100%; height: 100%"></div>
</template>
</DeviceHistory>
</el-col>
<el-col :span="24" style="margin-top: 20px">
2025-04-10 13:33:38 +08:00
<DeviceRecord :deviceInfo="deviceInfo" />
2025-03-31 18:24:37 +08:00
</el-col>
</el-row>
</div>
</el-col>
</el-row>
</div>
</template>
<script lang="ts" setup>
import DeviceInfo from "./deviceInfo.vue";
import MonitoringTop from "./monitoringTop.vue";
import DeviceHistory from "./deviceHistory.vue";
import DeviceRecord from "./deviceRecord.vue";
import { MapCustom } from "@/utils/mapCustom";
import * as echarts from "echarts";
2025-04-10 19:00:17 +08:00
import { deviceList, healthLatestData, warningRecord, locateRecord } from "@/api/index";
2025-04-10 13:33:38 +08:00
import { TDevice, THealthLatestData } from "@/api/index.d";
2025-04-01 18:07:18 +08:00
import { onMounted, onDeactivated, ref, reactive } from "vue";
2025-04-10 13:33:38 +08:00
import { debounce, format } from "@/utils";
import heart from "@/assets/img/heart.png";
import temperature from "@/assets/img/temperature.png";
import blood from "@/assets/img/blood.png";
2025-04-10 19:00:17 +08:00
import location from "@/assets/img/location.png";
2025-04-10 13:33:38 +08:00
2025-03-31 18:24:37 +08:00
const chartRef = ref(null);
2025-04-01 18:07:18 +08:00
let myChart = null;
2025-04-10 19:00:17 +08:00
let newMap = null;
2025-04-10 13:33:38 +08:00
let funcList = ref([
{ title: "当前心率", en: "DANGQIANXINLV", icon: heart, unit: "次/分", num: 0, color: "#FF0303" },
{ title: "当前血氧", en: "DANGQIANXUEYANG", icon: blood, unit: "%", num: 0, color: "#8B51FD" },
{ title: "当前体表温度", en: "DANGQIANTIBIAOWENDU", icon: temperature, unit: "次/分", num: 0, color: "#FF6905" },
]);
2025-03-31 18:24:37 +08:00
2025-04-10 13:33:38 +08:00
const options = {
tooltip: {
trigger: "axis",
},
2025-03-31 18:24:37 +08:00
xAxis: {
type: "category",
2025-04-10 13:33:38 +08:00
data: [],
},
grid: {
left: "5%",
right: "4%",
2025-03-31 18:24:37 +08:00
},
yAxis: {
type: "value",
},
2025-04-10 13:33:38 +08:00
series: {
name: "",
data: [],
type: "line",
itemStyle: {
color: "#ff4567", // 设置线条颜色
2025-03-31 18:24:37 +08:00
},
2025-04-10 13:33:38 +08:00
smooth: true,
},
2025-03-31 18:24:37 +08:00
};
2025-04-10 13:33:38 +08:00
const devicePaging = reactive({
page: 1,
size: 10,
mode: undefined,
});
const HealthData = ref<THealthLatestData.TRes>();
2025-03-31 18:24:37 +08:00
2025-04-10 13:33:38 +08:00
const deviceInfo = ref<TDevice.IListRes>();
const deviceData = ref<TDevice.IListRes[]>([]);
2025-03-31 18:24:37 +08:00
2025-04-10 13:33:38 +08:00
const getdeviceList = async () => {
const res = await deviceList(devicePaging);
deviceData.value = res.records;
if (res.records.length > 0) {
deviceInfo.value = res.records[1];
getHealthLatestData();
2025-04-10 19:00:17 +08:00
getLocateRecord();
2025-04-10 13:33:38 +08:00
}
};
2025-04-10 19:00:17 +08:00
2025-04-10 13:33:38 +08:00
const getHealthLatestData = () => {
healthLatestData({ deviceId: deviceInfo.value.deviceId }).then((res) => {
HealthData.value = res;
funcList.value[0].num = res.hr;
funcList.value[1].num = res.bo;
funcList.value[2].num = res.temp;
getOptionsData(HealthData.value.hrArr, "心率", "#FF0303");
});
2025-03-31 18:24:37 +08:00
};
2025-04-10 13:33:38 +08:00
const handelRadio = (val: number) => {
if (val == 1) {
getOptionsData(HealthData.value.hrArr, "心率", "#FF0303");
} else if (val == 2) {
getOptionsData(HealthData.value.boArr, "血氧", "#983AFC");
} else if (val == 3) {
getOptionsData(HealthData.value.tempArr, "体表温度", "#FFA91F");
}
};
const getOptionsData = (list: { time: string; value: number }[], name: string, color: string) => {
options.xAxis.data = [];
options.series.data = [];
2025-04-10 19:00:17 +08:00
if (list && list.length) {
list.forEach((item) => {
options.xAxis.data.push(format(item.time, "HH:mm:ss"));
options.series.data.push(item.value);
});
options.series.name = name;
options.series.itemStyle.color = color;
}
2025-04-10 13:33:38 +08:00
myChart.setOption(options);
};
2025-04-10 19:00:17 +08:00
const getLocateRecord = () => {
let d = new Date();
locateRecord({
deviceId: deviceInfo.value.deviceId,
startDate: `${format(d, "YYYY-MM-DD")} 00:00:00`,
endDate: `${format(d, "YYYY-MM-DD")} 23:59:59`,
}).then((res) => {
if (res && res.length) {
let list = res;
newMap.clearMap();
newMap.setCenter([list[0].lng, list[0].lat]);
newMap.polyline(list);
let icon = newMap.newIcon(location);
list.forEach((item) => {
let marker = newMap.marker({ icon, position: [item.lng, item.lat] });
marker.setMap(newMap.map);
});
}
});
};
2025-04-01 18:07:18 +08:00
const handleResize = debounce(() => {
myChart.resize();
}, 200);
2025-04-10 19:00:17 +08:00
const handelClickDevice = (val: TDevice.IListRes) => {
deviceInfo.value = val;
getHealthLatestData();
getLocateRecord();
};
2025-03-31 18:24:37 +08:00
onMounted(() => {
2025-04-10 13:33:38 +08:00
getdeviceList();
2025-04-10 19:00:17 +08:00
newMap = new MapCustom({ dom: "mapcontainer" });
2025-03-31 18:24:37 +08:00
if (chartRef.value) {
2025-04-01 18:07:18 +08:00
myChart = echarts.init(chartRef.value);
window.addEventListener("resize", handleResize);
2025-03-31 18:24:37 +08:00
}
});
2025-04-01 18:07:18 +08:00
onDeactivated(() => {
window.removeEventListener("resize", handleResize);
});
2025-03-31 18:24:37 +08:00
</script>
<style scoped lang="less">
2025-04-10 13:33:38 +08:00
.container {
overflow: hidden;
display: flex;
.el-row {
flex: 1;
overflow: hidden;
display: flex;
.el-row-left {
height: 100%;
display: flex;
overflow: hidden;
}
.el-row-right {
height: 100%;
overflow: auto;
}
}
}
2025-03-31 18:24:37 +08:00
.monitoringMap {
width: 100%;
height: 400px;
margin-top: 20px;
}
</style>