From be3bae42acbe05c0b388a497dcceaee8ef00e819 Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期三, 17 七月 2024 14:31:11 +0800 Subject: [PATCH] w-full --- src/components/chat/chatComponents/summaryCom/SummaryCom.vue | 266 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 264 insertions(+), 2 deletions(-) diff --git a/src/components/chat/chatComponents/summaryCom/SummaryCom.vue b/src/components/chat/chatComponents/summaryCom/SummaryCom.vue index c618dae..c4d3cfc 100644 --- a/src/components/chat/chatComponents/summaryCom/SummaryCom.vue +++ b/src/components/chat/chatComponents/summaryCom/SummaryCom.vue @@ -1,6 +1,268 @@ <template> - <div></div> + <div class="w-full"> + <template v-if="data && data.length > 0"> + <template v-if="summaryList && summaryList.length > 0"> + <div class="w-full" v-for="(item, idx) in summaryList" :key="idx"> + <h3>{{ item.title }}</h3> + <el-table ref="tableRefList" class="w-full" :data="[{}]"> + <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" + :class="{ 'mt-10': summaryList && summaryList.length > 0 }" + v-if="recordSetList && recordSetList.length > 0" + > + <div class="min-h-[48rem] flex-auto w-full"> + <div ref="chartRefList" v-for="(item, index) in recordSetList" :key="index"></div> + </div> + </div> + <div v-if="urlList && urlList.length > 0" class="w-full"> + <HTMLCom :data="item.url" v-for="(item, index) in urlList" :key="index"></HTMLCom> + </div> + </template> + <div v-else class="text-red-500">{{ error }}</div> + </div> </template> -<script setup lang="ts"></script> +<script setup lang="ts"> +import * as echarts from 'echarts'; +import type { TableInstance } from 'element-plus'; +import _ from 'lodash'; +import { computed, onMounted, ref } from 'vue'; +import { AnswerType } from '../../model/types'; +import { PATH_ICON, SCATTER_SYMBOL_SIZE, timeDataOptionToContent } from '../common'; +import HTMLCom from '../htmlCom/HTMLCom.vue'; +import { ChartTypeEnum, chartTypeMapEchart } from '../types'; +import { axisLabelFormatter } from '/@/utils/chart'; +const props = defineProps(['data', 'error']); + +const selectChartType = ref<ChartTypeEnum>(ChartTypeEnum.Line); + +const columnsWidth = 120; + +const chartRef = ref<HTMLDivElement[] | HTMLDivElement>(null); +const tableRef = ref<TableInstance>(null); +const tableRefList = computed(() => { + let refList: TableInstance[] = []; + if (!tableRef.value) { + refList = []; + } else { + const first = tableRef.value?.[0]; + if (first) { + refList = tableRef.value as unknown as TableInstance[]; + } else { + refList = [tableRef.value as unknown as TableInstance]; + } + } + + return refList; +}); + +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 === AnswerType.RecordSet)); +const summaryList = computed(() => props.data.filter((item) => item.type === AnswerType.Summary)); +const urlList = computed(() => props.data.filter((item) => item.type === AnswerType.Url)); + +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], + symbol: 'none', + smooth: true, + }; + }); + instance.setOption({ + grid: { + // bottom: 120, + // right: '15%', + bottom: '5%', + }, + toolbox: { + show: true, + feature: { + dataZoom: { + yAxisIndex: 'none', + }, + + myBar: { + title: '杞寲涓烘煴鐘跺浘', + show: true, + icon: PATH_ICON.bar, + onclick: () => { + instance.setOption({ + series: seriesData.map((item) => ({ + ...item, + type: 'bar', + symbol: 'none', + })), + }); + }, + }, + + myScatter: { + title: '杞寲涓烘暎鐐瑰浘', + show: true, + icon: PATH_ICON.scatter, + onclick: () => { + instance.setOption({ + series: seriesData.map((item) => ({ + ...item, + type: 'scatter', + symbol: 'circle', + symbolSize: SCATTER_SYMBOL_SIZE, + })), + }); + }, + }, + myLine: { + title: '杞寲涓烘洸绾垮浘', + show: true, + icon: PATH_ICON.line, + onclick: () => { + instance.setOption({ + series: seriesData.map((item) => ({ + ...item, + type: 'line', + symbol: 'none', + smooth: true, + })), + }); + }, + }, + dataView: { + readOnly: true, + optionToContent: timeDataOptionToContent, + }, + saveAsImage: {}, + }, + }, + + tooltip: { + show: true, + trigger: 'axis', + }, + 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', + }, + }); +}; + +const doTableLayout = () => { + tableRefList.value.forEach((item) => { + item.doLayout(); + }); +}; +let chartInstanceList: echarts.ECharts[] = null; +onMounted(() => { + setTimeout(() => { + const parent = chartRefList.value[0]?.parentElement; + const data = props.data; + setTimeout(() => { + doTableLayout(); + }, 3000); + + if (!parent) { + return; + } + + 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