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