From d9d690e53d1c0946bc75b0b7bb5cf9dd617d1115 Mon Sep 17 00:00:00 2001 From: hy001 Date: Mon, 18 May 2026 21:12:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=A7=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datav/CountryDashboardServiceImpl.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) 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 8f34b514..4ce4ef8d 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 @@ -23,6 +23,7 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.time.temporal.WeekFields; import java.util.ArrayList; import java.util.Collection; @@ -73,13 +74,17 @@ public class CountryDashboardServiceImpl implements CountryDashboardService { QueryCondition condition = QueryCondition.of(cmd); Map rows = new LinkedHashMap<>(); - if (shouldUsePrecomputedMetrics(condition)) { + boolean usePrecomputedMetrics = shouldUsePrecomputedMetrics(condition); + if (usePrecomputedMetrics) { mergeSql(rows, countryDashboardDAO.listPrecomputedPeriodMetrics( condition.periodType, condition.startTime, condition.endTime, condition.countryKeyword, condition.statTimezone, condition.sysOrigin)); } else { mergeLiveSql(rows, condition); } + if (usePrecomputedMetrics && condition.shouldOverlayLiveSalaryExchange()) { + overlayLiveSalaryExchange(rows, condition); + } mergeMongo(rows, condition, listGiftConsume(condition), (row, amount) -> row.setGiftConsume(add(row.getGiftConsume(), amount))); @@ -157,6 +162,23 @@ public class CountryDashboardServiceImpl implements CountryDashboardService { condition.storageTimezoneOffset, condition.statTimezoneOffset)); } + private void overlayLiveSalaryExchange(Map rows, + QueryCondition condition) { + rows.values().forEach(row -> row.setSalaryExchange(BigDecimal.ZERO)); + List metrics = countryDashboardDAO.listSalaryExchange( + condition.periodType, condition.startTime, condition.endTime, + condition.countryKeyword, condition.sysOrigin, + condition.storageTimezoneOffset, condition.statTimezoneOffset); + if (metrics == null || metrics.isEmpty()) { + return; + } + for (CountryDashboardMetricDTO metric : metrics) { + CountryDashboardMetricCO row = getRow(rows, metric.getCountryCode(), metric.getCountryName(), + metric.getPeriodKey(), metric.getPeriodName()); + row.setSalaryExchange(safe(metric.getSalaryExchange())); + } + } + private boolean shouldUsePrecomputedMetrics(QueryCondition condition) { if (!hasText(condition.sysOrigin)) { return false; @@ -890,6 +912,18 @@ public class CountryDashboardServiceImpl implements CountryDashboardService { return new PeriodBucket(day, day); } + private boolean shouldOverlayLiveSalaryExchange() { + if (PERIOD_ALL.equals(periodType) || startDateValue == null || endDateValue == null) { + return false; + } + LocalDate today = LocalDate.now(statZoneId); + if (endDateValue.isBefore(today) || startDateValue.isAfter(today)) { + return false; + } + long days = ChronoUnit.DAYS.between(startDateValue, endDateValue.plusDays(1)); + return days <= 31; + } + private Long startTimeMillis() { return startInstant == null ? null : startInstant.toEpochMilli(); }