From 89323ef5405d9e1721b85afcba55984feb9d1942 Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期四, 04 七月 2024 17:59:51 +0800 Subject: [PATCH] 增加日期筛选;点踩接口对接;权限优化 --- src/components/chat/chatComponents/summaryCom/SummaryCom.vue | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 172 insertions(+), 2 deletions(-) diff --git a/src/components/chat/chatComponents/summaryCom/SummaryCom.vue b/src/components/chat/chatComponents/summaryCom/SummaryCom.vue index c618dae..e514981 100644 --- a/src/components/chat/chatComponents/summaryCom/SummaryCom.vue +++ b/src/components/chat/chatComponents/summaryCom/SummaryCom.vue @@ -1,6 +1,176 @@ <template> - <div></div> + <div class="min-w-[100ch]"> + <template v-if="summaryList && summaryList.length > 0"> + <div class="ml-10" v-for="(item, idx) in summaryList" :key="idx"> + <h3>{{ item.title }}</h3> + <el-table class="mt-2" :data="item.values" :style="{ width: `${columnsWidth * (item.values?.length ?? 1)}px` }"> + <el-table-column v-for="(col, index) in item.values" :label="col.title" :key="index"> + <template #default="scope"> + {{ col?.value }} + </template> + </el-table-column> + </el-table> + </div> + </template> + + <div class="flex-column w-full" v-if="recordSetList && recordSetList.length > 0"> + <el-select class="flex-0 w-36 ml-auto mr-16" v-model="selectChartType" @change="selectChartTypeChange"> + <el-option + v-for="item in Object.keys(chartTypeMapName)" + :key="item" + :value="parseInt(item)" + :label="chartTypeMapName[item]" + ></el-option> + </el-select> + <div class="min-h-[48rem] flex-auto w-full"> + <div ref="chartRefList" v-for="(item, index) in recordSetList" :key="index"></div> + </div> + </div> + </div> </template> -<script setup lang="ts"></script> +<script setup lang="ts"> +import * as echarts from 'echarts'; +import _ from 'lodash'; +import { computed, onMounted, ref } from 'vue'; +import { ChartTypeEnum, chartTypeMapEchart, chartTypeMapName } from '../types'; +import { axisLabelFormatter } from '/@/utils/chart'; + +const props = defineProps(['data']); + +const selectChartType = ref<ChartTypeEnum>(ChartTypeEnum.Line); + +const columnsWidth = 120; + +const chartRef = ref<HTMLDivElement[] | HTMLDivElement>(null); + +const chartRefList = computed(() => { + let refList: HTMLDivElement[] = []; + if (!chartRef.value) { + refList = []; + } else { + const first = chartRef.value?.[0]; + if (first) { + refList = chartRef.value as unknown as HTMLDivElement[]; + } else { + refList = [chartRef.value as unknown as HTMLDivElement]; + } + } + + return refList; +}); + +const recordSetList = computed(() => props.data.filter((item) => item.type === 'recordset')); +const summaryList = computed(() => props.data.filter((item) => item.type === 'summary')); +const drawAllChart = () => { + chartInstanceList.map((item, index) => { + drawChart(item, recordSetList.value[index]); + }); +}; + +const selectChartTypeChange = () => { + drawAllChart(); +}; + +const drawChart = (instance, data) => { + const xType = 'time'; + let timeIndex = data.cols.findIndex((item) => item.type === 'time'); + if (timeIndex === -1) { + timeIndex = 0; + } + const timeCol = data.cols[timeIndex]; + + let valueIndex = data.cols.findIndex((item) => item.type === 'value'); + if (valueIndex === -1) { + valueIndex = 2; + } + const valueCol = data.cols[valueIndex]; + + let nameCol = null; + let groupedValues = null; + if (data.chart === 'muli_line') { + let nameIndex = data.cols.findIndex((item) => item.type === 'name'); + if (nameIndex === -1) { + nameIndex = 1; + } + nameCol = data.cols[nameIndex]; + groupedValues = _.groupBy(data.values, (item) => item[nameIndex]); + } else if (data.chart === 'single_line') { + groupedValues = { + default: data.values, + }; + } else { + // 榛樿閮藉綋muli_line + let nameIndex = data.cols.findIndex((item) => item.type === 'name'); + if (nameIndex === -1) { + nameIndex = 1; + } + nameCol = data.cols[nameIndex]; + groupedValues = _.groupBy(data.values, (item) => item[nameIndex]); + } + + const seriesData = Object.keys(groupedValues).map((item) => { + const values = groupedValues[item]; + return { + name: item === 'default' ? '' : item, + data: values.map((item) => [item[timeIndex], item[valueIndex]]), + type: chartTypeMapEchart[selectChartType.value], + }; + }); + + instance.setOption({ + grid: { + // bottom: 120, + // right: '15%', + bottom: '15%', + }, + tooltip: { + show: true, + }, + title: { + text: data?.title, + left: 'center', + }, + xAxis: { + name: timeCol?.title, + type: xType, + }, + yAxis: { + name: valueCol?.title, + type: 'value', + axisLabel: { + formatter: axisLabelFormatter, + }, + }, + series: seriesData, + dataZoom: { + type: 'inside', + }, + }); +}; +let chartInstanceList: echarts.ECharts[] = null; +onMounted(() => { + setTimeout(() => { + const parent = chartRefList.value[0]?.parentElement; + const data = props.data; + + if (!parent) { + return; + } else { + } + + const parentBound = parent.getBoundingClientRect(); + let divideCount = 1; + + const width = parentBound.width / divideCount; + chartInstanceList = chartRefList.value.map((item) => { + return echarts.init(item, undefined, { + width: width, + height: parentBound.height, + }); + }); + drawAllChart(); + }, 1000); +}); +</script> <style scoped lang="scss"></style> -- Gitblit v1.9.3