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;
}