predictionCurve.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <EchartLine3
  3. :x-data="chartConfig.x"
  4. :y1-data="chartConfig.y1"
  5. :y2-data="chartConfig.y2"
  6. :y3-data="chartConfig.y3"
  7. :y4-data="chartConfig.y4"
  8. :legend-name="chartConfig.label"
  9. />
  10. </template>
  11. <script lang="ts" setup>
  12. import moment from 'moment';
  13. import { ref, watch } from 'vue';
  14. import EchartLine3 from './echartLine3.vue';
  15. // well i know this is trash but the time is reaching
  16. const props = defineProps<{
  17. /** 测点图配置,该测点图在每次数据更新时追加曲线数据,但如果需要更新图表,那么需要更改id来告知组件 */
  18. chart: { id: number | string; label: string; time: []; data: [number, number, number, number]; monitorData: number[] };
  19. timeout?: number;
  20. }>();
  21. const chartConfig = ref<{
  22. label: string;
  23. /** 下一项数据更新后应该替换配置中的哪项数据的标志 */
  24. indexMark: number;
  25. x: string[];
  26. y1: number[];
  27. y2: number[];
  28. y3: number[];
  29. y4: number[];
  30. }>({
  31. label: '',
  32. indexMark: 0,
  33. x: [],
  34. y1: [],
  35. y2: [],
  36. y3: [],
  37. y4: [],
  38. });
  39. let chartId = 0;
  40. watch(
  41. () => props.chart,
  42. (el) => {
  43. if (!el) return;
  44. const arr = new Array(el.time.length).fill(0);
  45. if (chartConfig.value.indexMark === 0 || chartId !== el.id) {
  46. // 初始化配置数据,按照一项数据,生成一个由 20 项数据组成的数组,该数组由此项数据衍生
  47. // const startFrom = moment(el.time);
  48. chartConfig.value = {
  49. label: el.label,
  50. indexMark: 1,
  51. // x: arr.map(() => {
  52. // const str = startFrom.format('HH:mm:ss');
  53. // startFrom.add(props.timeout || 3000);
  54. // return str;
  55. // }),
  56. x: el.time.map((item) => {
  57. return item + ':00';
  58. }),
  59. y1: arr.map(() => {
  60. return el.data[0];
  61. }),
  62. y2: arr.map(() => {
  63. return el.data[1];
  64. }),
  65. y3: arr.map(() => {
  66. return el.data[2];
  67. }),
  68. y4: el.monitorData,
  69. };
  70. } else {
  71. // 更新配置
  72. // 由于上面这些数据都是 20 项组成的,当指针移动到 20 时说明上次更新了最后一项
  73. // 那么应该按先进后出的队列模式更新数据了
  74. const val = chartConfig.value;
  75. if (val.indexMark === 20) {
  76. val.x.shift();
  77. val.y1.shift();
  78. val.y2.shift();
  79. val.y3.shift();
  80. val.y4.shift();
  81. val.indexMark = 19;
  82. }
  83. val.x[val.indexMark] = moment(el.time).format('HH:mm:ss');
  84. val.y1[val.indexMark] = el.data[0];
  85. val.y2[val.indexMark] = el.data[1];
  86. val.y3[val.indexMark] = el.data[2];
  87. val.y4[val.indexMark] = el.data[3];
  88. // 指针向后移动1
  89. val.indexMark += 1;
  90. }
  91. },
  92. { immediate: true, deep: true }
  93. );
  94. </script>
  95. <style scoped lang="less">
  96. .work-box {
  97. width: 100%;
  98. height: 100%;
  99. }
  100. </style>