From a62e5a65a5c35bfb548784d5e59659feaa15d122 Mon Sep 17 00:00:00 2001 From: zhx Date: Wed, 27 May 2026 22:13:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=B0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/api/legacy/datav.ts | 3 ++ apps/src/views/statistics/datav.vue | 61 ++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/apps/src/api/legacy/datav.ts b/apps/src/api/legacy/datav.ts index bb6e35c..a54779d 100644 --- a/apps/src/api/legacy/datav.ts +++ b/apps/src/api/legacy/datav.ts @@ -14,6 +14,7 @@ export interface CountryDashboardMetric { d30RetentionRate: number | string; d30RetentionUser: number; dailyActiveUser: number; + dailyRechargeUser: number; dealerRecharge: number | string; googleRecharge: number | string; gamePayoutRate: number | string; @@ -32,6 +33,7 @@ export interface CountryDashboardMetric { luckyGiftUser: number; luckyGiftUserRate: number | string; mifapayRecharge: number | string; + newDealerUserRecharge: number | string; newUserRecharge: number | string; officialRecharge: number | string; periodKey: string; @@ -39,6 +41,7 @@ export interface CountryDashboardMetric { salaryExchange: number | string; salaryTransfer: number | string; totalRecharge: number | string; + userRecharge: number | string; } export interface CountryDashboardResult { diff --git a/apps/src/views/statistics/datav.vue b/apps/src/views/statistics/datav.vue index 734bb49..cd263b0 100644 --- a/apps/src/views/statistics/datav.vue +++ b/apps/src/views/statistics/datav.vue @@ -164,6 +164,7 @@ const metricColumns = new Set([ 'd7RetentionRate', 'd30RetentionRate', 'dailyActiveUser', + 'dailyRechargeUser', 'dealerRecharge', 'gamePayout', 'gamePayoutRate', @@ -181,15 +182,18 @@ const metricColumns = new Set([ 'luckyGiftUser', 'luckyGiftUserRate', 'mifapayRecharge', + 'newDealerUserRecharge', 'newUserRecharge', 'salaryExchange', 'salaryTransfer', 'totalRecharge', + 'userRecharge', ]); const integerMetricColumns = new Set([ 'countryNewUser', 'dailyActiveUser', + 'dailyRechargeUser', 'gameUser', 'luckyGiftUser', ]); @@ -208,8 +212,11 @@ const percentMetricColumns = new Set([ const summaryMetricKeys = [ 'countryNewUser', 'dailyActiveUser', + 'dailyRechargeUser', 'newUserRecharge', 'dealerRecharge', + 'newDealerUserRecharge', + 'userRecharge', 'mifapayRecharge', 'googleRecharge', 'salaryExchange', @@ -235,8 +242,11 @@ const summaryMetricKeys = [ const summaryMetricDefinitions = [ { key: 'countryNewUser', label: '新增' }, { key: 'dailyActiveUser', label: '当日活跃' }, - { key: 'newUserRecharge', label: '新增充值' }, - { key: 'dealerRecharge', label: '币商充值' }, + { key: 'dailyRechargeUser', label: '新增当日充值用户数' }, + { key: 'newUserRecharge', label: '新增用户充值' }, + { key: 'dealerRecharge', label: '币商平台充值' }, + { key: 'newDealerUserRecharge', label: '新增币商用户充值' }, + { key: 'userRecharge', label: '用户充值' }, { key: 'mifapayRecharge', label: 'MifaPay 充值' }, { key: 'googleRecharge', label: 'Google 充值' }, { key: 'salaryExchange', label: '工资兑换' }, @@ -284,8 +294,11 @@ const overviewColumns: any[] = [ { align: 'right', dataIndex: 'd1RetentionRate', key: 'd1RetentionRate', title: '次日留存率', width: 140 }, { align: 'right', dataIndex: 'd7RetentionRate', key: 'd7RetentionRate', title: '七日留存率', width: 140 }, { align: 'right', dataIndex: 'd30RetentionRate', key: 'd30RetentionRate', title: '30 日留存率', width: 150 }, - { align: 'right', dataIndex: 'newUserRecharge', key: 'newUserRecharge', title: '新增充值', width: 130 }, - { align: 'right', dataIndex: 'dealerRecharge', key: 'dealerRecharge', title: '币商充值', width: 130 }, + { align: 'right', dataIndex: 'dailyRechargeUser', key: 'dailyRechargeUser', title: '新增当日充值用户数', width: 180 }, + { align: 'right', dataIndex: 'newUserRecharge', key: 'newUserRecharge', title: '新增用户充值', width: 140 }, + { align: 'right', dataIndex: 'dealerRecharge', key: 'dealerRecharge', title: '币商平台充值', width: 140 }, + { align: 'right', dataIndex: 'newDealerUserRecharge', key: 'newDealerUserRecharge', title: '新增币商用户充值', width: 170 }, + { align: 'right', dataIndex: 'userRecharge', key: 'userRecharge', title: '用户充值', width: 130 }, { align: 'right', dataIndex: 'mifapayRecharge', key: 'mifapayRecharge', title: 'MifaPay 充值', width: 150 }, { align: 'right', dataIndex: 'googleRecharge', key: 'googleRecharge', title: 'Google 充值', width: 140 }, { align: 'right', dataIndex: 'salaryExchange', key: 'salaryExchange', title: '工资兑换', width: 130 }, @@ -315,7 +328,9 @@ const rechargeColumns: any[] = [ { dataIndex: 'countryName', fixed: 'left' as const, key: 'countryName', title: '国家', width: 150 }, { dataIndex: 'countryCode', key: 'countryCode', title: 'Code', width: 86 }, { dataIndex: 'periodName', key: 'periodName', title: '周期', width: 110 }, - { align: 'right', dataIndex: 'dealerRecharge', key: 'dealerRecharge', title: '币商充值', width: 140 }, + { align: 'right', dataIndex: 'dealerRecharge', key: 'dealerRecharge', title: '币商平台充值', width: 150 }, + { align: 'right', dataIndex: 'newDealerUserRecharge', key: 'newDealerUserRecharge', title: '新增币商用户充值', width: 170 }, + { align: 'right', dataIndex: 'userRecharge', key: 'userRecharge', title: '用户充值', width: 140 }, { align: 'right', dataIndex: 'mifapayRecharge', key: 'mifapayRecharge', title: 'MifaPay 充值', width: 160 }, { align: 'right', dataIndex: 'googleRecharge', key: 'googleRecharge', title: 'Google 充值', width: 150 }, { align: 'right', dataIndex: 'totalRecharge', key: 'totalRecharge', title: '总充值', width: 140 }, @@ -385,7 +400,7 @@ const rechargeDetailScrollX = rechargeDetailColumns.reduce( 0, ); const rechargeSourceNameMap: Record = { - DEALER: '币商充值', + DEALER: '币商平台充值', MIFAPAY: 'MifaPay 充值', OFFICIAL: '官方充值', }; @@ -446,6 +461,7 @@ const appDataCards = computed(() => { const arpuCards = computed(() => { return [ { label: '日 ARPU', value: formatArpu(arpuDashboards.value.day) }, + { label: '充值用户日 ARPU', value: formatRechargeUserDayArpu(arpuDashboards.value.day) }, { label: '3 日 ARPU', value: formatArpu(arpuDashboards.value.threeDay) }, { label: '周 ARPU', value: formatArpu(arpuDashboards.value.week) }, { label: '筛选 ARPU', value: formatAmount(calcArpu(visibleSummary.value)) }, @@ -455,6 +471,10 @@ const totalRechargeCard = computed(() => ({ label: '总充值', value: formatAmount(visibleSummary.value.totalRecharge), })); +const userRechargeCard = computed(() => ({ + label: '用户充值', + value: formatAmount(visibleSummary.value.userRecharge), +})); function hasPermission(code: string) { const codes = accessCodes.value; @@ -800,11 +820,24 @@ function calcArpu(summary: Record) { return toAmount(summary.totalRecharge) / activeUser; } +function calcRechargeUserDayArpu(summary: Record) { + const dailyRechargeUser = toAmount(summary.dailyRechargeUser); + if (dailyRechargeUser === 0) { + return 0; + } + return toAmount(summary.userRecharge) / dailyRechargeUser; +} + function formatArpu(result?: CountryDashboardResult | null) { const summary = buildVisibleSummary(filterRecordsBySelectedCountries(result?.records || [])); return formatAmount(calcArpu(summary)); } +function formatRechargeUserDayArpu(result?: CountryDashboardResult | null) { + const summary = buildVisibleSummary(filterRecordsBySelectedCountries(result?.records || [])); + return formatAmount(calcRechargeUserDayArpu(summary)); +} + function emptySummary(): SummaryMetric { return { countryNewUser: 0, @@ -818,6 +851,7 @@ function emptySummary(): SummaryMetric { d30RetentionRate: 0, d30RetentionUser: 0, dailyActiveUser: 0, + dailyRechargeUser: 0, dealerRecharge: 0, googleRecharge: 0, gamePayout: 0, @@ -835,10 +869,12 @@ function emptySummary(): SummaryMetric { luckyGiftUser: 0, luckyGiftUserRate: 0, mifapayRecharge: 0, + newDealerUserRecharge: 0, newUserRecharge: 0, salaryExchange: 0, salaryTransfer: 0, totalRecharge: 0, + userRecharge: 0, }; } @@ -1057,8 +1093,11 @@ async function renderVisualCharts() { } renderUserRechargeChart(baseChartOption('新增用户与充值', list, [ amountSeries('新增用户', 'countryNewUser', list), - amountSeries('新增充值', 'newUserRecharge', list), - amountSeries('币商充值', 'dealerRecharge', list), + amountSeries('当日充值用户数', 'dailyRechargeUser', list), + amountSeries('新增用户充值', 'newUserRecharge', list), + amountSeries('币商平台充值', 'dealerRecharge', list), + amountSeries('新增币商用户充值', 'newDealerUserRecharge', list), + amountSeries('用户充值', 'userRecharge', list), amountSeries('MifaPay 充值', 'mifapayRecharge', list), amountSeries('Google 充值', 'googleRecharge', list), amountSeries('工资兑换', 'salaryExchange', list), @@ -1224,6 +1263,10 @@ onBeforeUnmount(() => {
{{ totalRechargeCard.label }}
{{ totalRechargeCard.value }}
+
+
{{ userRechargeCard.label }}
+
{{ userRechargeCard.value }}
+
@@ -1565,7 +1608,7 @@ onBeforeUnmount(() => { } .metric-card-grid--recharge { - grid-template-columns: minmax(180px, 260px); + grid-template-columns: repeat(2, minmax(180px, 260px)); } .metric-card {