From cfec435e879d45edd6798c73630a91205d06108f Mon Sep 17 00:00:00 2001 From: cst61 Date: Thu, 30 Apr 2026 09:01:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=88=E4=BA=BA=E6=9C=BA=E5=88=B6=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LbDailyUserTradeReportController.java | 2 +- .../ILbDailyUserTradeReportService.java | 1 + .../LbDailyUserTradeReportServiceImpl.java | 97 ++++++++++--------- 3 files changed, 54 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java b/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java index 3e1ec4a..5f80843 100644 --- a/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java +++ b/src/main/java/com/rj/controller/LbDailyUserTradeReportController.java @@ -412,7 +412,7 @@ public class LbDailyUserTradeReportController { } @GetMapping("/stats/user-trade-with-team/by-date-range-and-tenant") - @Operation(summary = "按日期范围统计本人及递归下级交易金额", description = "根据开始日期、结束日期、租户ID,基于 lb_department_user 上下级(parent_id 为父用户 user_id)与 lb_daily_user_trade_report,对 yestoday_buy_amt、daily_sell_amt、daily_buy_amt、diff_amt 四类分别汇总 own*/team*/total*(team 为全部下级递归,不含本人);不含 data_type=report_sum") + @Operation(summary = "按日期范围统计本人及递归下级交易金额", description = "先查 lb_daily_user_trade_report(日期+租户,排除 report_sum)圈定 user_id;再查 lb_department_user(同租户)用 parent_id(父 user_id)建上下级;对 yestoday_buy_amt、daily_sell_amt、daily_buy_amt、diff_amt 分别汇总 own*/team*/total*(team 为递归下级、不含本人)。仅返回报表范围内有数据的用户。") public ResponseEntity> statsUserTradeWithTeamByDateRangeAndTenant( @Parameter(description = "开始日期,格式:yyyy-MM-dd", required = true) @RequestParam String startDate, diff --git a/src/main/java/com/rj/service/ILbDailyUserTradeReportService.java b/src/main/java/com/rj/service/ILbDailyUserTradeReportService.java index e2876ab..f80a840 100644 --- a/src/main/java/com/rj/service/ILbDailyUserTradeReportService.java +++ b/src/main/java/com/rj/service/ILbDailyUserTradeReportService.java @@ -16,6 +16,7 @@ public interface ILbDailyUserTradeReportService extends IService listUserTradeAmountWithTeamByDateRangeAndTenant( LocalDate startDate, LocalDate endDate, 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 6542d50..82bf2dd 100644 --- a/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbDailyUserTradeReportServiceImpl.java @@ -33,6 +33,7 @@ public class LbDailyUserTradeReportServiceImpl extends ServiceImpl deptUsers = lbDepartmentUserService.list( - new LambdaQueryWrapper() - .eq(LbDepartmentUser::getTenantId, tenantIdTrim)); - if (deptUsers == null || deptUsers.isEmpty()) { - result.put("success", true); - result.put("message", "查询成功"); - result.put("data", List.of()); - result.put("total", 0); - result.put("startDate", startDate); - result.put("endDate", endDate); - result.put("tenantId", tenantIdTrim); - return result; - } + // 1) 先查 lb_daily_user_trade_report:圈定日期内有数据的用户,并汇总本人四类金额 + LambdaQueryWrapper tradeQw = new LambdaQueryWrapper<>(); + tradeQw.ge(LbDailyUserTradeReport::getReportDate, rangeStart) + .le(LbDailyUserTradeReport::getReportDate, rangeEnd) + .eq(LbDailyUserTradeReport::getDataType, DATA_TYPE_REPORT_DETAIL ); Map userIdToName = new HashMap<>(); - Set tenantUserIds = new HashSet<>(); - Map> childrenByParentUserId = new HashMap<>(); - for (LbDepartmentUser row : deptUsers) { - if (row.getUserId() == null || row.getUserId().trim().isEmpty()) { - continue; - } - String uid = row.getUserId().trim(); - tenantUserIds.add(uid); - if (row.getName() != null && !row.getName().trim().isEmpty()) { - userIdToName.putIfAbsent(uid, row.getName().trim()); - } - String parentUserId = row.getParentId() == null ? null : row.getParentId().trim(); - if (parentUserId != null && !parentUserId.isEmpty()) { - List ch = childrenByParentUserId.computeIfAbsent(parentUserId, k -> new ArrayList<>()); - if (!ch.contains(uid)) { - ch.add(uid); - } - } - } - for (List list : childrenByParentUserId.values()) { - list.sort(String::compareTo); - } - - LambdaQueryWrapper tradeQw = new LambdaQueryWrapper<>(); - tradeQw.eq(LbDailyUserTradeReport::getTenantId, tenantIdTrim) - .ge(LbDailyUserTradeReport::getReportDate, rangeStart) - .le(LbDailyUserTradeReport::getReportDate, rangeEnd) - .ne(LbDailyUserTradeReport::getDataType, DATA_TYPE_REPORT_SUM); - Map ownAmtByUserId = new HashMap<>(); - for (LbDailyUserTradeReport r : list(tradeQw)) { + List list1 = list(tradeQw); + + for (LbDailyUserTradeReport r : list1) { if (r.getUserId() == null || r.getUserId().trim().isEmpty()) { continue; } @@ -179,13 +145,54 @@ public class LbDailyUserTradeReportServiceImpl extends ServiceImpl scopeUserIds = new HashSet<>(ownAmtByUserId.keySet()); + + // 2) 再查 lb_department_user:同一租户下的上下级(parent_id 为父用户 user_id),用于递归下级汇总 + Map> childrenByParentUserId = new HashMap<>(); + List deptUsers = lbDepartmentUserService.list( + new LambdaQueryWrapper() + .eq(LbDepartmentUser::getTenantId, tenantIdTrim)); + if (deptUsers != null) { + for (LbDepartmentUser row : deptUsers) { + if (row.getUserId() == null || row.getUserId().trim().isEmpty()) { + continue; + } + String uid = row.getUserId().trim(); + if (row.getName() != null && !row.getName().trim().isEmpty()) { + userIdToName.putIfAbsent(uid, row.getName().trim()); + } + String parentUserId = row.getParentId() == null ? null : row.getParentId().trim(); + if (parentUserId != null && !parentUserId.isEmpty()) { + List ch = childrenByParentUserId.computeIfAbsent(parentUserId, k -> new ArrayList<>()); + if (!ch.contains(uid)) { + ch.add(uid); + } + } + } + for (List list : childrenByParentUserId.values()) { + list.sort(String::compareTo); + } + } + + // 3) 仅对报表圈定的用户计算递归下级 team(无部门数据时 team 全为 0) Map teamAmtMemo = new HashMap<>(); - for (String userId : tenantUserIds) { + for (String userId : scopeUserIds) { teamAmtRecursive(userId, childrenByParentUserId, ownAmtByUserId, teamAmtMemo, new HashSet<>()); } List> rows = new ArrayList<>(); - for (String userId : tenantUserIds) { + for (String userId : scopeUserIds) { TradeAmtBundle own = ownAmt(userId, ownAmtByUserId); TradeAmtBundle team = teamAmt(userId, teamAmtMemo); TradeAmtBundle total = own.addCopy(team);