修复大屏

This commit is contained in:
hy001 2026-05-18 21:12:16 +08:00
parent b76e6e3a93
commit d9d690e53d

View File

@ -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<String, CountryDashboardMetricCO> 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<String, CountryDashboardMetricCO> rows,
QueryCondition condition) {
rows.values().forEach(row -> row.setSalaryExchange(BigDecimal.ZERO));
List<CountryDashboardMetricDTO> 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();
}