补充客客户信息照片和性别年龄
This commit is contained in:
@@ -92,7 +92,7 @@ public class LbDailyUserTradeReportServiceImpl extends ServiceImpl<LbDailyUserTr
|
||||
queryWrapper.eq(LbDailyUserTradeReport::getTenantId, tenantId)
|
||||
.ge(LbDailyUserTradeReport::getReportDate, start)
|
||||
.lt(LbDailyUserTradeReport::getReportDate, end)
|
||||
.ne(LbDailyUserTradeReport::getDataType, DATA_TYPE_REPORT_SUM);
|
||||
.eq(LbDailyUserTradeReport::getDataType, DATA_TYPE_REPORT_DETAIL);
|
||||
|
||||
BigDecimal yestodayBuyAmt = BigDecimal.ZERO;
|
||||
BigDecimal dailySellAmt = BigDecimal.ZERO;
|
||||
@@ -127,8 +127,19 @@ public class LbDailyUserTradeReportServiceImpl extends ServiceImpl<LbDailyUserTr
|
||||
summary.setCreatedAt(LocalDateTime.now());
|
||||
summary.setUpdatedAt(LocalDateTime.now());
|
||||
|
||||
// 同日重复汇总时先清理历史汇总,避免 report_sum 产生多条导致读取口径不稳定。
|
||||
LambdaQueryWrapper<LbDailyUserTradeReport> sumDeleteWrapper = new LambdaQueryWrapper<>();
|
||||
sumDeleteWrapper.eq(LbDailyUserTradeReport::getTenantId, tenantId)
|
||||
.ge(LbDailyUserTradeReport::getReportDate, start)
|
||||
.lt(LbDailyUserTradeReport::getReportDate, end)
|
||||
.eq(LbDailyUserTradeReport::getDataType, DATA_TYPE_REPORT_SUM);
|
||||
remove(sumDeleteWrapper);
|
||||
|
||||
boolean success = save(summary);
|
||||
Map<String, Object> checkInfo = buildCrossDayCheckInfo(reportDate, tenantId, start, end, yestodayBuyAmt);
|
||||
if (success && refreshSummaryFromDetail(summary, tenantId, start, end)) {
|
||||
checkInfo.put("summaryRefreshed", true);
|
||||
}
|
||||
|
||||
result.put("success", success);
|
||||
if (success) {
|
||||
@@ -223,11 +234,64 @@ public class LbDailyUserTradeReportServiceImpl extends ServiceImpl<LbDailyUserTr
|
||||
query.eq(LbDailyUserTradeReport::getTenantId, tenantId)
|
||||
.ge(LbDailyUserTradeReport::getReportDate, yesterdayStart)
|
||||
.lt(LbDailyUserTradeReport::getReportDate, yesterdayEnd)
|
||||
.eq(LbDailyUserTradeReport::getDataType, DATA_TYPE_REPORT_SUM);
|
||||
.eq(LbDailyUserTradeReport::getDataType, DATA_TYPE_REPORT_SUM)
|
||||
.orderByDesc(LbDailyUserTradeReport::getUpdatedAt)
|
||||
.orderByDesc(LbDailyUserTradeReport::getCreatedAt)
|
||||
.last("limit 1");
|
||||
List<LbDailyUserTradeReport> rows = list(query);
|
||||
return rows.isEmpty() ? null : rows.get(0);
|
||||
}
|
||||
|
||||
private boolean refreshSummaryFromDetail(
|
||||
LbDailyUserTradeReport summary,
|
||||
String tenantId,
|
||||
LocalDateTime start,
|
||||
LocalDateTime end) {
|
||||
TradeSummaryAmount latest = aggregateDetailAmounts(tenantId, start, end);
|
||||
boolean changed = isSummaryChanged(summary, latest);
|
||||
if (!changed) {
|
||||
return false;
|
||||
}
|
||||
summary.setYestodayBuyAmt(latest.yestodayBuyAmt);
|
||||
summary.setDailySellAmt(latest.dailySellAmt);
|
||||
summary.setDailyBuyAmt(latest.dailyBuyAmt);
|
||||
summary.setServiceAmt(latest.serviceAmt);
|
||||
summary.setDiffAmt(latest.diffAmt);
|
||||
summary.setDikouAmt(latest.dikouAmt);
|
||||
summary.setActualReceiptsPayments(latest.diffAmt.subtract(latest.serviceAmt));
|
||||
summary.setUpdatedAt(LocalDateTime.now());
|
||||
updateById(summary);
|
||||
return true;
|
||||
}
|
||||
|
||||
private TradeSummaryAmount aggregateDetailAmounts(String tenantId, LocalDateTime start, LocalDateTime end) {
|
||||
LambdaQueryWrapper<LbDailyUserTradeReport> detailQuery = new LambdaQueryWrapper<>();
|
||||
detailQuery.eq(LbDailyUserTradeReport::getTenantId, tenantId)
|
||||
.ge(LbDailyUserTradeReport::getReportDate, start)
|
||||
.lt(LbDailyUserTradeReport::getReportDate, end)
|
||||
.eq(LbDailyUserTradeReport::getDataType, DATA_TYPE_REPORT_DETAIL);
|
||||
|
||||
TradeSummaryAmount amount = new TradeSummaryAmount();
|
||||
for (LbDailyUserTradeReport row : list(detailQuery)) {
|
||||
amount.yestodayBuyAmt = amount.yestodayBuyAmt.add(defaultZero(row.getYestodayBuyAmt()));
|
||||
amount.dailySellAmt = amount.dailySellAmt.add(defaultZero(row.getDailySellAmt()));
|
||||
amount.dailyBuyAmt = amount.dailyBuyAmt.add(defaultZero(row.getDailyBuyAmt()));
|
||||
amount.serviceAmt = amount.serviceAmt.add(defaultZero(row.getServiceAmt()));
|
||||
amount.diffAmt = amount.diffAmt.add(defaultZero(row.getDiffAmt()));
|
||||
amount.dikouAmt = amount.dikouAmt.add(defaultZero(row.getDikouAmt()));
|
||||
}
|
||||
return amount;
|
||||
}
|
||||
|
||||
private boolean isSummaryChanged(LbDailyUserTradeReport summary, TradeSummaryAmount latest) {
|
||||
return defaultZero(summary.getYestodayBuyAmt()).compareTo(latest.yestodayBuyAmt) != 0
|
||||
|| defaultZero(summary.getDailySellAmt()).compareTo(latest.dailySellAmt) != 0
|
||||
|| defaultZero(summary.getDailyBuyAmt()).compareTo(latest.dailyBuyAmt) != 0
|
||||
|| defaultZero(summary.getServiceAmt()).compareTo(latest.serviceAmt) != 0
|
||||
|| defaultZero(summary.getDiffAmt()).compareTo(latest.diffAmt) != 0
|
||||
|| defaultZero(summary.getDikouAmt()).compareTo(latest.dikouAmt) != 0;
|
||||
}
|
||||
|
||||
private List<LbDailyUserTradeReport> queryDetailRows(String tenantId, LocalDateTime start, LocalDateTime end) {
|
||||
LambdaQueryWrapper<LbDailyUserTradeReport> query = new LambdaQueryWrapper<>();
|
||||
query.eq(LbDailyUserTradeReport::getTenantId, tenantId)
|
||||
@@ -401,6 +465,15 @@ public class LbDailyUserTradeReportServiceImpl extends ServiceImpl<LbDailyUserTr
|
||||
}
|
||||
}
|
||||
|
||||
private static final class TradeSummaryAmount {
|
||||
BigDecimal yestodayBuyAmt = BigDecimal.ZERO;
|
||||
BigDecimal dailySellAmt = BigDecimal.ZERO;
|
||||
BigDecimal dailyBuyAmt = BigDecimal.ZERO;
|
||||
BigDecimal serviceAmt = BigDecimal.ZERO;
|
||||
BigDecimal diffAmt = BigDecimal.ZERO;
|
||||
BigDecimal dikouAmt = BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
private static BigDecimal defaultZero(BigDecimal value) {
|
||||
return value == null ? BigDecimal.ZERO : value;
|
||||
}
|
||||
|
||||
@@ -100,14 +100,20 @@ public class LbDailyUserTradeServiceImpl extends ServiceImpl<LbDailyUserTradeMap
|
||||
LambdaQueryWrapper<LbDailyUserTrade> yesterdayWrapper = new LambdaQueryWrapper<>();
|
||||
yesterdayWrapper.eq(LbDailyUserTrade::getTenantId, normalizedTenantId)
|
||||
.eq(LbDailyUserTrade::getReportDate, yesterday);
|
||||
// .eq(LbDailyUserTrade::getUserId, trade.getUserId());
|
||||
if (StringUtils.isNotBlank(trade.getNickname())) {
|
||||
if (StringUtils.isNotBlank(trade.getUserId())) {
|
||||
// 以 userId 作为昨日数据关联主键,避免昵称重复/变更导致错配。
|
||||
yesterdayWrapper.eq(LbDailyUserTrade::getUserId, trade.getUserId().trim());
|
||||
} else if (StringUtils.isNotBlank(trade.getNickname())) {
|
||||
// 历史脏数据兜底:仅当 userId 缺失时才按昵称匹配。
|
||||
yesterdayWrapper.eq(LbDailyUserTrade::getNickname, trade.getNickname().trim());
|
||||
}
|
||||
yesterdayWrapper
|
||||
.orderByDesc(LbDailyUserTrade::getUpdatedAt)
|
||||
.last("limit 1");
|
||||
LbDailyUserTrade lastDateRecord = this.getOne(yesterdayWrapper, false);
|
||||
LbDailyUserTrade lastDateRecord = null;
|
||||
if (StringUtils.isNotBlank(trade.getUserId()) || StringUtils.isNotBlank(trade.getNickname())) {
|
||||
yesterdayWrapper
|
||||
.orderByDesc(LbDailyUserTrade::getUpdatedAt)
|
||||
.last("limit 1");
|
||||
lastDateRecord = this.getOne(yesterdayWrapper, false);
|
||||
}
|
||||
BigDecimal yestodayBuyAmt = lastDateRecord == null || lastDateRecord.getDailyBuyAmt() == null
|
||||
? BigDecimal.ZERO
|
||||
: lastDateRecord.getDailyBuyAmt();
|
||||
|
||||
Reference in New Issue
Block a user