diff --git a/daxpay-payment/daxpay-payment-app-merchant/pom.xml b/daxpay-payment/daxpay-payment-app-merchant/pom.xml new file mode 100644 index 000000000..199b5ae00 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + cn.daxpay.open + daxpay-payment + 4.0.0-beta1 + ../pom.xml + + + daxpay-payment-app-merchant + jar + 商户移动端(APP/小程序)支付接口;逻辑转发至 payment-merchant / payment-admin / core Service + + + + + org.projectlombok + lombok + provided + + + + + cn.daxpay.open + daxpay-payment-merchant + ${project.version} + + + + + cn.daxpay.open + daxpay-payment-admin + ${project.version} + + + + diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/DaxpayAppMerchantApp.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/DaxpayAppMerchantApp.java new file mode 100644 index 000000000..6fe35fb94 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/DaxpayAppMerchantApp.java @@ -0,0 +1,12 @@ +package cn.daxpay.open.payment.app.merchant; + +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.ComponentScan; + +/// # 商户移动端(APP/小程序)装配入口 +/// +/// 本模块依赖 `daxpay-payment-merchant` 和 `daxpay-payment-admin`,通过 Service 转发复用商户端 / 运营端业务逻辑。 +@AutoConfiguration +@ComponentScan +public class DaxpayAppMerchantApp { +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/channel/AppMerchantChannelMerchantController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/channel/AppMerchantChannelMerchantController.java new file mode 100644 index 000000000..ba7f2992a --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/channel/AppMerchantChannelMerchantController.java @@ -0,0 +1,43 @@ +package cn.daxpay.open.payment.app.merchant.controller.channel; + +import cn.daxpay.open.payment.app.merchant.service.channel.AppMerchantChannelMerchantService; +import cn.daxpay.open.payment.merchant.param.channel.ChannelMerchantQuery; +import cn.daxpay.open.payment.merchant.result.channel.ChannelMerchantResult; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +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 jakarta.validation.constraints.NotNull; +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.RestController; + +/// # 通道商户管理(商户移动端) +/// +/// 面向商户移动端的通道商户查询。业务编排委托 [AppMerchantChannelMerchantService]; +/// 商户号强制取自 PaymentContext,防越权。 +@Validated +@Tag(name = "通道商户管理(商户移动端)") +@RestController +@RequestMapping("/app-merchant/channel-merchant") +@RequiredArgsConstructor +public class AppMerchantChannelMerchantController { + + private final AppMerchantChannelMerchantService channelMerchantService; + + @Operation(summary = "分页查询") + @GetMapping("/page") + public Result> page(PageParam pageParam, ChannelMerchantQuery query) { + return Res.ok(channelMerchantService.page(pageParam, query)); + } + + @Operation(summary = "查询详情") + @GetMapping("/get") + public Result findById(@NotNull(message = "{validation.field.id.notNull}") Long id) { + return Res.ok(channelMerchantService.findById(id)); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/config/AppMerchantAppNotifyConfigController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/config/AppMerchantAppNotifyConfigController.java new file mode 100644 index 000000000..a83225a85 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/config/AppMerchantAppNotifyConfigController.java @@ -0,0 +1,49 @@ +package cn.daxpay.open.payment.app.merchant.controller.config; + +import cn.daxpay.open.payment.app.merchant.service.config.AppMerchantAppNotifyConfigService; +import cn.daxpay.open.payment.merchant.param.config.MchAppNotifyConfigParam; +import cn.daxpay.open.payment.merchant.result.config.MchAppNotifyConfigResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +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 jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/// # 商户应用事件通知配置(商户移动端) +/// +/// 面向商户移动端的应用通知配置管理。业务编排委托 [AppMerchantAppNotifyConfigService]。 +@PermCode(menuCode = PermCodes.Merchant.NotifyConfig.MENU) +@Validated +@Tag(name = "商户应用事件通知配置(商户移动端)") +@RestController +@RequestMapping("/app-merchant/merchant/app-notify-config") +@RequiredArgsConstructor +public class AppMerchantAppNotifyConfigController { + + private final AppMerchantAppNotifyConfigService notifyConfigService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "根据应用ID查询通知配置") + @GetMapping("/get-by-app-id") + public Result findByAppId( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId) { + return Res.ok(notifyConfigService.findByAppId(appId)); + } + + @PermCode(code = PermCodes.Action.MANAGE) + @Operation(summary = "保存或更新通知配置") + @PostMapping("/save-or-update") + public Result saveOrUpdate(@RequestBody @Validated MchAppNotifyConfigParam param) { + notifyConfigService.saveOrUpdate(param); + return Res.ok(); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/config/AppMerchantCredentialController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/config/AppMerchantCredentialController.java new file mode 100644 index 000000000..2eecd2fbf --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/config/AppMerchantCredentialController.java @@ -0,0 +1,44 @@ +package cn.daxpay.open.payment.app.merchant.controller.config; + +import cn.daxpay.open.payment.app.merchant.service.config.AppMerchantCredentialService; +import cn.daxpay.open.payment.merchant.param.config.MerchantCredentialParam; +import cn.daxpay.open.payment.merchant.result.config.MerchantCredentialResult; +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 jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/// # 商户API对接配置(商户移动端) +/// +/// 面向商户移动端的 API 凭证管理。业务编排委托 [AppMerchantCredentialService]。 +@Validated +@Tag(name = "商户API对接配置(商户移动端)") +@RestController +@RequestMapping("/app-merchant/merchant/credential") +@RequiredArgsConstructor +public class AppMerchantCredentialController { + + private final AppMerchantCredentialService credentialService; + + @Operation(summary = "根据商户号查询") + @GetMapping("/get-by-mch-no") + public Result findByMchNo( + @NotBlank(message = "{validation.field.mchNo.notBlank}") String mchNo) { + return Res.ok(credentialService.findByMchNo(mchNo)); + } + + @Operation(summary = "更新商户API配置") + @PostMapping("/update") + public Result update(@RequestBody @Validated MerchantCredentialParam param) { + credentialService.update(param); + return Res.ok(); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/dashboard/AppMerchantDashboardTradeController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/dashboard/AppMerchantDashboardTradeController.java new file mode 100644 index 000000000..d2db3bcc2 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/dashboard/AppMerchantDashboardTradeController.java @@ -0,0 +1,144 @@ +package cn.daxpay.open.payment.app.merchant.controller.dashboard; + +import cn.daxpay.open.payment.app.merchant.service.dashboard.AppMerchantDashboardTradeService; +import cn.daxpay.open.payment.merchant.result.dashboard.MchDashboardHeaderCountResult; +import cn.daxpay.open.payment.trade.report.result.AmountRangeItemResult; +import cn.daxpay.open.payment.trade.report.result.DimRankItemResult; +import cn.daxpay.open.payment.trade.report.result.HourlyDistItemResult; +import cn.daxpay.open.payment.trade.report.result.ProviderDistItemResult; +import cn.daxpay.open.payment.trade.report.result.ProviderSuccessItemResult; +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.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; + +import java.util.List; + +/// # 工作台交易统计(商户移动端) +/// +/// 面向商户移动端工作台的交易概览统计。 +/// 不挂菜单权限码: 工作台为登录即达的页面, 任何已认证商户用户均可查看。 +@Tag(name = "工作台交易统计(商户移动端)") +@Validated +@RestController +@RequestMapping("/app-merchant/dashboard/trade") +@RequiredArgsConstructor +public class AppMerchantDashboardTradeController { + + private final AppMerchantDashboardTradeService 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")); + } + + @Operation(summary = "交易趋势") + @GetMapping("/trend") + public Result> trend( + @RequestParam(defaultValue = "7") int days, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { + if (start != null && end != null) { + return Res.ok(dashboardTradeService.trend(start, end)); + } + return Res.ok(dashboardTradeService.trend(days)); + } + + @Operation(summary = "退款趋势") + @GetMapping("/refund-trend") + public Result> refundTrend( + @RequestParam(defaultValue = "7") int days, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { + if (start != null && end != null) { + return Res.ok(dashboardTradeService.refundTrend(start, end)); + } + return Res.ok(dashboardTradeService.refundTrend(days)); + } + + @Operation(summary = "支付渠道分布") + @GetMapping("/provider-dist") + public Result> providerDist( + @RequestParam(defaultValue = "30") int days, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { + if (start != null && end != null) { + return Res.ok(dashboardTradeService.providerDist(start, end)); + } + return Res.ok(dashboardTradeService.providerDist(days)); + } + + @Operation(summary = "支付渠道成功率") + @GetMapping("/provider-success") + public Result> providerSuccess( + @RequestParam(defaultValue = "30") int days, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { + if (start != null && end != null) { + return Res.ok(dashboardTradeService.providerSuccess(start, end)); + } + return Res.ok(dashboardTradeService.providerSuccess(days)); + } + + @Operation(summary = "时段分布(日均)") + @GetMapping("/hourly-dist") + public Result> hourlyDist( + @RequestParam(defaultValue = "7") int days, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { + if (start != null && end != null) { + return Res.ok(dashboardTradeService.hourlyDist(start, end)); + } + return Res.ok(dashboardTradeService.hourlyDist(days)); + } + + @Operation(summary = "金额区间分桶") + @GetMapping("/amount-range") + public Result> amountRange( + @RequestParam(defaultValue = "7") int days, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { + if (start != null && end != null) { + return Res.ok(dashboardTradeService.amountRange(start, end)); + } + return Res.ok(dashboardTradeService.amountRange(days)); + } + + /// 维度排行: dim=channelMch|app|store + @Operation(summary = "维度交易额排名(通道商户/应用/门店)") + @GetMapping("/dim-rank") + public Result> dimRank( + @RequestParam(defaultValue = "app") String dim, + @RequestParam(defaultValue = "7") int days, + @RequestParam(defaultValue = "10") int limit, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { + if (start != null && end != null) { + return Res.ok(dashboardTradeService.dimRank(dim, start, end, limit)); + } + return Res.ok(dashboardTradeService.dimRank(dim, days, limit)); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/gateway/AppMerchantGatewayAggregateController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/gateway/AppMerchantGatewayAggregateController.java new file mode 100644 index 000000000..f3cab8c24 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/gateway/AppMerchantGatewayAggregateController.java @@ -0,0 +1,50 @@ +package cn.daxpay.open.payment.app.merchant.controller.gateway; + +import cn.daxpay.open.payment.app.merchant.service.gateway.AppMerchantGatewayAggregateService; +import cn.daxpay.open.payment.merchant.param.gateway.GatewayAggregateConfigParam; +import cn.daxpay.open.payment.merchant.result.gateway.GatewayAggregateConfigResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +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 jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/// # 网关聚合扫码配置(商户移动端) +/// +/// 面向商户移动端的聚合支付配置。业务编排委托 [AppMerchantGatewayAggregateService]; +/// 写操作强制当前上下文 mchNo,并通过 MchAppInfoService 校验应用归属。 +@PermCode(menuCode = PermCodes.Merchant.GatewayAggregate.MENU) +@Validated +@Tag(name = "网关聚合扫码配置(商户移动端)") +@RestController +@RequestMapping("/app-merchant/gateway/aggregate-config") +@RequiredArgsConstructor +public class AppMerchantGatewayAggregateController { + + private final AppMerchantGatewayAggregateService gatewayAggregateService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "按应用查询聚合扫码配置") + @GetMapping("/get-by-app-id") + public Result getByAppId( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId) { + return Res.ok(gatewayAggregateService.findByAppId(appId)); + } + + @PermCode(code = PermCodes.Action.MANAGE) + @Operation(summary = "保存或更新聚合扫码配置") + @PostMapping("/save-or-update") + public Result saveOrUpdate(@RequestBody @Validated GatewayAggregateConfigParam param) { + gatewayAggregateService.saveOrUpdate(param); + return Res.ok(); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/gateway/AppMerchantGatewayCashierController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/gateway/AppMerchantGatewayCashierController.java new file mode 100644 index 000000000..7b231ae14 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/gateway/AppMerchantGatewayCashierController.java @@ -0,0 +1,74 @@ +package cn.daxpay.open.payment.app.merchant.controller.gateway; + +import cn.daxpay.open.payment.app.merchant.service.gateway.AppMerchantGatewayCashierService; +import cn.daxpay.open.payment.merchant.param.gateway.GatewayCashierItemParam; +import cn.daxpay.open.payment.merchant.result.gateway.GatewayCashierItemResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.result.Result; +import cn.daxpay.open.platform.core.util.ValidationUtil; +import cn.daxpay.open.platform.core.validation.ValidationGroup; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/// # 网关收银台配置(商户移动端) +/// +/// 面向商户移动端的收银台支付项管理。业务编排委托 [AppMerchantGatewayCashierService]。 +@PermCode(menuCode = PermCodes.Merchant.GatewayCashier.MENU) +@Validated +@Tag(name = "网关收银台配置(商户移动端)") +@RestController +@RequestMapping("/app-merchant/gateway/cashier-config") +@RequiredArgsConstructor +public class AppMerchantGatewayCashierController { + + private final AppMerchantGatewayCashierService gatewayCashierService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "按应用与分桶查询收银台支付项列表") + @GetMapping("/list") + public Result> list( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId, + @NotBlank(message = "{validation.field.cashierType.notBlank}") String cashierType, + String clientEnv) { + return Res.ok(gatewayCashierService.list(appId, cashierType, clientEnv)); + } + + @PermCode(code = PermCodes.Action.MANAGE) + @Operation(summary = "新建收银台支付项") + @PostMapping("/save") + public Result save(@RequestBody @Validated GatewayCashierItemParam param) { + gatewayCashierService.save(param); + return Res.ok(); + } + + @PermCode(code = PermCodes.Action.MANAGE) + @Operation(summary = "更新收银台支付项") + @PostMapping("/update") + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) GatewayCashierItemParam param) { + // 同时校验 Default 分组字段与 edit 分组主键 + ValidationUtil.validateParam(param, jakarta.validation.groups.Default.class, ValidationGroup.edit.class); + gatewayCashierService.update(param); + return Res.ok(); + } + + @PermCode(code = PermCodes.Action.MANAGE) + @Operation(summary = "删除收银台支付项") + @PostMapping("/delete") + public Result delete(@NotNull(message = "{validation.field.id.notNull}") Long id) { + gatewayCashierService.delete(id); + return Res.ok(); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/gateway/AppMerchantGatewayCodeConfigController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/gateway/AppMerchantGatewayCodeConfigController.java new file mode 100644 index 000000000..04939b1a3 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/gateway/AppMerchantGatewayCodeConfigController.java @@ -0,0 +1,72 @@ +package cn.daxpay.open.payment.app.merchant.controller.gateway; + +import cn.daxpay.open.payment.app.merchant.service.gateway.AppMerchantGatewayCodeConfigService; +import cn.daxpay.open.payment.merchant.param.gateway.GatewayCodeConfigParam; +import cn.daxpay.open.payment.merchant.result.gateway.GatewayCodeConfigResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.dto.ChannelMchOption; +import cn.daxpay.open.platform.core.rest.dto.LabelValue; +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 jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/// # 码牌支付策略配置(商户移动端) +/// +/// 面向商户移动端的码牌支付配置。业务编排委托 [AppMerchantGatewayCodeConfigService]; +/// 写操作强制当前上下文 mchNo,并通过 MchAppInfoService 校验应用归属。 +@PermCode(menuCode = PermCodes.Merchant.GatewayCode.MENU) +@Validated +@Tag(name = "码牌支付策略配置(商户移动端)") +@RestController +@RequestMapping("/app-merchant/gateway/code-config") +@RequiredArgsConstructor +public class AppMerchantGatewayCodeConfigController { + + private final AppMerchantGatewayCodeConfigService gatewayCodeConfigService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "按应用查询码牌支付配置") + @GetMapping("/get-by-app-id") + public Result getByAppId( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId) { + return Res.ok(gatewayCodeConfigService.findByAppId(appId)); + } + + @PermCode(code = PermCodes.Action.MANAGE) + @Operation(summary = "保存或更新码牌支付配置") + @PostMapping("/save-or-update") + public Result saveOrUpdate(@RequestBody @Validated GatewayCodeConfigParam param) { + gatewayCodeConfigService.saveOrUpdate(param); + return Res.ok(); + } + + /// DIRECT 模式: 按当前商户+支付渠道列通道商户 + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "直接指定-通道商户候选") + @GetMapping("/direct-channel-mch-candidates") + public Result> listDirectChannelMchCandidates( + @NotBlank(message = "{validation.field.provider.notBlank}") String provider) { + return Res.ok(gatewayCodeConfigService.listDirectChannelMchCandidates(provider)); + } + + /// DIRECT 模式: 按通道商户列全部已挂载支付能力 + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "直接指定-支付能力候选") + @GetMapping("/direct-capability-candidates") + public Result> listDirectCapabilityCandidates( + @NotBlank(message = "{validation.field.channelMchNo.notBlank}") String channelMchNo) { + return Res.ok(gatewayCodeConfigService.listDirectCapabilityCandidates(channelMchNo)); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/info/AppMerchantAppInfoController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/info/AppMerchantAppInfoController.java new file mode 100644 index 000000000..06060dfa5 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/info/AppMerchantAppInfoController.java @@ -0,0 +1,95 @@ +package cn.daxpay.open.payment.app.merchant.controller.info; + +import cn.daxpay.open.payment.app.merchant.service.info.AppMerchantAppInfoService; +import cn.daxpay.open.payment.merchant.param.appinfo.MchAppInfoParam; +import cn.daxpay.open.payment.merchant.param.appinfo.MchAppInfoQuery; +import cn.daxpay.open.payment.merchant.result.appinfo.MchAppInfoResult; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import cn.daxpay.open.platform.core.rest.result.Result; +import cn.daxpay.open.platform.core.validation.ValidationGroup; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/// # 商户应用配置(商户移动端) +/// +/// 面向商户移动端的应用管理。业务编排委托 [AppMerchantAppInfoService]。 +@Validated +@Tag(name = "商户应用配置(商户移动端)") +@RestController +@RequestMapping("/app-merchant/app-info") +@RequiredArgsConstructor +public class AppMerchantAppInfoController { + + private final AppMerchantAppInfoService appInfoService; + + @Operation(summary = "商户应用分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, MchAppInfoQuery query) { + return Res.ok(appInfoService.page(pageParam, query)); + } + + @Operation(summary = "商户应用列表") + @GetMapping("/list") + public Result> list() { + return Res.ok(appInfoService.list()); + } + + @Operation(summary = "根据id查询商户应用") + @GetMapping("/get") + public Result findById(@NotNull(message = "{validation.field.id.notNull}") Long id) { + return Res.ok(appInfoService.findById(id)); + } + + @Operation(summary = "根据应用AppId获取应用详情") + @GetMapping("/get-by-app-id") + public Result findByAppId(@NotNull(message = "{validation.field.appId.notBlank}") String appId) { + return Res.ok(appInfoService.findByAppId(appId)); + } + + @Operation(summary = "新增商户应用") + @PostMapping("/add") + public Result add(@RequestBody @Validated(ValidationGroup.add.class) MchAppInfoParam param) { + appInfoService.add(param); + return Res.ok(); + } + + @Operation(summary = "修改商户应用") + @PostMapping("/update") + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) MchAppInfoParam param) { + appInfoService.update(param); + return Res.ok(); + } + + @Operation(summary = "删除商户应用") + @PostMapping("/delete") + public Result delete(@NotNull(message = "{validation.field.id.notNull}") Long id) { + appInfoService.delete(id); + return Res.ok(); + } + + @Operation(summary = "设置默认商户应用") + @PostMapping("/set-default") + public Result setDefault(@NotNull(message = "{validation.field.id.notNull}") Long id) { + appInfoService.setDefault(id); + return Res.ok(); + } + + @Operation(summary = "取消默认商户应用") + @PostMapping("/clear-default") + public Result clearDefault(@NotNull(message = "{validation.field.id.notNull}") Long id) { + appInfoService.clearDefault(id); + return Res.ok(); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/info/AppMerchantInfoController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/info/AppMerchantInfoController.java new file mode 100644 index 000000000..fe84bae27 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/info/AppMerchantInfoController.java @@ -0,0 +1,43 @@ +package cn.daxpay.open.payment.app.merchant.controller.info; + +import cn.daxpay.open.payment.app.merchant.service.info.AppMerchantInfoService; +import cn.daxpay.open.payment.merchant.param.info.MerchantInfoParam; +import cn.daxpay.open.payment.merchant.result.info.MerchantInfoResult; +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.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/// # 商户信息(商户移动端) +/// +/// 获取/更新当前登录商户资料。业务编排委托 [AppMerchantInfoService]。 +@Validated +@Tag(name = "商户信息(商户移动端)") +@RestController +@RequestMapping("/app-merchant/merchant") +@RequiredArgsConstructor +public class AppMerchantInfoController { + + private final AppMerchantInfoService merchantInfoService; + + @Operation(summary = "获取商户信息") + @GetMapping("/get") + public Result getMerchant() { + return Res.ok(merchantInfoService.getMerchant()); + } + + /// 更新当前登录商户资料(mchNo 取自 PaymentContext,不信任入参) + @Operation(summary = "更新商户信息") + @PostMapping("/update") + public Result update(@RequestBody @Validated MerchantInfoParam param) { + merchantInfoService.update(param); + return Res.ok(); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/route/AppMerchantPayRouteController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/route/AppMerchantPayRouteController.java new file mode 100644 index 000000000..a9e8db3c3 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/route/AppMerchantPayRouteController.java @@ -0,0 +1,136 @@ +package cn.daxpay.open.payment.app.merchant.controller.route; + +import cn.daxpay.open.payment.app.merchant.service.route.AppMerchantPayRouteService; +import cn.daxpay.open.payment.masterdata.result.provider.PayProviderMethodResult; +import cn.daxpay.open.payment.route.param.basic.PayRouteBasicConfigBatchParam; +import cn.daxpay.open.payment.route.param.scene.PayRouteSceneCapabilityBatchParam; +import cn.daxpay.open.payment.route.param.scene.PayRouteSceneConfigBatchParam; +import cn.daxpay.open.payment.route.param.strategy.PayRouteStrategyParam; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.dto.ChannelMchOption; +import cn.daxpay.open.platform.core.rest.dto.LabelValue; +import cn.daxpay.open.platform.core.rest.result.Result; +import cn.daxpay.open.payment.route.result.basic.PayRouteBasicConfigResult; +import cn.daxpay.open.payment.route.result.scene.PayRouteSceneConfigResult; +import cn.daxpay.open.payment.route.result.strategy.PayRouteStrategyResult; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +/// # 商户应用通道路由(商户移动端) +/// +/// 面向商户移动端的通道路由配置。业务编排委托 [AppMerchantPayRouteService]。 +@PermCode(menuCode = PermCodes.Merchant.AppRoute.MENU) +@Validated +@Tag(name = "应用通道路由管理(商户移动端)") +@RestController +@RequestMapping("/app-merchant/pay-route") +@RequiredArgsConstructor +public class AppMerchantPayRouteController { + + private final AppMerchantPayRouteService payRouteService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "已启用渠道支付方式扁平列表") + @GetMapping("/method-directory/flat-list") + public Result> listMethodDirectoryFlat() { + return Res.ok(payRouteService.listMethodDirectoryFlat()); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "获取或初始化应用路由策略") + @GetMapping("/strategy/get-or-init-by-app-id") + public Result getOrInitByAppId( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId) { + return Res.ok(payRouteService.getOrInitByAppId(appId)); + } + + @PermCode(code = PermCodes.Action.MANAGE) + @Operation(summary = "更新路由策略") + @PostMapping("/strategy/update") + public Result updateStrategy(@RequestBody @Validated PayRouteStrategyParam param) { + return Res.ok(payRouteService.updateStrategy(param)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "查询场景模式配置列表") + @GetMapping("/scene-config/list-by-app-id") + public Result> listSceneByAppId( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId) { + return Res.ok(payRouteService.listSceneByAppId(appId)); + } + + @PermCode(code = PermCodes.Action.MANAGE) + @Operation(summary = "批量保存场景模式配置") + @PostMapping("/scene-config/save-batch") + public Result saveSceneBatch(@RequestBody @Validated PayRouteSceneConfigBatchParam param) { + payRouteService.saveSceneBatch(param); + return Res.ok(); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "通道路由白名单目录下全部通道商户候选(批量)") + @GetMapping("/scene-config/channel-mh-candidates-batch") + public Result>> listSceneChannelMhCandidatesBatch( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId) { + return Res.ok(payRouteService.listSceneChannelMhCandidatesBatch(appId)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "按目录项与通道商户批量返回支付能力候选") + @PostMapping("/scene-config/capability-candidates-batch") + public Result>> listSceneCapabilityCandidatesBatch( + @Valid @RequestBody PayRouteSceneCapabilityBatchParam param) { + return Res.ok(payRouteService.listSceneCapabilityCandidatesBatch(param)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "目录项下商户已开通的通道商户候选") + @GetMapping("/scene-config/channel-mh-candidates") + public Result> listSceneChannelMhCandidates( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId, + @NotBlank(message = "{validation.field.provider.notBlank}") String provider, + @NotBlank(message = "{validation.field.method.notBlank}") String method) { + return Res.ok(payRouteService.listSceneChannelMhCandidates(appId, provider, method)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "目录项与通道商户下支付能力候选") + @GetMapping("/scene-config/capability-candidates") + public Result> listSceneCapabilityCandidates( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId, + @NotBlank(message = "{validation.field.provider.notBlank}") String provider, + @NotBlank(message = "{validation.field.method.notBlank}") String method, + @NotBlank(message = "{validation.field.channelMchNo.notBlank}") String channelMchNo) { + return Res.ok(payRouteService.listSceneCapabilityCandidates(appId, provider, method, channelMchNo)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "查询基础模式配置列表") + @GetMapping("/basic-config/list-by-app-id") + public Result> listBasicByAppId( + @NotBlank(message = "{validation.field.appId.notBlank}") String appId) { + return Res.ok(payRouteService.listBasicByAppId(appId)); + } + + @PermCode(code = PermCodes.Action.MANAGE) + @Operation(summary = "批量保存基础模式配置") + @PostMapping("/basic-config/save-batch") + public Result saveBasicBatch(@RequestBody @Validated PayRouteBasicConfigBatchParam param) { + payRouteService.saveBasicBatch(param); + return Res.ok(); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/store/AppMerchantStoreInfoController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/store/AppMerchantStoreInfoController.java new file mode 100644 index 000000000..1d06686b0 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/store/AppMerchantStoreInfoController.java @@ -0,0 +1,67 @@ +package cn.daxpay.open.payment.app.merchant.controller.store; + +import cn.daxpay.open.payment.app.merchant.service.store.AppMerchantStoreInfoService; +import cn.daxpay.open.payment.merchant.param.store.MchStoreInfoParam; +import cn.daxpay.open.payment.merchant.param.store.MchStoreInfoQuery; +import cn.daxpay.open.payment.merchant.result.store.MchStoreInfoResult; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import cn.daxpay.open.platform.core.rest.result.Result; +import cn.daxpay.open.platform.core.validation.ValidationGroup; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/// # 门店信息管理(商户移动端) +/// +/// 面向商户移动端的门店管理。业务编排委托 [AppMerchantStoreInfoService]。 +@Validated +@Tag(name = "门店信息管理(商户移动端)") +@RestController +@RequestMapping("/app-merchant/store") +@RequiredArgsConstructor +public class AppMerchantStoreInfoController { + + private final AppMerchantStoreInfoService storeInfoService; + + @Operation(summary = "门店分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, MchStoreInfoQuery query) { + return Res.ok(storeInfoService.page(pageParam, query)); + } + + @Operation(summary = "根据id查询门店") + @GetMapping("/get") + public Result findById(@NotNull(message = "{validation.field.id.notNull}") Long id) { + return Res.ok(storeInfoService.findById(id)); + } + + @Operation(summary = "新增门店") + @PostMapping("/add") + public Result add(@RequestBody @Validated(ValidationGroup.add.class) MchStoreInfoParam param) { + storeInfoService.add(param); + return Res.ok(); + } + + @Operation(summary = "修改门店") + @PostMapping("/update") + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) MchStoreInfoParam param) { + storeInfoService.update(param); + return Res.ok(); + } + + @Operation(summary = "删除门店") + @PostMapping("/delete") + public Result delete(@NotNull(message = "{validation.field.id.notNull}") Long id) { + storeInfoService.delete(id); + return Res.ok(); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantGatewayPayOrderController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantGatewayPayOrderController.java new file mode 100644 index 000000000..a904763f3 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantGatewayPayOrderController.java @@ -0,0 +1,48 @@ +package cn.daxpay.open.payment.app.merchant.controller.trade; + +import cn.daxpay.open.payment.app.merchant.service.trade.AppMerchantGatewayPayOrderService; +import cn.daxpay.open.payment.trade.order.param.GatewayPayOrderQuery; +import cn.daxpay.open.payment.trade.order.result.GatewayPayOrderResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +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 jakarta.validation.constraints.NotNull; +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.RestController; + +/// # 网关支付业务单(商户移动端) +/// +/// 面向商户移动端的网关支付订单查询。业务编排委托 [AppMerchantGatewayPayOrderService]。 +@PermCode(menuCode = PermCodes.Trade.GatewayOrder.MENU) +@Validated +@Tag(name = "网关支付业务单(商户移动端)") +@RestController +@RequestMapping("/app-merchant/order/gateway-pay") +@RequiredArgsConstructor +public class AppMerchantGatewayPayOrderController { + + private final AppMerchantGatewayPayOrderService gatewayPayOrderService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "网关支付业务单分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, GatewayPayOrderQuery query) { + return Res.ok(gatewayPayOrderService.page(pageParam, query)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "根据ID查询详情") + @GetMapping("/get-by-id") + public Result findById( + @NotNull(message = "{validation.field.id.notNull}") Long id) { + return Res.ok(gatewayPayOrderService.findById(id)); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantMchNoticeController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantMchNoticeController.java new file mode 100644 index 000000000..4e12465ed --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantMchNoticeController.java @@ -0,0 +1,48 @@ +package cn.daxpay.open.payment.app.merchant.controller.trade; + +import cn.daxpay.open.payment.app.merchant.service.trade.AppMerchantMchNoticeService; +import cn.daxpay.open.payment.trade.notice.param.MchNoticeTaskQuery; +import cn.daxpay.open.payment.trade.notice.result.MchNoticeTaskResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +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 jakarta.validation.constraints.NotNull; +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.RestController; + +/// # 商户出站通知(商户移动端) +/// +/// 面向商户移动端的出站通知查询。业务编排委托 [AppMerchantMchNoticeService]。 +@PermCode(menuCode = PermCodes.Trade.Notice.MENU) +@Validated +@Tag(name = "商户出站通知(商户移动端)") +@RestController +@RequestMapping("/app-merchant/mch-notice") +@RequiredArgsConstructor +public class AppMerchantMchNoticeController { + + private final AppMerchantMchNoticeService mchNoticeService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "通知任务分页") + @GetMapping("/task/page") + public Result> pageTask(PageParam pageParam, MchNoticeTaskQuery query) { + return Res.ok(mchNoticeService.pageTask(pageParam, query)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "通知任务详情") + @GetMapping("/task/get-by-id") + public Result getTaskById( + @NotNull(message = "{validation.field.id.notNull}") Long id) { + return Res.ok(mchNoticeService.findTaskById(id)); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantNormalPayOrderController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantNormalPayOrderController.java new file mode 100644 index 000000000..02004ddf7 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantNormalPayOrderController.java @@ -0,0 +1,48 @@ +package cn.daxpay.open.payment.app.merchant.controller.trade; + +import cn.daxpay.open.payment.app.merchant.service.trade.AppMerchantNormalPayOrderService; +import cn.daxpay.open.payment.trade.order.param.NormalPayOrderQuery; +import cn.daxpay.open.payment.trade.order.result.NormalPayOrderResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +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 jakarta.validation.constraints.NotNull; +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.RestController; + +/// # 普通支付业务单(商户移动端) +/// +/// 面向商户移动端的业务订单查询。业务编排委托 [AppMerchantNormalPayOrderService]。 +@PermCode(menuCode = PermCodes.Trade.Order.MENU) +@Validated +@Tag(name = "普通支付业务单(商户移动端)") +@RestController +@RequestMapping("/app-merchant/order/normal-pay") +@RequiredArgsConstructor +public class AppMerchantNormalPayOrderController { + + private final AppMerchantNormalPayOrderService normalPayOrderService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "普通支付业务单分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, NormalPayOrderQuery query) { + return Res.ok(normalPayOrderService.page(pageParam, query)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "根据ID查询普通支付业务单详情") + @GetMapping("/get-by-id") + public Result findById( + @NotNull(message = "{validation.field.id.notNull}") Long id) { + return Res.ok(normalPayOrderService.findById(id)); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantPayCallbackRecordController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantPayCallbackRecordController.java new file mode 100644 index 000000000..446b9c171 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantPayCallbackRecordController.java @@ -0,0 +1,48 @@ +package cn.daxpay.open.payment.app.merchant.controller.trade; + +import cn.daxpay.open.payment.app.merchant.service.trade.AppMerchantPayCallbackRecordService; +import cn.daxpay.open.payment.trade.record.param.PayCallbackRecordQuery; +import cn.daxpay.open.payment.trade.record.result.PayCallbackRecordResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +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 jakarta.validation.constraints.NotNull; +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.RestController; + +/// # 通道入站回调记录(商户移动端) +/// +/// 面向商户移动端的通道回调记录查询。业务编排委托 [AppMerchantPayCallbackRecordService]。 +@PermCode(menuCode = PermCodes.Trade.CallbackRecord.MENU) +@Validated +@Tag(name = "通道入站回调记录(商户移动端)") +@RestController +@RequestMapping("/app-merchant/callback-record") +@RequiredArgsConstructor +public class AppMerchantPayCallbackRecordController { + + private final AppMerchantPayCallbackRecordService payCallbackRecordService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "回调记录分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, PayCallbackRecordQuery query) { + return Res.ok(payCallbackRecordService.page(pageParam, query)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "回调记录详情") + @GetMapping("/get-by-id") + public Result findById( + @NotNull(message = "{validation.field.id.notNull}") Long id) { + return Res.ok(payCallbackRecordService.findById(id)); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantPayTradeController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantPayTradeController.java new file mode 100644 index 000000000..d303bf281 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantPayTradeController.java @@ -0,0 +1,48 @@ +package cn.daxpay.open.payment.app.merchant.controller.trade; + +import cn.daxpay.open.payment.app.merchant.service.trade.AppMerchantPayTradeService; +import cn.daxpay.open.payment.trade.order.param.PayTradeQuery; +import cn.daxpay.open.payment.trade.order.result.PayTradeResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +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 jakarta.validation.constraints.NotNull; +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.RestController; + +/// # 资金交易凭证(商户移动端) +/// +/// 面向商户移动端的资金交易凭证查询。业务编排委托 [AppMerchantPayTradeService]。 +@PermCode(menuCode = PermCodes.Trade.Fund.MENU) +@Validated +@Tag(name = "资金交易凭证(商户移动端)") +@RestController +@RequestMapping("/app-merchant/order/pay-trade") +@RequiredArgsConstructor +public class AppMerchantPayTradeController { + + private final AppMerchantPayTradeService payTradeService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "资金交易凭证分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, PayTradeQuery query) { + return Res.ok(payTradeService.page(pageParam, query)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "根据ID查询资金交易凭证详情") + @GetMapping("/get-by-id") + public Result findById( + @NotNull(message = "{validation.field.id.notNull}") Long id) { + return Res.ok(payTradeService.findById(id)); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantRefundOrderController.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantRefundOrderController.java new file mode 100644 index 000000000..fbfebb1f8 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/controller/trade/AppMerchantRefundOrderController.java @@ -0,0 +1,48 @@ +package cn.daxpay.open.payment.app.merchant.controller.trade; + +import cn.daxpay.open.payment.app.merchant.service.trade.AppMerchantRefundOrderService; +import cn.daxpay.open.payment.trade.order.param.RefundOrderQuery; +import cn.daxpay.open.payment.trade.order.result.RefundOrderResult; +import cn.daxpay.open.platform.core.annotation.PermCode; +import cn.daxpay.open.platform.core.code.PermCodes; +import cn.daxpay.open.platform.core.rest.Res; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +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 jakarta.validation.constraints.NotNull; +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.RestController; + +/// # 退款订单(商户移动端) +/// +/// 面向商户移动端的退款订单查询。业务编排委托 [AppMerchantRefundOrderService]。 +@PermCode(menuCode = PermCodes.Trade.Refund.MENU) +@Validated +@Tag(name = "退款订单(商户移动端)") +@RestController +@RequestMapping("/app-merchant/order/refund") +@RequiredArgsConstructor +public class AppMerchantRefundOrderController { + + private final AppMerchantRefundOrderService refundOrderService; + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "退款订单分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, RefundOrderQuery query) { + return Res.ok(refundOrderService.page(pageParam, query)); + } + + @PermCode(code = PermCodes.Action.VIEW) + @Operation(summary = "根据ID查询退款订单详情") + @GetMapping("/get-by-id") + public Result findById( + @NotNull(message = "{validation.field.id.notNull}") Long id) { + return Res.ok(refundOrderService.findById(id)); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/channel/AppMerchantChannelMerchantService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/channel/AppMerchantChannelMerchantService.java new file mode 100644 index 000000000..13babeba9 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/channel/AppMerchantChannelMerchantService.java @@ -0,0 +1,45 @@ +package cn.daxpay.open.payment.app.merchant.service.channel; + +import cn.daxpay.open.payment.common.context.PaymentContext; +import cn.daxpay.open.payment.merchant.param.channel.ChannelMerchantQuery; +import cn.daxpay.open.payment.merchant.result.channel.ChannelMerchantResult; +import cn.daxpay.open.payment.merchant.service.channel.ChannelMerchantService; +import cn.daxpay.open.platform.core.code.CommonCode; +import cn.daxpay.open.platform.core.exception.BizInfoException; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-通道商户服务 +/// +/// 转发至 core [ChannelMerchantService];强制当前上下文 mchNo 过滤。 +@Service +@RequiredArgsConstructor +public class AppMerchantChannelMerchantService { + + private final ChannelMerchantService channelMerchantService; + private final PaymentContext paymentContext; + + /// 当前登录商户号 + private String requireMchNo() { + String mchNo = paymentContext.getMchNo(); + if (mchNo == null || mchNo.isBlank()) { + // 商户上下文缺失 + throw new BizInfoException(CommonCode.FAIL_CODE, "pay.error.assist.mchContextMissing"); + } + return mchNo; + } + + /// 分页查询(强制当前商户) + public PageResult page(PageParam pageParam, ChannelMerchantQuery query) { + // 强制当前商户,忽略客户端传入的 mchNo + query.setMchNo(requireMchNo()); + return channelMerchantService.page(pageParam, query); + } + + /// 查询详情 + public ChannelMerchantResult findById(Long id) { + return channelMerchantService.findById(id); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/config/AppMerchantAppNotifyConfigService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/config/AppMerchantAppNotifyConfigService.java new file mode 100644 index 000000000..2f8c93558 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/config/AppMerchantAppNotifyConfigService.java @@ -0,0 +1,27 @@ +package cn.daxpay.open.payment.app.merchant.service.config; + +import cn.daxpay.open.payment.admin.service.merchant.config.MchAppNotifyConfigService; +import cn.daxpay.open.payment.merchant.param.config.MchAppNotifyConfigParam; +import cn.daxpay.open.payment.merchant.result.config.MchAppNotifyConfigResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-应用事件通知配置服务 +/// +/// 转发至 [MchAppNotifyConfigService] +@Service +@RequiredArgsConstructor +public class AppMerchantAppNotifyConfigService { + + private final MchAppNotifyConfigService mchAppNotifyConfigService; + + /// 根据应用ID查询通知配置 + public MchAppNotifyConfigResult findByAppId(String appId) { + return mchAppNotifyConfigService.findByAppId(appId); + } + + /// 保存或更新通知配置 + public void saveOrUpdate(MchAppNotifyConfigParam param) { + mchAppNotifyConfigService.saveOrUpdate(param); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/config/AppMerchantCredentialService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/config/AppMerchantCredentialService.java new file mode 100644 index 000000000..af7360925 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/config/AppMerchantCredentialService.java @@ -0,0 +1,27 @@ +package cn.daxpay.open.payment.app.merchant.service.config; + +import cn.daxpay.open.payment.merchant.param.config.MerchantCredentialParam; +import cn.daxpay.open.payment.merchant.result.config.MerchantCredentialResult; +import cn.daxpay.open.payment.merchant.service.config.MerchantCredentialService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-对接凭证服务 +/// +/// 转发至 core [MerchantCredentialService] +@Service +@RequiredArgsConstructor +public class AppMerchantCredentialService { + + private final MerchantCredentialService credentialService; + + /// 根据商户号查询 + public MerchantCredentialResult findByMchNo(String mchNo) { + return credentialService.findByMchNo(mchNo); + } + + /// 更新商户API配置 + public void update(MerchantCredentialParam param) { + credentialService.update(param); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/dashboard/AppMerchantDashboardTradeService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/dashboard/AppMerchantDashboardTradeService.java new file mode 100644 index 000000000..8dd7ddf0a --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/dashboard/AppMerchantDashboardTradeService.java @@ -0,0 +1,111 @@ +package cn.daxpay.open.payment.app.merchant.service.dashboard; + +import cn.daxpay.open.payment.merchant.result.dashboard.MchDashboardHeaderCountResult; +import cn.daxpay.open.payment.merchant.service.dashboard.MchDashboardTradeService; +import cn.daxpay.open.payment.trade.report.result.AmountRangeItemResult; +import cn.daxpay.open.payment.trade.report.result.DimRankItemResult; +import cn.daxpay.open.payment.trade.report.result.HourlyDistItemResult; +import cn.daxpay.open.payment.trade.report.result.ProviderDistItemResult; +import cn.daxpay.open.payment.trade.report.result.ProviderSuccessItemResult; +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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/// # 商户移动端-工作台交易统计服务 +/// +/// 转发至 [MchDashboardTradeService] +@Service +@RequiredArgsConstructor +public class AppMerchantDashboardTradeService { + + private final MchDashboardTradeService mchDashboardTradeService; + + /// 工作台头部计数 + public MchDashboardHeaderCountResult headerCounts() { + return mchDashboardTradeService.headerCounts(); + } + + /// 交易概览(快捷模式:today / yesterday) + public TradeOverviewResult overview(String date) { + return mchDashboardTradeService.overview(date); + } + + /// 交易概览(区间模式) + public TradeOverviewResult overview(String start, String end) { + return mchDashboardTradeService.overview(start, end); + } + + /// 交易趋势(快捷天数) + public List trend(int days) { + return mchDashboardTradeService.trend(days); + } + + /// 交易趋势(区间模式) + public List trend(String start, String end) { + return mchDashboardTradeService.trend(start, end); + } + + /// 退款趋势(快捷天数) + public List refundTrend(int days) { + return mchDashboardTradeService.refundTrend(days); + } + + /// 退款趋势(区间模式) + public List refundTrend(String start, String end) { + return mchDashboardTradeService.refundTrend(start, end); + } + + /// 支付渠道分布(快捷天数) + public List providerDist(int days) { + return mchDashboardTradeService.providerDist(days); + } + + /// 支付渠道分布(区间模式) + public List providerDist(String start, String end) { + return mchDashboardTradeService.providerDist(start, end); + } + + /// 支付渠道成功率(快捷天数) + public List providerSuccess(int days) { + return mchDashboardTradeService.providerSuccess(days); + } + + /// 支付渠道成功率(区间模式) + public List providerSuccess(String start, String end) { + return mchDashboardTradeService.providerSuccess(start, end); + } + + /// 时段分布(快捷天数) + public List hourlyDist(int days) { + return mchDashboardTradeService.hourlyDist(days); + } + + /// 时段分布(区间模式) + public List hourlyDist(String start, String end) { + return mchDashboardTradeService.hourlyDist(start, end); + } + + /// 金额区间分桶(快捷天数) + public List amountRange(int days) { + return mchDashboardTradeService.amountRange(days); + } + + /// 金额区间分桶(区间模式) + public List amountRange(String start, String end) { + return mchDashboardTradeService.amountRange(start, end); + } + + /// 维度排行(快捷天数) + public List dimRank(String dim, int days, int limit) { + return mchDashboardTradeService.dimRank(dim, days, limit); + } + + /// 维度排行(区间模式) + public List dimRank(String dim, String start, String end, int limit) { + return mchDashboardTradeService.dimRank(dim, start, end, limit); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/gateway/AppMerchantGatewayAggregateService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/gateway/AppMerchantGatewayAggregateService.java new file mode 100644 index 000000000..82bebe0fe --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/gateway/AppMerchantGatewayAggregateService.java @@ -0,0 +1,49 @@ +package cn.daxpay.open.payment.app.merchant.service.gateway; + +import cn.daxpay.open.payment.common.context.PaymentContext; +import cn.daxpay.open.payment.merchant.param.gateway.GatewayAggregateConfigParam; +import cn.daxpay.open.payment.merchant.result.appinfo.MchAppInfoResult; +import cn.daxpay.open.payment.merchant.result.gateway.GatewayAggregateConfigResult; +import cn.daxpay.open.payment.merchant.service.appinfo.MchAppInfoService; +import cn.daxpay.open.payment.merchant.service.gateway.GatewayAggregateConfigService; +import cn.daxpay.open.platform.core.code.CommonCode; +import cn.daxpay.open.platform.core.exception.BizInfoException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-聚合扫码配置服务 +/// +/// 转发至 core [GatewayAggregateConfigService];写操作强制当前上下文 mchNo。 +@Service +@RequiredArgsConstructor +public class AppMerchantGatewayAggregateService { + + private final GatewayAggregateConfigService gatewayAggregateConfigService; + private final MchAppInfoService mchAppInfoService; + private final PaymentContext paymentContext; + + /// 当前登录商户号 + private String requireMchNo() { + String mchNo = paymentContext.getMchNo(); + if (mchNo == null || mchNo.isBlank()) { + // 商户上下文缺失 + throw new BizInfoException(CommonCode.FAIL_CODE, "pay.error.assist.mchContextMissing"); + } + return mchNo; + } + + /// 按应用查询聚合配置 + public GatewayAggregateConfigResult findByAppId(String appId) { + // 校验 appId 属于当前商户 + mchAppInfoService.findByAppId(appId); + return gatewayAggregateConfigService.findByAppId(appId); + } + + /// 保存或更新聚合配置 + public void saveOrUpdate(GatewayAggregateConfigParam param) { + MchAppInfoResult app = mchAppInfoService.findByAppId(param.getAppId()); + // 强制当前商户号,忽略客户端传入 + param.setMchNo(app.getMchNo() != null ? app.getMchNo() : requireMchNo()); + gatewayAggregateConfigService.saveOrUpdate(param); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/gateway/AppMerchantGatewayCashierService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/gateway/AppMerchantGatewayCashierService.java new file mode 100644 index 000000000..2c3c12ea5 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/gateway/AppMerchantGatewayCashierService.java @@ -0,0 +1,39 @@ +package cn.daxpay.open.payment.app.merchant.service.gateway; + +import cn.daxpay.open.payment.admin.service.merchant.gateway.GatewayCashierConfigService; +import cn.daxpay.open.payment.merchant.param.gateway.GatewayCashierItemParam; +import cn.daxpay.open.payment.merchant.result.gateway.GatewayCashierItemResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/// # 商户移动端-收银台配置服务 +/// +/// 转发至 [GatewayCashierConfigService] +@Service +@RequiredArgsConstructor +public class AppMerchantGatewayCashierService { + + private final GatewayCashierConfigService gatewayCashierConfigService; + + /// 查询收银台支付项列表 + public List list(String appId, String cashierType, String clientEnv) { + return gatewayCashierConfigService.list(appId, cashierType, clientEnv); + } + + /// 新建收银台支付项 + public void save(GatewayCashierItemParam param) { + gatewayCashierConfigService.save(param); + } + + /// 更新收银台支付项 + public void update(GatewayCashierItemParam param) { + gatewayCashierConfigService.update(param); + } + + /// 删除收银台支付项 + public void delete(Long id) { + gatewayCashierConfigService.delete(id); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/gateway/AppMerchantGatewayCodeConfigService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/gateway/AppMerchantGatewayCodeConfigService.java new file mode 100644 index 000000000..9b44075b3 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/gateway/AppMerchantGatewayCodeConfigService.java @@ -0,0 +1,65 @@ +package cn.daxpay.open.payment.app.merchant.service.gateway; + +import cn.daxpay.open.payment.common.context.PaymentContext; +import cn.daxpay.open.payment.merchant.param.gateway.GatewayCodeConfigParam; +import cn.daxpay.open.payment.merchant.result.appinfo.MchAppInfoResult; +import cn.daxpay.open.payment.merchant.result.gateway.GatewayCodeConfigResult; +import cn.daxpay.open.payment.merchant.service.appinfo.MchAppInfoService; +import cn.daxpay.open.payment.merchant.service.gateway.GatewayCodeConfigService; +import cn.daxpay.open.payment.route.service.support.PayRouteStrategyCapabilitySupport; +import cn.daxpay.open.platform.core.code.CommonCode; +import cn.daxpay.open.platform.core.exception.BizInfoException; +import cn.daxpay.open.platform.core.rest.dto.ChannelMchOption; +import cn.daxpay.open.platform.core.rest.dto.LabelValue; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/// # 商户移动端-码牌支付配置服务 +/// +/// 转发至 core [GatewayCodeConfigService];写操作强制当前上下文 mchNo。 +@Service +@RequiredArgsConstructor +public class AppMerchantGatewayCodeConfigService { + + private final GatewayCodeConfigService gatewayCodeConfigService; + private final PayRouteStrategyCapabilitySupport payRouteStrategyCapabilitySupport; + private final MchAppInfoService mchAppInfoService; + private final PaymentContext paymentContext; + + /// 当前登录商户号 + private String requireMchNo() { + String mchNo = paymentContext.getMchNo(); + if (mchNo == null || mchNo.isBlank()) { + // 商户上下文缺失 + throw new BizInfoException(CommonCode.FAIL_CODE, "pay.error.assist.mchContextMissing"); + } + return mchNo; + } + + /// 按应用查询码牌配置 + public GatewayCodeConfigResult findByAppId(String appId) { + // 校验 appId 属于当前商户 + mchAppInfoService.findByAppId(appId); + return gatewayCodeConfigService.findByAppId(appId); + } + + /// 保存或更新码牌配置 + public void saveOrUpdate(GatewayCodeConfigParam param) { + MchAppInfoResult app = mchAppInfoService.findByAppId(param.getAppId()); + // 强制当前商户号,忽略客户端传入 + param.setMchNo(app.getMchNo() != null ? app.getMchNo() : requireMchNo()); + gatewayCodeConfigService.saveOrUpdate(param); + } + + /// DIRECT 模式: 通道商户候选 + public List listDirectChannelMchCandidates(String provider) { + return payRouteStrategyCapabilitySupport.listDirectChannelMchCandidates(requireMchNo(), provider); + } + + /// DIRECT 模式: 支付能力候选 + public List listDirectCapabilityCandidates(String channelMchNo) { + return payRouteStrategyCapabilitySupport.listDirectCapabilityCandidates(channelMchNo); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/info/AppMerchantAppInfoService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/info/AppMerchantAppInfoService.java new file mode 100644 index 000000000..d5c98dba7 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/info/AppMerchantAppInfoService.java @@ -0,0 +1,67 @@ +package cn.daxpay.open.payment.app.merchant.service.info; + +import cn.daxpay.open.payment.merchant.param.appinfo.MchAppInfoParam; +import cn.daxpay.open.payment.merchant.param.appinfo.MchAppInfoQuery; +import cn.daxpay.open.payment.merchant.result.appinfo.MchAppInfoResult; +import cn.daxpay.open.payment.merchant.service.appinfo.MchAppInfoService; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/// # 商户移动端-商户应用服务 +/// +/// 转发至 core [MchAppInfoService] +@Service +@RequiredArgsConstructor +public class AppMerchantAppInfoService { + + private final MchAppInfoService mchAppInfoService; + + /// 新增商户应用 + public void add(MchAppInfoParam param) { + mchAppInfoService.add(param); + } + + /// 修改商户应用 + public void update(MchAppInfoParam param) { + mchAppInfoService.update(param); + } + + /// 商户应用分页 + public PageResult page(PageParam pageParam, MchAppInfoQuery query) { + return mchAppInfoService.page(pageParam, query); + } + + /// 商户应用列表 + public List list() { + return mchAppInfoService.list(); + } + + /// 根据id查询 + public MchAppInfoResult findById(Long id) { + return mchAppInfoService.findById(id); + } + + /// 根据应用AppId获取应用详情 + public MchAppInfoResult findByAppId(String appId) { + return mchAppInfoService.findByAppId(appId); + } + + /// 删除商户应用 + public void delete(Long id) { + mchAppInfoService.delete(id); + } + + /// 设置默认商户应用 + public void setDefault(Long id) { + mchAppInfoService.setDefault(id); + } + + /// 取消默认商户应用 + public void clearDefault(Long id) { + mchAppInfoService.clearDefault(id); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/info/AppMerchantInfoService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/info/AppMerchantInfoService.java new file mode 100644 index 000000000..18b688ec5 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/info/AppMerchantInfoService.java @@ -0,0 +1,27 @@ +package cn.daxpay.open.payment.app.merchant.service.info; + +import cn.daxpay.open.payment.merchant.param.info.MerchantInfoParam; +import cn.daxpay.open.payment.merchant.result.info.MerchantInfoResult; +import cn.daxpay.open.payment.merchant.service.info.MerchantInfoService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-商户信息服务 +/// +/// 转发至 [MerchantInfoService] +@Service +@RequiredArgsConstructor +public class AppMerchantInfoService { + + private final MerchantInfoService merchantInfoService; + + /// 获取当前登录商户信息 + public MerchantInfoResult getMerchant() { + return merchantInfoService.getMerchant(); + } + + /// 更新商户信息 + public void update(MerchantInfoParam param) { + merchantInfoService.update(param); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/route/AppMerchantPayRouteService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/route/AppMerchantPayRouteService.java new file mode 100644 index 000000000..5c9adfad5 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/route/AppMerchantPayRouteService.java @@ -0,0 +1,85 @@ +package cn.daxpay.open.payment.app.merchant.service.route; + +import cn.daxpay.open.payment.admin.service.merchant.route.PayRouteConfigService; +import cn.daxpay.open.payment.masterdata.result.provider.PayProviderMethodResult; +import cn.daxpay.open.payment.masterdata.service.provider.PayProviderMethodService; +import cn.daxpay.open.payment.route.param.basic.PayRouteBasicConfigBatchParam; +import cn.daxpay.open.payment.route.param.scene.PayRouteSceneCapabilityBatchParam; +import cn.daxpay.open.payment.route.param.scene.PayRouteSceneConfigBatchParam; +import cn.daxpay.open.payment.route.param.strategy.PayRouteStrategyParam; +import cn.daxpay.open.platform.core.rest.dto.ChannelMchOption; +import cn.daxpay.open.platform.core.rest.dto.LabelValue; +import cn.daxpay.open.payment.route.result.basic.PayRouteBasicConfigResult; +import cn.daxpay.open.payment.route.result.scene.PayRouteSceneConfigResult; +import cn.daxpay.open.payment.route.result.strategy.PayRouteStrategyResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/// # 商户移动端-通道路由配置服务 +/// +/// 转发至 [PayRouteConfigService] 和 [PayProviderMethodService] +@Service +@RequiredArgsConstructor +public class AppMerchantPayRouteService { + + private final PayRouteConfigService configService; + private final PayProviderMethodService payProviderMethodService; + + /// 已启用渠道支付方式扁平列表 + public List listMethodDirectoryFlat() { + return payProviderMethodService.listDirectoryFlat(); + } + + /// 获取或初始化应用路由策略 + public PayRouteStrategyResult getOrInitByAppId(String appId) { + return configService.getOrInitByAppId(appId); + } + + /// 更新路由策略 + public PayRouteStrategyResult updateStrategy(PayRouteStrategyParam param) { + return configService.updateStrategy(param); + } + + /// 查询场景模式配置列表 + public List listSceneByAppId(String appId) { + return configService.listSceneByAppId(appId); + } + + /// 批量保存场景模式配置 + public void saveSceneBatch(PayRouteSceneConfigBatchParam param) { + configService.saveSceneBatch(param); + } + + /// 场景模式通道商户候选(批量) + public Map> listSceneChannelMhCandidatesBatch(String appId) { + return configService.listSceneChannelMchCandidatesBatch(appId); + } + + /// 场景模式支付能力候选(批量) + public Map> listSceneCapabilityCandidatesBatch(PayRouteSceneCapabilityBatchParam param) { + return configService.listSceneCapabilityCandidatesBatch(param); + } + + /// 目录项下通道商户候选 + public List listSceneChannelMhCandidates(String appId, String provider, String method) { + return configService.listSceneChannelMchCandidatesForMethod(appId, provider, method); + } + + /// 目录项与通道商户下支付能力候选 + public List listSceneCapabilityCandidates(String appId, String provider, String method, String channelMchNo) { + return configService.listSceneCapabilityCandidatesForMethod(appId, provider, method, channelMchNo); + } + + /// 查询基础模式配置列表 + public List listBasicByAppId(String appId) { + return configService.listBasicByAppId(appId); + } + + /// 批量保存基础模式配置 + public void saveBasicBatch(PayRouteBasicConfigBatchParam param) { + configService.saveBasicBatch(param); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/store/AppMerchantStoreInfoService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/store/AppMerchantStoreInfoService.java new file mode 100644 index 000000000..25b5cc719 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/store/AppMerchantStoreInfoService.java @@ -0,0 +1,45 @@ +package cn.daxpay.open.payment.app.merchant.service.store; + +import cn.daxpay.open.payment.merchant.param.store.MchStoreInfoParam; +import cn.daxpay.open.payment.merchant.param.store.MchStoreInfoQuery; +import cn.daxpay.open.payment.merchant.result.store.MchStoreInfoResult; +import cn.daxpay.open.payment.merchant.service.store.MchStoreInfoService; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-门店信息服务 +/// +/// 转发至 core [MchStoreInfoService] +@Service +@RequiredArgsConstructor +public class AppMerchantStoreInfoService { + + private final MchStoreInfoService mchStoreInfoService; + + /// 门店分页 + public PageResult page(PageParam pageParam, MchStoreInfoQuery query) { + return mchStoreInfoService.page(pageParam, query); + } + + /// 根据id查询门店 + public MchStoreInfoResult findById(Long id) { + return mchStoreInfoService.findById(id); + } + + /// 新增门店 + public void add(MchStoreInfoParam param) { + mchStoreInfoService.add(param); + } + + /// 修改门店 + public void update(MchStoreInfoParam param) { + mchStoreInfoService.update(param); + } + + /// 删除门店 + public void delete(Long id) { + mchStoreInfoService.delete(id); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantGatewayPayOrderService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantGatewayPayOrderService.java new file mode 100644 index 000000000..586dccf79 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantGatewayPayOrderService.java @@ -0,0 +1,29 @@ +package cn.daxpay.open.payment.app.merchant.service.trade; + +import cn.daxpay.open.payment.merchant.service.trade.MchGatewayPayOrderService; +import cn.daxpay.open.payment.trade.order.param.GatewayPayOrderQuery; +import cn.daxpay.open.payment.trade.order.result.GatewayPayOrderResult; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-网关支付业务单服务 +/// +/// 转发至 [MchGatewayPayOrderService] +@Service +@RequiredArgsConstructor +public class AppMerchantGatewayPayOrderService { + + private final MchGatewayPayOrderService mchGatewayPayOrderService; + + /// 分页查询 + public PageResult page(PageParam pageParam, GatewayPayOrderQuery query) { + return mchGatewayPayOrderService.page(pageParam, query); + } + + /// 详情查询 + public GatewayPayOrderResult findById(Long id) { + return mchGatewayPayOrderService.findById(id); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantMchNoticeService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantMchNoticeService.java new file mode 100644 index 000000000..3c84abd1d --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantMchNoticeService.java @@ -0,0 +1,29 @@ +package cn.daxpay.open.payment.app.merchant.service.trade; + +import cn.daxpay.open.payment.merchant.service.trade.MchNoticeService; +import cn.daxpay.open.payment.trade.notice.param.MchNoticeTaskQuery; +import cn.daxpay.open.payment.trade.notice.result.MchNoticeTaskResult; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-商户出站通知服务 +/// +/// 转发至 [MchNoticeService] +@Service +@RequiredArgsConstructor +public class AppMerchantMchNoticeService { + + private final MchNoticeService mchNoticeService; + + /// 通知任务分页 + public PageResult pageTask(PageParam pageParam, MchNoticeTaskQuery query) { + return mchNoticeService.pageTask(pageParam, query); + } + + /// 通知任务详情 + public MchNoticeTaskResult findTaskById(Long id) { + return mchNoticeService.findTaskById(id); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantNormalPayOrderService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantNormalPayOrderService.java new file mode 100644 index 000000000..47a21eca1 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantNormalPayOrderService.java @@ -0,0 +1,29 @@ +package cn.daxpay.open.payment.app.merchant.service.trade; + +import cn.daxpay.open.payment.trade.order.param.NormalPayOrderQuery; +import cn.daxpay.open.payment.trade.order.result.NormalPayOrderResult; +import cn.daxpay.open.payment.trade.order.service.NormalPayOrderService; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-普通支付业务单服务 +/// +/// 转发至 core [NormalPayOrderService] +@Service +@RequiredArgsConstructor +public class AppMerchantNormalPayOrderService { + + private final NormalPayOrderService normalPayOrderService; + + /// 分页查询 + public PageResult page(PageParam pageParam, NormalPayOrderQuery query) { + return normalPayOrderService.page(pageParam, query); + } + + /// 详情查询 + public NormalPayOrderResult findById(Long id) { + return normalPayOrderService.findById(id); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantPayCallbackRecordService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantPayCallbackRecordService.java new file mode 100644 index 000000000..c4bef051b --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantPayCallbackRecordService.java @@ -0,0 +1,29 @@ +package cn.daxpay.open.payment.app.merchant.service.trade; + +import cn.daxpay.open.payment.merchant.service.trade.MchPayCallbackRecordService; +import cn.daxpay.open.payment.trade.record.param.PayCallbackRecordQuery; +import cn.daxpay.open.payment.trade.record.result.PayCallbackRecordResult; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-通道回调记录服务 +/// +/// 转发至 [MchPayCallbackRecordService] +@Service +@RequiredArgsConstructor +public class AppMerchantPayCallbackRecordService { + + private final MchPayCallbackRecordService mchPayCallbackRecordService; + + /// 分页查询 + public PageResult page(PageParam pageParam, PayCallbackRecordQuery query) { + return mchPayCallbackRecordService.page(pageParam, query); + } + + /// 详情查询 + public PayCallbackRecordResult findById(Long id) { + return mchPayCallbackRecordService.findById(id); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantPayTradeService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantPayTradeService.java new file mode 100644 index 000000000..f0c76d7d6 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantPayTradeService.java @@ -0,0 +1,29 @@ +package cn.daxpay.open.payment.app.merchant.service.trade; + +import cn.daxpay.open.payment.trade.order.param.PayTradeQuery; +import cn.daxpay.open.payment.trade.order.result.PayTradeResult; +import cn.daxpay.open.payment.trade.order.service.PayTradeService; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-资金交易凭证服务 +/// +/// 转发至 core [PayTradeService] +@Service +@RequiredArgsConstructor +public class AppMerchantPayTradeService { + + private final PayTradeService payTradeService; + + /// 分页查询 + public PageResult page(PageParam pageParam, PayTradeQuery query) { + return payTradeService.page(pageParam, query); + } + + /// 详情查询 + public PayTradeResult findById(Long id) { + return payTradeService.findById(id); + } +} diff --git a/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantRefundOrderService.java b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantRefundOrderService.java new file mode 100644 index 000000000..346b4c547 --- /dev/null +++ b/daxpay-payment/daxpay-payment-app-merchant/src/main/java/cn/daxpay/open/payment/app/merchant/service/trade/AppMerchantRefundOrderService.java @@ -0,0 +1,29 @@ +package cn.daxpay.open.payment.app.merchant.service.trade; + +import cn.daxpay.open.payment.trade.order.param.RefundOrderQuery; +import cn.daxpay.open.payment.trade.order.result.RefundOrderResult; +import cn.daxpay.open.payment.trade.order.service.RefundOrderService; +import cn.daxpay.open.platform.core.rest.param.PageParam; +import cn.daxpay.open.platform.core.rest.result.PageResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 商户移动端-退款订单服务 +/// +/// 转发至 core [RefundOrderService] +@Service +@RequiredArgsConstructor +public class AppMerchantRefundOrderService { + + private final RefundOrderService refundOrderService; + + /// 分页查询 + public PageResult page(PageParam pageParam, RefundOrderQuery query) { + return refundOrderService.page(pageParam, query); + } + + /// 详情查询 + public RefundOrderResult findById(Long id) { + return refundOrderService.findById(id); + } +} diff --git a/daxpay-payment/pom.xml b/daxpay-payment/pom.xml index 2c275a895..26847a36a 100644 --- a/daxpay-payment/pom.xml +++ b/daxpay-payment/pom.xml @@ -18,6 +18,7 @@ daxpay-payment-core daxpay-payment-admin daxpay-payment-app-admin + daxpay-payment-app-merchant daxpay-payment-unipay daxpay-payment-merchant diff --git a/daxpay-start/pom.xml b/daxpay-start/pom.xml index 9c9b8b807..90a4658ce 100644 --- a/daxpay-start/pom.xml +++ b/daxpay-start/pom.xml @@ -58,6 +58,13 @@ ${project.version} + + + cn.daxpay.open + daxpay-payment-app-merchant + ${project.version} + + cn.daxpay.open