From fe62992d785b21253557a63867e08ab5a7c389f5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 19 Oct 2025 18:40:27 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E3=80=90mall=20=E5=95=86=E5=9F=8E?= =?UTF-8?q?=E3=80=91=E4=BC=9A=E5=91=98=E7=BB=9F=E8=AE=A1=E3=80=90antd?= =?UTF-8?q?=E3=80=9110%=20=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/mall/statistics/member/index.vue | 134 ++++++++++++++---- .../statistics/member/modules/area-card.vue | 118 +++++++++++++++ .../member/modules/area-chart-options.ts | 61 ++++++++ .../statistics/member/modules/sex-card.vue | 63 ++++++++ .../member/modules/sex-chart-options.ts | 35 +++++ 5 files changed, 386 insertions(+), 25 deletions(-) create mode 100644 apps/web-antd/src/views/mall/statistics/member/modules/area-card.vue create mode 100644 apps/web-antd/src/views/mall/statistics/member/modules/area-chart-options.ts create mode 100644 apps/web-antd/src/views/mall/statistics/member/modules/sex-card.vue create mode 100644 apps/web-antd/src/views/mall/statistics/member/modules/sex-chart-options.ts diff --git a/apps/web-antd/src/views/mall/statistics/member/index.vue b/apps/web-antd/src/views/mall/statistics/member/index.vue index 3e6a57c00..f25ff3a7f 100644 --- a/apps/web-antd/src/views/mall/statistics/member/index.vue +++ b/apps/web-antd/src/views/mall/statistics/member/index.vue @@ -1,32 +1,116 @@ diff --git a/apps/web-antd/src/views/mall/statistics/member/modules/area-card.vue b/apps/web-antd/src/views/mall/statistics/member/modules/area-card.vue new file mode 100644 index 000000000..516e1a149 --- /dev/null +++ b/apps/web-antd/src/views/mall/statistics/member/modules/area-card.vue @@ -0,0 +1,118 @@ + + + diff --git a/apps/web-antd/src/views/mall/statistics/member/modules/area-chart-options.ts b/apps/web-antd/src/views/mall/statistics/member/modules/area-chart-options.ts new file mode 100644 index 000000000..551b18a1d --- /dev/null +++ b/apps/web-antd/src/views/mall/statistics/member/modules/area-chart-options.ts @@ -0,0 +1,61 @@ +import type { EChartsOption } from 'echarts'; +import type { MallMemberStatisticsApi } from '#/api/mall/statistics/member'; + +import { fenToYuan } from '@vben/utils'; + +// 地图数据由 @vben/plugins/echarts 自动处理 + +/** 会员地域分布图表配置 */ +export function getAreaChartOptions(data: MallMemberStatisticsApi.AreaStatistics[]): EChartsOption { + let min = 0; + let max = 0; + + const mapData = data.map((item) => { + min = Math.min(min, item.orderPayUserCount || 0); + max = Math.max(max, item.orderPayUserCount || 0); + return { + ...item, + name: item.areaName, + value: item.orderPayUserCount || 0, + }; + }); + + return { + tooltip: { + trigger: 'item', + formatter: (params: any) => { + const data = params?.data; + if (!data) return params?.name || ''; + + return `${data.areaName || params.name}
+会员数量:${data.userCount || 0}
+订单创建数量:${data.orderCreateUserCount || 0}
+订单支付数量:${data.orderPayUserCount || 0}
+订单支付金额:¥${Number(fenToYuan(data.orderPayPrice || 0)).toFixed(2)}`; + }, + }, + visualMap: { + text: ['高', '低'], + realtime: false, + calculable: true, + top: 'middle', + min, + max, + inRange: { + color: ['#fff', '#3b82f6'], + }, + }, + series: [ + { + name: '会员地域分布', + type: 'map', + map: 'china', + roam: false, + selectedMode: false, + data: mapData, + }, + ], + }; +} + +// 地图数据已在 @vben/plugins/echarts 中自动注册 diff --git a/apps/web-antd/src/views/mall/statistics/member/modules/sex-card.vue b/apps/web-antd/src/views/mall/statistics/member/modules/sex-card.vue new file mode 100644 index 000000000..fad832e1c --- /dev/null +++ b/apps/web-antd/src/views/mall/statistics/member/modules/sex-card.vue @@ -0,0 +1,63 @@ + + + diff --git a/apps/web-antd/src/views/mall/statistics/member/modules/sex-chart-options.ts b/apps/web-antd/src/views/mall/statistics/member/modules/sex-chart-options.ts new file mode 100644 index 000000000..685d21a73 --- /dev/null +++ b/apps/web-antd/src/views/mall/statistics/member/modules/sex-chart-options.ts @@ -0,0 +1,35 @@ +import type { EChartsOption } from 'echarts'; + +interface ChartData { + name: string; + value: number; +} + +/** 会员性别比例图表配置 */ +export function getSexChartOptions(data: ChartData[]): EChartsOption { + return { + tooltip: { + trigger: 'item', + confine: true, + formatter: '{a}
{b} : {c} ({d}%)', + }, + legend: { + orient: 'vertical', + left: 'right', + }, + series: [ + { + name: '会员性别', + type: 'pie', + roseType: 'area', + label: { + show: false, + }, + labelLine: { + show: false, + }, + data, + }, + ], + }; +}