From 8cfa29b30bc1fd0b87a80d6a8039754ed4d184f0 Mon Sep 17 00:00:00 2001 From: cst61 Date: Sat, 25 Apr 2026 20:42:48 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=97=E5=8D=95=E6=97=A5=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LbDailyUserTradeReportController.java | 110 +++++++++++++++++- .../com/rj/entity/LbDailyUserTradeReport.java | 4 +- .../ILbDailyUserTradeReportService.java | 4 + .../LbDailyUserTradeReportServiceImpl.java | 69 +++++++++++ .../impl/LbDailyUserTradeServiceImpl.java | 46 ++++++-- .../mapper/LbDailyUserTradeReportMapper.xml | 4 +- 6 files changed, 222 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java b/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java index 9420008..c039389 100644 --- a/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java +++ b/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java @@ -12,6 +12,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; @@ -39,8 +40,8 @@ public class LbDailyUserTradeReportController { if (tradeReport.getId() == null || tradeReport.getId().trim().isEmpty()) { tradeReport.setId(UUID.randomUUID().toString()); } - if (tradeReport.getYestodaySellAmt() == null) { - tradeReport.setYestodaySellAmt(BigDecimal.ZERO); + if (tradeReport.getYestodayBuyAmt() == null) { + tradeReport.setYestodayBuyAmt(BigDecimal.ZERO); } if (tradeReport.getDailySellAmt() == null) { tradeReport.setDailySellAmt(BigDecimal.ZERO); @@ -241,4 +242,109 @@ public class LbDailyUserTradeReportController { return ResponseEntity.internalServerError().body(result); } } + + @DeleteMapping("/delete/by-date-and-tenant") + @Operation(summary = "按日期和租户删除报表", description = "根据报表日期和租户ID删除当天用户交易报表记录") + public ResponseEntity> deleteByDateAndTenant( + @Parameter(description = "报表日期,格式:yyyy-MM-dd", required = true) + @RequestParam String reportDate, + @Parameter(description = "租户ID", required = true) + @RequestParam String tenantId) { + Map result = new HashMap<>(); + try { + if (tenantId == null || tenantId.trim().isEmpty()) { + result.put("success", false); + result.put("message", "tenantId不能为空"); + return ResponseEntity.badRequest().body(result); + } + if (reportDate == null || reportDate.trim().isEmpty()) { + result.put("success", false); + result.put("message", "reportDate不能为空"); + return ResponseEntity.badRequest().body(result); + } + + LocalDate parsedReportDate; + try { + parsedReportDate = LocalDate.parse(reportDate.trim()); + } catch (Exception e) { + result.put("success", false); + result.put("message", "报表日期格式错误,请使用 yyyy-MM-dd"); + return ResponseEntity.badRequest().body(result); + } + + LocalDateTime start = parsedReportDate.atStartOfDay(); + LocalDateTime end = parsedReportDate.plusDays(1).atStartOfDay(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(LbDailyUserTradeReport::getTenantId, tenantId.trim()) + .ge(LbDailyUserTradeReport::getReportDate, start) + .lt(LbDailyUserTradeReport::getReportDate, end); + + long deleteCount = lbDailyUserTradeReportService.count(queryWrapper); + if (deleteCount == 0) { + result.put("success", true); + result.put("message", "未匹配到可删除记录"); + result.put("deleteCount", 0); + return ResponseEntity.ok(result); + } + + boolean success = lbDailyUserTradeReportService.remove(queryWrapper); + if (success) { + result.put("success", true); + result.put("message", "删除成功"); + result.put("deleteCount", deleteCount); + return ResponseEntity.ok(result); + } + result.put("success", false); + result.put("message", "删除失败"); + return ResponseEntity.badRequest().body(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + @PostMapping("/calculate-report-sum/by-date-and-tenant") + @Operation(summary = "按日期和租户汇总报表", description = "根据报表日期和租户ID汇总报表字段并新增一条 report_sum 记录") + public ResponseEntity> calculateReportSumByDateAndTenant( + @Parameter(description = "报表日期,格式:yyyy-MM-dd", required = true) + @RequestParam String reportDate, + @Parameter(description = "租户ID", required = true) + @RequestParam String tenantId) { + Map result = new HashMap<>(); + try { + if (tenantId == null || tenantId.trim().isEmpty()) { + result.put("success", false); + result.put("message", "tenantId不能为空"); + return ResponseEntity.badRequest().body(result); + } + if (reportDate == null || reportDate.trim().isEmpty()) { + result.put("success", false); + result.put("message", "reportDate不能为空"); + return ResponseEntity.badRequest().body(result); + } + + LocalDate parsedReportDate; + try { + parsedReportDate = LocalDate.parse(reportDate.trim()); + } catch (Exception e) { + result.put("success", false); + result.put("message", "报表日期格式错误,请使用 yyyy-MM-dd"); + return ResponseEntity.badRequest().body(result); + } + + Map serviceResult = lbDailyUserTradeReportService + .calculateReportSumByDateAndTenant(parsedReportDate, tenantId.trim()); + Boolean success = (Boolean) serviceResult.get("success"); + if (Boolean.TRUE.equals(success)) { + return ResponseEntity.ok(serviceResult); + } + return ResponseEntity.badRequest().body(serviceResult); + } catch (Exception e) { + result.put("success", false); + result.put("message", "汇总异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } } diff --git a/src/main/java/com/rj/entity/LbDailyUserTradeReport.java b/src/main/java/com/rj/entity/LbDailyUserTradeReport.java index 9e7942f..e5db919 100644 --- a/src/main/java/com/rj/entity/LbDailyUserTradeReport.java +++ b/src/main/java/com/rj/entity/LbDailyUserTradeReport.java @@ -41,8 +41,8 @@ public class LbDailyUserTradeReport implements Serializable { private String nickname; @Schema(description = "昨日买入金额") - @TableField("yestoday_sell_amt") - private BigDecimal yestodaySellAmt; + @TableField("yestoday_buy_amt") + private BigDecimal yestodayBuyAmt; @Schema(description = "当日卖出金额") @TableField("daily_sell_amt") diff --git a/src/main/java/com/rj/service/ILbDailyUserTradeReportService.java b/src/main/java/com/rj/service/ILbDailyUserTradeReportService.java index 074fc4f..386dc22 100644 --- a/src/main/java/com/rj/service/ILbDailyUserTradeReportService.java +++ b/src/main/java/com/rj/service/ILbDailyUserTradeReportService.java @@ -3,10 +3,14 @@ package com.rj.service; import com.baomidou.mybatisplus.extension.service.IService; import com.rj.entity.LbDailyUserTradeReport; +import java.time.LocalDate; +import java.util.Map; + /** *

* 当天用户交易报表 服务类 *

*/ public interface ILbDailyUserTradeReportService extends IService { + Map calculateReportSumByDateAndTenant(LocalDate reportDate, String tenantId); } diff --git a/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java b/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java index e5018a0..ff446e5 100644 --- a/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java @@ -1,11 +1,19 @@ package com.rj.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.rj.entity.LbDailyUserTradeReport; import com.rj.mapper.LbDailyUserTradeReportMapper; import com.rj.service.ILbDailyUserTradeReportService; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + /** *

* 当天用户交易报表 服务实现类 @@ -14,4 +22,65 @@ import org.springframework.stereotype.Service; @Service public class LbDailyUserTradeReportServiceImpl extends ServiceImpl implements ILbDailyUserTradeReportService { + + private static final String DATA_TYPE_REPORT_SUM = "report_sum"; + + @Override + public Map calculateReportSumByDateAndTenant(LocalDate reportDate, String tenantId) { + Map result = new HashMap<>(); + LocalDateTime start = reportDate.atStartOfDay(); + LocalDateTime end = reportDate.plusDays(1).atStartOfDay(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(LbDailyUserTradeReport::getTenantId, tenantId) + .ge(LbDailyUserTradeReport::getReportDate, start) + .lt(LbDailyUserTradeReport::getReportDate, end) + .ne(LbDailyUserTradeReport::getDataType, DATA_TYPE_REPORT_SUM); + + BigDecimal yestodayBuyAmt = BigDecimal.ZERO; + BigDecimal dailySellAmt = BigDecimal.ZERO; + BigDecimal dailyBuyAmt = BigDecimal.ZERO; + BigDecimal serviceAmt = BigDecimal.ZERO; + BigDecimal diffAmt = BigDecimal.ZERO; + BigDecimal dikouAmt = BigDecimal.ZERO; + + for (LbDailyUserTradeReport item : list(queryWrapper)) { + yestodayBuyAmt = yestodayBuyAmt.add(defaultZero(item.getYestodayBuyAmt())); + dailySellAmt = dailySellAmt.add(defaultZero(item.getDailySellAmt())); + dailyBuyAmt = dailyBuyAmt.add(defaultZero(item.getDailyBuyAmt())); + serviceAmt = serviceAmt.add(defaultZero(item.getServiceAmt())); + diffAmt = diffAmt.add(defaultZero(item.getDiffAmt())); + dikouAmt = dikouAmt.add(defaultZero(item.getDikouAmt())); + } + + LbDailyUserTradeReport summary = new LbDailyUserTradeReport(); + summary.setId(UUID.randomUUID().toString()); + + summary.setTenantId(tenantId); + summary.setDataType(DATA_TYPE_REPORT_SUM); + summary.setReportDate(start); + summary.setYestodayBuyAmt(yestodayBuyAmt); + summary.setDailySellAmt(dailySellAmt); + summary.setDailyBuyAmt(dailyBuyAmt); + summary.setServiceAmt(serviceAmt); + summary.setDiffAmt(diffAmt); + summary.setDikouAmt(dikouAmt); + summary.setDescContent("系统汇总记录"); + summary.setCreatedAt(LocalDateTime.now()); + summary.setUpdatedAt(LocalDateTime.now()); + + boolean success = save(summary); + result.put("success", success); + if (success) { + result.put("message", "汇总成功"); + result.put("data", summary); + return result; + } + result.put("message", "汇总失败"); + return result; + } + + private BigDecimal defaultZero(BigDecimal value) { + return value == null ? BigDecimal.ZERO : value; + } } diff --git a/src/main/java/com/rj/service/impl/LbDailyUserTradeServiceImpl.java b/src/main/java/com/rj/service/impl/LbDailyUserTradeServiceImpl.java index 270c032..379cb62 100644 --- a/src/main/java/com/rj/service/impl/LbDailyUserTradeServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbDailyUserTradeServiceImpl.java @@ -99,8 +99,8 @@ public class LbDailyUserTradeServiceImpl extends ServiceImpl yesterdayWrapper = new LambdaQueryWrapper<>(); yesterdayWrapper.eq(LbDailyUserTrade::getTenantId, normalizedTenantId) - .eq(LbDailyUserTrade::getReportDate, yesterday) - .eq(LbDailyUserTrade::getUserId, trade.getUserId()); + .eq(LbDailyUserTrade::getReportDate, yesterday); +// .eq(LbDailyUserTrade::getUserId, trade.getUserId()); if (StringUtils.isNotBlank(trade.getNickname())) { yesterdayWrapper.eq(LbDailyUserTrade::getNickname, trade.getNickname().trim()); } @@ -108,7 +108,7 @@ public class LbDailyUserTradeServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(LbDailyUserTrade::getTenantId, tenantId) + .eq(LbDailyUserTrade::getNickname, nickname.trim()) + .orderByDesc(LbDailyUserTrade::getUpdatedAt) + .last("limit 1"); + return this.getOne(wrapper, false); + } + private boolean isEmptyRow(Row row, DataFormatter formatter) { for (Cell cell : row) { if (!formatter.formatCellValue(cell).trim().isEmpty()) { diff --git a/src/main/resources/mapper/LbDailyUserTradeReportMapper.xml b/src/main/resources/mapper/LbDailyUserTradeReportMapper.xml index 16f610f..85c2bbf 100644 --- a/src/main/resources/mapper/LbDailyUserTradeReportMapper.xml +++ b/src/main/resources/mapper/LbDailyUserTradeReportMapper.xml @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ - id, tenant_id, user_id, nickname, yestoday_sell_amt, daily_sell_amt, daily_buy_amt, service_amt, diff_amt, dikou_amt, + id, tenant_id, user_id, nickname, yestoday_buy_amt, daily_sell_amt, daily_buy_amt, service_amt, diff_amt, dikou_amt, desc_content, data_type, created_at, updated_at, report_date