From 8feecc423c832d454b194ca80b065f262ed4f9fc Mon Sep 17 00:00:00 2001 From: hy001 Date: Wed, 27 May 2026 17:01:20 +0800 Subject: [PATCH] Add country dashboard ARPU summary --- .../datav/CountryDashboardServiceImpl.java | 42 +++++++++++++++++++ .../datav/CountryDashboardArpuSummaryCO.java | 23 ++++++++++ .../datav/CountryDashboardCO.java | 2 + 3 files changed, 67 insertions(+) create mode 100644 rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clientobject/datav/CountryDashboardArpuSummaryCO.java diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/datav/CountryDashboardServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/datav/CountryDashboardServiceImpl.java index e991daf6..e1296ff2 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/datav/CountryDashboardServiceImpl.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/datav/CountryDashboardServiceImpl.java @@ -1,6 +1,7 @@ package com.red.circle.console.app.service.app.datav; import com.red.circle.console.app.dto.clientobject.datav.CountryDashboardCO; +import com.red.circle.console.app.dto.clientobject.datav.CountryDashboardArpuSummaryCO; import com.red.circle.console.app.dto.clientobject.datav.CountryDashboardMetricCO; import com.red.circle.console.app.dto.clientobject.datav.CountryDashboardRechargeDetailCO; import com.red.circle.console.app.dto.cmd.datav.CountryDashboardQryCmd; @@ -79,6 +80,12 @@ public class CountryDashboardServiceImpl implements CountryDashboardService { public CountryDashboardCO query(CountryDashboardQryCmd cmd) { ensurePeriodMetricSchema(); QueryCondition condition = QueryCondition.of(cmd); + CountryDashboardCO dashboard = queryPrecomputed(condition); + dashboard.setArpuSummary(buildArpuSummary(condition)); + return dashboard; + } + + private CountryDashboardCO queryPrecomputed(QueryCondition condition) { Map rows = new LinkedHashMap<>(); mergeSql(rows, countryDashboardDAO.listPrecomputedPeriodMetrics( @@ -105,6 +112,13 @@ public class CountryDashboardServiceImpl implements CountryDashboardService { .setRecords(records); } + private CountryDashboardArpuSummaryCO buildArpuSummary(QueryCondition condition) { + return new CountryDashboardArpuSummaryCO() + .setDay(queryPrecomputed(condition.recentDays(1))) + .setThreeDay(queryPrecomputed(condition.recentDays(3))) + .setWeek(queryPrecomputed(condition.recentDays(7))); + } + private void mergeLiveSql(Map rows, QueryCondition condition) { mergeSql(rows, countryDashboardDAO.listNewUsers( condition.periodType, condition.startTime, condition.endTime, @@ -973,6 +987,34 @@ public class CountryDashboardServiceImpl implements CountryDashboardService { ); } + private QueryCondition recentDays(int dayCount) { + LocalDate end = LocalDate.now(statZoneId); + LocalDate start = end.minusDays(Math.max(1, dayCount) - 1L); + Instant recentStartInstant = start.atStartOfDay(statZoneId).toInstant(); + Instant recentEndInstant = end.plusDays(1).atStartOfDay(statZoneId).toInstant(); + LocalDateTime recentStorageStartTime = + LocalDateTime.ofInstant(recentStartInstant, STORAGE_ZONE_ID); + LocalDateTime recentStorageEndTime = + LocalDateTime.ofInstant(recentEndInstant, STORAGE_ZONE_ID); + return new QueryCondition( + "DAY", + DATE_FORMATTER.format(start), + DATE_FORMATTER.format(end), + statTimezone, + statZoneId, + storageTimezoneOffset, + statTimezoneOffset, + start, + end, + recentStorageStartTime, + recentStorageEndTime, + recentStartInstant, + recentEndInstant, + null, + sysOrigin + ); + } + private PeriodBucket toPeriodBucket(String day) { if (PERIOD_ALL.equals(periodType)) { return new PeriodBucket(PERIOD_ALL, "全部"); diff --git a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clientobject/datav/CountryDashboardArpuSummaryCO.java b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clientobject/datav/CountryDashboardArpuSummaryCO.java new file mode 100644 index 00000000..4676f643 --- /dev/null +++ b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clientobject/datav/CountryDashboardArpuSummaryCO.java @@ -0,0 +1,23 @@ +package com.red.circle.console.app.dto.clientobject.datav; + +import java.io.Serial; +import java.io.Serializable; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 国家数据大屏 ARPU 汇总. + */ +@Data +@Accessors(chain = true) +public class CountryDashboardArpuSummaryCO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private CountryDashboardCO day; + + private CountryDashboardCO threeDay; + + private CountryDashboardCO week; +} diff --git a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clientobject/datav/CountryDashboardCO.java b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clientobject/datav/CountryDashboardCO.java index 067d5066..15f44cde 100644 --- a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clientobject/datav/CountryDashboardCO.java +++ b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clientobject/datav/CountryDashboardCO.java @@ -29,4 +29,6 @@ public class CountryDashboardCO implements Serializable { private CountryDashboardMetricCO total; private List records; + + private CountryDashboardArpuSummaryCO arpuSummary; }