diff --git a/src/main/java/com/rj/entity/CustomerManagement.java b/src/main/java/com/rj/entity/CustomerManagement.java index e4910d7..5edce25 100644 --- a/src/main/java/com/rj/entity/CustomerManagement.java +++ b/src/main/java/com/rj/entity/CustomerManagement.java @@ -37,6 +37,14 @@ public class CustomerManagement implements Serializable { @TableField("customer_name") private String customerName; + @Schema(description = "性别") + @TableField("gender") + private String gender; + + @Schema(description = "年龄") + @TableField("age") + private Integer age; + @Schema(description = "联系方式") @TableField("contact") private String contact; @@ -93,6 +101,18 @@ public class CustomerManagement implements Serializable { @TableField("contact_count") private Integer contactCount; + @Schema(description = "正面照片URL") + @TableField("front_photo_url") + private String frontPhotoUrl; + + @Schema(description = "侧面照片URL") + @TableField("side_photo_url") + private String sidePhotoUrl; + + @Schema(description = "生活照URL") + @TableField("life_photo_url") + private String lifePhotoUrl; + @Schema(description = "操作类型") @TableField("operation_type") private String operationType; diff --git a/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java b/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java index 227bee1..dc9613b 100644 --- a/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java @@ -92,7 +92,7 @@ public class LbDailyUserTradeReportServiceImpl extends ServiceImpl 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 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 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 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 queryDetailRows(String tenantId, LocalDateTime start, LocalDateTime end) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(LbDailyUserTradeReport::getTenantId, tenantId) @@ -401,6 +465,15 @@ public class LbDailyUserTradeReportServiceImpl extends ServiceImpl 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(); diff --git a/src/main/resources/mapper/CustomerManagementMapper.xml b/src/main/resources/mapper/CustomerManagementMapper.xml index 4043cde..8d56be4 100644 --- a/src/main/resources/mapper/CustomerManagementMapper.xml +++ b/src/main/resources/mapper/CustomerManagementMapper.xml @@ -6,6 +6,8 @@ + + @@ -18,13 +20,16 @@ + + + - id, customer_name, contact, dealership_id, dealership_name, sales_id, sales_name, recording_count, intended_model, info_card, remark, detailed_address, sales_phone, contact_count, create_time, update_time + id, customer_name, gender, age, contact, dealership_id, dealership_name, sales_id, sales_name, recording_count, intended_model, info_card, remark, detailed_address, sales_phone, contact_count, front_photo_url, side_photo_url, life_photo_url, create_time, update_time