From 889e75f6a176fd4262e4bdd93af25adc060e4b65 Mon Sep 17 00:00:00 2001 From: zhx Date: Tue, 23 Jun 2026 19:11:00 +0800 Subject: [PATCH] fix databi registration country metric --- .../src/components/CountryPerformanceTable.jsx | 8 ++++---- .../components/CountryPerformanceTable.test.jsx | 16 ++++++++-------- databi/src/data/createDashboardModel.js | 6 +++--- databi/src/data/createDashboardModel.test.js | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/databi/src/components/CountryPerformanceTable.jsx b/databi/src/components/CountryPerformanceTable.jsx index f0f2e1f..7156c63 100644 --- a/databi/src/components/CountryPerformanceTable.jsx +++ b/databi/src/components/CountryPerformanceTable.jsx @@ -18,7 +18,7 @@ const defaultSortByTab = { const countryColumns = [ { key: "country", label: "国家", type: "text", align: "left" }, - { key: "visitors", label: "访客" }, + { key: "registrations", label: "注册" }, { key: "active_users", label: "活跃用户" }, { key: "paid_users", label: "付费用户" }, { key: "recharge_users", label: "充值用户" }, @@ -44,8 +44,8 @@ const countrySortAccessors = { recharge_conversion_rate: (item) => item.recharge_conversion_rate, recharge_users: (item) => item.recharge_users, recharge_usd_minor: (item) => item.recharge_usd_minor, - trend_rate: (item) => item.trend_rate, - visitors: (item) => item.visitors + registrations: (item) => item.registrations, + trend_rate: (item) => item.trend_rate }; const giftColumns = [ @@ -146,7 +146,7 @@ function CountryTable({ items, loading, onSort, sortState }) { {index + 1} {item.flag ? {item.flag} : null}{item.country} - {formatNumber(item.visitors)} + {formatNumber(item.registrations)} {formatNumber(item.active_users)} {formatNumber(item.paid_users)} {formatNumber(item.recharge_users)} diff --git a/databi/src/components/CountryPerformanceTable.test.jsx b/databi/src/components/CountryPerformanceTable.test.jsx index 3ed8939..c047508 100644 --- a/databi/src/components/CountryPerformanceTable.test.jsx +++ b/databi/src/components/CountryPerformanceTable.test.jsx @@ -8,19 +8,19 @@ const countryItems = [ country: "阿富汗", flag: "🇦🇫", recharge_usd_minor: 50000, - visitors: 10 + registrations: 10 }), createCountryRow({ country: "巴西", flag: "🇧🇷", recharge_usd_minor: 10000, - visitors: 30 + registrations: 30 }), createCountryRow({ country: "中国", flag: "🇨🇳", recharge_usd_minor: 30000, - visitors: 20 + registrations: 20 }) ]; @@ -31,14 +31,14 @@ test("sorts country table headers ascending and descending", async () => { expect(firstCountryCell()).toHaveTextContent("阿富汗"); - await user.click(screen.getByRole("button", { name: /访客/ })); + await user.click(screen.getByRole("button", { name: /注册/ })); - expect(screen.getByRole("columnheader", { name: /访客/ })).toHaveAttribute("aria-sort", "descending"); + expect(screen.getByRole("columnheader", { name: /注册/ })).toHaveAttribute("aria-sort", "descending"); expect(firstCountryCell()).toHaveTextContent("巴西"); - await user.click(screen.getByRole("button", { name: /访客/ })); + await user.click(screen.getByRole("button", { name: /注册/ })); - expect(screen.getByRole("columnheader", { name: /访客/ })).toHaveAttribute("aria-sort", "ascending"); + expect(screen.getByRole("columnheader", { name: /注册/ })).toHaveAttribute("aria-sort", "ascending"); expect(firstCountryCell()).toHaveTextContent("阿富汗"); }); @@ -56,8 +56,8 @@ function createCountryRow(overrides) { recharge_conversion_rate: 0, recharge_users: 0, recharge_usd_minor: 0, + registrations: 0, trend_rate: 0, - visitors: 0, ...overrides }; } diff --git a/databi/src/data/createDashboardModel.js b/databi/src/data/createDashboardModel.js index 5c252dc..03234fc 100644 --- a/databi/src/data/createDashboardModel.js +++ b/databi/src/data/createDashboardModel.js @@ -14,7 +14,7 @@ export function createDashboardModel(overview, { appCode, countryId, range, time const activeUsers = readNumber(source, "active_users", "activeUsers"); const paidUsers = readNumber(source, "paid_users", "paidUsers"); const rechargeUsers = readNumber(source, "recharge_users", "rechargeUsers", "paid_users", "paidUsers"); - const newUsers = readNumber(source, "new_users", "newUsers", "visitors"); + const newUsers = readNumber(source, "new_users", "newUsers", "registrations", "registered_users", "registeredUsers"); const arpu = readNumber(source, "arpu_usd_minor", "arpuUsdMinor"); const arppu = readNumber(source, "arppu_usd_minor", "arppuUsdMinor"); const giftCoinSpent = readNumber(source, "gift_coin_spent", "giftCoinSpent"); @@ -257,8 +257,8 @@ function normalizeCountryRow(item, index, totalRecharge) { : ratio(rechargeUsers, activeUsers), recharge_users: rechargeUsers, share: recharge / totalRecharge, - trend_rate: numberValue(item.trend_rate ?? item.trendRate), - visitors: numberValue(item.visitors ?? item.new_users ?? item.newUsers) + registrations: numberValue(item.new_users ?? item.newUsers ?? item.registrations ?? item.registered_users ?? item.registeredUsers), + trend_rate: numberValue(item.trend_rate ?? item.trendRate) }; } diff --git a/databi/src/data/createDashboardModel.test.js b/databi/src/data/createDashboardModel.test.js index 9687afa..482ffbd 100644 --- a/databi/src/data/createDashboardModel.test.js +++ b/databi/src/data/createDashboardModel.test.js @@ -107,6 +107,23 @@ test("uses active users as payer and recharge conversion denominator", () => { })); }); +test("uses registration count instead of legacy visitors in country breakdown", () => { + const model = createDashboardModel({ + country_breakdown: [ + { + country: "菲律宾", + new_users: 12, + visitors: 99 + } + ] + }, { appCode: "lalu", countryId: 0, range: { end: "2026-06-04", start: "2026-06-04" } }); + + expect(model.countryBreakdown[0]).toEqual(expect.objectContaining({ + registrations: 12 + })); + expect(model.countryBreakdown[0]).not.toHaveProperty("visitors"); +}); + function metricValue(model, label) { return [...model.kpis, ...model.businessKpis, ...model.robotGiftKpis].find((item) => item.label === label)?.value; }