From 6c7af029a2e406d3df97933d01dc68faec5fe9c5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 19 Oct 2025 20:29:18 +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=90ele?= =?UTF-8?q?=E3=80=91100%=20=E5=85=A8=E9=83=A8=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/components/member-region-card.vue | 132 --------------- .../member/components/member-sex-card.vue | 73 -------- .../views/mall/statistics/member/index.vue | 158 +++++++++++------- .../statistics/member/modules/area-card.vue | 101 +++++++++++ .../member/modules/area-chart-options.ts | 130 ++++++++++++++ .../statistics/member/modules/funnel-card.vue | 4 +- .../statistics/member/modules/sex-card.vue | 64 +++++++ .../member/modules/sex-chart-options.ts | 28 ++++ .../member/modules/terminal-card.vue | 5 +- 9 files changed, 421 insertions(+), 274 deletions(-) delete mode 100644 apps/web-ele/src/views/mall/statistics/member/components/member-region-card.vue delete mode 100644 apps/web-ele/src/views/mall/statistics/member/components/member-sex-card.vue create mode 100644 apps/web-ele/src/views/mall/statistics/member/modules/area-card.vue create mode 100644 apps/web-ele/src/views/mall/statistics/member/modules/area-chart-options.ts create mode 100644 apps/web-ele/src/views/mall/statistics/member/modules/sex-card.vue create mode 100644 apps/web-ele/src/views/mall/statistics/member/modules/sex-chart-options.ts diff --git a/apps/web-ele/src/views/mall/statistics/member/components/member-region-card.vue b/apps/web-ele/src/views/mall/statistics/member/components/member-region-card.vue deleted file mode 100644 index 9d1549326..000000000 --- a/apps/web-ele/src/views/mall/statistics/member/components/member-region-card.vue +++ /dev/null @@ -1,132 +0,0 @@ - - - diff --git a/apps/web-ele/src/views/mall/statistics/member/components/member-sex-card.vue b/apps/web-ele/src/views/mall/statistics/member/components/member-sex-card.vue deleted file mode 100644 index d4445fcfc..000000000 --- a/apps/web-ele/src/views/mall/statistics/member/components/member-sex-card.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - diff --git a/apps/web-ele/src/views/mall/statistics/member/index.vue b/apps/web-ele/src/views/mall/statistics/member/index.vue index 381165e02..8b99dbde2 100644 --- a/apps/web-ele/src/views/mall/statistics/member/index.vue +++ b/apps/web-ele/src/views/mall/statistics/member/index.vue @@ -1,85 +1,113 @@ diff --git a/apps/web-ele/src/views/mall/statistics/member/modules/area-card.vue b/apps/web-ele/src/views/mall/statistics/member/modules/area-card.vue new file mode 100644 index 000000000..43d41aac7 --- /dev/null +++ b/apps/web-ele/src/views/mall/statistics/member/modules/area-card.vue @@ -0,0 +1,101 @@ + + + diff --git a/apps/web-ele/src/views/mall/statistics/member/modules/area-chart-options.ts b/apps/web-ele/src/views/mall/statistics/member/modules/area-chart-options.ts new file mode 100644 index 000000000..b2d0c6a66 --- /dev/null +++ b/apps/web-ele/src/views/mall/statistics/member/modules/area-chart-options.ts @@ -0,0 +1,130 @@ +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MallMemberStatisticsApi } from '#/api/mall/statistics/member'; + +import { fenToYuan } from '@vben/utils'; + +/** 会员地域分布图表配置 */ +export function getAreaChartOptions( + data: MallMemberStatisticsApi.AreaStatistics[], +): any { + if (!data || data.length === 0) { + return { + title: { + text: '暂无数据', + left: 'center', + top: 'center', + textStyle: { + color: '#999', + fontSize: 14, + }, + }, + }; + } + + // 计算 min 和 max 值 + let min = Number.POSITIVE_INFINITY; + let max = Number.NEGATIVE_INFINITY; + const mapData = data.map((item) => { + const payUserCount = item.orderPayUserCount || 0; + min = Math.min(min, payUserCount); + max = Math.max(max, payUserCount); + return { + ...item, + name: item.areaName, + value: payUserCount, + }; + }); + // 如果所有值都为 0,设置合理的 min 和 max 值 + if (min === max && min === 0) { + min = 0; + max = 10; + } + + // 返回图表配置 + return { + tooltip: { + trigger: 'item', + formatter: (params: any) => { + const itemData = params?.data; + if (!itemData) { + return `${params?.name || ''}
暂无数据`; + } + return `${itemData.areaName || params.name}
+会员数量:${itemData.userCount || 0}
+订单创建数量:${itemData.orderCreateUserCount || 0}
+订单支付数量:${itemData.orderPayUserCount || 0}
+订单支付金额:¥${Number(fenToYuan(itemData.orderPayPrice || 0)).toFixed(2)}`; + }, + }, + visualMap: { + text: ['高', '低'], + realtime: false, + calculable: true, + top: 'middle', + left: 10, + min, + max, + inRange: { + color: ['#e6f3ff', '#1890ff', '#0050b3'], + }, + }, + series: [ + { + name: '会员地域分布', + type: 'map', + map: 'china', + roam: false, + selectedMode: false, + itemStyle: { + borderColor: '#389e0d', + borderWidth: 0.5, + }, + emphasis: { + itemStyle: { + areaColor: '#ffec3d', + borderWidth: 1, + }, + }, + data: mapData, + }, + ], + }; +} + +/** VXE Grid 表格列配置 */ +export function getAreaTableColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'areaName', + title: '省份', + minWidth: 80, + sortable: true, + showOverflow: 'tooltip', + }, + { + field: 'userCount', + title: '会员数量', + minWidth: 100, + sortable: true, + }, + { + field: 'orderCreateUserCount', + title: '订单创建数量', + minWidth: 120, + sortable: true, + }, + { + field: 'orderPayUserCount', + title: '订单支付数量', + minWidth: 120, + sortable: true, + }, + { + field: 'orderPayPrice', + title: '订单支付金额', + minWidth: 120, + sortable: true, + formatter: 'formatFenToYuanAmount', + }, + ]; +} diff --git a/apps/web-ele/src/views/mall/statistics/member/modules/funnel-card.vue b/apps/web-ele/src/views/mall/statistics/member/modules/funnel-card.vue index 1ac8b2cc3..e2d3252e2 100644 --- a/apps/web-ele/src/views/mall/statistics/member/modules/funnel-card.vue +++ b/apps/web-ele/src/views/mall/statistics/member/modules/funnel-card.vue @@ -46,14 +46,14 @@ const calculateRelativeRate = (value?: number, reference?: number) => {