|
@@ -16,28 +16,36 @@
|
|
|
/>
|
|
|
</div>
|
|
|
<div v-if="shown === 'default'" class="content-item">
|
|
|
- <div class="card-content" v-for="(item, index) in cards" :key="index">
|
|
|
+ <div class="card-content" v-for="(item, index) in cards" :key="`vmac${index}`">
|
|
|
<div class="item-l">
|
|
|
<div class="label-l">{{ item.label }}</div>
|
|
|
- <div class="value-l">{{ `${item.value}%` }}</div>
|
|
|
+ <div class="value-l">{{ item.value }}</div>
|
|
|
</div>
|
|
|
<div class="item-r">
|
|
|
- <div class="content-r" v-for="(items, ind) in item.listR" :key="ind">
|
|
|
- <span>{{ `${items.label} : ` }}</span>
|
|
|
+ <div class="content-r" v-for="el in item.listR" :key="el.id">
|
|
|
+ <span>{{ `${el.label} : ` }}</span>
|
|
|
<span
|
|
|
:class="{
|
|
|
- 'status-f': items.value == 1,
|
|
|
- 'status-l': items.value == 0,
|
|
|
+ 'status-f': el.value == 1,
|
|
|
+ 'status-l': el.value == 0,
|
|
|
}"
|
|
|
- >{{ items.value == 1 ? '异常' : items.value == 0 ? '正常' : items.value }}</span
|
|
|
>
|
|
|
+ {{ el.value == 1 ? '异常' : el.value == 0 ? '正常' : el.value }}
|
|
|
+ </span>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div v-if="shown === 'chart'" class="chart-item">
|
|
|
- <div v-for="(item, index) in charts" :key="`acmt${index}`">
|
|
|
- <EchartLine3 style="height: 270px; width: 350px; margin: 0 5px" />
|
|
|
+ <div v-for="(item, index) in chartsConfig" :key="`acmt${index}`">
|
|
|
+ <EchartLine3
|
|
|
+ style="height: 300px; width: 400px; margin: 0 5px"
|
|
|
+ :x-data="item.x"
|
|
|
+ :y1-data="item.y1"
|
|
|
+ :y2-data="item.y2"
|
|
|
+ :y3-data="item.y3"
|
|
|
+ :y4-data="item.y4"
|
|
|
+ />
|
|
|
<div class="text-center">
|
|
|
{{ item.label }}
|
|
|
</div>
|
|
@@ -46,17 +54,86 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
<script setup lang="ts">
|
|
|
- import { ref } from 'vue';
|
|
|
+ import { ref, watch } from 'vue';
|
|
|
import EchartLine3 from './echartLine3.vue';
|
|
|
import BaseTab from '../../../gas/components/tab/baseTab.vue';
|
|
|
+ import moment from 'moment';
|
|
|
|
|
|
- defineProps<{
|
|
|
+ const props = defineProps<{
|
|
|
cards: { label: string; value: any; listR: { id: number; label: string; dw: string; value: any }[] }[];
|
|
|
- charts: { label: string; data: { x: string; y: number }[] }[];
|
|
|
+ charts: { label: string; time: Date; data: [number, number, number, number] }[];
|
|
|
title: string;
|
|
|
+ timeout?: number;
|
|
|
}>();
|
|
|
|
|
|
const shown = ref('default');
|
|
|
+ const chartsConfig = ref<
|
|
|
+ {
|
|
|
+ label: string;
|
|
|
+ /** 下一项数据更新后应该替换配置中的哪项数据的标志 */
|
|
|
+ indexMark: number;
|
|
|
+ x: string[];
|
|
|
+ y1: number[];
|
|
|
+ y2: number[];
|
|
|
+ y3: number[];
|
|
|
+ y4: number[];
|
|
|
+ }[]
|
|
|
+ >([]);
|
|
|
+
|
|
|
+ watch(
|
|
|
+ () => props.charts,
|
|
|
+ () => {
|
|
|
+ const arr = new Array(20).fill(0);
|
|
|
+ props.charts.forEach((el, i) => {
|
|
|
+ if (chartsConfig.value[i]) {
|
|
|
+ // 由于上面这些数据都是 20 项组成的,当指针移动到 20 时说明上次更新了最后一项
|
|
|
+ // 那么应该按先进后出的队列模式更新数据了
|
|
|
+ const val = chartsConfig.value[i];
|
|
|
+ if (val.indexMark === 20) {
|
|
|
+ val.x.shift();
|
|
|
+ val.y1.shift();
|
|
|
+ val.y2.shift();
|
|
|
+ val.y3.shift();
|
|
|
+ val.y4.shift();
|
|
|
+ val.indexMark = 19;
|
|
|
+ }
|
|
|
+ val.x[val.indexMark] = moment(el.time).format('HH:mm:ss');
|
|
|
+ val.y1[val.indexMark] = el.data[0];
|
|
|
+ val.y2[val.indexMark] = el.data[1];
|
|
|
+ val.y3[val.indexMark] = el.data[2];
|
|
|
+ val.y4[val.indexMark] = el.data[3];
|
|
|
+ // 指针向后移动1
|
|
|
+ val.indexMark += 1;
|
|
|
+ } else {
|
|
|
+ // 更新配置
|
|
|
+ // 初始化配置数据,按照一项数据,生成一个由 20 项数据组成的数组,该数组由此项数据衍生
|
|
|
+ const startFrom = moment(el.time);
|
|
|
+ chartsConfig.value[i] = {
|
|
|
+ label: el.label,
|
|
|
+ indexMark: 1,
|
|
|
+ x: arr.map(() => {
|
|
|
+ const str = startFrom.format('HH:mm:ss');
|
|
|
+ startFrom.add(props.timeout || 3000);
|
|
|
+ return str;
|
|
|
+ }),
|
|
|
+ y1: arr.map(() => {
|
|
|
+ return el.data[0];
|
|
|
+ }),
|
|
|
+ y2: arr.map(() => {
|
|
|
+ return el.data[1];
|
|
|
+ }),
|
|
|
+ y3: arr.map(() => {
|
|
|
+ return el.data[2];
|
|
|
+ }),
|
|
|
+ y4: arr.map(() => {
|
|
|
+ return el.data[3];
|
|
|
+ }),
|
|
|
+ };
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ { immediate: true, deep: true }
|
|
|
+ );
|
|
|
</script>
|
|
|
<style lang="less">
|
|
|
@import '/@/design/theme.less';
|