242 lines
6.6 KiB
Vue
242 lines
6.6 KiB
Vue
<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> |