HistoryCurveModal.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <template>
  2. <BasicModal title="历史曲线" width="1000px" :height="600" v-bind="$attrs" @register="register">
  3. <LineMulti
  4. class="w-900px"
  5. height="500px"
  6. x-axis-prop-type="ttime"
  7. :prop-type-arr="propTypeMap"
  8. :chart-data="chartData"
  9. :option="{ textStyle: { color: '#fff' }, legend: { textStyle: { color: '#fff', top: 10 } } }"
  10. />
  11. </BasicModal>
  12. </template>
  13. <script lang="ts" setup>
  14. /**
  15. * 预警信息-历史曲线组件
  16. *
  17. * 使用方式,从外部使用 useModal 钩子并将 register 传入该组件
  18. *
  19. * 然后使用钩子提供的 openModal 并在调用时提供数据,数据参考下面 useModalInner 的回调
  20. */
  21. import { ref, defineEmits, computed } from 'vue';
  22. import { BasicModal, useModalInner } from '/@/components/Modal';
  23. import dayjs from 'dayjs';
  24. import LineMulti from '/@/components/chart/LineMulti.vue';
  25. import { getHistoryData, listdays } from '../comment.api';
  26. const warningRecord = ref<{
  27. starttime: string;
  28. endtime: string;
  29. deviceid: string;
  30. devicename: string;
  31. devicetype: string;
  32. valuecode: string;
  33. valuename: string;
  34. }>();
  35. const chartData = ref<any>();
  36. defineEmits(['register']);
  37. const [register] = useModalInner(({ data, device }) => {
  38. warningRecord.value = data;
  39. refresh(device);
  40. });
  41. const params = computed(() => {
  42. if (!warningRecord.value) return {};
  43. const { starttime, endtime = dayjs(), deviceid, devicetype } = warningRecord.value;
  44. const gapstr = ['1s', '5s', '10s', '30s', '1m', '10m', '30m', '1h'];
  45. const gaparr = [1000, 5000, 10000, 30000, 60000, 600000, 1800000, 3600000, Infinity];
  46. // 需要根据预警信息的报警开始-报警结束(报警未解决即为当前时间)差值决定请求历史数据时使用的间隔
  47. // 例如差值为20s,那么应以1s为间隔,如果为5h,那么应为30min,为10h则应为1h
  48. // 如此,根据下面的逻辑获取到合适的间隔:
  49. // 设大小间隔为x、y(例如x=1000ms,y=5000ms),已知时间轴最少应分10份,则时间差z >= 10x且z < 10y时可以取该间隔
  50. const timediff = dayjs(endtime).diff(dayjs(starttime));
  51. let interval = '1s';
  52. for (let index = 0; index < gaparr.length - 1; index++) {
  53. const x = gaparr[index];
  54. const y = gaparr[index + 1];
  55. if (timediff >= 10 * x && timediff < 10 * y) {
  56. interval = gapstr[index];
  57. }
  58. }
  59. return {
  60. ttime_begin: starttime,
  61. ttime_end: endtime,
  62. gdeviceids: deviceid,
  63. strtype: devicetype,
  64. interval,
  65. };
  66. });
  67. const propTypeMap = computed(() => {
  68. if (!warningRecord.value) return new Map();
  69. const { valuecode, valuename } = warningRecord.value;
  70. return new Map([[valuecode, valuename]]);
  71. });
  72. async function refresh(device) {
  73. let result: any = { records: [] };
  74. if (device.stationtype === 'redis') {
  75. result = await getHistoryData({
  76. startTime: params.value.ttime_begin,
  77. endTime: params.value.ttime_end,
  78. deviceId: params.value.gdeviceids,
  79. ...params.value,
  80. });
  81. } else {
  82. result = await listdays(params.value).then((r) => {
  83. if (r.datalist) return r.datalist;
  84. return { total: 0, records: [] };
  85. });
  86. }
  87. result.records.forEach((e) => {
  88. return Object.assign(e, e.readData);
  89. });
  90. chartData.value = result.records;
  91. }
  92. </script>
  93. <style scoped lang="less">
  94. @import '/@/design/theme.less';
  95. @import '/@/design/vent/modal.less';
  96. </style>