|  | @@ -0,0 +1,106 @@
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +  <BasicModal title="历史曲线" width="1000px" :height="600" v-bind="$attrs" @register="register">
 | 
	
		
			
				|  |  | +    <LineMulti
 | 
	
		
			
				|  |  | +      class="w-900px"
 | 
	
		
			
				|  |  | +      height="500px"
 | 
	
		
			
				|  |  | +      x-axis-prop-type="ttime"
 | 
	
		
			
				|  |  | +      :prop-type-arr="propTypeMap"
 | 
	
		
			
				|  |  | +      :chart-data="chartData"
 | 
	
		
			
				|  |  | +      :option="{ textStyle: { color: '#fff' }, legend: { textStyle: { color: '#fff', top: 10 } } }"
 | 
	
		
			
				|  |  | +    />
 | 
	
		
			
				|  |  | +  </BasicModal>
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +<script lang="ts" setup>
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 预警信息-历史曲线组件
 | 
	
		
			
				|  |  | +   *
 | 
	
		
			
				|  |  | +   * 使用方式,从外部使用 useModal 钩子并将 register 传入该组件
 | 
	
		
			
				|  |  | +   *
 | 
	
		
			
				|  |  | +   * 然后使用钩子提供的 openModal 并在调用时提供数据,数据参考下面 useModalInner 的回调
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  import { ref, defineEmits, computed } from 'vue';
 | 
	
		
			
				|  |  | +  import { BasicModal, useModalInner } from '/@/components/Modal';
 | 
	
		
			
				|  |  | +  import dayjs from 'dayjs';
 | 
	
		
			
				|  |  | +  import LineMulti from '/@/components/chart/LineMulti.vue';
 | 
	
		
			
				|  |  | +  import { getHistoryData, listdays } from '../comment.api';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const warningRecord = ref<{
 | 
	
		
			
				|  |  | +    starttime: string;
 | 
	
		
			
				|  |  | +    endtime: string;
 | 
	
		
			
				|  |  | +    deviceid: string;
 | 
	
		
			
				|  |  | +    devicename: string;
 | 
	
		
			
				|  |  | +    devicetype: string;
 | 
	
		
			
				|  |  | +    valuecode: string;
 | 
	
		
			
				|  |  | +    valuename: string;
 | 
	
		
			
				|  |  | +  }>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const chartData = ref<any>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  defineEmits(['register']);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const [register] = useModalInner(({ data, device }) => {
 | 
	
		
			
				|  |  | +    warningRecord.value = data;
 | 
	
		
			
				|  |  | +    refresh(device);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const params = computed(() => {
 | 
	
		
			
				|  |  | +    if (!warningRecord.value) return {};
 | 
	
		
			
				|  |  | +    const { starttime, endtime = dayjs(), deviceid, devicetype } = warningRecord.value;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const gapstr = ['1s', '5s', '10s', '30s', '1m', '10m', '30m', '1h'];
 | 
	
		
			
				|  |  | +    const gaparr = [1000, 5000, 10000, 30000, 60000, 600000, 1800000, 3600000, Infinity];
 | 
	
		
			
				|  |  | +    // 需要根据预警信息的报警开始-报警结束(报警未解决即为当前时间)差值决定请求历史数据时使用的间隔
 | 
	
		
			
				|  |  | +    // 例如差值为20s,那么应以1s为间隔,如果为5h,那么应为30min,为10h则应为1h
 | 
	
		
			
				|  |  | +    // 如此,根据下面的逻辑获取到合适的间隔:
 | 
	
		
			
				|  |  | +    // 设大小间隔为x、y(例如x=1000ms,y=5000ms),已知时间轴最少应分10份,则时间差z >= 10x且z < 10y时可以取该间隔
 | 
	
		
			
				|  |  | +    const timediff = dayjs(endtime).diff(dayjs(starttime));
 | 
	
		
			
				|  |  | +    let interval = '1s';
 | 
	
		
			
				|  |  | +    for (let index = 0; index < gaparr.length - 1; index++) {
 | 
	
		
			
				|  |  | +      const x = gaparr[index];
 | 
	
		
			
				|  |  | +      const y = gaparr[index + 1];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      if (timediff >= 10 * x && timediff < 10 * y) {
 | 
	
		
			
				|  |  | +        interval = gapstr[index];
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      ttime_begin: starttime,
 | 
	
		
			
				|  |  | +      ttime_end: endtime,
 | 
	
		
			
				|  |  | +      gdeviceids: deviceid,
 | 
	
		
			
				|  |  | +      strtype: devicetype,
 | 
	
		
			
				|  |  | +      interval,
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const propTypeMap = computed(() => {
 | 
	
		
			
				|  |  | +    if (!warningRecord.value) return new Map();
 | 
	
		
			
				|  |  | +    const { valuecode, valuename } = warningRecord.value;
 | 
	
		
			
				|  |  | +    return new Map([[valuecode, valuename]]);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async function refresh(device) {
 | 
	
		
			
				|  |  | +    let result: any = { records: [] };
 | 
	
		
			
				|  |  | +    if (device.stationtype === 'redis') {
 | 
	
		
			
				|  |  | +      result = await getHistoryData({
 | 
	
		
			
				|  |  | +        startTime: params.value.ttime_begin,
 | 
	
		
			
				|  |  | +        endTime: params.value.ttime_end,
 | 
	
		
			
				|  |  | +        deviceId: params.value.gdeviceids,
 | 
	
		
			
				|  |  | +        ...params.value,
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      result = await listdays(params.value).then((r) => {
 | 
	
		
			
				|  |  | +        if (r.datalist) return r.datalist;
 | 
	
		
			
				|  |  | +        return { total: 0, records: [] };
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    result.records.forEach((e) => {
 | 
	
		
			
				|  |  | +      return Object.assign(e, e.readData);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    chartData.value = result.records;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +<style scoped lang="less">
 | 
	
		
			
				|  |  | +  @import '/@/design/theme.less';
 | 
	
		
			
				|  |  | +  @import '/@/design/vent/modal.less';
 | 
	
		
			
				|  |  | +</style>
 |