diff --git a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/dashboard/AdminDashboardTradeController.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/dashboard/AdminDashboardTradeController.java index 1510cf3d7..c6e4c431a 100644 --- a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/dashboard/AdminDashboardTradeController.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/dashboard/AdminDashboardTradeController.java @@ -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 headerCounts() { + return Res.ok(adminDashboardTradeService.headerCounts()); + } + // ===== 概览 ===== /// 交易概览: 支持今日/昨日快捷模式 + 自定义区间模式(含上期对比用于环比) diff --git a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/result/dashboard/AdminDashboardHeaderCountResult.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/result/dashboard/AdminDashboardHeaderCountResult.java new file mode 100644 index 000000000..1047bd8c3 --- /dev/null +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/result/dashboard/AdminDashboardHeaderCountResult.java @@ -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; +} diff --git a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/dashboard/AdminDashboardTradeService.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/dashboard/AdminDashboardTradeService.java index da0f40ce5..4a8f77d3d 100644 --- a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/dashboard/AdminDashboardTradeService.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/dashboard/AdminDashboardTradeService.java @@ -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); + } // ===== 概览 ===== diff --git a/daxpay-payment/daxpay-payment-app-admin/src/main/java/cn/daxpay/open/payment/app/admin/controller/dashboard/AppAdminDashboardTradeController.java b/daxpay-payment/daxpay-payment-app-admin/src/main/java/cn/daxpay/open/payment/app/admin/controller/dashboard/AppAdminDashboardTradeController.java new file mode 100644 index 000000000..6f3155fcd --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-admin/src/main/java/cn/daxpay/open/payment/app/admin/controller/dashboard/AppAdminDashboardTradeController.java @@ -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 headerCounts() { + return Res.ok(dashboardTradeService.headerCounts()); + } + + /// 交易概览: 支持 today/yesterday 快捷模式 + 自定义区间模式(含环比) + @Operation(summary = "交易概览(今日/昨日或自定义区间)") + @GetMapping("/overview") + public Result 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")); + } +} diff --git a/daxpay-payment/daxpay-payment-app-admin/src/main/java/cn/daxpay/open/payment/app/admin/service/dashboard/AppAdminDashboardTradeService.java b/daxpay-payment/daxpay-payment-app-admin/src/main/java/cn/daxpay/open/payment/app/admin/service/dashboard/AppAdminDashboardTradeService.java new file mode 100644 index 000000000..932a75734 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-admin/src/main/java/cn/daxpay/open/payment/app/admin/service/dashboard/AppAdminDashboardTradeService.java @@ -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 + end,yyyy-MM-dd) + public TradeOverviewResult overview(String start, String end) { + return adminDashboardTradeService.overview(start, end); + } +}