predictionCurve.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. /** 给定全量数据,绘制曲线对应的prop */
  16. interface CurveProp {
  17. label: string;
  18. time: [];
  19. data: [number, number, number];
  20. monitorData: number[];
  21. }
  22. /** 给定单点数据,更新曲线对应的prop */
  23. interface PointProp {
  24. label: string;
  25. time: Date;
  26. data: [number, number, number, number];
  27. }
  28. function isCurveProp(d: any): d is CurveProp {
  29. return Boolean(d.monitorData);
  30. }
  31. // well i know this is trash but the time is reaching
  32. const props = defineProps<{
  33. /** 测点图配置,该测点图在每次数据更新时追加曲线数据,但如果需要更新图表,那么需要更改id来告知组件 */
  34. chart: CurveProp | PointProp;
  35. timeout?: number;
  36. }>();
  37. const chartConfig = ref<{
  38. label: string;
  39. /** 下一项数据更新后应该替换配置中的哪项数据的标志 */
  40. indexMark: number;
  41. x: string[];
  42. y1: number[];
  43. y2: number[];
  44. y3: number[];
  45. y4: number[];
  46. }>({
  47. label: '',
  48. indexMark: 0,
  49. x: [],
  50. y1: [],
  51. y2: [],
  52. y3: [],
  53. y4: [],
  54. });
  55. watch(
  56. () => props.chart,
  57. (el) => {
  58. // debugger;
  59. if (!el || !el.time) return;
  60. // 新版的预测曲线处理,应用到了火灾预警下的各个模块
  61. if (isCurveProp(el)) {
  62. const arr = new Array(el.time.length).fill(0);
  63. chartConfig.value = {
  64. label: el.label,
  65. indexMark: 1,
  66. x: el.time.map((item) => {
  67. return item + ':00';
  68. }),
  69. y1: arr.map(() => {
  70. return el.data[0];
  71. }),
  72. y2: arr.map(() => {
  73. return el.data[1];
  74. }),
  75. y3: arr.map(() => {
  76. return el.data[2];
  77. }),
  78. y4: el.monitorData,
  79. };
  80. } else {
  81. // indexMark为0表示还没插入过数据,初始化数据
  82. if (chartConfig.value.indexMark === 0) {
  83. const arr = new Array(20).fill(0);
  84. const startFrom = moment(el.time);
  85. chartConfig.value = {
  86. // label: el.label,
  87. label: '',
  88. indexMark: 1,
  89. x: arr.map(() => {
  90. const str = startFrom.format('HH:mm:ss');
  91. startFrom.add(props.timeout || 3000);
  92. return str;
  93. }),
  94. y1: arr.map(() => {
  95. return el.data[0];
  96. }),
  97. y2: arr.map(() => {
  98. return el.data[1];
  99. }),
  100. y3: arr.map(() => {
  101. return el.data[2];
  102. }),
  103. y4: arr.map((item, index) => {
  104. return index == 0 ? el.data[3] : null;
  105. }),
  106. };
  107. } else {
  108. // 更新配置
  109. // 由于上面这些数据都是 20 项组成的,当指针移动到 20 时说明上次更新了最后一项
  110. // 那么应该按先进后出的队列模式更新数据了
  111. const val = chartConfig.value;
  112. if (val.indexMark === 20) {
  113. val.x.shift();
  114. val.y1.shift();
  115. val.y2.shift();
  116. val.y3.shift();
  117. val.y4.shift();
  118. val.indexMark = 19;
  119. }
  120. val.x[val.indexMark] = moment(el.time).format('HH:mm:ss');
  121. val.y1[val.indexMark] = el.data[0];
  122. val.y2[val.indexMark] = el.data[1];
  123. val.y3[val.indexMark] = el.data[2];
  124. val.y4[val.indexMark] = el.data[3];
  125. // 指针向后移动1
  126. val.indexMark += 1;
  127. chartConfig.value = val;
  128. }
  129. }
  130. },
  131. { immediate: true, deep: true }
  132. );
  133. </script>
  134. <style scoped lang="less">
  135. .work-box {
  136. width: 100%;
  137. height: 100%;
  138. }
  139. </style>