feat(dashboard): 运营工作台头部计数聚合接口(商户/通道商户/用户)

新增 GET /admin/dashboard/trade/header-counts 与 /app-admin/dashboard/trade/header-counts
聚合商户/通道商户/运营用户三类全量计数, 用户口径过滤 clientCode=admin 且排除内置超管
app-admin 移动端与 PC 运营端工作台头部统计由 mock/size=1 过渡方案改为调用真实聚合接口
This commit is contained in:
DaxPay Dev
2026-07-26 21:42:51 +08:00
parent 63554f5a56
commit a5723502e2
5 changed files with 141 additions and 0 deletions

View File

@@ -2,6 +2,7 @@ package cn.daxpay.open.payment.admin.controller.dashboard;
import cn.daxpay.open.platform.core.rest.Res;
import cn.daxpay.open.platform.core.rest.result.Result;
import cn.daxpay.open.payment.admin.result.dashboard.AdminDashboardHeaderCountResult;
import cn.daxpay.open.payment.admin.service.dashboard.AdminDashboardTradeService;
import cn.daxpay.open.payment.trade.report.result.AmountRangeItemResult;
import cn.daxpay.open.payment.trade.report.result.HourlyDistItemResult;
@@ -43,6 +44,15 @@ public class AdminDashboardTradeController {
private final AdminDashboardTradeService adminDashboardTradeService;
// ===== 头部计数 =====
/// 工作台头部计数: 商户 / 通道商户 / 运营用户总量
@Operation(summary = "工作台头部计数(商户/通道商户/用户)")
@GetMapping("/header-counts")
public Result<AdminDashboardHeaderCountResult> headerCounts() {
return Res.ok(adminDashboardTradeService.headerCounts());
}
// ===== 概览 =====
/// 交易概览: 支持今日/昨日快捷模式 + 自定义区间模式(含上期对比用于环比)

View File

@@ -0,0 +1,24 @@
package cn.daxpay.open.payment.admin.result.dashboard;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
/// # 运营工作台头部计数
@Data
@Accessors(chain = true)
@Schema(title = "运营工作台头部计数")
public class AdminDashboardHeaderCountResult {
/// 商户总数
@Schema(description = "商户总数")
private Long merchantCount;
/// 通道商户总数
@Schema(description = "通道商户总数")
private Long channelMerchantCount;
/// 运营端用户数(不含超管)
@Schema(description = "运营端用户数")
private Long userCount;
}

View File

@@ -1,6 +1,9 @@
package cn.daxpay.open.payment.admin.service.dashboard;
import cn.daxpay.open.payment.admin.dao.dashboard.AdminTradeReportMapper;
import cn.daxpay.open.payment.admin.result.dashboard.AdminDashboardHeaderCountResult;
import cn.daxpay.open.payment.merchant.dao.channel.ChannelMerchantManager;
import cn.daxpay.open.payment.merchant.dao.info.MerchantInfoManager;
import cn.daxpay.open.payment.trade.report.result.AmountRangeItemResult;
import cn.daxpay.open.payment.trade.report.result.HourlyDistItemResult;
import cn.daxpay.open.payment.trade.report.result.MerchantRankItemResult;
@@ -10,6 +13,9 @@ import cn.daxpay.open.payment.trade.report.result.RefundTrendItemResult;
import cn.daxpay.open.payment.trade.report.result.TradeOverviewResult;
import cn.daxpay.open.payment.trade.report.result.TradeTrendItemResult;
import cn.daxpay.open.payment.trade.report.support.TradeReportSupport;
import cn.daxpay.open.platform.core.enums.client.ClientEnum;
import cn.daxpay.open.platform.iam.dao.user.UserInfoManager;
import cn.daxpay.open.platform.iam.entity.user.UserInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -26,6 +32,26 @@ public class AdminDashboardTradeService {
private final AdminTradeReportMapper adminTradeReportMapper;
private final TradeReportSupport tradeReportSupport;
private final MerchantInfoManager merchantInfoManager;
private final ChannelMerchantManager channelMerchantManager;
private final UserInfoManager userInfoManager;
// ===== 头部计数 =====
/// 工作台头部: 商户 / 通道商户 / 运营用户 全量计数
public AdminDashboardHeaderCountResult headerCounts() {
long merchantCount = merchantInfoManager.lambdaQuery().count();
long channelMerchantCount = channelMerchantManager.lambdaQuery().count();
// 运营端用户: 仅 admin 终端, 排除内置超管(与 UserAdminService 列表口径一致)
long userCount = userInfoManager.lambdaQuery()
.eq(UserInfo::getClientCode, ClientEnum.ADMIN.getCode())
.eq(UserInfo::isAdministrator, false)
.count();
return new AdminDashboardHeaderCountResult()
.setMerchantCount(merchantCount)
.setChannelMerchantCount(channelMerchantCount)
.setUserCount(userCount);
}
// ===== 概览 =====

View File

@@ -0,0 +1,49 @@
package cn.daxpay.open.payment.app.admin.controller.dashboard;
import cn.daxpay.open.payment.app.admin.service.dashboard.AppAdminDashboardTradeService;
import cn.daxpay.open.payment.admin.result.dashboard.AdminDashboardHeaderCountResult;
import cn.daxpay.open.payment.trade.report.result.TradeOverviewResult;
import cn.daxpay.open.platform.core.rest.Res;
import cn.daxpay.open.platform.core.rest.result.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/// # 工作台交易统计(运营移动端)
///
/// 面向运营移动端工作台的交易概览统计。
/// 不挂菜单权限码: 工作台为登录即达的页面, 任何已认证运营用户均可查看。
@Tag(name = "工作台交易统计(运营移动端)")
@Validated
@RestController
@RequestMapping("/app-admin/dashboard/trade")
@RequiredArgsConstructor
public class AppAdminDashboardTradeController {
private final AppAdminDashboardTradeService dashboardTradeService;
/// 工作台头部计数: 商户 / 通道商户 / 运营用户总量
@Operation(summary = "工作台头部计数(商户/通道商户/用户)")
@GetMapping("/header-counts")
public Result<AdminDashboardHeaderCountResult> headerCounts() {
return Res.ok(dashboardTradeService.headerCounts());
}
/// 交易概览: 支持 today/yesterday 快捷模式 + 自定义区间模式(含环比)
@Operation(summary = "交易概览(今日/昨日或自定义区间)")
@GetMapping("/overview")
public Result<TradeOverviewResult> overview(
@RequestParam(required = false) String date,
@RequestParam(required = false) String start,
@RequestParam(required = false) String end) {
if (start != null && end != null) {
return Res.ok(dashboardTradeService.overview(start, end));
}
return Res.ok(dashboardTradeService.overview(date != null ? date : "today"));
}
}

View File

@@ -0,0 +1,32 @@
package cn.daxpay.open.payment.app.admin.service.dashboard;
import cn.daxpay.open.payment.admin.result.dashboard.AdminDashboardHeaderCountResult;
import cn.daxpay.open.payment.admin.service.dashboard.AdminDashboardTradeService;
import cn.daxpay.open.payment.trade.report.result.TradeOverviewResult;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/// # 运营移动端-工作台交易统计服务
///
/// 转发至 [AdminDashboardTradeService]
@Service
@RequiredArgsConstructor
public class AppAdminDashboardTradeService {
private final AdminDashboardTradeService adminDashboardTradeService;
/// 工作台头部计数: 商户 / 通道商户 / 运营用户
public AdminDashboardHeaderCountResult headerCounts() {
return adminDashboardTradeService.headerCounts();
}
/// 交易概览快捷模式today / yesterday
public TradeOverviewResult overview(String date) {
return adminDashboardTradeService.overview(date);
}
/// 交易概览区间模式start + endyyyy-MM-dd
public TradeOverviewResult overview(String start, String end) {
return adminDashboardTradeService.overview(start, end);
}
}