YNMap/src/page/index/components/MallOrderStatistics/MallOrderStatistics.vue
ylj20011123 a922a57525 update
2025-07-14 16:14:21 +08:00

242 lines
6.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup lang="ts">
import { onBeforeUnmount, onMounted, ref } from 'vue';
import SmallTitle from '../smallTitle/smallTitle.vue'
import './MallOrderStatistics.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 moment from 'moment';
import { handleGetMallOrderSummary } from '../../service';
// 季月年的选中
let selectType = ref<number>(1)
// 注册组件
echarts.use([
LineChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
onMounted(async () => {
const res: any = await handleGetData()
const chartDom = document.getElementById('MallOrderStatistics');
if (!chartDom) return;
myChart = echarts.init(chartDom);
const option = handleSetConfig(res)
myChart.setOption(option);
myChart.resize();
window.addEventListener('resize', resizeChart);
})
// 修改选择的季月年
const handleChangeType = async (value: number) => {
selectType.value = value
}
const handleGetData = async () => {
let category: string[] = []
let TicketCountData: number[] = [] // 订单笔数
let SellAmountData: string[] = [] // 交易金额
const req: any = {
DataType: 2,// 1 日度 2 月度
ProvinceCode: '530000',
StartMonth: moment().startOf('y').format('YYYYMM'),
EndMonth: moment().subtract(1, 'M').format('YYYYMM'),
}
console.log('dkosajdaihfysudafhs', req);
// const data = await handleGetMallOrderSummary(req)
let MallOrderStatistics = sessionStorage.getItem('MallOrderStatistics')
let data: any = []
if (MallOrderStatistics) {
data = JSON.parse(MallOrderStatistics)
} else {
data = await handleGetMallOrderSummary(req)
sessionStorage.setItem("MallOrderStatistics", JSON.stringify(data))
}
console.log('gjisayudshfsdafdfdasfasd', data);
if (data && data.length > 0) {
data.forEach((item: any) => {
category.push(`${item.StatisticsMonth}`)
TicketCountData.push(item.TicketCount)
SellAmountData.push(item.SellAmount)
})
}
let res: any = {
category: category,// x轴的内容
TicketCountData: TicketCountData,// 订单笔数
SellAmountData: SellAmountData// 交易金额
}
return res
}
const resizeChart = () => {
myChart?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
});
const handleSetConfig = (res: any) => {
const option = {
xAxis: {
type: 'category',
data: res.category,
axisLine: {
lineStyle: {
color: '#fff' // X轴线颜色
}
},
axisLabel: {
color: '#fff', // X轴标签颜色
interval: 0,
},
},
yAxis: [
{
type: 'value',
name: '交易笔数(笔)',
position: 'left',
splitLine: { show: false },
axisLine: {
show: true,
lineStyle: {
color: '#fff' // 左侧Y轴线颜色与第一条折线颜色一致
}
},
axisLabel: {
color: '#fff' // 左侧Y轴标签颜色
},
nameTextStyle: {
color: '#fff', // 左侧Y轴名称颜色
padding: [0, 0, 0, 20]
}
},
{
type: 'value',
name: '交易金额(元)',
position: 'right',
splitLine: { show: false },
axisLine: {
show: true,
lineStyle: {
color: '#fff' // 右侧Y轴线颜色与第二条折线颜色一致
}
},
axisLabel: {
color: '#fff' // 右侧Y轴标签颜色
},
nameTextStyle: {
color: '#fff', // 右侧Y轴名称颜色
padding: [0, 0, 0, 0]
}
}
],
grid: {
left: '0', // 增加左侧空间给Y轴标签
right: '10', // 增加右侧空间给Y轴标签
bottom: '0',
top: '50',
containLabel: true
},
series: [
{
name: '交易笔数',
type: 'line',
yAxisIndex: 0, // 关联左侧Y轴
data: res.TicketCountData,
},
{
name: '交易金额',
type: 'line',
yAxisIndex: 1, // 关联右侧Y轴
data: res.SellAmountData,
}
],
tooltip: {
trigger: 'axis',
formatter: function (params: any) {
return `
<div style="font-weight:bold">${params[0].name}</div>
<div >${params[0].seriesName}: ${params[0].value}笔</div>
<div >${params[1].seriesName}: ${params[1].value}元</div>
`;
}
},
legend: {
data: ['交易笔数', '交易金额'],
top: 0,
right: 0,
textStyle: {
color: '#fff'
}
},
color: ['#FF5E5E', '#FF9500']
};
return option
}
const handleUpdatePie = async () => {
myChart.setOption({
series: [], // 清空 series
}, { replaceMerge: 'series' }); // 替换 series 部分
const res: any = await handleGetData()
const option = handleSetConfig(res)
myChart.setOption(option)
}
defineExpose({
handleUpdatePie
});
</script>
<template>
<div class="MallOrderStatisticsBox">
<SmallTitle :title="'商城订单统计'">
<!-- <template #extra>
<div class="changeTypeBox">
<div :class="selectType === 1 ? 'changeTypeItem selectChangeTypeItem' : 'changeTypeItem'"
@click="handleChangeType(1)"></div>
<div :class="selectType === 2 ? 'changeTypeItem selectChangeTypeItem' : 'changeTypeItem'"
@click="handleChangeType(2)"></div>
</div>
</template> -->
</SmallTitle>
<div class="MallOrderStatistics" id="MallOrderStatistics"></div>
</div>
</template>