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