Add country dashboard ARPU summary

This commit is contained in:
hy001 2026-05-27 17:01:20 +08:00
parent 0464935619
commit 8feecc423c
3 changed files with 67 additions and 0 deletions

View File

@ -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<String, CountryDashboardMetricCO> 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<String, CountryDashboardMetricCO> 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, "全部");

View File

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

View File

@ -29,4 +29,6 @@ public class CountryDashboardCO implements Serializable {
private CountryDashboardMetricCO total;
private List<CountryDashboardMetricCO> records;
private CountryDashboardArpuSummaryCO arpuSummary;
}