predictionCurve.vue 2.9 KB

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