YNMap/src/page/index/components/BrandConsumptionLevel/BrandConsumptionLevel.vue
ylj20011123 3e35dcaea9 update
2025-06-19 19:30:13 +08:00

186 lines
4.6 KiB
Vue

<script setup lang="ts">
import SmallTitle from '../smallTitle/smallTitle.vue'
import './BrandConsumptionLevel.less'
import * as echarts from 'echarts/core';
import { LineChart } from 'echarts/charts';
import {
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent
} from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
import { onBeforeUnmount, onMounted } from 'vue';
import { handleGetBusinessBrandLevel } from '../../service';
import moment from 'moment';
// 注册组件
echarts.use([
LineChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
onMounted(async () => {
const res: any = await handleGetData()
const chartDom = document.getElementById('BrandConsumptionLevel');
if (!chartDom) return;
myChart = echarts.init(chartDom);
const option = {
legend: {
// selectedMode: false,
right: 0,
textStyle: {
color: '#fff',
fontSize: 12,
padding: [0, 0, 0, 5]
},
},
grid: {
left: '0',
right: '0',
bottom: '0',
top: '30',
containLabel: true
},
yAxis: {
name: '%',
type: 'value',
splitLine: { show: false }, // 隐藏刻度线
axisLine: {
show: true,
lineStyle: {
color: '#fff'
}
},
axisLabel: {
color: '#fff',
}
},
xAxis: {
type: 'category',
data: res.category,
axisLabel: {
interval: 0 // 强制显示所有标签
},
axisLine: {
show: true,
lineStyle: {
color: '#fff'
}
},
},
series: res.seriesData,
tooltip: {
trigger: 'item',
formatter: function (params: any) {
return `
<div style="font-weight:bold">${params.seriesName} ${params.value}%</div>
`;
}
},
};
myChart.setOption(option);
myChart.resize();
window.addEventListener('resize', resizeChart);
})
// 拿到数据
const handleGetData = async () => {
let category: any = []
let seriesData: any = []
const req: any = {
ProvinceCode: '530000',
StatisticsDate: moment().subtract(1, 'd').format('YYYY-MM-DD'),
// ServerpartId: ''
}
let BrandConsumptionLevel = sessionStorage.getItem('BrandConsumptionLevel')
let data: any = []
if (BrandConsumptionLevel) {
data = JSON.parse(BrandConsumptionLevel)
} else {
data = await handleGetBusinessBrandLevel(req)
sessionStorage.setItem("BrandConsumptionLevel", JSON.stringify(data))
}
// const data = await handleGetBusinessBrandLevel(req)
category = data.legend
let list = data.ColumnList
if (list && list.length > 0) {
list.forEach((item: any) => {
seriesData.push({
name: item.name,
type: 'bar',
stack: 'Ad',
barWidth: 6,
emphasis: {
focus: 'series'
},
itemStyle: {
color: item.name === '低消费' ? '#7D4CD2' : item.name === '普通消费' ? '#00FFB7' : item.name === '高消费' ? '#FF307C' : '' // 直接指定颜色值
},
data: item.data
})
})
}
let res: any = {
category: category,// x轴的内容
seriesData: seriesData,
}
let BrandConsumptionLevelAI = sessionStorage.getItem('BrandConsumptionLevelAI')
if (BrandConsumptionLevelAI) { } else {
let aiObj: any = {}
for (let i = 0; i < res.category.length; i++) {
aiObj[res.category[i]] = `低消费占比${list[0].data[i]},普通消费占比${list[1].data[i]},高消费占比${list[2].data[i]},`
}
sessionStorage.setItem("BrandConsumptionLevelAI", JSON.stringify(aiObj))
}
return res
}
const resizeChart = () => {
myChart?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
});
</script>
<template>
<div class="BrandConsumptionLevelBox">
<SmallTitle :title="'品牌消费水平'"></SmallTitle>
<div class="BrandConsumptionLevel" id="BrandConsumptionLevel"></div>
</div>
</template>