From 2b785420cce9e0bdfaa9d08d06667b772f6d5e6e Mon Sep 17 00:00:00 2001 From: bootx Date: Mon, 25 Aug 2025 23:41:01 +0800 Subject: [PATCH] =?UTF-8?q?feat=203.0.0=E7=89=88=E6=9C=AC=E5=85=A8?= =?UTF-8?q?=E9=9D=A2=E5=8D=87=E7=BA=A7,=20=E5=A2=9E=E5=8A=A0=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=95=86+=E5=A4=9A=E5=95=86=E6=88=B7=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 39 +-- _doc/ChangeLog.md | 0 _doc/Task.md | 0 .../common/config/BootxConfigProperties.java | 4 - .../AlipayAllocReceiverBindController.java | 98 ------ .../AlipayAllocReceiverController.java | 47 --- .../payment/AlipayCallbackController.java | 14 +- .../payment/AlipayConfigController.java | 6 +- .../AlipayNoticeReceiverController.java | 12 +- .../payment/AlipayRedirectUrlController.java | 12 +- .../AlipayAllocReceiverBindConvert.java | 21 -- .../convert/AlipayAllocReceiverConvert.java | 23 -- .../alipay/convert/AlipayMccConstConvert.java | 19 ++ .../convert/AlipaySubConfigConvert.java | 23 ++ .../AlipayAllocReceiverBindManager.java | 35 -- .../AlipayAllocReceiverBindMapper.java | 14 - .../dao/assist/AlipayMccConstManager.java | 18 + .../dao/assist/AlipayMccConstMapper.java | 14 + .../allocation/AlipayAllocReceiver.java | 88 ----- .../allocation/AlipayAllocReceiverBind.java | 67 ---- .../alipay/entity/assist/AlipayMccConst.java | 38 +++ .../alipay/entity/config/AliPayConfig.java | 16 +- .../alipay/entity/config/AlipaySubConfig.java | 78 +++++ .../alipay/enums/AlipayApplyTypeEnum.java | 20 ++ .../alipay/enums/AlipayBatchStatusEnum.java | 22 ++ .../alipay/enums/AlipayOtherContractEnum.java | 43 +++ .../AlipayAllocReceiverBindParam.java | 61 ---- .../AlipayAllocReceiverBindQuery.java | 57 ---- .../allocation/AlipayAllocReceiverParam.java | 61 ---- .../param/config/AlipayConfigParam.java | 4 + .../param/config/AlipayIsvConfigParam.java | 79 +++++ .../param/config/AlipaySubConfigParam.java | 44 +++ .../channel/alipay/param/pay/AlipayParam.java | 2 +- .../AlipayAllocReceiverBindResult.java | 59 ---- .../allocation/AlipayAllocReceiverResult.java | 52 --- .../result/config/AlipayConfigResult.java | 4 + .../result/config/AlipayIsvConfigResult.java | 82 +++++ .../result/config/AlipaySubConfigResult.java | 41 +++ .../sdk/contract/CreatContractParam.java | 63 ---- .../sdk/contract/QueryContractParam.java | 18 - .../AlipayAllocReceiverBindService.java | 234 ------------- .../AlipayAllocReceiverService.java | 90 ----- .../allocation/AlipayAllocationService.java | 190 ----------- .../callback/AlipayCallbackService.java | 17 +- .../payment/close/AlipayCloseService.java | 4 +- .../payment/config/AlipayConfigService.java | 55 ++- .../payment/extra/AlipayAuthService.java | 8 +- .../notice/AlipayTransferNoticeService.java | 15 +- .../service/payment/pay/AliPayService.java | 11 +- .../redirect/AlipayRedirectUrlService.java | 14 +- .../payment/refund/AlipayRefundService.java | 4 +- .../payment/sync/AlipayRefundSyncService.java | 8 +- .../payment/sync/AlipaySyncService.java | 16 +- .../sync/AlipayTransferSyncService.java | 8 +- .../transfer/AlipayTransferService.java | 4 +- .../strategy/merchant/AliPayStrategy.java | 9 +- .../merchant/AliPaySyncTransferStrategy.java | 4 +- .../merchant/AlipayAllocationStrategy.java | 62 ---- .../strategy/merchant/AlipayAuthStrategy.java | 2 +- .../merchant/AlipayChannelBasicStrategy.java | 43 +++ .../merchant/AlipayCloseStrategy.java | 2 +- .../merchant/AlipayGatewayPayStrategy.java | 2 +- .../merchant/AlipayRefundStrategy.java | 4 +- .../merchant/AlipaySyncOrderStrategy.java | 4 +- .../merchant/AlipaySyncRefundStrategy.java | 6 +- .../merchant/AlipayTransferStrategy.java | 4 +- .../sub/AlipaySubAllocationStrategy.java | 62 ---- .../strategy/sub/AlipaySubAuthStrategy.java | 2 +- .../sub/AlipaySubChannelBasicStrategy.java | 43 +++ .../strategy/sub/AlipaySubCloseStrategy.java | 2 +- .../sub/AlipaySubGatewayPayStrategy.java | 4 +- .../strategy/sub/AlipaySubPayStrategy.java | 9 +- .../strategy/sub/AlipaySubRefundStrategy.java | 7 +- .../sub/AlipaySubSyncOrderStrategy.java | 4 +- .../sub/AlipaySubSyncRefundStrategy.java | 6 +- .../UnionPayCallbackController.java | 2 +- .../controller/UnionPayConfigController.java | 3 + .../UnionPayRedirectUrlController.java | 2 +- .../union/entity/config/UnionPayConfig.java | 2 +- .../union/result/UnionPayConfigResult.java | 2 +- .../service/config/UnionPayConfigService.java | 25 +- .../WechatAllocReceiverBindController.java | 98 ------ .../WechatAllocReceiverController.java | 48 --- .../isv/WechatIsvConfigController.java | 54 +++ .../payment/WechatPayCallbackController.java | 34 +- .../payment/WechatPayConfigController.java | 23 ++ .../WechatAllocReceiverBindConvert.java | 21 -- .../convert/WechatAllocReceiverConvert.java | 23 -- .../convert/WechatIsvConfigConvert.java | 25 ++ .../convert/WechatPaySubConfigConvert.java | 23 ++ .../WechatAllocReceiverBindManager.java | 33 -- .../WechatAllocReceiverBindMapper.java | 14 - .../allocation/WechatAllocReceiver.java | 84 ----- .../allocation/WechatAllocReceiverBind.java | 59 ---- .../wechat/entity/config/WechatIsvConfig.java | 110 ++++++ .../wechat/entity/config/WechatPayConfig.java | 22 +- .../entity/config/WechatPaySubConfig.java | 103 ++++++ .../wechat/enums/WechatAllocReceiverEnum.java | 21 -- .../wechat/enums/WechatAllocStatusEnum.java | 41 --- .../WechatAllocReceiverBindParam.java | 66 ---- .../WechatAllocReceiverBindQuery.java | 58 ---- .../allocation/WechatAllocReceiverParam.java | 51 --- .../param/config/WechatIsvConfigParam.java | 87 +++++ .../param/config/WechatPayConfigParam.java | 5 + .../param/config/WechatPaySubConfigParam.java | 50 +++ .../transfer/TransferCreateV3Request.java | 3 +- .../WechatAllocReceiverBindResult.java | 56 ---- .../allocation/WechatAllocReceiverResult.java | 43 --- .../result/assist/WechatMccConstResult.java | 33 -- .../result/config/WechatIsvConfigResult.java | 98 ++++++ .../result/config/WechatPayConfigResult.java | 4 + .../config/WechatPaySubConfigResult.java | 56 ++++ .../WechatAllocReceiverBindService.java | 177 ---------- .../WechatAllocReceiverService.java | 88 ----- .../service/isv/WechatIsvConfigService.java | 165 +++++++++ .../WeChatPayAllocationV2Service.java | 170 ---------- .../WeChatPayAllocationV3Service.java | 170 ---------- .../WeChatPaySubAllocationV2Service.java | 170 ---------- .../WeChatPaySubAllocationV3Service.java | 170 ---------- .../WechatPayAllocReceiverV2Service.java | 102 ------ .../WechatPayAllocReceiverV3Service.java | 103 ------ .../WechatPaySubAllocReceiverV2Service.java | 101 ------ .../WechatPaySubAllocReceiverV3Service.java | 103 ------ .../callback/WechatPayCallbackService.java | 100 ++++-- .../callback/WechatRefundCallbackService.java | 26 +- .../WechatTransferCallbackService.java | 24 +- .../close/WechatPayCloseV2Service.java | 8 +- .../close/WechatPayCloseV3Service.java | 10 +- .../close/WechatPaySubCloseV2Service.java | 8 +- .../close/WechatPaySubCloseV3Service.java | 14 +- .../config/WechatPayConfigService.java | 171 +++++++--- .../pay/isv/WechatPaySubV2Service.java | 36 +- .../pay/isv/WechatPaySubV3Service.java | 38 +-- .../pay/merchant/WechatPayV2Service.java | 37 +- .../pay/merchant/WechatPayV3Service.java | 47 +-- .../payment/refund/WechatRefundV2Service.java | 4 +- .../payment/refund/WechatRefundV3Service.java | 4 +- .../refund/WechatSubRefundV2Service.java | 4 +- .../refund/WechatSubRefundV3Service.java | 6 +- .../sync/pay/WechatPaySyncV2Service.java | 25 +- .../sync/pay/WechatPaySyncV3Service.java | 21 +- .../sync/pay/WechatSubPaySyncV2Service.java | 27 +- .../sync/pay/WechatSubPaySyncV3Service.java | 22 +- .../refund/WechatRefundSyncV2Service.java | 15 +- .../refund/WechatRefundSyncV3Service.java | 14 +- .../refund/WechatSubRefundSyncV2Service.java | 12 +- .../refund/WechatSubRefundSyncV3Service.java | 14 +- .../transfer/WechatTransferSyncV3Service.java | 12 +- .../transfer/WechatTransferV3Service.java | 14 +- .../merchant/WechatAllocationStrategy.java | 85 ----- .../strategy/merchant/WechatAuthStrategy.java | 8 +- .../merchant/WechatChannelBasicStrategy.java | 43 +++ .../merchant/WechatCloseStrategy.java | 8 +- .../merchant/WechatGatewayPayStrategy.java | 4 +- .../strategy/merchant/WechatPayStrategy.java | 8 +- .../merchant/WechatRefundStrategy.java | 6 +- .../merchant/WechatSyncPayStrategy.java | 6 +- .../merchant/WechatSyncRefundStrategy.java | 6 +- .../merchant/WechatSyncTransferStrategy.java | 6 +- .../merchant/WechatTransferStrategy.java | 10 +- .../sub/WechatSubAllocationStrategy.java | 86 ----- .../strategy/sub/WechatSubAuthStrategy.java | 8 +- .../sub/WechatSubChannelBasicStrategy.java | 43 +++ .../strategy/sub/WechatSubCloseStrategy.java | 8 +- .../sub/WechatSubGatewayPayStrategy.java | 10 +- .../strategy/sub/WechatSubPayStrategy.java | 8 +- .../strategy/sub/WechatSubRefundStrategy.java | 6 +- .../sub/WechatSubSyncPayStrategy.java | 6 +- .../sub/WechatSubSyncRefundStrategy.java | 8 +- .../channel/wechat/util/WechatPayUtil.java | 5 +- ...DaxpayStart.java => DaxpayUnionStart.java} | 9 +- .../server}/aop/PaymentVerifyAspect.java | 14 +- .../qrcode/CashierCodeConfigController.java | 138 ++++++++ .../qrcode/CashierCodeTemplateController.java | 72 ++++ .../config/IsvChannelConfigController.java | 44 +++ .../gateway/IsvAggregateConfigController.java | 141 ++++++++ .../gateway/IsvCashierConfigController.java | 124 +++++++ .../IsvGatewayPayConfigController.java | 49 +++ .../admin/merchant/MchAppAdminController.java | 37 +- .../merchant/MerchantAdminController.java | 84 +++++ .../IndexTradeReportAdminController.java | 88 +++++ .../gateway/ChannelAuthController.java | 8 +- .../gateway/GatewayCashierController.java | 39 +-- .../gateway/GatewayPayController.java | 17 +- .../gateway/TestCallbackController.java | 11 +- .../gateway/UniQueryController.java | 10 +- .../controller/gateway/UniSyncController.java | 10 +- .../gateway/UniTradeController.java | 12 +- .../merchant/info/MchAppController.java | 89 +++++ .../merchant/info/MerchantController.java | 51 +++ .../merchant/info/MerchantUserController.java | 125 +++++++ .../IndexTradeReportMerchantController.java | 27 +- .../daxpay/server/enums/UserRoleEnum.java | 19 ++ .../event/MerchantNoticeEventService.java | 32 +- .../server}/event/TradeOrderEventService.java | 31 +- .../server/filter/MchContextLocalFilter.java | 64 ++++ .../server/handler/ClientRouterCheck.java | 57 ++++ .../handler/CustomTenantLineHandler.java | 95 ++++++ .../MchTenantInterceptorConfiguration.java | 29 ++ .../DataScopeInterceptorConfiguration.java | 23 ++ .../interceptor/MchDataScopeHandler.java | 33 ++ .../service/admin/MerchantAdminService.java | 182 ++++++++++ .../{ => common}/ClientCodeServiceImpl.java | 7 +- .../common/PaymentAssistServiceImpl.java | 122 +++++++ .../daxpay/server/task/OrderSyncTask.java | 308 +++++++++++++++++ .../src/main/resources/application-dev.yml | 54 +-- .../src/main/resources/application-prod.yml | 75 +++++ .../src/main/resources/application.yml | 4 +- .../allocation/AllocConfigController.java | 54 --- .../allocation/AllocGroupController.java | 138 -------- .../allocation/AllocOrderController.java | 100 ------ .../allocation/AllocReceiverController.java | 69 ---- .../ChannelAuthAssistController.java | 9 +- .../assist/ChannelBasicController.java | 37 ++ .../DevelopTradeController.java | 9 +- .../assist/MchAppQueryController.java | 64 ++++ .../assist/MerchantQueryController.java | 47 +++ .../assist/TerminalDeviceController.java | 85 ----- .../controller/common/TestController.java | 52 --- .../config/ChannelConfigController.java | 11 +- .../MerchantNotifyConfigController.java | 8 +- .../config/PlatformConfigController.java | 67 +++- .../constant/ApiConstController.java | 12 +- .../constant/ChannelConstController.java | 27 +- .../MerchantNotifyConstController.java | 12 +- .../constant/MethodConstController.java | 12 +- .../constant/TerminalConstController.java | 38 +++ .../device/qrcode/CashierCodeController.java | 131 ++++++++ .../terminal/ChannelTerminalController.java | 91 +++++ .../terminal/TerminalDeviceController.java | 125 +++++++ .../gateway/AggregateConfigController.java | 13 +- .../gateway/CashierCodeConfigController.java | 131 -------- .../gateway/CashierConfigController.java | 22 +- .../gateway/GatewayPayConfigController.java | 21 +- .../gateway/UniAllocationController.java | 51 --- .../notice/MerchantCallbackController.java | 13 +- .../notice/MerchantNotifyController.java | 13 +- .../controller/order/PayOrderController.java | 29 +- .../order/RefundOrderController.java | 13 +- .../order/TransferOrderController.java | 11 +- .../record/CallbackRecordController.java | 9 +- .../record/PayCloseRecordController.java | 9 +- .../record/TradeFlowRecordController.java | 11 +- .../record/TradeSyncRecordController.java | 9 +- .../daxpay/core/code/MerchantTypeGroup.java | 14 - .../daxpay/core/context/CallbackLocal.java | 43 ++- .../core/context/PaymentClientLocal.java | 2 +- .../daxpay/core/context/PaymentContext.java | 2 +- ...AppLocal.java => PaymentReqInfoLocal.java} | 29 +- .../core/enums/AllocDetailResultEnum.java | 25 -- .../core/enums/AllocOrderResultEnum.java | 23 -- .../core/enums/AllocOrderStatusEnum.java | 25 -- .../core/enums/AllocReceiverTypeEnum.java | 42 --- .../core/enums/AllocRelationTypeEnum.java | 29 -- .../core/enums/AllocationResultEnum.java | 24 -- .../core/enums/AllocationStatusEnum.java | 27 -- .../core/enums/CashierAmountTypeEnum.java | 19 ++ ...odeTypeEnum.java => CashierSceneEnum.java} | 14 +- .../core/enums/ChannelAuthTypeEnum.java | 4 +- .../daxpay/core/enums/ChannelEnum.java | 10 +- .../core/enums/ChannelTerminalStatusEnum.java | 23 ++ .../daxpay/core/enums/IsvApplyStatusEnum.java | 39 +++ .../daxpay/core/enums/IsvApplyTypeEnum.java | 23 ++ .../daxpay/core/enums/IsvStatusEnum.java | 26 ++ .../daxpay/core/enums/MerchantTypeEnum.java | 41 --- .../daxpay/core/enums/PayMethodEnum.java | 23 +- .../daxpay/core/enums/TerminalTypeEnum.java | 24 ++ .../daxpay/core/enums/TradeTypeEnum.java | 2 + .../daxpay/core/enums/WalletFlowTypeEnum.java | 23 ++ .../daxpay/core/param/PaymentCommonParam.java | 6 + .../allocation/order/AllocFinishParam.java | 23 -- .../allocation/order/AllocSyncParam.java | 26 -- .../allocation/order/AllocationParam.java | 101 ------ .../order/QueryAllocOrderParam.java | 23 -- .../receiver/AllocReceiverAddParam.java | 78 ----- .../receiver/AllocReceiverQueryParam.java | 31 -- .../receiver/AllocReceiverRemoveParam.java | 24 -- .../gateway/GatewayCashierCodeAuthParam.java | 12 +- .../GatewayCashierCodeAuthUrlParam.java | 12 +- .../gateway/GatewayCashierCodePayParam.java | 12 +- .../core/param/gateway/GatewayPayParam.java | 6 + .../daxpay/core/result/DaxNoticeResult.java | 4 + .../result/allocation/AllocSyncResult.java | 32 -- .../result/allocation/AllocationResult.java | 39 --- .../allocation/order/AllocDetailResult.java | 66 ---- .../allocation/order/AllocOrderResult.java | 109 ------ .../receiver/AllocReceiverResult.java | 52 --- .../core/result/trade/pay/PayOrderResult.java | 13 +- .../dromara/daxpay/core/util/PaySignUtil.java | 3 +- .../org/dromara/daxpay/core/util/PayUtil.java | 10 + .../daxpay/core/util/TradeNoGenerateUtil.java | 22 ++ .../bo/allocation/AllocStartResultBo.java | 36 -- .../bo/allocation/AllocSyncResultBo.java | 16 - .../service/bo/qrcode/CashierCodeIcon.java | 47 +++ .../daxpay/service/bo/trade/PayResultBo.java | 32 -- .../service/common/code/AliYunOCRType.java | 16 + .../service/{ => common}/code/DaxPayCode.java | 15 +- .../service/common/code/OCRProperties.java | 24 ++ .../daxpay/service/common/code/OCRType.java | 17 + .../common/convert/PlatformConfigConvert.java | 27 ++ .../config/PlatformBasicConfigManager.java} | 6 +- .../dao/config/PlatformBasicConfigMapper.java | 14 + .../dao/config/PlatformUrlConfigManager.java | 18 + .../dao/config/PlatformUrlConfigMapper.java | 14 + .../config/PlatformWebsiteConfigManage.java | 18 + .../config/PlatformWebsiteConfigMapper.java | 14 + .../entity/config/PlatformBasicConfig.java | 46 +++ .../entity/config/PlatformUrlConfig.java | 65 ++++ .../entity/config/PlatformWebsiteConfig.java | 78 +++++ .../handler/DaxUserInfoStatusCheck.java | 51 +++ .../MchTenantMetaObjectHandler.java | 12 +- .../config/PlatformBasicConfigParam.java | 39 +++ .../config/PlatformCashoutsConfigParam.java | 50 +++ .../param/config/PlatformUrlConfigParam.java | 37 ++ .../config/PlatformWebsiteConfigPram.java | 83 +++++ .../common/properties/DaxPayProperties.java | 10 +- .../config/PlatformBasicConfigResult.java | 33 ++ .../config/PlatformUrlConfigResult.java | 39 +++ .../config/PlatformWebsiteConfigResult.java | 83 +++++ .../common/result/ocr/BankCardOCRResult.java | 26 ++ .../result/ocr/BusinessLicenseOCRResult.java | 83 +++++ .../common/result/ocr/IdCardOCRResult.java | 61 ++++ .../service/config/PlatformConfigService.java | 156 +++++++++ .../allocation/AllocConfigConvert.java | 22 -- .../convert/allocation/AllocGroupConvert.java | 21 -- .../allocation/AllocGroupReceiverConvert.java | 21 -- .../convert/allocation/AllocOrderConvert.java | 32 -- .../allocation/AllocReceiverConvert.java | 28 -- .../convert/assist/TerminalDeviceConvert.java | 22 -- .../convert/config/PlatformConfigConvert.java | 18 - .../gateway/CashierCodeItemConfigConvert.java | 21 -- .../dao/allocation/AllocConfigManager.java | 35 -- .../dao/allocation/AllocConfigMapper.java | 14 - .../allocation/order/AllocDetailManager.java | 23 -- .../allocation/order/AllocDetailMapper.java | 14 - .../allocation/order/AllocOrderManager.java | 62 ---- .../allocation/order/AllocOrderMapper.java | 14 - .../receiver/AllocGroupManager.java | 78 ----- .../allocation/receiver/AllocGroupMapper.java | 14 - .../receiver/AllocGroupReceiverManager.java | 47 --- .../receiver/AllocGroupReceiverMapper.java | 14 - .../receiver/AllocReceiverManager.java | 79 ----- .../receiver/AllocReceiverMapper.java | 14 - .../dao/config/PlatformConfigMapper.java | 14 - .../dao/gateway/CashierCodeConfigManager.java | 38 --- .../gateway/CashierCodeItemConfigManager.java | 69 ---- .../gateway/CashierCodeItemConfigMapper.java | 14 - .../qrcode}/CashierCodeConfigConvert.java | 8 +- .../convert/qrcode/CashierCodeConvert.java | 21 ++ .../qrcode/CashierCodeSceneConfigConvert.java | 21 ++ .../qrcode/CashierCodeTemplateConvert.java | 21 ++ .../terminal/TerminalDeviceConvert.java | 29 ++ .../config/CashierCodeConfigManager.java | 33 ++ .../config}/CashierCodeConfigMapper.java | 4 +- .../config/CashierCodeSceneConfigManager.java | 69 ++++ .../config/CashierCodeSceneConfigMapper.java | 14 + .../dao/qrcode/info/CashierCodeManager.java | 51 +++ .../dao/qrcode/info/CashierCodeMapper.java | 14 + .../template/CashierCodeTemplateManager.java | 33 ++ .../template/CashierCodeTemplateMapper.java | 14 + .../dao/terminal/ChannelTerminalManager.java | 86 +++++ .../dao/terminal/ChannelTerminalMapper.java | 14 + .../dao/terminal}/TerminalDeviceManager.java | 6 +- .../dao/terminal}/TerminalDeviceMapper.java | 4 +- .../qrcode/config}/CashierCodeConfig.java | 21 +- .../config/CashierCodeSceneConfig.java} | 39 ++- .../entity/qrcode/info/CashierCode.java | 67 ++++ .../qrcode/template/CashierCodeTemplate.java | 65 ++++ .../entity/terminal/ChannelTerminal.java | 89 +++++ .../entity/terminal}/TerminalDevice.java | 18 +- .../device/enums/AudioBindTypeEnum.java | 22 ++ .../param/commom/AssignMerchantParam.java | 29 ++ .../config}/CashierCodeConfigParam.java | 16 +- .../qrcode/config/CashierCodeConfigQuery.java | 22 ++ .../config/CashierCodeSceneConfigParam.java} | 26 +- .../qrcode/info/CashierCodeBatchParam.java | 46 +++ .../qrcode/info/CashierCodeCreateParam.java | 38 +++ .../param/qrcode/info/CashierCodeQuery.java | 31 ++ .../qrcode/info/CashierCodeUpdateParam.java | 47 +++ .../template/CashierCodeTemplateParam.java | 61 ++++ .../template/CashierCodeTemplateQuery.java | 19 ++ .../terminal/ChannelGetAndCreateParam.java | 25 ++ .../param/terminal/ChannelTerminalParam.java | 40 +++ .../param/terminal}/TerminalDeviceParam.java | 2 +- .../param/terminal}/TerminalDeviceQuery.java | 4 +- .../result/audio/AudioDeviceConfigResult.java | 35 ++ .../result/audio/AudioDeviceResult.java | 55 +++ .../result/pos/PosDeviceConfigResult.java | 35 ++ .../device/result/pos/PosDeviceResult.java | 43 +++ .../result/print/PrintDeviceConfigResult.java | 35 ++ .../result/print/PrintDeviceResult.java | 43 +++ .../config/CashierCodeConfigResult.java | 14 +- .../config/CashierCodeSceneConfigResult.java} | 28 +- .../result/qrcode/info/CashierCodeResult.java | 53 +++ .../template/CashierCodeTemplateResult.java | 60 ++++ .../terminal/ChannelTerminalResult.java | 59 ++++ .../terminal}/TerminalDeviceResult.java | 4 +- .../qrcode/CashierCodeConfigService.java | 165 +++++++++ .../service/qrcode/CashierCodeService.java | 262 +++++++++++++++ .../qrcode/CashierCodeTemplateService.java | 71 ++++ .../terminal/ChannelTerminalService.java | 162 +++++++++ .../terminal/TerminalDeviceService.java | 183 ++++++++++ .../entity/allocation/AllocConfig.java | 61 ---- .../allocation/order/AllocAndDetail.java | 10 - .../entity/allocation/order/AllocDetail.java | 80 ----- .../entity/allocation/order/AllocOrder.java | 117 ------- .../allocation/receiver/AllocGroup.java | 51 --- .../receiver/AllocGroupReceiver.java | 38 --- .../allocation/receiver/AllocReceiver.java | 60 ---- .../service/entity/config/PlatformConfig.java | 53 --- .../service/event/AllocationEventService.java | 85 ----- .../cache/IsvChannelConfigCacheService.java | 32 ++ .../config/IsvChannelConfigConvert.java | 19 ++ .../IsvAggregateBarPayConfigConvert.java | 21 ++ .../gateway/IsvAggregatePayConfigConvert.java | 21 ++ .../gateway/IsvCashierGroupConfigConvert.java | 21 ++ .../gateway/IsvCashierItemConfigConvert.java | 21 ++ .../gateway/IsvGatewayPayConfigConvert.java | 21 ++ .../dao/config/IsvChannelConfigManager.java | 71 ++++ .../dao/config/IsvChannelConfigMapper.java | 14 + .../IsvAggregateBarPayConfigManager.java | 49 +++ .../IsvAggregateBarPayConfigMapper.java | 14 + .../gateway/IsvAggregatePayConfigManager.java | 50 +++ .../gateway/IsvAggregatePayConfigMapper.java | 14 + .../gateway/IsvCashierGroupConfigManager.java | 40 +++ .../gateway/IsvCashierGroupConfigMapper.java | 14 + .../gateway/IsvCashierItemConfigManager.java | 49 +++ .../gateway/IsvCashierItemConfigMapper.java | 14 + .../gateway/IsvGatewayPayConfigManager.java | 27 ++ .../gateway/IsvGatewayPayConfigMapper.java | 14 + .../isv/entity/config/IsvChannelConfig.java | 45 +++ .../gateway/IsvAggregateBarPayConfig.java | 65 ++++ .../entity/gateway/IsvAggregatePayConfig.java | 91 +++++ .../entity/gateway/IsvCashierGroupConfig.java | 61 ++++ .../entity/gateway/IsvCashierItemConfig.java | 101 ++++++ .../entity/gateway/IsvGatewayPayConfig.java | 79 +++++ .../IsvAggregateBarPayConfigParam.java | 61 ++++ .../gateway/IsvAggregatePayConfigParam.java | 83 +++++ .../gateway/IsvCashierGroupConfigParam.java | 57 ++++ .../gateway/IsvCashierItemConfigParam.java | 84 +++++ .../gateway/IsvGatewayPayConfigParam.java | 67 ++++ .../result/config/IsvChannelConfigResult.java | 35 ++ .../IsvAggregateBarPayConfigResult.java | 49 +++ .../gateway/IsvAggregatePayConfigResult.java | 70 ++++ .../gateway/IsvCashierGroupConfigResult.java | 53 +++ .../gateway/IsvCashierItemConfigResult.java | 74 ++++ .../gateway/IsvGatewayPayConfigResult.java | 48 +++ .../config/IsvChannelConfigService.java | 55 +++ .../gateway/IsvAggregateConfigService.java | 152 +++++++++ .../gateway/IsvCashierConfigService.java | 155 +++++++++ .../gateway/IsvGatewayPayConfigService.java | 47 +++ .../cache/ChannelConfigCacheService.java | 6 +- .../cache/MchAppCacheService.java | 10 +- .../merchant/cache/MerchantCacheService.java | 29 ++ .../convert/app}/MchAppConvert.java | 8 +- .../convert/config/ChannelConfigConvert.java | 6 +- .../gateway/AggregateBarPayConfigConvert.java | 9 +- .../gateway/AggregatePayConfigConvert.java | 9 +- .../gateway/CashierGroupConfigConvert.java | 10 +- .../gateway/CashierItemConfigConvert.java | 10 +- .../gateway/GatewayPayConfigConvert.java | 8 +- .../convert/info/MerchantConvert.java | 24 ++ .../dao/app}/MchAppManager.java | 49 ++- .../dao/app}/MchAppMapper.java | 4 +- .../dao/config/ChannelConfigManager.java | 4 +- .../dao/config/ChannelConfigMapper.java | 4 +- .../config/MerchantNotifyConfigManager.java | 6 +- .../config/MerchantNotifyConfigMapper.java | 4 +- .../gateway/AggregateBarPayConfigManager.java | 4 +- .../gateway/AggregateBarPayConfigMapper.java | 4 +- .../gateway/AggregatePayConfigManager.java | 4 +- .../dao/gateway/AggregatePayConfigMapper.java | 4 +- .../gateway/CashierGroupConfigManager.java | 9 +- .../dao/gateway/CashierGroupConfigMapper.java | 4 +- .../dao/gateway/CashierItemConfigManager.java | 4 +- .../dao/gateway/CashierItemConfigMapper.java | 4 +- .../dao/gateway/GatewayPayConfigManager.java | 13 +- .../dao/gateway/GatewayPayConfigMapper.java | 4 +- .../merchant/dao/info/MerchantManager.java | 82 +++++ .../merchant/dao/info/MerchantMapper.java | 14 + .../dao/info/MerchantUserManager.java | 37 ++ .../merchant/dao/info/MerchantUserMapper.java | 14 + .../entity/app}/MchApp.java | 29 +- .../entity/config/MerchantNotifyConfig.java | 4 +- .../entity/gateway/AggregateBarPayConfig.java | 10 +- .../entity/gateway/AggregatePayConfig.java | 13 +- .../entity/gateway/CashierGroupConfig.java | 10 +- .../entity/gateway/CashierItemConfig.java | 10 +- .../entity/gateway/GatewayPayConfig.java | 19 +- .../merchant/entity/info/Merchant.java | 54 +++ .../merchant/entity/info/MerchantUser.java | 32 ++ .../local/MchContextLocal.java | 2 +- .../param/app}/MchAppParam.java | 6 +- .../param/app}/MchAppQuery.java | 16 +- .../param/config/NotifySubscribeParam.java | 2 +- .../gateway/AggregateBarPayConfigParam.java | 2 +- .../gateway/AggregatePayConfigParam.java | 6 +- .../gateway/CashierGroupConfigParam.java | 2 +- .../param/gateway/CashierItemConfigParam.java | 2 +- .../param/gateway/GatewayPayConfigParam.java | 12 +- .../param/info/MerchantCreateParam.java | 43 +++ .../merchant/param/info/MerchantParam.java | 49 +++ .../merchant/param/info/MerchantQuery.java | 61 ++++ .../param/info/MerchantUserQuery.java | 25 ++ .../result/app}/MchAppResult.java | 19 +- .../result/config/ChannelConfigResult.java | 6 +- .../config/MerchantNotifyConfigResult.java | 4 +- .../gateway}/AggregateBarPayConfigResult.java | 4 +- .../gateway}/AggregatePayConfigResult.java | 8 +- .../gateway}/CashierGroupConfigResult.java | 6 +- .../gateway}/CashierItemConfigResult.java | 4 +- .../gateway}/GatewayPayConfigResult.java | 9 +- .../result/info}/MchResult.java | 13 +- .../merchant/result/info/MerchantResult.java | 51 +++ .../result/info/MerchantUserResult.java | 55 +++ .../merchant/service/app/MchAppService.java | 184 ++++++++++ .../service/config/ChannelConfigService.java | 45 +-- .../config/MerchantNotifyConfigService.java | 20 +- .../gateway}/AggregateConfigService.java | 42 ++- .../gateway}/CashierConfigService.java | 71 +++- .../gateway/GatewayPayConfigService.java | 60 ++++ .../service/info/MerchantInfoService.java | 91 +++++ .../service/info/MerchantUserService.java | 171 ++++++++++ .../param/allocation/AllocConfigParam.java | 52 --- .../allocation/group/AllocGroupBindParam.java | 30 -- .../allocation/group/AllocGroupParam.java | 38 --- .../allocation/group/AllocGroupQuery.java | 34 -- .../group/AllocGroupReceiverParam.java | 33 -- .../group/AllocGroupUnbindParam.java | 28 -- .../receiver/AllocReceiverQuery.java | 42 --- .../param/config/PlatformConfigParam.java | 35 -- .../order/allocation/AllocOrderQuery.java | 35 -- .../pay/bo/assist/ChannelTerminalBo.java | 35 ++ .../{ => pay}/bo/sync/PaySyncResultBo.java | 37 +- .../{ => pay}/bo/sync/RefundSyncResultBo.java | 2 +- .../bo/sync/TransferSyncResultBo.java | 2 +- .../service/pay/bo/trade/PayResultBo.java | 68 ++++ .../{ => pay}/bo/trade/RefundResultBo.java | 2 +- .../{ => pay}/bo/trade/TransferResultBo.java | 2 +- .../{ => pay}/common/anno/PaymentVerify.java | 2 +- .../common/entity/MchAppBaseEntity.java | 6 +- .../pay/common/entity/MchAppEditEntity.java | 26 ++ .../common/entity/MchAppRecordEntity.java | 2 +- .../filter/PaymentContextLocalFilter.java | 6 +- .../common/local/PaymentContextLocal.java | 6 +- .../{ => pay}/common/param/MchQuery.java | 17 +- .../convert/constant/ApiConstConvert.java | 6 +- .../convert/constant/ChannelConstConvert.java | 6 +- .../constant/MerchantNotifyConstConvert.java | 6 +- .../convert/constant/MethodConstConvert.java | 6 +- .../constant/TerminalConstConvert.java | 18 + .../notice/MerchantCallbackConvert.java | 10 +- .../convert/notice/MerchantNotifyConvert.java | 10 +- .../convert/order/pay/PayOrderConvert.java | 10 +- .../order/refund/RefundOrderConvert.java | 6 +- .../order/transfer/TransferOrderConvert.java | 6 +- .../convert/record/PayCloseRecordConvert.java | 6 +- .../record/TradeCallbackRecordConvert.java | 6 +- .../record/TradeFlowRecordConvert.java | 6 +- .../record/TradeSyncRecordConvert.java | 6 +- .../dao/constant/ApiConstManager.java | 6 +- .../dao/constant/ApiConstMapper.java | 4 +- .../dao/constant/ChannelConstManager.java | 16 +- .../dao/constant/ChannelConstMapper.java | 4 +- .../constant/MerchantNotifyConstManager.java | 6 +- .../constant/MerchantNotifyConstMapper.java | 4 +- .../dao/constant/MethodConstManager.java | 8 +- .../dao/constant/MethodConstMapper.java | 4 +- .../dao/constant/TerminalConstManager.java | 58 ++++ .../pay/dao/constant/TerminalConstMapper.java | 14 + .../MerchantCallbackRecordManager.java | 4 +- .../MerchantCallbackRecordMapper.java | 4 +- .../callback/MerchantCallbackTaskManager.java | 6 +- .../callback/MerchantCallbackTaskMapper.java | 4 +- .../notify/MerchantNotifyRecordManager.java | 4 +- .../notify/MerchantNotifyRecordMapper.java | 4 +- .../notify/MerchantNotifyTaskManager.java | 6 +- .../notify/MerchantNotifyTaskMapper.java | 4 +- .../dao/order/pay/PayOrderExpandManager.java | 19 ++ .../dao/order/pay/PayOrderExpandMapper.java | 14 + .../dao/order/pay/PayOrderManager.java | 30 +- .../dao/order/pay/PayOrderMapper.java | 4 +- .../dao/order/refund/RefundOrderManager.java | 38 ++- .../dao/order/refund/RefundOrderMapper.java | 4 +- .../order/transfer/TransferOrderManager.java | 6 +- .../order/transfer/TransferOrderMapper.java | 6 +- .../callback/TradeCallbackRecordManager.java | 6 +- .../callback/TradeCallbackRecordMapper.java | 4 +- .../record/close/PayCloseRecordManager.java | 6 +- .../record/close/PayCloseRecordMapper.java | 4 +- .../record/flow/TradeFlowRecordManager.java | 6 +- .../record/flow/TradeFlowRecordMapper.java | 4 +- .../record/sync/TradeSyncRecordManager.java | 6 +- .../record/sync/TradeSyncRecordMapper.java | 4 +- .../dao/report/IndexMerchantReportMapper.java | 2 +- .../dao/report/IndexTradeReportMapper.java | 34 +- .../entity/config/ChannelConfig.java | 8 +- .../{ => pay}/entity/constant/ApiConst.java | 6 +- .../entity/constant/ChannelConst.java | 13 +- .../entity/constant/MerchantNotifyConst.java | 8 +- .../entity/constant/PayMethodConst.java | 6 +- .../pay/entity/constant/TerminalConst.java | 49 +++ .../callback/MerchantCallbackRecord.java | 10 +- .../notice/callback/MerchantCallbackTask.java | 8 +- .../notice/notify/MerchantNotifyRecord.java | 10 +- .../notice/notify/MerchantNotifyTask.java | 10 +- .../{ => pay}/entity/order/pay/PayOrder.java | 17 +- .../pay/entity/order/pay/PayOrderExpand.java | 65 ++++ .../entity/order/refund/RefundOrder.java | 16 +- .../entity/order/transfer/TransferOrder.java | 8 +- .../record/callback/TradeCallbackRecord.java | 8 +- .../entity/record/close/PayCloseRecord.java | 8 +- .../entity/record/flow/TradeFlowRecord.java | 8 +- .../entity/record/sync/TradeSyncRecord.java | 8 +- .../{ => pay}/enums/NoticeSendTypeEnum.java | 2 +- .../enums/NotifyContentTypeEnum.java | 2 +- .../param/constant/ApiConstQuery.java | 2 +- .../param/constant/ChannelConstQuery.java | 2 +- .../constant/MerchantNotifyConstQuery.java | 2 +- .../param/constant/MethodConstQuery.java | 2 +- .../param/constant/TerminalConstQuery.java | 25 ++ .../callback/MerchantCallbackTaskQuery.java | 4 +- .../notify/MerchantNotifyTaskQuery.java | 6 +- .../param/order/pay/PayOrderQuery.java | 6 +- .../param/order/refund/RefundCreateParam.java | 2 +- .../param/order/refund/RefundOrderQuery.java | 4 +- .../order/transfer/TransferOrderQuery.java | 4 +- .../param/record/PayCloseRecordQuery.java | 4 +- .../record/TradeCallbackRecordQuery.java | 4 +- .../param/record/TradeFlowRecordQuery.java | 4 +- .../param/record/TradeSyncRecordQuery.java | 4 +- .../param/report/TradeReportQuery.java | 11 +- .../result/constant/ApiConstResult.java | 2 +- .../result/constant/ChannelConstResult.java | 12 +- .../constant/MerchantNotifyConstResult.java | 2 +- .../result/constant/PayMethodConstResult.java | 2 +- .../result/constant/TerminalConstResult.java | 40 +++ .../AggregateOrderAndConfigResult.java | 6 +- .../GatewayCashierCodeConfigResult.java | 24 +- .../gateway/GatewayOrderAndConfigResult.java | 6 +- .../result/gateway/GatewayOrderResult.java | 2 +- .../result/gateway/GatewayPayUrlResult.java | 2 +- .../MerchantCallbackRecordResult.java | 6 +- .../callback/MerchantCallbackTaskResult.java | 4 +- .../notify/MerchantNotifyRecordResult.java | 6 +- .../notify/MerchantNotifyTaskResult.java | 6 +- .../order/pay/PayOrderExpandResult.java | 62 ++++ .../result/order/pay/PayOrderVo.java | 17 +- .../result/order/refund/RefundOrderVo.java | 11 +- .../order/transfer/TransferOrderVo.java | 4 +- .../callback/TradeCallbackRecordResult.java | 4 +- .../record/close/PayCloseRecordResult.java | 6 +- .../record/flow/TradeFlowAmountResult.java | 2 +- .../record/flow/TradeFlowRecordResult.java | 4 +- .../record/sync/TradeSyncRecordResult.java | 4 +- .../result/report/MerchantReportResult.java | 11 +- .../result/report/TradeReportResult.java | 9 +- .../result/report/TradeStatisticsReport.java | 34 ++ .../service/assist/ChannelAuthService.java | 6 +- .../service/assist/ChannelBasicService.java | 33 ++ .../service/assist/PaymentAssistService.java | 146 ++++++++ .../service/assist/WechatOpenAuthService.java | 29 +- .../service/constant/ApiConstService.java | 8 +- .../service/constant/ChannelConstService.java | 23 +- .../constant/MerchantNotifyConstService.java | 8 +- .../service/constant/MethodConstService.java | 10 +- .../constant/TerminalConstService.java | 31 ++ .../service/develop/DevelopTradeService.java | 24 +- .../gateway/CashierCodePayService.java | 156 +++++++++ .../service/gateway/CashierPayService.java | 137 ++++++++ .../gateway/GatewayPayAssistService.java | 36 +- .../gateway/GatewayPayQueryService.java | 97 ++---- .../service/gateway/GatewayPayService.java | 65 ++-- .../notice/MerchantNoticeAssistService.java | 2 +- .../service/notice/MerchantNoticeService.java | 23 +- .../MerchantCallbackQueryService.java | 16 +- .../callback/MerchantCallbackSendService.java | 27 +- .../callback/MerchantCallbackTaskService.java | 48 +-- .../notify/MerchantNotifyQueryService.java | 16 +- .../notify/MerchantNotifySendService.java | 37 +- .../notify/MerchantNotifyTaskService.java | 64 +--- .../order/pay/PayOrderQueryService.java | 41 ++- .../service/order/pay/PayOrderService.java | 58 ++++ .../order/refund/RefundOrderQueryService.java | 12 +- .../order/refund/RefundOrderService.java | 28 +- .../transfer/TransferOrderQueryService.java | 12 +- .../order/transfer/TransferOrderService.java | 19 +- .../callback/TradeCallbackRecordService.java | 14 +- .../record/close/PayCloseRecordService.java | 10 +- .../record/flow/TradeFlowRecordService.java | 18 +- .../record/sync/TradeSyncRecordService.java | 10 +- .../report/IndexTradeReportService.java | 209 ++++++++++++ .../service/trade/pay/PayAssistService.java | 42 ++- .../service/trade/pay/PayCallbackService.java | 39 ++- .../service/trade/pay/PayCloseService.java | 20 +- .../service/trade/pay/PayService.java | 32 +- .../service/trade/pay/PaySyncService.java | 50 +-- .../trade/refund/RefundAssistService.java | 38 +-- .../trade/refund/RefundCallbackService.java | 25 +- .../service/trade/refund/RefundService.java | 163 ++++----- .../trade/refund/RefundSyncService.java | 20 +- .../trade/transfer/TransferAssistService.java | 8 +- .../transfer/TransferCallbackService.java | 12 +- .../trade/transfer/TransferService.java | 20 +- .../trade/transfer/TransferSyncService.java | 24 +- .../strategy/AbsChannelAuthStrategy.java | 2 +- .../pay/strategy/AbsChannelBasicStrategy.java | 19 ++ .../strategy/AbsChannelTerminalStrategy.java | 31 ++ .../strategy/AbsGatewayPayStrategy.java | 2 +- .../strategy/AbsPayCloseStrategy.java | 4 +- .../{ => pay}/strategy/AbsPayStrategy.java | 6 +- .../{ => pay}/strategy/AbsRefundStrategy.java | 6 +- .../strategy/AbsSyncPayOrderStrategy.java | 6 +- .../strategy/AbsSyncRefundOrderStrategy.java | 6 +- .../AbsSyncTransferOrderStrategy.java | 6 +- .../strategy/AbsTransferStrategy.java | 6 +- .../{ => pay}/strategy/PaymentStrategy.java | 2 +- .../util/PaymentStrategyFactory.java | 6 +- .../result/allocation/AllocConfigResult.java | 35 -- .../allocation/order/AllocDetailVo.java | 89 ----- .../result/allocation/order/AllocOrderVo.java | 107 ------ .../receiver/AllocGroupReceiverVo.java | 44 --- .../allocation/receiver/AllocGroupVo.java | 39 --- .../allocation/receiver/AllocReceiverVo.java | 44 --- .../result/config/PlatformConfigResult.java | 30 -- .../allocation/AllocConfigService.java | 59 ---- .../service/allocation/AllocationService.java | 316 ------------------ .../allocation/AllocationSyncService.java | 215 ------------ .../order/AllocOrderQueryService.java | 108 ------ .../allocation/order/AllocOrderService.java | 244 -------------- .../receiver/AllocGroupService.java | 246 -------------- .../receiver/AllocReceiverService.java | 90 ----- .../service/assist/PaymentAssistService.java | 198 ----------- .../service/assist/TerminalDeviceService.java | 89 ----- .../service/config/PlatformConfigService.java | 60 ---- .../service/gateway/CashierPayService.java | 243 -------------- .../config/CashierCodeConfigService.java | 173 ---------- .../config/GatewayPayConfigService.java | 60 ---- .../service/merchant/MchAppService.java | 128 ------- .../service/order/pay/PayOrderService.java | 101 ------ .../report/IndexMerchantReportService.java | 17 - .../report/IndexTradeReportService.java | 115 ------- .../strategy/AbsAllocationStrategy.java | 58 ---- .../service/task/OrderSyncTaskService.java | 111 ------ 744 files changed, 14948 insertions(+), 12140 deletions(-) delete mode 100644 _doc/ChangeLog.md delete mode 100644 _doc/Task.md delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverBindController.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverController.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverBindConvert.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverConvert.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayMccConstConvert.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipaySubConfigConvert.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindManager.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindMapper.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstManager.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstMapper.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiver.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiverBind.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/assist/AlipayMccConst.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AlipaySubConfig.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayApplyTypeEnum.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayBatchStatusEnum.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayOtherContractEnum.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindParam.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindQuery.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverParam.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayIsvConfigParam.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipaySubConfigParam.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverBindResult.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverResult.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayIsvConfigResult.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipaySubConfigResult.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/CreatContractParam.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/QueryContractParam.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverBindService.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/allocation/AlipayAllocationService.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayChannelBasicStrategy.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAllocationStrategy.java create mode 100644 daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubChannelBasicStrategy.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverBindController.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverController.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvConfigController.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverBindConvert.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverConvert.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvConfigConvert.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatPaySubConfigConvert.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindManager.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindMapper.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiver.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiverBind.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvConfig.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPaySubConfig.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindParam.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindQuery.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverParam.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvConfigParam.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPaySubConfigParam.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverBindResult.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverResult.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/assist/WechatMccConstResult.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvConfigResult.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPaySubConfigResult.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverBindService.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverService.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvConfigService.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV2Service.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV3Service.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV2Service.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV3Service.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV2Service.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV3Service.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV2Service.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV3Service.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatChannelBasicStrategy.java delete mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAllocationStrategy.java create mode 100644 daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubChannelBasicStrategy.java rename daxpay-open-server/src/main/java/org/dromara/daxpay/server/{DaxpayStart.java => DaxpayUnionStart.java} (90%) rename {daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common => daxpay-open-server/src/main/java/org/dromara/daxpay/server}/aop/PaymentVerifyAspect.java (89%) create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeConfigController.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeTemplateController.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/config/IsvChannelConfigController.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvAggregateConfigController.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvCashierConfigController.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvGatewayPayConfigController.java rename daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/MchAppController.java => daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MchAppAdminController.java (73%) create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MerchantAdminController.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/report/IndexTradeReportAdminController.java rename {daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay => daxpay-open-server/src/main/java/org/dromara/daxpay/server}/controller/gateway/ChannelAuthController.java (89%) rename daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeController.java => daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayCashierController.java (71%) rename {daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay => daxpay-open-server/src/main/java/org/dromara/daxpay/server}/controller/gateway/GatewayPayController.java (88%) rename {daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay => daxpay-open-server/src/main/java/org/dromara/daxpay/server}/controller/gateway/TestCallbackController.java (68%) rename {daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay => daxpay-open-server/src/main/java/org/dromara/daxpay/server}/controller/gateway/UniQueryController.java (85%) rename {daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay => daxpay-open-server/src/main/java/org/dromara/daxpay/server}/controller/gateway/UniSyncController.java (85%) rename {daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay => daxpay-open-server/src/main/java/org/dromara/daxpay/server}/controller/gateway/UniTradeController.java (84%) create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MchAppController.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MerchantController.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MerchantUserController.java rename daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/IndexTradeReportController.java => daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/report/IndexTradeReportMerchantController.java (67%) create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/enums/UserRoleEnum.java rename {daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service => daxpay-open-server/src/main/java/org/dromara/daxpay/server}/event/MerchantNoticeEventService.java (65%) rename {daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service => daxpay-open-server/src/main/java/org/dromara/daxpay/server}/event/TradeOrderEventService.java (72%) create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/filter/MchContextLocalFilter.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/ClientRouterCheck.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/CustomTenantLineHandler.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/MchTenantInterceptorConfiguration.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/interceptor/DataScopeInterceptorConfiguration.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/interceptor/MchDataScopeHandler.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/admin/MerchantAdminService.java rename daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/{ => common}/ClientCodeServiceImpl.java (65%) create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/common/PaymentAssistServiceImpl.java create mode 100644 daxpay-open-server/src/main/java/org/dromara/daxpay/server/task/OrderSyncTask.java create mode 100644 daxpay-open-server/src/main/resources/application-prod.yml delete mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocConfigController.java delete mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocGroupController.java delete mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocOrderController.java delete mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocReceiverController.java rename daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/{common => assist}/ChannelAuthAssistController.java (83%) create mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/ChannelBasicController.java rename daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/{common => assist}/DevelopTradeController.java (90%) create mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/MchAppQueryController.java create mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/MerchantQueryController.java delete mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/TerminalDeviceController.java delete mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/TestController.java create mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/TerminalConstController.java create mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/qrcode/CashierCodeController.java create mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/terminal/ChannelTerminalController.java create mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/terminal/TerminalDeviceController.java delete mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeConfigController.java delete mode 100644 daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniAllocationController.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/code/MerchantTypeGroup.java rename daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/{MchAppLocal.java => PaymentReqInfoLocal.java} (70%) delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocDetailResultEnum.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocOrderResultEnum.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocOrderStatusEnum.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocReceiverTypeEnum.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocRelationTypeEnum.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java create mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierAmountTypeEnum.java rename daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/{CashierCodeTypeEnum.java => CashierSceneEnum.java} (66%) create mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelTerminalStatusEnum.java create mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvApplyStatusEnum.java create mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvApplyTypeEnum.java create mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvStatusEnum.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/MerchantTypeEnum.java create mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TerminalTypeEnum.java create mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/WalletFlowTypeEnum.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocFinishParam.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocSyncParam.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocationParam.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/QueryAllocOrderParam.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverAddParam.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverQueryParam.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverRemoveParam.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java delete mode 100644 daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/receiver/AllocReceiverResult.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocSyncResultBo.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/qrcode/CashierCodeIcon.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/PayResultBo.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/AliYunOCRType.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => common}/code/DaxPayCode.java (69%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/OCRProperties.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/OCRType.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/convert/PlatformConfigConvert.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{dao/config/PlatformConfigManager.java => common/dao/config/PlatformBasicConfigManager.java} (53%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformBasicConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformUrlConfigManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformUrlConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformWebsiteConfigManage.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformWebsiteConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformBasicConfig.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformUrlConfig.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformWebsiteConfig.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/handler/DaxUserInfoStatusCheck.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/{tenant => handler}/MchTenantMetaObjectHandler.java (75%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformBasicConfigParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformCashoutsConfigParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformUrlConfigParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformWebsiteConfigPram.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformBasicConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformUrlConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformWebsiteConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/BankCardOCRResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/BusinessLicenseOCRResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/IdCardOCRResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/service/config/PlatformConfigService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocConfigConvert.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupConvert.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupReceiverConvert.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocReceiverConvert.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/assist/TerminalDeviceConvert.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/config/PlatformConfigConvert.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierCodeItemConfigConvert.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigManager.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigMapper.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailManager.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailMapper.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderManager.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderMapper.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupManager.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupMapper.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupReceiverManager.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupReceiverMapper.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocReceiverManager.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocReceiverMapper.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/PlatformConfigMapper.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeConfigManager.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeItemConfigManager.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeItemConfigMapper.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{convert/gateway => device/convert/qrcode}/CashierCodeConfigConvert.java (57%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeSceneConfigConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeTemplateConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/terminal/TerminalDeviceConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeConfigManager.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{dao/gateway => device/dao/qrcode/config}/CashierCodeConfigMapper.java (64%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeSceneConfigManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeSceneConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/info/CashierCodeManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/info/CashierCodeMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/template/CashierCodeTemplateManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/template/CashierCodeTemplateMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/ChannelTerminalManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/ChannelTerminalMapper.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{dao/assist => device/dao/terminal}/TerminalDeviceManager.java (86%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{dao/assist => device/dao/terminal}/TerminalDeviceMapper.java (66%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{entity/gateway => device/entity/qrcode/config}/CashierCodeConfig.java (70%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{entity/gateway/CashierCodeItemConfig.java => device/entity/qrcode/config/CashierCodeSceneConfig.java} (51%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/info/CashierCode.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/template/CashierCodeTemplate.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/terminal/ChannelTerminal.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{entity/assist => device/entity/terminal}/TerminalDevice.java (84%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/enums/AudioBindTypeEnum.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/commom/AssignMerchantParam.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{param/gateway => device/param/qrcode/config}/CashierCodeConfigParam.java (77%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeConfigQuery.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{param/gateway/CashierCodeItemConfigParam.java => device/param/qrcode/config/CashierCodeSceneConfigParam.java} (69%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeBatchParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeCreateParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeQuery.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeUpdateParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/template/CashierCodeTemplateParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/template/CashierCodeTemplateQuery.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/ChannelGetAndCreateParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/ChannelTerminalParam.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{param/termina => device/param/terminal}/TerminalDeviceParam.java (97%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{param/termina => device/param/terminal}/TerminalDeviceQuery.java (89%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/audio/AudioDeviceConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/audio/AudioDeviceResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/pos/PosDeviceConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/pos/PosDeviceResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/print/PrintDeviceConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/print/PrintDeviceResult.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{result/gateway => device/result/qrcode}/config/CashierCodeConfigResult.java (74%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{result/gateway/config/CashierCodeItemConfigResult.java => device/result/qrcode/config/CashierCodeSceneConfigResult.java} (66%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/info/CashierCodeResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/template/CashierCodeTemplateResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/terminal/ChannelTerminalResult.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{result/termina => device/result/terminal}/TerminalDeviceResult.java (94%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeConfigService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeTemplateService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/terminal/ChannelTerminalService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/terminal/TerminalDeviceService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocAndDetail.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocDetail.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocOrder.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroupReceiver.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocReceiver.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/PlatformConfig.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/AllocationEventService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/cache/IsvChannelConfigCacheService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/config/IsvChannelConfigConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvAggregateBarPayConfigConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvAggregatePayConfigConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvCashierGroupConfigConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvCashierItemConfigConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvGatewayPayConfigConvert.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/config/IsvChannelConfigManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/config/IsvChannelConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregateBarPayConfigManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregateBarPayConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregatePayConfigManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregatePayConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierGroupConfigManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierGroupConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierItemConfigManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierItemConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvGatewayPayConfigManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvGatewayPayConfigMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/config/IsvChannelConfig.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvAggregateBarPayConfig.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvAggregatePayConfig.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvCashierGroupConfig.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvCashierItemConfig.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvGatewayPayConfig.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvAggregateBarPayConfigParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvAggregatePayConfigParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvCashierGroupConfigParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvCashierItemConfigParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvGatewayPayConfigParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/config/IsvChannelConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvAggregateBarPayConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvAggregatePayConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvCashierGroupConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvCashierItemConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvGatewayPayConfigResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/config/IsvChannelConfigService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvAggregateConfigService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvCashierConfigService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvGatewayPayConfigService.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{common => merchant}/cache/ChannelConfigCacheService.java (81%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{common => merchant}/cache/MchAppCacheService.java (70%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/MerchantCacheService.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{convert/merchant => merchant/convert/app}/MchAppConvert.java (55%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/convert/config/ChannelConfigConvert.java (60%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/convert/gateway/AggregateBarPayConfigConvert.java (58%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/convert/gateway/AggregatePayConfigConvert.java (58%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/convert/gateway/CashierGroupConfigConvert.java (58%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/convert/gateway/CashierItemConfigConvert.java (58%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/convert/gateway/GatewayPayConfigConvert.java (57%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/info/MerchantConvert.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{dao/merchant => merchant/dao/app}/MchAppManager.java (58%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{dao/merchant => merchant/dao/app}/MchAppMapper.java (66%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/config/ChannelConfigManager.java (95%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/config/ChannelConfigMapper.java (66%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/config/MerchantNotifyConfigManager.java (86%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/config/MerchantNotifyConfigMapper.java (66%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/AggregateBarPayConfigManager.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/AggregateBarPayConfigMapper.java (66%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/AggregatePayConfigManager.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/AggregatePayConfigMapper.java (65%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/CashierGroupConfigManager.java (74%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/CashierGroupConfigMapper.java (66%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/CashierItemConfigManager.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/CashierItemConfigMapper.java (65%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/GatewayPayConfigManager.java (64%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/dao/gateway/GatewayPayConfigMapper.java (65%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantMapper.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantUserManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantUserMapper.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{entity/merchant => merchant/entity/app}/MchApp.java (73%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/entity/config/MerchantNotifyConfig.java (79%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/entity/gateway/AggregateBarPayConfig.java (78%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/entity/gateway/AggregatePayConfig.java (80%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/entity/gateway/CashierGroupConfig.java (78%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/entity/gateway/CashierItemConfig.java (85%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/entity/gateway/GatewayPayConfig.java (75%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/info/Merchant.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/info/MerchantUser.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{common => merchant}/local/MchContextLocal.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{param/merchant => merchant/param/app}/MchAppParam.java (95%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{param/merchant => merchant/param/app}/MchAppQuery.java (78%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/param/config/NotifySubscribeParam.java (90%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/param/gateway/AggregateBarPayConfigParam.java (97%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/param/gateway/AggregatePayConfigParam.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/param/gateway/CashierGroupConfigParam.java (96%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/param/gateway/CashierItemConfigParam.java (97%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/param/gateway/GatewayPayConfigParam.java (83%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantCreateParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantParam.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantQuery.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantUserQuery.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{result/merchant => merchant/result/app}/MchAppResult.java (84%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/result/config/ChannelConfigResult.java (86%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/result/config/MerchantNotifyConfigResult.java (86%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{result/gateway/config => merchant/result/gateway}/AggregateBarPayConfigResult.java (89%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{result/gateway/config => merchant/result/gateway}/AggregatePayConfigResult.java (86%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{result/gateway/config => merchant/result/gateway}/CashierGroupConfigResult.java (88%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{result/gateway/config => merchant/result/gateway}/CashierItemConfigResult.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{result/gateway/config => merchant/result/gateway}/GatewayPayConfigResult.java (82%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{common/result => merchant/result/info}/MchResult.java (62%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MerchantResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MerchantUserResult.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/app/MchAppService.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/service/config/ChannelConfigService.java (65%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => merchant}/service/config/MerchantNotifyConfigService.java (80%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{service/gateway/config => merchant/service/gateway}/AggregateConfigService.java (75%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{service/gateway/config => merchant/service/gateway}/CashierConfigService.java (63%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/GatewayPayConfigService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/info/MerchantInfoService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/info/MerchantUserService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/AllocConfigParam.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupBindParam.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupParam.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupQuery.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupReceiverParam.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupUnbindParam.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/receiver/AllocReceiverQuery.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/config/PlatformConfigParam.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/order/allocation/AllocOrderQuery.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/assist/ChannelTerminalBo.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/bo/sync/PaySyncResultBo.java (55%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/bo/sync/RefundSyncResultBo.java (95%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/bo/sync/TransferSyncResultBo.java (95%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/PayResultBo.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/bo/trade/RefundResultBo.java (91%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/bo/trade/TransferResultBo.java (91%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/common/anno/PaymentVerify.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/common/entity/MchAppBaseEntity.java (86%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppEditEntity.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/common/entity/MchAppRecordEntity.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/common/filter/PaymentContextLocalFilter.java (86%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/common/local/PaymentContextLocal.java (77%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/common/param/MchQuery.java (55%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/constant/ApiConstConvert.java (59%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/constant/ChannelConstConvert.java (60%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/constant/MerchantNotifyConstConvert.java (60%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/constant/MethodConstConvert.java (59%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/TerminalConstConvert.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/notice/MerchantCallbackConvert.java (50%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/notice/MerchantNotifyConvert.java (50%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/order/pay/PayOrderConvert.java (50%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/order/refund/RefundOrderConvert.java (66%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/order/transfer/TransferOrderConvert.java (66%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/record/PayCloseRecordConvert.java (61%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/record/TradeCallbackRecordConvert.java (60%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/record/TradeFlowRecordConvert.java (59%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/convert/record/TradeSyncRecordConvert.java (61%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/constant/ApiConstManager.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/constant/ApiConstMapper.java (64%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/constant/ChannelConstManager.java (81%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/constant/ChannelConstMapper.java (65%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/constant/MerchantNotifyConstManager.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/constant/MerchantNotifyConstMapper.java (65%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/constant/MethodConstManager.java (82%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/constant/MethodConstMapper.java (66%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/TerminalConstManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/TerminalConstMapper.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/notice/callback/MerchantCallbackRecordManager.java (85%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/notice/callback/MerchantCallbackRecordMapper.java (62%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/notice/callback/MerchantCallbackTaskManager.java (85%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/notice/callback/MerchantCallbackTaskMapper.java (62%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/notice/notify/MerchantNotifyRecordManager.java (86%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/notice/notify/MerchantNotifyRecordMapper.java (63%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/notice/notify/MerchantNotifyTaskManager.java (85%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/notice/notify/MerchantNotifyTaskMapper.java (63%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderExpandManager.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderExpandMapper.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/order/pay/PayOrderManager.java (80%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/order/pay/PayOrderMapper.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/order/refund/RefundOrderManager.java (69%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/order/refund/RefundOrderMapper.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/order/transfer/TransferOrderManager.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/order/transfer/TransferOrderMapper.java (76%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/record/callback/TradeCallbackRecordManager.java (82%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/record/callback/TradeCallbackRecordMapper.java (62%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/record/close/PayCloseRecordManager.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/record/close/PayCloseRecordMapper.java (63%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/record/flow/TradeFlowRecordManager.java (88%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/record/flow/TradeFlowRecordMapper.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/record/sync/TradeSyncRecordManager.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/record/sync/TradeSyncRecordMapper.java (65%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/report/IndexMerchantReportMapper.java (77%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/dao/report/IndexTradeReportMapper.java (70%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/config/ChannelConfig.java (79%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/constant/ApiConst.java (81%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/constant/ChannelConst.java (75%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/constant/MerchantNotifyConst.java (76%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/constant/PayMethodConst.java (82%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/constant/TerminalConst.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/notice/callback/MerchantCallbackRecord.java (74%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/notice/callback/MerchantCallbackTask.java (86%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/notice/notify/MerchantNotifyRecord.java (74%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/notice/notify/MerchantNotifyTask.java (80%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/order/pay/PayOrder.java (88%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/pay/PayOrderExpand.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/order/refund/RefundOrder.java (86%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/order/transfer/TransferOrder.java (89%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/record/callback/TradeCallbackRecord.java (82%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/record/close/PayCloseRecord.java (81%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/record/flow/TradeFlowRecord.java (80%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/entity/record/sync/TradeSyncRecord.java (84%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/enums/NoticeSendTypeEnum.java (89%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/enums/NotifyContentTypeEnum.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/constant/ApiConstQuery.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/constant/ChannelConstQuery.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/constant/MerchantNotifyConstQuery.java (89%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/constant/MethodConstQuery.java (90%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/param/constant/TerminalConstQuery.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/notice/callback/MerchantCallbackTaskQuery.java (88%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/notice/notify/MerchantNotifyTaskQuery.java (82%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/order/pay/PayOrderQuery.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/order/refund/RefundCreateParam.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/order/refund/RefundOrderQuery.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/order/transfer/TransferOrderQuery.java (94%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/record/PayCloseRecordQuery.java (90%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/record/TradeCallbackRecordQuery.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/record/TradeFlowRecordQuery.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/record/TradeSyncRecordQuery.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/param/report/TradeReportQuery.java (68%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/constant/ApiConstResult.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/constant/ChannelConstResult.java (76%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/constant/MerchantNotifyConstResult.java (92%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/constant/PayMethodConstResult.java (91%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/result/constant/TerminalConstResult.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/gateway/AggregateOrderAndConfigResult.java (76%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/gateway/GatewayCashierCodeConfigResult.java (62%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/gateway/GatewayOrderAndConfigResult.java (79%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/gateway/GatewayOrderResult.java (94%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/gateway/GatewayPayUrlResult.java (89%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/notice/callback/MerchantCallbackRecordResult.java (84%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/notice/callback/MerchantCallbackTaskResult.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/notice/notify/MerchantNotifyRecordResult.java (84%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/notice/notify/MerchantNotifyTaskResult.java (89%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/result/order/pay/PayOrderExpandResult.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/order/pay/PayOrderVo.java (89%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/order/refund/RefundOrderVo.java (91%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/order/transfer/TransferOrderVo.java (95%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/record/callback/TradeCallbackRecordResult.java (91%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/record/close/PayCloseRecordResult.java (88%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/record/flow/TradeFlowAmountResult.java (90%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/record/flow/TradeFlowRecordResult.java (88%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/record/sync/TradeSyncRecordResult.java (93%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/report/MerchantReportResult.java (53%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/result/report/TradeReportResult.java (77%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/result/report/TradeStatisticsReport.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/assist/ChannelAuthService.java (93%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/assist/ChannelBasicService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/assist/PaymentAssistService.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/assist/WechatOpenAuthService.java (68%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/constant/ApiConstService.java (71%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/constant/ChannelConstService.java (65%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/constant/MerchantNotifyConstService.java (70%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/constant/MethodConstService.java (69%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/TerminalConstService.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/develop/DevelopTradeService.java (70%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/CashierCodePayService.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/CashierPayService.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/gateway/GatewayPayAssistService.java (71%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/gateway/GatewayPayQueryService.java (63%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/gateway/GatewayPayService.java (76%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/notice/MerchantNoticeAssistService.java (96%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/notice/MerchantNoticeService.java (60%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/notice/callback/MerchantCallbackQueryService.java (70%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/notice/callback/MerchantCallbackSendService.java (85%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/notice/callback/MerchantCallbackTaskService.java (63%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/notice/notify/MerchantNotifyQueryService.java (71%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/notice/notify/MerchantNotifySendService.java (81%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/notice/notify/MerchantNotifyTaskService.java (58%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/order/pay/PayOrderQueryService.java (68%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/pay/PayOrderService.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/order/refund/RefundOrderQueryService.java (87%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/order/refund/RefundOrderService.java (77%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/order/transfer/TransferOrderQueryService.java (87%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/order/transfer/TransferOrderService.java (77%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/record/callback/TradeCallbackRecordService.java (81%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/record/close/PayCloseRecordService.java (78%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/record/flow/TradeFlowRecordService.java (84%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/record/sync/TradeSyncRecordService.java (80%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/report/IndexTradeReportService.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/pay/PayAssistService.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/pay/PayCallbackService.java (77%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/pay/PayCloseService.java (87%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/pay/PayService.java (78%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/pay/PaySyncService.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/refund/RefundAssistService.java (84%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/refund/RefundCallbackService.java (88%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/refund/RefundService.java (58%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/refund/RefundSyncService.java (90%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/transfer/TransferAssistService.java (90%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/transfer/TransferCallbackService.java (89%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/transfer/TransferService.java (87%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/service/trade/transfer/TransferSyncService.java (89%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/AbsChannelAuthStrategy.java (92%) create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelBasicStrategy.java create mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelTerminalStrategy.java rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/AbsGatewayPayStrategy.java (89%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/AbsPayCloseStrategy.java (87%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/AbsPayStrategy.java (83%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/AbsRefundStrategy.java (72%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/AbsSyncPayOrderStrategy.java (69%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/AbsSyncRefundOrderStrategy.java (75%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/AbsSyncTransferOrderStrategy.java (74%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/AbsTransferStrategy.java (76%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/strategy/PaymentStrategy.java (85%) rename daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/{ => pay}/util/PaymentStrategyFactory.java (89%) delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/AllocConfigResult.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocDetailVo.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocOrderVo.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupVo.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/PlatformConfigResult.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/TerminalDeviceService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/PlatformConfigService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/CashierPayService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/CashierCodeConfigService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/GatewayPayConfigService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/merchant/MchAppService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/report/IndexMerchantReportService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/report/IndexTradeReportService.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java delete mode 100644 daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/task/OrderSyncTaskService.java diff --git a/README.md b/README.md index dc3f9077..f36a56a5 100644 --- a/README.md +++ b/README.md @@ -53,28 +53,19 @@ ### 开源版: > 注:演示账号部分功能权限未开放。 -地址:https://admin.web.daxpay.cn +地址:https://open.web.daxpay.cn 账号:daxpay -密码:daxpay123 +密码:123123 ### 商业版 -运营端 -https://admin.web.daxpay.cn/ -代理端 -https://agent.web.daxpay.cn/ -商户端 -https://merchant.web.daxpay.cn/ +运营端: https://admin.web.daxpay.cn/ 演示用户: csadmin/123123 -运营端演示用户: csadmin/123123 +代理端: https://agent.web.daxpay.cn/ 演示用户: csdls/123123 -代理端演示用户: csdls/123123 - -商户端普通商户演示: cspt/123123 - -商户端特约商户演示: csdl/123123 +商户端: https://merchant.web.daxpay.cn/ 普通商户演示: cspt/123123 特约商户演示: csdl/123123 ## 核心技术栈 @@ -89,12 +80,18 @@ https://merchant.web.daxpay.cn/ ## 系统截图 ### 通道配置 -wechat_2025-04-27_204334_543 + +### 系统界面 + +15ccf7650d7b05fb25654cfe669153c3_PicViewer + +wechat_2025-04-27_204334_543 ### 收银台 -wechat_2025-04-27_203920_863 -wechat_2025-04-27_204208_069 +微信图片_20250825232829_66 + +微信图片_2025-08-25_232403_439 ### 聚合码牌 @@ -102,9 +99,13 @@ https://merchant.web.daxpay.cn/ 1b7671d183f279751460d42234c6eadb -### 小程序快捷收银 -cbe6e332c55b241215787254951dc7ec +### 小程序(商业版) +微信图片_20250825232837_68 + +微信图片_20250825232834_67 + +cbe6e332c55b241215787254951dc7ec ## 🥪 关于我们 diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md deleted file mode 100644 index e69de29b..00000000 diff --git a/_doc/Task.md b/_doc/Task.md deleted file mode 100644 index e69de29b..00000000 diff --git a/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java b/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java index a7786de0..220e06a6 100644 --- a/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java +++ b/bootx-platform/bootx-platform-common/common-config/src/main/java/cn/bootx/platform/common/config/BootxConfigProperties.java @@ -19,10 +19,6 @@ import java.util.List; @ConfigurationProperties(prefix = "bootx-platform.config") public class BootxConfigProperties { - /** 终端编码 */ - @Deprecated - private String clientCode = ""; - /** * 终端列表, 开启融合模式后才会生效, 表示当前系统集成了哪些终端模块 */ diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverBindController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverBindController.java deleted file mode 100644 index fac2c3d5..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverBindController.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.dromara.daxpay.channel.alipay.controller.allocation; - -import cn.bootx.platform.core.annotation.OperateLog; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindParam; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindQuery; -import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverBindResult; -import org.dromara.daxpay.channel.alipay.service.allocation.AlipayAllocReceiverBindService; -import org.dromara.core.trans.anno.TransMethodResult; -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.*; - -/** - * 支付宝分账接收方绑定 - * @author xxm - * @since 2025/1/27 - */ -@Validated -@Tag(name = "支付宝分账接收方绑定") -@RestController -@RequestGroup(groupCode = "AlipayAllocReceiver", groupName = "支付宝分账接收方", moduleCode = "alipay") -@RequestMapping("/alipay/allocation/receiver/bind") -@RequiredArgsConstructor -public class AlipayAllocReceiverBindController { - - private final AlipayAllocReceiverBindService receiverBindService; - - @TransMethodResult - @RequestPath("分页") - @Operation(summary = "分页") - @GetMapping("/page") - public Result> page(PageParam pageParam, AlipayAllocReceiverBindQuery param){ - return Res.ok(receiverBindService.page(pageParam,param)); - } - - @TransMethodResult - @RequestPath("详情") - @Operation(summary = "详情") - @GetMapping("/findById") - public Result findById(@NotNull(message = "主键不可为空") Long id){ - return Res.ok(receiverBindService.findById(id)); - } - - @RequestPath("添加") - @Operation(summary = "添加") - @PostMapping("/add") - @OperateLog(title = "添加支付宝分账接收方绑定", businessType = OperateLog.BusinessType.ADD, saveParam = true) - public Result add(@RequestBody @Validated(ValidationGroup.add.class) AlipayAllocReceiverBindParam param){ - receiverBindService.add(param); - return Res.ok(); - } - - @RequestPath("编辑") - @Operation(summary = "编辑") - @PostMapping("/update") - @OperateLog(title = "编辑支付宝分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - public Result update(@RequestBody @Validated(ValidationGroup.edit.class) AlipayAllocReceiverBindParam param){ - receiverBindService.update(param); - return Res.ok(); - } - - @RequestPath("绑定") - @Operation(summary = "绑定") - @PostMapping("/bind") - @OperateLog(title = "绑定支付宝分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - public Result bind(@NotNull(message = "主键不可为空") Long id){ - receiverBindService.bind(id); - return Res.ok(); - } - - @RequestPath("解绑") - @Operation(summary = "解绑") - @PostMapping("/unbind") - @OperateLog(title = "解绑支付宝分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - public Result unbind(@NotNull(message = "主键不可为空") Long id){ - receiverBindService.unbind(id); - return Res.ok(); - } - - @RequestPath("删除") - @Operation(summary = "删除") - @PostMapping("/remove") - @OperateLog(title = "删除支付宝分账接收方绑定", businessType = OperateLog.BusinessType.DELETE, saveParam = true) - public Result remove(@NotNull(message = "主键不可为空") Long id){ - receiverBindService.remove(id); - return Res.ok(); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverController.java deleted file mode 100644 index 245f3c92..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/allocation/AlipayAllocReceiverController.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.dromara.daxpay.channel.alipay.controller.allocation; - -import cn.bootx.platform.core.annotation.OperateLog; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverParam; -import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverResult; -import org.dromara.daxpay.channel.alipay.service.allocation.AlipayAllocReceiverService; -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.*; - -/** - * 支付宝分账接收方管理 - * @author xxm - * @since 2025/1/26 - */ -@Validated -@Tag(name = "支付宝分账接收方管理") -@RestController -@RequestGroup(groupCode = "AlipayAllocReceiver", moduleCode = "alipay") -@RequestMapping("/alipay/allocation/receiver") -@RequiredArgsConstructor -public class AlipayAllocReceiverController { - private final AlipayAllocReceiverService receiverService; - - @RequestPath("分账接收方详情") - @Operation(summary = "分账接收方详情") - @GetMapping("/findById") - public Result findById(@NotNull(message = "主键不可为空") Long id) { - return Res.ok(receiverService.findById(id)); - } - - @RequestPath("新增或修改分账接收方") - @Operation(summary = "新增或修改分账接收方") - @PostMapping("/saveOrUpdate") - @OperateLog(title = "新增或修改支付宝分账接收方", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - public Result saveOrUpdate(@RequestBody @Validated AlipayAllocReceiverParam param) { - receiverService.saveOrUpdate(param); - return Res.ok(); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayCallbackController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayCallbackController.java index 0a28e3c4..09e06476 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayCallbackController.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayCallbackController.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.channel.alipay.controller.payment; import cn.bootx.platform.core.annotation.IgnoreAuth; import org.dromara.daxpay.channel.alipay.service.payment.callback.AlipayCallbackService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController; /** * 支付宝回调通知 - * TODO 退款和支付回调都是同一个地址进行接收, 退款请求时传入的回调地址不生效, + * 退款和支付回调都是同一个地址进行接收, 退款请求时传入的回调地址不生效, * @author xxm * @since 2024/9/2 */ @@ -23,7 +23,7 @@ import org.springframework.web.bind.annotation.RestController; @IgnoreAuth @Tag(name = "支付宝回调通知") @RestController -@RequestMapping("/unipay/callback/{AppId}") +@RequestMapping("/unipay/callback/{mchNo}/{AppId}") @RequiredArgsConstructor public class AlipayCallbackController { @@ -32,14 +32,14 @@ public class AlipayCallbackController { @Operation(summary = "支付宝回调(普通商户)") @PostMapping("/alipay") - public String aliPayNotify(@PathVariable("AppId") String appId, HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String aliPayNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return payCallbackService.callbackHandle(request,false); } @Operation(summary = "支付宝回调(特约商户)") @PostMapping("/alipay/isv") - public String aliPayIsvNotify(@PathVariable("AppId") String appId, HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String aliPayIsvNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return payCallbackService.callbackHandle(request, true); } } diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayConfigController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayConfigController.java index 360cee6a..25b8976e 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayConfigController.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayConfigController.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.channel.alipay.controller.payment; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; @@ -7,7 +8,9 @@ import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; import org.dromara.daxpay.channel.alipay.param.config.AlipayConfigParam; import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; +import org.dromara.daxpay.channel.alipay.result.config.AlipaySubConfigResult; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; +import org.dromara.daxpay.service.common.code.DaxPayCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; @@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.*; * @author xxm * @since 2024/6/26 */ +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @Validated @Tag(name = "支付宝支付配置控制器") @RestController @@ -35,7 +39,6 @@ public class AlipayConfigController { public Result findById(@NotNull(message = "ID不可为空") Long id) { return Res.ok(alipayConfigService.findById(id)); } - @RequestPath("新增或更新商户配置") @Operation(summary = "新增或更新商户配置") @PostMapping("/saveOrUpdate") @@ -46,4 +49,5 @@ public class AlipayConfigController { } + } diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayNoticeReceiverController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayNoticeReceiverController.java index cb0aa976..0b9a5796 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayNoticeReceiverController.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayNoticeReceiverController.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.channel.alipay.controller.payment; import cn.bootx.platform.core.annotation.IgnoreAuth; import org.dromara.daxpay.channel.alipay.service.payment.notice.AlipayNoticeReceiverService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; @@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController; @IgnoreAuth @Tag(name = "支付宝消息通知") @RestController -@RequestMapping("/unipay/notice/{AppId}") +@RequestMapping("/unipay/notice/{mchNo}/{AppId}") @RequiredArgsConstructor public class AlipayNoticeReceiverController { @@ -32,14 +32,14 @@ public class AlipayNoticeReceiverController { @Operation(summary = "支付宝消息通知(普通商户)") @PostMapping("/alipay") - public String aliPay(@PathVariable("AppId") String appId, HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String aliPay(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return aliPayNoticeReceiverService.noticeReceiver(request,false); } @Operation(summary = "支付宝消息通知(特约商户)") @PostMapping("/alipay/isv") - public String aliPayIsv(@PathVariable("AppId") String appId, HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String aliPayIsv(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return aliPayNoticeReceiverService.noticeReceiver(request,true); } } diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayRedirectUrlController.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayRedirectUrlController.java index dac02483..035c4aec 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayRedirectUrlController.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/payment/AlipayRedirectUrlController.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.channel.alipay.controller.payment; import cn.bootx.platform.core.annotation.IgnoreAuth; import org.dromara.daxpay.channel.alipay.service.payment.redirect.AlipayRedirectUrlService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; @@ -23,7 +23,7 @@ import org.springframework.web.servlet.ModelAndView; @IgnoreAuth @Tag(name = "支付宝同步通知") @RestController -@RequestMapping("/unipay/return/{AppId}") +@RequestMapping("/unipay/return/{mchNo}/{AppId}") @RequiredArgsConstructor public class AlipayRedirectUrlController { private final AlipayRedirectUrlService redirectUrlService; @@ -31,15 +31,15 @@ public class AlipayRedirectUrlController { @Operation(summary = "支付宝同步跳转通知") @GetMapping("/alipay") - public ModelAndView alipay(@PathVariable("AppId") String appId, HttpServletRequest request){ - paymentAssistService.initMchAndApp(appId); + public ModelAndView alipay(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request){ + paymentAssistService.initMchAndApp(mchNo, appId); String redirect = redirectUrlService.redirect(request,false); return new ModelAndView("redirect:"+redirect); } @Operation(summary = "支付宝同步跳转通知") @GetMapping("/alipay/isv") - public ModelAndView alipayIsv(@PathVariable("AppId") String appId, HttpServletRequest request){ - paymentAssistService.initMchAndApp(appId); + public ModelAndView alipayIsv(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request){ + paymentAssistService.initMchAndApp(mchNo, appId); String redirect = redirectUrlService.redirect(request, true); return new ModelAndView("redirect:"+redirect); } diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverBindConvert.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverBindConvert.java deleted file mode 100644 index a15e5d51..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverBindConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dromara.daxpay.channel.alipay.convert; - -import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiverBind; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindParam; -import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverBindResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2025/1/27 - */ -@Mapper -public interface AlipayAllocReceiverBindConvert { - AlipayAllocReceiverBindConvert CONVERT = Mappers.getMapper(AlipayAllocReceiverBindConvert.class); - - AlipayAllocReceiverBindResult toResult(AlipayAllocReceiverBind alipayAllocReceiverBind); - - AlipayAllocReceiverBind toEntity(AlipayAllocReceiverBindParam param); -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverConvert.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverConvert.java deleted file mode 100644 index cf4178ad..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayAllocReceiverConvert.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.daxpay.channel.alipay.convert; - -import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiver; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverParam; -import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2025/1/26 - */ -@Mapper -public interface AlipayAllocReceiverConvert { - AlipayAllocReceiverConvert CONVERT = Mappers.getMapper(AlipayAllocReceiverConvert.class); - - AlipayAllocReceiver copy(AlipayAllocReceiver aliAllocReceiver); - - AlipayAllocReceiver toEntity(AlipayAllocReceiverParam alipayAllocReceiverParam); - - AlipayAllocReceiverResult toResult(AlipayAllocReceiver aliAllocReceiver); -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayMccConstConvert.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayMccConstConvert.java new file mode 100644 index 00000000..8493aa25 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayMccConstConvert.java @@ -0,0 +1,19 @@ +package org.dromara.daxpay.channel.alipay.convert; + +import org.dromara.daxpay.channel.alipay.entity.assist.AlipayMccConst; +import org.dromara.daxpay.channel.alipay.result.assist.AlipayMccConstResult; +import org.mapstruct.Mapper; + +import static org.mapstruct.factory.Mappers.getMapper; + +/** + * + * @author xxm + * @since 2024/11/11 + */ +@Mapper +public interface AlipayMccConstConvert { + AlipayMccConstConvert INSTANCE = getMapper(AlipayMccConstConvert.class); + + AlipayMccConstResult toResult(AlipayMccConst entity); +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipaySubConfigConvert.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipaySubConfigConvert.java new file mode 100644 index 00000000..ec6d0f37 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipaySubConfigConvert.java @@ -0,0 +1,23 @@ +package org.dromara.daxpay.channel.alipay.convert; + +import org.dromara.daxpay.channel.alipay.entity.config.AlipaySubConfig; +import org.dromara.daxpay.channel.alipay.param.config.AlipaySubConfigParam; +import org.dromara.daxpay.channel.alipay.result.config.AlipaySubConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2024/6/25 + */ +@Mapper +public interface AlipaySubConfigConvert { + AlipaySubConfigConvert CONVERT = Mappers.getMapper(AlipaySubConfigConvert.class); + + AlipaySubConfigResult toResult(AlipaySubConfig in); + + AlipaySubConfig copy(AlipaySubConfig in); + + AlipaySubConfig toEntity(AlipaySubConfigParam in); +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindManager.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindManager.java deleted file mode 100644 index c47580d4..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindManager.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.dromara.daxpay.channel.alipay.dao.allocation; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiverBind; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindQuery; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * - * @author xxm - * @since 2025/1/27 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AlipayAllocReceiverBindManager extends BaseManager { - - - /** - * 分页 - */ - public Page page(PageParam pageParam, AlipayAllocReceiverBindQuery query) { - var mpPage = MpUtil.getMpPage(pageParam,AlipayAllocReceiverBind.class); - QueryWrapper generator = QueryGenerator.generator(query); - return this.page(mpPage, generator); - } - -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindMapper.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindMapper.java deleted file mode 100644 index 8eb2ef8e..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/allocation/AlipayAllocReceiverBindMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.channel.alipay.dao.allocation; - -import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiverBind; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2025/1/27 - */ -@Mapper -public interface AlipayAllocReceiverBindMapper extends MPJBaseMapper { -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstManager.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstManager.java new file mode 100644 index 00000000..ed77985f --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstManager.java @@ -0,0 +1,18 @@ +package org.dromara.daxpay.channel.alipay.dao.assist; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.channel.alipay.entity.assist.AlipayMccConst; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * 支付宝经营类目 + * @author xxm + * @since 2024/11/11 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class AlipayMccConstManager extends BaseManager { +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstMapper.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstMapper.java new file mode 100644 index 00000000..be7ac0a5 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/assist/AlipayMccConstMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.channel.alipay.dao.assist; + +import org.dromara.daxpay.channel.alipay.entity.assist.AlipayMccConst; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author xxm + * @since 2024/11/11 + */ +@Mapper +public interface AlipayMccConstMapper extends MPJBaseMapper { +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiver.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiver.java deleted file mode 100644 index 40262560..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiver.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.dromara.daxpay.channel.alipay.entity.allocation; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.json.JSONUtil; -import org.dromara.daxpay.channel.alipay.convert.AlipayAllocReceiverConvert; -import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverResult; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付宝分账接收方 - * @author xxm - * @since 2025/1/25 - */ -@Data -@Accessors(chain = true) -public class AlipayAllocReceiver implements ToResult { - - /** 主键 */ - private Long id; - - /** 分账接收方编号, 需要保证唯一 */ - private String receiverNo; - - /** 接收方名称 */ - private String receiverName; - - /** 接收方账号 */ - private String receiverAccount; - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - private String receiverType; - - /** 分账关系类型 */ - private String relationType; - - /** 分账关系名称 */ - private String relationName; - - /** 商户AppId */ - private String appId; - - - /** - * 转换为通用接收方 - */ - public AllocReceiver toReceiver(boolean isv) { - var receiver = new AllocReceiver(); - receiver.setId(this.getId()); - receiver.setAppId(this.getAppId()); - receiver.setReceiverType(this.getReceiverType()); - receiver.setReceiverNo(this.getReceiverNo()); - receiver.setReceiverName(this.getReceiverName()); - receiver.setReceiverAccount(this.getReceiverAccount()); - receiver.setChannel(isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode()); - var copy = AlipayAllocReceiverConvert.CONVERT.copy(this); - // 清空不需要序列化的字段 - copy.setId(null).setReceiverNo(null).setReceiverName(null).setReceiverType(null).setReceiverAccount(null); - String jsonStr = JsonUtil.toJsonStr(copy); - receiver.setExt(jsonStr); - return receiver; - } - - /** - * 转换为通道接收方 - */ - public static AlipayAllocReceiver convertChannel(AllocReceiver receiver) { - var leshuaAllocReceiver = JSONUtil.toBean(receiver.getExt(), AlipayAllocReceiver.class); - leshuaAllocReceiver.setId(receiver.getId()) - .setReceiverNo(receiver.getReceiverNo()) - .setReceiverName(receiver.getReceiverName()) - .setReceiverType(receiver.getReceiverType()) - .setReceiverAccount(receiver.getReceiverAccount()); - return leshuaAllocReceiver; - } - - @Override - public AlipayAllocReceiverResult toResult() { - return AlipayAllocReceiverConvert.CONVERT.toResult(this); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiverBind.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiverBind.java deleted file mode 100644 index 3c83854a..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/allocation/AlipayAllocReceiverBind.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.dromara.daxpay.channel.alipay.entity.allocation; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.channel.alipay.convert.AlipayAllocReceiverBindConvert; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindParam; -import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverBindResult; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 支付宝分账接收方绑定 - * @author xxm - * @since 2025/1/27 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_alipay_alloc_receiver_bind") -public class AlipayAllocReceiverBind extends MchAppBaseEntity implements ToResult { - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - private String receiverType; - - /** 接收方账号 */ - private String receiverAccount; - - /** 接收方名称 */ - private String receiverName; - - /** 分账关系类型 */ - private String relationType; - - /** 分账关系名称 */ - private String relationName; - - /** 是否服务商模式 */ - private boolean isv; - - /** 是否绑定 */ - private boolean bind; - - /** 错误提示 */ - @TableField(updateStrategy = FieldStrategy.ALWAYS) - private String errorMsg; - - /** - * 初始化 - */ - public static AlipayAllocReceiverBind init(AlipayAllocReceiverBindParam param){ - return AlipayAllocReceiverBindConvert.CONVERT.toEntity(param); - } - - - @Override - public AlipayAllocReceiverBindResult toResult() { - return AlipayAllocReceiverBindConvert.CONVERT.toResult(this); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/assist/AlipayMccConst.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/assist/AlipayMccConst.java new file mode 100644 index 00000000..634d9c90 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/assist/AlipayMccConst.java @@ -0,0 +1,38 @@ +package org.dromara.daxpay.channel.alipay.entity.assist; + +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.channel.alipay.convert.AlipayMccConstConvert; +import org.dromara.daxpay.channel.alipay.result.assist.AlipayMccConstResult; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 支付宝经营类目 + * @author xxm + * @since 2024/11/11 + */ +@Data +@Accessors(chain = true) +@TableName("pay_alipay_mcc_const") +public class AlipayMccConst implements ToResult { + + /** 类目 */ + @TableId + private String code; + + /** 上级类目 */ + private String parentCode; + + /** 类目名称 */ + private String name; + + /** 是否需要特殊资质 */ + private Boolean special; + + @Override + public AlipayMccConstResult toResult() { + return AlipayMccConstConvert.INSTANCE.toResult(this); + } +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java index 370f23a0..e6aa430a 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java @@ -1,13 +1,12 @@ package org.dromara.daxpay.channel.alipay.entity.config; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.json.JSONUtil; import org.dromara.daxpay.channel.alipay.code.AlipayCode; import org.dromara.daxpay.channel.alipay.convert.AlipayConfigConvert; import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.entity.config.ChannelConfig; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; import lombok.Data; import lombok.experimental.Accessors; @@ -69,6 +68,9 @@ public class AliPayConfig implements ToResult { /** 是否沙箱环境 */ private boolean sandbox; + /** 商户号 */ + private String mchNo; + /** 商户AppId */ private String appId; @@ -84,12 +86,13 @@ public class AliPayConfig implements ToResult { channelConfig.setId(this.getId()); channelConfig.setOutAppId(this.getAliAppId()); channelConfig.setAppId(this.getAppId()); + channelConfig.setMchNo(this.getMchNo()); channelConfig.setEnable(this.getEnable()); channelConfig.setChannel(this.isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode()); var copy = AlipayConfigConvert.CONVERT.copy(this); // 清空不需要序列化的字段 - copy.setId(null).setAppId(null).setEnable(null).setAliAppId(null); - String jsonStr = JsonUtil.toJsonStr(copy); + copy.setId(null).setAppId(null).setEnable(null).setAliAppId(null).setMchNo(null); + String jsonStr = JacksonUtil.toJson(copy); channelConfig.setExt(jsonStr); return channelConfig; } @@ -98,10 +101,11 @@ public class AliPayConfig implements ToResult { * 从通道配置转换为支付宝配置 */ public static AliPayConfig convertConfig(ChannelConfig channelConfig) { - var config = JSONUtil.toBean(channelConfig.getExt(), AliPayConfig.class); + var config = JacksonUtil.toBean(channelConfig.getExt(), AliPayConfig.class); config.setId(channelConfig.getId()) .setAliAppId(channelConfig.getOutAppId()) .setAppId(channelConfig.getAppId()) + .setMchNo(channelConfig.getMchNo()) .setEnable(channelConfig.isEnable()); return config; } diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AlipaySubConfig.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AlipaySubConfig.java new file mode 100644 index 00000000..5480880d --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AlipaySubConfig.java @@ -0,0 +1,78 @@ +package org.dromara.daxpay.channel.alipay.entity.config; + +import cn.bootx.platform.common.jackson.util.JacksonUtil; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.daxpay.channel.alipay.convert.AlipaySubConfigConvert; +import org.dromara.daxpay.channel.alipay.result.config.AlipaySubConfigResult; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; + +/** + * 支付宝特约商户配置 + * @author xxm + * @since 2024/6/25 + */ +@Data +@Accessors(chain = true) +public class AlipaySubConfig implements ToResult { + + /** 主键 */ + private Long id; + + /** 支付宝特约商户Token */ + private String appAuthToken; + + /** 是否启用 */ + private Boolean enable; + + /** 商户号 */ + private String mchNo; + + /** 商户AppId */ + private String appId; + + /** + * 支付宝商家唯一识别码 + * 是商家与支付宝签约后,商家获得的支付宝商家唯一识别码,以 2088 开头的 16 位数字组成,在开放平台中账户中心获取 + */ + private String alipayUserId; + + /** + * 转换为通道配置 + */ + public ChannelConfig toChannelConfig() { + ChannelConfig channelConfig = new ChannelConfig(); + channelConfig.setId(this.getId()); + channelConfig.setAppId(this.getAppId()); + channelConfig.setMchNo(this.getMchNo()); + channelConfig.setEnable(this.getEnable()); + channelConfig.setSub(true); + channelConfig.setChannel(ChannelEnum.ALIPAY_ISV.getCode()); + AlipaySubConfig copy = AlipaySubConfigConvert.CONVERT.copy(this); + // 清空不需要序列化的字段 + copy.setId(null).setMchNo(null).setAppId(null).setEnable(null); + String jsonStr = JacksonUtil.toJson(copy); + channelConfig.setExt(jsonStr); + channelConfig.setSub(true); + return channelConfig; + } + + /** + * 从通道配置转换为支付宝配置 + */ + public static AlipaySubConfig convertConfig(ChannelConfig channelConfig) { + AlipaySubConfig config = JacksonUtil.toBean(channelConfig.getExt(), AlipaySubConfig.class); + config.setId(channelConfig.getId()) + .setAppId(channelConfig.getAppId()) + .setMchNo(channelConfig.getMchNo()) + .setEnable(channelConfig.isEnable()); + return config; + } + + @Override + public AlipaySubConfigResult toResult() { + return AlipaySubConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayApplyTypeEnum.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayApplyTypeEnum.java new file mode 100644 index 00000000..7e6d91c1 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayApplyTypeEnum.java @@ -0,0 +1,20 @@ +package org.dromara.daxpay.channel.alipay.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 签约类型 + * @author xxm + * @since 2024/11/5 + */ +@Getter +@AllArgsConstructor +public enum AlipayApplyTypeEnum { + APP("app", "APP"), + FACE_TO_FACE("face_to_face","当面付"), + OTHER("other","其他"); + + private final String code; + private final String name; +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayBatchStatusEnum.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayBatchStatusEnum.java new file mode 100644 index 00000000..c35d7c2f --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayBatchStatusEnum.java @@ -0,0 +1,22 @@ +package org.dromara.daxpay.channel.alipay.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代商户操作事务状态 + * @author xxm + * @since 2024/11/5 + */ +@Getter +@AllArgsConstructor +public enum AlipayBatchStatusEnum { + + /** 初始状态 */ + INIT("init", "初始状态"), + /**提交状态 */ + SUBMIT("submit","提交状态"), + ; + private final String code; + private final String name; +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayOtherContractEnum.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayOtherContractEnum.java new file mode 100644 index 00000000..7a7021ef --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/enums/AlipayOtherContractEnum.java @@ -0,0 +1,43 @@ +package org.dromara.daxpay.channel.alipay.enums; + +import cn.bootx.platform.core.exception.DataNotExistException; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * + * @author xxm + * @since 2024/11/6 + */ +@Getter +@AllArgsConstructor +public enum AlipayOtherContractEnum { + + /** JSAPI 支付 */ + JSAPI("jsapi", "JSAPI","I1080300001000060370"), + /** 预授权支付 */ + PAY_AUTH("pay_auth", "预授权支付","I1080300001000065324"), + /** 手机网站支付 */ + WAP("wap", "手机网站支付", "QUICK_WAP_WAY"), + /** 电脑网站支付 */ + WEB("web", "电脑网站支付", "FAST_INSTANT_TRADE_PAY"), + /** 订单码支付 */ + ORDER_CODE("order_code", "订单码支付", "I1080300001000068149"), + /** 商家分账 */ + ALLOCATION("allocation", "商家分账", "DOMESTIC_ALLOC"), + ; + + private final String code; + private final String name; + /** 产品码 */ + private final String productCode; + + public static AlipayOtherContractEnum findByCode(String code){ + return Arrays.stream(values()) + .filter(item -> item.getCode().equals(code)) + .findFirst() + .orElseThrow(() -> new DataNotExistException("该产品类型不存在")); + } +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindParam.java deleted file mode 100644 index f3c46dfb..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindParam.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dromara.daxpay.channel.alipay.param.allocation; - -import cn.bootx.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付宝分账接收方绑定 - * @author xxm - * @since 2025/1/27 - */ -@Data -@Accessors(chain = true) -@Schema(title = "支付宝分账接收方绑定") -public class AlipayAllocReceiverBindParam { - - /** 主键 */ - @NotNull(message = "id不能为空", groups = ValidationGroup.edit.class) - @Schema(description = "主键") - private Long id; - - /** 接收方账号 */ - @NotBlank(message = "接收方账号不能为空") - @Schema(description = "接收方账号") - private String receiverAccount; - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - @NotBlank(message = "接收方类型不能为空") - @Schema(description = "接收方类型") - private String receiverType; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** 分账关系类型 */ - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; - - /** 是否服务商模式 */ - @Schema(description = "是否服务商模式") - private boolean isv; - - /** 商户AppId */ - @NotBlank(message = "商户AppId不能为空") - @Schema(description = "商户AppId") - private String appId; - - -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindQuery.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindQuery.java deleted file mode 100644 index d2d35728..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverBindQuery.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.dromara.daxpay.channel.alipay.param.allocation; - -import cn.bootx.platform.core.annotation.QueryParam; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.service.common.param.MchQuery; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 支付宝分账接收方绑定查询 - * @author xxm - * @since 2025/2/19 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "支付宝分账接收方绑定查询") -public class AlipayAllocReceiverBindQuery extends MchQuery { - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "接收方类型") - private String receiverType; - - /** 接收方账号 */ - @Schema(description = "接收方账号") - private String receiverAccount; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** 分账关系类型 */ - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; - - /** 是否服务商模式 */ - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "是否服务商模式") - private Boolean isv; - - /** 是否绑定 */ - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "是否绑定") - private Boolean bind; - -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverParam.java deleted file mode 100644 index d2c9667f..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/allocation/AlipayAllocReceiverParam.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dromara.daxpay.channel.alipay.param.allocation; - -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.AllocRelationTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付宝分账接收方 - * @author xxm - * @since 2025/1/26 - */ -@Data -@Accessors(chain = true) -@Schema(title = "支付宝分账接收方") -public class AlipayAllocReceiverParam { - - /** 主键 */ - @Schema(description = "主键") - private Long id; - - /** 接收方名称 */ - @NotBlank(message = "接收方名称不能为空") - @Schema(description = "接收方名称") - private String receiverName; - - /** 接收方账号 */ - @NotBlank(message = "接收方账号不能为空") - @Schema(description = "接收方账号") - private String receiverAccount; - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - @NotBlank(message = "接收方类型不能为空") - @Schema(description = "接收方类型") - private String receiverType; - - /** - * 分账关系类型 - * @see AllocRelationTypeEnum - */ - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; - - /** 是否为服务商 */ - @Schema(description = "是否为服务商") - private boolean isv; - - /** 商户AppId */ - @NotBlank(message = "商户AppId不能为空") - @Schema(description = "商户AppId") - private String appId; -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java index 80419fd7..4c5ae341 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java @@ -82,6 +82,10 @@ public class AlipayConfigParam { @Schema(description = "是否沙箱环境") private boolean sandbox; + /** 商户号 */ + @NotBlank(message = "商户号不可为空") + @Schema(description = "商户号") + private String mchNo; /** 商户AppId */ @NotBlank(message = "商户AppId不可为空") diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayIsvConfigParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayIsvConfigParam.java new file mode 100644 index 00000000..0bb2ee25 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayIsvConfigParam.java @@ -0,0 +1,79 @@ +package org.dromara.daxpay.channel.alipay.param.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + + +/** + * 支付宝服务商配置参数 + * @author xxm + * @since 2024/10/31 + */ +@Data +@Accessors(chain = true) +@Schema(title = "支付宝服务商配置参数") +public class AlipayIsvConfigParam { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** 支付宝商户appId */ + @NotBlank(message = "支付宝AppId不可为空") + @Schema(description = "支付宝商户appId") + private String aliAppId; + + /** 是否启用 */ + @Schema(description = "是否启用") + @NotNull(message = "是否启用不可为空") + private Boolean enable; + + /** + * 认证类型 证书/公钥 + * @see AlipayCode.AuthType + */ + @Schema(description = "认证类型") + @NotBlank(message = "认证类型不可为空") + private String authType; + + /** 签名类型 RSA2 */ + @Schema(description = "签名类型") + @NotBlank(message = "签名类型不可为空") + public String signType; + + /** + * 是商家与支付宝签约后,商家获得的支付宝商家唯一识别码,以 2088 开头的 16 位数字组成,在开放平台中账户中心获取 + */ + @Schema(description = "支付宝商家唯一识别码") + private String alipayUserId; + + /** 支付宝公钥 */ + @Schema(description = "支付宝公钥") + public String alipayPublicKey; + + /** 私钥 */ + @Schema(description = "私钥") + private String privateKey; + + /** 应用公钥证书 */ + @Schema(description = "应用公钥证书") + private String appCert; + + /** 支付宝公钥证书 */ + @Schema(description = "支付宝公钥证书") + private String alipayCert; + + /** 支付宝CA根证书 */ + @Schema(description = "支付宝CA根证书") + private String alipayRootCert; + + /** 是否沙箱环境 */ + @Schema(description = "是否沙箱环境") + private boolean sandbox; + + +} + diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipaySubConfigParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipaySubConfigParam.java new file mode 100644 index 00000000..956ca320 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipaySubConfigParam.java @@ -0,0 +1,44 @@ +package org.dromara.daxpay.channel.alipay.param.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 支付宝特约商户配置参数 + * @author xxm + * @since 2024/6/26 + */ +@Data +@Accessors(chain = true) +@Schema(title = "支付宝特约商户配置参数") +public class AlipaySubConfigParam { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** 支付宝特约商户Token */ + @NotBlank(message = "支付宝AppAuthToken不可为空") + @Schema(description = "支付宝特约商户Token") + private String appAuthToken; + + /** 是否启用 */ + @Schema(description = "是否启用") + @NotNull(message = "是否启用不可为空") + private Boolean enable; + + /** 商户号 */ + @NotBlank(message = "商户号不可为空") + @Schema(description = "商户号") + private String mchNo; + + /** 商户AppId */ + @Schema(description = "商户AppId") + @NotBlank(message = "商户AppId不可为空") + private String appId; + + +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java index 299927a3..f6a415b0 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java @@ -21,9 +21,9 @@ public class AlipayParam { /** * 新商户建议使用buyer_open_id替代该字段。对于新商户,buyer_id字段未来计划逐步回收,存量商户可继续使用 + * 需要传输 buyer_open_id 字段的话,直接设置PayParam中的OpenId参数即可 */ @Schema(description = "买家支付宝用户ID") private String buyerId; - } diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverBindResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverBindResult.java deleted file mode 100644 index bf3e8c13..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverBindResult.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.dromara.daxpay.channel.alipay.result.allocation; - -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.AllocRelationTypeEnum; -import org.dromara.daxpay.service.common.result.MchResult; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 支付宝分账接收方绑定 - * @author xxm - * @since 2025/1/27 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "支付宝分账接收方绑定") -public class AlipayAllocReceiverBindResult extends MchResult { - - /** 接收方账号 */ - @Schema(description = "接收方账号") - private String receiverAccount; - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - @Schema(description = "接收方类型") - private String receiverType; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** - * 分账关系类型 - * @see AllocRelationTypeEnum - */ - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; - - /** 是否服务商模式 */ - @Schema(description = "是否服务商模式") - private boolean isv; - - /** 是否绑定 */ - @Schema(description = "是否绑定") - private boolean bind; - - /** 错误提示 */ - @Schema(description = "错误提示") - private String errorMsg; -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverResult.java deleted file mode 100644 index 686f1072..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/allocation/AlipayAllocReceiverResult.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.dromara.daxpay.channel.alipay.result.allocation; - -import org.dromara.daxpay.core.enums.AllocRelationTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付宝分账接收方 - * @author xxm - * @since 2025/1/26 - */ -@Data -@Accessors(chain = true) -@Schema(title = "支付宝分账接收方") -public class AlipayAllocReceiverResult { - - /** 主键 */ - @Schema(description = "主键") - private Long id; - - /** 分账接收方编号 */ - @Schema(description = "分账接收方编号") - private String receiverNo; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** 接收方账号 */ - @Schema(description = "接收方账号") - private String receiverAccount; - - /** 接收方类型 */ - @Schema(description = "接收方类型") - private String receiverType; - - /** - * 分账关系类型 - * @see AllocRelationTypeEnum - */ - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; - - /** 商户AppId */ - @Schema(description = "商户AppId") - private String appId; -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java index 3a2a3b15..e7b57a96 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java @@ -79,6 +79,10 @@ public class AlipayConfigResult { @Schema(description = "是否沙箱环境") private boolean sandbox; + /** 商户号 */ + @Schema(description = "商户号") + private String mchNo; + /** 商户AppId */ @Schema(description = "商户AppId") private String appId; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayIsvConfigResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayIsvConfigResult.java new file mode 100644 index 00000000..6ecccb9d --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayIsvConfigResult.java @@ -0,0 +1,82 @@ +package org.dromara.daxpay.channel.alipay.result.config; + +import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 支付宝服务商配置 + * @author xxm + * @since 2024/10/31 + */ +@Data +@Accessors(chain = true) +@Schema(title = "支付宝服务商配置") +public class AlipayIsvConfigResult { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** 支付宝商户appId */ + @Schema(description = "支付宝商户appId") + private String aliAppId; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + + /** + * 认证类型 证书/公钥 + * @see AlipayCode.AuthType + */ + @Schema(description = "认证类型") + private String authType; + + /** 签名类型 RSA2 */ + @Schema(description = "签名类型") + public String signType; + + /** + * 是商家与支付宝签约后,商家获得的支付宝商家唯一识别码,以 2088 开头的 16 位数字组成,在开放平台中账户中心获取 + */ + @Schema(description = "支付宝商家唯一识别码") + private String alipayUserId; + + /** 支付宝公钥 */ + @Schema(description = "支付宝公钥") + @SensitiveInfo + public String alipayPublicKey; + + /** 应用私钥 */ + @Schema(description = "应用私钥") + @SensitiveInfo + private String privateKey; + + /** 应用公钥证书 */ + @Schema(description = "应用公钥证书") + @SensitiveInfo + private String appCert; + + /** 支付宝公钥证书 */ + @Schema(description = "支付宝公钥证书") + @SensitiveInfo + private String alipayCert; + + /** 支付宝CA根证书 */ + @Schema(description = "支付宝CA根证书") + @SensitiveInfo + private String alipayRootCert; + + /** 是否沙箱环境 */ + @Schema(description = "是否沙箱环境") + private boolean sandbox; + + /** 服务商号 */ + @Schema(description = "服务商号") + private String appId; + +} + diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipaySubConfigResult.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipaySubConfigResult.java new file mode 100644 index 00000000..67925d78 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipaySubConfigResult.java @@ -0,0 +1,41 @@ +package org.dromara.daxpay.channel.alipay.result.config; + +import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 支付宝配置 + * @author xxm + * @since 2024/6/25 + */ +@Data +@Accessors(chain = true) +@Schema(title = "支付宝配置") +public class AlipaySubConfigResult { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** 支付宝特约商户Token */ + @SensitiveInfo + @Schema(description = "支付宝特约商户Token") + private String appAuthToken; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + + /** + * 是商家与支付宝签约后,商家获得的支付宝商家唯一识别码,以 2088 开头的 16 位数字组成,在开放平台中账户中心获取 + */ + @Schema(description = "支付宝商家唯一识别码") + private String alipayUserId; + + /** 商户AppId */ + @Schema(description = "商户AppId") + private String appId; + +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/CreatContractParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/CreatContractParam.java deleted file mode 100644 index 90a53aeb..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/CreatContractParam.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.dromara.daxpay.channel.alipay.sdk.contract; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 开启代商户签约事务 - * @author xxm - * @since 2024/10/31 - */ -@Data -@Accessors(chain = true) -public class CreatContractParam { - - /** - * 【描述】isv代操作的商户账号,可以是支付宝账号,也可以是pid(2088开头) - * 【示例值】test@alipay.com - */ - private String account; - - /** - * 【描述】商户联系人信息,包含联系人名称、手机、邮箱信息。联系人信息将用于接受签约后的重要通知,如确认协议、到期提醒等。 - */ - @JsonProperty("contact_info") - private ContactInfo contactInfo; - - /** - * 【描述】订单授权凭证。若传入本参数,则对应事务提交后进入预授权模式。 - * 【示例值】00ee2d475f374ad097ee0f1ac223fX00 - */ - @JsonProperty("order_ticket") - private String orderTicket; - - /** - * 商户联系人信息 - * @author xxm - * @since 2024/10/31 - */ - @Data - @Accessors(chain = true) - public static class ContactInfo{ - /** - * 【描述】联系人名称 - * 【示例值】张三 - */ - @JsonProperty("contact_name") - private String contactName; - /** - * 【描述】联系人手机号码 - * 【示例值】18866668888 - */ - @JsonProperty("contact_mobile") - private String contactMobile; - /** - * 【描述】联系人邮箱 - * 【示例值】zhangsan@alipy.com - */ - @JsonProperty("contact_email") - private String contactEmail; - - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/QueryContractParam.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/QueryContractParam.java deleted file mode 100644 index 2b4200ed..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/sdk/contract/QueryContractParam.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dromara.daxpay.channel.alipay.sdk.contract; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 查询签约申请单状态参数 - * @author xxm - * @since 2024/11/16 - */ -@Data -@Accessors(chain = true) -public class QueryContractParam { - /** 操作事务编号 */ - @JsonProperty("batch_no") - private String batchNo; -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverBindService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverBindService.java deleted file mode 100644 index dd22e732..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverBindService.java +++ /dev/null @@ -1,234 +0,0 @@ -package org.dromara.daxpay.channel.alipay.service.allocation; - -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.exception.ValidationFailedException; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.channel.alipay.code.AlipayCode; -import org.dromara.daxpay.channel.alipay.dao.allocation.AlipayAllocReceiverBindManager; -import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiverBind; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindParam; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverBindQuery; -import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverBindResult; -import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.util.StrUtil; -import com.alipay.api.AlipayApiException; -import com.alipay.api.AlipayConstants; -import com.alipay.api.AlipayResponse; -import com.alipay.api.domain.AlipayTradeRoyaltyRelationBindModel; -import com.alipay.api.domain.AlipayTradeRoyaltyRelationUnbindModel; -import com.alipay.api.domain.RoyaltyEntity; -import com.alipay.api.request.AlipayTradeRoyaltyRelationBindRequest; -import com.alipay.api.request.AlipayTradeRoyaltyRelationUnbindRequest; -import com.alipay.api.response.AlipayTradeRoyaltyRelationBindResponse; -import com.alipay.api.response.AlipayTradeRoyaltyRelationUnbindResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -/** - * 支付宝分账接收方绑定服务类 - * @author xxm - * @since 2025/1/27 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AlipayAllocReceiverBindService { - - private final AlipayConfigService alipayConfigService; - - private final AlipayAllocReceiverBindManager receiverBindManager; - - private final PaymentAssistService paymentAssistService; - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, AlipayAllocReceiverBindQuery query){ - return MpUtil.toPageResult(receiverBindManager.page(pageParam, query)); - } - - /** - * 查询详情 - */ - public AlipayAllocReceiverBindResult findById(Long id){ - return receiverBindManager.findById(id).map(AlipayAllocReceiverBind::toResult).orElseThrow(() -> new DataNotExistException("分账接收方不存在")); - } - - /** - * 添加 - */ - public void add(AlipayAllocReceiverBindParam param){ - // 校验 - if (!this.validation(param)){ - throw new ValidationFailedException("分账接收者参数未通过校验"); - } - paymentAssistService.initMchAndApp(param.getAppId()); - var receiverBind = AlipayAllocReceiverBind.init(param); - receiverBindManager.save(receiverBind); - } - - /** - * 编辑 - */ - public void update(AlipayAllocReceiverBindParam param){ - var receiverBind = receiverBindManager.findById(param.getId()).orElseThrow(() -> new DataNotExistException("分账接收方不存在")); - if (receiverBind.isBind()){ - throw new DataErrorException("分账接收方已绑定"); - } - BeanUtil.copyProperties(param,receiverBind, CopyOptions.create().ignoreNullValue()); - receiverBindManager.updateById(receiverBind); - } - - /** - * 绑定关系 - */ - public void bind(Long id){ - var receiverBind = receiverBindManager.findById(id).orElseThrow(() -> new DataNotExistException("分账接收方不存在")); - if (receiverBind.isBind()){ - throw new DataErrorException("分账接收方已绑定"); - } - paymentAssistService.initMchAndApp(receiverBind.getAppId()); - var aliPayConfig = alipayConfigService.getAndCheckConfig(receiverBind.isIsv()); - var model = new AlipayTradeRoyaltyRelationBindModel(); - RoyaltyEntity entity = new RoyaltyEntity(); - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(receiverBind.getReceiverType()); - entity.setType(this.getReceiverType(receiverTypeEnum)); - entity.setAccount(receiverBind.getReceiverAccount()); - entity.setName(receiverBind.getReceiverName()); - entity.setMemo(receiverBind.getRelationName()); - - // 不报错视为同步成功 - model.setReceiverList(Collections.singletonList(entity)); - AlipayTradeRoyaltyRelationBindRequest request = new AlipayTradeRoyaltyRelationBindRequest(); - // 特约商户调用 - if (aliPayConfig.isIsv()){ - request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); - } - model.setOutRequestNo(String.valueOf(receiverBind.getId())); - request.setBizModel(model); - AlipayTradeRoyaltyRelationBindResponse response = null; - try { - response = alipayConfigService.execute(request,aliPayConfig); - } catch (AlipayApiException e) { - log.error("支付宝分账接收方绑定失败", e); - throw new TradeFailException("支付宝分账接收方绑定失败: "+e.getMessage()); - } - String errorMsg = this.verifyErrorMsg(response); - if (StrUtil.isBlank(errorMsg)){ - receiverBind.setBind(true); - } - receiverBind.setErrorMsg(errorMsg); - receiverBindManager.updateById(receiverBind); - } - - /** - * 解绑关系 - */ - public void unbind(Long id){ - var receiverBind = receiverBindManager.findById(id).orElseThrow(() -> new DataNotExistException("分账接收方不存在")); - if (!receiverBind.isBind()){ - throw new DataErrorException("分账接收方已解绑"); - } - paymentAssistService.initMchAndApp(receiverBind.getAppId()); - var aliPayConfig = alipayConfigService.getAndCheckConfig(receiverBind.isIsv()); - - AlipayTradeRoyaltyRelationUnbindModel model = new AlipayTradeRoyaltyRelationUnbindModel(); - model.setOutRequestNo(String.valueOf(receiverBind.getId())); - - RoyaltyEntity entity = new RoyaltyEntity(); - - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(receiverBind.getReceiverType()); - entity.setType(this.getReceiverType(receiverTypeEnum)); - entity.setAccount(receiverBind.getReceiverAccount()); - - model.setReceiverList(Collections.singletonList(entity)); - AlipayTradeRoyaltyRelationUnbindRequest request = new AlipayTradeRoyaltyRelationUnbindRequest(); - // 特约商户调用 - if (aliPayConfig.isIsv()){ - request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); - } - request.setBizModel(model); - AlipayTradeRoyaltyRelationUnbindResponse response; - try { - response = alipayConfigService.execute(request,aliPayConfig); - } catch (AlipayApiException e) { - log.error("支付宝分账接收方解绑失败", e); - throw new TradeFailException("支付宝分账接收方解绑失败: "+e.getMessage()); - } - // 如果出现分账方不存在也视为成功 - if (Objects.equals(response.getSubCode(), AlipayCode.USER_NOT_EXIST)) { - return; - } - String errorMsg = this.verifyErrorMsg(response); - if (StrUtil.isBlank(errorMsg)){ - receiverBind.setBind(false); - } - receiverBind.setErrorMsg(errorMsg); - receiverBindManager.updateById(receiverBind); - } - - /** - * 验证错误信息 - */ - private String verifyErrorMsg(AlipayResponse alipayResponse) { - if (!Objects.equals(alipayResponse.getCode(), AlipayCode.ResponseCode.SUCCESS)) { - String errorMsg = alipayResponse.getSubMsg(); - if (StrUtil.isBlank(errorMsg)) { - errorMsg = alipayResponse.getMsg(); - } - return errorMsg; - } - return null; - } - - /** - * 删除 - */ - public void remove(Long id){ - var receiverBind = receiverBindManager.findById(id) - .orElseThrow(() -> new DataNotExistException("分账接收方不存在")); - if (receiverBind.isBind()){ - throw new DataErrorException("分账接收方已绑定, 无法删除"); - } - } - - /** - * 获取分账接收方类型编码 - */ - private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ - if (receiverTypeEnum == AllocReceiverTypeEnum.USER_ID){ - return "userId"; - } - if (receiverTypeEnum == AllocReceiverTypeEnum.OPEN_ID){ - return "openId"; - } - if (receiverTypeEnum == AllocReceiverTypeEnum.LOGIN_NAME){ - return "loginName"; - } - throw new ConfigErrorException("分账接收方类型错误"); - } - - /** - * 校验 - */ - private boolean validation(AlipayAllocReceiverBindParam allocReceiver){ - List list = Arrays.asList(AllocReceiverTypeEnum.USER_ID.getCode(), AllocReceiverTypeEnum.OPEN_ID.getCode(), AllocReceiverTypeEnum.LOGIN_NAME.getCode()); - String receiverType = allocReceiver.getReceiverType(); - return list.contains(receiverType); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java deleted file mode 100644 index 91d2d3b5..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.dromara.daxpay.channel.alipay.service.allocation; - -import org.dromara.daxpay.channel.alipay.convert.AlipayAllocReceiverConvert; -import org.dromara.daxpay.channel.alipay.entity.allocation.AlipayAllocReceiver; -import org.dromara.daxpay.channel.alipay.param.allocation.AlipayAllocReceiverParam; -import org.dromara.daxpay.channel.alipay.result.allocation.AlipayAllocReceiverResult; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.core.exception.ConfigNotEnableException; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.lang.UUID; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Objects; - -/** - * 支付宝分账接收者管理 - * @author xxm - * @since 2024/3/28 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AlipayAllocReceiverService { - - private final AllocReceiverManager receiverManager; - - private final PaymentAssistService paymentAssistService; - - /** - * 获取支付宝分账接收方 - */ - public AlipayAllocReceiverResult findById(Long id){ - return receiverManager.findById(id) - .map(AlipayAllocReceiver::convertChannel) - .map(AlipayAllocReceiver::toResult) - .orElseThrow(() -> new ConfigNotEnableException("乐刷分账接收方不存在")); - - } - - /** - * 新增或修改 - */ - public void saveOrUpdate(AlipayAllocReceiverParam param){ - if(param.getId() == null){ - add(param); - }else{ - update(param); - } - } - - /** - * 添加 - */ - public void add(AlipayAllocReceiverParam param){ - paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - AlipayAllocReceiver entity = AlipayAllocReceiverConvert.CONVERT.toEntity(param); - AllocReceiver receiver = entity.toReceiver(param.isIsv()); - String uuid = UUID.fastUUID().toString(true); - receiver.setReceiverNo(uuid); - receiverManager.save(receiver); - } - - /** - * 更新 - */ - public void update(AlipayAllocReceiverParam param){ - var allocReceiver = receiverManager.findById(param.getId()) - .orElseThrow(() -> new ConfigNotEnableException("乐刷分账接收方不存在")); - // 通道配置 --转换--> 乐刷配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新 - var leshuaConfig = AlipayAllocReceiver.convertChannel(allocReceiver); - BeanUtil.copyProperties(param, leshuaConfig, CopyOptions.create() - .ignoreNullValue()); - - var receiver = leshuaConfig.toReceiver(Objects.equals(allocReceiver.getChannel(), ChannelEnum.ALIPAY_ISV.getCode())); - // 手动清空一下默认的数据版本号 - receiver.setVersion(null); - BeanUtil.copyProperties(receiver, allocReceiver, CopyOptions.create() - .ignoreNullValue()); - receiverManager.updateById(allocReceiver); - } - -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/allocation/AlipayAllocationService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/allocation/AlipayAllocationService.java deleted file mode 100644 index be2d3d5b..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/allocation/AlipayAllocationService.java +++ /dev/null @@ -1,190 +0,0 @@ -package org.dromara.daxpay.channel.alipay.service.payment.allocation; - -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; -import org.dromara.daxpay.channel.alipay.code.AlipayCode; -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.alipay.api.AlipayApiException; -import com.alipay.api.AlipayResponse; -import com.alipay.api.domain.*; -import com.alipay.api.request.AlipayTradeOrderSettleQueryRequest; -import com.alipay.api.request.AlipayTradeOrderSettleRequest; -import com.alipay.api.response.AlipayTradeOrderSettleQueryResponse; -import com.alipay.api.response.AlipayTradeOrderSettleResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * 支付宝分账服务 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AlipayAllocationService { - private final AlipayConfigService aliPayConfigService; - - /** - * 发起分账 - */ - public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, AliPayConfig aliPayConfig){ - // 分账主体参数 - AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel(); - model.setOutRequestNo(allocOrder.getAllocNo()); - model.setTradeNo(allocOrder.getOutOrderNo()); - model.setRoyaltyMode(AlipayCode.ALLOC_ASYNC); - - // 分账子参数 根据Id排序 - orderDetails.sort(Comparator.comparing(MpIdEntity::getId)); - List royaltyParameters = orderDetails.stream() - .map(o -> { - OpenApiRoyaltyDetailInfoPojo infoPojo = new OpenApiRoyaltyDetailInfoPojo(); - infoPojo.setAmount(PayUtil.toDecimal(o.getAmount()).toPlainString()); - infoPojo.setTransIn(o.getReceiverAccount()); - return infoPojo; - }) - .collect(Collectors.toList()); - model.setRoyaltyParameters(royaltyParameters); - AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); - request.setBizModel(model); - AlipayTradeOrderSettleResponse response; - try { - response = aliPayConfigService.execute(request,aliPayConfig); - this.verifyErrorMsg(response); - } catch (AlipayApiException e) { - log.error("网关返回分账失败: {}", e.getMessage()); - throw new TradeFailException(e.getMessage()); - } - // 需要写入到分账订单中 - String settleNo = response.getSettleNo(); - return new AllocStartResultBo().setOutAllocNo(settleNo); - } - - /** - * 分账完结 - */ - public void finish(AllocOrder allocOrder, List orderDetails, AliPayConfig aliPayConfig){ - // 分账主体参数 - AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel(); - model.setOutRequestNo(allocOrder.getAllocNo()); - model.setTradeNo(allocOrder.getOutOrderNo()); - model.setRoyaltyMode(AlipayCode.ALLOC_ASYNC); - // 分账完结参数 - SettleExtendParams extendParams = new SettleExtendParams(); - extendParams.setRoyaltyFinish(Boolean.TRUE.toString()); - model.setExtendParams(extendParams); - - // 分账子参数 根据Id排序 - orderDetails.sort(Comparator.comparing(MpIdEntity::getId)); - List royaltyParameters = orderDetails.stream() - .map(o -> { - OpenApiRoyaltyDetailInfoPojo infoPojo = new OpenApiRoyaltyDetailInfoPojo(); - infoPojo.setAmount(PayUtil.toDecimal(o.getAmount()).toPlainString()); - infoPojo.setTransIn(o.getReceiverAccount()); - return infoPojo; - }) - .collect(Collectors.toList()); - model.setRoyaltyParameters(royaltyParameters); - AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); - request.setBizModel(model); - AlipayTradeOrderSettleResponse response = null; - try { - response = aliPayConfigService.execute(request,aliPayConfig); - } catch (AlipayApiException e) { - log.error("网关返回分账失败: {}", e.getMessage()); - throw new TradeFailException(e.getMessage()); - } - this.verifyErrorMsg(response); - } - - /** - * 分账状态同步 - */ - public AllocSyncResultBo sync(AllocOrder allocOrder, List allocOrderDetails, AliPayConfig aliPayConfig){ - AlipayTradeOrderSettleQueryModel model = new AlipayTradeOrderSettleQueryModel(); - model.setOutRequestNo(allocOrder.getAllocNo()); - model.setTradeNo(allocOrder.getOutOrderNo()); - AlipayTradeOrderSettleQueryRequest request = new AlipayTradeOrderSettleQueryRequest(); - request.setBizModel(model); - AlipayTradeOrderSettleQueryResponse response; - try { - response = aliPayConfigService.execute(request,aliPayConfig); - } catch (AlipayApiException e) { - throw new OperationFailException(e.getMessage()); - } - // 验证 - this.verifyErrorMsg(response); - Map detailMap = allocOrderDetails.stream() - .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); - List royaltyDetailList = response.getRoyaltyDetailList(); - for (RoyaltyDetail receiver : royaltyDetailList) { - var detail = detailMap.get(receiver.getTransIn()); - if (Objects.nonNull(detail)) { - detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode()); - detail.setErrorMsg(receiver.getErrorDesc()); - detail.setOutDetailId(receiver.getDetailId()); - // 如果是完成, 更新时间 - if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ - LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt()); - detail.setFinishTime(finishTime) - .setErrorMsg(null) - .setErrorCode(null); - } - } - } - return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(response)); - } - - /** - * 验证错误信息 - */ - private void verifyErrorMsg(AlipayResponse response) { - if (!response.isSuccess()) { - String errorMsg = response.getSubMsg(); - if (StrUtil.isBlank(errorMsg)) { - errorMsg = response.getMsg(); - } - log.error("分账处理失败 {}", errorMsg); - throw new TradeFailException(errorMsg); - } - } - - /** - * 转换支付宝分账类型到系统中统一的状态 - */ - private AllocDetailResultEnum getDetailResultEnum (String result){ - // 进行中 - if(Objects.equals(AlipayCode.ALLOC_PROCESSING, result)){ - return AllocDetailResultEnum.PENDING; - } - // 成功 - if(Objects.equals(AlipayCode.ALLOC_SUCCESS, result)){ - return AllocDetailResultEnum.SUCCESS; - } - // 失败 - return AllocDetailResultEnum.FAIL; - } - -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/callback/AlipayCallbackService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/callback/AlipayCallbackService.java index fac102f3..d9c17711 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/callback/AlipayCallbackService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/callback/AlipayCallbackService.java @@ -1,16 +1,16 @@ package org.dromara.daxpay.channel.alipay.service.payment.callback; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; +import org.dromara.daxpay.core.context.CallbackLocal; import org.dromara.daxpay.core.enums.CallbackStatusEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.enums.TradeTypeEnum; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.core.context.CallbackLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; -import org.dromara.daxpay.service.service.trade.pay.PayCallbackService; -import org.dromara.daxpay.service.service.trade.refund.RefundCallbackService; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayCallbackService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundCallbackService; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.StrUtil; @@ -23,6 +23,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Map; import java.util.Objects; +import java.util.Optional; import static org.dromara.daxpay.channel.alipay.code.AlipayCode.*; @@ -120,7 +121,11 @@ public class AlipayCallbackService { // 支付金额 String amountStr = callbackParam.get(ResponseParams.TOTAL_AMOUNT); callback.setAmount(new BigDecimal(amountStr)); - + // 实付金额 + callback.setRealAmount(new BigDecimal(callbackParam.get("buyer_pay_amount"))); + // 用户ID + String buyId = Optional.ofNullable(callbackParam.get("buyer_user_id")).orElse(callbackParam.get("buyer_open_id")); + callback.setBuyerId(buyId); // 支付时间 String gmpTime = callbackParam.get(ResponseParams.GMT_PAYMENT); if (StrUtil.isNotBlank(gmpTime)) { diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/close/AlipayCloseService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/close/AlipayCloseService.java index 9bb5ee3e..283a4100 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/close/AlipayCloseService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/close/AlipayCloseService.java @@ -7,8 +7,8 @@ import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipaySyncService; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayConstants; import com.alipay.api.domain.AlipayTradeCancelModel; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/config/AlipayConfigService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/config/AlipayConfigService.java index af2a229a..fb0ed048 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/config/AlipayConfigService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/config/AlipayConfigService.java @@ -1,24 +1,22 @@ package org.dromara.daxpay.channel.alipay.service.payment.config; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.core.util.CertUtil; -import cn.bootx.platform.core.util.JsonUtil; import org.dromara.daxpay.channel.alipay.code.AlipayCode; import org.dromara.daxpay.channel.alipay.convert.AlipayConfigConvert; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.param.config.AlipayConfigParam; import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; -import org.dromara.daxpay.core.context.MchAppLocal; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.core.enums.MerchantTypeEnum; import org.dromara.daxpay.core.exception.ChannelNotEnableException; import org.dromara.daxpay.core.exception.ConfigNotEnableException; import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.service.common.cache.ChannelConfigCacheService; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.config.ChannelConfigManager; -import org.dromara.daxpay.service.entity.config.ChannelConfig; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.config.PlatformConfigService; +import org.dromara.daxpay.service.merchant.cache.ChannelConfigCacheService; +import org.dromara.daxpay.service.merchant.dao.config.ChannelConfigManager; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.util.CharsetUtil; @@ -45,7 +43,6 @@ import java.util.Objects; public class AlipayConfigService { private final ChannelConfigManager channelConfigManager; private final ChannelConfigCacheService channelConfigCacheService; - private final PlatformConfigService platformConfigService; private final PaymentAssistService paymentAssistService; /** @@ -58,6 +55,7 @@ public class AlipayConfigService { .orElseThrow(() -> new ConfigNotEnableException("支付宝商户配置不存在")); } + /** * 新增或更新商户信息 */ @@ -75,13 +73,10 @@ public class AlipayConfigService { */ public void save(AlipayConfigParam param) { paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - // 判断商户配置类型 - if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){ - throw new ChannelNotEnableException("请使用特约商户配置保存"); - } + var mchApp = PaymentContextLocal.get().getReqInfo(); // 转换类型 var entity = AlipayConfigConvert.CONVERT.toEntity(param); + entity.setMchNo(mchApp.getMchNo()); ChannelConfig channelConfig = entity.toChannelConfig(); // 判断商户和应用下是否存在该配置 if (channelConfigManager.existsByAppIdAndChannel(param.getAppId(), channelConfig.getChannel())){ @@ -95,48 +90,44 @@ public class AlipayConfigService { */ public void update(AlipayConfigParam param){ paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - // 判断商户配置类型 - if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){ - throw new ChannelNotEnableException("请使用特约商户配置更新"); - } ChannelConfig channelConfig = channelConfigManager.findById(param.getId()) .orElseThrow(() -> new ConfigNotEnableException("支付宝配置不存在")); // 通道配置 --转换--> 支付宝配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新 AliPayConfig alipayConfig = AliPayConfig.convertConfig(channelConfig); BeanUtil.copyProperties(param, alipayConfig, CopyOptions.create().ignoreNullValue()); ChannelConfig channelConfigParam = alipayConfig.toChannelConfig(); - // 手动清空一下默认的数据版本号 - channelConfigParam.setVersion(null); + // 手动写入一下原来的数据版本号 + channelConfigParam.setVersion(channelConfig.getVersion()); BeanUtil.copyProperties(channelConfigParam, channelConfig, CopyOptions.create().ignoreNullValue()); channelConfigManager.updateById(channelConfig); } + /** * 获取异步通知地址 */ public String getNotifyUrl(boolean isv) { - String url = isv?"{}/unipay/callback/{}/alipay/isv":"{}/unipay/callback/{}/alipay"; - var mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId()); + String url = isv?"{}/unipay/callback/{}/{}/alipay/isv":"{}/unipay/callback/{}/{}/alipay"; + var reqInfo = PaymentContextLocal.get().getReqInfo(); + return StrUtil.format(url,reqInfo.getGatewayServiceUrl(), reqInfo.getMchNo(),reqInfo.getAppId()); } /** * 获取同步通知地址 */ public String getReturnUrl(boolean isv) { - String url = isv?"{}/unipay/return/{}/alipay/isv":"{}/unipay/return/{}/alipay"; - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId()); + String url = isv?"{}/unipay/return/{}/{}/alipay/isv":"{}/unipay/return/{}/{}/alipay"; + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + return StrUtil.format(url,reqInfo.getGatewayH5Url(), reqInfo.getMchNo(),reqInfo.getAppId()); } /** * 获取支付宝支付配置 */ public AliPayConfig getAliPayConfig(boolean isv){ - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(mchAppInfo.getAppId(), isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode()); - return AliPayConfig.convertConfig(channelConfig); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(reqInfo.getAppId(), isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode()); + return AliPayConfig.convertConfig(channelConfig); } /** @@ -183,7 +174,7 @@ public class AlipayConfigService { * 校验消息通知 */ public boolean verifyNotify(Map params, boolean isv) { - String callReq = JsonUtil.toJsonStr(params); + String callReq = JacksonUtil.toJson(params); log.info("支付宝消息通知报文: {}", callReq); String appId = params.get("app_id"); if (StrUtil.isBlank(appId)) { diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/extra/AlipayAuthService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/extra/AlipayAuthService.java index d42473a3..7ec96ff9 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/extra/AlipayAuthService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/extra/AlipayAuthService.java @@ -3,10 +3,10 @@ package org.dromara.daxpay.channel.alipay.service.payment.extra; import cn.bootx.platform.core.exception.BizException; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; -import org.dromara.daxpay.core.context.MchAppLocal; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.assist.AuthUrlResult; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.alipay.api.request.AlipaySystemOauthTokenRequest; @@ -34,8 +34,8 @@ public class AlipayAuthService { */ public AuthUrlResult generateAuthUrl(String authPath, String channel, String appId, String aliAppId) { String queryCode = RandomUtil.randomString(10); - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - String serverUrl = mchAppInfo.getGatewayMobileUrl(); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + String serverUrl = reqInfo.getGatewayH5Url(); if (StrUtil.isBlank(authPath)){ authPath = StrUtil.format("/auth/alipay/{}/{}/{}/{}", appId, channel, queryCode, aliAppId); } diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/notice/AlipayTransferNoticeService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/notice/AlipayTransferNoticeService.java index c15bb06d..fe6ad115 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/notice/AlipayTransferNoticeService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/notice/AlipayTransferNoticeService.java @@ -1,17 +1,16 @@ package org.dromara.daxpay.channel.alipay.service.payment.notice; -import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.json.JSONUtil; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import org.dromara.daxpay.channel.alipay.code.AlipayCode; import org.dromara.daxpay.channel.alipay.result.notice.AlipayOrderChangedResult; +import org.dromara.daxpay.core.context.CallbackLocal; import org.dromara.daxpay.core.enums.CallbackStatusEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.TradeTypeEnum; import org.dromara.daxpay.core.enums.TransferStatusEnum; -import org.dromara.daxpay.core.context.CallbackLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; -import org.dromara.daxpay.service.service.trade.transfer.TransferCallbackService; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferCallbackService; import cn.hutool.core.bean.BeanUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -51,14 +50,14 @@ public class AlipayTransferNoticeService { */ public String callback(Map map) { CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); - callbackInfo.setRawData(JsonUtil.toJsonStr(map)) + callbackInfo.setRawData(JacksonUtil.toJson(map)) .setChannel(ChannelEnum.ALIPAY.getCode()) .setCallbackType(TradeTypeEnum.TRANSFER); // 通过 biz_content 获取值 try { String bizContent = map.get("biz_content"); - var response = JSONUtil.toBean(bizContent, AlipayOrderChangedResult.class); + var response = JacksonUtil.toBean(bizContent, AlipayOrderChangedResult.class); callbackInfo.setCallbackData(BeanUtil.beanToMap(response)); this.resolveData(response); return "success"; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/pay/AliPayService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/pay/AliPayService.java index 0756fdfb..fa433dc4 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/pay/AliPayService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/pay/AliPayService.java @@ -8,8 +8,8 @@ import org.dromara.daxpay.core.enums.PayMethodEnum; import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.StrUtil; @@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; import java.util.Objects; @@ -238,6 +239,8 @@ public class AliPayService { request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); } request.setBizModel(model); + // 异步回调必须到当前系统中 + request.setNotifyUrl(aliPayConfigService.getNotifyUrl(aliPayConfig.isIsv())); try { AlipayTradeCreateResponse response = aliPayConfigService.execute(request,aliPayConfig); this.verifyErrorMsg(response); @@ -315,7 +318,9 @@ public class AliPayService { Date gmtPayment = response.getGmtPayment(); result.setOutOrderNo(response.getTradeNo()) .setComplete(true) - .setFinishTime(LocalDateTimeUtil.of(gmtPayment)); + .setFinishTime(LocalDateTimeUtil.of(gmtPayment)) + .setRealAmount(new BigDecimal(response.getBuyerPayAmount())) + .setBuyerId(response.getBuyerOpenId()); } // 非支付中响应码, 进行错误处理 if (!Objects.equals(response.getCode(), AlipayCode.ResponseCode.INPROCESS)) { diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/redirect/AlipayRedirectUrlService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/redirect/AlipayRedirectUrlService.java index 413a87d1..e28c0d8b 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/redirect/AlipayRedirectUrlService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/redirect/AlipayRedirectUrlService.java @@ -4,12 +4,11 @@ import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.exception.ValidationFailedException; import org.dromara.daxpay.channel.alipay.code.AlipayCode; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; -import org.dromara.daxpay.core.context.MchAppLocal; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.config.PlatformConfigService; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import cn.hutool.core.util.StrUtil; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; @@ -29,7 +28,6 @@ import java.util.Map; public class AlipayRedirectUrlService { private final AlipayConfigService aliPayConfigService; private final PayOrderManager payOrderManager; - private final PlatformConfigService platformConfigService; /** * 回调地址处理 @@ -49,8 +47,8 @@ public class AlipayRedirectUrlService { if (StrUtil.isNotBlank(order.getReturnUrl())){ return StrUtil.format("{}?biz_trade_no={}&trade_no={}", order.getReturnUrl(),order.getBizOrderNo(),order.getOrderNo() ); } else { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - String serverUrl = mchAppInfo.getGatewayMobileUrl(); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + String serverUrl = reqInfo.getGatewayH5Url(); return StrUtil.format("{}/paySuccess/{}", serverUrl,order.getOrderNo()); } diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/refund/AlipayRefundService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/refund/AlipayRefundService.java index 5a16f651..e1445215 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/refund/AlipayRefundService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/refund/AlipayRefundService.java @@ -6,8 +6,8 @@ import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayConstants; import com.alipay.api.domain.AlipayTradeRefundModel; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayRefundSyncService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayRefundSyncService.java index 99121f88..d93d9d8e 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayRefundSyncService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayRefundSyncService.java @@ -1,12 +1,12 @@ package org.dromara.daxpay.channel.alipay.service.payment.sync; -import cn.bootx.platform.core.util.JsonUtil; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import org.dromara.daxpay.channel.alipay.code.AlipayCode; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import cn.hutool.core.date.LocalDateTimeUtil; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayConstants; @@ -54,7 +54,7 @@ public class AlipayRefundSyncService { } request.setBizModel(model); AlipayTradeFastpayRefundQueryResponse response = aliPayConfigService.execute(request,aliPayConfig); - syncResult.setSyncData(JsonUtil.toJsonStr(response)); + syncResult.setSyncData(JacksonUtil.toJson(response)); // 失败 if (!response.isSuccess()) { syncResult.setSyncSuccess(false) diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipaySyncService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipaySyncService.java index e65f0407..34ae3a33 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipaySyncService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipaySyncService.java @@ -1,13 +1,13 @@ package org.dromara.daxpay.channel.alipay.service.payment.sync; -import cn.bootx.platform.core.util.JsonUtil; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import org.dromara.daxpay.channel.alipay.code.AlipayCode; import org.dromara.daxpay.channel.alipay.code.AlipayCode.PayStatus; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import cn.hutool.core.date.LocalDateTimeUtil; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayConstants; @@ -18,8 +18,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Objects; +import java.util.Optional; /** @@ -56,14 +58,18 @@ public class AlipaySyncService { request.setBizModel(model); AlipayTradeQueryResponse response = aliPayConfigService.execute(request,aliPayConfig); String tradeStatus = response.getTradeStatus(); - syncResult.setSyncData(JsonUtil.toJsonStr(response)); + syncResult.setSyncData(JacksonUtil.toJson(response)); // 设置网关订单号 syncResult.setOutOrderNo(response.getTradeNo()); // 支付完成 部分退款无法进行区分, 需要借助对账进行处理 if (Objects.equals(tradeStatus, PayStatus.TRADE_SUCCESS) || Objects.equals(tradeStatus, PayStatus.TRADE_FINISHED)) { // 支付完成时间 LocalDateTime payTime = LocalDateTimeUtil.of(response.getSendPayDate()); - return syncResult.setPayStatus(PayStatusEnum.SUCCESS).setFinishTime(payTime); + String userOrOpenId = Optional.ofNullable(response.getBuyerOpenId()) + .orElse(response.getBuyerUserId()); + return syncResult.setPayStatus(PayStatusEnum.SUCCESS).setFinishTime(payTime) + .setRealAmount(new BigDecimal(response.getBuyerPayAmount())) + .setBuyerId(userOrOpenId); } // 待支付 if (Objects.equals(tradeStatus, PayStatus.WAIT_BUYER_PAY)) { diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayTransferSyncService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayTransferSyncService.java index 1d81934e..58320b85 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayTransferSyncService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/sync/AlipayTransferSyncService.java @@ -1,12 +1,12 @@ package org.dromara.daxpay.channel.alipay.service.payment.sync; -import cn.bootx.platform.core.util.JsonUtil; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import org.dromara.daxpay.channel.alipay.code.AlipayCode.TransferStatus; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.core.enums.TransferStatusEnum; -import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayConstants; import com.alipay.api.domain.AlipayFundTransCommonQueryModel; @@ -51,7 +51,7 @@ public class AlipayTransferSyncService { try { var response = aliPayConfigService.execute(request,aliPayConfig); // 设置网关订单号 - syncResult.setSyncData(JsonUtil.toJsonStr(response)); + syncResult.setSyncData(JacksonUtil.toJson(response)); // 设置网关订单号 syncResult.setOutTransferNo(response.getPayFundOrderId()); diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/transfer/AlipayTransferService.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/transfer/AlipayTransferService.java index a4b5649f..42299d4b 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/transfer/AlipayTransferService.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/payment/transfer/AlipayTransferService.java @@ -8,8 +8,8 @@ import org.dromara.daxpay.core.enums.TransferStatusEnum; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.TransferResultBo; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import com.alipay.api.domain.AlipayFundAccountQueryModel; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java index 20c20ef0..bcbf2940 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java @@ -1,15 +1,14 @@ package org.dromara.daxpay.channel.alipay.strategy.merchant; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.core.exception.ValidationFailedException; -import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.json.JSONUtil; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.param.pay.AlipayParam; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.channel.alipay.service.payment.pay.AliPayService; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.strategy.AbsPayStrategy; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsPayStrategy; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONException; import lombok.RequiredArgsConstructor; @@ -50,7 +49,7 @@ public class AliPayStrategy extends AbsPayStrategy { // 支付宝参数验证 String channelParam = this.getPayParam().getExtraParam(); if (StrUtil.isNotBlank(channelParam)) { - this.aliPayParam = JSONUtil.toBean(channelParam, AlipayParam.class); + this.aliPayParam = JacksonUtil.toBean(channelParam, AlipayParam.class); } else { this.aliPayParam = new AlipayParam(); diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java index 62c891ac..1e16b5af 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java @@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipayTransferSyncService; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo; -import org.dromara.daxpay.service.strategy.AbsSyncTransferOrderStrategy; +import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsSyncTransferOrderStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java deleted file mode 100644 index d671e6db..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.dromara.daxpay.channel.alipay.strategy.merchant; - -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.service.payment.allocation.AlipayAllocationService; -import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 支付宝分账 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class AlipayAllocationStrategy extends AbsAllocationStrategy { - - private final AlipayAllocationService aliPayAllocationService; - - private final AlipayConfigService aliPayConfigService; - - /** - * 分账通道 - */ - @Override - public String getChannel() { - return ChannelEnum.ALIPAY.getCode(); - } - - /** - * 开始分账 - */ - @Override - public AllocStartResultBo start() { - AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); - return aliPayAllocationService.start(getOrder(), getDetails(), aliPayConfig); - } - - /** - * 分账完结 - */ - @Override - public void finish() { - AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); - aliPayAllocationService.finish(getOrder(), getDetails(), aliPayConfig); - } - - /** - * 同步状态 - */ - @Override - public AllocSyncResultBo doSync() { - AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); - return aliPayAllocationService.sync(getOrder(), getDetails(), aliPayConfig); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java index f34bbc58..17c3ec8d 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java @@ -8,7 +8,7 @@ import org.dromara.daxpay.core.param.assist.AuthCodeParam; import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.assist.AuthUrlResult; -import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy; +import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayChannelBasicStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayChannelBasicStrategy.java new file mode 100644 index 00000000..550bfec7 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayChannelBasicStrategy.java @@ -0,0 +1,43 @@ +package org.dromara.daxpay.channel.alipay.strategy.merchant; + +import cn.bootx.platform.core.rest.dto.KeyValue; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.pay.strategy.AbsChannelBasicStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Stream; + +import static org.dromara.daxpay.core.enums.PayMethodEnum.*; + +/** + * + * @author xxm + * @since 2025/6/4 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AlipayChannelBasicStrategy extends AbsChannelBasicStrategy { + /** + * 获取通道的支付列表 + */ + @Override + public List payMethodList() { + return Stream.of(WAP,WEB,APP,QRCODE,BARCODE,JSAPI ) + .map(payMethodEnum -> new KeyValue(payMethodEnum.getCode(), payMethodEnum.getName())) + .toList(); + } + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY.getCode(); + } +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java index 31c66c3d..7bc2aa31 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java @@ -5,7 +5,7 @@ import org.dromara.daxpay.channel.alipay.service.payment.close.AlipayCloseServic import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.CloseTypeEnum; -import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy; +import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayGatewayPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayGatewayPayStrategy.java index 56aed56c..15516d2b 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayGatewayPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayGatewayPayStrategy.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.alipay.strategy.merchant; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy; +import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java index fa13109f..452232ef 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java @@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.channel.alipay.service.payment.refund.AlipayRefundService; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.strategy.AbsRefundStrategy; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsRefundStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java index 52b8fb74..efc2ca3c 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java @@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipaySyncService; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsSyncPayOrderStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java index 2adb88fb..f3839978 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java @@ -5,9 +5,9 @@ import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigServ import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipayRefundSyncService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.strategy.AbsSyncRefundOrderStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java index d7a3ecf4..d61c2984 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java @@ -6,8 +6,8 @@ import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigServ import org.dromara.daxpay.channel.alipay.service.payment.transfer.AlipayTransferService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; -import org.dromara.daxpay.service.bo.trade.TransferResultBo; -import org.dromara.daxpay.service.strategy.AbsTransferStrategy; +import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsTransferStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAllocationStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAllocationStrategy.java deleted file mode 100644 index cc9e304f..00000000 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAllocationStrategy.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.dromara.daxpay.channel.alipay.strategy.sub; - -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.service.payment.allocation.AlipayAllocationService; -import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 支付宝分账 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class AlipaySubAllocationStrategy extends AbsAllocationStrategy { - - private final AlipayAllocationService aliPayAllocationService; - - private final AlipayConfigService aliPayConfigService; - - /** - * 分账通道 - */ - @Override - public String getChannel() { - return ChannelEnum.ALIPAY_ISV.getCode(); - } - - /** - * 开始分账 - */ - @Override - public AllocStartResultBo start() { - AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); - return aliPayAllocationService.start(getOrder(), getDetails(), aliPayConfig); - } - - /** - * 分账完结 - */ - @Override - public void finish() { - AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); - aliPayAllocationService.finish(getOrder(), getDetails(), aliPayConfig); - } - - /** - * 同步状态 - */ - @Override - public AllocSyncResultBo doSync() { - AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); - return aliPayAllocationService.sync(getOrder(), getDetails(), aliPayConfig); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAuthStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAuthStrategy.java index f002586f..dc27a717 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAuthStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubAuthStrategy.java @@ -8,7 +8,7 @@ import org.dromara.daxpay.core.param.assist.AuthCodeParam; import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.assist.AuthUrlResult; -import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy; +import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubChannelBasicStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubChannelBasicStrategy.java new file mode 100644 index 00000000..d1932d05 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubChannelBasicStrategy.java @@ -0,0 +1,43 @@ +package org.dromara.daxpay.channel.alipay.strategy.sub; + +import cn.bootx.platform.core.rest.dto.KeyValue; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.pay.strategy.AbsChannelBasicStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Stream; + +import static org.dromara.daxpay.core.enums.PayMethodEnum.*; + +/** + * + * @author xxm + * @since 2025/6/4 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AlipaySubChannelBasicStrategy extends AbsChannelBasicStrategy { + /** + * 获取通道的支付列表 + */ + @Override + public List payMethodList() { + return Stream.of(WAP,WEB,APP,QRCODE,BARCODE,JSAPI ) + .map(payMethodEnum -> new KeyValue(payMethodEnum.getCode(), payMethodEnum.getName())) + .toList(); + } + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } +} diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubCloseStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubCloseStrategy.java index 9555500f..6b7ed452 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubCloseStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubCloseStrategy.java @@ -5,7 +5,7 @@ import org.dromara.daxpay.channel.alipay.service.payment.close.AlipayCloseServic import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.CloseTypeEnum; -import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy; +import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubGatewayPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubGatewayPayStrategy.java index 97a106e8..c0be2183 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubGatewayPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubGatewayPayStrategy.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.alipay.strategy.sub; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy; +import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -16,6 +16,8 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class AlipaySubGatewayPayStrategy extends AbsGatewayPayStrategy { + + /** * 策略标识, 可以自行进行扩展 * diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubPayStrategy.java index 329f2dff..93ac7bc8 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubPayStrategy.java @@ -1,15 +1,14 @@ package org.dromara.daxpay.channel.alipay.strategy.sub; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.core.exception.ValidationFailedException; -import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.json.JSONUtil; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.param.pay.AlipayParam; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.channel.alipay.service.payment.pay.AliPayService; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.strategy.AbsPayStrategy; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsPayStrategy; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONException; import lombok.RequiredArgsConstructor; @@ -50,7 +49,7 @@ public class AlipaySubPayStrategy extends AbsPayStrategy { // 支付宝参数验证 String channelParam = this.getPayParam().getExtraParam(); if (StrUtil.isNotBlank(channelParam)) { - this.aliPayParam = JSONUtil.toBean(channelParam, AlipayParam.class); + this.aliPayParam = JacksonUtil.toBean(channelParam, AlipayParam.class); } else { this.aliPayParam = new AlipayParam(); diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubRefundStrategy.java index d1156d30..e237a4e1 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubRefundStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubRefundStrategy.java @@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.channel.alipay.service.payment.refund.AlipayRefundService; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.strategy.AbsRefundStrategy; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsRefundStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -42,5 +42,8 @@ public class AlipaySubRefundStrategy extends AbsRefundStrategy { public RefundResultBo doRefundHandler() { AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); return aliRefundService.refund(this.getRefundOrder(), aliPayConfig); + // TODO 模拟调试用 +// return new RefundResultBo().setStatus(RefundStatusEnum.SUCCESS) +// .setFinishTime(LocalDateTime.now()); } } diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncOrderStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncOrderStrategy.java index cf2a5454..a4700c35 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncOrderStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncOrderStrategy.java @@ -4,8 +4,8 @@ import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigService; import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipaySyncService; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsSyncPayOrderStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncRefundStrategy.java index 5a8bcb2b..e84c438e 100644 --- a/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncRefundStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/sub/AlipaySubSyncRefundStrategy.java @@ -5,9 +5,9 @@ import org.dromara.daxpay.channel.alipay.service.payment.config.AlipayConfigServ import org.dromara.daxpay.channel.alipay.service.payment.sync.AlipayRefundSyncService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.strategy.AbsSyncRefundOrderStrategy; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayCallbackController.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayCallbackController.java index d031e68a..0b8409a4 100644 --- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayCallbackController.java +++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayCallbackController.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.union.controller; import cn.bootx.platform.core.annotation.IgnoreAuth; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayConfigController.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayConfigController.java index 6fccd36e..9529a794 100644 --- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayConfigController.java +++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayConfigController.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.channel.union.controller; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; @@ -12,6 +13,7 @@ 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.dromara.daxpay.service.common.code.DaxPayCode; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.*; @Validated @Tag(name = "云闪付支付配置") @RestController +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(groupCode = "UnionPayConfig", groupName = "云闪付配置", moduleCode = "UnionPay", moduleName = "(DaxPay通道)云闪付") @RequestMapping("/union/pay/config") @RequiredArgsConstructor diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayRedirectUrlController.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayRedirectUrlController.java index 17ba5512..e10eeca0 100644 --- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayRedirectUrlController.java +++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/controller/UnionPayRedirectUrlController.java @@ -1,11 +1,11 @@ package org.dromara.daxpay.channel.union.controller; import cn.bootx.platform.core.annotation.IgnoreAuth; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/entity/config/UnionPayConfig.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/entity/config/UnionPayConfig.java index 63b2b9ba..d019c7d3 100644 --- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/entity/config/UnionPayConfig.java +++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/entity/config/UnionPayConfig.java @@ -8,9 +8,9 @@ import org.dromara.daxpay.channel.union.code.UnionPayCode; import org.dromara.daxpay.channel.union.convert.UnionPayConfigConvert; import org.dromara.daxpay.channel.union.result.UnionPayConfigResult; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.entity.config.ChannelConfig; import lombok.Data; import lombok.experimental.Accessors; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; import java.util.Objects; diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/result/UnionPayConfigResult.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/result/UnionPayConfigResult.java index 07ac2059..95c46c39 100644 --- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/result/UnionPayConfigResult.java +++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/result/UnionPayConfigResult.java @@ -1,11 +1,11 @@ package org.dromara.daxpay.channel.union.result; import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo; -import org.dromara.daxpay.service.common.result.MchResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import org.dromara.daxpay.service.merchant.result.info.MchResult; /** * @author xxm diff --git a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/service/config/UnionPayConfigService.java b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/service/config/UnionPayConfigService.java index ac7fd33c..7dc6e90d 100644 --- a/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/service/config/UnionPayConfigService.java +++ b/daxpay-open-channel/daxpay-open-channel-union/src/main/java/org/dromara/daxpay/channel/union/service/config/UnionPayConfigService.java @@ -7,18 +7,16 @@ import org.dromara.daxpay.channel.union.param.config.UnionPayConfigParam; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.exception.ConfigNotEnableException; import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.service.common.cache.ChannelConfigCacheService; -import org.dromara.daxpay.core.context.MchAppLocal; -import org.dromara.daxpay.service.common.local.MchContextLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.config.ChannelConfigManager; -import org.dromara.daxpay.service.entity.config.ChannelConfig; -import org.dromara.daxpay.service.service.config.PlatformConfigService; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; +import org.dromara.daxpay.service.merchant.cache.ChannelConfigCacheService; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.service.merchant.dao.config.ChannelConfigManager; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,7 +32,6 @@ public class UnionPayConfigService { private final ChannelConfigManager channelConfigManager; private final ChannelConfigCacheService channelConfigCacheService; - private final PlatformConfigService platformConfigService; /** * 查询 @@ -91,8 +88,8 @@ public class UnionPayConfigService { * 获取支付宝支付配置 */ public UnionPayConfig getUnionPayConfig(){ - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(mchAppInfo.getAppId(), ChannelEnum.ALIPAY.getCode()); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(reqInfo.getAppId(), ChannelEnum.ALIPAY.getCode()); return UnionPayConfig.convertConfig(channelConfig); } @@ -100,16 +97,16 @@ public class UnionPayConfigService { * 获取支步通知地址 */ public String getNotifyUrl() { - var mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - return StrUtil.format("{}/unipay/callback/{}/union",mchAppInfo.getGatewayServiceUrl(), mchAppInfo.getAppId()); + var reqInfo = PaymentContextLocal.get().getReqInfo(); + return StrUtil.format("{}/unipay/callback/{}/union",reqInfo.getGatewayServiceUrl(), reqInfo.getAppId()); } /** * 获取同步通知地址 */ public String getReturnUrl() { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - return StrUtil.format("{}/unipay/return/{}/union",mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId()); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + return StrUtil.format("{}/unipay/return/{}/union",reqInfo.getGatewayServiceUrl(),reqInfo.getAppId()); } } diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverBindController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverBindController.java deleted file mode 100644 index 5c7c124f..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverBindController.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.dromara.daxpay.channel.wechat.controller.allocation; - -import cn.bootx.platform.core.annotation.OperateLog; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindParam; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindQuery; -import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverBindResult; -import org.dromara.daxpay.channel.wechat.service.allocation.WechatAllocReceiverBindService; -import org.dromara.core.trans.anno.TransMethodResult; -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.*; - -/** - * 微信分账接收方绑定 - * @author xxm - * @since 2025/1/27 - */ -@Validated -@Tag(name = "微信分账接收方绑定") -@RestController -@RequestGroup(groupCode = "WechatAllocReceiver", groupName = "微信分账接收方", moduleCode = "wechatPay") -@RequestMapping("/wechat/allocation/receiver/bind") -@RequiredArgsConstructor -public class WechatAllocReceiverBindController { - - private final WechatAllocReceiverBindService receiverBindService; - - @TransMethodResult - @RequestPath("分页") - @Operation(summary = "分页") - @GetMapping("/page") - public Result> page(PageParam pageParam, WechatAllocReceiverBindQuery param){ - return Res.ok(receiverBindService.page(pageParam,param)); - } - - @TransMethodResult - @RequestPath("详情") - @Operation(summary = "详情") - @GetMapping("/findById") - public Result findById(@NotNull(message = "主键不可为空") Long id){ - return Res.ok(receiverBindService.findById(id)); - } - - @RequestPath("添加") - @Operation(summary = "添加") - @PostMapping("/add") - @OperateLog(title = "添加微信分账接收方绑定 ", businessType = OperateLog.BusinessType.ADD, saveParam = true) - public Result add(@RequestBody @Validated(ValidationGroup.add.class) WechatAllocReceiverBindParam param){ - receiverBindService.add(param); - return Res.ok(); - } - - @RequestPath("编辑") - @Operation(summary = "编辑") - @PostMapping("/update") - @OperateLog(title = "编辑支付宝分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - public Result update(@RequestBody @Validated(ValidationGroup.edit.class) WechatAllocReceiverBindParam param){ - receiverBindService.update(param); - return Res.ok(); - } - - @RequestPath("绑定") - @Operation(summary = "绑定") - @PostMapping("/bind") - @OperateLog(title = "绑定微信分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - public Result bind(@NotNull(message = "主键不可为空") Long id){ - receiverBindService.bind(id); - return Res.ok(); - } - - @RequestPath("解绑") - @Operation(summary = "解绑") - @PostMapping("/unbind") - @OperateLog(title = "解绑微信分账接收方绑定", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - public Result unbind(@NotNull(message = "主键不可为空") Long id){ - receiverBindService.unbind(id); - return Res.ok(); - } - - @RequestPath("删除") - @Operation(summary = "删除") - @PostMapping("/remove") - @OperateLog(title = "删除微信分账接收方绑定", businessType = OperateLog.BusinessType.DELETE, saveParam = true) - public Result remove(@NotNull(message = "主键不可为空") Long id){ - receiverBindService.remove(id); - return Res.ok(); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverController.java deleted file mode 100644 index 382e6629..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/allocation/WechatAllocReceiverController.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.dromara.daxpay.channel.wechat.controller.allocation; - -import cn.bootx.platform.core.annotation.OperateLog; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverParam; -import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverResult; -import org.dromara.daxpay.channel.wechat.service.allocation.WechatAllocReceiverService; -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.*; - -/** - * 微信分账接收方 - * @author xxm - * @since 2025/1/26 - */ -@Validated -@Tag(name = "微信分账接收方管理") -@RestController -@RequestGroup(groupCode = "WechatAllocReceiver", moduleCode = "wechatPay") -@RequestMapping("/wechat/allocation/receiver") -@RequiredArgsConstructor -public class WechatAllocReceiverController { - private final WechatAllocReceiverService receiverService; - - @RequestPath("分账接收方详情") - @Operation(summary = "分账接收方详情") - @GetMapping("/findById") - public Result findById(@NotNull(message = "主键不可为空") Long id) { - return Res.ok(receiverService.findById(id)); - } - - @RequestPath("添加或更新分账接收方") - @Operation(summary = "添加或更新分账接收方") - @PostMapping("/saveOrUpdate") - @OperateLog(title = "添加或更新微信分账接收方", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - public Result saveOrUpdate(@RequestBody @Validated WechatAllocReceiverParam param) { - receiverService.saveOrUpdate(param); - return Res.ok(); - } - -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvConfigController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvConfigController.java new file mode 100644 index 00000000..986e6386 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvConfigController.java @@ -0,0 +1,54 @@ +package org.dromara.daxpay.channel.wechat.controller.isv; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.OperateLog; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.util.ValidationUtil; +import org.dromara.daxpay.channel.wechat.param.config.WechatIsvConfigParam; +import org.dromara.daxpay.channel.wechat.result.config.WechatIsvConfigResult; +import org.dromara.daxpay.channel.wechat.service.isv.WechatIsvConfigService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 微信支付配置 + * @author xxm + * @since 2021/3/19 + */ +@ClientCode({DaxPayCode.Client.ADMIN}) +@Validated +@Tag(name = "微信服务商配置") +@RestController +@RequestMapping("/isv/wechat/config") +@RequestGroup(groupCode = "WechatIsvConfig", groupName = "微信服务商配置", moduleCode = "wechatPay", moduleName = "(DaxPay通道)微信支付") +@AllArgsConstructor +public class WechatIsvConfigController { + + private final WechatIsvConfigService wechatPayConfigService; + + @RequestPath("获取配置") + @Operation(summary = "获取配置") + @GetMapping("/findById") + public Result findById(@NotNull(message = "ID不可为空") Long id) { + return Res.ok(wechatPayConfigService.findById(id)); + } + + @RequestPath("新增或更新") + @Operation(summary = "新增或更新") + @PostMapping("/saveOrUpdate") + @OperateLog(title = "新增或更新微信支付配置", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result saveOrUpdate(@RequestBody @Validated WechatIsvConfigParam param) { + ValidationUtil.validateParam(param); + wechatPayConfigService.saveOrUpdate(param); + return Res.ok(); + } + +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayCallbackController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayCallbackController.java index d0e1d860..abeeb6db 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayCallbackController.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayCallbackController.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.controller.payment; import cn.bootx.platform.core.annotation.IgnoreAuth; +import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatPayCallbackService; +import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatRefundCallbackService; +import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatTransferCallbackService; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatPayCallbackService; -import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatRefundCallbackService; -import org.dromara.daxpay.channel.wechat.service.payment.callback.WechatTransferCallbackService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.RestController; @IgnoreAuth @Tag(name = "微信回调通知控制器") @RestController -@RequestMapping("/unipay/callback/{AppId}/wechat") +@RequestMapping("/unipay/callback/{mchNo}/{AppId}/wechat") @RequiredArgsConstructor public class WechatPayCallbackController { private final WechatTransferCallbackService transferCallbackService; @@ -35,44 +35,44 @@ public class WechatPayCallbackController { @Operation(summary = "微信支付回调(普通商户)") @PostMapping("/pay") - public String wechatPayNotify(@PathVariable("AppId") String appId,HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String wechatPayNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId,HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return payCallbackService.payHandle(request,false); } @Operation(summary = "微信支付回调(特约商户)") @PostMapping("/isv/pay") - public String wechatPayIsvNotify(@PathVariable("AppId") String appId,HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String wechatPayIsvNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId,HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return payCallbackService.payHandle(request,true); } @Operation(summary = "微信退款回调(普通商户)") @PostMapping("/refund") - public String wechatRefundNotify(@PathVariable("AppId") String appId,HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String wechatRefundNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId,HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return refundCallbackService.refundHandle(request,false); } @Operation(summary = "微信退款回调(特约商户)") @PostMapping("/isv/refund") - public String wechatIsvRefundNotify(@PathVariable("AppId") String appId,HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String wechatIsvRefundNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId,HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return refundCallbackService.refundHandle(request,true); } @Operation(summary = "微信转账回调(普通商户)") @PostMapping("/transfer") - public String wechatTransferNotify(@PathVariable("AppId") String appId, HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String wechatTransferNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return transferCallbackService.transferHandle(request,false); } @Operation(summary = "微信转账回调(特约商户)") @PostMapping("/isv/transfer") - public String wechatIsvTransferNotify(@PathVariable("AppId") String appId, HttpServletRequest request) { - paymentAssistService.initMchAndApp(appId); + public String wechatIsvTransferNotify(@PathVariable("mchNo") String mchNo, @PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchAndApp(mchNo, appId); return transferCallbackService.transferHandle(request,true); } } diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayConfigController.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayConfigController.java index 0bcd4617..67ec728d 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayConfigController.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/payment/WechatPayConfigController.java @@ -1,13 +1,18 @@ package org.dromara.daxpay.channel.wechat.controller.payment; +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; import cn.bootx.platform.core.util.ValidationUtil; import org.dromara.daxpay.channel.wechat.param.config.WechatPayConfigParam; +import org.dromara.daxpay.channel.wechat.param.config.WechatPaySubConfigParam; import org.dromara.daxpay.channel.wechat.result.config.WechatPayConfigResult; +import org.dromara.daxpay.channel.wechat.result.config.WechatPaySubConfigResult; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.service.common.code.DaxPayCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; @@ -20,6 +25,7 @@ import org.springframework.web.bind.annotation.*; * @author xxm * @since 2021/3/19 */ +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @Validated @Tag(name = "微信支付配置") @RestController @@ -37,6 +43,13 @@ public class WechatPayConfigController { return Res.ok(wechatPayConfigService.findById(id)); } + @RequestPath("获取特约商户配置") + @Operation(summary = "获取特约商户配置") + @GetMapping("/findSubById") + public Result findSubById(@NotNull(message = "ID不可为空") Long id) { + return Res.ok(wechatPayConfigService.findSubById(id)); + } + @RequestPath("新增或更新商户配置") @Operation(summary = "新增或更新商户配置") @PostMapping("/saveOrUpdate") @@ -46,4 +59,14 @@ public class WechatPayConfigController { return Res.ok(); } + @RequestPath("新增或更新特约商户配置") + @Operation(summary = "新增或更新特约商户配置") + @PostMapping("/saveOrUpdateSub") + @OperateLog(title = "新增或更新微信特约商户支付配置", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result saveOrUpdateSub(@RequestBody @Validated WechatPaySubConfigParam param) { + ValidationUtil.validateParam(param); + wechatPayConfigService.saveOrUpdateSub(param); + return Res.ok(); + } + } diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverBindConvert.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverBindConvert.java deleted file mode 100644 index ba9feb7c..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverBindConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dromara.daxpay.channel.wechat.convert; - -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindParam; -import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverBindResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2025/1/27 - */ -@Mapper -public interface WechatAllocReceiverBindConvert { - WechatAllocReceiverBindConvert CONVERT = Mappers.getMapper(WechatAllocReceiverBindConvert.class); - - WechatAllocReceiverBindResult toResult(WechatAllocReceiverBind wxReceiver); - - WechatAllocReceiverBind toEntity(WechatAllocReceiverBindParam wxReceiver); -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverConvert.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverConvert.java deleted file mode 100644 index 84eda4ed..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatAllocReceiverConvert.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.daxpay.channel.wechat.convert; - -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiver; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverParam; -import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2025/1/26 - */ -@Mapper -public interface WechatAllocReceiverConvert { - WechatAllocReceiverConvert CONVERT = Mappers.getMapper(WechatAllocReceiverConvert.class); - - WechatAllocReceiver copy(WechatAllocReceiver wechatAllocReceiver); - - WechatAllocReceiverResult toResult(WechatAllocReceiver wechatAllocReceiver); - - WechatAllocReceiver toEntity(WechatAllocReceiverParam param); -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvConfigConvert.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvConfigConvert.java new file mode 100644 index 00000000..d64864b7 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvConfigConvert.java @@ -0,0 +1,25 @@ +package org.dromara.daxpay.channel.wechat.convert; + +import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvConfig; +import org.dromara.daxpay.channel.wechat.param.config.WechatIsvConfigParam; +import org.dromara.daxpay.channel.wechat.result.config.WechatIsvConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2024/11/1 + */ +@Mapper +public interface WechatIsvConfigConvert { + WechatIsvConfigConvert CONVERT = Mappers.getMapper(WechatIsvConfigConvert.class); + + WechatIsvConfigResult toResult(WechatIsvConfig wechatIsvConfig); + + WechatIsvConfig toEntity(WechatIsvConfigParam wechatIsvConfigParam); + + WechatIsvConfig copy(WechatIsvConfig wechatIsvConfig); + + +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatPaySubConfigConvert.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatPaySubConfigConvert.java new file mode 100644 index 00000000..8a565d18 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatPaySubConfigConvert.java @@ -0,0 +1,23 @@ +package org.dromara.daxpay.channel.wechat.convert; + +import org.dromara.daxpay.channel.wechat.entity.config.WechatPaySubConfig; +import org.dromara.daxpay.channel.wechat.param.config.WechatPaySubConfigParam; +import org.dromara.daxpay.channel.wechat.result.config.WechatPaySubConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2025/2/11 + */ +@Mapper +public interface WechatPaySubConfigConvert { + WechatPaySubConfigConvert CONVERT = Mappers.getMapper(WechatPaySubConfigConvert.class); + + WechatPaySubConfig toEntity(WechatPaySubConfigParam in); + + WechatPaySubConfig copy(WechatPaySubConfig in); + + WechatPaySubConfigResult toResult(WechatPaySubConfig in); +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindManager.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindManager.java deleted file mode 100644 index f898ec48..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindManager.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.dromara.daxpay.channel.wechat.dao.allocation; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindQuery; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -/** - * - * @author xxm - * @since 2025/1/27 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class WechatAllocReceiverBindManager extends BaseManager { - - /** - * 分页 - */ - public Page page(PageParam pageParam, WechatAllocReceiverBindQuery param) { - var mpPage = MpUtil.getMpPage(pageParam, WechatAllocReceiverBind.class); - QueryWrapper generator = QueryGenerator.generator(param); - return page(mpPage, generator); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindMapper.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindMapper.java deleted file mode 100644 index 3f0c8d92..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/allocation/WechatAllocReceiverBindMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.channel.wechat.dao.allocation; - -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2025/1/27 - */ -@Mapper -public interface WechatAllocReceiverBindMapper extends MPJBaseMapper { -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiver.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiver.java deleted file mode 100644 index d87fc562..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiver.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.dromara.daxpay.channel.wechat.entity.allocation; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.json.JSONUtil; -import lombok.Data; -import lombok.experimental.Accessors; -import org.dromara.daxpay.channel.wechat.convert.WechatAllocReceiverConvert; -import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverResult; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; - -/** - * 微信分账接收方 - * @author xxm - * @since 2025/1/25 - */ -@Data -@Accessors(chain = true) -public class WechatAllocReceiver implements ToResult { - - /** 主键 */ - private Long id; - - /** 分账接收方编号, 需要保证唯一 */ - private String receiverNo; - - /** 接收方名称 */ - private String receiverName; - - /** 接收方账号 */ - private String receiverAccount; - - /** 接收方类型 */ - private String receiverType; - - /** 分账关系类型 */ - private String relationType; - - /** 分账关系名称 */ - private String relationName; - - /** 商户AppId */ - private String appId; - - /** - * 转换为通用接收方 - */ - public AllocReceiver toReceiver(boolean isv) { - var receiver = new AllocReceiver(); - receiver.setId(this.getId()); - receiver.setAppId(this.getAppId()); - receiver.setReceiverNo(this.getReceiverNo()); - receiver.setReceiverType(this.getReceiverType()); - receiver.setReceiverName(this.getReceiverName()); - receiver.setReceiverAccount(this.getReceiverAccount()); - receiver.setChannel(isv ? ChannelEnum.WECHAT_ISV.getCode() : ChannelEnum.WECHAT.getCode()); - var copy = WechatAllocReceiverConvert.CONVERT.copy(this); - // 清空不需要序列化的字段 - copy.setId(null).setReceiverNo(null).setReceiverName(null).setReceiverAccount(null); - String jsonStr = JsonUtil.toJsonStr(copy); - receiver.setExt(jsonStr); - return receiver; - } - - /** - * 转换为通道接收方 - */ - public static WechatAllocReceiver convertChannel(AllocReceiver receiver) { - var leshuaAllocReceiver = JSONUtil.toBean(receiver.getExt(), WechatAllocReceiver.class); - leshuaAllocReceiver.setId(receiver.getId()) - .setReceiverNo(receiver.getReceiverNo()) - .setReceiverName(receiver.getReceiverName()) - .setReceiverType(receiver.getReceiverType()) - .setReceiverAccount(receiver.getReceiverAccount()); - return leshuaAllocReceiver; - } - - @Override - public WechatAllocReceiverResult toResult() { - return WechatAllocReceiverConvert.CONVERT.toResult(this); - } - -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiverBind.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiverBind.java deleted file mode 100644 index 0e1e1562..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/allocation/WechatAllocReceiverBind.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.dromara.daxpay.channel.wechat.entity.allocation; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import org.dromara.daxpay.channel.wechat.convert.WechatAllocReceiverBindConvert; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindParam; -import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverBindResult; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; - -/** - * 微信分账接收方绑定 - * @author xxm - * @since 2025/1/27 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_wechat_alloc_receiver_bind") -public class WechatAllocReceiverBind extends MchAppBaseEntity implements ToResult { - - /** 接收方名称 */ - private String receiverName; - - /** 接收方账号 */ - private String receiverAccount; - - /** 接收方类型 */ - private String receiverType; - - /** 分账关系类型 */ - private String relationType; - - /** 分账关系名称 */ - private String relationName; - - /** 是否服务商模式 */ - private boolean isv; - - /** 是否绑定 */ - private boolean bind; - - /** 错误提示 */ - @TableField(updateStrategy = FieldStrategy.ALWAYS) - private String errorMsg; - - public static WechatAllocReceiverBind init(WechatAllocReceiverBindParam param) { - return WechatAllocReceiverBindConvert.CONVERT.toEntity(param); - } - - @Override - public WechatAllocReceiverBindResult toResult() { - return WechatAllocReceiverBindConvert.CONVERT.toResult(this); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvConfig.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvConfig.java new file mode 100644 index 00000000..3d897b2f --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvConfig.java @@ -0,0 +1,110 @@ +package org.dromara.daxpay.channel.wechat.entity.config; + +import cn.bootx.platform.common.jackson.util.JacksonUtil; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.convert.WechatIsvConfigConvert; +import org.dromara.daxpay.channel.wechat.result.config.WechatIsvConfigResult; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.isv.entity.config.IsvChannelConfig; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 微信服务商配置 + * @author xxm + * @since 2024/11/1 + */ +@Data +@Accessors(chain = true) +public class WechatIsvConfig implements ToResult { + + /** 主键 */ + private Long id; + + /** 微信商户Id */ + private String wxMchId; + + /** 微信应用appId */ + private String wxAppId; + + /** 是否启用 */ + private Boolean enable; + + /** 支付限额 */ + private BigDecimal limitAmount; + + /** + * 接口版本, 使用v2还是v3接口 + * @see WechatPayCode#API_V2 + */ + private String apiVersion; + + /** 商户平台「API安全」中的 APIv2 密钥 */ + private String apiKeyV2; + + /** 商户平台「API安全」中的 APIv3 密钥 */ + private String apiKeyV3; + + /** APPID对应的接口密码,用于获取微信公众号jsapi支付时使用 */ + private String appSecret; + + /** 支付公钥(pub_key.pem) */ + private String publicKey; + + /** 支付公钥ID */ + private String publicKeyId; + + /** apiclient_key. pem证书base64编码 */ + private String privateKey; + + /** apiclient_cert. pem证书base64编码 */ + private String privateCert; + + /** 证书序列号 */ + private String certSerialNo; + + /** API证书中p12证书Base64 */ + private String p12; + + /** 微信密钥 */ + private String wxAppSecret; + + /** 微信授权认证地址 */ + private String wxAuthUrl; + + /** + * 转换为通道配置 + */ + public IsvChannelConfig toChannelConfig() { + var channelConfig = new IsvChannelConfig(); + channelConfig.setId(this.getId()); + channelConfig.setEnable(this.getEnable()); + channelConfig.setChannel(ChannelEnum.WECHAT_ISV.getCode()); + WechatIsvConfig copy = WechatIsvConfigConvert.CONVERT.copy(this); + // 清空不需要序列化的字段 + copy.setId(null).setEnable(null).setWxMchId(null); + String jsonStr = JacksonUtil.toJson(copy); + channelConfig.setExt(jsonStr); + return channelConfig; + } + + /** + * 从通道配置转换为微信支付配置 + */ + public static WechatIsvConfig convertConfig(IsvChannelConfig channelConfig) { + WechatIsvConfig config = JacksonUtil.toBean(channelConfig.getExt(), WechatIsvConfig.class); + + config.setId(channelConfig.getId()) + .setEnable(channelConfig.isEnable()); + return config; + } + + @Override + public WechatIsvConfigResult toResult() { + return WechatIsvConfigConvert.CONVERT.toResult(this); + } +} + diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java index ead3ddad..36ac9e35 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java @@ -1,17 +1,16 @@ package org.dromara.daxpay.channel.wechat.entity.config; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import lombok.Data; -import lombok.experimental.Accessors; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.convert.WechatPayConfigConvert; import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum; import org.dromara.daxpay.channel.wechat.result.config.WechatPayConfigResult; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.entity.config.ChannelConfig; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; +import cn.hutool.core.util.StrUtil; +import lombok.Data; +import lombok.experimental.Accessors; /** * 微信支付配置 @@ -89,6 +88,9 @@ public class WechatPayConfig implements ToResult { /** 备注 */ private String remark; + /** 商户号 */ + private String mchNo; + /** 商户AppId */ private String appId; @@ -101,12 +103,13 @@ public class WechatPayConfig implements ToResult { channelConfig.setOutAppId(this.getWxAppId()); channelConfig.setOutMchNo(this.getWxMchId()); channelConfig.setAppId(this.getAppId()); + channelConfig.setMchNo(this.getMchNo()); channelConfig.setEnable(this.getEnable()); channelConfig.setChannel(this.isv?ChannelEnum.WECHAT_ISV.getCode():ChannelEnum.WECHAT.getCode()); WechatPayConfig copy = WechatPayConfigConvert.CONVERT.copy(this); // 清空不需要序列化的字段 - copy.setId(null).setAppId(null).setEnable(null).setWxMchId(null).setWxAppId(null); - String jsonStr = JsonUtil.toJsonStr(copy); + copy.setId(null).setMchNo(null).setAppId(null).setEnable(null).setWxMchId(null).setWxAppId(null); + String jsonStr = JacksonUtil.toJson(copy); channelConfig.setExt(jsonStr); return channelConfig; } @@ -115,12 +118,13 @@ public class WechatPayConfig implements ToResult { * 从通道配置转换为微信支付配置 */ public static WechatPayConfig convertConfig(ChannelConfig channelConfig) { - WechatPayConfig config = JSONUtil.toBean(channelConfig.getExt(), WechatPayConfig.class); + WechatPayConfig config = JacksonUtil.toBean(channelConfig.getExt(), WechatPayConfig.class); config.setId(channelConfig.getId()) .setWxAppId(channelConfig.getOutAppId()) .setWxMchId(channelConfig.getOutMchNo()) .setAppId(channelConfig.getAppId()) + .setMchNo(channelConfig.getMchNo()) .setEnable(channelConfig.isEnable()); return config; } diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPaySubConfig.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPaySubConfig.java new file mode 100644 index 00000000..3dcfc0a5 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPaySubConfig.java @@ -0,0 +1,103 @@ +package org.dromara.daxpay.channel.wechat.entity.config; + +import cn.bootx.platform.common.jackson.util.JacksonUtil; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.channel.wechat.convert.WechatPaySubConfigConvert; +import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum; +import org.dromara.daxpay.channel.wechat.result.config.WechatPaySubConfigResult; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Objects; + +/** + * 微信特约商户配置类 + * @author xxm + * @since 2024/12/27 + */ +@Data +@Accessors(chain = true) +public class WechatPaySubConfig implements ToResult { + /** 主键 */ + private Long id; + + /** 微信特约商户号/二级商户号 */ + private String subMchId; + + /** 是否启用 */ + private Boolean enable; + + /** + * 授权类型 + * @see WechatAuthTypeEnum + */ + private String authType; + + /** 微信特约商户/二级商户AppId */ + private String subAppId; + + /** 微信特约商户/二级商户密钥 */ + private String wxAppSecret; + + /** 微信特约商户/二级商户授权认证地址 */ + private String wxAuthUrl; + + /** 商户号 */ + private String mchNo; + + /** 商户AppId */ + private String appId; + + + /** + * 默认使用服务商配置 + */ + public String getAuthType() { + return Objects.equals(authType, WechatAuthTypeEnum.SUB.getCode())? + WechatAuthTypeEnum.SUB.getCode():WechatAuthTypeEnum.SP.getCode(); + } + + + /** + * 转换为通道配置 + */ + public ChannelConfig toChannelConfig() { + var channelConfig = new ChannelConfig(); + channelConfig.setId(this.getId()); + channelConfig.setOutMchNo(this.getSubMchId()); + channelConfig.setOutAppId(this.getSubAppId()); + channelConfig.setAppId(this.getAppId()); + channelConfig.setMchNo(this.getMchNo()); + channelConfig.setEnable(this.getEnable()); + channelConfig.setSub(true); + channelConfig.setChannel(ChannelEnum.WECHAT_ISV.getCode()); + var copy = WechatPaySubConfigConvert.CONVERT.copy(this); + // 清空不需要序列化的字段 + copy.setId(null).setMchNo(null).setAppId(null).setEnable(null).setSubMchId(null); + String jsonStr = JacksonUtil.toJson(copy); + channelConfig.setExt(jsonStr); + channelConfig.setSub(true); + return channelConfig; + } + + /** + * 从通道配置转换为支付配置 + */ + public static WechatPaySubConfig convertConfig(ChannelConfig channelConfig) { + var config = JacksonUtil.toBean(channelConfig.getExt(), WechatPaySubConfig.class); + config.setId(channelConfig.getId()) + .setAppId(channelConfig.getAppId()) + .setMchNo(channelConfig.getMchNo()) + .setSubAppId(channelConfig.getOutAppId()) + .setSubMchId(channelConfig.getOutMchNo()) + .setEnable(channelConfig.isEnable()); + return config; + } + + @Override + public WechatPaySubConfigResult toResult() { + return WechatPaySubConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java deleted file mode 100644 index 6ddf1e7b..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dromara.daxpay.channel.wechat.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 微信分账接收者类型 - * @author xxm - * @since 2024/12/17 - */ -@Getter -@AllArgsConstructor -public enum WechatAllocReceiverEnum { - - MERCHANT_ID("MERCHANT_ID", "商户号"), - PERSONAL_OPENID("PERSONAL_OPENID", "openId"), - ; - - private final String code; - private final String name; -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java deleted file mode 100644 index 83f86275..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.dromara.daxpay.channel.wechat.enums; - -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.exception.ConfigNotExistException; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; -import java.util.Objects; - -/** - * - * @author xxm - * @since 2024/12/16 - */ -@Getter -@AllArgsConstructor -public enum WechatAllocStatusEnum { - - //处理中 - PENDING("PENDING", AllocDetailResultEnum.PENDING), - //分账完成 - SUCCESS("SUCCESS", AllocDetailResultEnum.SUCCESS), - //分账完成 - CLOSED("CLOSED", AllocDetailResultEnum.FAIL), - ; - - private final String code; - - private final AllocDetailResultEnum result; - - /** - * 根据编码获取枚举 - */ - public static WechatAllocStatusEnum findByCode(String code){ - return Arrays.stream(values()) - .filter(o -> Objects.equals(o.getCode(), code)) - .findFirst() - .orElseThrow(() -> new ConfigNotExistException("该微信分账状态不存在")); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindParam.java deleted file mode 100644 index 6cb79582..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindParam.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dromara.daxpay.channel.wechat.param.allocation; - -import cn.bootx.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 微信分账接收方绑定参数 - * @author xxm - * @since 2025/1/27 - */ -@Data -@Accessors(chain = true) -@Schema(title = "微信分账接收方绑定参数") -public class WechatAllocReceiverBindParam { - - /** 主键 */ - @NotNull(message = "id不能为空", groups = ValidationGroup.edit.class) - @Schema(description = "主键") - private Long id; - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - @NotBlank(message = "接收方类型不可为空") - @Schema(description = "接收方类型") - private String receiverType; - - /** 接收方账号 */ - @NotBlank(message = "接收方账号不可为空") - @Schema(description = "接收方账号") - private String receiverAccount; - - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** 分账关系类型 */ - @NotBlank(message = "分账关系类型不可为空") - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; - - /** 是否服务商模式 */ - @Schema(description = "是否服务商模式") - private boolean isv; - - /** 是否绑定 */ - @Schema(description = "是否绑定") - private boolean bind; - - /** 应用Id */ - @NotBlank(message = "应用Id不可为空") - @Schema(description = "应用Id") - private String appId; - -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindQuery.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindQuery.java deleted file mode 100644 index 5016a8fc..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverBindQuery.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.dromara.daxpay.channel.wechat.param.allocation; - -import cn.bootx.platform.core.annotation.QueryParam; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.service.common.param.MchQuery; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 微信分账接收方绑定查询参数 - * @author xxm - * @since 2025/2/19 - */ -@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "微信分账接收方绑定查询参数") -public class WechatAllocReceiverBindQuery extends MchQuery { - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "接收方类型") - private String receiverType; - - /** 接收方账号 */ - @Schema(description = "接收方账号") - private String receiverAccount; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** 分账关系类型 */ - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; - - /** 是否服务商模式 */ - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "是否服务商模式") - private Boolean isv; - - /** 是否绑定 */ - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "是否绑定") - private Boolean bind; - -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverParam.java deleted file mode 100644 index ace6e5b4..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/allocation/WechatAllocReceiverParam.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.dromara.daxpay.channel.wechat.param.allocation; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 微信分账接收方 - * @author xxm - * @since 2025/1/26 - */ -@Data -@Accessors(chain = true) -@Schema(title = "微信分账接收方") -public class WechatAllocReceiverParam { - - /** 主键 */ - @Schema(description = "主键") - private Long id; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** 接收方账号 */ - @NotNull(message = "接收方账号不可为空") - @Schema(description = "接收方账号") - private String receiverAccount; - - /** 接收方类型 */ - @Schema(description = "接收方类型") - private String receiverType; - - /** 分账关系类型 */ - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; - - /** 是否为服务商 */ - @Schema(description = "是否为服务商") - private boolean isv; - - /** 商户AppId */ - @NotNull(message = "商户AppId不可为空") - @Schema(description = "商户AppId") - private String appId; -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvConfigParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvConfigParam.java new file mode 100644 index 00000000..1efb2d5a --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvConfigParam.java @@ -0,0 +1,87 @@ +package org.dromara.daxpay.channel.wechat.param.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; + +/** + * 微信服务商配置参数 + * @author xxm + * @since 2024/11/1 + */ +@Data +@Accessors(chain = true) +@Schema(title = "微信服务商配置参数") +public class WechatIsvConfigParam { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** 微信商户Id */ + @NotBlank(message = "微信商户Id不可为空") + @Schema(description = "微信商户Id") + private String wxMchId; + + /** 微信应用appId */ + @NotBlank(message = "微信应用appId不可为空") + @Schema(description = "微信应用appId") + private String wxAppId; + + /** 是否启用 */ + @NotNull(message = "是否启用不可为空") + @Schema(description = "是否启用") + private Boolean enable; + + /** + * 接口版本, 使用v2还是v3接口 + * @see WechatPayCode#API_V2 + */ + @NotBlank(message = "接口版本不可为空") + @Schema(description = "接口版本") + private String apiVersion; + + /** 商户平台「API安全」中的 APIv2 密钥 */ + @Schema(description = "APIv2 密钥") + private String apiKeyV2; + + /** 商户平台「API安全」中的 APIv3 密钥 */ + @Schema(description = "APIv3 密钥") + private String apiKeyV3; + + /** APPID对应的接口密码,用于获取微信公众号jsapi支付时使用 */ + @Schema(description = "APPID对应的接口密码,用于获取微信公众号jsapi支付时使用") + private String appSecret; + + /** 支付公钥(pub_key.pem) */ + @Schema(description = "支付公钥(pub_key.pem)") + private String publicKey; + + /** 支付公钥ID */ + @Schema(description = "支付公钥ID") + private String publicKeyId; + + /** apiclient_key.pem证书base64编码 */ + @Schema(description = "私钥证书base64编码") + private String privateKey; + + /** apiclient_cert.pem证书base64编码 */ + @Schema(description = "私钥Key的base64编码") + private String privateCert; + + /** 证书序列号 */ + @Schema(description = "证书序列号") + private String certSerialNo; + + /** apiclient_cert.p12证书Base64 */ + @Schema(description = "API证书中p12证书") + private String p12; + + /** 备注 */ + @Schema(description = "备注") + private String remark; + +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java index 8a58d717..56acc4b7 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java @@ -104,6 +104,11 @@ public class WechatPayConfigParam { @Schema(description = "备注") private String remark; + /** 商户号 */ + @NotBlank(message = "商户号不可为空") + @Schema(description = "商户号") + private String mchNo; + /** 商户AppId */ @Schema(description = "商户AppId") @NotBlank(message = "商户AppId不可为空") diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPaySubConfigParam.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPaySubConfigParam.java new file mode 100644 index 00000000..b372ff3d --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPaySubConfigParam.java @@ -0,0 +1,50 @@ +package org.dromara.daxpay.channel.wechat.param.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum; + +/** + * 微信支付配置 + * @author xxm + * @since 2024/7/17 + */ +@Data +@Accessors(chain = true) +@Schema(title = "微信支付配置") +public class WechatPaySubConfigParam { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** 微信子商户号 */ + @NotBlank(message = "微信子商户号不可为空") + @Schema(description = "微信子商户号") + private String subMchId; + + /** 微信特约商户/二级商户应用ID */ + @Schema(description = "特约商户/二级商户应用ID") + private String subAppId; + + /** + * 授权类型 + * @see WechatAuthTypeEnum + */ + @Schema(description = "授权类型") + private String authType; + + /** 是否启用 */ + @NotNull(message = "是否启用不可为空") + @Schema(description = "是否启用") + private Boolean enable; + + /** 商户AppId */ + @Schema(description = "商户AppId") + @NotBlank(message = "商户AppId不可为空") + private String appId; + +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/transfer/TransferCreateV3Request.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/transfer/TransferCreateV3Request.java index d1018b42..723fab8b 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/transfer/TransferCreateV3Request.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/transfer/TransferCreateV3Request.java @@ -2,7 +2,8 @@ package org.dromara.daxpay.channel.wechat.param.transfer; import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateRequest; import com.google.gson.annotations.SerializedName; -import lombok.*; +import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverBindResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverBindResult.java deleted file mode 100644 index 8266f4e8..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverBindResult.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.dromara.daxpay.channel.wechat.result.allocation; - -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.service.common.result.MchResult; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 微信分账接收方绑定 - * @author xxm - * @since 2025/1/27 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "微信分账接收方绑定") -public class WechatAllocReceiverBindResult extends MchResult { - - /** 接收方账号 */ - @Schema(description = "接收方账号") - private String receiverAccount; - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - @Schema(description = "接收方类型") - private String receiverType; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** 分账关系类型 */ - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; - - /** 是否服务商模式 */ - @Schema(description = "是否服务商模式") - private boolean isv; - - /** 是否绑定 */ - @Schema(description = "是否绑定") - private boolean bind; - - /** 错误提示 */ - @Schema(description = "错误提示") - private String errorMsg; - -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverResult.java deleted file mode 100644 index 236f2a89..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/allocation/WechatAllocReceiverResult.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.dromara.daxpay.channel.wechat.result.allocation; - -import org.dromara.daxpay.service.common.result.MchResult; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 微信分账接收方 - * @author xxm - * @since 2025/1/26 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "微信分账接收方") -public class WechatAllocReceiverResult extends MchResult { - - /** 分账接收方编号 */ - @Schema(description = "分账接收方编号") - private String receiverNo; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** 接收方账号 */ - @Schema(description = "接收方账号") - private String receiverAccount; - - /** 接收方类型 */ - @Schema(description = "接收方类型") - private String receiverType; - - /** 分账关系类型 */ - @Schema(description = "分账关系类型") - private String relationType; - - /** 分账关系名称 */ - @Schema(description = "分账关系名称") - private String relationName; -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/assist/WechatMccConstResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/assist/WechatMccConstResult.java deleted file mode 100644 index 050c312d..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/assist/WechatMccConstResult.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.dromara.daxpay.channel.wechat.result.assist; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 微信经营类目 - * @author xxm - * @since 2025/1/27 - */ -@Data -@Accessors(chain = true) -@Schema(title = "微信经营类目") -public class WechatMccConstResult { - - /** 行业ID */ - @Schema(description = "行业ID") - private String id; - - /** 行业名称 */ - @Schema(description = "行业名称") - private String name; - - /** 主体类型 */ - @Schema(description = "主体类型") - private String parentCode; - - /** 结算规则ID */ - @Schema(description = "结算规则ID") - private String ruleId; - -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvConfigResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvConfigResult.java new file mode 100644 index 00000000..9e248af7 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvConfigResult.java @@ -0,0 +1,98 @@ +package org.dromara.daxpay.channel.wechat.result.config; + +import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; + +import java.math.BigDecimal; + +/** + * 微信服务商配置 + * @author xxm + * @since 2024/11/1 + */ +@Data +@Accessors(chain = true) +@Schema(title = "微信服务商配置") +public class WechatIsvConfigResult { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** 微信商户Id */ + @Schema(description = "微信商户Id") + private String wxMchId; + + /** 微信应用appId */ + @Schema(description = "微信应用appId") + private String wxAppId; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + + /** 支付限额 */ + @Schema(description = "支付限额") + private BigDecimal limitAmount; + + /** + * 接口版本, 使用v2还是v3接口 + * @see WechatPayCode#API_V2 + */ + @Schema(description = "接口版本") + private String apiVersion; + + /** 商户平台「API安全」中的 APIv2 密钥 */ + @Schema(description = "APIv2 密钥") + @SensitiveInfo + private String apiKeyV2; + + /** 商户平台「API安全」中的 APIv3 密钥 */ + @Schema(description = "APIv3 密钥") + @SensitiveInfo + private String apiKeyV3; + + /** APPID对应的接口密码,用于获取微信公众号jsapi支付时使用 */ + @Schema(description = "APPID对应的接口密码,用于获取微信公众号jsapi支付时使用") + @SensitiveInfo + private String appSecret; + + /** 支付公钥(pub_key.pem) */ + @Schema(description = "支付公钥(pub_key.pem)") + @SensitiveInfo + private String publicKey; + + /** 支付公钥ID */ + @Schema(description = "支付公钥ID") + private String publicKeyId; + + /** apiclient_key.pem证书base64编码 */ + @SensitiveInfo + @Schema(description = "私钥Key的base64编码") + private String privateKey; + + /** apiclient_cert.pem证书base64编码 */ + @SensitiveInfo + @Schema(description = "私钥证书base64编码") + private String privateCert; + + /** 证书序列号 */ + @Schema(description = "证书序列号") + private String certSerialNo; + + /** apiclient_cert.p12证书Base64 */ + @Schema(description = "API证书中p12证书") + @SensitiveInfo + private String p12; + + /** 备注 */ + @Schema(description = "备注") + private String remark; + + /** 服务商号 */ + @Schema(description = "服务商号") + private String appId; +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java index 1d546e6f..3972b89b 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java @@ -108,6 +108,10 @@ public class WechatPayConfigResult { @Schema(description = "备注") private String remark; + /** 商户号 */ + @Schema(description = "商户号") + private String mchNo; + /** 商户AppId */ @Schema(description = "商户AppId") private String appId; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPaySubConfigResult.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPaySubConfigResult.java new file mode 100644 index 00000000..f656c31b --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPaySubConfigResult.java @@ -0,0 +1,56 @@ +package org.dromara.daxpay.channel.wechat.result.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum; +import org.dromara.daxpay.service.merchant.result.info.MchResult; + +/** + * 微信支付配置 + * @author xxm + * @since 2024/7/17 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "微信支付配置") +public class WechatPaySubConfigResult extends MchResult { + + /** 服务商户号 */ + @Schema(description = "服务商户号") + private String spMchId; + + /** 服务商ID */ + @Schema(description = "服务商ID") + private String spAppId; + + /** 特约商户号/二级商户号 */ + @Schema(description = "特约商户号/二级商户号") + private String subMchId; + + /** + * 授权类型 + * @see WechatAuthTypeEnum + */ + @Schema(description = "授权类型") + private String authType; + + /** 特约商户/二级商户应用ID */ + @Schema(description = "特约商户/二级商户应用ID") + private String subAppId; + + /** 微信特约商户/二级商户密钥 */ + @Schema(description = "微信特约商户/二级商户密钥") + private String wxAppSecret; + + /** 微信特约商户/二级商户授权认证地址 */ + @Schema(description = "微信特约商户/二级商户授权认证地址") + private String wxAuthUrl; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverBindService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverBindService.java deleted file mode 100644 index fb24a173..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverBindService.java +++ /dev/null @@ -1,177 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.allocation; - -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.code.WechatPayCode; -import org.dromara.daxpay.channel.wechat.dao.allocation.WechatAllocReceiverBindManager; -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindParam; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverBindQuery; -import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverBindResult; -import org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver.WechatPayAllocReceiverV2Service; -import org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver.WechatPayAllocReceiverV3Service; -import org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver.WechatPaySubAllocReceiverV2Service; -import org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver.WechatPaySubAllocReceiverV3Service; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -/** - * 微信分账接收方绑定 - * @author xxm - * @since 2025/1/27 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WechatAllocReceiverBindService { - - private final WechatPayAllocReceiverV2Service receiverV2Service; - - private final WechatPaySubAllocReceiverV2Service receiverSubV2Service; - - private final WechatPayAllocReceiverV3Service receiverV3Service; - - private final WechatPaySubAllocReceiverV3Service receiverSubV3Service; - - private final WechatPayConfigService wechatPayConfigService; - - private final WechatAllocReceiverBindManager receiverBindManager; - - private final PaymentAssistService paymentAssistService; - - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, WechatAllocReceiverBindQuery param){ - return MpUtil.toPageResult(receiverBindManager.page(pageParam, param)); - } - - /** - * 查询详情 - */ - public WechatAllocReceiverBindResult findById(Long id) { - return receiverBindManager.findById(id) - .map(WechatAllocReceiverBind::toResult) - .orElseThrow(() -> new RuntimeException("数据不存在")); - } - - /** - * 添加 - */ - public void add(WechatAllocReceiverBindParam param) { - if (!validation(param)){ - throw new RuntimeException("接收方类型错误"); - } - paymentAssistService.initMchAndApp(param.getAppId()); - var receiverBind = WechatAllocReceiverBind.init(param); - receiverBindManager.save(receiverBind); - } - - /** - * 编辑 - */ - public void update(WechatAllocReceiverBindParam param){ - var receiverBind = receiverBindManager.findById(param.getId()).orElseThrow(() -> new DataNotExistException("分账接收方不存在")); - if (receiverBind.isBind()){ - throw new DataErrorException("分账接收方已绑定"); - } - BeanUtil.copyProperties(param,receiverBind, CopyOptions.create().ignoreNullValue()); - receiverBindManager.updateById(receiverBind); - } - - /** - * 绑定 - */ - public void bind(Long id) { - var receiverBind = receiverBindManager.findById(id).orElseThrow(() -> new DataNotExistException("微信分账接收方数据不存在")); - paymentAssistService.initMchAndApp(receiverBind.getAppId()); - if (receiverBind.isBind()){ - throw new DataErrorException("分账接收方已绑定"); - } - try { - if (receiverBind.isIsv()){ - var config = wechatPayConfigService.getAndCheckConfig(true); - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){ - receiverSubV2Service.bind(receiverBind, config); - } else { - receiverSubV3Service.bind(receiverBind, config); - } - } else { - var config = wechatPayConfigService.getAndCheckConfig(false); - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){ - receiverV2Service.bind(receiverBind, config); - } else { - receiverV3Service.bind(receiverBind, config); - } - } - receiverBind.setBind(true); - } catch (OperationFailException e) { - receiverBind.setErrorMsg(e.getMessage()); - } - receiverBindManager.updateById(receiverBind); - } - - /** - * 解绑 - */ - public void unbind(Long id) { - var receiverBind = receiverBindManager.findById(id).orElseThrow(() -> new DataNotExistException("微信分账接收方数据不存在")); - paymentAssistService.initMchAndApp(receiverBind.getAppId()); - if (!receiverBind.isBind()){ - throw new DataErrorException("分账接收方已解绑"); - } - - try { - if (receiverBind.isIsv()){ - var config = wechatPayConfigService.getAndCheckConfig(true); - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){ - receiverSubV2Service.unbind(receiverBind, config); - } else { - receiverSubV3Service.unbind(receiverBind, config); - } - } else { - var config = wechatPayConfigService.getAndCheckConfig(false); - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){ - receiverV2Service.unbind(receiverBind, config); - } else { - receiverV3Service.unbind(receiverBind, config); - } - } - receiverBind.setBind(false); - } catch (OperationFailException e) { - receiverBind.setErrorMsg(e.getMessage()); - } - receiverBindManager.updateById(receiverBind); - } - - /** - * 删除 - */ - public void remove(Long id){ - receiverBindManager.deleteById(id); - } - - /** - * 校验方法 - */ - public boolean validation(WechatAllocReceiverBindParam receiverBind){ - List list = Arrays.asList(AllocReceiverTypeEnum.OPEN_ID.getCode(), AllocReceiverTypeEnum.MERCHANT_NO.getCode()); - String receiverType = receiverBind.getReceiverType(); - return list.contains(receiverType); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverService.java deleted file mode 100644 index ff56d8ca..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatAllocReceiverService.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.allocation; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.lang.UUID; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.convert.WechatAllocReceiverConvert; -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiver; -import org.dromara.daxpay.channel.wechat.param.allocation.WechatAllocReceiverParam; -import org.dromara.daxpay.channel.wechat.result.allocation.WechatAllocReceiverResult; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.core.exception.ConfigNotEnableException; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.springframework.stereotype.Service; - -import java.util.Objects; - -/** - * 微信分账接收方服务类 - * @author xxm - * @since 2025/1/26 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WechatAllocReceiverService { - - private final AllocReceiverManager receiverManager; - - private final PaymentAssistService paymentAssistService; - - /** - * 获取分账接收方 - */ - public WechatAllocReceiverResult findById(Long id){ - return receiverManager.findById(id) - .map(WechatAllocReceiver::convertChannel) - .map(WechatAllocReceiver::toResult) - .orElseThrow(() -> new ConfigNotEnableException("微信分账接收方不存在")); - } - - /** - * 新增或更新 - */ - public void saveOrUpdate(WechatAllocReceiverParam param){ - if (param.getId() == null) { - add(param); - } else { - update(param); - } - } - - /** - * 添加 - */ - public void add(WechatAllocReceiverParam param){ - paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - var entity = WechatAllocReceiverConvert.CONVERT.toEntity(param); - AllocReceiver receiver = entity.toReceiver(param.isIsv()); - String uuid = UUID.fastUUID().toString(true); - receiver.setReceiverNo(uuid); - receiverManager.save(receiver); - } - - /** - * 更新 - */ - public void update(WechatAllocReceiverParam param){ - var allocReceiver = receiverManager.findById(param.getId()) - .orElseThrow(() -> new ConfigNotEnableException("微信分账接收方不存在")); - // 通道配置 --转换--> 通道配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新 - var wechatAllocReceiver = WechatAllocReceiver.convertChannel(allocReceiver); - BeanUtil.copyProperties(param, wechatAllocReceiver, CopyOptions.create() - .ignoreNullValue()); - var receiver = wechatAllocReceiver.toReceiver(Objects.equals(allocReceiver.getChannel(), ChannelEnum.WECHAT_ISV.getCode())); - // 手动清空一下默认的数据版本号 - receiver.setVersion(null); - BeanUtil.copyProperties(receiver, allocReceiver, CopyOptions.create() - .ignoreNullValue()); - receiverManager.updateById(allocReceiver); - } -} - diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvConfigService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvConfigService.java new file mode 100644 index 00000000..ca49b107 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvConfigService.java @@ -0,0 +1,165 @@ +package org.dromara.daxpay.channel.wechat.service.isv; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.StrUtil; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.service.Applyment4SubService; +import com.github.binarywang.wxpay.service.MerchantMediaService; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.Applyment4SubServiceImpl; +import com.github.binarywang.wxpay.service.impl.MerchantMediaServiceImpl; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.convert.WechatIsvConfigConvert; +import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvConfig; +import org.dromara.daxpay.channel.wechat.param.config.WechatIsvConfigParam; +import org.dromara.daxpay.channel.wechat.result.config.WechatIsvConfigResult; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.exception.ChannelNotEnableException; +import org.dromara.daxpay.core.exception.ConfigNotEnableException; +import org.dromara.daxpay.core.exception.DataErrorException; +import org.dromara.daxpay.service.isv.cache.IsvChannelConfigCacheService; +import org.dromara.daxpay.service.isv.dao.config.IsvChannelConfigManager; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 微信服务商服务 + * @author xxm + * @since 2024/11/1 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatIsvConfigService { + + private final IsvChannelConfigManager channelConfigManager; + private final IsvChannelConfigCacheService channelConfigCacheService; + + /** + * 查询 + */ + public WechatIsvConfigResult findById(Long id) { + return channelConfigManager.findById(id) + .map(WechatIsvConfig::convertConfig) + .map(WechatIsvConfig::toResult) + .orElseThrow(() -> new ConfigNotEnableException("微信服务商配置不存在")); + } + + /** + * 新增或更新 + */ + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(WechatIsvConfigParam param){ + if (param.getId() == null){ + this.save(param); + } else { + this.update(param); + } + } + + /** + * 添加 + */ + public void save(WechatIsvConfigParam param) { + WechatIsvConfig entity = WechatIsvConfigConvert.CONVERT.toEntity(param); + var channelConfig = entity.toChannelConfig(); + // 判断商户和应用下是否存在该配置 + if (channelConfigManager.existsByChannel(channelConfig.getChannel())){ + throw new DataErrorException("该服务商下已存在微信配置, 请勿重新添加"); + } + channelConfigManager.save(channelConfig); + } + + /** + * 更新 + */ + public void update(WechatIsvConfigParam param){ + var channelConfig = channelConfigManager.findById(param.getId()) + .orElseThrow(() -> new ConfigNotEnableException("微信支付配置不存在")); + // 通道配置 --转换--> 微信支付配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新 + WechatIsvConfig wechatIsvConfig = WechatIsvConfig.convertConfig(channelConfig); + BeanUtil.copyProperties(param, wechatIsvConfig, CopyOptions.create().ignoreNullValue()); + var channelConfigParam = wechatIsvConfig.toChannelConfig(); + // 手动写入一下原来的数据版本号 + channelConfigParam.setVersion(channelConfig.getVersion()); + BeanUtil.copyProperties(channelConfigParam, channelConfig, CopyOptions.create().ignoreNullValue()); + channelConfigManager.updateById(channelConfig); + } + + /** + * 获取并检查支付配置 + */ + public WechatIsvConfig getAndCheckConfig(){ + var payConfig = this.getWechatIsvConfig(); + if (!payConfig.getEnable()){ + throw new ChannelNotEnableException("微信服务商通道未启用"); + } + return payConfig; + } + + /** + * 获取微信支付配置 + */ + public WechatIsvConfig getWechatIsvConfig(){ + var channelConfig = channelConfigCacheService.get(ChannelEnum.WECHAT.getCode()); + return WechatIsvConfig.convertConfig(channelConfig); + } + + /** + * wxjava 支付开发包 + */ + public WxPayConfig wxJavaConfig(WechatIsvConfig wechatIsvConfig){ + WxPayConfig payConfig = new WxPayConfig(); + payConfig.setMchId(wechatIsvConfig.getWxMchId()); + payConfig.setAppId(wechatIsvConfig.getWxAppId()); + payConfig.setMchKey(wechatIsvConfig.getApiKeyV2()); + payConfig.setApiV3Key(wechatIsvConfig.getApiKeyV3()); + // 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码, 会导致证书异常 + if (StrUtil.isNotBlank(wechatIsvConfig.getPublicKey())){ + payConfig.setPublicKeyContent(Base64.decode(wechatIsvConfig.getPublicKey())); + } + payConfig.setPublicKeyId(wechatIsvConfig.getPublicKeyId()); + if (StrUtil.isNotBlank(wechatIsvConfig.getPrivateCert())){ + payConfig.setPrivateCertContent(Base64.decode(wechatIsvConfig.getPrivateCert())); + } + if (StrUtil.isNotBlank(wechatIsvConfig.getPrivateKey())){ + payConfig.setPrivateKeyContent(Base64.decode(wechatIsvConfig.getPrivateKey())); + } + payConfig.setCertSerialNo(wechatIsvConfig.getCertSerialNo()); + if (StrUtil.isNotBlank(wechatIsvConfig.getP12())){ + payConfig.setKeyContent(Base64.decode(wechatIsvConfig.getP12())); + } + return payConfig; + } + + /** + * wxjava 支付开发包 + */ + public WxPayService wxJavaPay(WechatIsvConfig wechatIsvConfig){ + WxPayService wxPayService = new WxPayServiceImpl(); + wxPayService.setConfig(wxJavaConfig(wechatIsvConfig)); + return wxPayService; + } + + + /** + * 特约商户进件 + */ + public Applyment4SubService applyment4SubService(WechatIsvConfig wechatIsvConfig){ + return new Applyment4SubServiceImpl(wxJavaPay(wechatIsvConfig)); + } + + + /** + * 微信支付通用媒体接口. + */ + public MerchantMediaService merchantMediaService(WechatIsvConfig wechatIsvConfig){ + return new MerchantMediaServiceImpl(wxJavaPay(wechatIsvConfig)); + } + +} + diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV2Service.java deleted file mode 100644 index 0b09ef0b..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV2Service.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.payment.allocation; - -import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; -import cn.hutool.json.JSONUtil; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryRequest; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeRequest; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; -import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingQueryResult; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; -import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; - - -/** - * 微信分账V2版本接口 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPayAllocationV2Service { - - private final WechatPayConfigService wechatPayConfigService; - - /** - * 分账 - */ - public AllocStartResultBo start(AllocOrder allocOrder, List details, WechatPayConfig config) { - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - - ProfitSharingRequest request = new ProfitSharingRequest(); - request.setAppid(config.getWxAppId()); - request.setOutOrderNo(allocOrder.getAllocNo()); - request.setTransactionId(allocOrder.getOutOrderNo()); - - // 分账接收方信息 - var receivers = details.stream() - .map(o -> { - AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - var receiver = new ProfitSharingV3Request.Receiver(); - receiver.setType(receiverType); - receiver.setAmount(PayUtil.convertCentAmount(o.getAmount())); - receiver.setAccount(o.getReceiverAccount()); - receiver.setName(o.getReceiverName()); - receiver.setDescription("订单分账"); - return receiver; - }) - .toList(); - - request.setReceivers(JSONUtil.toJsonStr(receivers)); - try { - var result = sharingService.multiProfitSharing(request); - return new AllocStartResultBo().setOutAllocNo(result.getTransactionId()); - } catch (WxPayException e) { - throw new OperationFailException("微信分账V2失败: "+e.getMessage()); - } - } - - /** - * 完结 - */ - public void finish(AllocOrder allocOrder, WechatPayConfig config) { - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - var request = new ProfitSharingUnfreezeRequest(); - request.setOutOrderNo(String.valueOf(allocOrder.getId())); - request.setTransactionId(allocOrder.getOutOrderNo()); - request.setDescription("分账完结"); - try { - sharingService.profitSharingFinish(request); - } catch (WxPayException e) { - throw new OperationFailException("微信分账完结V2失败: "+e.getMessage()); - } - } - - /** - * 同步 - */ - public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config) { - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - ProfitSharingQueryRequest request = new ProfitSharingQueryRequest(); - // 根据订单状态判断 使用ID还是分账号 - request.setTransactionId(allocOrder.getOutOrderNo()); - if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){ - request.setOutOrderNo(allocOrder.getAllocNo()); - } else { - request.setOutOrderNo(String.valueOf(allocOrder.getId())); - } - - ProfitSharingQueryResult result; - try { - result = sharingService.profitSharingQuery(request); - } catch (WxPayException e) { - throw new OperationFailException("微信分账订单查询V2失败: "+e.getMessage()); - } - var detailMap = details.stream() - .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); - var royaltyDetailList = Optional.ofNullable( result.getReceivers()).orElse(new ArrayList<>(0)); - for (var receiver : royaltyDetailList) { - var detail = detailMap.get(receiver.getAccount()); - if (Objects.nonNull(detail)) { - detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode()); - detail.setErrorMsg(receiver.getFailReason()); - detail.setOutDetailId(receiver.getDetailId()); - // 如果是完成, 更新时间 - if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ - LocalDateTime finishTime = WechatPayUtil.parseV2(receiver.getFinishTime()); - detail.setFinishTime(finishTime) - .setErrorMsg(null) - .setErrorCode(null); - } - } - } - return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result)); - } - - /** - * 获取分账接收方类型编码 - */ - private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ - if (receiverTypeEnum == OPEN_ID){ - return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode(); - } - if (receiverTypeEnum == MERCHANT_NO){ - return WechatAllocReceiverEnum.MERCHANT_ID.getCode(); - } - throw new ConfigErrorException("分账接收方类型错误"); - } - - /** - * 转换支付宝分账类型到系统中统一的状态 - */ - private AllocDetailResultEnum getDetailResultEnum (String result){ - return WechatAllocStatusEnum.findByCode(result).getResult(); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV3Service.java deleted file mode 100644 index 5187035b..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPayAllocationV3Service.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.payment.allocation; - -import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; -import cn.hutool.json.JSONUtil; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; -import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; -import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; -import static org.dromara.daxpay.core.enums.AllocationStatusEnum.*; - - -/** - * 微信分账V3版本接口 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPayAllocationV3Service { - private final WechatPayConfigService wechatPayConfigService; - - /** - * 发起分账 使用分账号作为请求号 - */ - public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){ - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - - ProfitSharingV3Request request = new ProfitSharingV3Request(); - request.setAppid(config.getWxAppId()); - request.setOutOrderNo(allocOrder.getAllocNo()); - request.setTransactionId(allocOrder.getOutOrderNo()); - request.setUnfreezeUnsplit(false); - - // 分账接收方信息 - var receivers = orderDetails.stream() - .map(o -> { - AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - var receiver = new ProfitSharingV3Request.Receiver(); - receiver.setType(receiverType); - receiver.setAmount(PayUtil.convertCentAmount(o.getAmount())); - receiver.setAccount(o.getReceiverAccount()); - receiver.setName(o.getReceiverName()); - receiver.setDescription("订单分账"); - receiver.setRelationType("PARTNER"); - return receiver; - }) - .toList(); - - request.setReceivers(receivers); - try { - ProfitSharingV3Result result = sharingService.profitSharingV3(request); - return new AllocStartResultBo().setOutAllocNo(result.getTransactionId()); - } catch (WxPayException e) { - throw new OperationFailException("微信分账V3失败: "+e.getMessage()); - } - } - - /** - * 分账完结 使用ID作为请求号 - */ - public void finish(AllocOrder allocOrder, WechatPayConfig config){ - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - var request = new ProfitSharingUnfreezeV3Request(); - request.setOutOrderNo(String.valueOf(allocOrder.getId())); - request.setTransactionId(allocOrder.getOutOrderNo()); - request.setDescription("分账完结"); - try { - sharingService.profitSharingUnfreeze(request); - } catch (WxPayException e) { - throw new OperationFailException("微信分账完结V3失败: "+e.getMessage()); - } - } - - /** - * 同步 - */ - public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config){ - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - // 根据订单状态判断 使用ID还是分账号 - String outOrderNo; - if (List.of(PROCESSING.getCode(), ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){ - outOrderNo = allocOrder.getAllocNo(); - } else { - outOrderNo = String.valueOf(allocOrder.getId()); - } - - ProfitSharingV3Result result; - try { - result = sharingService.profitSharingQueryV3(outOrderNo,allocOrder.getOutOrderNo()); - } catch (WxPayException e) { - throw new OperationFailException("微信分账订单查询V3失败: "+e.getMessage()); - } - var detailMap = details.stream() - .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); - var royaltyDetailList = Optional.ofNullable(result.getReceivers()).orElse(new ArrayList<>(0)); - for (var receiver : royaltyDetailList) { - var detail = detailMap.get(receiver.getAccount()); - if (Objects.nonNull(detail)) { - detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode()); - detail.setErrorMsg(receiver.getFailReason()); - detail.setOutDetailId(receiver.getDetailId()); - // 如果是完成, 更新时间 - if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ - LocalDateTime finishTime = WechatPayUtil.parseV3(receiver.getFinishTime()); - detail.setFinishTime(finishTime) - .setErrorMsg(null) - .setErrorCode(null); - } - } - } - return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result)); - } - - /** - * 获取分账接收方类型编码 - */ - private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ - if (receiverTypeEnum == OPEN_ID){ - return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode(); - } - if (receiverTypeEnum == MERCHANT_NO){ - return WechatAllocReceiverEnum.MERCHANT_ID.getCode(); - } - throw new ConfigErrorException("分账接收方类型错误"); - } - - /** - * 转换支付宝分账类型到系统中统一的状态 - */ - private AllocDetailResultEnum getDetailResultEnum (String result){ - return WechatAllocStatusEnum.findByCode(result).getResult(); - } - - -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV2Service.java deleted file mode 100644 index 191d9a15..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV2Service.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.payment.allocation; - -import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; -import cn.hutool.json.JSONUtil; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryRequest; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeRequest; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; -import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingQueryResult; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; -import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; - - -/** - * 微信服务商分账V2版本接口 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPaySubAllocationV2Service { - - private final WechatPayConfigService wechatPayConfigService; - - /** - * 分账 - */ - public AllocStartResultBo start(AllocOrder allocOrder, List details, WechatPayConfig config) { - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - - ProfitSharingRequest request = new ProfitSharingRequest(); - request.setAppid(config.getWxAppId()); - request.setOutOrderNo(allocOrder.getAllocNo()); - request.setTransactionId(allocOrder.getOutOrderNo()); - - // 分账接收方信息 - var receivers = details.stream() - .map(o -> { - AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - var receiver = new ProfitSharingV3Request.Receiver(); - receiver.setType(receiverType); - receiver.setAmount(PayUtil.convertCentAmount(o.getAmount())); - receiver.setAccount(o.getReceiverAccount()); - receiver.setName(o.getReceiverName()); - receiver.setDescription("订单分账"); - return receiver; - }) - .toList(); - - request.setReceivers(JSONUtil.toJsonStr(receivers)); - try { - var result = sharingService.multiProfitSharing(request); - return new AllocStartResultBo().setOutAllocNo(result.getTransactionId()); - } catch (WxPayException e) { - throw new OperationFailException("微信分账V2失败: "+e.getMessage()); - } - } - - /** - * 完结 - */ - public void finish(AllocOrder allocOrder, WechatPayConfig config) { - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - var request = new ProfitSharingUnfreezeRequest(); - request.setOutOrderNo(String.valueOf(allocOrder.getId())); - request.setTransactionId(allocOrder.getOutOrderNo()); - request.setDescription("分账完结"); - try { - sharingService.profitSharingFinish(request); - } catch (WxPayException e) { - throw new OperationFailException("微信分账完结V2失败: "+e.getMessage()); - } - } - - /** - * 同步 - */ - public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config) { - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - ProfitSharingQueryRequest request = new ProfitSharingQueryRequest(); - // 根据订单状态判断 使用ID还是分账号 - request.setTransactionId(allocOrder.getOutOrderNo()); - if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){ - request.setOutOrderNo(allocOrder.getAllocNo()); - } else { - request.setOutOrderNo(String.valueOf(allocOrder.getId())); - } - - ProfitSharingQueryResult result; - try { - result = sharingService.profitSharingQuery(request); - } catch (WxPayException e) { - throw new OperationFailException("微信分账订单查询V2失败: "+e.getMessage()); - } - var detailMap = details.stream() - .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); - var royaltyDetailList = Optional.ofNullable( result.getReceivers()).orElse(new ArrayList<>(0)); - for (var receiver : royaltyDetailList) { - var detail = detailMap.get(receiver.getAccount()); - if (Objects.nonNull(detail)) { - detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode()); - detail.setErrorMsg(receiver.getFailReason()); - detail.setOutDetailId(receiver.getDetailId()); - // 如果是完成, 更新时间 - if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ - LocalDateTime finishTime = WechatPayUtil.parseV2(receiver.getFinishTime()); - detail.setFinishTime(finishTime) - .setErrorMsg(null) - .setErrorCode(null); - } - } - } - return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result)); - } - - /** - * 获取分账接收方类型编码 - */ - private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ - if (receiverTypeEnum == OPEN_ID){ - return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode(); - } - if (receiverTypeEnum == MERCHANT_NO){ - return WechatAllocReceiverEnum.MERCHANT_ID.getCode(); - } - throw new ConfigErrorException("分账接收方类型错误"); - } - - /** - * 转换支付宝分账类型到系统中统一的状态 - */ - private AllocDetailResultEnum getDetailResultEnum (String result){ - return WechatAllocStatusEnum.findByCode(result).getResult(); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV3Service.java deleted file mode 100644 index 5c1dc916..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/WeChatPaySubAllocationV3Service.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.payment.allocation; - -import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; -import cn.hutool.json.JSONUtil; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; -import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; -import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; -import static org.dromara.daxpay.core.enums.AllocationStatusEnum.*; - - -/** - * 微信服务商分账V3版本接口 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPaySubAllocationV3Service { - private final WechatPayConfigService wechatPayConfigService; - - /** - * 发起分账 使用分账号作为请求号 - */ - public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){ - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - - ProfitSharingV3Request request = new ProfitSharingV3Request(); - request.setAppid(config.getWxAppId()); - request.setOutOrderNo(allocOrder.getAllocNo()); - request.setTransactionId(allocOrder.getOutOrderNo()); - request.setUnfreezeUnsplit(false); - - // 分账接收方信息 - var receivers = orderDetails.stream() - .map(o -> { - AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - var receiver = new ProfitSharingV3Request.Receiver(); - receiver.setType(receiverType); - receiver.setAmount(PayUtil.convertCentAmount(o.getAmount())); - receiver.setAccount(o.getReceiverAccount()); - receiver.setName(o.getReceiverName()); - receiver.setDescription("订单分账"); - receiver.setRelationType("PARTNER"); - return receiver; - }) - .toList(); - - request.setReceivers(receivers); - try { - ProfitSharingV3Result result = sharingService.profitSharingV3(request); - return new AllocStartResultBo().setOutAllocNo(result.getTransactionId()); - } catch (WxPayException e) { - throw new OperationFailException("微信分账V3失败: "+e.getMessage()); - } - } - - /** - * 分账完结 使用ID作为请求号 - */ - public void finish(AllocOrder allocOrder, WechatPayConfig config){ - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - var request = new ProfitSharingUnfreezeV3Request(); - request.setOutOrderNo(String.valueOf(allocOrder.getId())); - request.setTransactionId(allocOrder.getOutOrderNo()); - request.setDescription("分账完结"); - try { - sharingService.profitSharingUnfreeze(request); - } catch (WxPayException e) { - throw new OperationFailException("微信分账完结V3失败: "+e.getMessage()); - } - } - - /** - * 同步 - */ - public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config){ - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - // 根据订单状态判断 使用ID还是分账号 - String outOrderNo; - if (List.of(PROCESSING.getCode(), ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){ - outOrderNo = allocOrder.getAllocNo(); - } else { - outOrderNo = String.valueOf(allocOrder.getId()); - } - - ProfitSharingV3Result result; - try { - result = sharingService.profitSharingQueryV3(outOrderNo,allocOrder.getOutOrderNo(),config.getSubMchId()); - } catch (WxPayException e) { - throw new OperationFailException("微信分账订单查询V3失败: "+e.getMessage()); - } - var detailMap = details.stream() - .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); - var royaltyDetailList = Optional.ofNullable(result.getReceivers()).orElse(new ArrayList<>(0)); - for (var receiver : royaltyDetailList) { - var detail = detailMap.get(receiver.getAccount()); - if (Objects.nonNull(detail)) { - detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode()); - detail.setErrorMsg(receiver.getFailReason()); - detail.setOutDetailId(receiver.getDetailId()); - // 如果是完成, 更新时间 - if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ - LocalDateTime finishTime = WechatPayUtil.parseV3(receiver.getFinishTime()); - detail.setFinishTime(finishTime) - .setErrorMsg(null) - .setErrorCode(null); - } - } - } - return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result)); - } - - /** - * 获取分账接收方类型编码 - */ - private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ - if (receiverTypeEnum == OPEN_ID){ - return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode(); - } - if (receiverTypeEnum == MERCHANT_NO){ - return WechatAllocReceiverEnum.MERCHANT_ID.getCode(); - } - throw new ConfigErrorException("分账接收方类型错误"); - } - - /** - * 转换支付宝分账类型到系统中统一的状态 - */ - private AllocDetailResultEnum getDetailResultEnum (String result){ - return WechatAllocStatusEnum.findByCode(result).getResult(); - } - - -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV2Service.java deleted file mode 100644 index 33ca0c35..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV2Service.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver; - -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import com.github.binarywang.wxpay.bean.profitsharing.Receiver; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverRequest; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Locale; -import java.util.Objects; - -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; - -/** - * 微信分账接收方服务 - * @author xxm - * @since 2024/4/1 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WechatPayAllocReceiverV2Service { - - private final WechatPayConfigService wechatPayConfigService; - - private static final Gson GSON = new GsonBuilder().create(); - - /** - * 绑定 - */ - public void bind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){ - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest(); - Receiver receiver = new Receiver(receiverType,wxReceiver.getReceiverAccount(),wxReceiver.getReceiverName(),wxReceiver.getRelationType(),wxReceiver.getRelationName()); - request.setReceiver(GSON.toJson(receiver)); - - try { - sharingService.addReceiver(request); - } catch (WxPayException e) { - throw new OperationFailException("微信添加分账方V2失败: "+e.getMessage()); - } - } - - /** - * 解除绑定 - */ - public void unbind(WechatAllocReceiverBind allocReceiver, WechatPayConfig config){ - - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - - ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest(); - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(allocReceiver.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - Receiver receiver = new Receiver(receiverType,allocReceiver.getReceiverAccount()); - request.setReceiver(GSON.toJson(receiver)); - try { - sharingService.removeReceiver(request); - } catch (WxPayException e) { - throw new OperationFailException("微信删除分账方V2失败: "+e.getMessage()); - } - } - - - /** - * 获取分账接收方类型编码 - */ - private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ - if (receiverTypeEnum == OPEN_ID){ - return "PERSONAL_OPENID"; - } - if (receiverTypeEnum == MERCHANT_NO){ - return "MERCHANT_ID"; - } - throw new ConfigErrorException("分账接收方类型错误"); - } - - /** - * 获取分账关系类型编码 - */ - private String getRelationType(String relationType){ - if (Objects.isNull(relationType)){ - return null; - } - return relationType.toUpperCase(Locale.ROOT); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV3Service.java deleted file mode 100644 index 2a32f4c7..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPayAllocReceiverV3Service.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver; - -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverV3Request; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Locale; -import java.util.Objects; - -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; - -/** - * 微信分账接收方服务 - * @author xxm - * @since 2024/4/1 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WechatPayAllocReceiverV3Service { - private final WechatPayConfigService wechatPayConfigService; - - /** - * 绑定 - */ - public void bind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){ - - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - - ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request(); - request.setAppid(config.getWxAppId()); - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - request.setType(receiverType); - request.setAccount(wxReceiver.getReceiverAccount()); - request.setName(wxReceiver.getReceiverName()); - request.setRelationType(getRelationType(wxReceiver.getRelationType())); - request.setCustomRelation(wxReceiver.getRelationName()); - try { - sharingService.addReceiverV3(request); - } catch (WxPayException e) { - throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage()); - } - } - - /** - * 解除绑定 - */ - public void unbind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){ - - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - - ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request(); - request.setAppid(config.getAppId()); - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - request.setType(receiverType); - request.setAccount(wxReceiver.getReceiverAccount()); - request.setName(wxReceiver.getReceiverName()); - request.setRelationType(getRelationType(wxReceiver.getRelationType())); - request.setCustomRelation(wxReceiver.getRelationName()); - try { - sharingService.removeReceiverV3(request); - } catch (WxPayException e) { - throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage()); - } - } - - /** - * 获取分账接收方类型编码 - */ - private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ - if (receiverTypeEnum == OPEN_ID){ - return "PERSONAL_OPENID"; - } - if (receiverTypeEnum == MERCHANT_NO){ - return "MERCHANT_ID"; - } - throw new ConfigErrorException("分账接收方类型错误"); - } - /** - * 获取分账关系类型编码 - */ - private String getRelationType(String relationType){ - if (Objects.isNull(relationType)){ - return null; - } - return relationType.toUpperCase(Locale.ROOT); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV2Service.java deleted file mode 100644 index c4c1d531..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV2Service.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver; - -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import com.github.binarywang.wxpay.bean.profitsharing.Receiver; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverRequest; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Locale; -import java.util.Objects; - -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; - -/** - * 微信分账接收方服务 - * @author xxm - * @since 2024/4/1 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WechatPaySubAllocReceiverV2Service { - - private final WechatPayConfigService wechatPayConfigService; - - private static final Gson GSON = new GsonBuilder().create(); - - /** - * 绑定 - */ - public void bind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){ - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType()); - var receiverType = this.getReceiverType(receiverTypeEnum); - ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest(); - Receiver receiver = new Receiver(receiverType,wxReceiver.getReceiverAccount(),wxReceiver.getReceiverName(),wxReceiver.getRelationType(),wxReceiver.getRelationName()); - request.setReceiver(GSON.toJson(receiver)); - - try { - sharingService.addReceiver(request); - } catch (WxPayException e) { - throw new OperationFailException("微信添加分账方V2失败: "+e.getMessage()); - } - } - - /** - * 解除绑定 - */ - public void unbind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){ - - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest(); - Receiver receiver = new Receiver(receiverType,wxReceiver.getReceiverAccount()); - request.setReceiver(GSON.toJson(receiver)); - try { - sharingService.removeReceiver(request); - } catch (WxPayException e) { - throw new OperationFailException("微信删除分账方V2失败: "+e.getMessage()); - } - } - - - /** - * 获取分账接收方类型编码 - */ - private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ - if (receiverTypeEnum == OPEN_ID){ - return "PERSONAL_OPENID"; - } - if (receiverTypeEnum == MERCHANT_NO){ - return "MERCHANT_ID"; - } - throw new ConfigErrorException("分账接收方类型错误"); - } - - /** - * 获取分账关系类型编码 - */ - private String getRelationType(String relationType){ - if (Objects.isNull(relationType)){ - return null; - } - return relationType.toUpperCase(Locale.ROOT); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV3Service.java deleted file mode 100644 index 6f7a3262..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/allocation/receiver/WechatPaySubAllocReceiverV3Service.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.payment.allocation.receiver; - -import org.dromara.daxpay.channel.wechat.entity.allocation.WechatAllocReceiverBind; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverV3Request; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Locale; -import java.util.Objects; - -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; -import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; - -/** - * 微信分账接收方服务 - * @author xxm - * @since 2024/4/1 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WechatPaySubAllocReceiverV3Service { - private final WechatPayConfigService wechatPayConfigService; - - /** - * 绑定 - */ - public void bind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){ - - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - - ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request(); - request.setAppid(config.getWxAppId()); - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - request.setType(receiverType); - request.setAccount(wxReceiver.getReceiverAccount()); - request.setName(wxReceiver.getReceiverName()); - request.setRelationType(wxReceiver.getRelationType()); - request.setCustomRelation(wxReceiver.getRelationName()); - try { - sharingService.addReceiverV3(request); - } catch (WxPayException e) { - throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage()); - } - } - - /** - * 解除绑定 - */ - public void unbind(WechatAllocReceiverBind wxReceiver, WechatPayConfig config){ - - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - - ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request(); - request.setAppid(config.getAppId()); - var receiverTypeEnum = AllocReceiverTypeEnum.findByCode(wxReceiver.getReceiverType()); - String receiverType = this.getReceiverType(receiverTypeEnum); - request.setType(receiverType); - request.setAccount(wxReceiver.getReceiverAccount()); - request.setName(wxReceiver.getReceiverName()); - request.setRelationType(wxReceiver.getRelationType()); - request.setCustomRelation(wxReceiver.getRelationName()); - try { - sharingService.removeReceiverV3(request); - } catch (WxPayException e) { - throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage()); - } - } - - /** - * 获取分账接收方类型编码 - */ - private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ - if (receiverTypeEnum == OPEN_ID){ - return "PERSONAL_OPENID"; - } - if (receiverTypeEnum == MERCHANT_NO){ - return "MERCHANT_ID"; - } - throw new ConfigErrorException("分账接收方类型错误"); - } - /** - * 获取分账关系类型编码 - */ - private String getRelationType(String relationType){ - if (Objects.isNull(relationType)){ - return null; - } - return relationType.toUpperCase(Locale.ROOT); - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatPayCallbackService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatPayCallbackService.java index 72aadc4b..732ccc79 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatPayCallbackService.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatPayCallbackService.java @@ -1,18 +1,5 @@ package org.dromara.daxpay.channel.wechat.service.payment.callback; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.servlet.JakartaServletUtil; -import com.github.binarywang.wxpay.bean.notify.SignatureHeader; -import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; -import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Result; -import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; -import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; @@ -23,15 +10,26 @@ import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.enums.TradeTypeEnum; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; -import org.dromara.daxpay.service.service.trade.pay.PayCallbackService; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayCallbackService; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import com.github.binarywang.wxpay.bean.notify.*; +import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; /** * 微信支付回调处理服务 @@ -82,9 +80,9 @@ public class WechatPayCallbackService { callbackInfo.setRawData(xml); try { // 转换请求 - WxPayOrderNotifyResult wxPayOrderNotifyResult = wxPayService.parseOrderNotifyResult(xml); + var v2Result = wxPayService.parseOrderNotifyResult(xml); // 解析数据 - this.resolveV2Data(wxPayOrderNotifyResult); + this.resolveV2Data(v2Result); return true; } catch (WxPayException e) { log.error("微信支付回调V2处理失败", e); @@ -103,9 +101,14 @@ public class WechatPayCallbackService { callbackInfo.setRawData(body); try { // 转换请求 - WxPayNotifyV3Result wxPayNotifyV3Result = wxPayService.parseOrderNotifyV3Result(body, signatureHeader); - // 解析数据 - this.resolvePayData(wxPayNotifyV3Result,isv); + if (isv){ + var v3Result = wxPayService.parsePartnerOrderNotifyV3Result(body, signatureHeader); + this.resolvePayData(v3Result); + } else { + var v3Result = wxPayService.parseOrderNotifyV3Result(body, signatureHeader); + // 解析数据 + this.resolvePayData(v3Result); + } } catch (Exception e) { callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL); log.error("微信支付回调V3处理失败", e); @@ -132,16 +135,20 @@ public class WechatPayCallbackService { callbackInfo.setTradeStatus(payStatus.getCode()); // 支付金额 callbackInfo.setAmount(PayUtil.conversionAmount(result.getTotalFee())); + // 支付用户OpenId + String openId = Optional.ofNullable(result.getSubOpenid()).orElse(result.getOpenid()); + callbackInfo.setBuyerId(openId); String timeEnd = result.getTimeEnd(); if (StrUtil.isNotBlank(timeEnd)) { LocalDateTime time = WechatPayUtil.parseV2(timeEnd); callbackInfo.setFinishTime(time); } } + /** - * 解析数据 v3 + * 解析数据 v3 普通商户 */ - private void resolvePayData(WxPayNotifyV3Result v3Result, boolean isv){ + private void resolvePayData(WxPayNotifyV3Result v3Result){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); var result = v3Result.getResult(); // 回调数据 @@ -153,6 +160,53 @@ public class WechatPayCallbackService { callbackInfo.setTradeNo(result.getOutTradeNo()); // 支付状态 - 成功 if (List.of(WxpayTradeStatus.SUCCESS,WxpayTradeStatus.REFUND).contains(result.getTradeState())){ + // 支付用户OpenId + callbackInfo.setBuyerId(result.getPayer().getOpenid()); + callbackInfo.setTradeStatus(PayStatusEnum.SUCCESS.getCode()); + } + // 支付状态 - 支付中 + if (Objects.equals(result.getTradeState(), WxpayTradeStatus.NOTPAY)){ + callbackInfo.setTradeStatus(PayStatusEnum.PROGRESS.getCode()); + } + // 支付状态 - 失败 + if (Objects.equals(WxpayTradeStatus.PAY_ERROR, result.getTradeState())){ + callbackInfo.setTradeStatus(PayStatusEnum.FAIL.getCode()); + } + // 撤销 + if (Objects.equals(result.getTradeState(), WxpayTradeStatus.REVOKED)){ + callbackInfo.setTradeStatus(PayStatusEnum.CANCEL.getCode()); + } + // 关闭 + if (Objects.equals(result.getTradeState(), WxpayTradeStatus.CLOSED)){ + callbackInfo.setTradeStatus(PayStatusEnum.CLOSE.getCode()); + } + + // 支付金额 + callbackInfo.setAmount(PayUtil.conversionAmount(result.getAmount().getTotal())); + String timeEnd = result.getSuccessTime(); + if (StrUtil.isNotBlank(timeEnd)) { + callbackInfo.setFinishTime(WechatPayUtil.parseV3(timeEnd)); + } + } + + /** + * 解析数据 v3 服务商 + */ + private void resolvePayData(WxPayPartnerNotifyV3Result v3Result){ + CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); + var result = v3Result.getResult(); + // 回调数据 + Map map = BeanUtil.beanToMap(result); + callbackInfo.setCallbackData(map); + // 网关支付号 + callbackInfo.setOutTradeNo(result.getTransactionId()); + // 支付号 + callbackInfo.setTradeNo(result.getOutTradeNo()); + // 支付状态 - 成功 + if (List.of(WxpayTradeStatus.SUCCESS,WxpayTradeStatus.REFUND).contains(result.getTradeState())){ + // 支付用户OpenId + String openId = Optional.ofNullable(result.getPayer().getSubOpenid()).orElse(result.getPayer().getSpOpenid()); + callbackInfo.setBuyerId(openId); callbackInfo.setTradeStatus(PayStatusEnum.SUCCESS.getCode()); } // 支付状态 - 支付中 diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatRefundCallbackService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatRefundCallbackService.java index 0044f048..7245d595 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatRefundCallbackService.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatRefundCallbackService.java @@ -1,5 +1,18 @@ package org.dromara.daxpay.channel.wechat.service.payment.callback; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.context.CallbackLocal; +import org.dromara.daxpay.core.enums.CallbackStatusEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.core.enums.TradeTypeEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundCallbackService; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; @@ -15,19 +28,6 @@ import com.github.binarywang.wxpay.service.WxPayService; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.code.WechatPayCode; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.context.CallbackLocal; -import org.dromara.daxpay.core.enums.CallbackStatusEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; -import org.dromara.daxpay.service.service.trade.refund.RefundCallbackService; import org.springframework.stereotype.Service; import java.time.LocalDateTime; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatTransferCallbackService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatTransferCallbackService.java index d28521a5..4225bc43 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatTransferCallbackService.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/callback/WechatTransferCallbackService.java @@ -1,14 +1,5 @@ package org.dromara.daxpay.channel.wechat.service.payment.callback; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.extra.servlet.JakartaServletUtil; -import com.github.binarywang.wxpay.bean.notify.SignatureHeader; -import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.result.transfer.WxPayTransferBatchesNotifyV3Result; @@ -18,9 +9,18 @@ import org.dromara.daxpay.core.enums.CallbackStatusEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.TradeTypeEnum; import org.dromara.daxpay.core.enums.TransferStatusEnum; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; -import org.dromara.daxpay.service.service.trade.transfer.TransferCallbackService; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferCallbackService; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import com.github.binarywang.wxpay.bean.notify.SignatureHeader; +import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV2Service.java index 2a80532c..dbb21665 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV2Service.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.service.payment.close; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseRequest; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.springframework.stereotype.Service; /** diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV3Service.java index 94020704..1ad05779 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPayCloseV3Service.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.service.payment.close; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseV3Request; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.springframework.stereotype.Service; /** @@ -41,7 +41,7 @@ public class WechatPayCloseV3Service { public void cancel(PayOrder payOrder, WechatPayConfig config){ WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); try { - com.github.binarywang.wxpay.bean.request.WxPayOrderReverseV3Request request = new WxPayOrderReverseV3Request(); + WxPayOrderReverseV3Request request = new WxPayOrderReverseV3Request(); request.setOutTradeNo(payOrder.getOutOrderNo()); wxPayService.reverseOrderV3(request); } catch (WxPayException e) { diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV2Service.java index 2bb3eb6c..3f7dfe16 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV2Service.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.service.payment.close; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseRequest; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.springframework.stereotype.Service; /** diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV3Service.java index ca3cf10c..90a391c9 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/close/WechatPaySubCloseV3Service.java @@ -1,5 +1,10 @@ package org.dromara.daxpay.channel.wechat.service.payment.close; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.clode.WxPayPartnerOrderReverseV3Request; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; @@ -7,11 +12,6 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.param.clode.WxPayPartnerOrderReverseV3Request; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.springframework.stereotype.Service; /** @@ -32,7 +32,7 @@ public class WechatPaySubCloseV3Service { public void close(PayOrder payOrder, WechatPayConfig weChatPayConfig) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(weChatPayConfig); try { - wxPayService.closeOrderV3(payOrder.getOrderNo()); + wxPayService.closePartnerOrderV3(payOrder.getOrderNo()); } catch (WxPayException e) { log.error("微信关闭支付V3失败", e); throw new TradeFailException("微信退款V3失败: "+e.getMessage()); @@ -54,7 +54,7 @@ public class WechatPaySubCloseV3Service { request.setSubAppid(wxPayConfig.getSubAppId()); // 拼接参数请求路径并发送 - String url = String.format("%s/v3/pay/transactions/out-trade-no/%s/reverse", + String url = String.format("%s/v3/pay/partner/transactions/out-trade-no/%s/reverse", wxPayService.getPayBaseUrl(), payOrder.getOrderNo()); wxPayService.postV3(url, GSON.toJson(request)); } catch (WxPayException e) { diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/config/WechatPayConfigService.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/config/WechatPayConfigService.java index 3aa56d8a..a06f6651 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/config/WechatPayConfigService.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/config/WechatPayConfigService.java @@ -1,5 +1,27 @@ package org.dromara.daxpay.channel.wechat.service.payment.config; +import org.dromara.daxpay.channel.wechat.convert.WechatPayConfigConvert; +import org.dromara.daxpay.channel.wechat.convert.WechatPaySubConfigConvert; +import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvConfig; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPaySubConfig; +import org.dromara.daxpay.channel.wechat.enums.WechatAuthTypeEnum; +import org.dromara.daxpay.channel.wechat.param.config.WechatPayConfigParam; +import org.dromara.daxpay.channel.wechat.param.config.WechatPaySubConfigParam; +import org.dromara.daxpay.channel.wechat.result.config.WechatPayConfigResult; +import org.dromara.daxpay.channel.wechat.result.config.WechatPaySubConfigResult; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.exception.ChannelNotEnableException; +import org.dromara.daxpay.core.exception.ConfigNotEnableException; +import org.dromara.daxpay.core.exception.DataErrorException; +import org.dromara.daxpay.service.isv.cache.IsvChannelConfigCacheService; +import org.dromara.daxpay.service.merchant.cache.ChannelConfigCacheService; +import org.dromara.daxpay.service.merchant.dao.config.ChannelConfigManager; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.codec.Base64; @@ -9,23 +31,6 @@ import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.convert.WechatPayConfigConvert; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.param.config.WechatPayConfigParam; -import org.dromara.daxpay.channel.wechat.result.config.WechatPayConfigResult; -import org.dromara.daxpay.core.context.MchAppLocal; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.core.enums.MerchantTypeEnum; -import org.dromara.daxpay.core.exception.ChannelNotEnableException; -import org.dromara.daxpay.core.exception.ConfigNotEnableException; -import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.service.common.cache.ChannelConfigCacheService; -import org.dromara.daxpay.service.common.local.MchContextLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.config.ChannelConfigManager; -import org.dromara.daxpay.service.entity.config.ChannelConfig; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.config.PlatformConfigService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -42,8 +47,8 @@ import java.util.Objects; public class WechatPayConfigService { private final ChannelConfigManager channelConfigManager; private final ChannelConfigCacheService channelConfigCacheService; - private final PlatformConfigService platformConfigService; private final PaymentAssistService paymentAssistService; + private final IsvChannelConfigCacheService isvChannelConfigCacheService; /** * 查询 @@ -55,6 +60,17 @@ public class WechatPayConfigService { .orElseThrow(() -> new ConfigNotEnableException("微信支付配置不存在")); } + + /** + * 查询特约商户信息 + */ + public WechatPaySubConfigResult findSubById(Long id) { + return channelConfigManager.findById(id) + .map(WechatPaySubConfig::convertConfig) + .map(WechatPaySubConfig::toResult) + .orElseThrow(() -> new ConfigNotEnableException("微信支付特约商户配置不存在")); + } + /** * 新增或更新 */ @@ -72,13 +88,11 @@ public class WechatPayConfigService { */ public void save(WechatPayConfigParam param) { paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - // 判断商户配置类型 - if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){ - throw new ChannelNotEnableException("请使用特约商户配置保存"); - } + var mchApp = PaymentContextLocal.get().getReqInfo(); WechatPayConfig entity = WechatPayConfigConvert.CONVERT.toEntity(param); ChannelConfig channelConfig = entity.toChannelConfig(); + // 如果运营端使用, 商户号写入上下文中 + MchContextLocal.setMchNo(channelConfig.getMchNo()); // 判断商户和应用下是否存在该配置 if (channelConfigManager.existsByAppIdAndChannel(channelConfig.getAppId(), channelConfig.getChannel())){ throw new DataErrorException("该应用下已存在微信配置, 请勿重新添加"); @@ -91,48 +105,90 @@ public class WechatPayConfigService { */ public void update(WechatPayConfigParam param){ paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - // 判断商户配置类型 - if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){ - throw new ChannelNotEnableException("请使用特约商户配置更新"); - } + var mchApp = PaymentContextLocal.get().getReqInfo(); ChannelConfig channelConfig = channelConfigManager.findById(param.getId()) .orElseThrow(() -> new ConfigNotEnableException("微信支付配置不存在")); // 通道配置 --转换--> 微信支付配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新 - WechatPayConfig alipayConfig = WechatPayConfig.convertConfig(channelConfig); - BeanUtil.copyProperties(param, alipayConfig, CopyOptions.create().ignoreNullValue()); - ChannelConfig channelConfigParam = alipayConfig.toChannelConfig(); - // 手动清空一下默认的数据版本号 - channelConfigParam.setVersion(null); + WechatPayConfig wechatConfig = WechatPayConfig.convertConfig(channelConfig); + BeanUtil.copyProperties(param, wechatConfig, CopyOptions.create().ignoreNullValue()); + ChannelConfig channelConfigParam = wechatConfig.toChannelConfig(); + // 手动写入一下原来的数据版本号 + channelConfigParam.setVersion(channelConfig.getVersion()); BeanUtil.copyProperties(channelConfigParam, channelConfig, CopyOptions.create().ignoreNullValue()); channelConfigManager.updateById(channelConfig); } + + /** + * 新增或更新特约商户配置 + */ + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdateSub(WechatPaySubConfigParam param){ + if (param.getId() == null){ + this.saveSub(param); + } else { + this.updateSub(param); + } + } + + /** + * 创建特约商户 + */ + private void saveSub(WechatPaySubConfigParam param) { + paymentAssistService.initMchAndApp(param.getAppId()); + // 转换类型 + var entity = WechatPaySubConfigConvert.CONVERT.toEntity(param); + ChannelConfig channelConfig = entity.toChannelConfig(); + // 判断商户和应用下是否存在该配置 + if (channelConfigManager.existsByAppIdAndChannel(param.getAppId(), channelConfig.getChannel())){ + throw new DataErrorException("该应用下已存在微信配置, 请勿重新添加"); + } + channelConfigManager.save(channelConfig); + } + + /** + * 更新特约商户 + */ + private void updateSub(WechatPaySubConfigParam param) { + paymentAssistService.initMchAndApp(param.getAppId()); + ChannelConfig channelConfig = channelConfigManager.findById(param.getId()) + .orElseThrow(() -> new ConfigNotEnableException("微信支付配置不存在")); + // 通道配置 --转换--> 支付配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新 + var subConfig = WechatPaySubConfig.convertConfig(channelConfig); + BeanUtil.copyProperties(param, subConfig, CopyOptions.create().ignoreNullValue()); + ChannelConfig channelConfigParam = subConfig.toChannelConfig(); + // 手动写入一下原来的数据版本号 + channelConfigParam.setVersion(channelConfig.getVersion()); + BeanUtil.copyProperties(channelConfigParam, channelConfig, CopyOptions.create().ignoreNullValue()); + channelConfigManager.updateById(channelConfig); + } + + /** * 获取支付异步通知地址 */ public String getPayNotifyUrl(boolean isv) { - String url = isv ? "{}/unipay/callback/{}/wechat/isv/pay":"{}/unipay/callback/{}/wechat/pay"; - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId()); + String url = isv ? "{}/unipay/callback/{}/{}/wechat/isv/pay":"{}/unipay/callback/{}/{}/wechat/pay"; + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + return StrUtil.format(url,reqInfo.getGatewayServiceUrl(), reqInfo.getMchNo(),reqInfo.getAppId()); } /** * 获取退款异步通知地址 */ public String getRefundNotifyUrl(boolean isv) { - String url = isv ? "{}/unipay/callback/{}/wechat/isv/refund":"{}/unipay/callback/{}/wechat/refund"; - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId()); + String url = isv ? "{}/unipay/callback/{}/{}/wechat/isv/refund":"{}/unipay/callback/{}/{}/wechat/refund"; + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + return StrUtil.format(url,reqInfo.getGatewayServiceUrl(), reqInfo.getMchNo(),reqInfo.getAppId()); } /** * 转账回调地址 */ public String getTransferNotifyUrl(boolean isv) { - String url = isv ? "{}/unipay/callback/{}/wechat/isv/transfer":"{}/unipay/callback/{}/wechat/transfer"; - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - return StrUtil.format(url,mchAppInfo.getGatewayServiceUrl(),mchAppInfo.getAppId()); + String url = isv ? "{}/unipay/callback/{}/{}/wechat/isv/transfer":"{}/unipay/callback/{}/{}/wechat/transfer"; + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + return StrUtil.format(url,reqInfo.getGatewayServiceUrl(), reqInfo.getMchNo(),reqInfo.getAppId()); } /** @@ -150,9 +206,33 @@ public class WechatPayConfigService { * 获取微信支付配置 */ public WechatPayConfig getWechatPayConfig(boolean isv){ - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(mchAppInfo.getAppId(), isv?ChannelEnum.WECHAT_ISV.getCode():ChannelEnum.WECHAT.getCode()); - return WechatPayConfig.convertConfig(channelConfig); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + ChannelConfig channelConfig = channelConfigCacheService.getMchChannelConfig(reqInfo.getAppId(), isv ? ChannelEnum.WECHAT_ISV.getCode() : ChannelEnum.WECHAT.getCode()); + // 判断是特约商户还是正常商户 + if (isv) { + // 特约商户 + var wechatPaySubConfig = WechatPaySubConfig.convertConfig(channelConfig); + // 获取微信服务商配置 + var isvChannelConfig = isvChannelConfigCacheService.get(ChannelEnum.WECHAT_ISV.getCode()); + var wechatIsvConfig = WechatIsvConfig.convertConfig(isvChannelConfig); + // 合并微信服务商配置和微信特约商户配置, 生成普通商户配置 + WechatPayConfig wechatPayConfig = new WechatPayConfig(); + BeanUtil.copyProperties(wechatIsvConfig, wechatPayConfig,CopyOptions.create().ignoreNullValue()); + wechatPayConfig.setSubAppId(wechatPaySubConfig.getSubAppId()) + .setSubMchId(wechatPaySubConfig.getSubMchId()) + .setIsv(true); + // 使用二级商户微信认证配置 + if (Objects.equals(wechatPayConfig.getAuthType(), WechatAuthTypeEnum.SUB.getCode())){ + wechatPayConfig.setAuthUrl(wechatPaySubConfig.getWxAuthUrl()) + .setAppSecret(wechatPaySubConfig.getWxAppSecret()); + } + + // 同时启用才可以使用 + wechatPayConfig.setEnable(wechatPaySubConfig.getEnable()&&wechatIsvConfig.getEnable()); + return wechatPayConfig; + } else { + return WechatPayConfig.convertConfig(channelConfig); + } } /** @@ -166,7 +246,6 @@ public class WechatPayConfigService { payConfig.setSubAppId(wechatPayConfig.getSubAppId()); payConfig.setMchKey(wechatPayConfig.getApiKeyV2()); payConfig.setApiV3Key(wechatPayConfig.getApiKeyV3()); -// payConfig.setApiVersion(wechatPayConfig.getApiVersion()); // 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码, 会导致证书异常 if (StrUtil.isNotBlank(wechatPayConfig.getPublicKey())){ payConfig.setPublicKeyContent(Base64.decode(wechatPayConfig.getPublicKey())); diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV2Service.java index 2c5b124c..7516b143 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV2Service.java @@ -1,7 +1,22 @@ package org.dromara.daxpay.channel.wechat.service.payment.pay.isv; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.core.util.JsonUtil; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.exception.MethodNotExistException; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.extra.spring.SpringUtil; @@ -18,21 +33,6 @@ import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.code.WechatPayCode; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.exception.MethodNotExistException; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.core.param.trade.pay.PayParam; -import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.trade.pay.PaySyncService; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -113,7 +113,7 @@ public class WechatPaySubV2Service { try { var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.APP, request); Map map = this.buildAppResult(result); - return JsonUtil.toJsonStr(map); + return JacksonUtil.toJson(map); } catch (WxPayException e) { log.error("微信V2App支付失败", e); throw new TradeFailException("微信V2App程序支付失败: "+e.getMessage()); @@ -134,7 +134,7 @@ public class WechatPaySubV2Service { try { var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.JSAPI, request); Map map = this.buildJsapiResult(result); - return JsonUtil.toJsonStr(map); + return JacksonUtil.toJson(map); } catch (WxPayException e) { log.error("微信V2Jaspi支付失败", e); throw new TradeFailException("微信V2Jaspi支付失败: "+e.getMessage()); diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV3Service.java index 4be41459..e403adf8 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/isv/WechatPaySubV3Service.java @@ -1,20 +1,7 @@ package org.dromara.daxpay.channel.wechat.service.payment.pay.isv; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.github.binarywang.wxpay.bean.request.WxPayPartnerUnifiedOrderV3Request; -import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; -import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; -import com.github.binarywang.wxpay.config.WxPayConfig; -import com.github.binarywang.wxpay.constant.WxPayConstants; -import com.github.binarywang.wxpay.constant.WxPayErrorCode; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; @@ -29,9 +16,22 @@ import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.trade.pay.PaySyncService; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService; +import cn.hutool.extra.spring.SpringUtil; +import com.github.binarywang.wxpay.bean.request.WxPayPartnerUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.constant.WxPayErrorCode; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.scheduling.annotation.Async; @@ -120,7 +120,7 @@ public class WechatPaySubV3Service { try { WxPayUnifiedOrderV3Result.AppResult result = wxPayService.createPartnerOrderV3(TradeTypeEnum.APP, request); Map map = this.buildAppResult(result); - return JsonUtil.toJsonStr(map); + return JacksonUtil.toJson(map); } catch (WxPayException e) { log.error("微信V3程序支付失败", e); throw new TradeFailException("微信V3程序支付失败: "+e.getMessage()); @@ -143,7 +143,7 @@ public class WechatPaySubV3Service { try { WxPayUnifiedOrderV3Result.JsapiResult result = wxPayService.createPartnerOrderV3(TradeTypeEnum.JSAPI, request); Map map = this.buildJsapiResult(result); - return JsonUtil.toJsonStr(map); + return JacksonUtil.toJson(map); } catch (WxPayException e) { log.error("微信V3JsApi支付失败", e); throw new TradeFailException("微信V3JsApi支付失败: "+e.getMessage()); diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV2Service.java index 558c6cac..18af3aea 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV2Service.java @@ -1,7 +1,22 @@ package org.dromara.daxpay.channel.wechat.service.payment.pay.merchant; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.core.util.JsonUtil; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.exception.MethodNotExistException; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.extra.spring.SpringUtil; @@ -18,20 +33,6 @@ import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.exception.MethodNotExistException; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.core.param.trade.pay.PayParam; -import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.trade.pay.PaySyncService; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -51,6 +52,7 @@ import java.util.Objects; public class WechatPayV2Service { private final WechatPayConfigService wechatPayConfigService; private final PaySyncService paySyncService; + private final PaymentAssistService paymentAssistService; /** * 调起支付 @@ -112,7 +114,7 @@ public class WechatPayV2Service { try { var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.APP, request); Map map = this.buildAppResult(result); - return JsonUtil.toJsonStr(map); + return JacksonUtil.toJson(map); } catch (WxPayException e) { log.error("微信V2App支付失败", e); throw new TradeFailException("微信V2App程序支付失败: "+e.getMessage()); @@ -130,7 +132,7 @@ public class WechatPayV2Service { try { var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.JSAPI, request); Map map = this.buildJsapiResult(result); - return JsonUtil.toJsonStr(map); + return JacksonUtil.toJson(map); } catch (WxPayException e) { log.error("微信V2Jaspi支付失败", e); throw new TradeFailException("微信V2Jaspi支付失败: "+e.getMessage()); @@ -246,6 +248,7 @@ public class WechatPayV2Service { */ @Async public void rotationSync(PayOrder payOrder) { + paymentAssistService.initMchAndApp(payOrder.getMchNo(), payOrder.getAppId()); PaySyncResult paySyncResult = paySyncService.syncPayOrder(payOrder); // 不为支付中状态后, 调用系统同步更新状态, 支付状态则继续重试 if (Objects.equals(PayStatusEnum.PROGRESS.getCode(), paySyncResult.getOrderStatus())) { diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV3Service.java index d4ba0f7c..a7747f50 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/pay/merchant/WechatPayV3Service.java @@ -1,18 +1,7 @@ package org.dromara.daxpay.channel.wechat.service.payment.pay.merchant; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; -import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; -import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; -import com.github.binarywang.wxpay.constant.WxPayConstants; -import com.github.binarywang.wxpay.constant.WxPayErrorCode; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; @@ -24,9 +13,21 @@ import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.trade.pay.PaySyncService; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService; +import cn.hutool.extra.spring.SpringUtil; +import com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.constant.WxPayErrorCode; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.scheduling.annotation.Async; @@ -48,6 +49,7 @@ public class WechatPayV3Service { private final WechatPayConfigService wechatPayConfigService; private final PaySyncService paySyncService; + private final PaymentAssistService paymentAssistService; /** * 调起支付 @@ -114,7 +116,7 @@ public class WechatPayV3Service { try { WxPayUnifiedOrderV3Result.AppResult result = wxPayService.createOrderV3(TradeTypeEnum.APP, request); Map map = this.buildAppResult(result); - return JsonUtil.toJsonStr(map); + return JacksonUtil.toJson(map); } catch (WxPayException e) { log.error("微信V3程序支付失败", e); throw new TradeFailException("微信V3程序支付失败: "+e.getMessage()); @@ -133,7 +135,7 @@ public class WechatPayV3Service { try { WxPayUnifiedOrderV3Result.JsapiResult result = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, request); Map map = this.buildJsapiResult(result); - return JsonUtil.toJsonStr(map); + return JacksonUtil.toJson(map); } catch (WxPayException e) { log.error("微信V3JsApi支付失败", e); throw new TradeFailException("微信V3JsApi支付失败: "+e.getMessage()); @@ -192,23 +194,23 @@ public class WechatPayV3Service { */ private void barCodePay(PayOrder payOrder, String authCode, WechatPayConfig config, PayResultBo payResult) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest request = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest(); + WxPayCodepayRequest request = new WxPayCodepayRequest(); request.setDescription(payOrder.getTitle()); request.setOutTradeNo(payOrder.getOrderNo()); // 金额 - var amount = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest.Amount(); + var amount = new WxPayCodepayRequest.Amount(); amount.setTotal(PayUtil.convertCentAmount(payOrder.getAmount())); request.setAmount(amount); // 场景信息 - var sceneInfo = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest.SceneInfo(); - var storeInfo = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest.StoreInfo(); + var sceneInfo = new WxPayCodepayRequest.SceneInfo(); + var storeInfo = new WxPayCodepayRequest.StoreInfo(); storeInfo.setOutId("1"); sceneInfo.setStoreInfo(storeInfo); request.setSceneInfo(sceneInfo); // 付款码参数 - var payer = new com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest.Payer(); + var payer = new WxPayCodepayRequest.Payer(); payer.setAuthCode(authCode); request.setPayer(payer); @@ -268,6 +270,7 @@ public class WechatPayV3Service { @Async @Retryable(retryFor = RetryableException.class, maxAttempts = 10, backoff = @Backoff(value = 5000L)) public void rotationSync(PayOrder payOrder) { + paymentAssistService.initMchAndApp(payOrder.getMchNo(), payOrder.getAppId()); PaySyncResult paySyncResult = paySyncService.syncPayOrder(payOrder); // 不为支付中状态后, 调用系统同步更新状态, 支付状态则继续重试 if (Objects.equals(PayStatusEnum.PROGRESS.getCode(), paySyncResult.getOrderStatus())) { diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV2Service.java index ca80a854..cd9e7c94 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV2Service.java @@ -5,8 +5,8 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; import com.github.binarywang.wxpay.exception.WxPayException; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV3Service.java index 572de204..e49c2b43 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatRefundV3Service.java @@ -6,8 +6,8 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import cn.hutool.core.util.StrUtil; import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV2Service.java index 94b5f629..943ed7a9 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV2Service.java @@ -5,8 +5,8 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; import com.github.binarywang.wxpay.exception.WxPayException; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV3Service.java index 9d8fc1f4..7cf6cb1c 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/refund/WechatSubRefundV3Service.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.service.payment.refund; -import cn.hutool.core.util.StrUtil; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.enums.WechatRefundStatusEnum; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import cn.hutool.core.util.StrUtil; import com.github.binarywang.wxpay.bean.request.WxPayPartnerRefundV3Request; import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV2Service.java index 94edd411..4d0501af 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV2Service.java @@ -1,18 +1,18 @@ package org.dromara.daxpay.channel.wechat.service.payment.sync.pay; -import cn.bootx.platform.core.util.JsonUtil; -import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; @@ -39,13 +39,14 @@ public class WechatPaySyncV2Service { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); try { var result = wxPayService.queryOrder(null, order.getOrderNo()); - syncResult.setSyncData(JsonUtil.toJsonStr(result)) - .setOutOrderNo(result.getTransactionId()) - .setAmount(PayUtil.conversionAmount(result.getTotalFee())); + syncResult.setSyncData(JacksonUtil.toJson(result)) + .setOutOrderNo(result.getTransactionId()); // 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款 if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){ syncResult.setPayStatus(PayStatusEnum.SUCCESS) - .setFinishTime(WechatPayUtil.parseV2(result.getTimeEnd())); + .setFinishTime(WechatPayUtil.parseV2(result.getTimeEnd())) + .setAmount(PayUtil.conversionAmount(result.getTotalFee())) + .setBuyerId(result.getOpenid()); } // 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付) if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){ diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV3Service.java index 4cf0e0d7..c94847c0 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatPaySyncV3Service.java @@ -1,19 +1,19 @@ package org.dromara.daxpay.channel.wechat.service.payment.sync.pay; -import cn.bootx.platform.core.util.JsonUtil; +import cn.bootx.platform.common.jackson.util.JacksonUtil; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result; import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.springframework.stereotype.Service; import java.util.List; @@ -45,13 +45,14 @@ public class WechatPaySyncV3Service { .map(WxPayOrderQueryV3Result.Amount::getTotal) .map(PayUtil::conversionAmount) .orElse(null); - syncResult.setSyncData(JsonUtil.toJsonStr(result)) + syncResult.setSyncData(JacksonUtil.toJson(result)) .setOutOrderNo(result.getTransactionId()) .setAmount(amount); // 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款 if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){ syncResult.setPayStatus(PayStatusEnum.SUCCESS) - .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime())); + .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime())) + .setBuyerId(result.getPayer().getOpenid()); } // 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付) if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){ diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV2Service.java index 9556083c..eab0559c 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV2Service.java @@ -1,23 +1,24 @@ package org.dromara.daxpay.channel.wechat.service.payment.sync.pay; -import cn.bootx.platform.core.util.JsonUtil; +import cn.bootx.platform.common.jackson.util.JacksonUtil; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest; import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.springframework.stereotype.Service; import java.util.List; import java.util.Objects; +import java.util.Optional; /** @@ -44,13 +45,15 @@ public class WechatSubPaySyncV2Service { request.setSubMchId(wechatPayConfig.getSubMchId()) .setSubAppId(wechatPayConfig.getSubAppId()); var result = wxPayService.queryOrder(request); - syncResult.setSyncData(JsonUtil.toJsonStr(result)) - .setOutOrderNo(result.getTransactionId()) - .setAmount(PayUtil.conversionAmount(result.getTotalFee())); + syncResult.setSyncData(JacksonUtil.toJson(result)) + .setOutOrderNo(result.getTransactionId()); // 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款 if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){ syncResult.setPayStatus(PayStatusEnum.SUCCESS) - .setFinishTime(WechatPayUtil.parseV2(result.getTimeEnd())); + .setFinishTime(WechatPayUtil.parseV2(result.getTimeEnd())) + .setAmount(PayUtil.conversionAmount(result.getTotalFee())) + .setBuyerId(Optional.ofNullable(result.getSubOpenid()) + .orElse(result.getOpenid())); } // 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付) if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){ diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV3Service.java index f5609cdf..7185f189 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/pay/WechatSubPaySyncV3Service.java @@ -1,19 +1,19 @@ package org.dromara.daxpay.channel.wechat.service.payment.sync.pay; -import cn.bootx.platform.core.util.JsonUtil; +import cn.bootx.platform.common.jackson.util.JacksonUtil; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import com.github.binarywang.wxpay.bean.result.WxPayPartnerOrderQueryV3Result; import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.springframework.stereotype.Service; import java.util.List; @@ -45,13 +45,15 @@ public class WechatSubPaySyncV3Service { .map(WxPayPartnerOrderQueryV3Result.Amount::getTotal) .map(PayUtil::conversionAmount) .orElse(null); - syncResult.setSyncData(JsonUtil.toJsonStr(result)) + syncResult.setSyncData(JacksonUtil.toJson(result)) .setOutOrderNo(result.getTransactionId()) .setAmount(amount); // 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款 if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){ syncResult.setPayStatus(PayStatusEnum.SUCCESS) - .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime())); + .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime())) + .setBuyerId(Optional.ofNullable(result.getPayer().getSubOpenid()) + .orElse(result.getPayer().getSpOpenid())); } // 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付) if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){ diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV2Service.java index 3864303e..49e5eee2 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV2Service.java @@ -1,5 +1,11 @@ package org.dromara.daxpay.channel.wechat.service.payment.sync.refund; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; @@ -9,12 +15,6 @@ import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -44,6 +44,7 @@ public class WechatRefundSyncV2Service { var result = wxPayService.refundQuery(request); // 网关退款号 syncResult.setOutRefundNo(result.getTransactionId()) + .setAmount(PayUtil.conversionAmount(result.getRefundFee())); // 交易不存在 if (CollUtil.isEmpty(result.getRefundRecords())){ @@ -65,7 +66,7 @@ public class WechatRefundSyncV2Service { syncResult.setRefundStatus(RefundStatusEnum.CLOSE); } } catch (WxPayException e) { - log.error("微信退款订单查询V2失败", e); + log.error("微信退款订单查询V3失败", e); syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) .setSyncSuccess(false) .setRefundStatus(RefundStatusEnum.FAIL); diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV3Service.java index e68893ba..1d3b94f2 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatRefundSyncV3Service.java @@ -1,17 +1,17 @@ package org.dromara.daxpay.channel.wechat.service.payment.sync.refund; -import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Objects; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV2Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV2Service.java index 6bef34bc..e012435c 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV2Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV2Service.java @@ -1,5 +1,11 @@ package org.dromara.daxpay.channel.wechat.service.payment.sync.refund; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; @@ -9,12 +15,6 @@ import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV3Service.java index be28ce7f..2762fc19 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/refund/WechatSubRefundSyncV3Service.java @@ -1,18 +1,18 @@ package org.dromara.daxpay.channel.wechat.service.payment.sync.refund; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryV3Request; import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import org.springframework.stereotype.Service; import java.util.Objects; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/transfer/WechatTransferSyncV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/transfer/WechatTransferSyncV3Service.java index 83a976b2..ed3cf21b 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/transfer/WechatTransferSyncV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/sync/transfer/WechatTransferSyncV3Service.java @@ -1,17 +1,17 @@ package org.dromara.daxpay.channel.wechat.service.payment.sync.transfer; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.TransferStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; import com.github.binarywang.wxpay.bean.merchanttransfer.MerchantDetailsQueryRequest; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.MerchantTransferService; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.TransferStatusEnum; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; import org.springframework.stereotype.Service; import java.util.List; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/transfer/WechatTransferV3Service.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/transfer/WechatTransferV3Service.java index 7faa2cbf..14ec83f4 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/transfer/WechatTransferV3Service.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/payment/transfer/WechatTransferV3Service.java @@ -1,5 +1,12 @@ package org.dromara.daxpay.channel.wechat.service.payment.transfer; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.transfer.TransferCreateV3Request; +import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; import cn.hutool.core.util.StrUtil; import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateRequest; import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateResult; @@ -8,13 +15,6 @@ import com.github.binarywang.wxpay.service.MerchantTransferService; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.param.transfer.TransferCreateV3Request; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.TransferResultBo; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; import org.springframework.stereotype.Service; import java.util.Collections; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java deleted file mode 100644 index cd984e12..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.dromara.daxpay.channel.wechat.strategy.merchant; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.code.WechatPayCode; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.allocation.WeChatPayAllocationV2Service; -import org.dromara.daxpay.channel.wechat.service.payment.allocation.WeChatPayAllocationV3Service; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; - -/** - * 微信分账策略 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class WechatAllocationStrategy extends AbsAllocationStrategy { - private final WeChatPayAllocationV3Service weChatPayAllocationV3Service; - private final WeChatPayAllocationV2Service weChatPayAllocationV2Service; - private final WechatPayConfigService wechatPayConfigService; - - private WechatPayConfig config; - - /** - * 分账通道 - */ - @Override - public String getChannel() { - return ChannelEnum.WECHAT.getCode(); - } - - @Override - public void doBeforeHandler(){ - this.config = wechatPayConfigService.getAndCheckConfig(false); - } - - /** - * 开始分账 - */ - @Override - public AllocStartResultBo start() { - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ - return weChatPayAllocationV3Service.start(getOrder(), getDetails(), this.config); - } else { - return weChatPayAllocationV2Service.start(getOrder(), getDetails(), this.config); - } - } - - /** - * 完结 - */ - @Override - public void finish() { - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ - weChatPayAllocationV3Service.finish(getOrder(), this.config); - } else { - weChatPayAllocationV2Service.finish(getOrder(), this.config); - } - } - - /** - * 同步状态 - */ - @Override - public AllocSyncResultBo doSync() { - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ - return weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config); - } else { - return weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config); - } - } -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java index 10bc0b47..983df030 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java @@ -1,7 +1,5 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.core.enums.ChannelEnum; @@ -9,8 +7,10 @@ import org.dromara.daxpay.core.param.assist.AuthCodeParam; import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.assist.AuthUrlResult; -import org.dromara.daxpay.service.service.assist.WechatOpenAuthService; -import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy; +import org.dromara.daxpay.service.pay.service.assist.WechatOpenAuthService; +import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatChannelBasicStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatChannelBasicStrategy.java new file mode 100644 index 00000000..ee61c392 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatChannelBasicStrategy.java @@ -0,0 +1,43 @@ +package org.dromara.daxpay.channel.wechat.strategy.merchant; + +import cn.bootx.platform.core.rest.dto.KeyValue; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.pay.strategy.AbsChannelBasicStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Stream; + +import static org.dromara.daxpay.core.enums.PayMethodEnum.*; + +/** + * 微信商户基础数据策略 + * @author xxm + * @since 2025/6/4 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatChannelBasicStrategy extends AbsChannelBasicStrategy { + /** + * 获取通道的支付列表 + */ + @Override + public List payMethodList() { + return Stream.of(WAP,APP,QRCODE,BARCODE,JSAPI ) + .map(payMethodEnum -> new KeyValue(payMethodEnum.getCode(), payMethodEnum.getName())) + .toList(); + } + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT.getCode(); + } +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java index fbf380fe..48dfc8c6 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java @@ -1,8 +1,6 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant; import cn.bootx.platform.core.exception.ValidationFailedException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.close.WechatPayCloseV2Service; @@ -11,8 +9,10 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.CloseTypeEnum; import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatGatewayPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatGatewayPayStrategy.java index fc4d66ff..7e200678 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatGatewayPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatGatewayPayStrategy.java @@ -1,9 +1,9 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy; import org.springframework.stereotype.Component; /** diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java index dddd577d..11520ec3 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java @@ -1,8 +1,6 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant; import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; @@ -11,8 +9,10 @@ import org.dromara.daxpay.channel.wechat.service.payment.pay.merchant.WechatPayS import org.dromara.daxpay.channel.wechat.service.payment.pay.merchant.WechatPayV2Service; import org.dromara.daxpay.channel.wechat.service.payment.pay.merchant.WechatPayV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.strategy.AbsPayStrategy; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsPayStrategy; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java index 4a3965cb..c6cb8939 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant; -import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.payment.refund.WechatRefundV2Service; import org.dromara.daxpay.channel.wechat.service.payment.refund.WechatRefundV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.strategy.AbsRefundStrategy; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsRefundStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java index bc45f081..e0384046 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant; -import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.payment.sync.pay.WechatPaySyncV2Service; import org.dromara.daxpay.channel.wechat.service.payment.sync.pay.WechatPaySyncV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsSyncPayOrderStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java index 49397cb7..6d90b807 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java @@ -1,13 +1,13 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant; -import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.payment.sync.refund.WechatRefundSyncV2Service; import org.dromara.daxpay.channel.wechat.service.payment.sync.refund.WechatRefundSyncV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsSyncRefundOrderStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java index 33343905..695a518b 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java @@ -1,11 +1,11 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant; -import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.payment.sync.transfer.WechatTransferSyncV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo; -import org.dromara.daxpay.service.strategy.AbsSyncTransferOrderStrategy; +import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsSyncTransferOrderStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java index cc336708..9e70d35e 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java @@ -2,17 +2,17 @@ package org.dromara.daxpay.channel.wechat.strategy.merchant; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.payment.transfer.WechatTransferV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.TransferPayeeTypeEnum; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; -import org.dromara.daxpay.service.bo.trade.TransferResultBo; -import org.dromara.daxpay.service.strategy.AbsTransferStrategy; +import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsTransferStrategy; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAllocationStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAllocationStrategy.java deleted file mode 100644 index 4f8c8ecf..00000000 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAllocationStrategy.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.dromara.daxpay.channel.wechat.strategy.sub; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.code.WechatPayCode; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.payment.allocation.WeChatPaySubAllocationV2Service; -import org.dromara.daxpay.channel.wechat.service.payment.allocation.WeChatPaySubAllocationV3Service; -import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; - -/** - * 微信分账策略 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class WechatSubAllocationStrategy extends AbsAllocationStrategy { - private final WeChatPaySubAllocationV3Service weChatPayAllocationV3Service; - private final WeChatPaySubAllocationV2Service weChatPayAllocationV2Service; - private final WechatPayConfigService wechatPayConfigService; - - private WechatPayConfig config; - - /** - * 分账通道 - */ - @Override - public String getChannel() { - return ChannelEnum.WECHAT_ISV.getCode(); - } - - @Override - public void doBeforeHandler(){ - this.config = wechatPayConfigService.getAndCheckConfig(true); - } - - /** - * 开始分账 - */ - @Override - public AllocStartResultBo start() { - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ - return weChatPayAllocationV3Service.start(getOrder(), getDetails(), this.config); - } else { - return weChatPayAllocationV2Service.start(getOrder(), getDetails(), this.config); - } - } - - /** - * 完结 - */ - @Override - public void finish() { - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ - weChatPayAllocationV3Service.finish(getOrder(), this.config); - } else { - weChatPayAllocationV2Service.finish(getOrder(), this.config); - } - } - - /** - * 同步状态 - */ - @Override - public AllocSyncResultBo doSync() { - if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ - return weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config); - } else { - return weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config); - } - } - -} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAuthStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAuthStrategy.java index ecf0d7fe..b39a9d4b 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAuthStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubAuthStrategy.java @@ -1,15 +1,15 @@ package org.dromara.daxpay.channel.wechat.strategy.sub; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.param.assist.AuthCodeParam; import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.assist.AuthUrlResult; -import org.dromara.daxpay.service.service.assist.WechatOpenAuthService; -import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy; +import org.dromara.daxpay.service.pay.service.assist.WechatOpenAuthService; +import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubChannelBasicStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubChannelBasicStrategy.java new file mode 100644 index 00000000..bdbafe17 --- /dev/null +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubChannelBasicStrategy.java @@ -0,0 +1,43 @@ +package org.dromara.daxpay.channel.wechat.strategy.sub; + +import cn.bootx.platform.core.rest.dto.KeyValue; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.pay.strategy.AbsChannelBasicStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Stream; + +import static org.dromara.daxpay.core.enums.PayMethodEnum.*; + +/** + * + * @author xxm + * @since 2025/6/4 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubChannelBasicStrategy extends AbsChannelBasicStrategy { + /** + * 获取通道的支付列表 + */ + @Override + public List payMethodList() { + return Stream.of(WAP,APP,QRCODE,BARCODE,JSAPI ) + .map(payMethodEnum -> new KeyValue(payMethodEnum.getCode(), payMethodEnum.getName())) + .toList(); + } + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } +} diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubCloseStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubCloseStrategy.java index fd531f9d..bc56bf8f 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubCloseStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubCloseStrategy.java @@ -1,8 +1,6 @@ package org.dromara.daxpay.channel.wechat.strategy.sub; import cn.bootx.platform.core.exception.ValidationFailedException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.close.WechatPaySubCloseV2Service; @@ -11,8 +9,10 @@ import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigS import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.CloseTypeEnum; import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubGatewayPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubGatewayPayStrategy.java index 717c5d54..ba09ac48 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubGatewayPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubGatewayPayStrategy.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.strategy.sub; -import cn.hutool.json.JSONUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import cn.bootx.platform.common.jackson.util.JacksonUtil; import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.param.gateway.GatewayCashierPayParam; import org.dromara.daxpay.core.param.trade.pay.PayParam; -import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy; +import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** @@ -30,7 +30,7 @@ public class WechatSubGatewayPayStrategy extends AbsGatewayPayStrategy { var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(true); var wechatPayParam = new WechatPayParam(); wechatPayParam.setOpenIdType(wechatPayConfig.getAuthType()); - payParam.setExtraParam(JSONUtil.toJsonStr(wechatPayParam)); + payParam.setExtraParam(JacksonUtil.toJson(wechatPayParam)); } /** diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubPayStrategy.java index c89dbe2f..2a67a352 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubPayStrategy.java @@ -1,8 +1,6 @@ package org.dromara.daxpay.channel.wechat.strategy.sub; import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; @@ -11,8 +9,10 @@ import org.dromara.daxpay.channel.wechat.service.payment.pay.isv.WechatPaySubSer import org.dromara.daxpay.channel.wechat.service.payment.pay.isv.WechatPaySubV2Service; import org.dromara.daxpay.channel.wechat.service.payment.pay.isv.WechatPaySubV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.strategy.AbsPayStrategy; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsPayStrategy; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubRefundStrategy.java index 79d5c688..6bca86ef 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubRefundStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubRefundStrategy.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.strategy.sub; -import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.payment.refund.WechatSubRefundV2Service; import org.dromara.daxpay.channel.wechat.service.payment.refund.WechatSubRefundV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.strategy.AbsRefundStrategy; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsRefundStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncPayStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncPayStrategy.java index a3ef08ec..1f144b52 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncPayStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncPayStrategy.java @@ -1,13 +1,13 @@ package org.dromara.daxpay.channel.wechat.strategy.sub; -import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.payment.sync.pay.WechatSubPaySyncV2Service; import org.dromara.daxpay.channel.wechat.service.payment.sync.pay.WechatSubPaySyncV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsSyncPayOrderStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncRefundStrategy.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncRefundStrategy.java index 58d4bdb0..848ca8e9 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncRefundStrategy.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/sub/WechatSubSyncRefundStrategy.java @@ -1,13 +1,13 @@ package org.dromara.daxpay.channel.wechat.strategy.sub; -import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.service.payment.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.payment.sync.refund.WechatSubRefundSyncV2Service; import org.dromara.daxpay.channel.wechat.service.payment.sync.refund.WechatSubRefundSyncV3Service; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.strategy.AbsSyncRefundOrderStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; diff --git a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java index 32c729b8..38b696c2 100644 --- a/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java +++ b/daxpay-open-channel/daxpay-open-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java @@ -12,7 +12,9 @@ import java.io.IOException; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.util.Locale; import java.util.Map; +import java.util.Objects; /** * 微信支付工具类 @@ -126,9 +128,10 @@ public class WechatPayUtil { } /** - * v3接口时间序列画 + * v3接口时间序列化 */ public LocalDateTime parseV3(String dateStr) { return LocalDateTimeUtil.parse(dateStr, "yyyy-MM-dd'T'HH:mm:ss+08:00"); } + } diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayStart.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayUnionStart.java similarity index 90% rename from daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayStart.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayUnionStart.java index 2b98a462..a29a2e60 100644 --- a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayStart.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/DaxpayUnionStart.java @@ -5,22 +5,23 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.ComponentScan; import org.springframework.core.env.Environment; import java.net.InetAddress; import java.net.UnknownHostException; /** - * 运营端 + * 融合端 * @author xxm * @since 2024/4/20 */ @Slf4j -@SpringBootApplication -public class DaxpayStart { +@SpringBootApplication() +public class DaxpayUnionStart { public static void main(String[] args) throws UnknownHostException { - ConfigurableApplicationContext application = SpringApplication.run(DaxpayStart.class, args); + ConfigurableApplicationContext application = SpringApplication.run(DaxpayUnionStart.class, args); Environment env = application.getEnvironment(); // 环境变量 String appName = env.getProperty("spring.application.name"); diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/aop/PaymentVerifyAspect.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/aop/PaymentVerifyAspect.java similarity index 89% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/aop/PaymentVerifyAspect.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/aop/PaymentVerifyAspect.java index c013336e..95419ef0 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/aop/PaymentVerifyAspect.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/aop/PaymentVerifyAspect.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.common.aop; +package org.dromara.daxpay.server.aop; import cn.bootx.platform.core.code.CommonCode; import cn.bootx.platform.core.exception.BizException; @@ -6,8 +6,8 @@ import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.ValidationUtil; import org.dromara.daxpay.core.param.PaymentCommonParam; import org.dromara.daxpay.core.result.DaxResult; -import org.dromara.daxpay.service.common.anno.PaymentVerify; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.common.anno.PaymentVerify; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; @@ -47,7 +47,7 @@ public class PaymentVerifyAspect { // 参数校验 ValidationUtil.validateParam(paymentParam); // 商户和应用信息初始化 - paymentAssistService.initMchAndApp(paymentParam.getAppId()); + paymentAssistService.initMchAndApp(paymentParam.getMchNo(), paymentParam.getAppId()); // 状态判断 paymentAssistService.checkStatus(); // 终端信息初始化 @@ -64,13 +64,13 @@ public class PaymentVerifyAspect { proceed = pjp.proceed(); } catch (BizException ex) { DaxResult result = new DaxResult<>(ex.getCode(), ex.getMessage()); - result.setTraceId(MDC.get(CommonCode.TRACE_ID)); - result.setResTime(LocalDateTime.now()); paymentAssistService.sign(result); return result; } - // 对返回值进行签名 + // 对返回值添加追踪ID/响应时间并进行签名 if (proceed instanceof DaxResult result){ + result.setTraceId(MDC.get(CommonCode.TRACE_ID)); + result.setResTime(LocalDateTime.now()); paymentAssistService.sign(result); } else { throw new ValidationFailedException("支付方法返回类型需要为 DaxResult 类型的对象"); diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeConfigController.java new file mode 100644 index 00000000..a7318b41 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeConfigController.java @@ -0,0 +1,138 @@ +package org.dromara.daxpay.server.controller.admin.device.qrcode; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.core.rest.result.Result; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeConfigParam; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeConfigQuery; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeSceneConfigParam; +import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeConfigResult; +import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeSceneConfigResult; +import org.dromara.daxpay.service.device.service.qrcode.CashierCodeConfigService; +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.*; + +import java.util.List; + +/** + * 收银码牌配置 + * @author xxm + * @since 2024/11/20 + */ +@Validated +@ClientCode(DaxPayCode.Client.ADMIN) +@Tag(name = "收银码牌配置") +@RestController +@RequestMapping("/admin/cashier/code/config") +@RequestGroup(groupCode = "CashierCodeConfig", groupName = "收银码牌配置", moduleCode = "device") +@RequiredArgsConstructor +public class CashierCodeConfigController { + private final CashierCodeConfigService codeConfigService; + + @RequestPath("分页查询") + @GetMapping("/page") + public Result> page(PageParam pageParam, CashierCodeConfigQuery query) { + return Res.ok(codeConfigService.page(pageParam, query)); + } + + @RequestPath("根据id查询码牌配置") + @Operation(summary = "根据id查询码牌配置") + @GetMapping("/findById") + public Result findById(Long id){ + return Res.ok(codeConfigService.findById(id)); + } + + @RequestPath("码牌配置保存") + @Operation(summary = "码牌配置保存") + @PostMapping("/save") + public Result save(@RequestBody CashierCodeConfigParam param) { + codeConfigService.save(param); + return Res.ok(); + } + + @RequestPath("码牌配置更新") + @Operation(summary = "码牌配置更新") + @PostMapping("/update") + public Result update(@RequestBody CashierCodeConfigParam param) { + codeConfigService.update(param); + return Res.ok(); + } + + @RequestPath("码牌配置删除") + @Operation(summary = "码牌配置删除") + @PostMapping("/delete") + public Result delete(Long id){ + codeConfigService.delete(id); + return Res.ok(); + } + + @RequestPath("获取码牌支付场景配置列表") + @Operation(summary = "获取码牌支付场景配置列表") + @GetMapping("/scene/findAll") + public Result> findSceneByConfigId(Long configId){ + return Res.ok(codeConfigService.findSceneByConfigId(configId)); + } + + @RequestPath("获取码牌支付场景配置详情") + @Operation(summary = "获取码牌各支付场景配置详情") + @GetMapping("/scene/findById") + public Result findSceneById(Long id){ + return Res.ok(codeConfigService.findItemById(id)); + } + + @RequestPath("码牌支付场景配置保存") + @Operation(summary = "码牌支付场景配置保存") + @PostMapping("/scene/save") + public Result saveScene(@RequestBody CashierCodeSceneConfigParam param){ + codeConfigService.saveScene(param); + return Res.ok(); + } + + @RequestPath("码牌支付场景配置更新") + @Operation(summary = "码牌支付场景配置更新") + @PostMapping("/scene/update") + public Result updateScene(@RequestBody CashierCodeSceneConfigParam param){ + codeConfigService.updateScene(param); + return Res.ok(); + } + + @RequestPath("码牌支付场景配置删除") + @Operation(summary = "码牌支付场景配置删除") + @PostMapping("/scene/delete") + public Result deleteScene(Long id){ + codeConfigService.deleteScene(id); + return Res.ok(); + } + + @RequestPath("码牌支付场景配置是否存在") + @Operation(summary = "码牌支付场景配置是否存在") + @GetMapping("/scene/exists") + public Result existsByScene(String scene, Long configId){ + return Res.ok(codeConfigService.existsByScene(scene, configId)); + } + + @RequestPath("码牌支付场景配置是否存在(不包括自身)") + @Operation(summary = "码牌支付场景配置是否存在(不包括自身)") + @GetMapping("/scene/existsNotId") + public Result existsBySceneNotId(String scene, Long configId, Long id){ + return Res.ok(codeConfigService.existsByScene(scene, configId, id)); + } + + @ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) + @RequestPath("码牌配置下拉") + @Operation(summary = "码牌配置下拉") + @GetMapping("/dropdown") + public Result> dropdown(){ + return Res.ok(codeConfigService.dropdown()); + } + +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeTemplateController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeTemplateController.java new file mode 100644 index 00000000..df90d0cb --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/device/qrcode/CashierCodeTemplateController.java @@ -0,0 +1,72 @@ +package org.dromara.daxpay.server.controller.admin.device.qrcode; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.core.rest.result.Result; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.device.param.qrcode.template.CashierCodeTemplateParam; +import org.dromara.daxpay.service.device.param.qrcode.template.CashierCodeTemplateQuery; +import org.dromara.daxpay.service.device.result.qrcode.template.CashierCodeTemplateResult; +import org.dromara.daxpay.service.device.service.qrcode.CashierCodeTemplateService; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Validated +@ClientCode(DaxPayCode.Client.ADMIN) +@Tag(name = "收银码牌模板") +@RestController +@RequestMapping("/admin/cashier/code/template") +@RequestGroup(groupCode = "CashierCodeTemplate", groupName = "收银码牌模板", moduleCode = "device") +@RequiredArgsConstructor +public class CashierCodeTemplateController { + private final CashierCodeTemplateService cashierCodeTemplateService; + + @RequestPath("分页查询") + @Operation(summary = "分页查询") + @GetMapping("/page") + public Result> page(PageParam pageParam, CashierCodeTemplateQuery query){ + return Res.ok(cashierCodeTemplateService.page(pageParam, query)); + } + + @RequestPath("查询详情") + @Operation(summary = "查询详情") + @GetMapping("/findById") + public Result findById(@NotNull(message = "id不能为空") Long id){ + return Res.ok(cashierCodeTemplateService.findById(id)); + } + + @RequestPath("生成预览图片") + @Operation(summary = "生成预览图片") + @PostMapping("/generatePreviewImg") + public Result generatePreviewImg(@Validated CashierCodeTemplateParam param){ + return Res.ok(cashierCodeTemplateService.generatePreviewImg(param)); + } + + @RequestPath("创建") + @Operation(summary = "创建") + @PostMapping("/create") + public Result create(@Validated CashierCodeTemplateParam param){ + cashierCodeTemplateService.create(param); + return Res.ok(); + } + + @RequestPath("更新") + @Operation(summary = "更新") + @PostMapping("/update") + public Result update(@Validated CashierCodeTemplateParam param){ + cashierCodeTemplateService.update(param); + return Res.ok(); + } + +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/config/IsvChannelConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/config/IsvChannelConfigController.java new file mode 100644 index 00000000..38e6469b --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/config/IsvChannelConfigController.java @@ -0,0 +1,44 @@ +package org.dromara.daxpay.server.controller.admin.isv.config; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.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.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.isv.result.config.IsvChannelConfigResult; +import org.dromara.daxpay.service.isv.service.config.IsvChannelConfigService; +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; + +import java.util.List; + +/** + * 服务商通道配置 + * @author xxm + * @since 2024/10/29 + */ +@Validated +@ClientCode({DaxPayCode.Client.ADMIN}) +@Tag(name = "服务商通道配置") +@RestController +@RequestGroup(groupCode = "IsvChannelConfig", groupName = "通道配置", moduleCode = "isv") +@RequestMapping("/isv/channel/config") +@RequiredArgsConstructor +public class IsvChannelConfigController { + private final IsvChannelConfigService service; + + @RequestPath("查询服务商配置列表") + @Operation(summary = "查询服务商配置列表") + @GetMapping("/findAll") + public Result> findAll(){ + return Res.ok(service.findAll()); + } + +} + diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvAggregateConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvAggregateConfigController.java new file mode 100644 index 00000000..35afd28e --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvAggregateConfigController.java @@ -0,0 +1,141 @@ +package org.dromara.daxpay.server.controller.admin.isv.gateway; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.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.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.isv.param.gateway.IsvAggregateBarPayConfigParam; +import org.dromara.daxpay.service.isv.param.gateway.IsvAggregatePayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvAggregateBarPayConfigResult; +import org.dromara.daxpay.service.isv.result.gateway.IsvAggregatePayConfigResult; +import org.dromara.daxpay.service.isv.service.gateway.IsvAggregateConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 聚合支付配置 + * @author xxm + * @since 2025/3/24 + */ +@Validated +@ClientCode({DaxPayCode.Client.ADMIN}) +@Tag(name = "聚合支付配置(服务商)") +@RestController +@RequestMapping("/isv/aggregate/config") +@RequestGroup(groupCode = "AggregateConfig", groupName = "聚合支付配置(服务商)", moduleCode = "GatewayPay") +@RequiredArgsConstructor +public class IsvAggregateConfigController { + private final IsvAggregateConfigService aggregateConfigService; + + @RequestPath("支付配置列表") + @Operation(summary = "支付配置列表") + @GetMapping("/listByPay") + public Result> listByPay(){ + return Res.ok(aggregateConfigService.listByPay()); + } + + @RequestPath("付款码支付配置列表") + @Operation(summary = "付款码支付配置列表") + @GetMapping("/listByBar") + public Result> listByBar(){ + return Res.ok(aggregateConfigService.listByBar()); + } + + @RequestPath("支付配置详情") + @Operation(summary = "支付配置详情") + @GetMapping("/findPayById") + public Result findPayById(Long id){ + return Res.ok(aggregateConfigService.findPayById(id)); + } + + @RequestPath("付款码支付配置详情") + @Operation(summary = "付款码支付配置详情") + @GetMapping("/findBarById") + public Result findBarById(Long id){ + return Res.ok(aggregateConfigService.findBarById(id)); + } + + @RequestPath("保存支付配置") + @Operation(summary = "保存支付配置") + @PostMapping("/savePay") + public Result savePay(@Validated @RequestBody IsvAggregatePayConfigParam param){ + aggregateConfigService.savePay(param); + return Res.ok(); + } + + @RequestPath("保存付款码支付配置") + @Operation(summary = "保存付款码支付配置") + @PostMapping("/saveBar") + public Result saveBar(@Validated @RequestBody IsvAggregateBarPayConfigParam param){ + aggregateConfigService.saveBar(param); + return Res.ok(); + } + + @RequestPath("更新支付配置") + @Operation(summary = "更新支付配置") + @PostMapping("/updatePay") + public Result updatePay(@Validated @RequestBody IsvAggregatePayConfigParam param){ + aggregateConfigService.updatePay(param); + return Res.ok(); + } + + @RequestPath("更新付款码支付配置") + @Operation(summary = "更新付款码支付配置") + @PostMapping("/updateBar") + public Result updateBar(@Validated @RequestBody IsvAggregateBarPayConfigParam param){ + aggregateConfigService.updateBar(param); + return Res.ok(); + } + + @RequestPath("删除支付配置") + @Operation(summary = "删除支付配置") + @PostMapping("/deletePay") + public Result deletePay(Long id){ + aggregateConfigService.deletePay(id); + return Res.ok(); + } + + @RequestPath("删除付款码支付配置") + @Operation(summary = "删除付款码支付配置") + @PostMapping("/deleteBar") + public Result deleteBar(Long id){ + aggregateConfigService.deleteBar(id); + return Res.ok(); + } + + @RequestPath("支付配置是否存在") + @Operation(summary = "支付配置是否存在") + @GetMapping("/existsPay") + public Result existsPay(String type){ + return Res.ok(aggregateConfigService.existsPay(type)); + } + + @RequestPath("支付配置是否存在(不包含自身)") + @Operation(summary = "支付配置是否存在(不包含自身)") + @GetMapping("/existsPayNotId") + public Result existsPayNotId(String type, Long id){ + return Res.ok(aggregateConfigService.existsPay(type, id)); + } + + @RequestPath("付款码支付配置是否存在") + @Operation(summary = "付款码支付配置是否存在") + @GetMapping("/existsBar") + public Result existsBar(String type){ + return Res.ok(aggregateConfigService.existsBar(type)); + } + + @RequestPath("付款码支付配置是否存在(不包含自身)") + @Operation(summary = "付款码支付配置是否存在(不包含自身)") + @GetMapping("/existsBarNotId") + public Result existsBarNotId(String type, Long id){ + return Res.ok(aggregateConfigService.existsBar(type, id)); + } +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvCashierConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvCashierConfigController.java new file mode 100644 index 00000000..7e637547 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvCashierConfigController.java @@ -0,0 +1,124 @@ +package org.dromara.daxpay.server.controller.admin.isv.gateway; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.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.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.isv.param.gateway.IsvCashierGroupConfigParam; +import org.dromara.daxpay.service.isv.param.gateway.IsvCashierItemConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvCashierGroupConfigResult; +import org.dromara.daxpay.service.isv.result.gateway.IsvCashierItemConfigResult; +import org.dromara.daxpay.service.isv.service.gateway.IsvCashierConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 收银台支付配置 + * @author xxm + * @since 2025/3/24 + */ +@Validated +@ClientCode({DaxPayCode.Client.ADMIN}) +@Tag(name = "收银台支付配置(服务商)") +@RestController +@RequestMapping("/isv/cashier/config") +@RequestGroup(groupCode = "CashierConfig", groupName = "收银台支付配置(服务商)", moduleCode = "GatewayPay") +@RequiredArgsConstructor +public class IsvCashierConfigController { + private final IsvCashierConfigService cashierConfigService; + + @RequestPath("获取指定类型收银台分组列表") + @Operation(summary = "获取指定类型收银台分组列表") + @GetMapping("/listByType") + public Result> listByType(@NotBlank(message = "收银台类型不可为空") String cashierType) { + return Res.ok(cashierConfigService.listByGroup(cashierType)); + } + + @RequestPath("获取收银台分组配置") + @Operation(summary = "获取收银台分组配置") + @GetMapping("/findGroupById") + public Result findGroupById(@NotNull(message = "分组ID不可为空") Long groupId) { + return Res.ok(cashierConfigService.findGroupById(groupId)); + } + + @RequestPath("获取收银台条目配置列表") + @Operation(summary = "获取收银台条目配置列表") + @GetMapping("/listByItem") + public Result> listByItem(Long groupId) { + return Res.ok(cashierConfigService.listByItem(groupId)); + } + + @RequestPath("获取收银台条目配置") + @Operation(summary = "获取收银台条目配置") + @GetMapping("/findItemById") + public Result findItemById(Long groupId) { + return Res.ok(cashierConfigService.findItemById(groupId)); + } + + @RequestPath("保存收银台分组") + @Operation(summary = "保存收银台分组") + @PostMapping("/saveGroup") + public Result saveGroup(@RequestBody @Validated(ValidationGroup.add.class) IsvCashierGroupConfigParam param) { + cashierConfigService.saveGroup(param); + return Res.ok(); + } + + @RequestPath("保存默认收银台分组(H5)") + @Operation(summary = "保存默认收银台分组(H5)") + @PostMapping("/saveDefaultGroup") + public Result saveDefaultGroup() { + cashierConfigService.saveDefaultGroup(); + return Res.ok(); + } + + @RequestPath("修改收银台分组") + @Operation(summary = "修改收银台分组") + @PostMapping("/updateGroup") + public Result updateGroup(@RequestBody @Validated(ValidationGroup.edit.class) IsvCashierGroupConfigParam param) { + cashierConfigService.updateGroup(param); + return Res.ok(); + } + + @RequestPath("删除收银台分组") + @Operation(summary = "删除收银台分组") + @PostMapping("/deleteGroup") + public Result deleteGroup(Long id) { + cashierConfigService.deleteGroup(id); + return Res.ok(); + } + + @RequestPath("保存收银台条目配置") + @Operation(summary = "保存收银台条目配置") + @PostMapping("/saveItem") + public Result saveItem(@RequestBody @Validated(ValidationGroup.add.class) IsvCashierItemConfigParam param) { + cashierConfigService.saveItem(param); + return Res.ok(); + } + + @RequestPath("修改收银台条目配置") + @Operation(summary = "修改收银台条目配置") + @PostMapping("/updateItem") + public Result updateItem(@RequestBody @Validated(ValidationGroup.edit.class) IsvCashierItemConfigParam param) { + cashierConfigService.updateItem(param); + return Res.ok(); + } + + @RequestPath("删除收银台条目配置") + @Operation(summary = "删除收银台条目配置") + @PostMapping("/deleteItem") + public Result deleteItem(Long id) { + cashierConfigService.deleteItem(id); + return Res.ok(); + } + +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvGatewayPayConfigController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvGatewayPayConfigController.java new file mode 100644 index 00000000..2e655c89 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/isv/gateway/IsvGatewayPayConfigController.java @@ -0,0 +1,49 @@ +package org.dromara.daxpay.server.controller.admin.isv.gateway; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.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 lombok.RequiredArgsConstructor; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.isv.param.gateway.IsvGatewayPayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvGatewayPayConfigResult; +import org.dromara.daxpay.service.isv.service.gateway.IsvGatewayPayConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 网关支付配置 + * @author xxm + * @since 2025/3/24 + */ +@Validated +@ClientCode({DaxPayCode.Client.ADMIN}) +@Tag(name = "网关支付配置(服务商)") +@RestController +@RequestMapping("/isv/gateway/config") +@RequestGroup(groupCode = "IsvGatewayPayConfig", groupName = "网关支付配置(服务商)", moduleCode = "GatewayPay") +@RequiredArgsConstructor +public class IsvGatewayPayConfigController { + private final IsvGatewayPayConfigService gatewayPayConfigService; + + @RequestPath("获取网关支付配置") + @Operation(summary = "获取网关支付配置") + @GetMapping("/getConfig") + public Result getConfig() { + return Res.ok(gatewayPayConfigService.getConfig()); + } + + @RequestPath("更新网关支付配置") + @Operation(summary = "更新网关支付配置") + @PostMapping("/update") + public Result update(@Validated(ValidationGroup.edit.class) @RequestBody IsvGatewayPayConfigParam param) { + gatewayPayConfigService.update(param); + return Res.ok(); + } +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/MchAppController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MchAppAdminController.java similarity index 73% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/MchAppController.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MchAppAdminController.java index 44cde46c..d4dc4f78 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/MchAppController.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MchAppAdminController.java @@ -1,19 +1,20 @@ -package org.dromara.daxpay.controller.common; +package org.dromara.daxpay.server.controller.admin.merchant; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.OperateLog; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.dto.LabelValue; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; import cn.bootx.platform.core.util.ValidationUtil; import cn.bootx.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.service.service.merchant.MchAppService; -import org.dromara.daxpay.service.param.merchant.MchAppParam; -import org.dromara.daxpay.service.param.merchant.MchAppQuery; -import org.dromara.daxpay.service.result.merchant.MchAppResult; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.param.app.MchAppParam; +import org.dromara.daxpay.service.merchant.param.app.MchAppQuery; +import org.dromara.daxpay.service.merchant.result.app.MchAppResult; +import org.dromara.daxpay.service.merchant.service.app.MchAppService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; @@ -22,20 +23,19 @@ import org.dromara.core.trans.anno.TransMethodResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; - /** * 商户应用配置(管理) * @author xxm * @since 2024/6/25 */ @Validated +@ClientCode({DaxPayCode.Client.ADMIN}) @Tag(name = "商户应用配置(管理)") @RestController -@RequestMapping("/mch/app") -@RequestGroup(groupCode = "mchAppAdmin", groupName = "商户应用配置(管理)", moduleCode = "PayConfig") +@RequestMapping("/admin/mch/app") +@RequestGroup(groupCode = "mchAppAdmin", groupName = "商户应用配置(管理)", moduleCode = "merchant") @RequiredArgsConstructor -public class MchAppController { +public class MchAppAdminController { private final MchAppService mchAppService; @RequestPath("新增商户应用") @@ -82,19 +82,4 @@ public class MchAppController { mchAppService.delete(id); return Res.ok(); } - - - @RequestPath("根据商户号查询启用的应用下拉列表") - @Operation(summary = "根据商户号查询启用的商户应用下拉列表") - @GetMapping("/dropdown") - public Result> appDropdown(){ - return Res.ok(mchAppService.dropdown()); - } - - @RequestPath("根据商户号查询启应用下拉列表") - @Operation(summary = "根据商户号查询商户应用下拉列表") - @GetMapping("/dropdownByEnable") - public Result> appDropdownByEnable(){ - return Res.ok(mchAppService.dropdownByEnable()); - } } diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MerchantAdminController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MerchantAdminController.java new file mode 100644 index 00000000..0b74e46d --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/merchant/MerchantAdminController.java @@ -0,0 +1,84 @@ +package org.dromara.daxpay.server.controller.admin.merchant; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.OperateLog; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.server.service.admin.MerchantAdminService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.param.info.MerchantCreateParam; +import org.dromara.daxpay.service.merchant.param.info.MerchantParam; +import org.dromara.daxpay.service.merchant.param.info.MerchantQuery; +import org.dromara.daxpay.service.merchant.result.info.MerchantResult; +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.dromara.core.trans.anno.TransMethodResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 商户配置(管理) + * @author xxm + * @since 2024/6/25 + */ +@Validated +@ClientCode({DaxPayCode.Client.ADMIN}) +@Tag(name = "商户配置(管理)") +@RestController +@RequestMapping("/admin/merchant") +@RequestGroup(groupCode = "merchantAdmin", groupName = "商户配置(管理)", moduleCode = "merchant", moduleName = "(DaxPay)商户管理") +@RequiredArgsConstructor +public class MerchantAdminController { + private final MerchantAdminService merchantService; + + @RequestPath("新增商户") + @Operation(summary = "新增商户") + @PostMapping("/add") + @OperateLog(title = "新增商户 ", businessType = OperateLog.BusinessType.ADD, saveParam = true) + public Result add(@RequestBody @Validated(ValidationGroup.add.class) MerchantCreateParam param){ + merchantService.add(param); + return Res.ok(); + } + + @RequestPath("修改商户") + @Operation(summary = "修改商户") + @PostMapping("/update") + @OperateLog(title = "修改商户 ", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) MerchantParam param){ + merchantService.update(param); + return Res.ok(); + } + + @TransMethodResult + @RequestPath("商户分页") + @Operation(summary = "商户分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, MerchantQuery param){ + return Res.ok(merchantService.page(pageParam, param)); + } + + @TransMethodResult + @RequestPath("根据id查询商户") + @Operation(summary = "根据id查询商户") + @GetMapping("/findById") + public Result findById(@NotNull(message = "id不可为空")Long id){ + return Res.ok(merchantService.findById(id)); + } + + @RequestPath("删除商户") + @Operation(summary = "删除商户") + @PostMapping("/delete") + @OperateLog(title = "删除商户 ", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + public Result delete(@NotNull(message = "id不可为空") Long id){ + merchantService.delete(id); + return Res.ok(); + } + +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/report/IndexTradeReportAdminController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/report/IndexTradeReportAdminController.java new file mode 100644 index 00000000..ee7c86fb --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/admin/report/IndexTradeReportAdminController.java @@ -0,0 +1,88 @@ +package org.dromara.daxpay.server.controller.admin.report; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.result.Result; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.report.TradeReportQuery; +import org.dromara.daxpay.service.pay.result.report.MerchantReportResult; +import org.dromara.daxpay.service.pay.result.report.TradeReportResult; +import org.dromara.daxpay.service.pay.result.report.TradeStatisticsReport; +import org.dromara.daxpay.service.pay.service.report.IndexTradeReportService; +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.RestController; + +import java.util.List; + +/** + * 首页交易报表 + * @author xxm + * @since 2024/11/17 + */ +@Validated +@Tag(name = "运营平台首页交易报表") +@RequestGroup(groupCode = "IndexTradeReport", groupName = "运营平台首页交易报表", moduleCode = "report", moduleName = "(DaxPay)统计报表") +@ClientCode(DaxPayCode.Client.ADMIN) +@RestController +@RequestMapping("/admin/report/index") +@RequiredArgsConstructor +public class IndexTradeReportAdminController { + + private final IndexTradeReportService tradeReportService; + + @RequestPath("支付交易信息统计") + @Operation(summary = "支付交易信息统计") + @GetMapping("/pay") + public Result pryTradeReport(TradeReportQuery query){ + return Res.ok(tradeReportService.pryTradeReport(query)); + } + + @RequestPath("退款交易信息统计") + @Operation(summary = "退款交易信息统计") + @GetMapping("/refund") + public Result refundTradeReport(TradeReportQuery query){ + return Res.ok(tradeReportService.refundTradeReport(query)); + } + + @RequestPath("支付交易通道统计") + @Operation(summary = "支付交易通道统计") + @GetMapping("/payChannel") + public Result> payChannelReport(TradeReportQuery query){ + return Res.ok(tradeReportService.payChannelReport(query)); + } + + @RequestPath("退款交易通道统计") + @Operation(summary = "退款交易通道统计") + @GetMapping("/refundChannel") + public Result> refundChannelReport(TradeReportQuery query){ + return Res.ok(tradeReportService.refundChannelReport(query)); + } + + @RequestPath("支付交易方式统计") + @Operation(summary = "支付交易方式统计") + @GetMapping("/payMethod") + public Result> payMethodReport(TradeReportQuery query){ + return Res.ok(tradeReportService.payMethodReport(query)); + } + + @RequestPath("商户和应用数量统计") + @Operation(summary = "商户和应用数量统计") + @GetMapping("/merchantCount") + public Result merchantCount(){ + return Res.ok(tradeReportService.merchantCount(new TradeReportQuery())); + } + + @RequestPath("交易统计报表") + @Operation(summary = "交易统计报表") + @GetMapping("/tradeStatisticsReport") + public Result> tradeStatisticsReport(TradeReportQuery query){ + return Res.ok(tradeReportService.tradeStatistics(query)); + } +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/ChannelAuthController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/ChannelAuthController.java similarity index 89% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/ChannelAuthController.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/ChannelAuthController.java index d2e9e1da..cc628293 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/ChannelAuthController.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/ChannelAuthController.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.controller.gateway; +package org.dromara.daxpay.server.controller.gateway; import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.rest.Res; @@ -10,9 +10,9 @@ import org.dromara.daxpay.core.result.DaxResult; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.assist.AuthUrlResult; import org.dromara.daxpay.core.util.DaxRes; -import org.dromara.daxpay.service.common.anno.PaymentVerify; -import org.dromara.daxpay.service.service.assist.ChannelAuthService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.common.anno.PaymentVerify; +import org.dromara.daxpay.service.pay.service.assist.ChannelAuthService; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayCashierController.java similarity index 71% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeController.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayCashierController.java index 2295019e..69617134 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeController.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayCashierController.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.controller.gateway; +package org.dromara.daxpay.server.controller.gateway; import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.rest.Res; @@ -7,9 +7,9 @@ import cn.bootx.platform.core.util.ValidationUtil; import org.dromara.daxpay.core.param.gateway.*; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; -import org.dromara.daxpay.service.result.gateway.GatewayCashierCodeConfigResult; -import org.dromara.daxpay.service.service.gateway.CashierPayService; -import org.dromara.daxpay.service.service.gateway.GatewayPayQueryService; +import org.dromara.daxpay.service.pay.result.gateway.GatewayCashierCodeConfigResult; +import org.dromara.daxpay.service.pay.service.gateway.CashierCodePayService; +import org.dromara.daxpay.service.pay.service.gateway.CashierPayService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -19,47 +19,48 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; /** - * 网关支付码牌服务 + * 网关收银支付服务(收银台/码牌) * @author xxm * @since 2025/4/12 */ @Validated @IgnoreAuth -@Tag(name = "网关支付码牌服务") +@Tag(name = "网关收银支付服务") @RestController @RequestMapping("/unipay/gateway/cashier") @RequiredArgsConstructor -public class CashierCodeController { +public class GatewayCashierController { private final CashierPayService cashierPayService; - private final GatewayPayQueryService checkoutQueryService; + private final CashierCodePayService cashierCodePayService; @Operation(summary = "获取收银码牌配置信息") @GetMapping("/getCodeConfig") public Result getCashierCodeConfig( @NotBlank(message = "码牌编码不能为空") @Parameter(description = "码牌编码") String cashierCode, - @NotBlank(message = "收银台类型不能为空") @Parameter(description = "收银台类型")String cashierType){ - return Res.ok(checkoutQueryService.getCashierCodeConfig(cashierCode, cashierType)); + @NotBlank(message = "支付场景不能为空") @Parameter(description = "支付场景")String cashierScene){ + return Res.ok(cashierCodePayService.getCashierCodeConfig(cashierCode, cashierScene)); } @Operation(summary = "获取收银码牌支付的授权链接, 用于获取OpenId一类的信息") @PostMapping("/code/generateAuthUrl") public Result getCashierCodeConfig(@RequestBody @Validated GatewayCashierCodeAuthUrlParam param){ - return Res.ok(cashierPayService.genAuthUrl(param)); - } - - @Operation(summary = "获取网关支付授权结果") - @PostMapping("/code/auth") - public Result auth(@RequestBody @Validated GatewayCashierCodeAuthParam param){ - ValidationUtil.validateParam(param); - return Res.ok(cashierPayService.auth(param)); + return Res.ok(cashierCodePayService.genAuthUrl(param)); } @Operation(summary = "发起支付(码牌)") @PostMapping("/code/pay") public Result aggregateBarPay(@RequestBody @Validated GatewayCashierCodePayParam param){ - return Res.ok(cashierPayService.cashierCodePay(param)); + return Res.ok(cashierCodePayService.cashierCodePay(param)); } + @Operation(summary = "获取网关支付授权结果(码牌)") + @PostMapping("/code/auth") + public Result auth(@RequestBody @Validated GatewayCashierCodeAuthParam param){ + ValidationUtil.validateParam(param); + return Res.ok(cashierCodePayService.auth(param)); + } + + @Operation(summary = "发起支付(收银台)") @PostMapping("/pay") public Result pay(@RequestBody @Validated GatewayCashierPayParam param){ diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayPayController.java similarity index 88% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayController.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayPayController.java index ee567673..1d9c39de 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayController.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/GatewayPayController.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.controller.gateway; +package org.dromara.daxpay.server.controller.gateway; import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.rest.Res; @@ -14,13 +14,13 @@ import org.dromara.daxpay.core.result.DaxResult; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.util.DaxRes; -import org.dromara.daxpay.service.common.anno.PaymentVerify; -import org.dromara.daxpay.service.result.gateway.AggregateOrderAndConfigResult; -import org.dromara.daxpay.service.result.gateway.GatewayOrderAndConfigResult; -import org.dromara.daxpay.service.result.gateway.GatewayOrderResult; -import org.dromara.daxpay.service.result.gateway.GatewayPayUrlResult; -import org.dromara.daxpay.service.service.gateway.GatewayPayQueryService; -import org.dromara.daxpay.service.service.gateway.GatewayPayService; +import org.dromara.daxpay.service.pay.common.anno.PaymentVerify; +import org.dromara.daxpay.service.pay.result.gateway.AggregateOrderAndConfigResult; +import org.dromara.daxpay.service.pay.result.gateway.GatewayOrderAndConfigResult; +import org.dromara.daxpay.service.pay.result.gateway.GatewayOrderResult; +import org.dromara.daxpay.service.pay.result.gateway.GatewayPayUrlResult; +import org.dromara.daxpay.service.pay.service.gateway.GatewayPayQueryService; +import org.dromara.daxpay.service.pay.service.gateway.GatewayPayService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -48,7 +48,6 @@ public class GatewayPayController { @Operation(summary = "创建一个网关支付链接") @PostMapping("/prePay") public DaxResult prePay(@RequestBody GatewayPayParam checkoutParam){ - // 初始化 return DaxRes.ok(gatewayPayService.prePay(checkoutParam)); } diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/TestCallbackController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/TestCallbackController.java similarity index 68% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/TestCallbackController.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/TestCallbackController.java index 24bea829..6e082ca1 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/TestCallbackController.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/TestCallbackController.java @@ -1,8 +1,9 @@ -package org.dromara.daxpay.controller.gateway; +package org.dromara.daxpay.server.controller.gateway; import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.util.JsonUtil; import org.dromara.daxpay.core.result.DaxNoticeResult; +import org.dromara.daxpay.core.result.trade.pay.PayOrderResult; import org.dromara.daxpay.core.util.PaySignUtil; import cn.hutool.core.lang.TypeReference; import cn.hutool.core.thread.ThreadUtil; @@ -35,8 +36,14 @@ public class TestCallbackController { @PostMapping("/notify") public String notify(@RequestBody String data){ log.info("notify:{}",data); + // 转换成实体类, 使用sdk中内置的json工具类转换 + DaxNoticeResult x = JsonUtil.toBean(data, new TypeReference<>() {}); + // 替换成自己的密钥 + PaySignUtil.verifyHmacSha256Sign(x,"bc5b5d592cc34434a27fb57fe923dacc5374da52a4174ff5874768a8215e5fd3",x.getSign()); + // 使用map方式验签 DaxNoticeResult> bean = JsonUtil.toBean(data, new TypeReference<>() {}); - PaySignUtil.verifyHmacSha256Sign(bean,"123456",bean.getSign()); + // 替换成自己的密钥 + PaySignUtil.verifyHmacSha256Sign(bean,"bc5b5d592cc34434a27fb57fe923dacc5374da52a4174ff5874768a8215e5fd3",bean.getSign()); ThreadUtil.sleep(RandomUtil.randomInt(2, 7) *1000L); return "success"; } diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniQueryController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/UniQueryController.java similarity index 85% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniQueryController.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/UniQueryController.java index baf83c0f..06e47920 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniQueryController.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/UniQueryController.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.controller.gateway; +package org.dromara.daxpay.server.controller.gateway; import cn.bootx.platform.core.annotation.IgnoreAuth; import org.dromara.daxpay.core.param.trade.pay.QueryPayParam; @@ -9,10 +9,10 @@ import org.dromara.daxpay.core.result.trade.pay.PayOrderResult; import org.dromara.daxpay.core.result.trade.refund.RefundOrderResult; import org.dromara.daxpay.core.result.trade.transfer.TransferOrderResult; import org.dromara.daxpay.core.util.DaxRes; -import org.dromara.daxpay.service.common.anno.PaymentVerify; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; -import org.dromara.daxpay.service.service.order.refund.RefundOrderQueryService; -import org.dromara.daxpay.service.service.order.transfer.TransferOrderQueryService; +import org.dromara.daxpay.service.pay.common.anno.PaymentVerify; +import org.dromara.daxpay.service.pay.service.order.pay.PayOrderQueryService; +import org.dromara.daxpay.service.pay.service.order.refund.RefundOrderQueryService; +import org.dromara.daxpay.service.pay.service.order.transfer.TransferOrderQueryService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniSyncController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/UniSyncController.java similarity index 85% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniSyncController.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/UniSyncController.java index 28571572..ad23dc06 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniSyncController.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/UniSyncController.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.controller.gateway; +package org.dromara.daxpay.server.controller.gateway; import cn.bootx.platform.core.annotation.IgnoreAuth; import org.dromara.daxpay.core.param.trade.pay.PaySyncParam; @@ -9,10 +9,10 @@ import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; import org.dromara.daxpay.core.result.trade.refund.RefundSyncResult; import org.dromara.daxpay.core.result.trade.transfer.TransferSyncResult; import org.dromara.daxpay.core.util.DaxRes; -import org.dromara.daxpay.service.common.anno.PaymentVerify; -import org.dromara.daxpay.service.service.trade.pay.PaySyncService; -import org.dromara.daxpay.service.service.trade.refund.RefundSyncService; -import org.dromara.daxpay.service.service.trade.transfer.TransferSyncService; +import org.dromara.daxpay.service.pay.common.anno.PaymentVerify; +import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundSyncService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferSyncService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniTradeController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/UniTradeController.java similarity index 84% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniTradeController.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/UniTradeController.java index 82fd5fea..b96534c0 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniTradeController.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/gateway/UniTradeController.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.controller.gateway; +package org.dromara.daxpay.server.controller.gateway; import cn.bootx.platform.core.annotation.IgnoreAuth; import org.dromara.daxpay.core.param.trade.pay.PayCloseParam; @@ -10,11 +10,11 @@ import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.result.trade.refund.RefundResult; import org.dromara.daxpay.core.result.trade.transfer.TransferResult; import org.dromara.daxpay.core.util.DaxRes; -import org.dromara.daxpay.service.common.anno.PaymentVerify; -import org.dromara.daxpay.service.service.trade.pay.PayCloseService; -import org.dromara.daxpay.service.service.trade.pay.PayService; -import org.dromara.daxpay.service.service.trade.refund.RefundService; -import org.dromara.daxpay.service.service.trade.transfer.TransferService; +import org.dromara.daxpay.service.pay.common.anno.PaymentVerify; +import org.dromara.daxpay.service.pay.service.trade.pay.PayCloseService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MchAppController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MchAppController.java new file mode 100644 index 00000000..d2c57886 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MchAppController.java @@ -0,0 +1,89 @@ +package org.dromara.daxpay.server.controller.merchant.info; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.OperateLog; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.param.app.MchAppParam; +import org.dromara.daxpay.service.merchant.param.app.MchAppQuery; +import org.dromara.daxpay.service.merchant.result.app.MchAppResult; +import org.dromara.daxpay.service.merchant.service.app.MchAppService; +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.*; + +import java.util.List; + +/** + * 商户应用配置 + * @author xxm + * @since 2024/6/25 + */ +@Validated +@ClientCode(DaxPayCode.Client.MERCHANT) +@Tag(name = "商户应用配置") +@RestController +@RequestMapping("/mch/app") +@RequestGroup(groupCode = "mchApp", groupName = "商户应用配置", moduleCode = "merchant") +@RequiredArgsConstructor +public class MchAppController { + private final MchAppService mchAppService; + + @RequestPath("新增商户应用") + @Operation(summary = "新增商户应用") + @OperateLog(title = "新增商户应用信息 ", businessType = OperateLog.BusinessType.ADD, saveParam = true) + @PostMapping("/add") + public Result add(@RequestBody @Validated(ValidationGroup.add.class) MchAppParam param){ + mchAppService.add(param); + return Res.ok(); + } + + @RequestPath("修改商户应用") + @Operation(summary = "修改商户应用") + @OperateLog(title = "修改商户应用信息 ", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + @PostMapping("/update") + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) MchAppParam param){ + mchAppService.update(param); + return Res.ok(); + } + + @RequestPath("商户应用分页") + @Operation(summary = "商户应用分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, MchAppQuery query){ + return Res.ok(mchAppService.page(pageParam, query)); + } + + @RequestPath("商户应用列表") + @Operation(summary = "商户应用列表") + @GetMapping("/list") + public Result> list(){ + return Res.ok(mchAppService.list()); + } + + @RequestPath("根据id查询商户应用") + @Operation(summary = "根据id查询商户应用") + @GetMapping("/findById") + public Result findById(@NotNull(message = "id不可为空")Long id){ + return Res.ok(mchAppService.findById(id)); + } + + @RequestPath("删除商户应用") + @OperateLog(title = "删除商户应用", businessType = OperateLog.BusinessType.DELETE, saveParam = true) + @Operation(summary = "删除商户应用") + @PostMapping("/delete") + public Result delete(@NotNull(message = "id不可为空") Long id){ + mchAppService.delete(id); + return Res.ok(); + } + +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MerchantController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MerchantController.java new file mode 100644 index 00000000..23afd70d --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MerchantController.java @@ -0,0 +1,51 @@ +package org.dromara.daxpay.server.controller.merchant.info; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.OperateLog; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.service.merchant.service.info.MerchantInfoService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.param.info.MerchantParam; +import org.dromara.daxpay.service.merchant.result.info.MerchantResult; +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.*; + +/** + * 商户配置 + * @author xxm + * @since 2024/6/25 + */ +@Validated +@Tag(name = "商户信息") +@ClientCode(DaxPayCode.Client.MERCHANT) +@RestController +@RequestMapping("/merchant") +@RequestGroup(groupCode = "MerchantInfo", groupName = "商户信息", moduleCode = "merchant", moduleName = "(DaxPay)商户管理") +@RequiredArgsConstructor +public class MerchantController { + private final MerchantInfoService merchantInfoService; + + @RequestPath("获取商户信息") + @Operation(summary = "获取商户信息") + @GetMapping("/get") + public Result getMerchant(){ + return Res.ok(merchantInfoService.getMerchant()); + } + + @RequestPath("修改商户信息") + @Operation(summary = "修改商户信息") + @OperateLog(title = "修改商户信息", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + @PostMapping("/update") + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) MerchantParam param){ + merchantInfoService.update(param); + return Res.ok(); + } + +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MerchantUserController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MerchantUserController.java new file mode 100644 index 00000000..4b637c14 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/info/MerchantUserController.java @@ -0,0 +1,125 @@ +package org.dromara.daxpay.server.controller.merchant.info; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.OperateLog; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.validation.ValidationGroup; +import cn.bootx.platform.iam.param.user.RestartPwdBatchParam; +import cn.bootx.platform.iam.param.user.RestartPwdParam; +import cn.bootx.platform.iam.param.user.UserInfoParam; +import cn.bootx.platform.iam.result.user.UserInfoResult; +import org.dromara.daxpay.service.merchant.param.info.MerchantUserQuery; +import org.dromara.daxpay.service.merchant.result.info.MerchantUserResult; +import org.dromara.daxpay.service.merchant.service.info.MerchantUserService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.core.trans.anno.TransMethodResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 商户用户管理 + * @author xxm + * @since 2024/8/23 + */ +@ClientCode({DaxPayCode.Client.ADMIN}) +@Tag(name = "商户用户管理") +@RestController +@RequestGroup(groupCode = "MerchantUser", groupName = "商户用户管理", moduleCode = "merchant") +@RequestMapping("/merchant/user") +@RequiredArgsConstructor +public class MerchantUserController { + + private final MerchantUserService merchantUserService; + + @TransMethodResult + @RequestPath("分页") + @Operation(summary = "分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, MerchantUserQuery query) { + return Res.ok(merchantUserService.page(pageParam, query)); + } + + + @RequestPath("根据用户id查询用户 ") + @Operation(summary = "根据用户id查询用户") + @GetMapping("/findById") + public Result findById(@NotNull(message = "主键不可为空") Long id) { + return Res.ok(merchantUserService.findById(id)); + } + + @RequestPath("修改用户") + @Operation(summary = "修改用户") + @PostMapping("/update") + @OperateLog(title = "修改用户", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) + public Result update(@RequestBody @Validated(ValidationGroup.edit.class) UserInfoParam userInfoParam) { + merchantUserService.update(userInfoParam); + return Res.ok(); + } + + @RequestPath("重置密码") + @Operation(summary = "重置密码") + @PostMapping("/restartPassword") + @OperateLog(title = "重置密码", businessType = OperateLog.BusinessType.UPDATE) + public Result restartPassword(@RequestBody @Validated RestartPwdParam param) { + merchantUserService.restartPassword(param.getUserId(), param.getNewPassword()); + return Res.ok(); + } + + @RequestPath("批量重置密码") + @Operation(summary = "批量重置密码") + @PostMapping("/restartPasswordBatch") + @OperateLog(title = "批量重置密码", businessType = OperateLog.BusinessType.UPDATE) + public Result restartPasswordBatch(@RequestBody @Validated RestartPwdBatchParam param) { + merchantUserService.restartPasswordBatch(param.getUserIds(), param.getNewPassword()); + return Res.ok(); + } + + @RequestPath("封禁用户") + @Operation(summary = "封禁用户") + @PostMapping("/ban") + @OperateLog(title = "封禁用户", businessType = OperateLog.BusinessType.GRANT, saveParam = true) + public Result ban(@NotNull(message = "用户不可为空") Long userId) { + merchantUserService.ban(userId); + return Res.ok(); + } + + @RequestPath("批量封禁用户") + @Operation(summary = "批量封禁用户") + @PostMapping("/banBatch") + @OperateLog(title = "批量封禁用户", businessType = OperateLog.BusinessType.GRANT, saveParam = true) + public Result banBatch(@RequestBody @NotEmpty(message = "用户集合不可为空") List userIds) { + merchantUserService.banBatch(userIds); + return Res.ok(); + } + + @RequestPath("解锁用户") + @Operation(summary = "解锁用户") + @PostMapping("/unlock") + @OperateLog(title = "解锁用户", businessType = OperateLog.BusinessType.GRANT, saveParam = true) + public Result unlock(@NotNull(message = "用户不可为空") Long userId) { + merchantUserService.unlock(userId); + return Res.ok(); + } + + @RequestPath("批量解锁用户") + @Operation(summary = "批量解锁用户") + @PostMapping("/unlockBatch") + @OperateLog(title = "批量解锁用户", businessType = OperateLog.BusinessType.GRANT, saveParam = true) + public Result unlockBatch(@RequestBody @NotEmpty(message = "用户集合不可为空") List userIds) { + merchantUserService.unlockBatch(userIds); + return Res.ok(); + } + +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/IndexTradeReportController.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/report/IndexTradeReportMerchantController.java similarity index 67% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/IndexTradeReportController.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/report/IndexTradeReportMerchantController.java index 22fd67bc..21c605f8 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/IndexTradeReportController.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/controller/merchant/report/IndexTradeReportMerchantController.java @@ -1,12 +1,15 @@ -package org.dromara.daxpay.controller.common; +package org.dromara.daxpay.server.controller.merchant.report; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.report.TradeReportQuery; -import org.dromara.daxpay.service.result.report.TradeReportResult; -import org.dromara.daxpay.service.service.report.IndexTradeReportService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.report.TradeReportQuery; +import org.dromara.daxpay.service.pay.result.report.TradeReportResult; +import org.dromara.daxpay.service.pay.result.report.TradeStatisticsReport; +import org.dromara.daxpay.service.pay.service.report.IndexTradeReportService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -23,12 +26,13 @@ import java.util.List; * @since 2024/11/17 */ @Validated -@Tag(name = "运营平台首页交易报表") -@RequestGroup(groupCode = "IndexTradeReport", groupName = "首页交易报表", moduleCode = "report", moduleName = "(DaxPay)首页报表") +@Tag(name = "商户平台交易报表") +@RequestGroup(groupCode = "IndexTradeReport", groupName = "商户平台交易报表", moduleCode = "report",moduleName = "(DaxPay)统计报表") +@ClientCode(DaxPayCode.Client.MERCHANT) @RestController -@RequestMapping("/report/index") +@RequestMapping("/merchant/report/index") @RequiredArgsConstructor -public class IndexTradeReportController { +public class IndexTradeReportMerchantController { private final IndexTradeReportService tradeReportService; @@ -38,7 +42,6 @@ public class IndexTradeReportController { public Result pryTradeReport(TradeReportQuery query){ return Res.ok(tradeReportService.pryTradeReport(query)); } - @RequestPath("退款交易信息统计") @Operation(summary = "退款交易信息统计") @GetMapping("/refund") @@ -67,4 +70,10 @@ public class IndexTradeReportController { return Res.ok(tradeReportService.payMethodReport(query)); } + @RequestPath("交易统计报表") + @Operation(summary = "交易统计报表") + @GetMapping("/tradeStatisticsReport") + public Result> tradeStatisticsReport(TradeReportQuery query){ + return Res.ok(tradeReportService.tradeStatistics(query)); + } } diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/enums/UserRoleEnum.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/enums/UserRoleEnum.java new file mode 100644 index 00000000..9123cbd1 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/enums/UserRoleEnum.java @@ -0,0 +1,19 @@ +package org.dromara.daxpay.server.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 商户角色枚举 + * @author xxm + * @since 2025/1/4 + */ +@Getter +@AllArgsConstructor +public enum UserRoleEnum { + MERCHANT_ROLE("merchant_admin","商户管理员"), + ; + + private final String code; + private final String name; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/MerchantNoticeEventService.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/event/MerchantNoticeEventService.java similarity index 65% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/MerchantNoticeEventService.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/event/MerchantNoticeEventService.java index 8acbf1c3..91622886 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/MerchantNoticeEventService.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/event/MerchantNoticeEventService.java @@ -1,17 +1,17 @@ -package org.dromara.daxpay.service.event; +package org.dromara.daxpay.server.event; import cn.bootx.platform.starter.redis.delay.annotation.DelayEventListener; import cn.bootx.platform.starter.redis.delay.annotation.DelayJobEvent; -import org.dromara.daxpay.core.context.MchAppLocal; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.notice.callback.MerchantCallbackTaskManager; -import org.dromara.daxpay.service.dao.notice.notify.MerchantNotifyTaskManager; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.config.MerchantNotifyConfigService; -import org.dromara.daxpay.service.service.notice.callback.MerchantCallbackSendService; -import org.dromara.daxpay.service.service.notice.notify.MerchantNotifySendService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.notice.callback.MerchantCallbackTaskManager; +import org.dromara.daxpay.service.pay.dao.notice.notify.MerchantNotifyTaskManager; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.merchant.service.config.MerchantNotifyConfigService; +import org.dromara.daxpay.service.pay.service.notice.callback.MerchantCallbackSendService; +import org.dromara.daxpay.service.pay.service.notice.notify.MerchantNotifySendService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -46,12 +46,12 @@ public class MerchantNoticeEventService { var taskOpt = merchantNotifyTaskManager.findByIdNotTenant(taskId); if (taskOpt.isPresent()){ var task = taskOpt.get(); - paymentAssistService.initMchAndApp(task.getAppId()); - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); + paymentAssistService.initMchAndApp(task.getMchNo(), task.getAppId()); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); // 判断通知方式是否为http并且订阅了该类型的通知 - boolean subscribe = merchantNotifyConfigService.getSubscribeByAppIdAndType(mchAppInfo.getAppId(), task.getNotifyType()); - if (Objects.equals(mchAppInfo.getNotifyType(), MerchantNotifyTypeEnum.HTTP.getCode()) && subscribe){ - merchantNotifySendService.sendData(task, mchAppInfo.getNotifyUrl(), LocalDateTime.now(), true); + boolean subscribe = merchantNotifyConfigService.getSubscribeByAppIdAndType(reqInfo.getAppId(), task.getNotifyType()); + if (Objects.equals(reqInfo.getNotifyType(), MerchantNotifyTypeEnum.HTTP.getCode()) && subscribe){ + merchantNotifySendService.sendData(task, reqInfo.getNotifyUrl(), LocalDateTime.now(), true); } else { log.info("商户消息通知未开启,任务ID:{}",taskId); } @@ -71,7 +71,7 @@ public class MerchantNoticeEventService { var taskOpt = merchantCallbackTaskManager.findByIdNotTenant(taskId); if (taskOpt.isPresent()){ var task = taskOpt.get(); - paymentAssistService.initMchAndApp(task.getAppId()); + paymentAssistService.initMchAndApp(task.getMchNo(), task.getAppId()); merchantCallbackSendService.sendData(task,true); } else { log.error("商户回调发送任务不存在,任务ID:{}",taskId); diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/event/TradeOrderEventService.java similarity index 72% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/event/TradeOrderEventService.java index 57ae1720..dd58cb16 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/event/TradeOrderEventService.java @@ -1,20 +1,20 @@ -package org.dromara.daxpay.service.event; +package org.dromara.daxpay.server.event; import cn.bootx.platform.starter.redis.delay.annotation.DelayEventListener; import cn.bootx.platform.starter.redis.delay.annotation.DelayJobEvent; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.enums.TransferStatusEnum; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.dao.order.refund.RefundOrderManager; -import org.dromara.daxpay.service.dao.order.transfer.TransferOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.trade.pay.PayCloseService; -import org.dromara.daxpay.service.service.trade.pay.PaySyncService; -import org.dromara.daxpay.service.service.trade.refund.RefundSyncService; -import org.dromara.daxpay.service.service.trade.transfer.TransferSyncService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.dao.order.refund.RefundOrderManager; +import org.dromara.daxpay.service.pay.dao.order.transfer.TransferOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayCloseService; +import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundSyncService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferSyncService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -43,6 +43,7 @@ public class TradeOrderEventService { private final TransferOrderManager transferOrderManager; private final TransferSyncService transferSyncService; + private final PayCloseService payCloseService; /** @@ -55,12 +56,12 @@ public class TradeOrderEventService { PayOrder payOrder = orderOpt.get(); // 不是支付中不需要进行同步 if (payOrder.getStatus().equals(PayStatusEnum.PROGRESS.getCode())) { - paymentAssistService.initMchAndApp(payOrder.getAppId()); + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); paySyncService.syncPayOrder(payOrder); } // 待支付走超时关闭 if (payOrder.getStatus().equals(PayStatusEnum.WAIT.getCode()) ) { - paymentAssistService.initMchAndApp(payOrder.getAppId()); + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); payCloseService.closeOrder(payOrder,false); } } @@ -75,7 +76,7 @@ public class TradeOrderEventService { var order = orderOpt.get(); // 不是退款中不需要进行同步 if (order.getStatus().equals(RefundStatusEnum.PROGRESS.getCode())) { - paymentAssistService.initMchAndApp(order.getAppId()); + paymentAssistService.initMchAndApp(order.getMchNo(), order.getAppId()); refundSyncService.syncRefundOrder(order); } } @@ -91,7 +92,7 @@ public class TradeOrderEventService { var order = orderOpt.get(); // 不是退款中不需要进行同步 if (order.getStatus().equals(TransferStatusEnum.PROGRESS.getCode())) { - paymentAssistService.initMchAndApp(order.getAppId()); + paymentAssistService.initMchAndApp(order.getMchNo(), order.getAppId()); transferSyncService.syncTransferOrder(order); } } diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/filter/MchContextLocalFilter.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/filter/MchContextLocalFilter.java new file mode 100644 index 00000000..110c95d6 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/filter/MchContextLocalFilter.java @@ -0,0 +1,64 @@ +package org.dromara.daxpay.server.filter; + +import cn.bootx.platform.core.entity.UserDetail; +import cn.bootx.platform.iam.service.client.ClientCodeService; +import cn.bootx.platform.starter.auth.util.SecurityUtil; +import org.dromara.daxpay.service.merchant.service.info.MerchantUserService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.web.servlet.filter.OrderedFilter; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.Optional; + +/** + * 商户信息过滤器 + * @author xxm + * @since 2024/7/17 + */ +@Component +@RequiredArgsConstructor +@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) +public class MchContextLocalFilter extends OncePerRequestFilter implements OrderedFilter { + private final MerchantUserService merchantUserService; + private final ClientCodeService clientCodeService; + + /** + * 需要晚于 {@link org.springframework.web.filter.RequestContextFilter} 执行, 否则获取不到登录用户 + * RequestContextFilter 默认加载优先级 为 - 150 + */ + @Override + public int getOrder() { + return 0; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + try { + // 只处理商户端 + String clientCode = clientCodeService.getClientCode(); + if (!DaxPayCode.Client.MERCHANT.equals(clientCode)) { + return; + } + // 是否登录 + Optional currentUser = SecurityUtil.getCurrentUser(); + currentUser.ifPresent(userDetail -> { + // 登录后获取关联商户号 + String mchNo = merchantUserService.findByUserId(userDetail.getId()); + MchContextLocal.setMchNo(mchNo); + }); + + } finally { + filterChain.doFilter(request,response); + MchContextLocal.clearMchNo(); + } + } +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/ClientRouterCheck.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/ClientRouterCheck.java new file mode 100644 index 00000000..f361f537 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/ClientRouterCheck.java @@ -0,0 +1,57 @@ +package org.dromara.daxpay.server.handler; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.iam.service.client.ClientCodeService; +import cn.bootx.platform.starter.auth.exception.RouterCheckException; +import cn.bootx.platform.starter.auth.service.RouterCheck; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; + +import java.util.Objects; + +/** + * 终端路径过滤 + * @author xxm + * @since 2025/1/31 + */ +@Component +@RequiredArgsConstructor +public class ClientRouterCheck implements RouterCheck { + private final ClientCodeService clientCodeService; + + @Override + public int sortNo() { + return Integer.MIN_VALUE; + } + + @Override + public boolean check(Object handler) { + // 获取当前终端编码 + String clientCode = clientCodeService.getClientCode(); + // 判断当前编码是否包含在白名单中 + if (handler instanceof HandlerMethod handlerMethod) { + // controller上是否加了跳过鉴权注解 + var clientCodeEnum = handlerMethod.getBeanType().getAnnotation(ClientCode.class); + if (Objects.isNull(clientCodeEnum)) { + // 方法上上是否加了跳过鉴权注解 + clientCodeEnum = handlerMethod.getMethodAnnotation(ClientCode.class); + } + else { + // controller和方法上都加了跳过鉴权注解,以方法上为准 + var annotation = handlerMethod.getMethodAnnotation(ClientCode.class); + if (Objects.nonNull(annotation)) { + clientCodeEnum = annotation; + } + } + // 判断是否包含了当前终端编码 + if (Objects.nonNull(clientCodeEnum)){ + if (!CollUtil.toList(clientCodeEnum.value()).contains(clientCode)){ + throw new RouterCheckException("该终端没有权限访问该路径"); + } + } + } + return false; + } +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/CustomTenantLineHandler.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/CustomTenantLineHandler.java new file mode 100644 index 00000000..b9756ea3 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/CustomTenantLineHandler.java @@ -0,0 +1,95 @@ +package org.dromara.daxpay.server.handler; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.iam.service.client.ClientCodeService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.pay.common.entity.MchAppEditEntity; +import org.dromara.daxpay.service.pay.common.entity.MchAppRecordEntity; +import cn.hutool.core.util.ClassUtil; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; +import lombok.RequiredArgsConstructor; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.schema.Column; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Stream; + +/** + * 租户拦截处理器, 处理代理商和商户数据隔离 + * @author xxm + * @since 2024/6/25 + */ +@Component +@RequiredArgsConstructor +public class CustomTenantLineHandler implements TenantLineHandler { + private final ClientCodeService clientCodeService; + + /** + * 获取租户ID + * 商户返回商户号 + */ + @Override + public Expression getTenantId() { + // 获取当前用户的商户 + String mchNo = Optional.ofNullable(MchContextLocal.getMchNo()).orElse(""); + // 获取商户 + return new StringValue(mchNo); + } + + /** + * 租户字段 + * 商户返回商户号 + * 代理商返回代理商号 + */ + @Override + public String getTenantIdColumn() { + // 商户端和支付网关以及其他都使用商户号 + return "mch_no"; + } + + /** + * 是否忽略租户拦截, 运营端不需要进行数据隔离数据隔离, 其他端各自进行处理 + */ + @Override + public boolean ignoreTable(String tableName) { + // 运营端不需要进行数据隔离数据隔离 + String clientCode = clientCodeService.getClientCode(); + if (Objects.equals(clientCode, DaxPayCode.Client.ADMIN)){ + return true; + } + // 商户端和网关端以及其他端都是用商户隔离机制 + return ignoreTableByMch(tableName); + } + + /** + * 忽略插入租户字段逻辑 + */ + @Override + public boolean ignoreInsert(List columns, String tenantIdColumn) { + // 如果租户字段已经存在不进行处理 + return TenantLineHandler.super.ignoreInsert(columns, tenantIdColumn); + } + + + /** + * 商户权限控制 + */ + public boolean ignoreTableByMch(String tableName){ + // 读取注解, 判断是否启用商户数据隔离 + TableInfo tableInfo = MpUtil.getTableInfo(tableName); + if (tableInfo == null){ + return true; + } + // 如果为 MchAppBaseEntity、MchAppEditEntity、MchAppRecordEntity 子类, 不可以忽略过滤 + boolean anyMatch = Stream.of(MchAppBaseEntity.class, MchAppEditEntity.class, MchAppRecordEntity.class) + .anyMatch(entityClass -> ClassUtil.isAssignable(entityClass, tableInfo.getEntityType())); + return !anyMatch; + } +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/MchTenantInterceptorConfiguration.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/MchTenantInterceptorConfiguration.java new file mode 100644 index 00000000..0e631808 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/handler/MchTenantInterceptorConfiguration.java @@ -0,0 +1,29 @@ +package org.dromara.daxpay.server.handler; + +import cn.bootx.platform.common.mybatisplus.interceptor.MpInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 商户数据隔离插件 + * @author xxm + * @since 2024/6/25 + */ +@Configuration +@RequiredArgsConstructor +public class MchTenantInterceptorConfiguration { + + private final CustomTenantLineHandler customTenantHandler; + + /** + * 租户拦截器 + */ + @Bean + public MpInterceptor MchTenantInterceptor() { + TenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor(); + tenantInterceptor.setTenantLineHandler(customTenantHandler); + return new MpInterceptor(tenantInterceptor, -999); + } +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/interceptor/DataScopeInterceptorConfiguration.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/interceptor/DataScopeInterceptorConfiguration.java new file mode 100644 index 00000000..d2cee20d --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/interceptor/DataScopeInterceptorConfiguration.java @@ -0,0 +1,23 @@ +package org.dromara.daxpay.server.interceptor; + +import cn.bootx.platform.common.mybatisplus.interceptor.MpInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * + * @author xxm + * @since 2025/2/2 + */ +@Configuration +public class DataScopeInterceptorConfiguration { + + /** + * 数据范围权限插件 + */ + @Bean + public MpInterceptor dataPermInterceptorMp(MchDataScopeHandler dataScopeInterceptor) { + return new MpInterceptor(new DataPermissionInterceptor(dataScopeInterceptor),-99); + } +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/interceptor/MchDataScopeHandler.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/interceptor/MchDataScopeHandler.java new file mode 100644 index 00000000..56d305c9 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/interceptor/MchDataScopeHandler.java @@ -0,0 +1,33 @@ +package org.dromara.daxpay.server.interceptor; + +import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.schema.Table; +import org.springframework.stereotype.Service; + +/** + * 支持多表的数据权限处理器, 每个表都会追加条件 + * @author xxm + * @since 2025/2/2 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MchDataScopeHandler implements MultiDataPermissionHandler { + + /** + * 语句拼装 + * @param table 所执行的数据库表信息,可以通过此参数获取表名和表别名 + * @param where 原有的 where 条件信息 + * @param mappedStatementId Mybatis MappedStatement Id 根据该参数可以判断具体执行方法 + * @return 追加的 where 条件信息 + */ + @Override + public Expression getSqlSegment(Table table, Expression where, String mappedStatementId) { + return null; + // AND (hello = 1) 格式的SQL语句 +// return new ParenthesedExpressionList<>(new EqualsTo(new Column("1"), new LongValue(1L))); + } +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/admin/MerchantAdminService.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/admin/MerchantAdminService.java new file mode 100644 index 00000000..70f005e8 --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/admin/MerchantAdminService.java @@ -0,0 +1,182 @@ +package org.dromara.daxpay.server.service.admin; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.BizException; +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.exception.ValidationFailedException; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.iam.dao.role.RoleManager; +import cn.bootx.platform.iam.entity.role.Role; +import cn.bootx.platform.iam.entity.user.UserInfo; +import cn.bootx.platform.iam.param.user.UserInfoParam; +import cn.bootx.platform.iam.service.client.ClientCodeService; +import cn.bootx.platform.iam.service.upms.UserRoleService; +import cn.bootx.platform.iam.service.user.UserAdminService; +import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; +import org.dromara.daxpay.core.enums.MerchantStatusEnum; +import org.dromara.daxpay.core.enums.SignTypeEnum; +import org.dromara.daxpay.core.exception.ConfigNotExistException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.server.enums.UserRoleEnum; +import org.dromara.daxpay.service.merchant.convert.info.MerchantConvert; +import org.dromara.daxpay.service.merchant.dao.app.MchAppManager; +import org.dromara.daxpay.service.merchant.dao.info.MerchantManager; +import org.dromara.daxpay.service.merchant.dao.info.MerchantUserManager; +import org.dromara.daxpay.service.merchant.entity.app.MchApp; +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import org.dromara.daxpay.service.merchant.entity.info.MerchantUser; +import org.dromara.daxpay.service.merchant.param.info.MerchantCreateParam; +import org.dromara.daxpay.service.merchant.param.info.MerchantParam; +import org.dromara.daxpay.service.merchant.param.info.MerchantQuery; +import org.dromara.daxpay.service.merchant.result.info.MerchantResult; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.util.RandomUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Collections; + +/** + * 商户服务类 + * @author xxm + * @since 2024/5/27 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MerchantAdminService { + private final MerchantManager merchantManager; + private final MchAppManager mchAppManager; + private final UserAdminService userAdminService; + private final RoleManager roleManager; + private final UserRoleService userRoleService; + private final MerchantUserManager merchantUserManager; + private final ClientCodeService clientCodeService; + + /** + * 添加商户 + */ + @Transactional(rollbackFor = Exception.class) + public void add(MerchantCreateParam param) { + var merchant = MerchantConvert.CONVERT.toEntity(param); + merchant.setMchNo(this.getMchNo()); + merchant.setStatus(MerchantStatusEnum.ENABLE.getCode()); + // 创建商户管理员 + this.createMerchantAdmin(param, merchant); + merchantManager.save(merchant); + // 是否创建创建默认应用 + if (param.getCreateDefaultApp()){ + MchApp mchApp = new MchApp() + .setAppName("默认应用") + .setLimitAmount(BigDecimal.valueOf(2000)) + .setReqTimeout(false) + .setReqTimeoutSecond(30) + .setOrderTimeout(30) + .setSignType(SignTypeEnum.HMAC_SHA256.getCode()) + .setSignSecret(RandomUtil.randomString(32)) + .setReqSign(true) + .setNotifyType(MerchantNotifyTypeEnum.NONE.getCode()) + .setStatus(MerchantStatusEnum.ENABLE.getCode()); + mchApp.setAppId(this.generateAppId()) + .setMchNo(merchant.getMchNo()); + mchAppManager.save(mchApp); + } + } + + /** + * 修改 + */ + public void update(MerchantParam param) { + Merchant merchant = merchantManager.findById(param.getId()).orElseThrow(DataNotExistException::new); + BeanUtil.copyProperties(param, merchant, CopyOptions.create().ignoreNullValue()); + merchantManager.updateById(merchant); + } + + /** + * 分页 + */ + public PageResult page(PageParam pageParam, MerchantQuery query) { + return MpUtil.toPageResult(merchantManager.page(pageParam,query)); + } + + /** + * 获取单条 + */ + public MerchantResult findById(Long id) { + return merchantManager.findById(id).map(Merchant::toResult).orElseThrow(DataNotExistException::new); + } + + /** + * 删除 + */ + public void delete(Long id) { + if (true){ + throw new OperationFailException("商户不允许删除"); + } + + Merchant merchant = merchantManager.findById(id).orElseThrow(DataNotExistException::new); + // 创建管理员后不可以被删除 + if (merchant.isAdministrator()){ + throw new ValidationFailedException("已存在关联商户管理员用户, 不允许删除"); + } + // 判断是否存在应用APP, 存在不允许删除 + if (mchAppManager.existByMchNo(merchant.getMchNo())){ + throw new ValidationFailedException("商户下存在应用, 不允许删除"); + } + merchantManager.deleteById(id); + } + + /** + * 创建商户管理员 + */ + private void createMerchantAdmin(MerchantCreateParam param, Merchant merchant){ + // 创建用户 + UserInfoParam userInfoParam = new UserInfoParam(); + BeanUtil.copyProperties(param, userInfoParam); + UserInfo userInfo = userAdminService.add(userInfoParam); + // 查询普通商户管理员角色 + Role role = roleManager.findByCode(UserRoleEnum.MERCHANT_ROLE.getCode()) + .orElseThrow(() -> new ConfigNotExistException("商户管理员角色不存在, 请检查")); + // 分配角色 + userRoleService.saveAssign(userInfo.getId(), Collections.singletonList(role.getId()),true); + // 创建商户绑定关系 + merchantUserManager.save(new MerchantUser(userInfo.getId(), merchant.getMchNo(),true)); + // 商户信息更新 + merchant.setAdministrator(true) + .setAdminUserId(userInfo.getId()); + merchantManager.updateById(merchant); + } + + /** + * 生成商户号 + */ + private String getMchNo(){ + String mchNo = "M" + System.currentTimeMillis(); + for (int i = 0; i < 10; i++){ + if (!merchantManager.existedByField(Merchant::getMchNo, mchNo)){ + return mchNo; + } + mchNo = "M" + System.currentTimeMillis(); + } + throw new BizException("商户号生成失败"); + } + + /** + * 生成应用号 + */ + private String generateAppId() { + String appId = "A"+RandomUtil.randomNumbers(16); + for (int i = 0; i < 10; i++){ + if (!mchAppManager.existsByAppId(appId)){ + return appId; + } + appId = "A"+ RandomUtil.randomNumbers(16); + } + throw new BizException("应用号生成失败"); + } +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/ClientCodeServiceImpl.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/common/ClientCodeServiceImpl.java similarity index 65% rename from daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/ClientCodeServiceImpl.java rename to daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/common/ClientCodeServiceImpl.java index acc3ed4e..9bb9a116 100644 --- a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/ClientCodeServiceImpl.java +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/common/ClientCodeServiceImpl.java @@ -1,9 +1,8 @@ -package org.dromara.daxpay.server.service; +package org.dromara.daxpay.server.service.common; import cn.bootx.platform.iam.service.client.ClientCodeService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.service.code.DaxPayCode; import org.springframework.stereotype.Service; /** @@ -16,8 +15,4 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class ClientCodeServiceImpl implements ClientCodeService { - @Override - public String getClientCode() { - return DaxPayCode.Client.ADMIN; - } } diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/common/PaymentAssistServiceImpl.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/common/PaymentAssistServiceImpl.java new file mode 100644 index 00000000..e144441a --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/service/common/PaymentAssistServiceImpl.java @@ -0,0 +1,122 @@ +package org.dromara.daxpay.server.service.common; + +import cn.bootx.platform.core.exception.ValidationFailedException; +import cn.bootx.platform.iam.service.client.ClientCodeService; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.common.service.config.PlatformConfigService; +import org.dromara.daxpay.service.merchant.cache.MchAppCacheService; +import org.dromara.daxpay.service.merchant.cache.MerchantCacheService; +import org.dromara.daxpay.service.merchant.entity.app.MchApp; +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * 支付网关端交易(支付、退款等各类操作)支持服务接口 + * @author xxm + * @since 2024/12/21 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PaymentAssistServiceImpl implements PaymentAssistService { + + private final ClientCodeService clientCodeService; + + private final PlatformConfigService platformConfigService; + + private final MerchantCacheService merchantCacheService; + + private final MchAppCacheService mchAppCacheService; + + /** + * 初始化商户和应用等相关信息 + * 1. 统一支付相关接口调用时,要进行初始化 + * 2. 接收到回调时,要进行初始化 + * 3. 接收到消息通知时, 要进行初始化 + * 4. 手动发起根据订单记录发起一些操作时, 读取信息进行初始化 + * 5. 针对核心能力进行包装成功能时(收银台), 手动进行初始化 + */ + public void initMchAndApp(String mchNo, String appId) { + // 商户端商户号读取系统, 不允许自行设置 + if (Objects.equals(clientCodeService.getClientCode(), DaxPayCode.Client.MERCHANT)){ + mchNo = MchContextLocal.getMchNo(); + } + // 获取应用信息 + Merchant merchant = merchantCacheService.get(mchNo); + MchApp mchApp = mchAppCacheService.get(appId); + this.initData(merchant, mchApp); + } + + /** + * 初始化商户和应用信息 + * 1. 统一支付相关接口调用时,要进行初始化 + * 2. 接收到回调时,要进行初始化 + * 3. 接收到消息通知时, 要进行初始化 + * 4. 手动发起根据订单记录发起一些操作时, 读取信息进行初始化 + * 5. 针对核心能力进行包装成功能时(收银台), 手动进行初始化 + */ + public void initMchAndApp(String appId) { + // 获取应用信息 + var mchApp = mchAppCacheService.get(appId); + // 商户端商户号读取系统, 不允许自行设置 + if (Objects.equals(clientCodeService.getClientCode(), DaxPayCode.Client.MERCHANT)){ + if (!Objects.equals(mchApp.getMchNo(), MchContextLocal.getMchNo())){ + throw new ValidationFailedException("该商户不拥有该应用"); + } + } + Merchant merchant = merchantCacheService.get(mchApp.getMchNo()); + this.initData(merchant, mchApp); + } + + /** + * 初始化数据, + * 1.商户信息 + * 2.应用信息 + * 3.服务商信息 + * 4.代理商信息 + * 5.平台配置信息 + */ + private void initData(Merchant merchant, MchApp mchApp){ + // 判断是否匹配 + if (!Objects.equals(mchApp.getMchNo(), merchant.getMchNo())){ + throw new ValidationFailedException("商户号和应用号不匹配"); + } + // 初始化支付上下文信息 + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + BeanUtil.copyProperties(mchApp, reqInfo); + + // 商户信息 + reqInfo.setMchName(merchant.getMchName()) + .setMchNo(merchant.getMchNo()) + .setMchStatus(merchant.getStatus()); + + // 平台信息 + var basicConfig = platformConfigService.getBasicConfig(); + var urlConfig = platformConfigService.getUrlConfig(); + reqInfo.setGatewayServiceUrl(urlConfig.getGatewayServiceUrl()) + .setGatewayH5Url(urlConfig.getGatewayH5Url()); + // 支付限额 + if (basicConfig.getSingleLimitAmount() != null){ + // 如果应用为空读取平台配置 + if (reqInfo.getLimitAmount() == null){ + reqInfo.setLimitAmount(basicConfig.getSingleLimitAmount()); + } else { + // 都不为空读取小的 + reqInfo.setLimitAmount(reqInfo.getLimitAmount().min(basicConfig.getSingleLimitAmount())); + } + } + + // 初始化商户租户上下文信息 + MchContextLocal.setMchNo(merchant.getMchNo()); + } + +} diff --git a/daxpay-open-server/src/main/java/org/dromara/daxpay/server/task/OrderSyncTask.java b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/task/OrderSyncTask.java new file mode 100644 index 00000000..4157fc6c --- /dev/null +++ b/daxpay-open-server/src/main/java/org/dromara/daxpay/server/task/OrderSyncTask.java @@ -0,0 +1,308 @@ +package org.dromara.daxpay.server.task; + +import cn.bootx.platform.core.util.DateTimeUtil; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.dao.order.refund.RefundOrderManager; +import org.dromara.daxpay.service.pay.dao.order.transfer.TransferOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayCloseService; +import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundSyncService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferSyncService; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.baomidou.lock.LockInfo; +import com.baomidou.lock.LockTemplate; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.Objects; + +/** + * 交易订单同步定时任务 + * @author xxm + * @since 2024/8/29 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class OrderSyncTask { + + private final PayOrderManager payOrderManager; + private final PaySyncService paySyncService; + private final RefundOrderManager refundOrderManager; + private final RefundSyncService refundSyncService; + private final TransferOrderManager transferOrderManager; + private final TransferSyncService transferSyncService; + private final PaymentAssistService paymentAssistService; + private final PayAssistService payAssistService; + private final PayCloseService payCloseService; + private final LockTemplate lockTemplate; + + /** + * 支付单超时检测 一分钟一次 + */ + @Scheduled(cron = "0 */1 * * * ?") + public void queryExpiredTask(){ + // 加锁 + LockInfo lock = lockTemplate.lock("task:queryExpiredTask",30000,200); + if (Objects.isNull(lock)){ + log.info("检测任务存在锁,其他节点可能在执行中"); + return; + } + try { + // 从数据库查询获取超时的任务对象 + List payOrders = payOrderManager.queryExpiredOrderNotTenant(); + for (PayOrder order : payOrders) { + try { + paymentAssistService.initMchAndApp(order.getMchNo(),order.getAppId()); + if (!List.of(PayStatusEnum.WAIT.getCode(),PayStatusEnum.TIMEOUT.getCode()).contains(order.getStatus())){ + paySyncService.syncPayOrder(order); + } else { + // 判断是超时走关闭订单 + if (Objects.nonNull(order.getExpiredTime()) && DateTimeUtil.ge(LocalDateTime.now(), order.getExpiredTime())) { + payCloseService.closeOrder(order,false); + } + } + } catch (Exception e) { + log.error("超时取消任务异常, ID: {}, 订单号: {}",order.getId(), order.getOrderNo(), e); + // 设置订单任务为失败 + payAssistService.fail(order, e.getMessage()); + } + } + } finally { + lockTemplate.releaseLock(lock); + } + } + + /** + * 10分钟内一分钟一次 + */ + @Scheduled(cron = "0 */1 * * * ?") + public void syncOrderBy10M(){ + // 加锁 + LockInfo lock = lockTemplate.lock("task:syncOrderBy10M",30000,200); + if (Objects.isNull(lock)){ + log.info("检测任务存在锁,其他节点可能在执行中"); + return; + } + try { + // 获取1分钟之前到10分钟之内的时间 + var now = LocalDateTime.now(); + var end = LocalDateTimeUtil.offset(now, -1, ChronoUnit.MINUTES); + var start = LocalDateTimeUtil.offset(now, -10, ChronoUnit.MINUTES); + List orders = payOrderManager.queryExpiredOrderNotTenant(start, end); + this.syncPayOrder(orders); + } finally { + lockTemplate.releaseLock(lock); + } + } + + /** + * 1小时内10分钟一次 + */ + @Scheduled(cron = "0 */10 * * * ?") + public void syncPayOrderBy1H(){ + // 加锁 + LockInfo lock = lockTemplate.lock("task:syncPayOrderBy1H",30000,200); + if (Objects.isNull(lock)){ + log.info("检测任务存在锁,其他节点可能在执行中"); + return; + } + try { + // 获取 10分钟之前到1小时内的时间 + var now = LocalDateTime.now(); + var end = LocalDateTimeUtil.offset(now, -10, ChronoUnit.MINUTES); + var start = LocalDateTimeUtil.offset(now, -1, ChronoUnit.HOURS); + List orders = payOrderManager.queryExpiredOrderNotTenant(start,end); + this.syncPayOrder(orders); + } finally { + lockTemplate.releaseLock(lock); + } + } + + /** + * 1天内1小时一次 + */ + @Scheduled(cron = "0 0 */1 * * ?") + public void syncPayOrderBy1D(){ + // 加锁 + LockInfo lock = lockTemplate.lock("task:syncPayOrderBy1D",30000,200); + if (Objects.isNull(lock)){ + log.info("检测任务存在锁,其他节点可能在执行中"); + return; + } + try { + // 获取 1小时之前到24小时内的时间 + var now = LocalDateTime.now(); + var end = LocalDateTimeUtil.offset(now, -1, ChronoUnit.HOURS); + var start = LocalDateTimeUtil.offset(now, -1, ChronoUnit.DAYS); + List orders = payOrderManager.queryExpiredOrderNotTenant(start,end); + this.syncPayOrder(orders); + } finally { + lockTemplate.releaseLock(lock); + } + } + + /** + * 支付订单同步检测 + * 10分钟内一分钟一次 + * 一小时内10分钟一次 + * 一天内一小时一次 + */ + public void syncPayOrder(List payOrders){ + for (PayOrder order : payOrders) { + try { + paymentAssistService.initMchAndApp(order.getMchNo(),order.getAppId()); + if (!List.of(PayStatusEnum.WAIT.getCode(),PayStatusEnum.TIMEOUT.getCode()).contains(order.getStatus())){ + paySyncService.syncPayOrder(order); + } else { + // 判断是超时走关闭订单 + if (Objects.nonNull(order.getExpiredTime()) && DateTimeUtil.ge(LocalDateTime.now(), order.getExpiredTime())) { + payCloseService.closeOrder(order,false); + } + } + } catch (Exception e) { + log.error("超时取消任务异常, ID: {}, 订单号: {}",order.getId(), order.getOrderNo(), e); + // 设置订单任务为失败 + payAssistService.fail(order, e.getMessage()); + } + } + } + + /** + * 10分钟内一分钟一次 + */ + @Scheduled(cron = "0 */1 * * * ?") + public void refundSyncBy10M(){ + // 加锁 + LockInfo lock = lockTemplate.lock("task:refundSyncBy10M",30000,200); + if (Objects.isNull(lock)){ + log.info("检测任务存在锁,其他节点可能在执行中"); + return; + } + try { + // 获取1分钟之前到10分钟之内的时间 + var now = LocalDateTime.now(); + var end = LocalDateTimeUtil.offset(now, -1, ChronoUnit.MINUTES); + var start = LocalDateTimeUtil.offset(now, -10, ChronoUnit.MINUTES); + List list = refundOrderManager.findAllByProgress(start, end); + this.refundSync(list); + } finally { + lockTemplate.releaseLock(lock); + } + } + + /** + * 一小时内10分钟一次 + */ + @Scheduled(cron = "0 */10 * * * ?") + public void refundSyncBy1H(){ + // 加锁 + LockInfo lock = lockTemplate.lock("task:refundSyncBy1H",30000,200); + if (Objects.isNull(lock)){ + log.info("检测任务存在锁,其他节点可能在执行中"); + return; + } + try { + // 获取 10分钟之前到1小时内的时间 + var now = LocalDateTime.now(); + var end = LocalDateTimeUtil.offset(now, -10, ChronoUnit.MINUTES); + var start = LocalDateTimeUtil.offset(now, -1, ChronoUnit.HOURS); + List list = refundOrderManager.findAllByProgress(start, end); + this.refundSync(list); + } finally { + lockTemplate.releaseLock(lock); + } + } + + /** + * 一天内一小时一次 + */ + @Scheduled(cron = "0 5 */1 * * ?") + public void refundSyncBy1D(){ + // 加锁 + LockInfo lock = lockTemplate.lock("task:refundSyncBy1D",30000,200); + if (Objects.isNull(lock)){ + log.info("检测任务存在锁,其他节点可能在执行中"); + return; + } + try { + // 获取 1小时之前到24小时内的时间 + var now = LocalDateTime.now(); + var end = LocalDateTimeUtil.offset(now, -1, ChronoUnit.HOURS); + var start = LocalDateTimeUtil.offset(now, -1, ChronoUnit.DAYS); + List list = refundOrderManager.findAllByProgress(start, end); + this.refundSync(list); + } finally { + lockTemplate.releaseLock(lock); + } + } + + /** + * 超过一天一天一次 + */ + @Scheduled(cron = "0 0 1 * * ?") + public void refundSyncByAll(){ + // 加锁 + LockInfo lock = lockTemplate.lock("task:refundSyncByAll",30000,200); + if (Objects.isNull(lock)){ + log.info("检测任务存在锁,其他节点可能在执行中"); + return; + } + try { + // 获取 1天之前到1天内的时间 + var now = LocalDateTime.now().plusDays(-1); + List list = refundOrderManager.findAllByBeforeProgress(now); + this.refundSync(list); + } finally { + lockTemplate.releaseLock(lock); + } + } + + /** + * 退款定时同步任务 + * 10分钟内一分钟一次 + * 一小时内10分钟一次 + * 一天内一小时一次 + * 超过一天一天一次 + */ + public void refundSync(List list){ + // 查询退款中的退款订单 + for (RefundOrder refundOrder : list) { + try { + // 调用同步方法 + paymentAssistService.initMchAndApp(refundOrder.getMchNo(),refundOrder.getAppId()); + refundSyncService.syncRefundOrder(refundOrder); + } catch (Exception e) { + log.warn("退款执行同步失败, ID: {}, 退款号: {}",refundOrder.getId(), refundOrder.getRefundNo(), e); + } + } + } + + /** + * 转账订单同步, 一分钟一次, 获取一分钟之前转账中的订单 + */ + @Scheduled(cron = "0 */1 * * * ?") + public void transferSyncTask(){ + List list = transferOrderManager.findAllByProgress(); + for (var transferOrder : list) { + try { + // 调用同步方法 + paymentAssistService.initMchAndApp(transferOrder.getMchNo(),transferOrder.getAppId()); + transferSyncService.syncTransferOrder(transferOrder); + } catch (Exception e) { + log.warn("转账执行同步失败, ID: {}, 转账号: {}",transferOrder.getId(),transferOrder.getTransferNo(), e); + } + } + } +} diff --git a/daxpay-open-server/src/main/resources/application-dev.yml b/daxpay-open-server/src/main/resources/application-dev.yml index cc55d15c..59cab094 100644 --- a/daxpay-open-server/src/main/resources/application-dev.yml +++ b/daxpay-open-server/src/main/resources/application-dev.yml @@ -6,11 +6,21 @@ spring: master: # Postgresql连接 driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://postgresql:5432/dax-pay-single?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true - username: bootx - password: bootx123 + url: jdbc:postgresql://${DB_HOST:postgresql}:${DB_PORT:5432}/dax-pay-dev?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true + username: ${DB_USER:bootx} + password: ${DB_PASSWORD:bootx123} + # MySQL连接 +# driver-class-name: com.mysql.cj.jdbc.Driver +# url: jdbc:mysql://${DB_HOST:mysql}:${DB_PORT:3306}/dax-pay-dev?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&nullCatalogMeansCurrent=true +# username: ${DB_USER:root} +# password: ${DB_PASSWORD:bootx123} hikari: - keepalive-time: 300000 + minimumIdle: 5 # 最小连接数 + maximumPoolSize: 50 # 最大连接数 + leak-detection-threshold: 5000 # 检测连接泄漏的时间阈值(毫秒) + connection-timeout: 30000 # 获取连接超时时间(毫秒) + idle-timeout: 600000 # 空闲连接超时时间(毫秒) + max-lifetime: 1800000 # 连接最大存活时间(毫秒) data: redis: host: redis @@ -68,26 +78,26 @@ bootx-platform: - '/css/**' - '/error' - '/favicon.ico' +# 支付系统配置 dax-pay: + # 环境标识 env: DEV_ + # 通常为两位内 机器码, 用于区分不同机器生成的流水号 machine-no: 70 dromara: - # 注意, 不要设置 domain 访问路径, 自行进行拼接访问路径, 来保证可迁移性 x-file-storage: - default-platform: local - # 使用Nginx映射到存储路径, 然后将nginx的地址设置到 bootx-platform.starter.file-upload.file-server-url参数 - local-plus: - - platform: local - enable-storage: true - base-path: /file/ # 基础路径 - storage-path: D:/data/files # 存储路径 - # 将 minio访问地址+桶名称 进行组合, 然后设置到 bootx-platform.starter.file-upload.file-server-url - # 例如 minio地址 http://127.0.0.1:9001 桶名称 daxpay, 拼接后的地址为 http://127.0.0.1:9001/daxpay/ - minio: - - platform: minio - enable-storage: true - access-key: yDAArSoyQAligC2IGf7C - secret-key: vDgpt5R4kR2UCapMzx32Rb6qZegok21dRsU6XJ1j - end-point: http://127.0.0.1:9002 # minio访问地址 - bucket-name: daxpay # 存储桶名称 - base-path: /file/ # 基础存储路径 + default-platform: amazon-s3 + # 文件存储都是用S3协议方式存储 + amazon-s3: + - platform: amazon-s3 # 存储平台标识 + enable-storage: true # 启用存储 + access-key: ${OSS_SECRET_ID:lwnS2DEQzveX3fIpRJBP} + secret-key: ${OSS_SECRET_KEY:LcBdOJzqD57wSXK9hxGlrnCgmojNpWET4I2yaekf} + end-point: ${OSS_DOMAIN:http://192.168.1.229:9000} #文件存储服务地址, 不要添加/后缀, + bucket-name: ${OSS_BUKET:daxpay} # 桶名称,不要添加/后缀 + base-path: file/ # 基础路径, 不要添加/前缀, 但需要添加/后缀 + region: ${OSS_REGION:''} + attr: + # 开启路径样式访问, 不配置默认为二级域名方式 + forcePathStyle: true + diff --git a/daxpay-open-server/src/main/resources/application-prod.yml b/daxpay-open-server/src/main/resources/application-prod.yml new file mode 100644 index 00000000..41fd0fc1 --- /dev/null +++ b/daxpay-open-server/src/main/resources/application-prod.yml @@ -0,0 +1,75 @@ +spring: + datasource: + dynamic: + primary: master + datasource: + master: + # Postgresql连接 + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://127.0.0.1:5432/dax-pay-plus?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true + username: postgresql + password: postgresql + hikari: + minimumIdle: 5 # 最小连接数 + maximumPoolSize: 50 # 最大连接数 + leak-detection-threshold: 5000 # 检测连接泄漏的时间阈值(毫秒) + connection-timeout: 30000 # 获取连接超时时间(毫秒) + idle-timeout: 600000 # 空闲连接超时时间(毫秒) + max-lifetime: 1800000 # 连接最大存活时间(毫秒) + data: + redis: + host: 127.0.0.1 + port: 6379 + database: 13 + password: bootx123 + lettuce: + pool: + max-wait: 1000ms +# 开发时显示debug日志 +logging: + level: + cn.bootx.**: info + cn.daxpay.**: info +# swagger 配置 +knife4j: + # 是否开启Knife4j增强模式 + enable: true + # 是否生产环境 + production: true +# 基础脚手架配置 +bootx-platform: + starter: + auth: + # 开启超级管理员 + enable-admin: false + # 用户管理列表中是否显示超级管理员用户 + admin-in-list: false + ignore-urls: + - '/actuator/**' + - '/token/**' + - '/ws/**' + - '/front/**' + - '/error' + - '/favicon.ico' +# 支付系统配置 +dax-pay: + # 环境标识 + env: DAX + # 通常为两位内 机器码, 用于区分不同机器生成的流水号 + machine-no: 70 +dromara: + # 注意, 不要设置 domain 访问路径, 自行进行拼接访问路径, 来保证可迁移性 + x-file-storage: + default-platform: amazon-s3 + # 文件存储都是用S3协议方式存储 + amazon-s3: + - platform: amazon-s3 # 存储平台标识 + enable-storage: true # 启用存储 + access-key: test + secret-key: test + end-point: https://files.daxpay.com # 文件存储服务地址 + bucket-name: daxpay # 桶名称,不要添加/后缀, + base-path: file/ # 基础路径, 不要添加/前缀, 但需要添加/后缀 + attr: + # 开启路径样式访问, 不配置默认为二级域名方式 + forcePathStyle: true diff --git a/daxpay-open-server/src/main/resources/application.yml b/daxpay-open-server/src/main/resources/application.yml index 743d1762..0f7bfdff 100644 --- a/daxpay-open-server/src/main/resources/application.yml +++ b/daxpay-open-server/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 9999 spring: application: - name: dax-pay-admin + name: dax-pay profiles: active: dev task: @@ -45,3 +45,5 @@ bootx-platform: deploy-mode: fusion client-codes: - dax-pay-admin + - dax-pay-merchant + - dax-pay-gateway diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocConfigController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocConfigController.java deleted file mode 100644 index aac78d97..00000000 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocConfigController.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.dromara.daxpay.controller.allocation; - -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.service.param.allocation.AllocConfigParam; -import org.dromara.daxpay.service.result.allocation.AllocConfigResult; -import org.dromara.daxpay.service.service.allocation.AllocConfigService; -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.*; - -/** - * 分账配置 - * @author xxm - * @since 2024/12/9 - */ -@Validated -@Tag(name = "分账配置") -@RestController -@RequestGroup(groupCode = "AllocConfig", groupName = "分账配置", moduleCode = "Alloc", moduleName = "(DaxPay)分账管理" ) -@RequestMapping("/allocation/config") -@RequiredArgsConstructor -public class AllocConfigController { - private final AllocConfigService allocConfigService; - - @RequestPath("保存") - @Operation(summary = "修改") - @PostMapping("/save") - public Result add(@Validated(ValidationGroup.add.class) @RequestBody AllocConfigParam param) { - allocConfigService.save(param); - return Res.ok(); - } - - @RequestPath("修改") - @Operation(summary = "修改") - @PostMapping("/update") - public Result update(@Validated(ValidationGroup.edit.class) @RequestBody AllocConfigParam param) { - allocConfigService.update(param); - return Res.ok(); - } - - @RequestPath("根据应用ID查询详情") - @Operation(summary = "根据应用ID查询详情") - @GetMapping("/findByAppId") - public Result findByAppId(@NotBlank(message = "应用ID不能为空") String appId) { - return Res.ok(allocConfigService.findByAppId(appId)); - } -} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocGroupController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocGroupController.java deleted file mode 100644 index 488dfd8b..00000000 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocGroupController.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.dromara.daxpay.controller.allocation; - -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.util.ValidationUtil; -import cn.bootx.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.service.param.allocation.group.AllocGroupBindParam; -import org.dromara.daxpay.service.param.allocation.group.AllocGroupParam; -import org.dromara.daxpay.service.param.allocation.group.AllocGroupQuery; -import org.dromara.daxpay.service.param.allocation.group.AllocGroupUnbindParam; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupVo; -import org.dromara.daxpay.service.service.allocation.receiver.AllocGroupService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -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.*; - -import java.math.BigDecimal; -import java.util.List; - -/** - * 分账组 - * @author xxm - * @since 2024/4/2 - */ -@Validated -@Tag(name = "分账组") -@RestController -@RequestGroup(groupCode = "AllocGroup", groupName = "分账组", moduleCode = "Alloc") -@RequestMapping("/allocation/group") -@RequiredArgsConstructor -public class AllocGroupController { - private final AllocGroupService allocGroupService; - - @RequestPath("分页") - @Operation(summary = "分页") - @GetMapping("/page") - public Result> page(PageParam pageParam, AllocGroupQuery query){ - return Res.ok(allocGroupService.page(pageParam,query)); - } - - @RequestPath("查询详情") - @Operation(summary = "查询详情") - @GetMapping("/findById") - public Result findById(@NotNull(message = "主键不可为空") Long id){ - return Res.ok(allocGroupService.findById(id)); - } - - @RequestPath("查询分账接收方信息") - @Operation(summary = "查询分账接收方信息") - @GetMapping("/findReceiversByGroups") - public Result> findReceiversByGroups(@NotNull(message = "主键不可为空") @Parameter(description = "分组ID") Long groupId){ - return Res.ok(allocGroupService.findReceiversByGroups(groupId)); - } - - @RequestPath("添加") - @Operation(summary = "创建") - @PostMapping("/create") - public Result create(@RequestBody @Validated(ValidationGroup.add.class) AllocGroupParam param){ - allocGroupService.create(param); - return Res.ok(); - } - - @RequestPath("修改") - @Operation(summary = "修改") - @PostMapping("/update") - public Result update(@RequestBody @Validated(ValidationGroup.edit.class) AllocGroupParam param){ - allocGroupService.update(param); - return Res.ok(); - } - - @RequestPath("删除") - @Operation(summary = "删除") - @PostMapping("/delete") - public Result delete(@NotNull(message = "主键不可为空") Long id){ - allocGroupService.delete(id); - return Res.ok(); - } - - @RequestPath("批量绑定接收者") - @Operation(summary = "批量绑定接收者") - @PostMapping("/bindReceivers") - public Result bindReceivers(@RequestBody @Validated AllocGroupBindParam param){ - ValidationUtil.validateParam(param); - allocGroupService.bindReceivers(param); - return Res.ok(); - } - - @RequestPath("批量取消绑定接收者") - @Operation(summary = "批量取消绑定接收者") - @PostMapping("/unbindReceivers") - public Result unbindReceivers(@RequestBody @Validated AllocGroupUnbindParam param){ - allocGroupService.unbindReceivers(param); - return Res.ok(); - } - - @RequestPath("取消绑定接收者") - @Operation(summary = "取消绑定接收者") - @PostMapping("/unbindReceiver") - public Result unbindReceiver(@NotNull(message = "接收者ID不可为空") Long receiverId){ - allocGroupService.unbindReceiver(receiverId); - return Res.ok(); - } - - @RequestPath("修改分账比例") - @Operation(summary = "修改分账比例") - @PostMapping("/updateRate") - public Result updateRate( - @NotNull(message = "接收者ID不可为空") @Parameter(description = "接收者ID") Long receiverId, - @NotNull(message = "分账比例不可为空") @Parameter(description = "分账比例") BigDecimal rate){ - allocGroupService.updateRate(receiverId,rate); - return Res.ok(); - } - - @RequestPath("设置默认分账组") - @Operation(summary = "设置默认分账组") - @PostMapping("/setDefault") - public Result setDefault(@NotNull(message = "主键不可为空") Long id){ - allocGroupService.setUpDefault(id); - return Res.ok(); - } - - @RequestPath("清除默认分账组") - @Operation(summary = "清除默认分账组") - @PostMapping("/clearDefault") - public Result clearDefault(@NotNull(message = "主键不可为空") Long id){ - allocGroupService.clearDefault(id); - return Res.ok(); - } -} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocOrderController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocOrderController.java deleted file mode 100644 index c988f13c..00000000 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocOrderController.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.dromara.daxpay.controller.allocation; - -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; -import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; -import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; -import org.dromara.daxpay.service.service.allocation.AllocationService; -import org.dromara.daxpay.service.service.allocation.AllocationSyncService; -import org.dromara.daxpay.service.service.allocation.order.AllocOrderQueryService; -import org.dromara.core.trans.anno.TransMethodResult; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * 分账订单控制器 - * @author xxm - * @since 2024/4/7 - */ -@Validated -@Tag(name = "分账订单控制器") -@RestController -@RequestGroup(groupCode = "AllocOrder", groupName = "分账订单", moduleCode = "TradeOrder") -@RequestMapping("/allocation/order") -@RequiredArgsConstructor -public class AllocOrderController { - - private final AllocOrderQueryService queryService; - - private final AllocationService allocationService; - - private final AllocationSyncService allocationSyncService; - - @TransMethodResult - @RequestPath("分页") - @Operation(summary = "分页") - @GetMapping("/page") - public Result> page(PageParam pageParam, AllocOrderQuery param){ - return Res.ok(queryService.page(pageParam,param)); - } - - @RequestPath("分账明细列表") - @Operation(summary = "分账明细列表") - @GetMapping("/detail/findAll") - public Result> findDetailsByOrderId(@NotNull(message = "主键不可为空") @Parameter(description = "订单ID") Long orderId){ - return Res.ok(queryService.findDetailsByOrderId(orderId)); - } - - @RequestPath("查询详情") - @Operation(summary = "查询详情") - @GetMapping("/findById") - public Result findById(@NotNull(message = "主键不可为空") Long id){ - return Res.ok(queryService.findById(id)); - } - - @TransMethodResult - @RequestPath("查询明细详情") - @Operation(summary = "查询明细详情") - @GetMapping("/detail/findById") - public Result findDetailById(@NotNull(message = "主键不可为空") Long id){ - return Res.ok(queryService.findDetailById(id)); - } - - @RequestPath("分账重试") - @Operation(summary = "分账重试") - @PostMapping("/retry") - public Result retry(@NotNull(message = "分账单ID不可为空") Long id){ - return Res.ok(); - } - - @RequestPath("分账完结") - @Operation(summary = "分账完结") - @PostMapping("/finish") - public Result finish(@NotNull(message = "分账单ID不可为空")Long id){ - allocationService.finish(id); - return Res.ok(); - } - - @RequestPath("分账同步") - @Operation(summary = "分账同步") - @PostMapping("/sync") - public Result sync(@NotNull(message = "分账单ID不可为空") Long id){ - allocationSyncService.sync(id); - return Res.ok(); - } -} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocReceiverController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocReceiverController.java deleted file mode 100644 index fa604ac0..00000000 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/allocation/AllocReceiverController.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.dromara.daxpay.controller.allocation; - -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.dto.LabelValue; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.allocation.receiver.AllocReceiverQuery; -import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; -import org.dromara.daxpay.service.service.allocation.receiver.AllocReceiverService; -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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * 分账接收方控制器 - * @author xxm - * @since 2024/3/28 - */ -@Validated -@Tag(name = "分账接收方控制器") -@RestController -@RequestGroup(groupCode = "AllocReceiver", groupName = "分账接收方", moduleCode = "Alloc") -@RequestMapping("/allocation/receiver") -@RequiredArgsConstructor -public class AllocReceiverController { - - private final AllocReceiverService receiverService; - - @RequestPath("分页") - @Operation(summary = "分页") - @GetMapping("/page") - public Result> page(PageParam pageParam, AllocReceiverQuery query){ - return Res.ok(receiverService.page(pageParam, query)); - } - - @RequestPath("查询详情") - @Operation(summary = "查询详情") - @GetMapping("/findById") - public Result findById(@NotNull(message = "主键不可为空") Long id){ - return Res.ok(receiverService.findById(id)); - } - - @RequestPath("删除") - @Operation(summary = "删除") - @PostMapping("/delete") - public Result delete(Long id){ - receiverService.remove(id); - return Res.ok(); - } - - @RequestPath("可分账的通道列表") - @Operation(summary = "可分账的通道列表") - @GetMapping("/findChannels") - public Result> findChannels(){ - return Res.ok(receiverService.findChannels()); - } - -} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/ChannelAuthAssistController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/ChannelAuthAssistController.java similarity index 83% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/ChannelAuthAssistController.java rename to daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/ChannelAuthAssistController.java index b1bbee39..111795f1 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/ChannelAuthAssistController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/ChannelAuthAssistController.java @@ -1,5 +1,6 @@ -package org.dromara.daxpay.controller.common; +package org.dromara.daxpay.controller.assist; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; @@ -7,8 +8,9 @@ import cn.bootx.platform.core.rest.result.Result; import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.assist.AuthUrlResult; -import org.dromara.daxpay.service.service.assist.ChannelAuthService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.service.assist.ChannelAuthService; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; @@ -24,6 +26,7 @@ import org.springframework.web.bind.annotation.*; @Validated @Tag(name = "通道认证服务") @RestController +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(groupCode = "ChannelAuth", groupName = "通道认证", moduleCode = "paymentAssist") @RequestMapping("/assist/channel/auth") @RequiredArgsConstructor diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/ChannelBasicController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/ChannelBasicController.java new file mode 100644 index 00000000..2b3a0149 --- /dev/null +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/ChannelBasicController.java @@ -0,0 +1,37 @@ +package org.dromara.daxpay.controller.assist; + +import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.result.Result; +import org.dromara.daxpay.service.pay.service.assist.ChannelBasicService; +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.RestController; + +import java.util.List; + +/** + * 通道基础数据控制器 + * @author xxm + * @since 2025/6/4 + */ +@Validated +@IgnoreAuth +@Tag(name = "通道基础数据控制器") +@RestController +@RequestMapping("/channel/basic") +@RequiredArgsConstructor +public class ChannelBasicController { + private final ChannelBasicService channelBasicService; + + @Operation(summary = "查询支付通道下属的支付方式列表") + @GetMapping("/payMethodList") + public Result> payMethodList(String channel){ + return Res.ok(channelBasicService.payMethodList(channel)); + } +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/DevelopTradeController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/DevelopTradeController.java similarity index 90% rename from daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/DevelopTradeController.java rename to daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/DevelopTradeController.java index 866bcc45..ccf8c0c6 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/DevelopTradeController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/DevelopTradeController.java @@ -1,5 +1,6 @@ -package org.dromara.daxpay.controller.common; +package org.dromara.daxpay.controller.assist; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; @@ -11,8 +12,9 @@ import org.dromara.daxpay.core.param.trade.transfer.TransferParam; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.result.trade.refund.RefundResult; import org.dromara.daxpay.core.result.trade.transfer.TransferResult; -import org.dromara.daxpay.service.result.gateway.GatewayPayUrlResult; -import org.dromara.daxpay.service.service.develop.DevelopTradeService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.result.gateway.GatewayPayUrlResult; +import org.dromara.daxpay.service.pay.service.develop.DevelopTradeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -30,6 +32,7 @@ import org.springframework.web.bind.annotation.RestController; @Validated @Tag(name = "交易开发调试服务") @RestController +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(groupCode = "DevelopTrade", groupName = "交易开发调试服务", moduleCode = "paymentAssist", moduleName = "(DaxPay)支付辅助功能") @RequestMapping("/develop/trade") @RequiredArgsConstructor diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/MchAppQueryController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/MchAppQueryController.java new file mode 100644 index 00000000..f27bc9d3 --- /dev/null +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/MchAppQueryController.java @@ -0,0 +1,64 @@ +package org.dromara.daxpay.controller.assist; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.result.Result; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.service.app.MchAppService; +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; + +import java.util.List; + +/** + * 商户应用信息查询 + * @author xxm + * @since 2025/7/7 + */ +@Validated +@Tag(name = "商户应用信息查询") +@RestController +@RequestMapping("/mch/app/query") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) +@RequestGroup(groupCode = "MchAppQuery", groupName = "商户应用信息查询", moduleCode = "paymentAssist") +@RequiredArgsConstructor +public class MchAppQueryController { + private final MchAppService mchAppService; + + @RequestPath("查询应用下拉列表") + @Operation(summary = "查询启用的商户应用下拉列表") + @GetMapping("/dropdown") + public Result> dropdown(){ + return Res.ok(mchAppService.dropdown(null)); + } + + @RequestPath("查询启应用下拉列表") + @Operation(summary = "查询商户应用下拉列表") + @GetMapping("/dropdownByEnable") + public Result> dropdownByEnable(){ + return Res.ok(mchAppService.dropdownByEnable(null)); + } + + @RequestPath("根据商户号查询应用下拉列表") + @Operation(summary = "根据商户号查询启用的商户应用下拉列表") + @GetMapping("/dropdownByMchNo") + public Result> dropdownByMchNo(@NotNull(message = "商户号不可为空")String mchNo){ + return Res.ok(mchAppService.dropdown(mchNo)); + } + + @RequestPath("根据商户号查询启应用下拉列表") + @Operation(summary = "根据商户号查询商户应用下拉列表") + @GetMapping("/dropdownEnableByMchNo") + public Result> dropdownEnableByMchNo(@NotNull(message = "商户号不可为空")String mchNo){ + return Res.ok(mchAppService.dropdownByEnable(mchNo)); + } +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/MerchantQueryController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/MerchantQueryController.java new file mode 100644 index 00000000..721a8e2a --- /dev/null +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/MerchantQueryController.java @@ -0,0 +1,47 @@ +package org.dromara.daxpay.controller.assist; + +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.result.Result; +import org.dromara.daxpay.service.merchant.service.info.MerchantInfoService; +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.RestController; + +import java.util.List; + +/** + * 商户查询控制器 + * @author xxm + * @since 2024/6/25 + */ +@Validated +@Tag(name = "商户信息查询控制器") +@RestController +@RequestMapping("/merchant/query") +@RequestGroup(groupCode = "MerchantInfo", groupName = "商户信息查询", moduleCode = "merchant") +@RequiredArgsConstructor +public class MerchantQueryController { + private final MerchantInfoService merchantInfoService; + + @RequestPath("商户下拉列表") + @Operation(summary = "商户下拉列表") + @GetMapping("/dropdown") + public Result> dropdown(){ + return Res.ok(merchantInfoService.dropdown()); + } + + @RequestPath("启用的商户下拉列表") + @Operation(summary = "启用的商户下拉列表") + @GetMapping("/dropdownByEnable") + public Result> dropdownByEnable(){ + return Res.ok(merchantInfoService.dropdownByEnable()); + } + +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/TerminalDeviceController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/TerminalDeviceController.java deleted file mode 100644 index 7ef0747b..00000000 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/TerminalDeviceController.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.dromara.daxpay.controller.assist; - -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.dto.LabelValue; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.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.dromara.core.trans.anno.TransMethodResult; -import org.dromara.daxpay.service.param.termina.TerminalDeviceParam; -import org.dromara.daxpay.service.param.termina.TerminalDeviceQuery; -import org.dromara.daxpay.service.result.termina.TerminalDeviceResult; -import org.dromara.daxpay.service.service.assist.TerminalDeviceService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 支付终端设备 - * @author xxm - * @since 2025/3/9 - */ -@Validated -@Tag(name = "支付终端设备管理") -@RestController -@RequestMapping("/terminal/device") -@RequestGroup(groupCode = "TerminalDevice", groupName = "支付终端设备管理", moduleCode = "PayConfig") -@RequiredArgsConstructor -public class TerminalDeviceController { - private final TerminalDeviceService terminalDeviceService; - - @TransMethodResult - @RequestPath("分页查询") - @Operation(summary = "分页查询") - @GetMapping("/page") - public Result> page(PageParam pageParam, TerminalDeviceQuery query){ - return Res.ok(terminalDeviceService.page(pageParam, query)); - } - - @TransMethodResult - @RequestPath("根据ID查询") - @Operation(summary = "根据ID查询") - @GetMapping("/findById") - public Result findById(@NotNull(message = "支付终端设备id不能为空") Long id){ - return Res.ok(terminalDeviceService.findById(id)); - } - - @RequestPath("新增") - @Operation(summary = "新增") - @PostMapping("/add") - public Result add(@RequestBody @Validated(ValidationGroup.add.class) TerminalDeviceParam param){ - terminalDeviceService.add(param); - return Res.ok(); - } - - @RequestPath("修改") - @Operation(summary = "修改") - @PostMapping("/edit") - public Result edit(@RequestBody @Validated(ValidationGroup.edit.class) TerminalDeviceParam param){ - terminalDeviceService.edit(param); - return Res.ok(); - } - - @RequestPath("删除") - @Operation(summary = "删除") - @PostMapping("/delete") - public Result delete(@NotNull(message = "支付终端设备id不能为空") Long id){ - terminalDeviceService.delete(id); - return Res.ok(); - } - - @RequestPath("根据应用号查询下拉列表") - @Operation(summary = "根据应用号查询下拉列表") - @GetMapping("/dropdown") - public Result> dropdown(String appId){ - return Res.ok(terminalDeviceService.dropdown(appId)); - } -} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/TestController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/TestController.java deleted file mode 100644 index 2ccd377e..00000000 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/TestController.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.dromara.daxpay.controller.common; - -import cn.bootx.platform.core.annotation.IgnoreAuth; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.starter.cache.handler.CacheClearProcessor; -import cn.bootx.platform.starter.cache.service.CacheClearService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * - * @author xxm - * @since 2024/7/4 - */ -@Validated -@IgnoreAuth -@Slf4j -@Tag(name = "测试服务") -@RestController -@RequestMapping("/test") -@RequiredArgsConstructor -public class TestController { - private final CacheClearProcessor cacheClearProcessor; - private final CacheClearService cacheClearService; - - - @RequestPath("查询所有缓存前缀") - @Operation(summary = "查询所有缓存前缀") - @GetMapping("/getCachePrefix") - public Result> getCachePrefix() { - return Res.ok(cacheClearProcessor.getCachePrefix()); - } - - @RequestPath("清除指定前缀的缓存") - @Operation(summary = "清除指定前缀的缓存") - @PostMapping("/prefix") - public Result clearCacheByPrefix(List prefix) { - cacheClearService.clearCacheByPrefix(prefix); - return Res.ok(); - } -} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/ChannelConfigController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/ChannelConfigController.java index bfb5959b..b7a99be3 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/ChannelConfigController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/ChannelConfigController.java @@ -5,8 +5,8 @@ import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.dto.LabelValue; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.result.config.ChannelConfigResult; -import org.dromara.daxpay.service.service.config.ChannelConfigService; +import org.dromara.daxpay.service.merchant.result.config.ChannelConfigResult; +import org.dromara.daxpay.service.merchant.service.config.ChannelConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -20,14 +20,14 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; /** - * 通道配置 + * 商户通道配置 * @author xxm * @since 2024/6/25 */ @Validated -@Tag(name = "通道配置") +@Tag(name = "商户通道配置") @RestController -@RequestGroup(groupCode = "ChannelConfig", groupName = "通道配置", moduleCode = "PayConfig") +@RequestGroup(groupCode = "ChannelConfig", groupName = "商户通道配置", moduleCode = "merchant") @RequestMapping("/channel/config") @RequiredArgsConstructor public class ChannelConfigController { @@ -46,5 +46,6 @@ public class ChannelConfigController { public Result> dropdownByEnable(@NotNull(message = "应用AppId不可为空") @Parameter(description = "应用AppId") String appId){ return Res.ok(channelConfigService.dropdownByEnable(appId)); } + } diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/MerchantNotifyConfigController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/MerchantNotifyConfigController.java index 2455cc0e..72d96209 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/MerchantNotifyConfigController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/MerchantNotifyConfigController.java @@ -4,9 +4,9 @@ import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.config.NotifySubscribeParam; -import org.dromara.daxpay.service.result.config.MerchantNotifyConfigResult; -import org.dromara.daxpay.service.service.config.MerchantNotifyConfigService; +import org.dromara.daxpay.service.merchant.param.config.NotifySubscribeParam; +import org.dromara.daxpay.service.merchant.result.config.MerchantNotifyConfigResult; +import org.dromara.daxpay.service.merchant.service.config.MerchantNotifyConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; @@ -22,7 +22,7 @@ import java.util.List; * @since 2024/8/2 */ @Validated -@RequestGroup(groupCode = "MerchantNotifyConfig", groupName = "商户通知配置", moduleCode = "PayConfig") +@RequestGroup(groupCode = "MerchantNotifyConfig", groupName = "商户通知配置", moduleCode = "merchant") @Tag(name = "商户订阅通知配置") @RestController @RequestMapping("/merchant/notify/config") diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/PlatformConfigController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/PlatformConfigController.java index 23a2be05..88a534cb 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/PlatformConfigController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/config/PlatformConfigController.java @@ -1,12 +1,20 @@ package org.dromara.daxpay.controller.config; +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.config.PlatformConfigParam; -import org.dromara.daxpay.service.result.config.PlatformConfigResult; -import org.dromara.daxpay.service.service.config.PlatformConfigService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.common.param.config.PlatformBasicConfigParam; +import org.dromara.daxpay.service.common.param.config.PlatformCashoutsConfigParam; +import org.dromara.daxpay.service.common.param.config.PlatformUrlConfigParam; +import org.dromara.daxpay.service.common.param.config.PlatformWebsiteConfigPram; +import org.dromara.daxpay.service.common.result.config.PlatformBasicConfigResult; +import org.dromara.daxpay.service.common.result.config.PlatformUrlConfigResult; +import org.dromara.daxpay.service.common.result.config.PlatformWebsiteConfigResult; +import org.dromara.daxpay.service.common.service.config.PlatformConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -19,26 +27,57 @@ import org.springframework.web.bind.annotation.*; * @since 2024/9/20 */ @Validated +@ClientCode(DaxPayCode.Client.ADMIN) @Tag(name = "平台配置") @RestController @RequestMapping("/platform/config") -@RequestGroup(groupCode = "PlatformConfig", groupName = "支付平台配置", moduleCode = "PayConfig") +@RequestGroup(groupCode = "PlatformBasicConfig", groupName = "支付平台配置", moduleCode = "DaxPayPlatform", moduleName = "(DaxPay)支付平台") @RequiredArgsConstructor public class PlatformConfigController { private final PlatformConfigService platformConfigService; - @RequestPath("获取配置") - @Operation(summary = "获取配置") - @GetMapping("/get") - public Result get() { - return Res.ok(platformConfigService.findConfig()); + @IgnoreAuth + @Operation(summary = "获取平台基础配置") + @GetMapping("/basic/get") + public Result getBasicConfig() { + return Res.ok(platformConfigService.findBasicConfig()); } - @RequestPath("更新配置") - @Operation(summary = "更新配置") - @PostMapping("/update") - public Result update(@RequestBody @Validated PlatformConfigParam param) { - platformConfigService.update(param); + @RequestPath("更新平台基础配置") + @Operation(summary = "更新平台基础配置") + @PostMapping("/basic/update") + public Result updateBasic(@RequestBody @Validated PlatformBasicConfigParam param) { + platformConfigService.updateBasic(param); + return Res.ok(); + } + + @IgnoreAuth + @Operation(summary = "获取平台访问地址配置") + @GetMapping("/url/get") + public Result getUrlConfig() { + return Res.ok(platformConfigService.findUrlConfig()); + } + + @RequestPath("更新平台访问地址配置") + @Operation(summary = "更新平台访问地址配置") + @PostMapping("/url/update") + public Result updateUrl(@RequestBody @Validated PlatformUrlConfigParam param) { + platformConfigService.updateUrl(param); + return Res.ok(); + } + + @IgnoreAuth + @Operation(summary = "获取平台站点配置") + @GetMapping("/website/get") + public Result getWebsiteConfig() { + return Res.ok(platformConfigService.findWebsiteConfig()); + } + + @RequestPath("更新平台站点配置") + @Operation(summary = "更新平台站点配置") + @PostMapping("/website/update") + public Result updateWebsite(@RequestBody @Validated PlatformWebsiteConfigPram param) { + platformConfigService.updateWebsite(param); return Res.ok(); } } diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/ApiConstController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/ApiConstController.java index 01bb452e..53348d16 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/ApiConstController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/ApiConstController.java @@ -1,14 +1,13 @@ package org.dromara.daxpay.controller.constant; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.constant.ApiConstQuery; -import org.dromara.daxpay.service.result.constant.ApiConstResult; -import org.dromara.daxpay.service.service.constant.ApiConstService; +import org.dromara.daxpay.service.pay.param.constant.ApiConstQuery; +import org.dromara.daxpay.service.pay.result.constant.ApiConstResult; +import org.dromara.daxpay.service.pay.service.constant.ApiConstService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -22,16 +21,15 @@ import org.springframework.web.bind.annotation.RestController; * @author xxm * @since 2024/7/14 */ +@IgnoreAuth @Validated @Tag(name = "支付开放接口控制器") @RestController @RequestMapping("/const/api") @RequiredArgsConstructor -@RequestGroup(groupCode = "PayConst", groupName = "支付常量", moduleCode = "PayConfig") public class ApiConstController { private final ApiConstService apiConstService; - @RequestPath("支付开放接口分页") @Operation(summary = "支付开放接口分页") @GetMapping("/page") public Result> page(PageParam pageParam, ApiConstQuery query) { diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/ChannelConstController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/ChannelConstController.java index 6be83188..83a9b5c5 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/ChannelConstController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/ChannelConstController.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.controller.constant; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.dto.LabelValue; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.constant.ChannelConstQuery; -import org.dromara.daxpay.service.result.constant.ChannelConstResult; -import org.dromara.daxpay.service.service.constant.ChannelConstService; +import org.dromara.daxpay.service.pay.param.constant.ChannelConstQuery; +import org.dromara.daxpay.service.pay.result.constant.ChannelConstResult; +import org.dromara.daxpay.service.pay.service.constant.ChannelConstService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -17,24 +17,37 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + /** * 支付通道常量控制器 * @author xxm * @since 2024/7/14 */ +@IgnoreAuth @Validated @Tag(name = "支付通道常量控制器") @RestController @RequestMapping("/const/channel") @RequiredArgsConstructor -@RequestGroup(groupCode = "PayConst", moduleCode = "PayConfig") public class ChannelConstController { private final ChannelConstService channelConstService; - @RequestPath("支付通道分页") @Operation(summary = "支付通道分页") @GetMapping("/page") public Result> page(PageParam pageParam, ChannelConstQuery query) { return Res.ok(channelConstService.page(pageParam, query)); } + + @Operation(summary = "服务商通道下拉列表") + @GetMapping("/dropdownByIsv") + public Result> dropdownByIsv() { + return Res.ok(channelConstService.dropdownByIsv()); + } + + @Operation(summary = "可进件通道下拉列表") + @GetMapping("/dropdownByApply") + public Result> dropdownByApply() { + return Res.ok(channelConstService.dropdownByApply()); + } } diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/MerchantNotifyConstController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/MerchantNotifyConstController.java index 88cb1297..e3a923f8 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/MerchantNotifyConstController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/MerchantNotifyConstController.java @@ -1,14 +1,13 @@ package org.dromara.daxpay.controller.constant; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.constant.MerchantNotifyConstQuery; -import org.dromara.daxpay.service.result.constant.MerchantNotifyConstResult; -import org.dromara.daxpay.service.service.constant.MerchantNotifyConstService; +import org.dromara.daxpay.service.pay.param.constant.MerchantNotifyConstQuery; +import org.dromara.daxpay.service.pay.result.constant.MerchantNotifyConstResult; +import org.dromara.daxpay.service.pay.service.constant.MerchantNotifyConstService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -22,8 +21,8 @@ import org.springframework.web.bind.annotation.RestController; * @author xxm * @since 2024/8/5 */ +@IgnoreAuth @Validated -@RequestGroup(groupCode = "PayConst", moduleCode = "PayConfig") @Tag(name = "商户订阅通知类型") @RestController @RequestMapping("/const/merchant/notify") @@ -32,7 +31,6 @@ public class MerchantNotifyConstController { private final MerchantNotifyConstService merchantNotifyConstService; - @RequestPath("商户订阅通知类型分页") @Operation(summary = "商户订阅通知类型分页") @GetMapping("/page") public Result> page(PageParam pageParam, MerchantNotifyConstQuery query) { diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/MethodConstController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/MethodConstController.java index c939328d..98de27e5 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/MethodConstController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/MethodConstController.java @@ -1,14 +1,13 @@ package org.dromara.daxpay.controller.constant; -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.constant.MethodConstQuery; -import org.dromara.daxpay.service.result.constant.PayMethodConstResult; -import org.dromara.daxpay.service.service.constant.MethodConstService; +import org.dromara.daxpay.service.pay.param.constant.MethodConstQuery; +import org.dromara.daxpay.service.pay.result.constant.PayMethodConstResult; +import org.dromara.daxpay.service.pay.service.constant.MethodConstService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -22,16 +21,15 @@ import org.springframework.web.bind.annotation.RestController; * @author xxm * @since 2024/7/14 */ +@IgnoreAuth @Validated @Tag(name = "支付方式常量控制器") @RestController @RequestMapping("/const/method") @RequiredArgsConstructor -@RequestGroup(groupCode = "PayConst", moduleCode = "PayConfig") public class MethodConstController { private final MethodConstService methodConstService; - @RequestPath("支付方式分页") @Operation(summary = "支付方式分页") @GetMapping("/page") public Result> page(PageParam pageParam, MethodConstQuery query) { diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/TerminalConstController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/TerminalConstController.java new file mode 100644 index 00000000..6bdcb19f --- /dev/null +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/constant/TerminalConstController.java @@ -0,0 +1,38 @@ +package org.dromara.daxpay.controller.constant; + +import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.core.rest.result.Result; +import org.dromara.daxpay.service.pay.param.constant.TerminalConstQuery; +import org.dromara.daxpay.service.pay.result.constant.TerminalConstResult; +import org.dromara.daxpay.service.pay.service.constant.TerminalConstService; +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.RestController; + +/** + * 终端报送方式常量控制器 + * @author xxm + * @since 2025/3/12 + */ +@Validated +@IgnoreAuth +@Tag(name = "终端报送方式常量控制器") +@RestController +@RequestMapping("/const/terminal") +@RequiredArgsConstructor +public class TerminalConstController { + private final TerminalConstService terminalConstService; + + @Operation(summary = "支付方式分页") + @GetMapping("/page") + public Result> page(PageParam pageParam, TerminalConstQuery query) { + return Res.ok(terminalConstService.page(pageParam, query)); + } +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/qrcode/CashierCodeController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/qrcode/CashierCodeController.java new file mode 100644 index 00000000..421ad45e --- /dev/null +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/qrcode/CashierCodeController.java @@ -0,0 +1,131 @@ +package org.dromara.daxpay.controller.device.qrcode; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.core.rest.result.Result; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.device.param.commom.AssignMerchantParam; +import org.dromara.daxpay.service.device.param.qrcode.info.CashierCodeBatchParam; +import org.dromara.daxpay.service.device.param.qrcode.info.CashierCodeQuery; +import org.dromara.daxpay.service.device.param.qrcode.info.CashierCodeUpdateParam; +import org.dromara.daxpay.service.device.result.qrcode.info.CashierCodeResult; +import org.dromara.daxpay.service.device.service.qrcode.CashierCodeService; +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.dromara.core.trans.anno.TransMethodResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 收款码牌管理 + * @author xxm + * @since 2025/7/1 + */ +@Validated +@Tag(name = "收款码牌管理") +@RestController +@RequestMapping("/cashier/code") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) +@RequestGroup(groupCode = "CashierCode", groupName = "收款码牌管理", moduleCode = "device", moduleName = "(DaxPay)设备管理") +@RequiredArgsConstructor +public class CashierCodeController { + private final CashierCodeService cashierCodeService; + + @TransMethodResult + @RequestPath("分页查询") + @Operation(summary = "分页查询") + @GetMapping("/page") + public Result> page(PageParam pageParam, CashierCodeQuery query) { + return Res.ok(cashierCodeService.page(pageParam, query)); + } + + @TransMethodResult + @RequestPath("查询详情") + @Operation(summary = "查询详情") + @GetMapping("/findById") + public Result findById(@NotNull(message = "主键不可为空")Long id) { + return Res.ok(cashierCodeService.findById(id)); + } + + @RequestPath("判断批次号是否已存在") + @Operation(summary = "判断批次号是否已存在") + @GetMapping("/existsByBatchNo") + public Result existsByBatchNo(@NotNull(message = "批次号不可为空") String batchNo) { + return Res.ok(cashierCodeService.existsByBatchNo(batchNo)); + } + + @RequestPath("批量创建") + @Operation(summary = "批量创建") + @PostMapping("/createBatch") + public Result createBatch(@Validated @RequestBody CashierCodeBatchParam param) { + cashierCodeService.createBatch(param); + return Res.ok(); + } + + @RequestPath("修改") + @Operation(summary = "修改") + @PostMapping("/update") + public Result update(@Validated @RequestBody CashierCodeUpdateParam param) { + cashierCodeService.update(param); + return Res.ok(); + } + + @ClientCode({DaxPayCode.Client.ADMIN}) + @RequestPath("绑定商户") + @Operation(summary = "绑定商户") + @PostMapping("/bindMerchant") + public Result bindMerchant(@Validated @RequestBody AssignMerchantParam param) { + cashierCodeService.bindMerchant(param); + return Res.ok(); + } + + @ClientCode({DaxPayCode.Client.ADMIN}) + @RequestPath("解绑商户") + @Operation(summary = "解绑商户") + @PostMapping("/unbindMerchant") + public Result unbindMerchant(@Validated @RequestBody AssignMerchantParam param) { + cashierCodeService.unbindMerchant(param); + return Res.ok(); + } + + + @ClientCode(DaxPayCode.Client.MERCHANT) + @RequestPath("绑定应用") + @Operation(summary = "绑定应用") + @PostMapping("/bindApp") + public Result bindApp(@RequestBody @Validated AssignMerchantParam param){ + cashierCodeService.bindApp(param); + return Res.ok(); + } + + @ClientCode(DaxPayCode.Client.MERCHANT) + @RequestPath("解绑应用") + @Operation(summary = "解绑应用") + @PostMapping("/unbindApp") + public Result unbindApp(@RequestBody @Validated AssignMerchantParam param){ + cashierCodeService.unbindApp(param); + return Res.ok(); + } + + @ClientCode(DaxPayCode.Client.ADMIN) + @Operation(summary = "删除码牌") + @PostMapping("/delete") + public Result delete(@NotNull(message = "主键不可为空") Long id) { + cashierCodeService.delete(id); + return Res.ok(); + } + + @RequestPath("获取码牌链接") + @Operation(summary = "获取码牌链接") + @GetMapping("/getCodeLink") + public Result getCodeLink(@NotNull(message = "码牌编号不可为空") String code) { + return Res.ok(cashierCodeService.getCodeLink(code)); + } + +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/terminal/ChannelTerminalController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/terminal/ChannelTerminalController.java new file mode 100644 index 00000000..f062dcb9 --- /dev/null +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/terminal/ChannelTerminalController.java @@ -0,0 +1,91 @@ +package org.dromara.daxpay.controller.device.terminal; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.result.Result; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.device.param.terminal.ChannelGetAndCreateParam; +import org.dromara.daxpay.service.device.param.terminal.ChannelTerminalParam; +import org.dromara.daxpay.service.device.result.terminal.ChannelTerminalResult; +import org.dromara.daxpay.service.device.service.terminal.ChannelTerminalService; +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.*; + +import java.util.List; + +/** + * 通道辅助终端报备 + * @author xxm + * @since 2025/7/7 + */ +@Validated +@Tag(name = "通道辅助终端报备") +@RestController +@RequestMapping("/device/terminal/channel") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) +@RequestGroup(groupCode = "TerminalDevice", groupName = "辅助终端报备", moduleCode = "device") +@RequiredArgsConstructor +public class ChannelTerminalController { + private final ChannelTerminalService terminalDeviceService; + + + @RequestPath("查询通道报备列表") + @Operation(summary = "查询通道报备列表") + @GetMapping("/list") + public Result> channelList(@NotNull(message = "支付终端设备id不能为空") Long terminalId){ + return Res.ok(terminalDeviceService.channelList(terminalId)); + } + + @RequestPath("通道报备") + @Operation(summary = "通道报备") + @PostMapping("/submit") + public Result channelSubmit(@NotNull(message = "通道终端设备id不能为空") Long channelTerminalId){ + terminalDeviceService.channelSubmit(channelTerminalId); + return Res.ok(); + } + + @RequestPath("通道报备取消") + @Operation(summary = "通道报备取消") + @PostMapping("/cancel") + public Result channelCancel(@NotNull(message = "通道终端设备id不能为空") Long channelTerminalId){ + terminalDeviceService.channelCancel(channelTerminalId); + return Res.ok(); + } + + @RequestPath("通道报备状态同步") + @Operation(summary = "通道报备状态同步") + @PostMapping("/sync") + public Result channel(@NotNull(message = "通道终端设备id不能为空") Long channelTerminalId){ + terminalDeviceService.channelSync(channelTerminalId); + return Res.ok(); + } + + @RequestPath("通道报备修改") + @Operation(summary = "通道报备修改") + @PostMapping("/edit") + public Result channelEdit(@RequestBody @Validated ChannelTerminalParam param){ + terminalDeviceService.channelEdit(param); + return Res.ok(); + } + + @RequestPath("查询通道报备详情") + @Operation(summary = "查询通道报备详情") + @GetMapping("/detail") + public Result channelDetail(@NotNull(message = "通道终端设备id不能为空") Long channelTerminalId){ + return Res.ok(terminalDeviceService.channelDetail(channelTerminalId)); + } + + @RequestPath("通道报备新增") + @Operation(summary = "通道报备新增") + @PostMapping("/getAndCreate") + public Result getAndCreate(@Validated ChannelGetAndCreateParam param){ + return Res.ok(terminalDeviceService.getAndCreate(param)); + } + +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/terminal/TerminalDeviceController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/terminal/TerminalDeviceController.java new file mode 100644 index 00000000..454901a0 --- /dev/null +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/device/terminal/TerminalDeviceController.java @@ -0,0 +1,125 @@ +package org.dromara.daxpay.controller.device.terminal; + +import cn.bootx.platform.core.annotation.ClientCode; +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.device.param.commom.AssignMerchantParam; +import org.dromara.daxpay.service.device.param.terminal.TerminalDeviceParam; +import org.dromara.daxpay.service.device.param.terminal.TerminalDeviceQuery; +import org.dromara.daxpay.service.device.result.terminal.TerminalDeviceResult; +import org.dromara.daxpay.service.device.service.terminal.TerminalDeviceService; +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.dromara.core.trans.anno.TransMethodResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 辅助终端报备 + * @author xxm + * @since 2025/3/9 + */ +@Validated +@Tag(name = "辅助终端报备") +@RestController +@RequestMapping("/device/terminal") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) +@RequestGroup(groupCode = "TerminalDevice", groupName = "辅助终端报备", moduleCode = "device") +@RequiredArgsConstructor +public class TerminalDeviceController { + private final TerminalDeviceService terminalDeviceService; + + @TransMethodResult + @RequestPath("分页查询") + @Operation(summary = "分页查询") + @GetMapping("/page") + public Result> page(PageParam pageParam, TerminalDeviceQuery query){ + return Res.ok(terminalDeviceService.page(pageParam, query)); + } + + @TransMethodResult + @RequestPath("根据ID查询") + @Operation(summary = "根据ID查询") + @GetMapping("/findById") + public Result findById(@NotNull(message = "支付终端设备id不能为空") Long id){ + return Res.ok(terminalDeviceService.findById(id)); + } + + @RequestPath("新增") + @Operation(summary = "新增") + @PostMapping("/add") + public Result add(@RequestBody @Validated(ValidationGroup.add.class) TerminalDeviceParam param){ + terminalDeviceService.add(param); + return Res.ok(); + } + + @ClientCode({DaxPayCode.Client.ADMIN}) + @RequestPath("绑定商户") + @Operation(summary = "绑定商户") + @PostMapping("/bindMerchant") + public Result bindMerchant(@Validated @RequestBody AssignMerchantParam param) { + terminalDeviceService.bindMerchant(param); + return Res.ok(); + } + + @ClientCode({DaxPayCode.Client.ADMIN}) + @RequestPath("解绑商户") + @Operation(summary = "解绑商户") + @PostMapping("/unbindMerchant") + public Result unbindMerchant(@Validated @RequestBody AssignMerchantParam param) { + terminalDeviceService.unbindMerchant(param); + return Res.ok(); + } + + @ClientCode({DaxPayCode.Client.MERCHANT}) + @RequestPath("绑定应用") + @Operation(summary = "绑定应用") + @PostMapping("/bindApp") + public Result bindApp(@RequestBody @Validated AssignMerchantParam param){ + terminalDeviceService.bindApp(param); + return Res.ok(); + } + + @ClientCode({DaxPayCode.Client.MERCHANT}) + @RequestPath("解绑应用") + @Operation(summary = "解绑应用") + @PostMapping("/unbindApp") + public Result unbindApp(@RequestBody @Validated AssignMerchantParam param){ + terminalDeviceService.unbindApp(param); + return Res.ok(); + } + + @RequestPath("修改") + @Operation(summary = "修改") + @PostMapping("/edit") + public Result edit(@RequestBody @Validated(ValidationGroup.edit.class) TerminalDeviceParam param){ + terminalDeviceService.edit(param); + return Res.ok(); + } + + @RequestPath("删除") + @Operation(summary = "删除") + @PostMapping("/delete") + public Result delete(@NotNull(message = "支付终端设备id不能为空") Long id){ + terminalDeviceService.delete(id); + return Res.ok(); + } + + @RequestPath("根据AppId获取下拉列表") + @Operation(summary = "根据AppId获取下拉列表") + @GetMapping("/dropdownByAppId") + public Result> dropdownByAppId(@NotNull(message = "AppId不能为空") String appId){ + return Res.ok(terminalDeviceService.dropdownByAppId(appId)); + } +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/AggregateConfigController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/AggregateConfigController.java index 9487afe5..3952d3d3 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/AggregateConfigController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/AggregateConfigController.java @@ -1,14 +1,16 @@ package org.dromara.daxpay.controller.gateway; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.gateway.AggregateBarPayConfigParam; -import org.dromara.daxpay.service.param.gateway.AggregatePayConfigParam; -import org.dromara.daxpay.service.result.gateway.config.AggregateBarPayConfigResult; -import org.dromara.daxpay.service.result.gateway.config.AggregatePayConfigResult; -import org.dromara.daxpay.service.service.gateway.config.AggregateConfigService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.param.gateway.AggregateBarPayConfigParam; +import org.dromara.daxpay.service.merchant.param.gateway.AggregatePayConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.AggregateBarPayConfigResult; +import org.dromara.daxpay.service.merchant.result.gateway.AggregatePayConfigResult; +import org.dromara.daxpay.service.merchant.service.gateway.AggregateConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; @@ -27,6 +29,7 @@ import java.util.List; @Tag(name = "聚合支付配置") @RestController @RequestMapping("/aggregate/config") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(groupCode = "AggregateConfig", groupName = "聚合支付配置", moduleCode = "GatewayPay") @RequiredArgsConstructor public class AggregateConfigController { diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeConfigController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeConfigController.java deleted file mode 100644 index 7691344f..00000000 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierCodeConfigController.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.dromara.daxpay.controller.gateway; - -import cn.bootx.platform.core.annotation.RequestGroup; -import cn.bootx.platform.core.annotation.RequestPath; -import cn.bootx.platform.core.rest.Res; -import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.gateway.CashierCodeConfigParam; -import org.dromara.daxpay.service.param.gateway.CashierCodeItemConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierCodeConfigResult; -import org.dromara.daxpay.service.result.gateway.config.CashierCodeItemConfigResult; -import org.dromara.daxpay.service.service.gateway.config.CashierCodeConfigService; -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.*; - -import java.util.List; - -/** - * 收银码牌配置 - * @author xxm - * @since 2024/11/20 - */ -@Validated -@RequestGroup(groupCode = "CashierCodeConfig", groupName = "收银码牌配置", moduleCode = "PayConfig", moduleName = "(DaxPay)支付配置") -@Tag(name = "收银码牌配置") -@RestController -@RequestMapping("/cashier/code/config") -@RequiredArgsConstructor -public class CashierCodeConfigController { - private final CashierCodeConfigService codeConfigService; - - @RequestPath("根据AppId查询码牌列表") - @Operation(summary = "根据AppId查询码牌列表") - @GetMapping("/findAllByAppId") - public Result> findAllByAppId(String appId){ - return Res.ok(codeConfigService.findAllByAppId(appId)); - } - - @RequestPath("根据id查询码牌信息") - @Operation(summary = "根据id查询码牌信息") - @GetMapping("/findById") - public Result findById(Long id){ - return Res.ok(codeConfigService.findById(id)); - } - - @RequestPath("码牌配置保存") - @Operation(summary = "码牌配置保存") - @PostMapping("/save") - public Result save(@RequestBody CashierCodeConfigParam param) { - codeConfigService.save(param); - return Res.ok(); - } - - @RequestPath("码牌配置更新") - @Operation(summary = "码牌配置更新") - @PostMapping("/update") - public Result update(@RequestBody CashierCodeConfigParam param) { - codeConfigService.update(param); - return Res.ok(); - } - - @RequestPath("码牌配置删除") - @Operation(summary = "码牌配置删除") - @PostMapping("/delete") - public Result delete(Long id){ - codeConfigService.delete(id); - return Res.ok(); - } - - @RequestPath("获取码牌地址") - @Operation(summary = "获取码牌地址") - @GetMapping("/getCashierCodeUrl") - public Result getCashierCodeUrl(Long id){ - return Res.ok(codeConfigService.getCashierCodeUrl(id)); - } - - @RequestPath("获取码牌各配置明细列表") - @Operation(summary = "获取码牌各配置明细列表") - @GetMapping("/item/findAll") - public Result> findAllByCodeId(Long codeId){ - return Res.ok(codeConfigService.findItemByCodeId(codeId)); - } - - @RequestPath("获取码牌配置明细详情") - @Operation(summary = "获取码牌各配置明细详情") - @GetMapping("/item/findById") - public Result findItemById(Long id){ - return Res.ok(codeConfigService.findItemById(id)); - } - - @RequestPath("码牌配置明细保存") - @Operation(summary = "码牌配置明细保存") - @PostMapping("/item/save") - public Result saveItem(@RequestBody CashierCodeItemConfigParam param){ - codeConfigService.saveItem(param); - return Res.ok(); - } - - @RequestPath("码牌配置明细更新") - @Operation(summary = "码牌配置明细更新") - @PostMapping("/item/update") - public Result updateItem(@RequestBody CashierCodeItemConfigParam param){ - codeConfigService.updateItem(param); - return Res.ok(); - } - - @RequestPath("码牌配置明细删除") - @Operation(summary = "码牌配置明细删除") - @PostMapping("/item/delete") - public Result deleteItem(Long id){ - codeConfigService.deleteItem(id); - return Res.ok(); - } - - @RequestPath("码牌配置明细是否存在") - @Operation(summary = "码牌配置明细是否存在") - @GetMapping("/item/exists") - public Result existsByItem(String type, Long codeId){ - return Res.ok(codeConfigService.existsByTypeItem(type, codeId)); - } - - @RequestPath("码牌配置明细是否存在(不包括自身)") - @Operation(summary = "码牌配置明细是否存在(不包括自身)") - @GetMapping("/item/existsNotId") - public Result existsByItemNotId(String type, Long codeId, Long id){ - return Res.ok(codeConfigService.existsByTypeItem(type, codeId, id)); - } - -} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierConfigController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierConfigController.java index bd6caeae..fa2f9b74 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierConfigController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/CashierConfigController.java @@ -1,15 +1,17 @@ package org.dromara.daxpay.controller.gateway; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; import cn.bootx.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.service.param.gateway.CashierGroupConfigParam; -import org.dromara.daxpay.service.param.gateway.CashierItemConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierGroupConfigResult; -import org.dromara.daxpay.service.result.gateway.config.CashierItemConfigResult; -import org.dromara.daxpay.service.service.gateway.config.CashierConfigService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.param.gateway.CashierGroupConfigParam; +import org.dromara.daxpay.service.merchant.param.gateway.CashierItemConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.CashierGroupConfigResult; +import org.dromara.daxpay.service.merchant.result.gateway.CashierItemConfigResult; +import org.dromara.daxpay.service.merchant.service.gateway.CashierConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; @@ -29,6 +31,7 @@ import java.util.List; @Tag(name = "收银台支付配置") @RestController @RequestMapping("/cashier/config") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(groupCode = "CashierConfig", groupName = "收银台支付配置", moduleCode = "GatewayPay") @RequiredArgsConstructor public class CashierConfigController { @@ -70,6 +73,15 @@ public class CashierConfigController { return Res.ok(); } + + @RequestPath("保存默认收银台分组(H5)") + @Operation(summary = "保存默认收银台分组(H5)") + @PostMapping("/saveDefaultGroup") + public Result saveDefaultGroup(@NotBlank(message = "应用号不可为空") String appId) { + cashierConfigService.saveDefaultGroup(appId); + return Res.ok(); + } + @RequestPath("修改收银台分组") @Operation(summary = "修改收银台分组") @PostMapping("/updateGroup") diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayConfigController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayConfigController.java index 86aa89a6..a4bea7ac 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayConfigController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/GatewayPayConfigController.java @@ -1,13 +1,15 @@ package org.dromara.daxpay.controller.gateway; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; import cn.bootx.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.service.param.gateway.GatewayPayConfigParam; -import org.dromara.daxpay.service.result.gateway.config.GatewayPayConfigResult; -import org.dromara.daxpay.service.service.gateway.config.GatewayPayConfigService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.param.gateway.GatewayPayConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.GatewayPayConfigResult; +import org.dromara.daxpay.service.merchant.service.gateway.GatewayPayConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; @@ -24,7 +26,8 @@ import org.springframework.web.bind.annotation.*; @Tag(name = "网关支付配置") @RestController @RequestMapping("/gateway/config") -@RequestGroup(groupCode = "GatewayPayConfig", groupName = "网关支付配置", moduleCode = "GatewayPay", moduleName = "(DaxPay)网关支付配置") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) +@RequestGroup(groupCode = "AgentGatewayPayConfig", groupName = "网关支付配置", moduleCode = "GatewayPay", moduleName = "(DaxPay)网关支付配置") @RequiredArgsConstructor public class GatewayPayConfigController { private final GatewayPayConfigService gatewayPayConfigService; @@ -33,15 +36,7 @@ public class GatewayPayConfigController { @Operation(summary = "获取网关支付配置") @GetMapping("/getConfig") public Result getConfig(@NotBlank(message = "商户应用ID不可为空") String appId) { - return Res.ok(gatewayPayConfigService.getConfig(appId)); - } - - @RequestPath("保存网关支付配置") - @Operation(summary = "保存网关支付配置") - @PostMapping("/save") - public Result save(@Validated(ValidationGroup.add.class) @RequestBody GatewayPayConfigParam param) { - gatewayPayConfigService.save(param); - return Res.ok(); + return Res.ok(gatewayPayConfigService.findByAppId(appId).toResult()); } @RequestPath("更新网关支付配置") diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniAllocationController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniAllocationController.java deleted file mode 100644 index a2a05659..00000000 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/gateway/UniAllocationController.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.dromara.daxpay.controller.gateway; - -import cn.bootx.platform.core.annotation.IgnoreAuth; -import org.dromara.daxpay.core.result.DaxResult; -import org.dromara.daxpay.core.util.DaxRes; -import org.dromara.daxpay.service.common.anno.PaymentVerify; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 分账控制器 - * @author xxm - * @since 2024/5/17 - */ -@PaymentVerify -@IgnoreAuth -@Tag(name = "分账控制器") -@RestController -@RequestMapping("/unipay/alloc") -@RequiredArgsConstructor -public class UniAllocationController { - - @Operation(summary = "发起分账接口") - @PostMapping("/start") - public DaxResult start(){ - return DaxRes.ok(); - } - - @Operation(summary = "分账完结接口") - @PostMapping("/finish") - public DaxResult finish(){ - return DaxRes.ok(); - } - - @Operation(summary = "分账接收方添加接口") - @PostMapping("/receiver/add") - public DaxResult receiverAdd(){ - return DaxRes.ok(); - } - - @Operation(summary = "分账接收方删除接口") - @PostMapping("/receiver/remove") - public DaxResult receiverRemove(){ - return DaxRes.ok(); - } - -} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/notice/MerchantCallbackController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/notice/MerchantCallbackController.java index a082b91d..648057e7 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/notice/MerchantCallbackController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/notice/MerchantCallbackController.java @@ -1,16 +1,18 @@ package org.dromara.daxpay.controller.notice; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.notice.callback.MerchantCallbackTaskQuery; -import org.dromara.daxpay.service.result.notice.callback.MerchantCallbackRecordResult; -import org.dromara.daxpay.service.result.notice.callback.MerchantCallbackTaskResult; -import org.dromara.daxpay.service.service.notice.callback.MerchantCallbackQueryService; -import org.dromara.daxpay.service.service.notice.callback.MerchantCallbackSendService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.notice.callback.MerchantCallbackTaskQuery; +import org.dromara.daxpay.service.pay.result.notice.callback.MerchantCallbackRecordResult; +import org.dromara.daxpay.service.pay.result.notice.callback.MerchantCallbackTaskResult; +import org.dromara.daxpay.service.pay.service.notice.callback.MerchantCallbackQueryService; +import org.dromara.daxpay.service.pay.service.notice.callback.MerchantCallbackSendService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -29,6 +31,7 @@ import org.springframework.web.bind.annotation.RestController; * @since 2024/8/5 */ @Validated +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(groupCode = "MerchantCallback", groupName = "商户回调通知", moduleCode = "MerchantNotice", moduleName = "(DaxPay)商户消息通知") @Tag(name = "商户回调通知控制器") @RestController diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/notice/MerchantNotifyController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/notice/MerchantNotifyController.java index f8a8225e..0f727fc0 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/notice/MerchantNotifyController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/notice/MerchantNotifyController.java @@ -1,16 +1,18 @@ package org.dromara.daxpay.controller.notice; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.notice.notify.MerchantNotifyTaskQuery; -import org.dromara.daxpay.service.result.notice.notify.MerchantNotifyRecordResult; -import org.dromara.daxpay.service.result.notice.notify.MerchantNotifyTaskResult; -import org.dromara.daxpay.service.service.notice.notify.MerchantNotifyQueryService; -import org.dromara.daxpay.service.service.notice.notify.MerchantNotifySendService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.notice.notify.MerchantNotifyTaskQuery; +import org.dromara.daxpay.service.pay.result.notice.notify.MerchantNotifyRecordResult; +import org.dromara.daxpay.service.pay.result.notice.notify.MerchantNotifyTaskResult; +import org.dromara.daxpay.service.pay.service.notice.notify.MerchantNotifyQueryService; +import org.dromara.daxpay.service.pay.service.notice.notify.MerchantNotifySendService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -29,6 +31,7 @@ import org.springframework.web.bind.annotation.RestController; * @since 2024/8/5 */ @Validated +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(groupCode = "MerchantNotify", groupName = "商户订阅通知", moduleCode = "MerchantNotice") @Tag(name = "商户订阅通知控制器") @RestController diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/PayOrderController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/PayOrderController.java index 8c21760d..2f284d54 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/PayOrderController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/PayOrderController.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.controller.order; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.exception.DataNotExistException; @@ -7,11 +8,13 @@ import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.param.order.pay.PayOrderQuery; -import org.dromara.daxpay.service.result.order.pay.PayOrderVo; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; -import org.dromara.daxpay.service.service.order.pay.PayOrderService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.param.order.pay.PayOrderQuery; +import org.dromara.daxpay.service.pay.result.order.pay.PayOrderExpandResult; +import org.dromara.daxpay.service.pay.result.order.pay.PayOrderVo; +import org.dromara.daxpay.service.pay.service.order.pay.PayOrderQueryService; +import org.dromara.daxpay.service.pay.service.order.pay.PayOrderService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -36,6 +39,7 @@ import java.math.BigDecimal; @Tag(name = "支付订单控制器") @RestController @RequestMapping("/order/pay") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(groupCode = "PayOrder", groupName = "支付订单", moduleCode = "TradeOrder", moduleName = "(DaxPay)交易订单") @RequiredArgsConstructor public class PayOrderController { @@ -61,6 +65,14 @@ public class PayOrderController { return Res.ok(order); } + @TransMethodResult + @RequestPath("查询订单扩展详情") + @Operation(summary = "查询订单扩展详情") + @GetMapping("/findExpandByById") + public Result findExpandById(Long id){ + return Res.ok(queryService.findExpandByById(id)); + } + @TransMethodResult @RequestPath("根据订单号查询详情") @Operation(summary = "根据订单号查询详情") @@ -103,11 +115,4 @@ public class PayOrderController { return Res.ok(); } - @RequestPath("分账") - @Operation(summary = "分账") - @PostMapping("/allocation") - public Result allocation(@NotNull(message = "支付订单id不能为空") Long id){ - payOrderService.allocation(id); - return Res.ok(); - } } diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/RefundOrderController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/RefundOrderController.java index 8ab86fcd..e78531fa 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/RefundOrderController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/RefundOrderController.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.controller.order; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; @@ -7,11 +8,12 @@ import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; import org.dromara.daxpay.core.result.trade.refund.RefundResult; -import org.dromara.daxpay.service.param.order.refund.RefundCreateParam; -import org.dromara.daxpay.service.param.order.refund.RefundOrderQuery; -import org.dromara.daxpay.service.result.order.refund.RefundOrderVo; -import org.dromara.daxpay.service.service.order.refund.RefundOrderQueryService; -import org.dromara.daxpay.service.service.order.refund.RefundOrderService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.order.refund.RefundCreateParam; +import org.dromara.daxpay.service.pay.param.order.refund.RefundOrderQuery; +import org.dromara.daxpay.service.pay.result.order.refund.RefundOrderVo; +import org.dromara.daxpay.service.pay.service.order.refund.RefundOrderQueryService; +import org.dromara.daxpay.service.pay.service.order.refund.RefundOrderService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -33,6 +35,7 @@ import java.math.BigDecimal; @Tag(name = "退款订单控制器") @RestController @RequestMapping("/order/refund") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(moduleCode = "TradeOrder", groupCode = "RefundOrder", groupName = "退款订单") @RequiredArgsConstructor public class RefundOrderController { diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/TransferOrderController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/TransferOrderController.java index 3fcc35be..16f26211 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/TransferOrderController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/order/TransferOrderController.java @@ -1,15 +1,17 @@ package org.dromara.daxpay.controller.order; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.order.transfer.TransferOrderQuery; -import org.dromara.daxpay.service.result.order.transfer.TransferOrderVo; -import org.dromara.daxpay.service.service.order.transfer.TransferOrderQueryService; -import org.dromara.daxpay.service.service.order.transfer.TransferOrderService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.order.transfer.TransferOrderQuery; +import org.dromara.daxpay.service.pay.result.order.transfer.TransferOrderVo; +import org.dromara.daxpay.service.pay.service.order.transfer.TransferOrderQueryService; +import org.dromara.daxpay.service.pay.service.order.transfer.TransferOrderService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -34,6 +36,7 @@ import java.math.BigDecimal; @Tag(name = "转账订单控制器") @RestController @RequestMapping("/order/transfer") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(moduleCode = "TradeOrder", groupCode = "TransferOrder", groupName = "转账订单") @RequiredArgsConstructor public class TransferOrderController { diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/CallbackRecordController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/CallbackRecordController.java index 72cc5df8..09c91072 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/CallbackRecordController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/CallbackRecordController.java @@ -1,14 +1,16 @@ package org.dromara.daxpay.controller.record; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.record.TradeCallbackRecordQuery; -import org.dromara.daxpay.service.result.record.callback.TradeCallbackRecordResult; -import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.record.TradeCallbackRecordQuery; +import org.dromara.daxpay.service.pay.result.record.callback.TradeCallbackRecordResult; +import org.dromara.daxpay.service.pay.service.record.callback.TradeCallbackRecordService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; @@ -27,6 +29,7 @@ import org.springframework.web.bind.annotation.RestController; @Validated @Tag(name = "交易记录") @RestController +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(groupCode = "TradeCallback", groupName = "交易回调记录", moduleCode = "TradeRecord", moduleName = "(DaxPay)交易记录") @RequestMapping("/record/callback") @RequiredArgsConstructor diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/PayCloseRecordController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/PayCloseRecordController.java index f7c857ea..9620788b 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/PayCloseRecordController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/PayCloseRecordController.java @@ -1,14 +1,16 @@ package org.dromara.daxpay.controller.record; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.record.PayCloseRecordQuery; -import org.dromara.daxpay.service.result.record.close.PayCloseRecordResult; -import org.dromara.daxpay.service.service.record.close.PayCloseRecordService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.record.PayCloseRecordQuery; +import org.dromara.daxpay.service.pay.result.record.close.PayCloseRecordResult; +import org.dromara.daxpay.service.pay.service.record.close.PayCloseRecordService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; @@ -28,6 +30,7 @@ import org.springframework.web.bind.annotation.RestController; @Tag(name = "支付订单关闭记录") @RestController @RequestMapping("/record/close") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(moduleCode = "TradeRecord", groupCode = "CloseRecord", groupName = "支付关闭记录") @RequiredArgsConstructor public class PayCloseRecordController { diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/TradeFlowRecordController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/TradeFlowRecordController.java index f6abdeba..380defef 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/TradeFlowRecordController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/TradeFlowRecordController.java @@ -1,15 +1,17 @@ package org.dromara.daxpay.controller.record; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.record.TradeFlowRecordQuery; -import org.dromara.daxpay.service.result.record.flow.TradeFlowAmountResult; -import org.dromara.daxpay.service.result.record.flow.TradeFlowRecordResult; -import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.record.TradeFlowRecordQuery; +import org.dromara.daxpay.service.pay.result.record.flow.TradeFlowAmountResult; +import org.dromara.daxpay.service.pay.result.record.flow.TradeFlowRecordResult; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; @@ -29,6 +31,7 @@ import org.springframework.web.bind.annotation.RestController; @Tag(name = "交易流水记录控制器") @RestController @RequestMapping("/record/flow") +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(moduleCode = "TradeRecord", groupCode = "TradeFlow", groupName = "交易流水记录") @RequiredArgsConstructor public class TradeFlowRecordController { diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/TradeSyncRecordController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/TradeSyncRecordController.java index cea63f43..28f966d9 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/TradeSyncRecordController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/record/TradeSyncRecordController.java @@ -1,14 +1,16 @@ package org.dromara.daxpay.controller.record; +import cn.bootx.platform.core.annotation.ClientCode; import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; -import org.dromara.daxpay.service.param.record.TradeSyncRecordQuery; -import org.dromara.daxpay.service.result.record.sync.TradeSyncRecordResult; -import org.dromara.daxpay.service.service.record.sync.TradeSyncRecordService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.param.record.TradeSyncRecordQuery; +import org.dromara.daxpay.service.pay.result.record.sync.TradeSyncRecordResult; +import org.dromara.daxpay.service.pay.service.record.sync.TradeSyncRecordService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; @@ -27,6 +29,7 @@ import org.springframework.web.bind.annotation.RestController; @Validated @Tag(name = "交易同步记录") @RestController +@ClientCode({DaxPayCode.Client.ADMIN, DaxPayCode.Client.MERCHANT}) @RequestGroup(moduleCode = "TradeRecord", groupCode = "TradeSync", groupName = "交易同步记录") @RequestMapping("/record/sync") @RequiredArgsConstructor diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/code/MerchantTypeGroup.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/code/MerchantTypeGroup.java deleted file mode 100644 index ec0a55e3..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/code/MerchantTypeGroup.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.core.code; - -/** - * 商户类型. 用于分组校验 - * @author xxm - * @since 2024/11/4 - */ -public interface MerchantTypeGroup { - - /** 普通商户 */ - interface common{} - /** 特约商户 */ - interface partner{} -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/CallbackLocal.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/CallbackLocal.java index dab9b207..3a4b0701 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/CallbackLocal.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/CallbackLocal.java @@ -1,10 +1,6 @@ package org.dromara.daxpay.core.context; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.core.enums.CallbackStatusEnum; -import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.core.enums.TransferStatusEnum; +import org.dromara.daxpay.core.enums.*; import lombok.Data; import lombok.experimental.Accessors; @@ -62,6 +58,9 @@ public class CallbackLocal { /** 金额(元) */ private BigDecimal amount; + /** 实际金额(元) */ + private BigDecimal realAmount; + /** 完成时间(支付/退款) */ private LocalDateTime finishTime; @@ -77,4 +76,38 @@ public class CallbackLocal { * @see CallbackStatusEnum */ private CallbackStatusEnum callbackStatus = CallbackStatusEnum.SUCCESS; + + /* 扩展参数 */ + + /** 付款用户ID */ + private String buyerId; + + /** 用户标识 */ + private String userId; + + /** + * 支付产品 + * 三方通道所使用的支付产品或类型 + */ + private String tradeProduct; + + /** + * 交易方式 + */ + private String tradeWay; + + /** + * 银行卡类型 + * 借记卡/贷记卡 + */ + private String bankType; + + /** + * 透传账号 + * 三方通道使用微信/支付宝/银联支付时产生的订单号 + */ + private String transOrderNo; + + /** 参加活动类型 */ + private String promotionType; } diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentClientLocal.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentClientLocal.java index fc2b7425..42956243 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentClientLocal.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentClientLocal.java @@ -12,7 +12,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) public class PaymentClientLocal { - /** 客户端ip */ + /** 客户端IP */ private String clientIp; /** 请求IP */ diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentContext.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentContext.java index 378a9a30..a1d960b2 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentContext.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentContext.java @@ -17,7 +17,7 @@ public class PaymentContext { * 接收到回调时,会进行初始化 * 接收到消息通知时是, 会进行初始化 */ - private final MchAppLocal mchAppInfo = new MchAppLocal(); + private final PaymentReqInfoLocal reqInfo = new PaymentReqInfoLocal(); /** 请求终端信息 */ private final PaymentClientLocal clientInfo = new PaymentClientLocal(); diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/MchAppLocal.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentReqInfoLocal.java similarity index 70% rename from daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/MchAppLocal.java rename to daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentReqInfoLocal.java index 99f79d1a..f445bcc3 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/MchAppLocal.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/context/PaymentReqInfoLocal.java @@ -1,47 +1,42 @@ package org.dromara.daxpay.core.context; +import org.dromara.daxpay.core.enums.*; import lombok.Data; import lombok.experimental.Accessors; -import org.dromara.daxpay.core.enums.MchAppStatusEnum; -import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; -import org.dromara.daxpay.core.enums.MerchantStatusEnum; -import org.dromara.daxpay.core.enums.MerchantTypeEnum; import java.math.BigDecimal; /** - * 商户应用及相关信息 + * 调用请求和配置及相关信息 * @author xxm * @since 2024/6/27 */ @Data @Accessors(chain = true) -public class MchAppLocal { +public class PaymentReqInfoLocal { + /* 公共配置 */ /** 支付网关地址 */ private String gatewayServiceUrl; - /** 网关移动端地址 */ - private String gatewayMobileUrl; + /** 网关H5端地址 */ + private String gatewayH5Url; + + /* 商户相关信息 */ /** 商户号 */ - private final String mchNo = "M001"; + private String mchNo; /** 商户名称 */ - private final String mchName = "默认商户"; - - /** - * 商户类型 - * @see MerchantTypeEnum - */ - private final String mchType = MerchantTypeEnum.COMMON.getCode(); + private String mchName; /** * 商户状态 * @see MerchantStatusEnum */ - private final String mchStatus = MerchantStatusEnum.ENABLE.getCode(); + private String mchStatus; + /* 商户应用信息 */ /** 应用号 */ private String appId; diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocDetailResultEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocDetailResultEnum.java deleted file mode 100644 index 93d2368a..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocDetailResultEnum.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.dromara.daxpay.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 分账明细处理结果 - * 字典: alloc_detail_result - * @author xxm - * @since 2024/4/16 - */ -@Getter -@AllArgsConstructor -public enum AllocDetailResultEnum { - - PENDING("pending", "待分账"), - SUCCESS("success", "分账成功"), - FAIL("fail", "分账失败"), - /** 金额为0时不进行分账 */ - IGNORE("ignore", "忽略分账"), - ; - - private final String code; - private final String name; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocOrderResultEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocOrderResultEnum.java deleted file mode 100644 index 9b754105..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocOrderResultEnum.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.daxpay.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 分账订单处理结果 - * @author xxm - * @since 2024/4/16 - */ -@Getter -@AllArgsConstructor -public enum AllocOrderResultEnum { - - ALL_PENDING("all_pending", "处理中"), - ALL_SUCCESS("all_success", "全部成功"), - PART_SUCCESS("part_success", "部分成功"), - ALL_FAILED("all_failed", "全部失败"), - ; - - private final String code; - private final String name; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocOrderStatusEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocOrderStatusEnum.java deleted file mode 100644 index 2e9f18c4..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocOrderStatusEnum.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.dromara.daxpay.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 分账状态枚举 - * @author xxm - * @since 2024/4/7 - */ -@Getter -@AllArgsConstructor -public enum AllocOrderStatusEnum { - - ALLOC_PROCESSING("alloc_processing", "分账处理中"), - ALLOC_END("alloc_end", "分账完成"), - ALLOC_FAILED("alloc_failed", "分账失败"), - FINISH("finish", "完结"), - FINISH_FAILED("finish_failed", "完结失败"), - ; - - final String code; - final String name; - -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocReceiverTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocReceiverTypeEnum.java deleted file mode 100644 index 8bde20e2..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocReceiverTypeEnum.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.dromara.daxpay.core.enums; - -import cn.bootx.platform.core.exception.DataNotExistException; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 分账接收方类型 - * alloc_receiver_type - * @author xxm - * @since 2024/4/1 - */ -@Getter -@AllArgsConstructor -public enum AllocReceiverTypeEnum { - /** 商户号 */ - MERCHANT_NO("merchant_no", "商户号"), - /** userId */ - USER_ID("user_id", "用户ID"), - /** openId */ - OPEN_ID("open_id", "openId"), - /** 账号 */ - LOGIN_NAME("login_name", "登录账号"); - - /** 编码 */ - private final String code; - /** 名称 */ - private final String name; - - /** - * 根据编码查找 - */ - public static AllocReceiverTypeEnum findByCode(String code) { - return Arrays.stream(AllocReceiverTypeEnum.values()) - .filter(e -> e.getCode().equals(code)) - .findFirst() - .orElseThrow(() -> new DataNotExistException("未找到对应的分账接收方类型")); - } - -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocRelationTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocRelationTypeEnum.java deleted file mode 100644 index 7b4a2627..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocRelationTypeEnum.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.dromara.daxpay.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 分账关系类型 - * 字典 alloc_relation_type - * @author xxm - * @since 2024/3/27 - */ -@Getter -@AllArgsConstructor -public enum AllocRelationTypeEnum { - SERVICE_PROVIDER("service_provider","服务商"), - STORE("store","门店"), - STAFF("staff","员工"), - STORE_OWNER("store_owner","店主"), - PARTNER("partner","合作伙伴"), - HEADQUARTER("headquarter","总部"), - BRAND("brand","品牌方"), - DISTRIBUTOR("distributor","分销商"), - USER("user","用户"), - SUPPLIER("supplier","供应商"), - CUSTOM("custom","自定义"); - - private final String code; - private final String name; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java deleted file mode 100644 index 7d88671d..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.dromara.daxpay.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 分账订单处理结果 - * 字典: allocation_result - * @author xxm - * @since 2024/4/16 - */ -@Getter -@AllArgsConstructor -public enum AllocationResultEnum { - - ALL_PENDING("all_pending", "处理中"), - ALL_SUCCESS("all_success", "全部成功"), - PART_SUCCESS("part_success", "部分成功"), - ALL_FAILED("all_failed", "全部失败"), - ; - - private final String code; - private final String name; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java deleted file mode 100644 index 851eb7b7..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.dromara.daxpay.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 分账状态枚举 - * 字典 allocation_status - * @author xxm - * @since 2024/4/7 - */ -@Getter -@AllArgsConstructor -public enum AllocationStatusEnum { - - PROCESSING("processing", "分账处理中"), - ALLOC_END("alloc_end", "分账处理完成"), - ALLOC_FAILED("alloc_failed", "分账失败"), - FINISH("finish", "分账完结"), - FINISH_FAILED("finish_failed", "完结失败"), - IGNORE("ignore", "忽略"), - ; - - final String code; - final String name; - -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierAmountTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierAmountTypeEnum.java new file mode 100644 index 00000000..b838699e --- /dev/null +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierAmountTypeEnum.java @@ -0,0 +1,19 @@ +package org.dromara.daxpay.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 收银码金额类型枚举 + * @author xxm + * @since 2025/7/5 + */ +@Getter +@AllArgsConstructor +public enum CashierAmountTypeEnum { + FIXED("fixed","固定金额"), + RANDOM("random","任意金额"), + ; + private final String code; + private final String name; +} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierCodeTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierSceneEnum.java similarity index 66% rename from daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierCodeTypeEnum.java rename to daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierSceneEnum.java index 0cc799f0..bb3e8804 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierCodeTypeEnum.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/CashierSceneEnum.java @@ -8,24 +8,24 @@ import java.util.Arrays; import java.util.Objects; /** - * 码牌收银台类型 - * 字典: cashier_code_type + * 收银支付场景类型 + * 字典: cashier_code_type -> cashier_scene * @author xxm * @since 2024/9/28 */ @Getter @AllArgsConstructor -public enum CashierCodeTypeEnum { +public enum CashierSceneEnum { - WECHAT_PAY("wechat_pay", "微信码牌"), - ALIPAY("alipay", "支付宝码牌"), - UNION_PAY("union_pay", "云闪付码牌"), + WECHAT_PAY("wechat_pay", "微信支付"), + ALIPAY("alipay", "支付宝支付"), + UNION_PAY("union_pay", "云闪付支付"), ; private final String code; private final String name; - public static CashierCodeTypeEnum findByCode(String code) { + public static CashierSceneEnum findByCode(String code) { return Arrays.stream(values()) .filter(item -> Objects.equals(item.code, code)) .findFirst() diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelAuthTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelAuthTypeEnum.java index aee41dea..fe5fff0b 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelAuthTypeEnum.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelAuthTypeEnum.java @@ -9,7 +9,7 @@ import java.util.Objects; /** * 通道认证类型 - * 字典值: channel_auth_type_enum + * 字典值: channel_auth_type * @author xxm * @since 2025/4/7 */ @@ -28,7 +28,7 @@ public enum ChannelAuthTypeEnum { return Arrays.stream(values()) .filter(item -> Objects.equals(item.code, code)) .findFirst() - .orElseThrow(() -> new ConfigNotExistException("退款状态不存在")); + .orElseThrow(() -> new ConfigNotExistException("认证类型不存在")); } } diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java index 573002b8..4ca138ae 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java @@ -30,9 +30,13 @@ public enum ChannelEnum { VBILL_PAY("vbill_pay"), /** 汇付天下AdaPay */ ADA_PAY("ada_pay"), - /** 通联支付 */ - ALLIN_PAY("allin_pay"), - /** 拉卡拉支付 */ + /** 通联支付(云商通二代) */ + ALLIN_YST2("allin_yst2"), + /** 通联支付(收银宝) */ + ALLIN_SYB("allin_syb"), + /** 海科融通 */ + HKRT_PAY("hkrt_pay"), + /** 拉卡拉 */ LAKALA_PAY("lakala_pay"), /** 富友支付 */ FU_YOU("fu_you"), diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelTerminalStatusEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelTerminalStatusEnum.java new file mode 100644 index 00000000..546df86c --- /dev/null +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/ChannelTerminalStatusEnum.java @@ -0,0 +1,23 @@ +package org.dromara.daxpay.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通道终端设备报备状态 + * 字典: channel_terminal_status + * @author xxm + * @since 2025/3/9 + */ +@Getter +@AllArgsConstructor +public enum ChannelTerminalStatusEnum { + + WAIT("wait", "未报送"), + SUBMIT("submit", "已报送"), + LOGGED("logged", "已注销"), + ERROR("error", "错误"); + + private final String code; + private final String name; +} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvApplyStatusEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvApplyStatusEnum.java new file mode 100644 index 00000000..323a95d1 --- /dev/null +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvApplyStatusEnum.java @@ -0,0 +1,39 @@ +package org.dromara.daxpay.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 进件申请状态 + * 字典: isv_apply_status + * @author xxm + * @since 2024/11/16 + */ +@Getter +@AllArgsConstructor +public enum IsvApplyStatusEnum { + /** 草稿 */ + DRAFT("draft", "草稿"), + /** 预审(暂时不用) */ + PRE_TRIAL("pre_trial", "预审"), + /** 预审拒绝(暂时不用) */ + PRE_TRIAL_REJECT("pre_trial_reject", "预审拒绝"), + /** 申请中 */ + APPLY("apply", "申请中"), + /** 驳回 */ + REJECT("reject", "驳回"), + /** 待签署 */ + SIGN("sign", "待签署"), + /** 开通中 */ + OPENING("opening", "开通中"), + /** 通过 */ + PASS("pass", "通过"), + /** 已生成进件商户 */ + GENERATED("generated", "已生成进件商户"), + /** 关闭 */ + CLOSED("closed", "关闭"); + + + private final String code; + private final String name; +} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvApplyTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvApplyTypeEnum.java new file mode 100644 index 00000000..34e8b3cc --- /dev/null +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvApplyTypeEnum.java @@ -0,0 +1,23 @@ +package org.dromara.daxpay.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 进件类型 + * 字典: + * @author xxm + * @since 2025/1/5 + */ +@Getter +@AllArgsConstructor +public enum IsvApplyTypeEnum { + FACE_TO_FACE("face_to_face", "当面付"), + APP("app", "APP"), + OTHER("other", "其他"), + MERCHANT("merchant", "商户进件"), + ; + + private final String code; + private final String name; +} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvStatusEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvStatusEnum.java new file mode 100644 index 00000000..3d9f6266 --- /dev/null +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/IsvStatusEnum.java @@ -0,0 +1,26 @@ +package org.dromara.daxpay.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 服务商状态 + * @author xxm + * @since 2024/10/29 + */ +@Getter +@AllArgsConstructor +public enum IsvStatusEnum { + + /** + * 禁用 + */ + DISABLED("disabled", "禁用"), + /** + * 启用 + */ + ENABLE("enable", "启用"); + + private final String code; + private final String name; +} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/MerchantTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/MerchantTypeEnum.java deleted file mode 100644 index eecc4cfb..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/MerchantTypeEnum.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.dromara.daxpay.core.enums; - -import org.dromara.daxpay.core.exception.ConfigNotExistException; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 商户类型 - * 字典: merchant_type - * @author xxm - * @since 2024/10/29 - */ -@Getter -@AllArgsConstructor -public enum MerchantTypeEnum { - - /** 普通商户 */ - COMMON("common", "普通商户"), - - /** 特约商户 */ - PARTNER("partner", "特约商户"), - - /** 代理商 */ - AGENT("agent", "代理商"), - ; - - private final String code; - private final String name; - - /** - * 根据编码查找 - */ - public static MerchantTypeEnum findByCode(String code) { - return Arrays.stream(values()) - .filter(e -> e.getCode().equals(code)) - .findFirst() - .orElseThrow(() -> new ConfigNotExistException("未找到对应的商户类型")); - } -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/PayMethodEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/PayMethodEnum.java index c879eb9f..d6c432af 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/PayMethodEnum.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/PayMethodEnum.java @@ -17,24 +17,19 @@ import java.util.Objects; @AllArgsConstructor public enum PayMethodEnum { - /** wap支付 */ - WAP("wap"), - /** 应用支付 */ - APP("app"), - /** web支付 */ - WEB("web"), - /** 扫码支付 */ - QRCODE("qrcode"), - /** 付款码支付 */ - BARCODE("barcode"), - /** 小程序支付 */ - JSAPI("jsapi"), - /** 其他支付 */ - OTHER("other"), + WAP("wap", "H5支付"), + APP("app", "应用支付"), + WEB("web", "PC支付"), + QRCODE("qrcode", "扫码支付"), + BARCODE("barcode", "付款码支付"), + JSAPI("jsapi", "Jsapi支付"), + OTHER("other", "其他支付方式"), ; /** 编码 */ private final String code; + /** 名称 */ + private final String name; /** * 根据编码获取枚举 diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TerminalTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TerminalTypeEnum.java new file mode 100644 index 00000000..87700b5d --- /dev/null +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TerminalTypeEnum.java @@ -0,0 +1,24 @@ +package org.dromara.daxpay.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 终端报送类型 + * 字典: terminal_type + * @author xxm + * @since 2025/3/12 + */ +@Getter +@AllArgsConstructor +public enum TerminalTypeEnum { + + COMM("comm", "标准上报"), + WECHAT("wechat", "微信渠道报送"), + ALIPAY("alipay", "支付宝渠道报送"), + UNION("union", "云闪付渠道报送"), + ; + + private final String code; + private final String name; +} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TradeTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TradeTypeEnum.java index 9f9198c0..313697c2 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TradeTypeEnum.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TradeTypeEnum.java @@ -20,6 +20,8 @@ public enum TradeTypeEnum { REFUND("refund","退款"), TRANSFER("transfer","转账"), ALLOCATION("allocation","分账"), + CASHOUTS("cashouts","提现"), + SETTLE("settle","结算"), ; private final String code; diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/WalletFlowTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/WalletFlowTypeEnum.java new file mode 100644 index 00000000..360e9247 --- /dev/null +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/WalletFlowTypeEnum.java @@ -0,0 +1,23 @@ +package org.dromara.daxpay.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 钱包流水类型 + * 字典: wallet_flow_type + * @author xxm + * @since 2025/6/23 + */ +@Getter +@AllArgsConstructor +public enum WalletFlowTypeEnum { + ORDER_PROFIT("order_profit","订单分润"), + REFUND_PROFIT("refund_profit","退款轧差"), + WITHDRAW("withdraw","提现"), + ADJUST("adjust","人工调账"), + ; + private final String code; + private final String name; + +} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/PaymentCommonParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/PaymentCommonParam.java index 2d7c7e56..13db8d33 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/PaymentCommonParam.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/PaymentCommonParam.java @@ -20,6 +20,12 @@ import java.time.LocalDateTime; @Schema(title = "支付公共参数") public abstract class PaymentCommonParam { + /** 商户号 */ + @Schema(description = "商户号") + @NotBlank(message = "商户号不可为空") + @Size(max = 32, message = "商户号不可超过32位") + private String mchNo; + /** 应用号 */ @Schema(description = "应用号") @NotBlank(message = "应用号不可为空") diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocFinishParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocFinishParam.java deleted file mode 100644 index dedd72d4..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocFinishParam.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.daxpay.core.param.allocation.order; - -import org.dromara.daxpay.core.param.PaymentCommonParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 分账完结参数 - * @author xxm - * @since 2024/4/7 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "分账请求参数") -public class AllocFinishParam extends PaymentCommonParam { - - @Schema(description = "商户分账单号") - private String bizAllocNo; - - @Schema(description = "分账单号") - private String allocNo; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocSyncParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocSyncParam.java deleted file mode 100644 index e22c1438..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocSyncParam.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.dromara.daxpay.core.param.allocation.order; - -import org.dromara.daxpay.core.param.PaymentCommonParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 分账同步请求参数 - * @author xxm - * @since 2024/4/12 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "分账同步请求参数") -public class AllocSyncParam extends PaymentCommonParam { - - @Schema(description = "分账号") - @Size(max = 32, message = "分账号不可超过32位") - private String allocNo; - - @Schema(description = "商户分账号") - @Size(max = 100, message = "商户分账号不可超过100位") - private String bizAllocNo; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocationParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocationParam.java deleted file mode 100644 index fee3e9fb..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocationParam.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.dromara.daxpay.core.param.allocation.order; - -import org.dromara.daxpay.core.param.PaymentCommonParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.Valid; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.util.List; - -/** - * 分账请求参数 - * @author xxm - * @since 2024/11/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "分账请求参数") -public class AllocationParam extends PaymentCommonParam { - /** 商户分账单号 */ - @NotBlank(message = "商户分账单号不可为空") - @Size(max = 100, message = "商户分账单号不可超过100位") - @Schema(description = "商户分账单号") - private String bizAllocNo; - - /** 支付订单号 */ - @Size(max = 100, message = "支付订单号不可超过100位") - @Schema(description = "支付订单号") - private String orderNo; - - /** 商户支付订单号 */ - @Size(max = 100, message = "商户支付订单号不可超过100位") - @Schema(description = "商户支付订单号") - private String bizOrderNo; - - /** 通道订单号 */ - @Schema(description = "通道订单号") - @Size(max = 150, message = "通道支付订单号不可超过150位") - private String outOrderNo; - - /** 分账标题 */ - @Size(max = 100, message = "分账描述不可超过100位") - @Schema(description = "分账标题") - private String title; - - /** 分账描述 */ - @Size(max = 150, message = "分账描述不可超过150位") - @Schema(description = "分账描述") - private String description; - - /** - * 优先级 分账接收方列表 > 分账组编号 > 默认分账组 - */ - @Size(max = 32, message = "分账组编号不可超过32位") - @Schema(description = "分账组编号") - private String groupNo; - - /** 分账接收方列表 */ - @Schema(description = "分账接收方列表") - @Valid - private List receivers; - - /** 回调通知地址 */ - @Size(max = 200, message = "回调通知地址不可超过200位") - @Schema(description = "回调通知地址") - private String notifyUrl; - - /** 商户扩展参数,回调时会原样返回 */ - @Size(max = 500, message = "商户扩展参数不可超过500位") - @Schema(description = "商户扩展参数") - private String attach; - - /** - * 分账接收方列表 - */ - @Data - @Accessors(chain = true) - @Schema(title = "分账接收方列表") - public static class ReceiverParam { - - /** 分账接收方编号 */ - @Schema(description = "分账接收方编号") - @NotBlank(message = "分账接收方编号必填") - @Size(max = 32, message = "分账接收方编号不可超过32位") - private String receiverNo; - - /** 分账金额 */ - @Schema(description = "分账金额") - @NotNull(message = "分账金额必填") - @Min(value = 1,message = "分账金额至少为0.01元") - private BigDecimal amount; - } - -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/QueryAllocOrderParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/QueryAllocOrderParam.java deleted file mode 100644 index b027fa04..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/QueryAllocOrderParam.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.daxpay.core.param.allocation.order; - -import org.dromara.daxpay.core.param.PaymentCommonParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 分账订单查询参数 - * @author xxm - * @since 2024/4/7 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "支付订单查询参数") -public class QueryAllocOrderParam extends PaymentCommonParam { - - @Schema(description = "分账单号") - private String allocNo; - - @Schema(description = "商户分账单号") - private String bizAllocNo; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverAddParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverAddParam.java deleted file mode 100644 index 8dc1242e..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverAddParam.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.dromara.daxpay.core.param.allocation.receiver; - -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.AllocRelationTypeEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.core.param.PaymentCommonParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - - -/** - * 分账接收者添加参数 - * @author xxm - * @since 2024/5/20 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "分账接收者添加参数") -public class AllocReceiverAddParam extends PaymentCommonParam { - - @Schema(description = "接收者编号, 需要保证唯一") - @NotBlank(message = "接收者编号必填") - @Size(max = 32, message = "接收者编号不可超过32位") - private String receiverNo; - - @Schema(description = "接收方名称") - @Size(max = 50, message = "接收方名称不可超过50位") - private String name; - - /** - * 所属通道 - * @see ChannelEnum - */ - @Schema(description = "所属通道") - @NotBlank(message = "所属通道必填") - @Size(max = 32, message = "所属通道不可超过32位") - private String channel; - - /** - * 分账接收方类型 根据不同类型的通道进行传输 - * @see AllocReceiverTypeEnum - */ - @Schema(description = "分账接收方类型") - @NotBlank(message = "分账接收方类型必填") - @Size(max = 32, message = "分账接收方类型不可超过32位") - private String receiverType; - - /** 接收方账号 */ - @Schema(description = "接收方账号") - @NotBlank(message = "接收方账号必填") - @Size(max = 100, message = "接收方账号不可超过100位") - private String receiverAccount; - - /** 接收方姓名 */ - @Schema(description = "接收方姓名") - @Size(max = 100, message = "接收方姓名不可超过50位") - private String receiverName; - - /** - * 分账关系类型 - * @see AllocRelationTypeEnum - */ - @Schema(description = "分账关系类型") - @NotBlank(message = "分账关系类型必填") - @Size(max = 32, message = "分账关系类型不可超过32位") - private String relationType; - - /** 关系名称 关系类型为自定义是填写 */ - @Schema(description = "关系名称") - @Size(max = 50, message = "关系名称不可超过50位") - private String relationName; - -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverQueryParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverQueryParam.java deleted file mode 100644 index 29cd5e5f..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverQueryParam.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.dromara.daxpay.core.param.allocation.receiver; - -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.core.param.PaymentCommonParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 分账接收方查询参数 - * @author xxm - * @since 2024/10/22 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "分账接收方") -public class AllocReceiverQueryParam extends PaymentCommonParam { - /** - * 所属通道 - * @see ChannelEnum - */ - @Schema(description = "所属通道") - @NotBlank(message = "所属通道必填") - @Size(max = 32, message = "所属通道不可超过32位") - private String channel; - -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverRemoveParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverRemoveParam.java deleted file mode 100644 index 195cbaea..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverRemoveParam.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.dromara.daxpay.core.param.allocation.receiver; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 分账接收者删除参数 - * @author xxm - * @since 2024/5/20 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账接收者删除参数") -public class AllocReceiverRemoveParam { - - @Schema(description = "接收者编号") - @NotBlank(message = "接收者编号必填") - @Size(max = 32, message = "接收者编号不可超过32位") - private String receiverNo; - -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodeAuthParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodeAuthParam.java index 3848e536..8ccaeb75 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodeAuthParam.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodeAuthParam.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.core.param.gateway; -import org.dromara.daxpay.core.enums.CashierCodeTypeEnum; +import org.dromara.daxpay.core.enums.CashierSceneEnum; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -23,12 +23,12 @@ public class GatewayCashierCodeAuthParam { private String cashierCode; /** - * 码牌类型 - * @see CashierCodeTypeEnum + * 支付场景 + * @see CashierSceneEnum */ - @NotBlank(message = "码牌类型不可为空") - @Schema(description = "码牌类型") - private String cashierType; + @NotBlank(message = "支付场景不可为空") + @Schema(description = "支付场景") + private String cashierScene; /** 认证Code */ @NotNull(message = "认证Code不可为空") diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodeAuthUrlParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodeAuthUrlParam.java index 1aa87f58..a5a2ad17 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodeAuthUrlParam.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodeAuthUrlParam.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.core.param.gateway; -import org.dromara.daxpay.core.enums.CashierCodeTypeEnum; +import org.dromara.daxpay.core.enums.CashierSceneEnum; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import lombok.Data; @@ -22,10 +22,10 @@ public class GatewayCashierCodeAuthUrlParam { private String cashierCode; /** - * 码牌类型 - * @see CashierCodeTypeEnum + * 支付场景 + * @see CashierSceneEnum */ - @NotBlank(message = "码牌类型不可为空") - @Schema(description = "码牌类型") - private String cashierType; + @NotBlank(message = "支付场景不可为空") + @Schema(description = "支付场景") + private String cashierScene; } diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodePayParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodePayParam.java index 68f3651b..ed27f864 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodePayParam.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayCashierCodePayParam.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.core.param.gateway; -import org.dromara.daxpay.core.enums.CashierCodeTypeEnum; +import org.dromara.daxpay.core.enums.CashierSceneEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; @@ -17,18 +17,18 @@ import java.math.BigDecimal; @Schema(title = "收银码牌支付参数") public class GatewayCashierCodePayParam { - @Schema(description = "码牌明细ID") + @Schema(description = "码牌code") private String cashierCode; @Schema(description = "支付金额") private BigDecimal amount; /** - * 码牌类型 - * @see CashierCodeTypeEnum + * 支付场景 + * @see CashierSceneEnum */ - @Schema(description = "码牌类型") - private String cashierType; + @Schema(description = "支付场景") + private String cashierScene; @Schema(description = "唯一标识") private String openId; diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayPayParam.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayPayParam.java index 559518ac..88cf4496 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayPayParam.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/param/gateway/GatewayPayParam.java @@ -41,6 +41,11 @@ public class GatewayPayParam extends PaymentCommonParam { @Size(max = 500, message = "支付描述不可超过500位") private String description; + /** 自定义OpenId 微信类通道可用 */ + @Schema(description = "自定义OpenId") + @Size(max = 64, message = "自定义OpenId不可超过64位") + private String openId; + /** * 网关支付类型 * @see GatewayPayTypeEnum @@ -57,6 +62,7 @@ public class GatewayPayParam extends PaymentCommonParam { @Schema(description = "自动分账") private Boolean autoAllocation; + /** * 限制用户支付类型, 目前支持限制信用卡 * @see PayLimitPayEnum diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/DaxNoticeResult.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/DaxNoticeResult.java index ab816320..13eecc24 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/DaxNoticeResult.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/DaxNoticeResult.java @@ -22,6 +22,10 @@ public class DaxNoticeResult extends DaxResult{ @Schema(description = "通知类型") private String noticeType; + /** 商户号 */ + @Schema(description = "商户号") + private String mchNo; + /** 应用ID */ @Schema(description = "应用ID") private String appId; diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java deleted file mode 100644 index d8f84c78..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.dromara.daxpay.core.result.allocation; - -import org.dromara.daxpay.core.enums.AllocationResultEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 分账同步接口返回类 - * @author xxm - * @since 2024/5/20 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账同步接口") -public class AllocSyncResult { - - /** - * 分账状态 - * @see AllocationStatusEnum - */ - @Schema(description = "分账状态") - private String status; - - /** - * 分账结果 - * @see AllocationResultEnum - */ - @Schema(description = "分账结果") - private String result; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java deleted file mode 100644 index 62ab75c3..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.dromara.daxpay.core.result.allocation; - -import org.dromara.daxpay.core.enums.AllocationResultEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 分账请求结果 - * @author xxm - * @since 2024/4/7 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账请求结果") -public class AllocationResult { - /** 分账订单号 */ - @Schema(description = "分账订单号") - private String allocNo; - - /** 商户分账订单号 */ - @Schema(description = "商户分账订单号") - private String bizAllocNo; - - /** - * 分账状态 - * @see AllocationStatusEnum - */ - @Schema(description = "分账状态") - private String status; - - /** - * 分账结果 - * @see AllocationResultEnum - */ - @Schema(description = "分账结果") - private String result; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java deleted file mode 100644 index 25557dab..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dromara.daxpay.core.result.allocation.order; - -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 分账订单明细 - * @author xxm - * @since 2024/5/21 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账订单明细") -public class AllocDetailResult { - - @Schema(description = "分账接收方编号") - private String receiverNo; - - /** 分账金额 */ - @Schema(description = "分账金额") - private BigDecimal amount; - - /** 分账比例 */ - @Schema(description = "分账比例(百分之多少)") - private BigDecimal rate; - - /** - * 分账接收方类型 - * @see AllocReceiverTypeEnum - */ - @Schema(description = "分账接收方类型") - private String receiverType; - - /** 接收方账号 */ - @Schema(description = "接收方账号") - private String receiverAccount; - - /** 接收方姓名 */ - @Schema(description = "接收方姓名") - private String receiverName; - - /** - * 分账结果 - * @see AllocDetailResultEnum - */ - @Schema(description = "分账结果") - private String result; - - /** 错误代码 */ - @Schema(description = "错误代码") - private String errorCode; - - /** 错误原因 */ - @Schema(description = "错误原因") - private String errorMsg; - - /** 分账完成时间 */ - @Schema(description = "分账完成时间") - private LocalDateTime finishTime; -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java deleted file mode 100644 index d2f5ccd7..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.dromara.daxpay.core.result.allocation.order; - -import org.dromara.daxpay.core.enums.AllocationResultEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 分账订单 - * @author xxm - * @since 2024/5/21 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账订单") -public class AllocOrderResult { - - /** 分账单号 */ - @Schema(description = "分账单号") - private String allocNo; - - /** 商户分账单号 */ - @Schema(description = "商户分账单号") - private String bizAllocNo; - - /** 通道分账号 */ - @Schema(description = "通道分账号") - private String outAllocNo; - - /** - * 支付订单号 - */ - @Schema(description = "支付订单号") - private String orderNo; - - /** 商户支付订单号 */ - @Schema(description = "商户支付订单号") - private String bizOrderNo; - - /** 通道支付订单号 */ - @Schema(description = "通道支付订单号") - private String outOrderNo; - - /** - * 支付订单标题 - */ - @Schema(description = "支付订单标题") - private String title; - - /** - * 所属通道 - * @see ChannelEnum - */ - @Schema(description = "所属通道") - private String channel; - - /** - * 总分账金额 - */ - @Schema(description = "总分账金额") - private BigDecimal amount; - - /** - * 分账描述 - */ - @Schema(description = "分账描述") - private String description; - - /** - * 状态 - * @see AllocationStatusEnum - */ - @Schema(description = "状态") - private String status; - - /** - * 处理结果 - * @see AllocationResultEnum - */ - @Schema(description = "处理结果") - private String result; - - /** - * 错误码 - */ - @Schema(description = "错误码") - private String errorCode; - - /** - * 错误信息 - */ - @Schema(description = "错误原因") - private String errorMsg; - - /** 分账订单完成时间 */ - @Schema(description = "分账订单完成时间") - private LocalDateTime finishTime; - - /** 分账明细 */ - @Schema(description = "分账明细") - private List details; - -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/receiver/AllocReceiverResult.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/receiver/AllocReceiverResult.java deleted file mode 100644 index 41e838c8..00000000 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/allocation/receiver/AllocReceiverResult.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.dromara.daxpay.core.result.allocation.receiver; - -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * 分账接收方 - * @author xxm - * @since 2024/3/28 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账接收方") -public class AllocReceiverResult { - - @Schema(description = "接收方列表") - private List receivers; - - @Data - @Accessors(chain = true) - public static class Receiver{ - @Schema(description = "接收方编号") - private String receiverNo; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - @Schema(description = "接收方类型") - private String receiverType; - - @Schema(description = "接收方账号") - private String receiverAccount; - - /** - * 所属通道 - * @see ChannelEnum - */ - @Schema(description = "所属通道") - private String channel; - - } -} diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/trade/pay/PayOrderResult.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/trade/pay/PayOrderResult.java index c6a88a8a..34b9d1f9 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/trade/pay/PayOrderResult.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/result/trade/pay/PayOrderResult.java @@ -1,9 +1,9 @@ package org.dromara.daxpay.core.result.trade.pay; +import org.dromara.daxpay.core.enums.*; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; -import org.dromara.daxpay.core.enums.*; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -78,6 +78,10 @@ public class PayOrderResult { @Schema(description = "金额") private BigDecimal amount; + /** 实收金额 */ + @Schema(description = "实收金额") + private BigDecimal realAmount; + /** 可退款余额 */ @Schema(description = "可退款余额") private BigDecimal refundableBalance; @@ -103,6 +107,13 @@ public class PayOrderResult { @Schema(description = "分账状态") private String allocStatus; + /** + * 结算状态 + * @see SettleStatusEnum + */ + @Schema(description = "结算状态") + private String settleStatus; + /** 支付时间 */ @Schema(description = "支付时间") private LocalDateTime payTime; diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/PaySignUtil.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/PaySignUtil.java index d89909c1..eb299b3a 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/PaySignUtil.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/PaySignUtil.java @@ -70,7 +70,7 @@ public class PaySignUtil { map.put(fieldName, datetime); } // map类型 - else if (Map.class.isAssignableFrom(field.getType())) { + else if (Map.class.isAssignableFrom(field.getType()) || fieldValue instanceof Map) { Map m = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); m.putAll((Map) fieldValue); map.put(fieldName, JsonUtil.toJsonStr(m)); @@ -135,7 +135,6 @@ public class PaySignUtil { String s = content.toString(); s = StrUtil.replace(s,"\\",""); s = StrUtil.replace(s,"\"",""); - s = s.toUpperCase(); return s; } diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/PayUtil.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/PayUtil.java index 8d1e9fb5..8c9e69c2 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/PayUtil.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/PayUtil.java @@ -104,4 +104,14 @@ public class PayUtil { } throw new OperationFailException("不支持的条码类型"); } + + /** + * 佣金计算, 保留四位小数 + * @param amount 金额 + * @param profitRate 佣金比例, 百分比 + */ + public BigDecimal calculateProfit(BigDecimal amount, BigDecimal profitRate){ + BigDecimal profit = amount.multiply(profitRate.divide(new BigDecimal(100), 4, RoundingMode.HALF_EVEN)); + return profit.divide(BigDecimal.ONE, 4, RoundingMode.HALF_EVEN); + } } diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/TradeNoGenerateUtil.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/TradeNoGenerateUtil.java index ae862b62..055a63ab 100644 --- a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/TradeNoGenerateUtil.java +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/util/TradeNoGenerateUtil.java @@ -70,4 +70,26 @@ public class TradeNoGenerateUtil { orderNo.append(env).append("A").append(dateStr).append(machineNo).append(String.format("%06d", Math.abs(id) % ORDER_MAX_LIMIT)); return orderNo.toString(); } + + /** + * 生成对账订单号 + */ + public static String reconciliation() { + StringBuilder orderNo = new StringBuilder(); + String dateStr = LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER); + long id = ATOMIC_LONG.incrementAndGet(); + orderNo.append(env).append("C").append(dateStr).append(machineNo).append(String.format("%06d", Math.abs(id) % ORDER_MAX_LIMIT)); + return orderNo.toString(); + } + + /** + * 生成修复单号 + */ + public static String repair() { + StringBuilder orderNo = new StringBuilder(); + String dateStr = LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER); + long id = ATOMIC_LONG.incrementAndGet(); + orderNo.append(env).append("X").append(dateStr).append(machineNo).append(String.format("%06d", Math.abs(id) % ORDER_MAX_LIMIT)); + return orderNo.toString(); + } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java deleted file mode 100644 index 7ea73970..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.dromara.daxpay.service.bo.allocation; - -import org.dromara.daxpay.core.enums.AllocationResultEnum; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 分账操作结果 - * @author xxm - * @since 2024/11/15 - */ -@Data -@Accessors(chain = true) -public class AllocStartResultBo { - - /** 通道分账号 */ - private String outAllocNo; - - /** - * 状态 - * @see AllocationResultEnum - */ - private AllocationResultEnum result = AllocationResultEnum.ALL_PENDING; - - /** - * 完成时间 - */ - private LocalDateTime finishTime; - - /** - * 是否需要完结 - */ - private boolean needFinish = true; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocSyncResultBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocSyncResultBo.java deleted file mode 100644 index cedc0fc1..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocSyncResultBo.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.dromara.daxpay.service.bo.allocation; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 分账同步结果 - * @author xxm - * @since 2024/5/23 - */ -@Data -@Accessors(chain = true) -public class AllocSyncResultBo { - /** 同步时网关返回的对象, 序列化为json字符串 */ - private String syncInfo; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/qrcode/CashierCodeIcon.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/qrcode/CashierCodeIcon.java new file mode 100644 index 00000000..87fef74b --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/qrcode/CashierCodeIcon.java @@ -0,0 +1,47 @@ +package org.dromara.daxpay.service.bo.qrcode; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +/** + * 收款码牌图标 + * @author xxm + * @since 2025/7/1 + */ +@Data +@Accessors(chain = true) +@Schema(title = "收款码牌图标") +public class CashierCodeIcon { + + /** icon列表 */ + @Schema(description = "icon列表") + private List icons = new ArrayList<>(); + + /** + * 码牌图标 + */ + @Data + @Accessors(chain = true) + public static class Icon { + /** + * 图标 + */ + @Schema(description = "图标") + private String logo; + /** + * 类型 + */ + @Schema(description = "类型") + private String type; + /** + * 名称 + */ + @Schema(description = "名称") + private String name; + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/PayResultBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/PayResultBo.java deleted file mode 100644 index 27ac0507..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/PayResultBo.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.dromara.daxpay.service.bo.trade; - -import lombok.Data; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 支付结果业务类 - * @author xxm - * @since 2024/7/23 - */ -@Data -@Accessors(chain = true) -public class PayResultBo { - - /** - * 第三方支付网关生成的订单号, 用与将记录关联起来 - * 1. 如付款码支付直接成功时会出现 - * 2. 部分通道创建订单是会直接返回 - */ - private String outOrderNo; - - /** 是否支付完成 */ - private boolean complete; - - /** 完成时间 */ - private LocalDateTime finishTime; - - /** 支付参数体(通常用于发起支付的参数) */ - private String payBody; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/AliYunOCRType.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/AliYunOCRType.java new file mode 100644 index 00000000..761f48fd --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/AliYunOCRType.java @@ -0,0 +1,16 @@ +package org.dromara.daxpay.service.common.code; + +public enum AliYunOCRType { +/** + * @Description: + * @Author: zhuyuanbo + * @Date: 2022/1/18 16:05 + **/ +IdCard("身份证"),BusinessLicense("营业执照"),BankCard("银行卡"); + + private String name; + + AliYunOCRType(String name) { + this.name = name; + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/code/DaxPayCode.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/DaxPayCode.java similarity index 69% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/code/DaxPayCode.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/DaxPayCode.java index 1575eee8..956fe829 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/code/DaxPayCode.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/DaxPayCode.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.code; +package org.dromara.daxpay.service.common.code; /** * 系统编码 @@ -7,6 +7,9 @@ package org.dromara.daxpay.service.code; */ public interface DaxPayCode { + /** 网关支付内置虚拟用户ID, 用于进件申请等功能 */ + Long GATEWAY_USER_ID = 99999999L; + /** * 消息通知相关常量 */ @@ -34,6 +37,12 @@ public interface DaxPayCode { /** 分账完结 */ String ORDER_ALLOC_FINISH = "AllocFinish"; + + /** 支付分润 */ + String ORDER_PAY_PROFIT = "PayProfit"; + + /** 退款分润 */ + String ORDER_REFUND_PROFIT = "RefundProfit"; } /** @@ -42,5 +51,9 @@ public interface DaxPayCode { interface Client { /** 运营端 */ String ADMIN = "dax-pay-admin"; + /** 支付网关 */ + String GATEWAY = "dax-pay-gateway"; + /** 商户端 */ + String MERCHANT = "dax-pay-merchant"; } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/OCRProperties.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/OCRProperties.java new file mode 100644 index 00000000..5991ecc2 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/OCRProperties.java @@ -0,0 +1,24 @@ +package org.dromara.daxpay.service.common.code; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "bootx-platform.starter.ocr") +@Setter +@Getter +public class OCRProperties { + + /** OCR类型 tencent/aliyun */ + private String type; + + /** key */ + private String accessKey; + + /** 密钥 */ + private String secretKey; + + /** endPoint */ + private String endPoint; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/OCRType.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/OCRType.java new file mode 100644 index 00000000..8ea35dff --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/code/OCRType.java @@ -0,0 +1,17 @@ +package org.dromara.daxpay.service.common.code; + +/** + * OCR识别类型 + */ +public interface OCRType { + /** + * 身份证类型 + */ + enum ID_CARD { + // 正面 + ID_CARD_FRONT, + // 反面 + ID_CARD_BACK; + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/convert/PlatformConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/convert/PlatformConfigConvert.java new file mode 100644 index 00000000..fd30c20c --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/convert/PlatformConfigConvert.java @@ -0,0 +1,27 @@ +package org.dromara.daxpay.service.common.convert; + +import org.dromara.daxpay.service.common.entity.config.PlatformBasicConfig; +import org.dromara.daxpay.service.common.entity.config.PlatformUrlConfig; +import org.dromara.daxpay.service.common.entity.config.PlatformWebsiteConfig; +import org.dromara.daxpay.service.common.result.config.PlatformBasicConfigResult; +import org.dromara.daxpay.service.common.result.config.PlatformUrlConfigResult; +import org.dromara.daxpay.service.common.result.config.PlatformWebsiteConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2024/9/19 + */ +@Mapper +public interface PlatformConfigConvert { + PlatformConfigConvert CONVERT = Mappers.getMapper(PlatformConfigConvert.class); + + PlatformBasicConfigResult toResult(PlatformBasicConfig entity); + + PlatformUrlConfigResult toResult(PlatformUrlConfig platformUrlConfig); + + PlatformWebsiteConfigResult toResult(PlatformWebsiteConfig platformWebsiteConfig); + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/PlatformConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformBasicConfigManager.java similarity index 53% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/PlatformConfigManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformBasicConfigManager.java index 05fef481..f9032992 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/PlatformConfigManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformBasicConfigManager.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.dao.config; +package org.dromara.daxpay.service.common.dao.config; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.entity.config.PlatformConfig; +import org.dromara.daxpay.service.common.entity.config.PlatformBasicConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; @@ -14,5 +14,5 @@ import org.springframework.stereotype.Repository; @Slf4j @Repository @RequiredArgsConstructor -public class PlatformConfigManager extends BaseManager { +public class PlatformBasicConfigManager extends BaseManager { } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformBasicConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformBasicConfigMapper.java new file mode 100644 index 00000000..41aac023 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformBasicConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.common.dao.config; + +import org.dromara.daxpay.service.common.entity.config.PlatformBasicConfig; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author xxm + * @since 2024/7/17 + */ +@Mapper +public interface PlatformBasicConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformUrlConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformUrlConfigManager.java new file mode 100644 index 00000000..76d13ec3 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformUrlConfigManager.java @@ -0,0 +1,18 @@ +package org.dromara.daxpay.service.common.dao.config; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.common.entity.config.PlatformUrlConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * + * @author xxm + * @since 2025/6/29 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class PlatformUrlConfigManager extends BaseManager { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformUrlConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformUrlConfigMapper.java new file mode 100644 index 00000000..695da6d7 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformUrlConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.common.dao.config; + +import org.dromara.daxpay.service.common.entity.config.PlatformUrlConfig; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统地址配置 + * @author xxm + * @since 2025/6/29 + */ +@Mapper +public interface PlatformUrlConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformWebsiteConfigManage.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformWebsiteConfigManage.java new file mode 100644 index 00000000..7f543902 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformWebsiteConfigManage.java @@ -0,0 +1,18 @@ +package org.dromara.daxpay.service.common.dao.config; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.common.entity.config.PlatformWebsiteConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * + * @author xxm + * @since 2025/6/29 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class PlatformWebsiteConfigManage extends BaseManager { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformWebsiteConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformWebsiteConfigMapper.java new file mode 100644 index 00000000..f82b94d2 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/dao/config/PlatformWebsiteConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.common.dao.config; + +import org.dromara.daxpay.service.common.entity.config.PlatformWebsiteConfig; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author xxm + * @since 2025/6/29 + */ +@Mapper +public interface PlatformWebsiteConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformBasicConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformBasicConfig.java new file mode 100644 index 00000000..c3249f98 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformBasicConfig.java @@ -0,0 +1,46 @@ +package org.dromara.daxpay.service.common.entity.config; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.service.common.convert.PlatformConfigConvert; +import org.dromara.daxpay.service.common.result.config.PlatformBasicConfigResult; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 管理平台基础配置 + * @author xxm + * @since 2024/6/5 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_platform_basic_config") +public class PlatformBasicConfig extends MpBaseEntity implements ToResult { + + /** 全局单笔限额 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private BigDecimal singleLimitAmount; + + /** 每月累计限额 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private BigDecimal monthlyLimitAmount; + + /** 每日限额 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private BigDecimal dailyLimitAmount; + + /** + * 转换 + */ + @Override + public PlatformBasicConfigResult toResult() { + return PlatformConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformUrlConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformUrlConfig.java new file mode 100644 index 00000000..acb3cfc3 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformUrlConfig.java @@ -0,0 +1,65 @@ +package org.dromara.daxpay.service.common.entity.config; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.service.common.convert.PlatformConfigConvert; +import org.dromara.daxpay.service.common.result.config.PlatformUrlConfigResult; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 系统地址配置 + * @author xxm + * @since 2025/6/28 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_platform_url_config") +public class PlatformUrlConfig extends MpBaseEntity implements ToResult { + /** 运营端网址 */ + private String adminWebUrl; + + /** 代理商端网址 */ + private String agentWebUrl; + + /** 商户端网址 */ + private String mchWebUrl; + + /** 支付网关地址 */ + private String gatewayServiceUrl; + + /** 网关h5地址 */ + private String gatewayH5Url; + + public String getAdminWebUrl() { + return StrUtil.removeSuffix(adminWebUrl, "/"); + } + + public String getAgentWebUrl() { + return StrUtil.removeSuffix(agentWebUrl, "/"); + } + + public String getMchWebUrl() { + return StrUtil.removeSuffix(mchWebUrl, "/"); + } + + public String getGatewayServiceUrl() { + return StrUtil.removeSuffix(gatewayServiceUrl, "/"); + } + + public String getGatewayH5Url() { + return StrUtil.removeSuffix(gatewayH5Url, "/"); + } + + /** + * 转换 + */ + @Override + public PlatformUrlConfigResult toResult() { + return PlatformConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformWebsiteConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformWebsiteConfig.java new file mode 100644 index 00000000..78b7eed1 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/config/PlatformWebsiteConfig.java @@ -0,0 +1,78 @@ +package org.dromara.daxpay.service.common.entity.config; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.service.common.convert.PlatformConfigConvert; +import org.dromara.daxpay.service.common.result.config.PlatformWebsiteConfigResult; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 站点显示内容配置 + * @author xxm + * @since 2025/6/28 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_platform_website_config") +public class PlatformWebsiteConfig extends MpBaseEntity implements ToResult { + + /** 系统名称 */ + private String systemName; + + /** 公司全称 */ + private String companyName; + + /** 公司电话 */ + private String companyPhone; + + /** 公司邮箱 */ + private String companyEmail; + + /** 系统完整logo */ + private String wholeLogo; + + /** 系统简化Logo */ + private String simpleLogo; + + /** 工信部ICP备案信息 */ + private String icpInfo; + + /** 工信部ICP链接地址 */ + private String icpLink; + + /** 公网安备案信息 */ + private String mpsInfo; + + /** 公网安备案链接地址 */ + private String mpsLink; + + /** 中国支付清算协会备案信息 */ + private String pcacInfo; + + /** 中国支付清算协会备案链接地址 */ + private String pcacLink; + + /** 电信增值业务许可信息 */ + private String icpPlusInfo; + + /** 电信增值业务许可链接地址 */ + private String icpPlusLink; + + /** 版权信息 */ + private String copyright; + + /** 版权信息链接 */ + private String copyrightLink; + + /** + * 转换 + */ + @Override + public PlatformWebsiteConfigResult toResult() { + return PlatformConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/handler/DaxUserInfoStatusCheck.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/handler/DaxUserInfoStatusCheck.java new file mode 100644 index 00000000..8f86ee06 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/handler/DaxUserInfoStatusCheck.java @@ -0,0 +1,51 @@ +package org.dromara.daxpay.service.common.handler; + +import cn.bootx.platform.iam.service.client.ClientCodeService; +import cn.bootx.platform.starter.auth.authentication.UserInfoStatusCheck; +import cn.bootx.platform.starter.auth.entity.AuthInfoResult; +import cn.bootx.platform.starter.auth.entity.LoginAuthContext; +import cn.bootx.platform.starter.auth.exception.LoginFailureException; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.service.info.MerchantUserService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Objects; +import java.util.Optional; + +/** + * DaxPay登录验证处理,没有对应终端的权限不运行登录 + * @author xxm + * @since 2025/8/10 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class DaxUserInfoStatusCheck implements UserInfoStatusCheck { + private final MerchantUserService merchantUserService; + private final ClientCodeService clientCodeService; + + /** + * 检查用户是否拥有当前终端的权限 + * + * @param authInfoResult 认证返回结果 + * @param context 登录认证上下文 + */ + @Override + public void check(AuthInfoResult authInfoResult, LoginAuthContext context) { + // 判断终端 + String clientCode = clientCodeService.getClientCode(); + // 商户端 + if (Objects.equals(clientCode, DaxPayCode.Client.MERCHANT)){ + Optional.ofNullable(merchantUserService.findByUserId(authInfoResult.getUserDetail().getId())) + .orElseThrow(() -> new LoginFailureException("您没有商户端的登录权限")); + } else { + // 运营端 + String merchant = merchantUserService.findByUserId(authInfoResult.getUserDetail().getId()); + if (merchant != null){ + throw new LoginFailureException("您没有运营端的权限,请使用商户端登录"); + } + } + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/tenant/MchTenantMetaObjectHandler.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/handler/MchTenantMetaObjectHandler.java similarity index 75% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/tenant/MchTenantMetaObjectHandler.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/handler/MchTenantMetaObjectHandler.java index b6d61517..92d4893a 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/tenant/MchTenantMetaObjectHandler.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/handler/MchTenantMetaObjectHandler.java @@ -1,9 +1,8 @@ -package org.dromara.daxpay.service.common.tenant; +package org.dromara.daxpay.service.common.handler; import cn.bootx.platform.common.mybatisplus.function.MetaObjectFill; -import org.dromara.daxpay.core.context.MchAppLocal; -import org.dromara.daxpay.service.common.local.MchContextLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; @@ -40,8 +39,7 @@ public class MchTenantMetaObjectHandler implements MetaObjectFill { * 不是所有情况下都会获取到应用号 */ public String getAppId() { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - return mchAppInfo.getAppId(); + var reqInfo = PaymentContextLocal.get().getReqInfo(); + return reqInfo.getAppId(); } - } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformBasicConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformBasicConfigParam.java new file mode 100644 index 00000000..9dd719a5 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformBasicConfigParam.java @@ -0,0 +1,39 @@ +package org.dromara.daxpay.service.common.param.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Digits; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 平台配置 + * @author xxm + * @since 2024/9/19 + */ +@Data +@Accessors(chain = true) +@Schema(title = "平台基础配置") +public class PlatformBasicConfigParam { + + /** 全局单笔限额 */ + @DecimalMin(value = "0.01", message = "支付限额不可小于0.01元") + @Digits(integer = 10, fraction = 2, message = "最多只允许两位小数") + @Schema(description = "每月累计限额") + private BigDecimal singleLimitAmount; + + /** 每月累计限额 */ + @DecimalMin(value = "0.01", message = "每月累计限额不可小于0.01元") + @Digits(integer = 10, fraction = 2, message = "最多只允许两位小数") + @Schema(description = "每月累计限额") + private BigDecimal monthlyLimitAmount; + + /** 每日限额 */ + @DecimalMin(value = "0.01", message = "每日限额不可小于0.01元") + @Digits(integer = 10, fraction = 2, message = "最多只允许两位小数") + @Schema(description = "每日限额") + private BigDecimal dailyLimitAmount; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformCashoutsConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformCashoutsConfigParam.java new file mode 100644 index 00000000..fb881cdf --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformCashoutsConfigParam.java @@ -0,0 +1,50 @@ +package org.dromara.daxpay.service.common.param.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 默认提现配置参数 + * @author xxm + * @since 2025/6/28 + */ +@Data +@Accessors(chain = true) +@Schema(title = "默认提现配置参数") +public class PlatformCashoutsConfigParam { + + /** 起始提现额度 */ + @Schema(description = "起始提现额度") + private BigDecimal startAmount; + + /** + * 手续费计算公式 + * @see AgentCashoutsFeeFormulaEnum + */ + @Schema(description = "手续费计算公式") + private String feeFormula; + + /** 单笔固定 */ + @Schema(description = "单笔固定") + private BigDecimal fixedFee; + + /** 单笔费率 */ + @Schema(description = "单笔费率") + private BigDecimal fixedRate; + + /** 组合 固定手续费 */ + @Schema(description = "组合 固定手续费") + private BigDecimal fixedFeeCombined; + + /** 组合 费率 */ + @Schema(description = "组合 费率") + private BigDecimal fixedRateCombined; + + /** 冻结金额 */ + @Schema(description = "冻结金额") + private BigDecimal freezeAmount; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformUrlConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformUrlConfigParam.java new file mode 100644 index 00000000..f39641a0 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformUrlConfigParam.java @@ -0,0 +1,37 @@ +package org.dromara.daxpay.service.common.param.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 平台访问地址配置参数 + * @author xxm + * @since 2025/6/29 + */ +@Data +@Accessors(chain = true) +@Schema(title = "平台访问地址配置参数") +public class PlatformUrlConfigParam { + + + /** 运营端网址 */ + @Schema(description = "运营端网址") + private String adminWebUrl; + + /** 代理商端网址 */ + @Schema(description = "代理商端网址") + private String agentWebUrl; + + /** 商户端网址 */ + @Schema(description = "商户端网址") + private String mchWebUrl; + + /** 支付网关地址 */ + @Schema(description = "支付网关地址") + private String gatewayServiceUrl; + + /** 网关h5地址 */ + @Schema(description = "网关h5地址") + private String gatewayH5Url; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformWebsiteConfigPram.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformWebsiteConfigPram.java new file mode 100644 index 00000000..9de1e8f0 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/config/PlatformWebsiteConfigPram.java @@ -0,0 +1,83 @@ +package org.dromara.daxpay.service.common.param.config; + +import cn.bootx.platform.core.result.BaseResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 站点显示内容配置 + * @author xxm + * @since 2025/6/29 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "站点显示内容配置") +public class PlatformWebsiteConfigPram extends BaseResult { + + /** 系统名称 */ + @Schema(description = "系统名称") + private String systemName; + + /** 公司全称 */ + @Schema(description = "公司全称") + private String companyName; + + /** 公司电话 */ + @Schema(description = "公司电话") + private String companyPhone; + + /** 公司邮箱 */ + @Schema(description = "公司邮箱") + private String companyEmail; + + /** 系统完整logo */ + @Schema(description = "系统完整logo") + private String wholeLogo; + + /** 系统简化Logo */ + @Schema(description = "系统简化Logo") + private String simpleLogo; + + /** 工信部ICP备案信息 */ + @Schema(description = "工信部ICP备案信息") + private String icpInfo; + + /** 工信部ICP链接地址 */ + @Schema(description = "工信部ICP链接地址") + private String icpLink; + + /** 公网安备案信息 */ + @Schema(description = "公网安备案信息") + private String mpsInfo; + + /** 公网安备案链接地址 */ + @Schema(description = "公网安备案链接地址") + private String mpsLink; + + /** 中国支付清算协会备案信息 */ + @Schema(description = "中国支付清算协会备案信息") + private String pcacInfo; + + /** 中国支付清算协会备案链接地址 */ + @Schema(description = "中国支付清算协会备案链接地址") + private String pcacLink; + + /** 电信增值业务许可信息 */ + @Schema(description = "电信增值业务许可信息") + private String icpPlusInfo; + + /** 电信增值业务许可链接地址 */ + @Schema(description = "电信增值业务许可链接地址") + private String icpPlusLink; + + /** 版权信息 */ + @Schema(description = "版权信息") + private String copyright; + + /** 版权信息链接 */ + @Schema(description = "版权信息链接") + private String copyrightLink; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/properties/DaxPayProperties.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/properties/DaxPayProperties.java index 1ec6e70f..13a0ab3e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/properties/DaxPayProperties.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/properties/DaxPayProperties.java @@ -1,13 +1,12 @@ package org.dromara.daxpay.service.common.properties; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import cn.hutool.core.util.StrUtil; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; /** - * 演示模块配置类 + * daxpay配置类 * @author xxm * @since 2024/2/8 */ @@ -16,9 +15,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "dax-pay") public class DaxPayProperties { - /** 前端地址(h5) */ - private String frontH5Url; - /** 通常为两位内 机器码, 用于区分不同机器生成的流水号 */ private String machineNo = "58"; @@ -34,8 +30,4 @@ public class DaxPayProperties { this.env = env; TradeNoGenerateUtil.setEnv(env); } - - public String getFrontH5Url() { - return StrUtil.removeSuffix(frontH5Url, "/"); - } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformBasicConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformBasicConfigResult.java new file mode 100644 index 00000000..2307da85 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformBasicConfigResult.java @@ -0,0 +1,33 @@ +package org.dromara.daxpay.service.common.result.config; + +import cn.bootx.platform.core.result.BaseResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 平台配置 + * @author xxm + * @since 2024/9/19 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "管理平台基础配置") +public class PlatformBasicConfigResult extends BaseResult { + + /** 全局单笔限额 */ + @Schema(description = "每月累计限额") + private BigDecimal singleLimitAmount; + + /** 每月累计限额 */ + @Schema(description = "每月累计限额") + private BigDecimal monthlyLimitAmount; + + /** 每日限额 */ + @Schema(description = "每日限额") + private BigDecimal dailyLimitAmount; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformUrlConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformUrlConfigResult.java new file mode 100644 index 00000000..a580c7bf --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformUrlConfigResult.java @@ -0,0 +1,39 @@ +package org.dromara.daxpay.service.common.result.config; + +import cn.bootx.platform.core.result.BaseResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 平台访问地址配置 + * @author xxm + * @since 2025/6/29 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "平台访问地址配置") +public class PlatformUrlConfigResult extends BaseResult { + + /** 运营端网址 */ + @Schema(description = "运营端网址") + private String adminWebUrl; + + /** 代理商端网址 */ + @Schema(description = "代理商端网址") + private String agentWebUrl; + + /** 商户端网址 */ + @Schema(description = "商户端网址") + private String mchWebUrl; + + /** 支付网关地址 */ + @Schema(description = "支付网关地址") + private String gatewayServiceUrl; + + /** 网关h5地址 */ + @Schema(description = "网关h5地址") + private String gatewayH5Url; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformWebsiteConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformWebsiteConfigResult.java new file mode 100644 index 00000000..f723d941 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/config/PlatformWebsiteConfigResult.java @@ -0,0 +1,83 @@ +package org.dromara.daxpay.service.common.result.config; + +import cn.bootx.platform.core.result.BaseResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 站点显示内容配置 + * @author xxm + * @since 2025/6/29 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "站点显示内容配置") +public class PlatformWebsiteConfigResult extends BaseResult { + + /** 系统名称 */ + @Schema(description = "系统名称") + private String systemName; + + /** 公司全称 */ + @Schema(description = "公司全称") + private String companyName; + + /** 公司电话 */ + @Schema(description = "公司电话") + private String companyPhone; + + /** 公司邮箱 */ + @Schema(description = "公司邮箱") + private String companyEmail; + + /** 系统完整logo */ + @Schema(description = "系统完整logo") + private String wholeLogo; + + /** 系统简化Logo */ + @Schema(description = "系统简化Logo") + private String simpleLogo; + + /** 工信部ICP备案信息 */ + @Schema(description = "工信部ICP备案信息") + private String icpInfo; + + /** 工信部ICP链接地址 */ + @Schema(description = "工信部ICP链接地址") + private String icpLink; + + /** 公网安备案信息 */ + @Schema(description = "公网安备案信息") + private String mpsInfo; + + /** 公网安备案链接地址 */ + @Schema(description = "公网安备案链接地址") + private String mpsLink; + + /** 中国支付清算协会备案信息 */ + @Schema(description = "中国支付清算协会备案信息") + private String pcacInfo; + + /** 中国支付清算协会备案链接地址 */ + @Schema(description = "中国支付清算协会备案链接地址") + private String pcacLink; + + /** 电信增值业务许可信息 */ + @Schema(description = "电信增值业务许可信息") + private String icpPlusInfo; + + /** 电信增值业务许可链接地址 */ + @Schema(description = "电信增值业务许可链接地址") + private String icpPlusLink; + + /** 版权信息 */ + @Schema(description = "版权信息") + private String copyright; + + /** 版权信息链接 */ + @Schema(description = "版权信息链接") + private String copyrightLink; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/BankCardOCRResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/BankCardOCRResult.java new file mode 100644 index 00000000..b8d08fb0 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/BankCardOCRResult.java @@ -0,0 +1,26 @@ +package org.dromara.daxpay.service.common.result.ocr; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 银行卡识别结果 + */ +@Data +@Accessors(chain = true) +@Schema(title = "银行卡识别结果") +public class BankCardOCRResult { + + @Schema(description = "银行名称") + private String bankName; + + @Schema(description = "银行卡号") + private String cardNumber; + + @Schema(description = "银行卡类型") + private String cardType; + + @Schema(description = "有效期") + private String validToDate; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/BusinessLicenseOCRResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/BusinessLicenseOCRResult.java new file mode 100644 index 00000000..9d575e08 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/BusinessLicenseOCRResult.java @@ -0,0 +1,83 @@ +package org.dromara.daxpay.service.common.result.ocr; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 营业执照识别结果 + */ +@Data +@Accessors(chain = true) +@Schema(title = "营业执照识别结果") +public class BusinessLicenseOCRResult { + + /** + * 公司名称 + */ + @Schema(description = "公司名称") + private String name; + + /** + * 公司编号 + */ + @Schema(description = "公司编号") + private String number; + + /** + * 注册地址 + */ + @Schema(description = "注册地址") + private String address; + + /** + * 法人 + */ + @Schema(description = "法人") + private String legalPerson; + + + /** + * 是否为长期 + */ + @Schema(description = "是否为长期") + private boolean periodLong; + + /** + * 营业期开始时间 yyyy-MM-dd + */ + @Schema(description = "营业期开始时间") + private String startDate; + + /** + * 营业期结束时间 yyyy-MM-dd + */ + @Schema(description = "营业期结束时间") + private String endDate; + + /** + * 公司类型 + */ + @Schema(description = "公司类型") + private String companyType; + + /** + * 经营范围 + */ + @Schema(description = "经营范围") + private String businessScope; + + + /** + * 注册时间 + */ + @Schema(description = "注册时间") + private String registeredDate; + + /** + * 证件签发时间 + */ + @Schema(description = "证件签发时间") + private String issueDate; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/IdCardOCRResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/IdCardOCRResult.java new file mode 100644 index 00000000..e8df76fd --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/ocr/IdCardOCRResult.java @@ -0,0 +1,61 @@ +package org.dromara.daxpay.service.common.result.ocr; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 身份证识别结果 + */ +@Data +@Accessors(chain = true) +@Schema(title = "身份证识别结果") +public class IdCardOCRResult { + + /** 身份证号 */ + @Schema(description = "身份证号") + private String idNumber; + + /** 姓名 */ + @Schema(description = "姓名") + private String name; + + /** 性别 */ + @Schema(description = "性别") + private String sex; + + /** 生日 */ + @Schema(description = "生日") + private String birthDate; + + /** 地址 */ + @Schema(description = "地址") + private String address; + + /** 民族 */ + @Schema(description = "民族") + private String nation; + + /** 签发机关 */ + @Schema(description = "签发机关") + private String issue; + + /** 有效期限 */ + @Schema(description = "有效期限") + private String expire; + + /** 是否为长期 */ + @Schema(description = "是否为长期") + private boolean periodLong; + + /** 开始时间 yyyy-MM-dd */ + @Schema(description = "开始时间") + private String startDate; + + /** 结束时间 yyyy-MM-dd */ + @Schema(description = "结束时间") + private String endDate; + + + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/service/config/PlatformConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/service/config/PlatformConfigService.java new file mode 100644 index 00000000..02a96a3d --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/service/config/PlatformConfigService.java @@ -0,0 +1,156 @@ +package org.dromara.daxpay.service.common.service.config; + +import org.dromara.daxpay.core.exception.ConfigNotExistException; +import org.dromara.daxpay.service.common.dao.config.PlatformBasicConfigManager; +import org.dromara.daxpay.service.common.dao.config.PlatformUrlConfigManager; +import org.dromara.daxpay.service.common.dao.config.PlatformWebsiteConfigManage; +import org.dromara.daxpay.service.common.entity.config.PlatformBasicConfig; +import org.dromara.daxpay.service.common.entity.config.PlatformUrlConfig; +import org.dromara.daxpay.service.common.entity.config.PlatformWebsiteConfig; +import org.dromara.daxpay.service.common.param.config.PlatformBasicConfigParam; +import org.dromara.daxpay.service.common.param.config.PlatformUrlConfigParam; +import org.dromara.daxpay.service.common.param.config.PlatformWebsiteConfigPram; +import org.dromara.daxpay.service.common.result.config.PlatformBasicConfigResult; +import org.dromara.daxpay.service.common.result.config.PlatformUrlConfigResult; +import org.dromara.daxpay.service.common.result.config.PlatformWebsiteConfigResult; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * 平台配置 + * @author xxm + * @since 2024/7/17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PlatformConfigService { + private final PlatformBasicConfigManager basicConfigManager; + private final PlatformUrlConfigManager urlConfigManager; + private final PlatformWebsiteConfigManage websiteConfigManager; + + /** + * 获取基础配置 + */ + @Cacheable(value = "cache:config:platform:basic") + public PlatformBasicConfig getBasicConfig(){ + return this.getOrCreateBasicConfig(); + } + + /** + * 获取基础配置 + */ + public PlatformBasicConfigResult findBasicConfig(){ + return this.getOrCreateBasicConfig().toResult(); + } + + /** + * 获取基础配置, 如果不存在进行创建 + */ + public PlatformBasicConfig getOrCreateBasicConfig(){ + var platformConfig = basicConfigManager.findById(1L); + if (platformConfig.isEmpty()){ + var config = new PlatformBasicConfig(); + config.setId(1L); + basicConfigManager.save(config); + return config; + } + return platformConfig.get(); + } + + /** + * 更新基础配置 + */ + @CacheEvict(value = "cache:config:platform:basic", allEntries = true) + public void updateBasic(PlatformBasicConfigParam param){ + var config = basicConfigManager.findById(1L) + .orElseThrow(() -> new ConfigNotExistException("平台配置不存在")); + BeanUtil.copyProperties(param, config); + basicConfigManager.updateById(config); + } + + /** + * 获取平台访问地址配置 + */ + @Cacheable(value = "cache:config:platform:url") + public PlatformUrlConfig getUrlConfig(){ + return this.getOrCreateUrlConfig(); + } + + /** + * 获取平台访问地址配置 + */ + public PlatformUrlConfigResult findUrlConfig(){ + return this.getOrCreateUrlConfig().toResult(); + } + + /** + * 获取平台访问地址配置, 如果不存在进行创建 + */ + public PlatformUrlConfig getOrCreateUrlConfig(){ + var urlConfig = urlConfigManager.findById(1L); + if (urlConfig.isEmpty()){ + var config = new PlatformUrlConfig(); + config.setId(1L); + urlConfigManager.save(config); + return config; + } + return urlConfig.get(); + } + + /** + * 更新平台访问地址配置 + */ + @CacheEvict(value = "cache:config:platform:url", allEntries = true) + public void updateUrl(PlatformUrlConfigParam param){ + var config = urlConfigManager.findById(1L) + .orElseThrow(() -> new ConfigNotExistException("平台配置不存在")); + BeanUtil.copyProperties(param, config); + urlConfigManager.updateById(config); + } + + /** + * 获取平台站点配置 + */ + @Cacheable(value = "cache:config:platform:website") + public PlatformWebsiteConfig getWebsiteConfig(){ + return this.getOrCreateWebsiteConfig(); + } + + /** + * 获取平台站点配置 + */ + public PlatformWebsiteConfigResult findWebsiteConfig(){ + return this.getOrCreateWebsiteConfig().toResult(); + } + + /** + * 获取平台站点配置, 如果不存在进行创建 + */ + public PlatformWebsiteConfig getOrCreateWebsiteConfig(){ + var WebsiteConfig = websiteConfigManager.findById(1L); + if (WebsiteConfig.isEmpty()){ + var config = new PlatformWebsiteConfig(); + config.setId(1L); + websiteConfigManager.save(config); + return config; + } + return WebsiteConfig.get(); + } + + /** + * 更新平台站点配置 + */ + @CacheEvict(value = "cache:config:platform:website", allEntries = true) + public void updateWebsite(PlatformWebsiteConfigPram param){ + var config = websiteConfigManager.findById(1L) + .orElseThrow(() -> new ConfigNotExistException("平台站点配置不存在")); + BeanUtil.copyProperties(param, config); + websiteConfigManager.updateById(config); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocConfigConvert.java deleted file mode 100644 index e058e556..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocConfigConvert.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.dromara.daxpay.service.convert.allocation; - -import org.dromara.daxpay.service.entity.allocation.AllocConfig; -import org.dromara.daxpay.service.param.allocation.AllocConfigParam; -import org.dromara.daxpay.service.result.allocation.AllocConfigResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 分账配置 - * @author xxm - * @since 2024/12/9 - */ -@Mapper -public interface AllocConfigConvert { - - AllocConfigConvert CONVERT = Mappers.getMapper(AllocConfigConvert.class); - - AllocConfigResult toResult(AllocConfig in); - - AllocConfig toEntity(AllocConfigParam in); -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupConvert.java deleted file mode 100644 index f475d594..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dromara.daxpay.service.convert.allocation; - -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; -import org.dromara.daxpay.service.param.allocation.group.AllocGroupParam; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupVo; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2024/4/1 - */ -@Mapper -public interface AllocGroupConvert { - AllocGroupConvert CONVERT = Mappers.getMapper(AllocGroupConvert.class); - - AllocGroupVo toVo(AllocGroup in); - - AllocGroup toEntity(AllocGroupParam in); -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupReceiverConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupReceiverConvert.java deleted file mode 100644 index 0ede4ff5..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupReceiverConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dromara.daxpay.service.convert.allocation; - -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroupReceiver; -import org.dromara.daxpay.service.param.allocation.group.AllocGroupReceiverParam; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2024/4/1 - */ -@Mapper -public interface AllocGroupReceiverConvert { - AllocGroupReceiverConvert CONVERT = Mappers.getMapper(AllocGroupReceiverConvert.class); - - AllocGroupReceiverVo toVo(AllocGroupReceiver in); - - AllocGroupReceiver toEntity(AllocGroupReceiverParam in); -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java deleted file mode 100644 index fd11d12b..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.dromara.daxpay.service.convert.allocation; - -import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; -import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; -import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * - * @author xxm - * @since 2024/11/15 - */ -@Mapper -public interface AllocOrderConvert { - AllocOrderConvert CONVERT = Mappers.getMapper(AllocOrderConvert.class); - - AllocOrderResult toResult(AllocOrder in); - - AllocDetailResult toResult(AllocDetail in); - - List toList(List in); - - AllocOrderVo toVo(AllocOrder in); - - AllocDetailVo toVo(AllocDetail in); -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocReceiverConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocReceiverConvert.java deleted file mode 100644 index 10c78507..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocReceiverConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.dromara.daxpay.service.convert.allocation; - -import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverAddParam; -import org.dromara.daxpay.core.result.allocation.receiver.AllocReceiverResult; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; -import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * - * @author xxm - * @since 2024/3/28 - */ -@Mapper -public interface AllocReceiverConvert { - AllocReceiverConvert CONVERT = Mappers.getMapper(AllocReceiverConvert.class); - - AllocReceiver convert(AllocReceiverAddParam in); - - AllocReceiverVo toBo(AllocReceiver in); - - AllocReceiverResult toResult(AllocReceiver in); - - List toList(List in); -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/assist/TerminalDeviceConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/assist/TerminalDeviceConvert.java deleted file mode 100644 index 290c285e..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/assist/TerminalDeviceConvert.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.dromara.daxpay.service.convert.assist; - -import org.dromara.daxpay.service.entity.assist.TerminalDevice; -import org.dromara.daxpay.service.param.termina.TerminalDeviceParam; -import org.dromara.daxpay.service.result.termina.TerminalDeviceResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 支付终端设备转换 - * @author xxm - * @since 2025/3/8 - */ -@Mapper -public interface TerminalDeviceConvert { - TerminalDeviceConvert CONVERT = Mappers.getMapper(TerminalDeviceConvert.class); - - TerminalDeviceResult toResult(TerminalDevice entity); - - TerminalDevice toEntity(TerminalDeviceParam param); - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/config/PlatformConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/config/PlatformConfigConvert.java deleted file mode 100644 index b64db6a9..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/config/PlatformConfigConvert.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dromara.daxpay.service.convert.config; - -import org.dromara.daxpay.service.entity.config.PlatformConfig; -import org.dromara.daxpay.service.result.config.PlatformConfigResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2024/9/19 - */ -@Mapper -public interface PlatformConfigConvert { - PlatformConfigConvert CONVERT = Mappers.getMapper(PlatformConfigConvert.class); - - PlatformConfigResult toResult(PlatformConfig entity); -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierCodeItemConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierCodeItemConfigConvert.java deleted file mode 100644 index bf280271..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierCodeItemConfigConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dromara.daxpay.service.convert.gateway; - -import org.dromara.daxpay.service.entity.gateway.CashierCodeItemConfig; -import org.dromara.daxpay.service.param.gateway.CashierCodeItemConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierCodeItemConfigResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 码牌条码配置 - * @author xxm - * @since 2025/4/1 - */ -@Mapper -public interface CashierCodeItemConfigConvert { - CashierCodeItemConfigConvert CONVERT = Mappers.getMapper(CashierCodeItemConfigConvert.class); - - CashierCodeItemConfig toEntity(CashierCodeItemConfigParam param); - - CashierCodeItemConfigResult toResult(CashierCodeItemConfig cashierCodeItemConfig); -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigManager.java deleted file mode 100644 index 55a282de..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigManager.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.entity.allocation.AllocConfig; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 分账配置 - * @author xxm - * @since 2024/10/6 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class AllocConfigManager extends BaseManager { - - /** - * 判断是都已经存在数据 - */ - public boolean existsByAppId(String appId) { - return existedByField(MchAppBaseEntity::getAppId, appId); - } - - /** - * 根据应用ID进行查询 - */ - public Optional findByAppId(String appId) { - return findByField(MchAppBaseEntity::getAppId, appId); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigMapper.java deleted file mode 100644 index 03ac4378..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation; - -import org.dromara.daxpay.service.entity.allocation.AllocConfig; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2024/10/6 - */ -@Mapper -public interface AllocConfigMapper extends MPJBaseMapper { -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailManager.java deleted file mode 100644 index 6112e593..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailManager.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.order; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.List; - -/** - * 分账明细 - * @author xxm - * @since 2024/11/14 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class AllocDetailManager extends BaseManager { - public List findAllByOrderId(Long id) { - return findAllByField(AllocDetail::getAllocationId, id); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailMapper.java deleted file mode 100644 index 23c5edf0..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.order; - -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2024/11/14 - */ -@Mapper -public interface AllocDetailMapper extends MPJBaseMapper { -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderManager.java deleted file mode 100644 index 4b8d4ccd..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderManager.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.order; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.annotation.IgnoreTenant; -import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 分账交易 - * @author xxm - * @since 2024/11/14 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class AllocOrderManager extends BaseManager { - - /** - * 分页 - */ - public Page page(PageParam pageParam, AllocOrderQuery param){ - Page mpPage = MpUtil.getMpPage(pageParam, AllocOrder.class); - QueryWrapper generator = QueryGenerator.generator(param); - return this.page(mpPage, generator); - } - - /** - * 根据商户分账单号查询数据 - */ - public Optional findByBizAllocNo(String bizAllocNo, String appId) { - return lambdaQuery() - .eq(AllocOrder::getBizAllocNo, bizAllocNo) - .eq(MchAppBaseEntity::getAppId, appId) - .oneOpt(); - } - - /** - * 根据分账单号查询数据 - */ - public Optional findByAllocNo(String allocNo, String appId) { - return lambdaQuery() - .eq(AllocOrder::getAllocNo, allocNo) - .eq(MchAppBaseEntity::getAppId, appId) - .oneOpt(); - } - - @IgnoreTenant - public Optional findByIdNotTenant(Long id) { - return findById(id); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderMapper.java deleted file mode 100644 index c31b0450..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.order; - -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2024/11/14 - */ -@Mapper -public interface AllocOrderMapper extends MPJBaseMapper { -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupManager.java deleted file mode 100644 index a77ed5d4..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupManager.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.receiver; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; -import org.dromara.daxpay.service.param.allocation.group.AllocGroupQuery; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * - * @author xxm - * @since 2024/10/6 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class AllocGroupManager extends BaseManager { - - /** - * 分页 - */ - public Page page(PageParam pageParam, AllocGroupQuery query) { - Page mpPage = MpUtil.getMpPage(pageParam, AllocGroup.class); - QueryWrapper generator = QueryGenerator.generator(query); - return page(mpPage,generator); - } - - /** - * 根据分账组编号查询 - */ - public Optional findByGroupNo(String channel, String groupNo, String appId) { - return this.lambdaQuery() - .eq(AllocGroup::getGroupNo,groupNo) - .eq(AllocGroup::getAppId,appId) - .eq(AllocGroup::getChannel,channel) - .oneOpt(); - } - - /** - * 清除默认分账组 - */ - public void clearDefault(String channel, String appId) { - lambdaUpdate() - .set(AllocGroup::isDefaultGroup,false) - .eq(AllocGroup::getChannel,channel) - .eq(AllocGroup::getAppId,appId) - .update(); - } - - /** - * 获取默认分账组 - */ - public Optional findDefaultGroup(String channel, String appId) { - return this.lambdaQuery() - .eq(AllocGroup::getChannel,channel) - .eq(AllocGroup::isDefaultGroup,true) - .eq(AllocGroup::getAppId,appId) - .oneOpt(); - } - - /** - * 分账组编号是否存在 - */ - public boolean existedByGroupNo(String groupNo, String appId) { - return this.lambdaQuery() - .eq(AllocGroup::getGroupNo,groupNo) - .eq(AllocGroup::getAppId,appId) - .exists(); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupMapper.java deleted file mode 100644 index c191dea9..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.receiver; - -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2024/10/6 - */ -@Mapper -public interface AllocGroupMapper extends MPJBaseMapper { -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupReceiverManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupReceiverManager.java deleted file mode 100644 index 786fcda2..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupReceiverManager.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.receiver; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroupReceiver; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.List; - -/** - * - * @author xxm - * @since 2024/10/6 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class AllocGroupReceiverManager extends BaseManager { - - - /** - * 判断接收者是否已经被使用 - */ - public boolean isUsed(Long receiverId){ - return existedByField(AllocGroupReceiver::getReceiverId, receiverId); - } - - /** - * 根据分组ID进行查询 - */ - public List findByGroupId(Long groupId){ - return findAllByField(AllocGroupReceiver::getGroupId, groupId); - } - - /** - * 根据分组ID进行批量删除 - */ - public void deleteByGroupId(Long groupId){ - deleteByField(AllocGroupReceiver::getGroupId, groupId); - } - - /** - * 判断是否存在分账接收者 - */ - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupReceiverMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupReceiverMapper.java deleted file mode 100644 index bf412b4d..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupReceiverMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.receiver; - -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroupReceiver; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2024/10/6 - */ -@Mapper -public interface AllocGroupReceiverMapper extends MPJBaseMapper { -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocReceiverManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocReceiverManager.java deleted file mode 100644 index 4199ec68..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocReceiverManager.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.receiver; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; -import org.dromara.daxpay.service.param.allocation.receiver.AllocReceiverQuery; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -/** - * 分账接收方 - * @author xxm - * @since 2024/10/6 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class AllocReceiverManager extends BaseManager { - - /** - * 分页 - */ - public Page page(PageParam pageParam, AllocReceiverQuery param){ - Page mpPage = MpUtil.getMpPage(pageParam, AllocReceiver.class); - QueryWrapper generator = QueryGenerator.generator(param); - generator.select(this.getEntityClass (), MpUtil::excludeBigField); - return this.page(mpPage, generator); - } - - /** - * 根据接收方编号查询 - */ - public Optional findByReceiverNo(String receiverNo, String appId) { - return lambdaQuery() - .eq(AllocReceiver::getReceiverNo, receiverNo) - .eq(MchAppBaseEntity::getAppId, appId) - .oneOpt(); - } - - /** - * 根据分账方编号查询列表 - */ - public List findAllByReceiverNos(List receiverNos, String appId) { - return lambdaQuery() - .eq(AllocReceiver::getReceiverNo, receiverNos) - .eq(MchAppBaseEntity::getAppId, appId) - .list(); - } - - /** - * 根据所属通道查询 - */ - public List findAllByChannel(String channel, String appId) { - return lambdaQuery() - .eq(AllocReceiver::getChannel, channel) - .eq(MchAppBaseEntity::getAppId, appId) - .list(); - } - - - /** - * 判断是否存在 - */ - public boolean existedByReceiverNo(String receiverNo, String appId) { - return lambdaQuery() - .eq(AllocReceiver::getReceiverNo, receiverNo) - .eq(MchAppBaseEntity::getAppId, appId) - .exists(); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocReceiverMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocReceiverMapper.java deleted file mode 100644 index b7313280..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocReceiverMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.service.dao.allocation.receiver; - -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2024/10/6 - */ -@Mapper -public interface AllocReceiverMapper extends MPJBaseMapper { -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/PlatformConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/PlatformConfigMapper.java deleted file mode 100644 index 7ee1087e..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/PlatformConfigMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.service.dao.config; - -import org.dromara.daxpay.service.entity.config.PlatformConfig; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * - * @author xxm - * @since 2024/7/17 - */ -@Mapper -public interface PlatformConfigMapper extends MPJBaseMapper { -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeConfigManager.java deleted file mode 100644 index 40539979..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeConfigManager.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.dromara.daxpay.service.dao.gateway; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.entity.gateway.CashierCodeConfig; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -/** - * - * @author xxm - * @since 2024/11/20 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class CashierCodeConfigManager extends BaseManager { - - /** - * 根据AppId查询列表 - */ - public List findAllByAppId(String appId) { - return this.lambdaQuery() - .eq(CashierCodeConfig::getAppId, appId) - .list(); - } - - /** - * 根据Code查询码牌信息 - */ - public Optional findByCode(String code) { - return findByField(CashierCodeConfig::getCode, code); - } - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeItemConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeItemConfigManager.java deleted file mode 100644 index 3c840d9d..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeItemConfigManager.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.dromara.daxpay.service.dao.gateway; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.entity.gateway.CashierCodeItemConfig; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -/** - * 码牌支付配置明细 - * @author xxm - * @since 2024/11/20 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class CashierCodeItemConfigManager extends BaseManager { - - /** - * 根据码牌ID查询列表 - */ - public List findAllByCodeId(Long code) { - return this.lambdaQuery() - .eq(CashierCodeItemConfig::getCodeId, code) - .list(); - } - - /** - * 判断类型是否存在 - */ - public boolean existsByType(String type, Long codeId) { - return this.lambdaQuery() - .eq(CashierCodeItemConfig::getType, type) - .eq(CashierCodeItemConfig::getCodeId,codeId) - .exists(); - } - /** - * 判断类型是否存在 - */ - public boolean existsByType(String type, Long cashierCodeId, Long id) { - return this.lambdaQuery() - .eq(CashierCodeItemConfig::getType, type) - .eq(CashierCodeItemConfig::getCodeId,cashierCodeId) - .ne(CashierCodeItemConfig::getId,id) - .exists(); - } - - /** - * 根据码牌和类型查询 - */ - public Optional findByCodeAndType(Long codeId, String type) { - return lambdaQuery() - .eq(CashierCodeItemConfig::getCodeId, codeId) - .eq(CashierCodeItemConfig::getType, type) - .oneOpt(); - } - - /** - * 根据码牌ID删除对应的类型配置 - */ - public void deleteByCode(Long codeId) { - this.lambdaUpdate() - .eq(CashierCodeItemConfig::getCodeId, codeId) - .remove(); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeItemConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeItemConfigMapper.java deleted file mode 100644 index 05e48007..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeItemConfigMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.daxpay.service.dao.gateway; - -import org.dromara.daxpay.service.entity.gateway.CashierCodeItemConfig; -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 渠道码类型配置表 Mapper 接口 - * @author xxm - * @since 2024/11/20 - */ -@Mapper -public interface CashierCodeItemConfigMapper extends MPJBaseMapper { -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierCodeConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeConfigConvert.java similarity index 57% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierCodeConfigConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeConfigConvert.java index fbe8104c..2eeb1f05 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierCodeConfigConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeConfigConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.convert.gateway; +package org.dromara.daxpay.service.device.convert.qrcode; -import org.dromara.daxpay.service.entity.gateway.CashierCodeConfig; -import org.dromara.daxpay.service.param.gateway.CashierCodeConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierCodeConfigResult; +import org.dromara.daxpay.service.device.entity.qrcode.config.CashierCodeConfig; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeConfigParam; +import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeConfigResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeConvert.java new file mode 100644 index 00000000..dcaa7a96 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeConvert.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.service.device.convert.qrcode; + +import org.dromara.daxpay.service.device.entity.qrcode.info.CashierCode; +import org.dromara.daxpay.service.device.param.qrcode.info.CashierCodeCreateParam; +import org.dromara.daxpay.service.device.result.qrcode.info.CashierCodeResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2025/7/1 + */ +@Mapper +public interface CashierCodeConvert { + CashierCodeConvert CONVERT = Mappers.getMapper(CashierCodeConvert.class); + + CashierCodeResult toResult(CashierCode cashierCode); + + CashierCode toEntity(CashierCodeCreateParam param); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeSceneConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeSceneConfigConvert.java new file mode 100644 index 00000000..6339d697 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeSceneConfigConvert.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.service.device.convert.qrcode; + +import org.dromara.daxpay.service.device.entity.qrcode.config.CashierCodeSceneConfig; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeSceneConfigParam; +import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeSceneConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 码牌条码配置 + * @author xxm + * @since 2025/4/1 + */ +@Mapper +public interface CashierCodeSceneConfigConvert { + CashierCodeSceneConfigConvert CONVERT = Mappers.getMapper(CashierCodeSceneConfigConvert.class); + + CashierCodeSceneConfig toEntity(CashierCodeSceneConfigParam param); + + CashierCodeSceneConfigResult toResult(CashierCodeSceneConfig cashierCodeSceneConfig); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeTemplateConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeTemplateConvert.java new file mode 100644 index 00000000..5b84b707 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/qrcode/CashierCodeTemplateConvert.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.service.device.convert.qrcode; + +import org.dromara.daxpay.service.device.entity.qrcode.template.CashierCodeTemplate; +import org.dromara.daxpay.service.device.param.qrcode.template.CashierCodeTemplateParam; +import org.dromara.daxpay.service.device.result.qrcode.template.CashierCodeTemplateResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2025/7/1 + */ +@Mapper +public interface CashierCodeTemplateConvert { + CashierCodeTemplateConvert CONVERT = Mappers.getMapper(CashierCodeTemplateConvert.class); + + CashierCodeTemplateResult toResult(CashierCodeTemplate cashierCodeTemplate); + + CashierCodeTemplate toEntity(CashierCodeTemplateParam param); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/terminal/TerminalDeviceConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/terminal/TerminalDeviceConvert.java new file mode 100644 index 00000000..02ad3db0 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/convert/terminal/TerminalDeviceConvert.java @@ -0,0 +1,29 @@ +package org.dromara.daxpay.service.device.convert.terminal; + +import org.dromara.daxpay.service.device.entity.terminal.TerminalDevice; +import org.dromara.daxpay.service.device.entity.terminal.ChannelTerminal; +import org.dromara.daxpay.service.device.param.terminal.ChannelTerminalParam; +import org.dromara.daxpay.service.device.param.terminal.TerminalDeviceParam; +import org.dromara.daxpay.service.device.result.terminal.ChannelTerminalResult; +import org.dromara.daxpay.service.device.result.terminal.TerminalDeviceResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 支付终端设备转换 + * @author xxm + * @since 2025/3/8 + */ +@Mapper +public interface TerminalDeviceConvert { + TerminalDeviceConvert CONVERT = Mappers.getMapper(TerminalDeviceConvert.class); + + TerminalDeviceResult toResult(TerminalDevice entity); + + TerminalDevice toEntity(TerminalDeviceParam param); + + ChannelTerminalResult toResult(ChannelTerminal entity); + + ChannelTerminal toEntity(ChannelTerminalParam param); + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeConfigManager.java new file mode 100644 index 00000000..bb4b9478 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeConfigManager.java @@ -0,0 +1,33 @@ +package org.dromara.daxpay.service.device.dao.qrcode.config; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.rest.param.PageParam; +import org.dromara.daxpay.service.device.entity.qrcode.config.CashierCodeConfig; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeConfigQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * + * @author xxm + * @since 2024/11/20 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class CashierCodeConfigManager extends BaseManager { + + /** + * 分页 + */ + public Page page(PageParam pageParam, CashierCodeConfigQuery query) { + Page mpPage = MpUtil.getMpPage(pageParam, CashierCodeConfig.class); + QueryWrapper generator = QueryGenerator.generator(query); + return this.page(mpPage,generator); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeConfigMapper.java similarity index 64% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeConfigMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeConfigMapper.java index 2dfea80c..5cce3b1f 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierCodeConfigMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeConfigMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.gateway; +package org.dromara.daxpay.service.device.dao.qrcode.config; -import org.dromara.daxpay.service.entity.gateway.CashierCodeConfig; +import org.dromara.daxpay.service.device.entity.qrcode.config.CashierCodeConfig; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeSceneConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeSceneConfigManager.java new file mode 100644 index 00000000..1cf774e2 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeSceneConfigManager.java @@ -0,0 +1,69 @@ +package org.dromara.daxpay.service.device.dao.qrcode.config; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.device.entity.qrcode.config.CashierCodeSceneConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +/** + * 码牌支付配置明细 + * @author xxm + * @since 2024/11/20 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class CashierCodeSceneConfigManager extends BaseManager { + + /** + * 根据码牌ID查询列表 + */ + public List findAllByConfigId(Long configId) { + return this.lambdaQuery() + .eq(CashierCodeSceneConfig::getConfigId, configId) + .list(); + } + + /** + * 判断收银场景是否存在 + */ + public boolean existsByScene(String scene, Long configId) { + return this.lambdaQuery() + .eq(CashierCodeSceneConfig::getScene, scene) + .eq(CashierCodeSceneConfig::getConfigId,configId) + .exists(); + } + /** + * 判断类型是否存在 + */ + public boolean existsByScene(String scene, Long configId, Long id) { + return this.lambdaQuery() + .eq(CashierCodeSceneConfig::getScene, scene) + .eq(CashierCodeSceneConfig::getConfigId,configId) + .ne(CashierCodeSceneConfig::getId,id) + .exists(); + } + + /** + * 根据码牌配置Id和类型查询 + */ + public Optional findByConfigAndScene(Long configId, String scene) { + return lambdaQuery() + .eq(CashierCodeSceneConfig::getConfigId, configId) + .eq(CashierCodeSceneConfig::getScene, scene) + .oneOpt(); + } + + /** + * 根据码牌ID删除对应的类型配置 + */ + public void deleteByConfigId(Long configId) { + this.lambdaUpdate() + .eq(CashierCodeSceneConfig::getConfigId, configId) + .remove(); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeSceneConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeSceneConfigMapper.java new file mode 100644 index 00000000..8d3e3e32 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/config/CashierCodeSceneConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.device.dao.qrcode.config; + +import org.dromara.daxpay.service.device.entity.qrcode.config.CashierCodeSceneConfig; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 渠道码类型配置表 Mapper 接口 + * @author xxm + * @since 2024/11/20 + */ +@Mapper +public interface CashierCodeSceneConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/info/CashierCodeManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/info/CashierCodeManager.java new file mode 100644 index 00000000..e35c3ead --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/info/CashierCodeManager.java @@ -0,0 +1,51 @@ +package org.dromara.daxpay.service.device.dao.qrcode.info; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.annotation.IgnoreTenant; +import cn.bootx.platform.core.rest.param.PageParam; +import org.dromara.daxpay.service.device.entity.qrcode.info.CashierCode; +import org.dromara.daxpay.service.device.param.qrcode.info.CashierCodeQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +/** + * + * @author xxm + * @since 2025/7/1 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class CashierCodeManager extends BaseManager { + + /** + * 分页 + */ + public Page page(PageParam pageParam, CashierCodeQuery query) { + Page mpPage = MpUtil.getMpPage(pageParam, CashierCode.class); + QueryWrapper generator = QueryGenerator.generator(query); + return this.page(mpPage,generator); + } + + /** + * 判断批次号是否存在 + */ + @IgnoreTenant + public boolean existedByBatchNo(String batchNo) { + return existedByField(CashierCode::getBatchNo, batchNo); + } + + /** + * 根据编号查询 + */ + public Optional findByCode(String code) { + return findByField(CashierCode::getCode, code); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/info/CashierCodeMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/info/CashierCodeMapper.java new file mode 100644 index 00000000..7a0519ae --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/info/CashierCodeMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.device.dao.qrcode.info; + +import org.dromara.daxpay.service.device.entity.qrcode.info.CashierCode; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author xxm + * @since 2025/7/1 + */ +@Mapper +public interface CashierCodeMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/template/CashierCodeTemplateManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/template/CashierCodeTemplateManager.java new file mode 100644 index 00000000..ae935e42 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/template/CashierCodeTemplateManager.java @@ -0,0 +1,33 @@ +package org.dromara.daxpay.service.device.dao.qrcode.template; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.rest.param.PageParam; +import org.dromara.daxpay.service.device.entity.qrcode.template.CashierCodeTemplate; +import org.dromara.daxpay.service.device.param.qrcode.template.CashierCodeTemplateQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * 收银码模板 + * @author xxm + * @since 2025/7/1 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class CashierCodeTemplateManager extends BaseManager { + + /** + * 分页 + */ + public Page page(PageParam pageParam, CashierCodeTemplateQuery query) { + Page mpPage = MpUtil.getMpPage(pageParam, CashierCodeTemplate.class); + QueryWrapper generator = QueryGenerator.generator(query); + return this.page(mpPage,generator); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/template/CashierCodeTemplateMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/template/CashierCodeTemplateMapper.java new file mode 100644 index 00000000..48813ec9 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/qrcode/template/CashierCodeTemplateMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.device.dao.qrcode.template; + +import org.dromara.daxpay.service.device.entity.qrcode.template.CashierCodeTemplate; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 收银台码牌配置 + * @author xxm + * @since 2025/7/1 + */ +@Mapper +public interface CashierCodeTemplateMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/ChannelTerminalManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/ChannelTerminalManager.java new file mode 100644 index 00000000..61abdd3f --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/ChannelTerminalManager.java @@ -0,0 +1,86 @@ +package org.dromara.daxpay.service.device.dao.terminal; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.device.entity.terminal.ChannelTerminal; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +/** + * 支付终端设备通道上报记录 + * @author xxm + * @since 2025/3/7 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class ChannelTerminalManager extends BaseManager { + + /** + * 根据终端设备ID判断是否存在 + */ + public boolean existsByTerminalId(Long terminalId){ + return existedByField(ChannelTerminal::getTerminalId,terminalId); + } + + /** + * 根据终端设备ID和通道查询记录 + */ + public Optional findByTerminalIdAndChannel(Long terminalId, String channel){ + return lambdaQuery() + .eq(ChannelTerminal::getTerminalId,terminalId) + .eq(ChannelTerminal::getChannel,channel) + .oneOpt(); + } + + /** + * 根据终端设备ID和通道查询记录 + */ + public boolean existsByTerminal(Long terminalId, String channel, String terminalType){ + return lambdaQuery() + .eq(ChannelTerminal::getTerminalId,terminalId) + .eq(ChannelTerminal::getType,terminalType) + .eq(ChannelTerminal::getChannel,channel) + .exists(); + } + + /** + * 根据终端设备ID和通道查询记录 + */ + public Optional findByByTerminal(Long terminalId, String channel, String terminalType){ + return lambdaQuery() + .eq(ChannelTerminal::getTerminalId,terminalId) + .eq(ChannelTerminal::getType,terminalType) + .eq(ChannelTerminal::getChannel,channel) + .oneOpt(); + } + + /** + * 根据终端号查询 + */ + public List findAllByTerminalId(Long terminalId){ + return lambdaQuery() + .eq(ChannelTerminal::getTerminalId,terminalId) + .list(); + + } + + /** + * 删除多余的终端设备通道上报记录 + * @param terminalId 终端设备ID + * @param channelId 保留的通道ID + * @param channel 通道 + * @param terminalType 终端类型 + */ + public void deleteByTerminalId(Long terminalId, Long channelId, String channel, String terminalType){ + lambdaUpdate() + .eq(ChannelTerminal::getTerminalId,terminalId) + .eq(ChannelTerminal::getChannel,channel) + .eq(ChannelTerminal::getType,terminalType) + .ne(ChannelTerminal::getId,channelId) + .remove(); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/ChannelTerminalMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/ChannelTerminalMapper.java new file mode 100644 index 00000000..45c383c8 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/ChannelTerminalMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.device.dao.terminal; + +import org.dromara.daxpay.service.device.entity.terminal.ChannelTerminal; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 支付终端设备通道上报记录 + * @author xxm + * @since 2025/3/7 + */ +@Mapper +public interface ChannelTerminalMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/TerminalDeviceManager.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/TerminalDeviceManager.java index ac6f0c61..6fba2ee4 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/TerminalDeviceManager.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.dao.assist; +package org.dromara.daxpay.service.device.dao.terminal; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.assist.TerminalDevice; -import org.dromara.daxpay.service.param.termina.TerminalDeviceQuery; +import org.dromara.daxpay.service.device.entity.terminal.TerminalDevice; +import org.dromara.daxpay.service.device.param.terminal.TerminalDeviceQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/TerminalDeviceMapper.java similarity index 66% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/TerminalDeviceMapper.java index 4f2218f9..d1518006 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/dao/terminal/TerminalDeviceMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.assist; +package org.dromara.daxpay.service.device.dao.terminal; -import org.dromara.daxpay.service.entity.assist.TerminalDevice; +import org.dromara.daxpay.service.device.entity.terminal.TerminalDevice; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/CashierCodeConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/config/CashierCodeConfig.java similarity index 70% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/CashierCodeConfig.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/config/CashierCodeConfig.java index 35208778..04805a8d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/CashierCodeConfig.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/config/CashierCodeConfig.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.service.entity.gateway; +package org.dromara.daxpay.service.device.entity.qrcode.config; +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.gateway.CashierCodeConfigConvert; -import org.dromara.daxpay.service.param.gateway.CashierCodeConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierCodeConfigResult; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeConfigParam; +import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeConfigResult; +import org.dromara.daxpay.service.device.convert.qrcode.CashierCodeConfigConvert; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @@ -23,21 +23,14 @@ import java.util.Objects; @Data @Accessors(chain = true) @TableName("pay_cashier_code_config") -public class CashierCodeConfig extends MchAppBaseEntity implements ToResult { +public class CashierCodeConfig extends MpBaseEntity implements ToResult { - /** 码牌名称 */ + /** 配置名称 */ private String name; - /** 码牌编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - private String code; - /** 是否启用 */ private Boolean enable; - /** 模板编号 */ - private String templateCode; - /** 是否开启分账 */ private Boolean allocation; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/CashierCodeItemConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/config/CashierCodeSceneConfig.java similarity index 51% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/CashierCodeItemConfig.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/config/CashierCodeSceneConfig.java index d9eb0b90..47bd1d65 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/CashierCodeItemConfig.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/config/CashierCodeSceneConfig.java @@ -1,14 +1,14 @@ -package org.dromara.daxpay.service.entity.gateway; +package org.dromara.daxpay.service.device.entity.qrcode.config; +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.core.enums.CashierCodeTypeEnum; +import org.dromara.daxpay.core.enums.CashierSceneEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.gateway.CashierCodeItemConfigConvert; -import org.dromara.daxpay.service.param.gateway.CashierCodeItemConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierCodeItemConfigResult; +import org.dromara.daxpay.service.device.convert.qrcode.CashierCodeSceneConfigConvert; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeSceneConfigParam; +import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeSceneConfigResult; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -25,18 +25,18 @@ import java.util.Objects; @EqualsAndHashCode(callSuper = true) @Data @Accessors(chain = true) -@TableName("pay_cashier_code_item_config") -public class CashierCodeItemConfig extends MchAppBaseEntity implements ToResult { +@TableName("pay_cashier_code_scene_config") +public class CashierCodeSceneConfig extends MpBaseEntity implements ToResult { - /** 码牌ID */ - private Long codeId; + /** 配置ID */ + private Long configId; /** - * 码牌类型 - * @see CashierCodeTypeEnum + * 收银场景 + * @see CashierSceneEnum */ - @Schema(description = "收银台类型") - private String type; + @Schema(description = "收银场景") + private String scene; /** * 支付通道 @@ -58,6 +58,9 @@ public class CashierCodeItemConfig extends MchAppBaseEntity implements ToResult< /** 需要获取OpenId */ private Boolean needOpenId; + /** OpenId获取方式 */ + private String openIdGetType; + /** * 发起调用的类型 * @see GatewayCallTypeEnum @@ -68,15 +71,15 @@ public class CashierCodeItemConfig extends MchAppBaseEntity implements ToResult< return Objects.equals(needOpenId, true); } - public static CashierCodeItemConfig init(CashierCodeItemConfigParam param) { - return CashierCodeItemConfigConvert.CONVERT.toEntity(param); + public static CashierCodeSceneConfig init(CashierCodeSceneConfigParam param) { + return CashierCodeSceneConfigConvert.CONVERT.toEntity(param); } /** * 转换 */ @Override - public CashierCodeItemConfigResult toResult() { - return CashierCodeItemConfigConvert.CONVERT.toResult(this); + public CashierCodeSceneConfigResult toResult() { + return CashierCodeSceneConfigConvert.CONVERT.toResult(this); } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/info/CashierCode.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/info/CashierCode.java new file mode 100644 index 00000000..08f4e8b6 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/info/CashierCode.java @@ -0,0 +1,67 @@ +package org.dromara.daxpay.service.device.entity.qrcode.info; + +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.service.device.convert.qrcode.CashierCodeConvert; +import org.dromara.daxpay.service.device.result.qrcode.info.CashierCodeResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppEditEntity; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.Objects; + +/** + * 收款码牌 + * @author xxm + * @since 2025/7/1 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_cashier_code") +public class CashierCode extends MchAppEditEntity implements ToResult { + + /** 金额类型 固定金额/任意金额 */ + private String amountType; + + /** 金额 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private BigDecimal amount; + + /** 名称 */ + private String name; + + /** 编号 */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private String code; + + /** 配置Id */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private Long configId; + + /** 模板ID */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private Long templateId; + + /** 状态 */ + private Boolean enable; + + /** 批次号 */ + private String batchNo; + + public Boolean getEnable() { + return Objects.equals(enable, true); + } + + /** + * 转换 + */ + @Override + public CashierCodeResult toResult() { + return CashierCodeConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/template/CashierCodeTemplate.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/template/CashierCodeTemplate.java new file mode 100644 index 00000000..5ac00246 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/qrcode/template/CashierCodeTemplate.java @@ -0,0 +1,65 @@ +package org.dromara.daxpay.service.device.entity.qrcode.template; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.service.bo.qrcode.CashierCodeIcon; +import org.dromara.daxpay.service.device.convert.qrcode.CashierCodeTemplateConvert; +import org.dromara.daxpay.service.device.result.qrcode.template.CashierCodeTemplateResult; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 收银台码牌模板 + * @author xxm + * @since 2025/7/1 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName(value = "pay_cashier_code_template",autoResultMap = true) +public class CashierCodeTemplate extends MpBaseEntity implements ToResult { + + /** 名称 */ + private String name; + + /** 模板类型 */ + private String type; + + /** 显示ID */ + private Boolean showId; + + /** 显示名称 */ + private Boolean showName; + + /** 显示金额 */ + private Boolean showAmount; + + /** icon列表 */ + @TableField(typeHandler = JacksonTypeHandler.class) + private CashierCodeIcon icon; + + /** 背景颜色类型 */ + private String bgColorType; + + /** 背景颜色 */ + private String backgroundColor; + + /** 主Logo */ + private String mainLogo; + + /** 二维码Logo */ + private String qrLogo; + + /** + * 转换 + */ + @Override + public CashierCodeTemplateResult toResult() { + return CashierCodeTemplateConvert.CONVERT.toResult(this); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/terminal/ChannelTerminal.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/terminal/ChannelTerminal.java new file mode 100644 index 00000000..e38bd178 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/terminal/ChannelTerminal.java @@ -0,0 +1,89 @@ +package org.dromara.daxpay.service.device.entity.terminal; + +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.ChannelTerminalStatusEnum; +import org.dromara.daxpay.core.enums.TerminalTypeEnum; +import org.dromara.daxpay.service.device.convert.terminal.TerminalDeviceConvert; +import org.dromara.daxpay.service.device.param.terminal.ChannelTerminalParam; +import org.dromara.daxpay.service.device.result.terminal.ChannelTerminalResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 通道终端设备上报记录 + * @author xxm + * @since 2025/3/7 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_channel_terminal") +public class ChannelTerminal extends MchAppBaseEntity implements ToResult { + + /** 终端设备ID */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private Long terminalId; + + /** 终端设备编码 */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private String terminalNo; + + /** + * 通道 + * @see ChannelEnum + */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private String channel; + + /** + * 终端报送类型 + * @see TerminalTypeEnum + */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private String type; + + /** + * 状态 + * @see ChannelTerminalStatusEnum + */ + private String status; + + /** + * 扩展信息 + */ + private String extra; + + /** 通道终端号 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String outTerminalNo; + + /** 错误信息 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String errorMsg; + + /** + * 获取上报类型 格式: 通道编码:上报类型 + */ + public String genUpType(){ + return this.channel + ":" + this.type; + } + + /** + * 初始化对象 + */ + public static ChannelTerminal init(ChannelTerminalParam param){ + return TerminalDeviceConvert.CONVERT.toEntity(param); + } + + @Override + public ChannelTerminalResult toResult() { + return TerminalDeviceConvert.CONVERT.toResult(this); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/assist/TerminalDevice.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/terminal/TerminalDevice.java similarity index 84% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/assist/TerminalDevice.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/terminal/TerminalDevice.java index 42ecee05..37737438 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/assist/TerminalDevice.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/entity/terminal/TerminalDevice.java @@ -1,12 +1,12 @@ -package org.dromara.daxpay.service.entity.assist; +package org.dromara.daxpay.service.device.entity.terminal; import cn.bootx.platform.common.mybatisplus.function.ToResult; import cn.bootx.platform.common.mybatisplus.handler.StringListTypeHandler; import org.dromara.daxpay.core.enums.TerminalDeviceTypeEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.assist.TerminalDeviceConvert; -import org.dromara.daxpay.service.param.termina.TerminalDeviceParam; -import org.dromara.daxpay.service.result.termina.TerminalDeviceResult; +import org.dromara.daxpay.service.device.convert.terminal.TerminalDeviceConvert; +import org.dromara.daxpay.service.device.param.terminal.TerminalDeviceParam; +import org.dromara.daxpay.service.device.result.terminal.TerminalDeviceResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppEditEntity; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @@ -27,15 +27,15 @@ import java.util.Objects; @Data @Accessors(chain = true) @TableName(value = "pay_terminal_device",autoResultMap = true) -public class TerminalDevice extends MchAppBaseEntity implements ToResult { - - /** 终端名称 */ - private String name; +public class TerminalDevice extends MchAppEditEntity implements ToResult { /** 终端编码 */ @TableField(updateStrategy = FieldStrategy.NEVER) private String terminalNo; + /** 终端名称 */ + private String name; + /** * 终端类型 * @see TerminalDeviceTypeEnum diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/enums/AudioBindTypeEnum.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/enums/AudioBindTypeEnum.java new file mode 100644 index 00000000..e0e39c6f --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/enums/AudioBindTypeEnum.java @@ -0,0 +1,22 @@ +package org.dromara.daxpay.service.device.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 音箱设备绑定类型枚举 + * 字典: audio_bind_type + * @author xxm + * @since 2025/7/8 + */ +@Getter +@AllArgsConstructor +public enum AudioBindTypeEnum { + + APP("app", "应用"), + MERCHANT("merchant", "商户"), + CASHIER_CODE("cashier_code", "码牌"), +; + private final String code; + private final String name; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/commom/AssignMerchantParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/commom/AssignMerchantParam.java new file mode 100644 index 00000000..52d2841a --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/commom/AssignMerchantParam.java @@ -0,0 +1,29 @@ +package org.dromara.daxpay.service.device.param.commom; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 商户应用设备绑定参数 + * @author xxm + * @since 2025/7/1 + */ +@Data +@Accessors(chain = true) +@Schema(title = "商户和应用码牌绑定参数") +public class AssignMerchantParam { + + @Schema(description = "代理商号") + private String mchNo; + + @Schema(description = "应用号") + private String appId; + + @NotEmpty(message = "设备ID列表不能为空") + @Schema(description = "设备ID列表") + private List ids; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierCodeConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeConfigParam.java similarity index 77% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierCodeConfigParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeConfigParam.java index 6ea5b5a3..fccca6bf 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierCodeConfigParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeConfigParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.gateway; +package org.dromara.daxpay.service.device.param.qrcode.config; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -17,18 +17,9 @@ public class CashierCodeConfigParam { @Schema(description = "主健") private Long id; - @Schema(description = "模板编号") - private String templateCode; - @Schema(description = "码牌名称") private String name; - @Schema(description = "是否启用") - private Boolean enable; - - @Schema(description = "备注") - private String remark; - @Schema(description = "是否开启分账") private Boolean allocation; @@ -39,6 +30,9 @@ public class CashierCodeConfigParam { @Schema(description = "限制用户支付方式") private String limitPay; - @Schema(description = "应用ID") + @Schema(description = "备注") + private String remark; + private String appId; + } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeConfigQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeConfigQuery.java new file mode 100644 index 00000000..ff84b476 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeConfigQuery.java @@ -0,0 +1,22 @@ +package org.dromara.daxpay.service.device.param.qrcode.config; + +import cn.bootx.platform.common.mybatisplus.query.entity.SortParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 码牌配置查询参数 + * @author xxm + * @since 2025/7/2 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "码牌配置查询参数") +public class CashierCodeConfigQuery extends SortParam { + + @Schema(description = "配置名称") + private String name; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierCodeItemConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeSceneConfigParam.java similarity index 69% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierCodeItemConfigParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeSceneConfigParam.java index 72df2002..8f5b8c4c 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierCodeItemConfigParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/config/CashierCodeSceneConfigParam.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.param.gateway; +package org.dromara.daxpay.service.device.param.qrcode.config; -import org.dromara.daxpay.core.enums.CashierCodeTypeEnum; +import org.dromara.daxpay.core.enums.CashierSceneEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; import org.dromara.daxpay.core.enums.PayMethodEnum; @@ -15,23 +15,23 @@ import lombok.experimental.Accessors; */ @Data @Accessors(chain = true) -@Schema(title = "特定类型码牌配置") -public class CashierCodeItemConfigParam { +@Schema(title = "码牌支付场景配置") +public class CashierCodeSceneConfigParam { /** 主键 */ @Schema(description = "主健") private Long id; - /** 码牌ID */ - @Schema(description = "码牌ID") - private Long codeId; + /** 配置ID */ + @Schema(description = "配置ID") + private Long configId; /** - * 码牌类型 - * @see CashierCodeTypeEnum + * 收银场景 + * @see CashierSceneEnum */ - @Schema(description = "码牌类型") - private String type; + @Schema(description = "收银场景") + private String scene; /** * 支付通道 @@ -57,6 +57,10 @@ public class CashierCodeItemConfigParam { @Schema(description = "需要获取OpenId") private Boolean needOpenId; + /** OpenId获取方式 */ + @Schema(description = "OpenId获取方式") + private String openIdGetType; + /** * 发起调用的类型 * @see GatewayCallTypeEnum diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeBatchParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeBatchParam.java new file mode 100644 index 00000000..4d4d7cbd --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeBatchParam.java @@ -0,0 +1,46 @@ +package org.dromara.daxpay.service.device.param.qrcode.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 批量创建收款码参数 + * @author xxm + * @since 2025/7/1 + */ +@Data +@Accessors(chain = true) +@Schema(title = "批量创建收款码参数") +public class CashierCodeBatchParam { + + /** 批次号 */ + @Schema(description = "批次号") + private String batchNo; + + /** 创建数量 */ + @Schema(description = "创建数量") + private Integer count; + + /** 模板Id */ + @Schema(description = "模板Id") + private Long templateId; + + /** 配置Id */ + @Schema(description = "配置Id") + private Long configId; + + /** 金额类型 */ + @Schema(description = "金额类型") + private String amountType; + + /** 金额 */ + @Schema(description = "二维码金额") + private BigDecimal amount; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeCreateParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeCreateParam.java new file mode 100644 index 00000000..d6a53e91 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeCreateParam.java @@ -0,0 +1,38 @@ +package org.dromara.daxpay.service.device.param.qrcode.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 码牌创建参数 + * @author xxm + * @since 2025/7/6 + */ +@Data +@Accessors(chain = true) +@Schema(title = "码牌创建参数") +public class CashierCodeCreateParam { + + /** 模板Id */ + @Schema(description = "模板Id") + private Long templateId; + + /** 配置Id */ + @Schema(description = "配置Id") + private Long configId; + + /** 金额类型 */ + @Schema(description = "金额类型") + private String amountType; + + /** 金额 */ + @Schema(description = "二维码金额") + private BigDecimal amount; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeQuery.java new file mode 100644 index 00000000..e136df33 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeQuery.java @@ -0,0 +1,31 @@ +package org.dromara.daxpay.service.device.param.qrcode.info; + +import cn.bootx.platform.common.mybatisplus.query.entity.SortParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 收银码牌查询参数 + * @author xxm + * @since 2025/7/1 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "收银码牌查询参数") +public class CashierCodeQuery extends SortParam { + + @Schema(description = "名称") + private String name; + + @Schema(description = "状态") + private String status; + + @Schema(description = "批次号") + private String batchNo; + + @Schema(description = "编码") + private String code; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeUpdateParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeUpdateParam.java new file mode 100644 index 00000000..f3541c04 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/info/CashierCodeUpdateParam.java @@ -0,0 +1,47 @@ +package org.dromara.daxpay.service.device.param.qrcode.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 码牌更新参数 + * @author xxm + * @since 2025/7/1 + */ +@Data +@Accessors(chain = true) +@Schema(title = "码牌更新参数") +public class CashierCodeUpdateParam { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** 收款金额类型 固定金额/任意金额 */ + @Schema(description = "收款金额类型") + private String amountType; + + /** 金额 */ + @Schema(description = "金额") + private BigDecimal amount; + + /** 配置Id */ + @Schema(description = "配置Id") + private Long configId; + + /** 模板ID */ + @Schema(description = "模板ID") + private Long templateId; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/template/CashierCodeTemplateParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/template/CashierCodeTemplateParam.java new file mode 100644 index 00000000..e4571e9d --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/template/CashierCodeTemplateParam.java @@ -0,0 +1,61 @@ +package org.dromara.daxpay.service.device.param.qrcode.template; + +import org.dromara.daxpay.service.bo.qrcode.CashierCodeIcon; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 收款码牌模板参数 + * @author xxm + * @since 2025/7/1 + */ +@Data +@Accessors(chain = true) +@Schema(title = "收款码牌模板参数") +public class CashierCodeTemplateParam { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** 模板类型 */ + @Schema(description = "模板类型") + private String type; + + /** 显示ID */ + @Schema(description = "显示ID") + private Boolean showId; + + /** 显示名称 */ + @Schema(description = "显示名称") + private Boolean showName; + + /** 显示金额 */ + @Schema(description = "显示金额") + private Boolean showAmount; + + /** icon列表 */ + @Schema(description = "icon列表") + private CashierCodeIcon icon; + + /** 背景颜色类型 */ + @Schema(description = "背景颜色类型") + private String bgColorType; + + /** 背景颜色 */ + @Schema(description = "背景颜色") + private String backgroundColor; + + /** 主Logo */ + @Schema(description = "主Logo") + private String mainLogo; + + /** 二维码Logo */ + @Schema(description = "二维码Logo") + private String qrLogo; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/template/CashierCodeTemplateQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/template/CashierCodeTemplateQuery.java new file mode 100644 index 00000000..c58a4db9 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/qrcode/template/CashierCodeTemplateQuery.java @@ -0,0 +1,19 @@ +package org.dromara.daxpay.service.device.param.qrcode.template; + +import cn.bootx.platform.common.mybatisplus.query.entity.SortParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 收银码牌模板查询参数 + * @author xxm + * @since 2025/7/1 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "收银码牌模板查询参数") +public class CashierCodeTemplateQuery extends SortParam { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/ChannelGetAndCreateParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/ChannelGetAndCreateParam.java new file mode 100644 index 00000000..322e1b7a --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/ChannelGetAndCreateParam.java @@ -0,0 +1,25 @@ +package org.dromara.daxpay.service.device.param.terminal; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 通道终端设备报备获取和自动创建参数 + * @author xxm + * @since 2025/7/7 + */ +@Data +@Accessors(chain = true) +@Schema(title = "通道终端设备报备获取和自动创建参数") +public class ChannelGetAndCreateParam { + + @NotNull(message = "支付终端设备id不能为空") + private Long terminalId; + @NotBlank(message = "通道不能为空") + private String channel; + @NotBlank(message = "终端类型不能为空") + private String terminalType; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/ChannelTerminalParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/ChannelTerminalParam.java new file mode 100644 index 00000000..bf57db1f --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/ChannelTerminalParam.java @@ -0,0 +1,40 @@ +package org.dromara.daxpay.service.device.param.terminal; + +import org.dromara.daxpay.core.enums.ChannelTerminalStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 通道终端设备上报记录参数 + * @author xxm + * @since 2025/3/8 + */ +@Data +@Accessors(chain = true) +@Schema(title = "通道终端设备上报记录参数") +public class ChannelTerminalParam { + + /** 主键*/ + @NotNull(message = "Id不可为空") + @Schema(description = "主键") + private Long id; + + /** + * 状态 + * @see ChannelTerminalStatusEnum + */ + @NotNull(message = "状态不能为空") + @Schema(description = "状态") + private String status; + + /** 通道终端号 */ + @Schema(description = "通道终端号") + private String outTerminalNo; + + /** 清除错误信息 */ + @Schema(description = "清除错误信息") + private boolean clearErrMsg; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/TerminalDeviceParam.java similarity index 97% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/TerminalDeviceParam.java index 9522ff71..61a75e20 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/TerminalDeviceParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.termina; +package org.dromara.daxpay.service.device.param.terminal; import cn.bootx.platform.core.validation.ValidationGroup; import org.dromara.daxpay.core.enums.TerminalDeviceTypeEnum; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/TerminalDeviceQuery.java similarity index 89% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceQuery.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/TerminalDeviceQuery.java index 4d90ddcb..76667bc0 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceQuery.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/param/terminal/TerminalDeviceQuery.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.param.termina; +package org.dromara.daxpay.service.device.param.terminal; import cn.bootx.platform.core.annotation.QueryParam; import org.dromara.daxpay.core.enums.TerminalDeviceTypeEnum; -import org.dromara.daxpay.service.common.param.MchQuery; +import org.dromara.daxpay.service.pay.common.param.MchQuery; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/audio/AudioDeviceConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/audio/AudioDeviceConfigResult.java new file mode 100644 index 00000000..4391f2b5 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/audio/AudioDeviceConfigResult.java @@ -0,0 +1,35 @@ +package org.dromara.daxpay.service.device.result.audio; + +import cn.bootx.platform.core.result.BaseResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 音箱厂商配置 + * @author xxm + * @since 2025/7/7 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "音箱厂商配置") +public class AudioDeviceConfigResult extends BaseResult { + + /** 配置名称 */ + @Schema(description = "配置名称") + private String name; + + /** 厂商 */ + @Schema(description = "厂商") + private String vendor; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + + /** 配置Json */ + @Schema(description = "配置Json") + private String config; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/audio/AudioDeviceResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/audio/AudioDeviceResult.java new file mode 100644 index 00000000..a2de5040 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/audio/AudioDeviceResult.java @@ -0,0 +1,55 @@ +package org.dromara.daxpay.service.device.result.audio; + +import org.dromara.daxpay.service.device.enums.AudioBindTypeEnum; +import org.dromara.daxpay.service.merchant.result.info.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 音箱设备 + * @author xxm + * @since 2025/7/7 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "音箱设备") +public class AudioDeviceResult extends MchResult { + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** 设备号 */ + @Schema(description = "设备号") + private String deviceNo; + + /** 批次号 */ + @Schema(description = "批次号") + private String batchNo; + + /** + * 绑定类型 + * @see AudioBindTypeEnum + */ + @Schema(description = "绑定类型") + private String bindType; + + /** 绑定码牌ID */ + @Schema(description = "绑定码牌ID") + private Long cashierCodeId; + + /** 设备厂商 */ + @Schema(description = "设备厂商") + private String vendor; + + /** 配置ID */ + @Schema(description = "配置ID") + private Long configId; + + /** 状态 */ + @Schema(description = "状态") + private Boolean enable; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/pos/PosDeviceConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/pos/PosDeviceConfigResult.java new file mode 100644 index 00000000..2381b690 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/pos/PosDeviceConfigResult.java @@ -0,0 +1,35 @@ +package org.dromara.daxpay.service.device.result.pos; + +import cn.bootx.platform.core.result.BaseResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * POS设备配置 + * @author xxm + * @since 2025/7/7 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "POS设备配置") +public class PosDeviceConfigResult extends BaseResult { + + /** 配置名称 */ + @Schema(description = "配置名称") + private String name; + + /** 厂商 */ + @Schema(description = "厂商") + private String vendor; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + + /** 配置Json */ + @Schema(description = "配置Json") + private String config; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/pos/PosDeviceResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/pos/PosDeviceResult.java new file mode 100644 index 00000000..28c6b6c7 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/pos/PosDeviceResult.java @@ -0,0 +1,43 @@ +package org.dromara.daxpay.service.device.result.pos; + +import org.dromara.daxpay.service.merchant.result.info.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * POS设备 + * @author xxm + * @since 2025/7/7 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "POS设备") +public class PosDeviceResult extends MchResult { + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** 设备号 */ + @Schema(description = "设备号") + private String deviceNo; + + /** 批次号 */ + @Schema(description = "批次号") + private String batchNo; + + /** 设备厂商 */ + @Schema(description = "设备厂商") + private String vendor; + + /** 配置ID */ + @Schema(description = "配置ID") + private Long configId; + + /** 状态 */ + @Schema(description = "状态") + private Boolean enable; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/print/PrintDeviceConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/print/PrintDeviceConfigResult.java new file mode 100644 index 00000000..3fad1cde --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/print/PrintDeviceConfigResult.java @@ -0,0 +1,35 @@ +package org.dromara.daxpay.service.device.result.print; + +import cn.bootx.platform.core.result.BaseResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 打印设备配置 + * @author xxm + * @since 2025/7/7 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "打印设备配置") +public class PrintDeviceConfigResult extends BaseResult { + + /** 配置名称 */ + @Schema(description = "配置名称") + private String name; + + /** 厂商 */ + @Schema(description = "厂商") + private String vendor; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + + /** 配置Json */ + @Schema(description = "配置Json") + private String config; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/print/PrintDeviceResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/print/PrintDeviceResult.java new file mode 100644 index 00000000..9a25c6c6 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/print/PrintDeviceResult.java @@ -0,0 +1,43 @@ +package org.dromara.daxpay.service.device.result.print; + +import org.dromara.daxpay.service.merchant.result.info.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 打印设备 + * @author xxm + * @since 2025/7/7 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "打印设备") +public class PrintDeviceResult extends MchResult { + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** 设备号 */ + @Schema(description = "设备号") + private String deviceNo; + + /** 批次号 */ + @Schema(description = "批次号") + private String batchNo; + + /** 设备厂商 */ + @Schema(description = "设备厂商") + private String vendor; + + /** 配置ID */ + @Schema(description = "配置ID") + private Long configId; + + /** 状态 */ + @Schema(description = "状态") + private Boolean enable; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierCodeConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/config/CashierCodeConfigResult.java similarity index 74% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierCodeConfigResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/config/CashierCodeConfigResult.java index 641b00fa..0bdfa279 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierCodeConfigResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/config/CashierCodeConfigResult.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.result.gateway.config; +package org.dromara.daxpay.service.device.result.qrcode.config; -import org.dromara.daxpay.service.result.merchant.MchAppResult; +import org.dromara.daxpay.service.merchant.result.app.MchAppResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,18 +17,10 @@ import lombok.experimental.Accessors; @Schema(title = "收银台码牌配置") public class CashierCodeConfigResult extends MchAppResult { - /** 模板编号 */ - @Schema(description = "模板编号") - private String templateCode; - - /** 码牌名称 */ + /** 名称 */ @Schema(description = "码牌名称") private String name; - /** 码牌编码 */ - @Schema(description = "码牌编码") - private String code; - /** 是否启用 */ @Schema(description = "是否启用") private Boolean enable; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierCodeItemConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/config/CashierCodeSceneConfigResult.java similarity index 66% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierCodeItemConfigResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/config/CashierCodeSceneConfigResult.java index 1dcdbcbc..58ee4cef 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierCodeItemConfigResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/config/CashierCodeSceneConfigResult.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.result.gateway.config; +package org.dromara.daxpay.service.device.result.qrcode.config; +import cn.bootx.platform.core.result.BaseResult; import org.dromara.daxpay.core.enums.*; -import org.dromara.daxpay.service.result.merchant.MchAppResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -15,19 +15,19 @@ import lombok.experimental.Accessors; @EqualsAndHashCode(callSuper = true) @Data @Accessors(chain = true) -@Schema(title = "特定类型码牌配置") -public class CashierCodeItemConfigResult extends MchAppResult { +@Schema(title = "码牌场景配置") +public class CashierCodeSceneConfigResult extends BaseResult { /** 码牌ID */ @Schema(description = "主键ID") - private Long codeId; + private Long configId; /** - * 码牌类型 - * @see CashierCodeTypeEnum + * 收银场景 + * @see CashierSceneEnum */ - @Schema(description = "收银台类型") - private String type; + @Schema(description = "收银场景") + private String scene; /** * 支付通道 @@ -53,6 +53,10 @@ public class CashierCodeItemConfigResult extends MchAppResult { @Schema(description = "需要获取OpenId") private Boolean needOpenId; + /** OpenId获取方式 */ + @Schema(description = "OpenId获取方式") + private String openIdGetType; + /** * 发起调用的类型 * @see GatewayCallTypeEnum @@ -60,12 +64,6 @@ public class CashierCodeItemConfigResult extends MchAppResult { @Schema(description = "发起调用的类型") private String callType; - /** - * 限制用户支付类型, 目前支持限制信用卡 - * @see PayLimitPayEnum - */ - @Schema(description = "限制用户支付类型") - private String limitPay; /** 备注 */ @Schema(description = "备注") diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/info/CashierCodeResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/info/CashierCodeResult.java new file mode 100644 index 00000000..23e5ed25 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/info/CashierCodeResult.java @@ -0,0 +1,53 @@ +package org.dromara.daxpay.service.device.result.qrcode.info; + +import org.dromara.daxpay.service.merchant.result.info.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 收款码牌 + * @author xxm + * @since 2025/7/1 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "收款码牌") +public class CashierCodeResult extends MchResult { + + /** 收款金额类型 固定金额/任意金额 */ + @Schema(description = "收款金额类型") + private String amountType; + + /** 金额 */ + @Schema(description = "金额") + private BigDecimal amount; + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** 编号 */ + @Schema(description = "编号") + private String code; + + /** 配置Id */ + @Schema(description = "配置Id") + private Long configId; + + /** 模板ID */ + @Schema(description = "模板ID") + private Long templateId; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + + /** 批次号 */ + @Schema(description = "批次号") + private String batchNo; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/template/CashierCodeTemplateResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/template/CashierCodeTemplateResult.java new file mode 100644 index 00000000..2cf93fe3 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/qrcode/template/CashierCodeTemplateResult.java @@ -0,0 +1,60 @@ +package org.dromara.daxpay.service.device.result.qrcode.template; + +import cn.bootx.platform.core.result.BaseResult; +import org.dromara.daxpay.service.bo.qrcode.CashierCodeIcon; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 收款码牌模板 + * @author xxm + * @since 2025/7/1 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "收款码牌模板") +public class CashierCodeTemplateResult extends BaseResult { + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** 模板类型 */ + @Schema(description = "模板类型") + private String type; + + /** 显示ID */ + @Schema(description = "显示ID") + private Boolean showId; + + /** 显示名称 */ + @Schema(description = "显示名称") + private Boolean showName; + + /** 显示金额 */ + @Schema(description = "显示金额") + private Boolean showAmount; + + /** icon列表 */ + @Schema(description = "icon列表") + private CashierCodeIcon icon; + + /** 背景颜色类型 */ + @Schema(description = "背景颜色类型") + private String bgColorType; + + /** 背景颜色 */ + @Schema(description = "背景颜色") + private String backgroundColor; + + /** 主Logo */ + @Schema(description = "主Logo") + private String mainLogo; + + /** 二维码Logo */ + @Schema(description = "二维码Logo") + private String qrLogo; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/terminal/ChannelTerminalResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/terminal/ChannelTerminalResult.java new file mode 100644 index 00000000..14358989 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/terminal/ChannelTerminalResult.java @@ -0,0 +1,59 @@ +package org.dromara.daxpay.service.device.result.terminal; + +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.ChannelTerminalStatusEnum; +import org.dromara.daxpay.core.enums.TerminalTypeEnum; +import org.dromara.daxpay.service.merchant.result.info.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 通道终端设备上报记录 + * @author xxm + * @since 2025/3/8 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "通道终端设备上报记录") +public class ChannelTerminalResult extends MchResult { + + /** 终端设备ID */ + @Schema(description = "终端设备ID") + private Long terminalId; + + /** 终端设备编码 */ + @Schema(description = "终端设备编码") + private String terminalNo; + + /** + * 通道 + * @see ChannelEnum + */ + @Schema(description = "通道") + private String channel; + + /** + * 终端报送类型 + * @see TerminalTypeEnum + */ + @Schema(description = "终端报送类型") + private String type; + + /** + * 状态 + * @see ChannelTerminalStatusEnum + */ + @Schema(description = "状态") + private String status; + + /** 通道终端号 */ + @Schema(description = "通道终端号") + private String outTerminalNo; + + /** 错误信息 */ + @Schema(description = "错误信息") + private String errorMsg; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/termina/TerminalDeviceResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/terminal/TerminalDeviceResult.java similarity index 94% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/termina/TerminalDeviceResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/terminal/TerminalDeviceResult.java index 47c91a30..98143be2 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/termina/TerminalDeviceResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/result/terminal/TerminalDeviceResult.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.result.termina; +package org.dromara.daxpay.service.device.result.terminal; import org.dromara.daxpay.core.enums.TerminalDeviceTypeEnum; -import org.dromara.daxpay.service.common.result.MchResult; +import org.dromara.daxpay.service.merchant.result.info.MchResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeConfigService.java new file mode 100644 index 00000000..1e5e0cb0 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeConfigService.java @@ -0,0 +1,165 @@ +package org.dromara.daxpay.service.device.service.qrcode; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import org.dromara.daxpay.service.device.dao.qrcode.config.CashierCodeConfigManager; +import org.dromara.daxpay.service.device.dao.qrcode.config.CashierCodeSceneConfigManager; +import org.dromara.daxpay.service.device.entity.qrcode.config.CashierCodeConfig; +import org.dromara.daxpay.service.device.entity.qrcode.config.CashierCodeSceneConfig; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeConfigParam; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeConfigQuery; +import org.dromara.daxpay.service.device.param.qrcode.config.CashierCodeSceneConfigParam; +import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeConfigResult; +import org.dromara.daxpay.service.device.result.qrcode.config.CashierCodeSceneConfigResult; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 收银码牌配置 + * @author xxm + * @since 2025/4/1 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CashierCodeConfigService { + + private final CashierCodeConfigManager cashierCodeConfigManager; + + private final CashierCodeSceneConfigManager codeItemConfigManager; + + + /** + * 添加 + */ + public void save(CashierCodeConfigParam param) { + CashierCodeConfig config = CashierCodeConfig.init(param); + cashierCodeConfigManager.save(config); + } + + /** + * 更新 + */ + public void update(CashierCodeConfigParam param) { + CashierCodeConfig channelCashierConfig = cashierCodeConfigManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); + BeanUtil.copyProperties(param, channelCashierConfig, CopyOptions.create().ignoreNullValue()); + cashierCodeConfigManager.updateById(channelCashierConfig); + } + + /** + * 分页 + */ + public PageResult page(PageParam pageParam, CashierCodeConfigQuery query) { + return MpUtil.toPageResult(cashierCodeConfigManager.page(pageParam, query)); + } + + /** + * 下拉列表 + */ + public List dropdown() { + return cashierCodeConfigManager.findAll().stream() + .map(o->new LabelValue(o.getName(),o.getId())) + .collect(Collectors.toList()); + } + + /** + * 查询详情 + */ + public CashierCodeConfigResult findById(Long id) { + return cashierCodeConfigManager.findById(id).map(CashierCodeConfig::toResult).orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); + } + + /** + * 删除 + */ + @Transactional(rollbackFor = Exception.class) + public void delete(Long id) { + if (!cashierCodeConfigManager.existedById(id)){ + throw new DataNotExistException("收银码牌配置不存在"); + } + // 删除支付场景配置 + codeItemConfigManager.deleteByConfigId(id); + cashierCodeConfigManager.deleteById(id); + } + + /** + * 场景配置列表 + */ + public List findSceneByConfigId(Long configId) { + return MpUtil.toListResult(codeItemConfigManager.findAllByConfigId(configId)); + } + + /** + * 查询场景配置详情 + */ + public CashierCodeSceneConfigResult findItemById(Long id) { + return codeItemConfigManager.findById(id).map(CashierCodeSceneConfig::toResult).orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); + } + + /** + * 判断收银场景配置是否存在 + */ + public boolean existsByScene(String scene, Long configId) { + return codeItemConfigManager.existsByScene(scene, configId); + } + + /** + * 判断收银场景配置是否存在 + */ + public boolean existsByScene(String scene, Long configId, Long id) { + return codeItemConfigManager.existsByScene(scene, configId, id); + } + + /** + * 添加明细配置 + */ + public void saveScene(CashierCodeSceneConfigParam param) { + if (!cashierCodeConfigManager.existedById(param.getConfigId())){ + throw new DataNotExistException("收银码牌配置不存在"); + } + // 收银场景不能重复 + boolean existed = codeItemConfigManager.existsByScene(param.getScene(), param.getId()); + if (existed){ + throw new DataNotExistException("收银场景不可重复配置"); + } + + CashierCodeSceneConfig entity = CashierCodeSceneConfig.init(param); + codeItemConfigManager.save(entity); + } + + /** + * 更新明细配置 + */ + public void updateScene(CashierCodeSceneConfigParam param) { + // 收银场景不能重复 + boolean existed = codeItemConfigManager.existsByScene(param.getScene(), param.getId(), param.getId()); + if (existed){ + throw new DataNotExistException("收银场景不可重复配置"); + } + var channelCashierConfig = codeItemConfigManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); + BeanUtil.copyProperties(param, channelCashierConfig, CopyOptions.create().ignoreNullValue()); + codeItemConfigManager.updateById(channelCashierConfig); + } + + /** + * 删除明细配置 + */ + public void deleteScene(Long id) { + if (!codeItemConfigManager.existedById(id)){ + throw new DataNotExistException("该支付场景配置不存在"); + } + codeItemConfigManager.deleteById(id); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeService.java new file mode 100644 index 00000000..0a4f0c05 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeService.java @@ -0,0 +1,262 @@ +package org.dromara.daxpay.service.device.service.qrcode; + +import cn.bootx.platform.common.mybatisplus.base.MpRealDelEntity; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.exception.ValidationFailedException; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import org.dromara.daxpay.core.enums.CashierAmountTypeEnum; +import org.dromara.daxpay.service.common.entity.config.PlatformUrlConfig; +import org.dromara.daxpay.service.common.service.config.PlatformConfigService; +import org.dromara.daxpay.service.device.convert.qrcode.CashierCodeConvert; +import org.dromara.daxpay.service.device.dao.qrcode.config.CashierCodeConfigManager; +import org.dromara.daxpay.service.device.dao.qrcode.info.CashierCodeManager; +import org.dromara.daxpay.service.device.dao.qrcode.template.CashierCodeTemplateManager; +import org.dromara.daxpay.service.device.entity.qrcode.info.CashierCode; +import org.dromara.daxpay.service.device.param.commom.AssignMerchantParam; +import org.dromara.daxpay.service.device.param.qrcode.info.CashierCodeBatchParam; +import org.dromara.daxpay.service.device.param.qrcode.info.CashierCodeCreateParam; +import org.dromara.daxpay.service.device.param.qrcode.info.CashierCodeQuery; +import org.dromara.daxpay.service.device.param.qrcode.info.CashierCodeUpdateParam; +import org.dromara.daxpay.service.device.result.qrcode.info.CashierCodeResult; +import org.dromara.daxpay.service.merchant.dao.app.MchAppManager; +import org.dromara.daxpay.service.merchant.dao.info.MerchantManager; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; +import java.util.stream.IntStream; + +/** + * 收款码牌服务 + * @author xxm + * @since 2025/7/1 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CashierCodeService { + private final CashierCodeManager cashierCodeManager; + private final CashierCodeTemplateManager cashierCodeTemplateManager; + private final CashierCodeConfigManager cashierCodeConfigManager; + private final MerchantManager merchantManager; + private final MchAppManager mchAppManager; + private final PlatformConfigService platformConfigService; + + /** + * 分页 + */ + public PageResult page(PageParam pageParam, CashierCodeQuery query){ + return MpUtil.toPageResult(cashierCodeManager.page(pageParam,query)); + } + + /** + * 查询详情 + */ + public CashierCodeResult findById(Long id){ + return cashierCodeManager.findById(id).map(CashierCode::toResult) + .orElseThrow(() -> new DataNotExistException("收银码牌不存在")); + } + + /** + * 批量创建空白码牌 + */ + @Transactional(rollbackFor = Exception.class) + public void createBatch(CashierCodeBatchParam param){ + // 判断批次号是否已存在 + if (cashierCodeManager.existedByBatchNo(param.getBatchNo())){ + throw new ValidationFailedException("批次号已存在"); + } + // 判断配置和模板是否存在 + if (Objects.nonNull(param.getConfigId())){ + if (!cashierCodeConfigManager.existedById(param.getConfigId())){ + throw new ValidationFailedException("码牌配置不存在"); + } + } + if (Objects.nonNull(param.getTemplateId())){ + if (!cashierCodeTemplateManager.existedById(param.getTemplateId())){ + throw new ValidationFailedException("码牌模板不存在"); + } + } + var cashierCodes = IntStream.range(0, param.getCount()) + .mapToObj(i -> { + String code = param.getBatchNo() + String.format("%03d", i+1); + return new CashierCode() + .setCode(code) + .setBatchNo(param.getBatchNo()) + .setAmountType(param.getAmountType()) + .setAmount(param.getAmount()) + .setConfigId(param.getConfigId()) + .setTemplateId(param.getTemplateId()) + .setEnable(param.getEnable()); + }) + .toList(); + cashierCodeManager.saveAll(cashierCodes); + } + + /** + * 创建码牌 + */ + public void create(CashierCodeCreateParam param){ + // 判断配置和模板是否存在 + if (Objects.nonNull(param.getConfigId())){ + if (!cashierCodeConfigManager.existedById(param.getConfigId())){ + throw new ValidationFailedException("码牌配置不存在"); + } + } + if (Objects.nonNull(param.getTemplateId())){ + if (!cashierCodeTemplateManager.existedById(param.getTemplateId())){ + throw new ValidationFailedException("码牌模板不存在"); + } + } + CashierCode entity = CashierCodeConvert.CONVERT.toEntity(param); + cashierCodeManager.save(entity); + } + + /** + * 更新码牌信息 + */ + public void update(CashierCodeUpdateParam param){ + var cashierCode = cashierCodeManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("码牌不存在")); + // 判断配置和模板是否存在 + if (Objects.nonNull(param.getConfigId())){ + if (!cashierCodeConfigManager.existedById(param.getConfigId())){ + throw new ValidationFailedException("码牌配置不存在"); + } + } + if (Objects.nonNull(param.getTemplateId())){ + if (!cashierCodeTemplateManager.existedById(param.getTemplateId())){ + throw new ValidationFailedException("码牌模板不存在"); + } + } + // 如果是任意金额类型, 去除金额值 + if (Objects.equals(CashierAmountTypeEnum.RANDOM.getCode(), param.getAmountType())){ + param.setAmount(null); + } + BeanUtil.copyProperties(param, cashierCode); + cashierCodeManager.updateById(cashierCode); + } + + + /** + * 绑定商户和应用 + */ + @Transactional(rollbackFor = Exception.class) + public void bindMerchant(AssignMerchantParam param){ + if (StrUtil.isNotBlank(param.getMchNo())){ + var merchant = merchantManager.findByMchNo(param.getMchNo()).orElseThrow(() -> new ValidationFailedException("商户不存在")); + if (StrUtil.isNotBlank(param.getAppId())){ + var app = mchAppManager.findByAppId(param.getAppId()).orElseThrow(() -> new ValidationFailedException("应用不存在")); + if (!Objects.equals(merchant.getMchNo(), app.getMchNo())){ + throw new ValidationFailedException("商户和应用不匹配"); + } + } + } else { + param.setAppId(null); + } + cashierCodeManager.lambdaUpdate() + .set(CashierCode::getMchNo, param.getMchNo()) + .set(CashierCode::getAppId, param.getAppId()) + .in(CashierCode::getId, param.getIds()) + .setIncrBy(MpRealDelEntity::getVersion, 1) + .update(); + } + + + /** + * 商户解绑 + */ + @Transactional(rollbackFor = Exception.class) + public void unbindMerchant(AssignMerchantParam param){ + cashierCodeManager.lambdaUpdate() + .set(CashierCode::getMchNo, null) + .set(CashierCode::getAppId, null) + .in(CashierCode::getId, param.getIds()) + .setIncrBy(MpRealDelEntity::getVersion, 1) + .update(); + + } + + /** + * 绑定应用 + */ + @Transactional(rollbackFor = Exception.class) + public void bindApp(AssignMerchantParam param){ + if (StrUtil.isNotBlank(param.getAppId())){ + var app = mchAppManager.findByAppId(param.getAppId()).orElseThrow(() -> new ValidationFailedException("应用不存在")); + if (!Objects.equals(MchContextLocal.getMchNo(), app.getMchNo())){ + throw new ValidationFailedException("商户和应用不匹配"); + } + } + cashierCodeManager.lambdaUpdate() + .set(CashierCode::getAppId, param.getAppId()) + .in(CashierCode::getId, param.getIds()) + .setIncrBy(MpRealDelEntity::getVersion, 1) + .update(); + } + + /** + * 应用解绑 + */ + @Transactional(rollbackFor = Exception.class) + public void unbindApp(AssignMerchantParam param){ + cashierCodeManager.lambdaUpdate() + .set(CashierCode::getAppId, null) + .in(CashierCode::getId, param.getIds()) + .setIncrBy(MpRealDelEntity::getVersion, 1) + .update(); + } + + /** + * 获取码牌 + */ + public CashierCode getAndCheckCode(String code) { + var cashierCode = cashierCodeManager.findByCode(code) + .orElseThrow(() -> new DataNotExistException("码牌不存在")); + if (!cashierCode.getEnable()) { + throw new ValidationFailedException("码牌已禁用"); + } + //判断是否分配了商户号和应用号 + if (cashierCode.getMchNo() == null || cashierCode.getAppId() == null){ + throw new ValidationFailedException("码牌未分配商户和应用"); + } + return cashierCode; + } + + /** + * 删除码牌 + */ + public void delete(Long id) { + CashierCode cashierCode = cashierCodeManager.findById(id) + .orElseThrow(() -> new DataNotExistException("码牌不存在")); + // 判断是否已经绑定了商户和应用 + if (cashierCode.getMchNo() != null || cashierCode.getAppId() != null){ +// throw new ValidationFailedException("码牌已绑定商户和应用,请先解绑"); + } + cashierCodeManager.deleteById(id); + } + + + /** + * 获取码牌链接 + */ + public String getCodeLink(String code) { + PlatformUrlConfig urlConfig = platformConfigService.getUrlConfig(); + return StrUtil.format("{}/cashier/code/{}", urlConfig.getGatewayH5Url(),code); + } + + /** + * 判断批次号是否存在 + */ + public boolean existsByBatchNo(String batchNo){ + return cashierCodeManager.existedByBatchNo(batchNo); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeTemplateService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeTemplateService.java new file mode 100644 index 00000000..8ea544d1 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/qrcode/CashierCodeTemplateService.java @@ -0,0 +1,71 @@ +package org.dromara.daxpay.service.device.service.qrcode; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import org.dromara.daxpay.service.device.convert.qrcode.CashierCodeTemplateConvert; +import org.dromara.daxpay.service.device.dao.qrcode.template.CashierCodeTemplateManager; +import org.dromara.daxpay.service.device.entity.qrcode.template.CashierCodeTemplate; +import org.dromara.daxpay.service.device.param.qrcode.template.CashierCodeTemplateParam; +import org.dromara.daxpay.service.device.param.qrcode.template.CashierCodeTemplateQuery; +import org.dromara.daxpay.service.device.result.qrcode.template.CashierCodeTemplateResult; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 收款码牌模板服务 + * @author xxm + * @since 2025/7/1 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CashierCodeTemplateService { + private final CashierCodeTemplateManager codeTemplateManager; + + /** + * 分页 + */ + public PageResult page(PageParam pageParam, CashierCodeTemplateQuery query){ + return MpUtil.toPageResult(codeTemplateManager.page(pageParam, query)); + } + + /** + * 详情 + */ + public CashierCodeTemplateResult findById(Long id){ + return codeTemplateManager.findById(id) + .map(CashierCodeTemplate::toResult) + .orElseThrow(() -> new DataNotExistException("收银码牌模板不存在")); + } + + /** + * 生成预览图 + */ + public String generatePreviewImg(CashierCodeTemplateParam param){ + return ""; + } + + /** + * 新增 + */ + public void create(CashierCodeTemplateParam param){ + var entity = CashierCodeTemplateConvert.CONVERT.toEntity(param); + // 保存 + codeTemplateManager.save(entity); + + } + + /** + * 修改 + */ + public void update(CashierCodeTemplateParam param){ + var template = codeTemplateManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("收款码牌模板不存在")); + BeanUtil.copyProperties(param, template); + codeTemplateManager.updateById(template); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/terminal/ChannelTerminalService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/terminal/ChannelTerminalService.java new file mode 100644 index 00000000..1afb03d9 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/terminal/ChannelTerminalService.java @@ -0,0 +1,162 @@ +package org.dromara.daxpay.service.device.service.terminal; + +import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; +import cn.bootx.platform.core.exception.DataNotExistException; +import org.dromara.daxpay.core.enums.ChannelTerminalStatusEnum; +import org.dromara.daxpay.service.device.dao.terminal.ChannelTerminalManager; +import org.dromara.daxpay.service.device.dao.terminal.TerminalDeviceManager; +import org.dromara.daxpay.service.device.entity.terminal.ChannelTerminal; +import org.dromara.daxpay.service.device.param.terminal.ChannelGetAndCreateParam; +import org.dromara.daxpay.service.device.param.terminal.ChannelTerminalParam; +import org.dromara.daxpay.service.device.result.terminal.ChannelTerminalResult; +import org.dromara.daxpay.service.pay.dao.constant.TerminalConstManager; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.strategy.AbsChannelTerminalStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 通道终端设备管理 + * @author xxm + * @since 2025/7/7 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ChannelTerminalService { + private final ChannelTerminalManager channelTerminalManager; + private final TerminalDeviceManager terminalManager; + private final PaymentAssistService paymentAssistService; + private final TerminalConstManager terminalConstManager; + + /** + * 根据终端ID查询通道报备列表 + */ + public List channelList(Long terminalId){ + var terminal = terminalManager.findById(terminalId).orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); + var terminalChannelMap = channelTerminalManager.findAllByTerminalId(terminalId).stream() + .collect(Collectors.toMap(ChannelTerminal::genUpType, Function.identity(), CollectorsFunction::retainFirst)); + var terminalTypes = terminalConstManager.findAllEnable(); + // 组装列表 + return terminalTypes.stream() + .map(o -> { + var terminalChannel = terminalChannelMap.get(o.getChannel()+":"+o.getType()); + if (Objects.isNull(terminalChannel)) { + return new ChannelTerminalResult() + .setChannel(o.getChannel()) + .setType(o.getType()) + .setTerminalId(terminal.getId()) + .setTerminalNo(terminal.getTerminalNo()); + } else { + return terminalChannel.toResult(); + } + }) + .toList(); + } + + /** + * 通道报备 + */ + public void channelSubmit(Long terminalChannelId){ + var terminalChannel = channelTerminalManager.findById(terminalChannelId) + .orElseThrow(() -> new DataNotExistException("通道支付终端报备信息不存在")); + var terminal = terminalManager.findById(terminalChannel.getTerminalId()) + .orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); + // 查询通道报备策略 + var strategy = PaymentStrategyFactory.create(terminalChannel.getChannel(), AbsChannelTerminalStrategy.class); + // 提交报备 + paymentAssistService.initMchAndApp(terminal.getMchNo(),terminal.getAppId()); + var terminalBo = strategy.submit(terminal,terminalChannel); + terminalChannel.setOutTerminalNo(terminalBo.getDeviceNo()) + .setErrorMsg(terminalBo.getErrorMsg()) + .setStatus(terminalBo.isSuccess()? ChannelTerminalStatusEnum.SUBMIT.getCode(): ChannelTerminalStatusEnum.ERROR.getCode()); + channelTerminalManager.updateById(terminalChannel); + + } + + /** + * 通道取消报备 + */ + public void channelCancel(Long terminalChannelId){ + var terminalChannel = channelTerminalManager.findById(terminalChannelId).orElseThrow(() -> new DataNotExistException("通道支付终端报备信息不存在")); + var terminal = terminalManager.findById(terminalChannel.getTerminalId()).orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); + // 查询通道报备策略 + var strategy = PaymentStrategyFactory.create(terminalChannel.getChannel(), AbsChannelTerminalStrategy.class); + // 注销设备 + paymentAssistService.initMchAndApp(terminal.getMchNo(),terminal.getAppId()); + var terminalBo = strategy.cancel(terminal, terminalChannel); + terminalChannel.setErrorMsg(terminalBo.getErrorMsg()) + .setStatus(terminalBo.isSuccess()?ChannelTerminalStatusEnum.LOGGED.getCode(): ChannelTerminalStatusEnum.ERROR.getCode()); + channelTerminalManager.updateById(terminalChannel); + } + + /** + * 同步报备信息 + */ + public void channelSync(Long terminalChannelId){ + var terminalChannel = channelTerminalManager.findById(terminalChannelId).orElseThrow(() -> new DataNotExistException("通道支付终端报备信息不存在")); + var terminal = terminalManager.findById(terminalChannel.getTerminalId()).orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); + // 查询通道报备策略 + var strategy = PaymentStrategyFactory.create(terminalChannel.getChannel(), AbsChannelTerminalStrategy.class); + // 同步设备 + paymentAssistService.initMchAndApp(terminal.getMchNo(),terminal.getAppId()); + var terminalBo = strategy.sync(terminal, terminalChannel); + terminalChannel.setErrorMsg(terminalBo.getErrorMsg()) + .setStatus(terminalBo.getStatus().getCode()); + // 成功则设置通道终端号 + if (terminalBo.getStatus() == ChannelTerminalStatusEnum.SUBMIT){ + terminalChannel.setOutTerminalNo(terminalBo.getDeviceNo()); + } + channelTerminalManager.updateById(terminalChannel); + } + + /** + * 手动更改通道报备状态 + */ + public void channelEdit(ChannelTerminalParam param){ + var terminalChannel = channelTerminalManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("通道支付终端报备信息不存在")); + terminalChannel.setStatus(param.getStatus()) + .setOutTerminalNo(param.getOutTerminalNo()); + if (param.isClearErrMsg()){ + terminalChannel.setErrorMsg(null); + } + channelTerminalManager.updateById(terminalChannel); + } + + /** + * 通道报备详情 + */ + public ChannelTerminalResult channelDetail(Long terminalChannelId){ + return channelTerminalManager.findById(terminalChannelId).map(ChannelTerminal::toResult) + .orElseThrow(() -> new DataNotExistException("通道支付终端报备信息不存在")); + } + + /** + * 获取终端通道报备信息, 如果不存在进行创建 + */ + public ChannelTerminalResult getAndCreate(ChannelGetAndCreateParam param){ + var channelTerminal = channelTerminalManager.findByByTerminal(param.getTerminalId(), param.getChannel(), param.getTerminalType()); + if (channelTerminal.isEmpty()){ + var terminal = terminalManager.findById(param.getTerminalId()).orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); + var terminalChannel = new ChannelTerminal() + .setTerminalId(param.getTerminalId()) + .setTerminalNo(terminal.getTerminalNo()) + .setChannel(param.getChannel()) + .setType(param.getTerminalType()) + .setStatus(ChannelTerminalStatusEnum.WAIT.getCode()); + terminalChannel.setAppId(terminal.getAppId()) + .setMchNo(terminal.getMchNo()); + channelTerminalManager.save(terminalChannel); + return terminalChannel.toResult(); + } + return channelTerminal.get().toResult(); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/terminal/TerminalDeviceService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/terminal/TerminalDeviceService.java new file mode 100644 index 00000000..07ceb461 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/device/service/terminal/TerminalDeviceService.java @@ -0,0 +1,183 @@ +package org.dromara.daxpay.service.device.service.terminal; + +import cn.bootx.platform.common.mybatisplus.base.MpRealDelEntity; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.BizException; +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.exception.ValidationFailedException; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import org.dromara.daxpay.core.exception.DataErrorException; +import org.dromara.daxpay.service.device.dao.terminal.ChannelTerminalManager; +import org.dromara.daxpay.service.device.dao.terminal.TerminalDeviceManager; +import org.dromara.daxpay.service.device.entity.terminal.TerminalDevice; +import org.dromara.daxpay.service.device.param.commom.AssignMerchantParam; +import org.dromara.daxpay.service.device.param.terminal.TerminalDeviceParam; +import org.dromara.daxpay.service.device.param.terminal.TerminalDeviceQuery; +import org.dromara.daxpay.service.device.result.terminal.TerminalDeviceResult; +import org.dromara.daxpay.service.merchant.dao.app.MchAppManager; +import org.dromara.daxpay.service.merchant.dao.info.MerchantManager; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; + +/** + * 支付终端设备管理 + * @author xxm + * @since 2025/3/7 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class TerminalDeviceService { + private final TerminalDeviceManager terminalDeviceManager; + private final ChannelTerminalManager channelTerminalManager; + private final MchAppManager mchAppManager; + private final MerchantManager merchantManager; + + /** + * 分页 + */ + public PageResult page(PageParam pageParam, TerminalDeviceQuery query){ + return MpUtil.toPageResult(terminalDeviceManager.page(pageParam, query)); + } + + /** + * 查询详情 + */ + public TerminalDeviceResult findById(Long id){ + return terminalDeviceManager.findById(id).map(TerminalDevice::toResult) + .orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); + } + + /** + * 创建 + */ + public void add(TerminalDeviceParam param){ + var entity = TerminalDevice.init(param); + entity.setTerminalNo(genTerminalNo()); + terminalDeviceManager.save(entity); + } + + /** + * 修改 + */ + public void edit(TerminalDeviceParam param){ + var entity = terminalDeviceManager.findById(param.getId()).orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); + BeanUtil.copyProperties(param, entity, CopyOptions.create().ignoreNullValue()); + terminalDeviceManager.updateById(entity); + } + + + /** + * 绑定商户和应用 + */ + @Transactional(rollbackFor = Exception.class) + public void bindMerchant(AssignMerchantParam param){ + if (StrUtil.isNotBlank(param.getMchNo())){ + var merchant = merchantManager.findByMchNo(param.getMchNo()).orElseThrow(() -> new ValidationFailedException("商户不存在")); + if (StrUtil.isNotBlank(param.getAppId())){ + var app = mchAppManager.findByAppId(param.getAppId()).orElseThrow(() -> new ValidationFailedException("应用不存在")); + if (!Objects.equals(merchant.getMchNo(), app.getMchNo())){ + throw new ValidationFailedException("商户和应用不匹配"); + } + } + } else { + param.setAppId(null); + } + terminalDeviceManager.lambdaUpdate() + .set(TerminalDevice::getMchNo, param.getMchNo()) + .set(TerminalDevice::getAppId, param.getAppId()) + .in(TerminalDevice::getId, param.getIds()) + .setIncrBy(MpRealDelEntity::getVersion, 1) + .update(); + } + + /** + * 商户解绑 + */ + @Transactional(rollbackFor = Exception.class) + public void unbindMerchant(AssignMerchantParam param){ + terminalDeviceManager.lambdaUpdate() + .set(TerminalDevice::getMchNo, null) + .set(TerminalDevice::getAppId, null) + .in(TerminalDevice::getId, param.getIds()) + .setIncrBy(MpRealDelEntity::getVersion, 1) + .update(); + + } + + /** + * 绑定应用 + */ + @Transactional(rollbackFor = Exception.class) + public void bindApp(AssignMerchantParam param){ + if (StrUtil.isNotBlank(param.getAppId())){ + var app = mchAppManager.findByAppId(param.getAppId()).orElseThrow(() -> new ValidationFailedException("应用不存在")); + if (!Objects.equals(MchContextLocal.getMchNo(), app.getMchNo())){ + throw new ValidationFailedException("商户和应用不匹配"); + } + } + terminalDeviceManager.lambdaUpdate() + .set(TerminalDevice::getAppId, param.getAppId()) + .in(TerminalDevice::getId, param.getIds()) + .setIncrBy(MpRealDelEntity::getVersion, 1) + .update(); + } + + /** + * 应用解绑 + */ + @Transactional(rollbackFor = Exception.class) + public void unbindApp(AssignMerchantParam param){ + terminalDeviceManager.lambdaUpdate() + .set(TerminalDevice::getAppId, null) + .in(TerminalDevice::getId, param.getIds()) + .setIncrBy(MpRealDelEntity::getVersion, 1) + .update(); + } + + /** + * 删除 + */ + public void delete(Long id){ + // 判断是有已经进行了上报的 + if (channelTerminalManager.existsByTerminalId(id)){ + throw new DataErrorException("该终端设备下有通道报备记录,无法被删除"); + } + terminalDeviceManager.deleteById(id); + } + + /** + * 终端下拉列表(应用) + */ + public List dropdownByAppId(String appId) { + return terminalDeviceManager.findAllByField(TerminalDevice::getAppId, appId).stream() + .map(o -> new LabelValue(o.getName(), o.getTerminalNo())) + .toList(); + } + + /** + * 生成终端号 + */ + private String genTerminalNo(){ + String terminalNo = "D"+ RandomUtil.randomNumbers(16); + for (int i = 0; i < 10; i++){ + if (!terminalDeviceManager.existedByField(TerminalDevice::getTerminalNo, terminalNo)){ + return terminalNo; + } + terminalNo = "D"+ RandomUtil.randomNumbers(16); + } + throw new BizException("设备终端号生成失败"); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java deleted file mode 100644 index 1028189f..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dromara.daxpay.service.entity.allocation; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.allocation.AllocConfigConvert; -import org.dromara.daxpay.service.param.allocation.AllocConfigParam; -import org.dromara.daxpay.service.result.allocation.AllocConfigResult; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.util.Objects; - -/** - * 分账配置 - * @author xxm - * @since 2024/10/6 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_alloc_config") -public class AllocConfig extends MchAppBaseEntity implements ToResult { - - /** 是否自动分账 */ - private Boolean autoAlloc; - - /** 自动完结 */ - private Boolean autoFinish; - - /** 分账起始额 */ - private BigDecimal minAmount; - - /** 分账延迟时长(分钟) */ - private Integer delayTime; - - - public Boolean getAutoFinish() { - return Objects.equals(autoFinish, true); - } - - public Boolean getAutoAlloc() { - return Objects.equals(autoAlloc, true); - } - - /** - * 创建对象 - */ - public static AllocConfig init(AllocConfigParam param) { - return AllocConfigConvert.CONVERT.toEntity(param); - } - /** - * 转换 - */ - @Override - public AllocConfigResult toResult() { - return AllocConfigConvert.CONVERT.toResult(this); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocAndDetail.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocAndDetail.java deleted file mode 100644 index 987bf046..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocAndDetail.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.dromara.daxpay.service.entity.allocation.order; - -import java.util.List; - -/** - * 分账订单和分账明细 - * @author xxm - * @since 2024/11/14 - */ -public record AllocAndDetail(AllocOrder transaction, List details) {} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocDetail.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocDetail.java deleted file mode 100644 index 22c30f9e..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocDetail.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.dromara.daxpay.service.entity.allocation.order; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; -import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 分账明细 - * @author xxm - * @since 2024/11/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_alloc_detail") -public class AllocDetail extends MchAppBaseEntity implements ToResult { - - /** 分账订单ID */ - private Long allocationId; - - /** 外部明细ID */ - private String outDetailId; - - /** 接收者ID */ - private Long receiverId; - - /** 分账接收方编号 */ - private String receiverNo; - - /** 分账比例 */ - private BigDecimal rate; - - /** 分账金额 */ - private BigDecimal amount; - - /** - * 分账接收方类型 - * @see AllocReceiverTypeEnum - */ - private String receiverType; - - /** 接收方账号 */ - private String receiverAccount; - - /** 接收方姓名 */ - private String receiverName; - - /** - * 分账结果 - * @see AllocDetailResultEnum - */ - private String result; - - /** 错误代码 */ - private String errorCode; - - /** 错误原因 */ - private String errorMsg; - - /** 分账完成时间 */ - private LocalDateTime finishTime; - - /** - * 转换 - */ - @Override - public AllocDetailVo toResult() { - return AllocOrderConvert.CONVERT.toVo(this); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocOrder.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocOrder.java deleted file mode 100644 index 4d926d1c..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocOrder.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.dromara.daxpay.service.entity.allocation.order; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.core.enums.AllocationResultEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; -import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 分账交易记录 - * @author xxm - * @since 2024/11/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_alloc_order") -public class AllocOrder extends MchAppBaseEntity implements ToResult { - - /** 分账单号 */ - private String allocNo; - - /** 商户分账单号 */ - private String bizAllocNo; - - /** 通道分账号 */ - private String outAllocNo; - - /** 支付订单ID */ - private Long orderId; - - /** 支付订单号 */ - private String orderNo; - - /** 商户支付订单号 */ - private String bizOrderNo; - - /** 通道支付订单号 */ - private String outOrderNo; - - /** 支付标题 */ - private String title; - - /** - * 所属通道 - * @see ChannelEnum - */ - private String channel; - -// /** -// * 支付订单金额 -// */ -// private BigDecimal orderAmount; - - /** - * 总分账金额 - */ - private BigDecimal amount; - - /** - * 分账描述 - */ - private String description; - - /** - * 状态 - * @see AllocationStatusEnum - */ - private String status; - - /** - * 处理结果 - * @see AllocationResultEnum - */ - private String result; - - /** 分账完成时间 */ - private LocalDateTime finishTime; - - /** 异步通知地址 */ - @TableField(updateStrategy = FieldStrategy.ALWAYS) - private String notifyUrl; - - /** 商户扩展参数,回调时会原样返回 */ - private String attach; - - /** 请求时间,时间戳转时间 */ - private LocalDateTime reqTime; - - /** 终端ip */ - private String clientIp; - - /** 错误码 */ - private String errorCode; - - /** 错误信息 */ - private String errorMsg; - - /** - * 转换 - */ - @Override - public AllocOrderVo toResult() { - return AllocOrderConvert.CONVERT.toVo(this); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java deleted file mode 100644 index b2fd0b33..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.dromara.daxpay.service.entity.allocation.receiver; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.allocation.AllocGroupConvert; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupVo; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 分账组 - * @author xxm - * @since 2024/6/4 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_alloc_group") -public class AllocGroup extends MchAppBaseEntity implements ToResult { - - /** 分账组编码 */ - private String groupNo; - - /** 名称 */ - private String name; - - /** 通道 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - private String channel; - - /** 是否为默认分账组 */ - private boolean defaultGroup; - - /** 总分账比例(百分之多少) */ - private BigDecimal totalRate; - - /** 备注 */ - @Deprecated - private String remark; - - @Override - public AllocGroupVo toResult() { - return AllocGroupConvert.CONVERT.toVo(this); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroupReceiver.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroupReceiver.java deleted file mode 100644 index 23c97411..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroupReceiver.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.dromara.daxpay.service.entity.allocation.receiver; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.allocation.AllocGroupReceiverConvert; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 分账组和接收者关系 - * @author xxm - * @since 2024/6/4 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_alloc_group_receiver") -public class AllocGroupReceiver extends MchAppBaseEntity implements ToResult { - - /** 分账组ID */ - private Long groupId; - - /** 接收者ID */ - private Long receiverId; - - /** 分账比例(百分之多少) */ - private BigDecimal rate; - - @Override - public AllocGroupReceiverVo toResult() { - return AllocGroupReceiverConvert.CONVERT.toVo(this); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocReceiver.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocReceiver.java deleted file mode 100644 index 3b83cbca..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocReceiver.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.dromara.daxpay.service.entity.allocation.receiver; - -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import cn.bootx.platform.core.annotation.BigField; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.allocation.AllocReceiverConvert; -import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import lombok.experimental.FieldNameConstants; - -/** - * 分账接收方 - * @author xxm - * @since 2024/6/4 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@FieldNameConstants -@Accessors(chain = true) -@TableName("pay_alloc_receiver") -public class AllocReceiver extends MchAppBaseEntity implements ToResult { - - /** 分账接收方编号, 需要保证唯一 */ - private String receiverNo; - - /** 接收方名称 */ - private String receiverName; - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - private String receiverType; - - /** 接收方账号 */ - private String receiverAccount; - - /** - * 所属通道 - * @see ChannelEnum - */ - @TableField(updateStrategy = FieldStrategy.NEVER) - private String channel; - - /** 扩展存储 */ - @BigField - private String ext; - - @Override - public AllocReceiverVo toResult() { - return AllocReceiverConvert.CONVERT.toBo(this); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/PlatformConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/PlatformConfig.java deleted file mode 100644 index e6c5aa02..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/PlatformConfig.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.dromara.daxpay.service.entity.config; - -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.convert.config.PlatformConfigConvert; -import org.dromara.daxpay.service.result.config.PlatformConfigResult; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 管理平台配置 - * @author xxm - * @since 2024/6/5 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_platform_config") -public class PlatformConfig extends MpBaseEntity implements ToResult { - - /** 支付网关地址 */ - private String gatewayServiceUrl; - - /** 网关移动端地址 */ - private String gatewayMobileUrl; - - /** 全局单笔限额 */ - @TableField(updateStrategy = FieldStrategy.ALWAYS) - private BigDecimal limitAmount; - - public String getGatewayServiceUrl() { - return StrUtil.removeSuffix(gatewayServiceUrl, "/"); - } - - public String getGatewayMobileUrl() { - return StrUtil.removeSuffix(gatewayMobileUrl, "/"); - } - - /** - * 转换 - */ - @Override - public PlatformConfigResult toResult() { - return PlatformConfigConvert.CONVERT.toResult(this); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/AllocationEventService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/AllocationEventService.java deleted file mode 100644 index 6608d406..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/event/AllocationEventService.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.dromara.daxpay.service.event; - -import cn.bootx.platform.starter.redis.delay.annotation.DelayEventListener; -import cn.bootx.platform.starter.redis.delay.annotation.DelayJobEvent; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.service.allocation.AllocationService; -import org.dromara.daxpay.service.service.allocation.AllocationSyncService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.order.pay.PayOrderService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -/** - * 分账事件 - * @author xxm - * @since 2024/12/17 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AllocationEventService { - private final AllocationSyncService syncService; - - private final AllocationService allocationService; - - private final PayOrderService payOrderService; - private final PaymentAssistService paymentAssistService; - private final PayOrderManager payOrderManager; - private final AllocOrderManager allocOrderManager; - - /** - * 自动分账 参数为订单号 - */ - @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_START) - public void start(DelayJobEvent event) { - var payOrderOpt = payOrderManager.findByIdNotTenant(event.getMessage()); - if (payOrderOpt.isPresent()){ - var payOrder = payOrderOpt.get(); - paymentAssistService.initMchAndApp(payOrder.getAppId()); - payOrderService.autoAllocation(payOrder); - log.info("分账开始,订单号:{}", event.getMessage()); - } else { - log.warn("自动分账订单不存在,订单号:{}", event.getMessage()); - } - } - - /** - * 分账同步 - */ - @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_SYNC) - public void sync(DelayJobEvent event) { - Optional opt = allocOrderManager.findByIdNotTenant(event.getMessage()); - if (opt.isPresent()){ - var allocOrder = opt.get(); - paymentAssistService.initMchAndApp(allocOrder.getAppId()); - syncService.autoSync(allocOrder); - log.info("分账同步,订单号:{}", event.getMessage()); - } else { - log.warn("分账同步订单不存在,订单号:{}", event.getMessage()); - } - } - - /** - * 分账完结 - */ - @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_FINISH) - public void finish(DelayJobEvent event) { - Optional opt = allocOrderManager.findByIdNotTenant(event.getMessage()); - if (opt.isPresent()){ - var allocOrder = opt.get(); - paymentAssistService.initMchAndApp(allocOrder.getAppId()); - allocationService.autoFinish(allocOrder); - log.info("分账完结,订单号:{}", event.getMessage()); - } else { - log.warn("分账完结订单不存在,订单号:{}", event.getMessage()); - } - - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/cache/IsvChannelConfigCacheService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/cache/IsvChannelConfigCacheService.java new file mode 100644 index 00000000..d3ac174c --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/cache/IsvChannelConfigCacheService.java @@ -0,0 +1,32 @@ +package org.dromara.daxpay.service.isv.cache; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.exception.ConfigNotEnableException; +import org.dromara.daxpay.service.isv.dao.config.IsvChannelConfigManager; +import org.dromara.daxpay.service.isv.entity.config.IsvChannelConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * 服务商通道配置缓存服务 + * @author xxm + * @since 2024/10/31 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class IsvChannelConfigCacheService { + + private final IsvChannelConfigManager channelConfigManager; + + /** + * 获取服务商通道配置 + */ + @Cacheable(value = "cache:isv:channelConfig", key = "#channel") + public IsvChannelConfig get(String channel) { + return channelConfigManager.findByChannel(channel) + .orElseThrow(() -> new ConfigNotEnableException("未找到指定的服务商通道配置")); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/config/IsvChannelConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/config/IsvChannelConfigConvert.java new file mode 100644 index 00000000..4057275c --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/config/IsvChannelConfigConvert.java @@ -0,0 +1,19 @@ +package org.dromara.daxpay.service.isv.convert.config; + +import org.dromara.daxpay.service.isv.entity.config.IsvChannelConfig; +import org.dromara.daxpay.service.isv.result.config.IsvChannelConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2024/10/30 + */ +@Mapper +public interface IsvChannelConfigConvert { + IsvChannelConfigConvert CONVERT = Mappers.getMapper(IsvChannelConfigConvert.class); + + IsvChannelConfigResult toResult(IsvChannelConfig entity); + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvAggregateBarPayConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvAggregateBarPayConfigConvert.java new file mode 100644 index 00000000..705aded9 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvAggregateBarPayConfigConvert.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.service.isv.convert.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvAggregateBarPayConfig; +import org.dromara.daxpay.service.isv.param.gateway.IsvAggregateBarPayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvAggregateBarPayConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 聚合支付码支付 + * @author xxm + * @since 2025/3/21 + */ +@Mapper +public interface IsvAggregateBarPayConfigConvert { + IsvAggregateBarPayConfigConvert CONVERT = Mappers.getMapper(IsvAggregateBarPayConfigConvert.class); + + IsvAggregateBarPayConfig toEntity(IsvAggregateBarPayConfigParam param); + + IsvAggregateBarPayConfigResult toResult(IsvAggregateBarPayConfig aggregateBarPayConfig); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvAggregatePayConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvAggregatePayConfigConvert.java new file mode 100644 index 00000000..94c15e28 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvAggregatePayConfigConvert.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.service.isv.convert.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvAggregatePayConfig; +import org.dromara.daxpay.service.isv.param.gateway.IsvAggregatePayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvAggregatePayConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 网关聚合支付配置 + * @author xxm + * @since 2025/3/19 + */ +@Mapper +public interface IsvAggregatePayConfigConvert { + IsvAggregatePayConfigConvert CONVERT = Mappers.getMapper(IsvAggregatePayConfigConvert.class); + + IsvAggregatePayConfigResult toResult(IsvAggregatePayConfig aggregatePayConfig); + + IsvAggregatePayConfig toEntity(IsvAggregatePayConfigParam param); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvCashierGroupConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvCashierGroupConfigConvert.java new file mode 100644 index 00000000..f6183289 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvCashierGroupConfigConvert.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.service.isv.convert.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvCashierGroupConfig; +import org.dromara.daxpay.service.isv.param.gateway.IsvCashierGroupConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvCashierGroupConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 网关收银台分组配置转换 + * @author xxm + * @since 2025/3/19 + */ +@Mapper +public interface IsvCashierGroupConfigConvert { + IsvCashierGroupConfigConvert CONVERT = Mappers.getMapper(IsvCashierGroupConfigConvert.class); + + IsvCashierGroupConfig toEntity(IsvCashierGroupConfigParam param); + + IsvCashierGroupConfigResult toResult(IsvCashierGroupConfig cashierGroupConfig); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvCashierItemConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvCashierItemConfigConvert.java new file mode 100644 index 00000000..aaf1359c --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvCashierItemConfigConvert.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.service.isv.convert.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvCashierItemConfig; +import org.dromara.daxpay.service.isv.param.gateway.IsvCashierItemConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvCashierItemConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 网关收银台配置项转换 + * @author xxm + * @since 2025/3/19 + */ +@Mapper +public interface IsvCashierItemConfigConvert { + IsvCashierItemConfigConvert CONVERT = Mappers.getMapper(IsvCashierItemConfigConvert.class); + + IsvCashierItemConfig toEntity(IsvCashierItemConfigParam param); + + IsvCashierItemConfigResult toResult(IsvCashierItemConfig gatewayCashierItemConfig); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvGatewayPayConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvGatewayPayConfigConvert.java new file mode 100644 index 00000000..e5a50028 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/convert/gateway/IsvGatewayPayConfigConvert.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.service.isv.convert.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvGatewayPayConfig; +import org.dromara.daxpay.service.isv.param.gateway.IsvGatewayPayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvGatewayPayConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 聚合支付配置转换 + * @author xxm + * @since 2025/6/30 + */ +@Mapper +public interface IsvGatewayPayConfigConvert { + IsvGatewayPayConfigConvert CONVERT = Mappers.getMapper(IsvGatewayPayConfigConvert.class); + + IsvGatewayPayConfig toEntity(IsvGatewayPayConfigParam param); + + IsvGatewayPayConfigResult toResult(IsvGatewayPayConfig isvGatewayPayConfig); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/config/IsvChannelConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/config/IsvChannelConfigManager.java new file mode 100644 index 00000000..a4e08c9f --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/config/IsvChannelConfigManager.java @@ -0,0 +1,71 @@ +package org.dromara.daxpay.service.isv.dao.config; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.service.isv.entity.config.IsvChannelConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Repository; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +/** + * 服务商通道配置 + * @author xxm + * @since 2024/10/30 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class IsvChannelConfigManager extends BaseManager { + /** + * 根据id进行更新 + */ + @Override + @CacheEvict(value = "cache:isv:channelConfig", key = "#channelConfig.channel") + public int updateById(IsvChannelConfig channelConfig) { + return super.updateById(channelConfig); + } + + /** + * 批量更新 + */ + @Override + @CacheEvict(value = "cache:isv:channelConfig", allEntries = true) + public boolean updateAllById(Collection entityList) { + return super.updateAllById(entityList); + } + + + /** + * 根据服务商号查询启用的配置 + */ + public List findEnable() { + return lambdaQuery() + .select(this.getEntityClass (), MpUtil::excludeBigField) + .eq(IsvChannelConfig::isEnable, true) + .list(); + } + + /** + * 根据服务商号和通道查询 + */ + public Optional findByChannel(String channel) { + return lambdaQuery() + .eq(IsvChannelConfig::getChannel, channel) + .oneOpt(); + } + + /** + * 判断是服务商否存在指定的通道配置 + */ + public boolean existsByChannel(String channel) { + return lambdaQuery() + .eq(IsvChannelConfig::getChannel, channel) + .exists(); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/config/IsvChannelConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/config/IsvChannelConfigMapper.java new file mode 100644 index 00000000..1fab91f6 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/config/IsvChannelConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.isv.dao.config; + +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.daxpay.service.isv.entity.config.IsvChannelConfig; + +/** + * + * @author xxm + * @since 2024/10/30 + */ +@Mapper +public interface IsvChannelConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregateBarPayConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregateBarPayConfigManager.java new file mode 100644 index 00000000..91f24bf6 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregateBarPayConfigManager.java @@ -0,0 +1,49 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.isv.entity.gateway.IsvAggregateBarPayConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 网关聚合付款码支付配置 + * @author xxm + * @since 2025/3/24 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class IsvAggregateBarPayConfigManager extends BaseManager { + + + /** + * 根据应用ID和类型查询配置 + */ + public List findByType(String barPayType) { + return lambdaQuery() + .eq(IsvAggregateBarPayConfig::getBarPayType, barPayType) + .list(); + } + + /** + * 根据应用ID和类型查询配置是否存在 + */ + public boolean existsByType(String type){ + return lambdaQuery() + .eq(IsvAggregateBarPayConfig::getBarPayType, type) + .exists(); + } + + /** + * 根据应用ID和类型查询配置是否存在 + */ + public boolean existsByType(String type, Long id){ + return lambdaQuery() + .eq(IsvAggregateBarPayConfig::getBarPayType, type) + .ne(IsvAggregateBarPayConfig::getId, id) + .exists(); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregateBarPayConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregateBarPayConfigMapper.java new file mode 100644 index 00000000..d9f92c96 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregateBarPayConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvAggregateBarPayConfig; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 网关聚合付款码支付配置 + * @author xxm + * @since 2025/3/24 + */ +@Mapper +public interface IsvAggregateBarPayConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregatePayConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregatePayConfigManager.java new file mode 100644 index 00000000..42b79fec --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregatePayConfigManager.java @@ -0,0 +1,50 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.isv.entity.gateway.IsvAggregatePayConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +/** + * 网关聚合支付配置 + * @author xxm + * @since 2025/3/19 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class IsvAggregatePayConfigManager extends BaseManager { + + + /** + * 根据应用ID和类型查询配置 + */ + public Optional findByType(String type) { + return lambdaQuery() + .eq(IsvAggregatePayConfig::getAggregateType, type) + .oneOpt(); + } + + /** + * 根据服务商和类型查询配置是否存在 + */ + public boolean existsByType(String type){ + return lambdaQuery() + .eq(IsvAggregatePayConfig::getAggregateType, type) + .exists(); + } + + /** + * 根据应用ID和类型查询配置是否存在 + */ + public boolean existsByType(String type, Long id){ + return lambdaQuery() + .eq(IsvAggregatePayConfig::getAggregateType, type) + .ne(IsvAggregatePayConfig::getId, id) + .exists(); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregatePayConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregatePayConfigMapper.java new file mode 100644 index 00000000..af3685e8 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvAggregatePayConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvAggregatePayConfig; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 网关聚合支付配置 + * @author xxm + * @since 2025/3/19 + */ +@Mapper +public interface IsvAggregatePayConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierGroupConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierGroupConfigManager.java new file mode 100644 index 00000000..ec68643a --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierGroupConfigManager.java @@ -0,0 +1,40 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.isv.entity.gateway.IsvCashierGroupConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 网关收银台分组配置 + * @author xxm + * @since 2025/3/19 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class IsvCashierGroupConfigManager extends BaseManager { + + + /** + * 查询指定类型的分组, 并进行排序 + */ + public List findAllByType(String cashierType){ + return lambdaQuery() + .eq(IsvCashierGroupConfig::getCashierType, cashierType) + .orderByAsc(IsvCashierGroupConfig::getSortNo) + .list(); + } + + /** + * 判断指定类型的分组是否存在 + */ + public boolean existedByType(String cashierType) { + return lambdaQuery() + .eq(IsvCashierGroupConfig::getCashierType, cashierType) + .exists(); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierGroupConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierGroupConfigMapper.java new file mode 100644 index 00000000..c4b8f8a1 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierGroupConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvCashierGroupConfig; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 网关收银台分组配置 + * @author xxm + * @since 2025/3/19 + */ +@Mapper +public interface IsvCashierGroupConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierItemConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierItemConfigManager.java new file mode 100644 index 00000000..0c6d98a1 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierItemConfigManager.java @@ -0,0 +1,49 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.isv.entity.gateway.IsvCashierItemConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 网关收银台配置项 + * @author xxm + * @since 2025/3/19 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class IsvCashierItemConfigManager extends BaseManager { + + /** + * 根据分组查询 + */ + public List findAllByGroupId(Long groupId) { + return lambdaQuery() + .eq(IsvCashierItemConfig::getGroupId, groupId) + .orderByAsc(IsvCashierItemConfig::getSortNo) + .orderByDesc(IsvCashierItemConfig::getId) + .list(); + } + /** + * 根据分组列表查询 + */ + public List findAllByGroupIds(List groupIds) { + return lambdaQuery() + .in(IsvCashierItemConfig::getGroupId, groupIds) + .orderByAsc(IsvCashierItemConfig::getSortNo) + .orderByDesc(IsvCashierItemConfig::getId) + .list(); + } + + /** + * 判断分组是否有数据 + */ + public boolean existedByGroupId(Long groupId) { + return existedByField(IsvCashierItemConfig::getGroupId, groupId); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierItemConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierItemConfigMapper.java new file mode 100644 index 00000000..f072d664 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvCashierItemConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvCashierItemConfig; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 网关收银台配置项 + * @author xxm + * @since 2025/3/19 + */ +@Mapper +public interface IsvCashierItemConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvGatewayPayConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvGatewayPayConfigManager.java new file mode 100644 index 00000000..6e45ab4c --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvGatewayPayConfigManager.java @@ -0,0 +1,27 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.isv.entity.gateway.IsvGatewayPayConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +/** + * 网关支付配置 + * @author xxm + * @since 2025/3/19 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class IsvGatewayPayConfigManager extends BaseManager { + + /** + * 查询配置 + */ + public Optional findFirst() { + return this.findAll().stream().findFirst(); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvGatewayPayConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvGatewayPayConfigMapper.java new file mode 100644 index 00000000..d24b1112 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/dao/gateway/IsvGatewayPayConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.isv.dao.gateway; + +import org.dromara.daxpay.service.isv.entity.gateway.IsvGatewayPayConfig; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *网关支付配置 + * @author xxm + * @since 2025/3/19 + */ +@Mapper +public interface IsvGatewayPayConfigMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/config/IsvChannelConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/config/IsvChannelConfig.java new file mode 100644 index 00000000..d0645b7f --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/config/IsvChannelConfig.java @@ -0,0 +1,45 @@ +package org.dromara.daxpay.service.isv.entity.config; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import cn.bootx.platform.core.annotation.BigField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.isv.convert.config.IsvChannelConfigConvert; +import org.dromara.daxpay.service.isv.result.config.IsvChannelConfigResult; + +/** + * 服务商通道配置 + * @author xxm + * @since 2024/10/30 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_isv_channel_config") +public class IsvChannelConfig extends MpBaseEntity implements ToResult { + + /** + * 服务商通道 + * @see ChannelEnum + */ + private String channel; + + /** 是否启用 */ + private boolean enable; + + /** 扩展存储 */ + @BigField + private String ext; + + /** + * 转换 + */ + @Override + public IsvChannelConfigResult toResult() { + return IsvChannelConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvAggregateBarPayConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvAggregateBarPayConfig.java new file mode 100644 index 00000000..b0f49dcc --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvAggregateBarPayConfig.java @@ -0,0 +1,65 @@ +package org.dromara.daxpay.service.isv.entity.gateway; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.core.enums.AggregateBarPayTypeEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.service.isv.convert.gateway.IsvAggregateBarPayConfigConvert; +import org.dromara.daxpay.service.isv.param.gateway.IsvAggregateBarPayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvAggregateBarPayConfigResult; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 网关聚合付款码支付配置 + * @author xxm + * @since 2025/3/21 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_isv_aggregate_bar_pay_config") +public class IsvAggregateBarPayConfig extends MpBaseEntity implements ToResult { + + /** + * 付款码类型 + * @see AggregateBarPayTypeEnum + */ + private String barPayType; + + /** + * 通道 + * @see ChannelEnum + */ + private String channel; + + /** + * 支付方式 + * @see PayMethodEnum + */ + private String payMethod; + + /** + * 其他支付方式 + */ + private String otherMethod; + + + /** + * 初始化 + */ + public static IsvAggregateBarPayConfig init(IsvAggregateBarPayConfigParam param){ + return IsvAggregateBarPayConfigConvert.CONVERT.toEntity(param); + } + + /** + * 转换 + */ + @Override + public IsvAggregateBarPayConfigResult toResult() { + return IsvAggregateBarPayConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvAggregatePayConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvAggregatePayConfig.java new file mode 100644 index 00000000..5fef8c46 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvAggregatePayConfig.java @@ -0,0 +1,91 @@ +package org.dromara.daxpay.service.isv.entity.gateway; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.core.enums.AggregatePayTypeEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.service.isv.convert.gateway.IsvAggregatePayConfigConvert; +import org.dromara.daxpay.service.isv.param.gateway.IsvAggregatePayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvAggregatePayConfigResult; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Objects; + +/** + * 网关聚合支付配置 + * @author xxm + * @since 2025/3/19 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_isv_aggregate_pay_config") +public class IsvAggregatePayConfig extends MpBaseEntity implements ToResult { + + /** + * 聚合支付类型 + * @see AggregatePayTypeEnum + */ + private String aggregateType; + + /** + * 支付通道 + * @see ChannelEnum + */ + private String channel; + + /** + * 支付方式 + * @see PayMethodEnum + */ + private String payMethod; + + /** + * 其他支付方式 + */ + private String otherMethod; + + /** 自动拉起支付 */ + private Boolean autoLaunch; + + /** 需要获取OpenId */ + private Boolean needOpenId; + + /** OpenId获取方式 */ + private String openIdGetType; + + /** + * 发起调用的类型 + * @see GatewayCallTypeEnum + */ + private String callType; + + + public Boolean getNeedOpenId() { + return Objects.equals(needOpenId,true); + } + + public Boolean getAutoLaunch() { + return Objects.equals(autoLaunch,true); + } + + /** + * 初始化 + */ + public static IsvAggregatePayConfig init(IsvAggregatePayConfigParam param){ + return IsvAggregatePayConfigConvert.CONVERT.toEntity(param); + } + + /** + * 转换 + */ + @Override + public IsvAggregatePayConfigResult toResult() { + return IsvAggregatePayConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvCashierGroupConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvCashierGroupConfig.java new file mode 100644 index 00000000..1e6aaa0e --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvCashierGroupConfig.java @@ -0,0 +1,61 @@ +package org.dromara.daxpay.service.isv.entity.gateway; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.core.enums.GatewayCashierTypeEnum; +import org.dromara.daxpay.service.isv.convert.gateway.IsvCashierGroupConfigConvert; +import org.dromara.daxpay.service.isv.param.gateway.IsvCashierGroupConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvCashierGroupConfigResult; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 网关收银台分组配置 + * @author xxm + * @since 2024/11/25 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_isv_cashier_group_config") +public class IsvCashierGroupConfig extends MpBaseEntity implements ToResult { + + /** + * 收银台类型 web/h5/小程序 + * @see GatewayCashierTypeEnum + */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private String cashierType; + + /** 名称 */ + private String name; + + /** 图标 */ + private String icon; + + /** 背景色 */ + private String bgColor; + + /** 是否推荐 */ + private boolean recommend; + + /** 排序 */ + private Double sortNo; + + + public static IsvCashierGroupConfig init(IsvCashierGroupConfigParam param){ + return IsvCashierGroupConfigConvert.CONVERT.toEntity(param); + } + + /** + * 转换 + */ + @Override + public IsvCashierGroupConfigResult toResult() { + return IsvCashierGroupConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvCashierItemConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvCashierItemConfig.java new file mode 100644 index 00000000..66214bc7 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvCashierItemConfig.java @@ -0,0 +1,101 @@ +package org.dromara.daxpay.service.isv.entity.gateway; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import cn.bootx.platform.common.mybatisplus.handler.StringListTypeHandler; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; +import org.dromara.daxpay.core.enums.GatewayPayEnvTypeEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.service.isv.convert.gateway.IsvCashierItemConfigConvert; +import org.dromara.daxpay.service.isv.param.gateway.IsvCashierItemConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvCashierItemConfigResult; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 网关收银台配置项 + * @author xxm + * @since 2024/11/25 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName(value = "pay_isv_cashier_item_config",autoResultMap = true) +public class IsvCashierItemConfig extends MpBaseEntity implements ToResult { + + /** 类目配置Id */ + private Long groupId; + + /** 名称 */ + private String name; + + /** 是否推荐 */ + private boolean recommend; + + /** 背景色 */ + private String bgColor; + + /** 边框色 */ + private String borderColor; + + /** 字体颜色 */ + private String fontColor; + + /** 图标 */ + private String icon; + + /** + * 生效的支付环境列表 + * @see GatewayPayEnvTypeEnum + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List payEnvTypes; + + /** 排序 */ + private Double sortNo; + + /** + * 发起调用的类型 + * @see GatewayCallTypeEnum + */ + private String callType; + + /** + * 支付通道 + * @see ChannelEnum + */ + private String channel; + + /** + * 支付方式 + * @see PayMethodEnum + */ + private String payMethod; + + /** + * 其他支付方式 + */ + private String otherMethod; + + + /** + * 构造 + */ + public static IsvCashierItemConfig init(IsvCashierItemConfigParam param) { + return IsvCashierItemConfigConvert.CONVERT.toEntity(param); + } + + /** + * 转换 + */ + @Override + public IsvCashierItemConfigResult toResult() { + return IsvCashierItemConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvGatewayPayConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvGatewayPayConfig.java new file mode 100644 index 00000000..af8ac751 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/entity/gateway/IsvGatewayPayConfig.java @@ -0,0 +1,79 @@ +package org.dromara.daxpay.service.isv.entity.gateway; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.service.isv.convert.gateway.IsvGatewayPayConfigConvert; +import org.dromara.daxpay.service.isv.param.gateway.IsvGatewayPayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvGatewayPayConfigResult; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Objects; + +/** + * 网关支付配置 + * @author xxm + * @since 2025/3/19 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_isv_gateway_config") +public class IsvGatewayPayConfig extends MpBaseEntity implements ToResult { + + /** PC收银台是否同时显示聚合收银码 */ + private Boolean aggregateShow; + + /** PC收银台是否显示聚合付款码支付 */ + private Boolean barPayShow; + + /** h5收银台自动升级聚合支付 */ + private Boolean h5AutoUpgrade; + + /** 小程序开启分账 */ + private Boolean miniAppAllocation; + + /** 小程序自动分账 */ + private Boolean miniAppAutoAllocation; + + /** 限制小程序支付方式 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String miniAppLimitPay; + + + public Boolean getAggregateShow() { + return Objects.equals(aggregateShow, true); + } + + public Boolean getH5AutoUpgrade() { + return Objects.equals(h5AutoUpgrade, true); + } + + public Boolean getBarPayShow() { + return Objects.equals(h5AutoUpgrade, true); + } + + public Boolean getMiniAppAllocation() { + return Objects.equals(miniAppAllocation, true); + } + + public Boolean getMiniAppAutoAllocation() { + return Objects.equals(miniAppAutoAllocation, true); + } + + public static IsvGatewayPayConfig init(IsvGatewayPayConfigParam param) { + return IsvGatewayPayConfigConvert.CONVERT.toEntity(param); + } + + /** + * 转换 + */ + @Override + public IsvGatewayPayConfigResult toResult() { + return IsvGatewayPayConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvAggregateBarPayConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvAggregateBarPayConfigParam.java new file mode 100644 index 00000000..c5f70666 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvAggregateBarPayConfigParam.java @@ -0,0 +1,61 @@ +package org.dromara.daxpay.service.isv.param.gateway; + +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.core.enums.AggregateBarPayTypeEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 聚合付款码支付配置 + * @author xxm + * @since 2025/3/21 + */ +@Data +@Accessors(chain = true) +@Schema(title = "聚合付款码支付配置") +public class IsvAggregateBarPayConfigParam { + + /** 主键 */ + @Null(message = "Id需要为空", groups = ValidationGroup.add.class) + @NotNull(message = "Id不可为空", groups = ValidationGroup.edit.class) + @Schema(description = "主键") + private Long id; + + /** + * 付款码类型 + * @see AggregateBarPayTypeEnum + */ + @NotBlank(message = "付款码类型不可为空", groups = ValidationGroup.add.class) + @Schema(description = "付款码类型") + private String barPayType; + + /** + * 支付通道 + * @see ChannelEnum + */ + @NotBlank(message = "支付通道不可为空", groups = ValidationGroup.add.class) + @Schema(description = "支付通道") + private String channel; + + /** + * 支付方式 + * @see PayMethodEnum + */ + @NotBlank(message = "支付方式不可为空", groups = ValidationGroup.add.class) + @Schema(description = "支付方式") + private String payMethod; + + /** + * 其他支付方式 + */ + @Schema(description = "其他支付方式") + private String otherMethod; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvAggregatePayConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvAggregatePayConfigParam.java new file mode 100644 index 00000000..88b11131 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvAggregatePayConfigParam.java @@ -0,0 +1,83 @@ +package org.dromara.daxpay.service.isv.param.gateway; + +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.core.enums.AggregatePayTypeEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 网关聚合支付配置参数 + * @author xxm + * @since 2024/11/27 + */ +@Data +@Accessors(chain = true) +@Schema(title = "网关聚合支付配置参数") +public class IsvAggregatePayConfigParam { + + /** 主键 */ + @Null(message = "Id需要为空", groups = ValidationGroup.add.class) + @NotNull(message = "Id不可为空", groups = ValidationGroup.edit.class) + @Schema(description = "主键") + private Long id; + + /** + * 聚合支付类型 + * @see AggregatePayTypeEnum + */ + @NotBlank(message = "聚合支付类型不可为空", groups = ValidationGroup.add.class) + @Schema(description = "聚合支付类型") + private String aggregateType; + + /** + * 支付通道 + * @see ChannelEnum + */ + @NotBlank(message = "支付通道不可为空", groups = ValidationGroup.add.class) + @Schema(description = "支付通道") + private String channel; + + /** + * 支付方式 + * @see PayMethodEnum + */ + @NotBlank(message = "支付方式不可为空", groups = ValidationGroup.add.class) + @Schema(description = "支付方式") + private String payMethod; + + /** + * 其他支付方式 + */ + @Schema(description = "其他支付方式") + private String otherMethod; + + /** 自动拉起支付 */ + @Schema(description = "自动拉起支付") + @NotNull(message = "自动拉起支付不可为空") + private Boolean autoLaunch; + + /** 需要获取OpenId */ + @Schema(description = "需要获取OpenId") + @NotNull(message = "需要获取OpenId不可为空") + private Boolean needOpenId; + + /** OpenId获取方式 */ + @Schema(description = "OpenId获取方式") + private String openIdGetType; + + /** + * 发起调用的类型 + * @see GatewayCallTypeEnum + */ + @Schema(description = "发起调用的类型") + private String callType; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvCashierGroupConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvCashierGroupConfigParam.java new file mode 100644 index 00000000..e155ad38 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvCashierGroupConfigParam.java @@ -0,0 +1,57 @@ +package org.dromara.daxpay.service.isv.param.gateway; + +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.core.enums.GatewayCashierTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 网关收银台分组配置参数 + * @author xxm + * @since 2024/11/26 + */ +@Data +@Accessors(chain = true) +@Schema(title = "收银台分组配置参数") +public class IsvCashierGroupConfigParam { + + /** 主键 */ + @Null(message = "Id需要为空", groups = ValidationGroup.add.class) + @NotNull(message = "Id不可为空", groups = ValidationGroup.edit.class) + @Schema(description = "主键") + private Long id; + + /** + * 收银台类型 web/h5/小程序 + * @see GatewayCashierTypeEnum + */ + @Schema(description = "收银台类型") + private String CashierType; + + /** 名称 */ + @NotBlank(message = "名称不可为空", groups = ValidationGroup.add.class) + @Schema(description = "名称") + private String name; + + /** 图标 */ + @Schema(description = "图标") + private String icon; + + /** 背景色 */ + @Schema(description = "背景色") + private String bgColor; + + /** 是否推荐 */ + @Schema(description = "是否推荐") + private boolean recommend; + + /** 排序 */ + @Schema(description = "排序") + private Double sortNo; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvCashierItemConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvCashierItemConfigParam.java new file mode 100644 index 00000000..4f19fecc --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvCashierItemConfigParam.java @@ -0,0 +1,84 @@ +package org.dromara.daxpay.service.isv.param.gateway; + +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 网关收银台配置项参数 + * @author xxm + * @since 2024/11/26 + */ +@Data +@Accessors(chain = true) +@Schema(title = "收银台配置项参数") +public class IsvCashierItemConfigParam { + + /** 主键 */ + @Null(message = "Id需要为空", groups = ValidationGroup.add.class) + @NotNull(message = "Id不可为空", groups = ValidationGroup.edit.class) + @Schema(description = "主键") + private Long id; + + /** 类目配置Id */ + @NotNull(message = "类目ID不可为空", groups = ValidationGroup.add.class) + @Schema(description = "类目配置Id") + private Long groupId; + + /** 名称 */ + @NotBlank(message = "名称不可为空", groups = ValidationGroup.add.class) + @Schema(description = "名称") + private String name; + + /** + * 发起调用的类型 + * @see GatewayCallTypeEnum + */ + @NotBlank(message = "调用类型不可为空", groups = ValidationGroup.add.class) + @Schema(description = "发起调用的类型") + private String callType; + + /** + * 支付通道 + * @see ChannelEnum + */ + @NotBlank(message = "支付通道不可为空", groups = ValidationGroup.add.class) + @Schema(description = "支付通道") + private String channel; + + /** + * 支付方式 + * @see PayMethodEnum + */ + @NotBlank(message = "支付方式不可为空", groups = ValidationGroup.add.class) + @Schema(description = "支付方式") + private String payMethod; + + @Schema(description = "其他支付方式") + private String otherMethod; + + /** 背景色 */ + @Schema(description = "背景色") + private String bgColor; + + /** 是否推荐 */ + @Schema(description = "是否推荐") + private Boolean recommend; + + /** 图标 */ + @Schema(description = "图标") + private String icon; + + /** 排序 */ + @Schema(description = "排序") + private Double sortNo; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvGatewayPayConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvGatewayPayConfigParam.java new file mode 100644 index 00000000..175ade5d --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/param/gateway/IsvGatewayPayConfigParam.java @@ -0,0 +1,67 @@ +package org.dromara.daxpay.service.isv.param.gateway; + +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.core.enums.PayLimitPayEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 网关支付有配置 + * @author xxm + * @since 2024/11/27 + */ +@Data +@Accessors(chain = true) +@Schema(title = "收银台配置") +public class IsvGatewayPayConfigParam { + + /** 主键 */ + @Null(message = "Id需要为空", groups = ValidationGroup.add.class) + @NotNull(message = "Id不可为空", groups = ValidationGroup.edit.class) + @Schema(description = "主键") + private Long id; + + + /** 是否读取系统配置 */ + @NotNull(message = "是否读取系统配置不可为空") + @Schema(description = "是否读取系统配置") + private Boolean readSystem; + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** PC收银台是否同时显示聚合收银码 */ + @Schema(description = "PC收银台是否同时显示聚合收银码") + private Boolean aggregateShow; + + /** h5收银台自动升级聚合支付 */ + @Schema(description = "h5收银台自动升级聚合支付") + private Boolean h5AutoUpgrade; + + /** 小程序开启分账 */ + @Schema(description = "小程序开启分账") + private Boolean miniAppAllocation; + + /** 小程序自动分账 */ + @Schema(description = "小程序自动分账") + private Boolean miniAppAutoAllocation; + + /** + * 限制用户支付类型, 目前支持限制信用卡 + * @see PayLimitPayEnum + */ + @Schema(description = "限制用户支付类型") + @Size(max = 128, message = "限制用户支付类型不能超过128位") + private String miniAppLimitPay; + + /** 小程序关联终端号 */ + @Schema(description = "小程序关联终端号") + private String miniAppTerminalNo; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/config/IsvChannelConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/config/IsvChannelConfigResult.java new file mode 100644 index 00000000..015d2809 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/config/IsvChannelConfigResult.java @@ -0,0 +1,35 @@ +package org.dromara.daxpay.service.isv.result.config; + +import org.dromara.daxpay.core.enums.ChannelEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 服务商通道配置 + * @author xxm + * @since 2024/10/30 + */ +@Data +@Accessors(chain = true) +@Schema(title = "服务商通道配置") +public class IsvChannelConfigResult { + + @Schema(description = "主键ID") + private Long id; + + /** + * 支付通道 + * @see ChannelEnum + */ + @Schema(description = "通道") + private String channel; + + /** 通道名称 */ + @Schema(description = "通道名称") + private String name; + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvAggregateBarPayConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvAggregateBarPayConfigResult.java new file mode 100644 index 00000000..23186d30 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvAggregateBarPayConfigResult.java @@ -0,0 +1,49 @@ +package org.dromara.daxpay.service.isv.result.gateway; + +import org.dromara.daxpay.core.enums.AggregateBarPayTypeEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.service.merchant.result.info.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 聚合付款码支付配置 + * @author xxm + * @since 2025/3/24 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "聚合付款码支付配置") +public class IsvAggregateBarPayConfigResult extends MchResult { + + /** + * 付款码类型 + * @see AggregateBarPayTypeEnum + */ + @Schema(description = "付款码类型") + private String barPayType; + + /** + * 通道 + * @see ChannelEnum + */ + @Schema(description = "通道") + private String channel; + + /** + * 支付方式 + * @see PayMethodEnum + */ + @Schema(description = "支付方式") + private String payMethod; + + /** + * 其他支付方式 + */ + @Schema(description = "其他支付方式") + private String otherMethod; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvAggregatePayConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvAggregatePayConfigResult.java new file mode 100644 index 00000000..acbb7893 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvAggregatePayConfigResult.java @@ -0,0 +1,70 @@ +package org.dromara.daxpay.service.isv.result.gateway; + +import org.dromara.daxpay.core.enums.AggregatePayTypeEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.service.merchant.result.info.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 网关聚合支付配置 + * @author xxm + * @since 2025/3/19 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "网关聚合支付配置") +public class IsvAggregatePayConfigResult extends MchResult { + /** + * 聚合支付类型 + * @see AggregatePayTypeEnum + */ + @Schema(description = "聚合支付类型") + private String aggregateType; + + /** + * 通道 + * @see ChannelEnum + */ + @Schema(description = "通道") + private String channel; + + /** + * 支付方式 + * @see PayMethodEnum + */ + @Schema(description = "支付方式") + private String payMethod; + + /** + * 其他支付方式 + */ + @Schema(description = "其他支付方式") + private String otherMethod; + + /** 自动拉起支付 */ + @Schema(description = "自动拉起支付") + private Boolean autoLaunch; + + /** 需要获取OpenId */ + @Schema(description = "需要获取OpenId") + private Boolean needOpenId; + + /** OpenId获取方式 */ + @Schema(description = "OpenId获取方式") + private String openIdGetType; + + /** + * 发起调用的类型 + * @see GatewayCallTypeEnum + */ + @Schema(description = "发起调用的类型") + private String callType; + + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvCashierGroupConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvCashierGroupConfigResult.java new file mode 100644 index 00000000..de90f5cd --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvCashierGroupConfigResult.java @@ -0,0 +1,53 @@ +package org.dromara.daxpay.service.isv.result.gateway; + +import org.dromara.daxpay.core.enums.GatewayCashierTypeEnum; +import org.dromara.daxpay.service.merchant.result.info.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 网关收银台分组配置 + * @author xxm + * @since 2024/11/26 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "网关收银台分组配置") +public class IsvCashierGroupConfigResult extends MchResult { + /** + * 收银台类型 web/h5/小程序 + * @see GatewayCashierTypeEnum + */ + @Schema(description = "收银台类型") + private String CashierType; + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** 图标 */ + @Schema(description = "图标") + private String icon; + + /** 背景色 */ + @Schema(description = "背景色") + private String bgColor; + + /** 是否推荐 */ + @Schema(description = "是否推荐") + private boolean recommend; + + /** 排序 */ + @Schema(description = "排序") + private Double sortNo; + + /** 配置项 */ + @Schema(description = "配置项列表") + private List items; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvCashierItemConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvCashierItemConfigResult.java new file mode 100644 index 00000000..dd1255f1 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvCashierItemConfigResult.java @@ -0,0 +1,74 @@ +package org.dromara.daxpay.service.isv.result.gateway; + +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; +import org.dromara.daxpay.core.enums.GatewayPayEnvTypeEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.service.merchant.result.info.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 网关收银台配置项 + * @author xxm + * @since 2024/11/26 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "收银台配置项") +public class IsvCashierItemConfigResult extends MchResult { + /** + * 发起调用的类型 + * @see GatewayCallTypeEnum + */ + @Schema(description = "发起调用的类型") + private String callType; + + /** 是否推荐 */ + @Schema(description = "是否推荐") + private Boolean recommend; + + /** 名称 */ + @Schema(description = "名称") + private String name; + + /** 图标 */ + @Schema(description = "图标") + private String icon; + + /** + * 生效的支付环境列表 + * @see GatewayPayEnvTypeEnum + */ + @Schema(description = "生效的支付环境列表") + private List envTypes; + + /** + * 支付通道 + * @see ChannelEnum + */ + @Schema(description = "支付通道") + private String channel; + + /** + * 支付方式 + * @see PayMethodEnum + */ + @Schema(description = "支付方式") + private String payMethod; + + /** + * 其他支付方式 + */ + @Schema(description = "其他支付方式") + private String otherMethod; + + /** 排序 */ + @Schema(description = "排序") + private Double sortNo; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvGatewayPayConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvGatewayPayConfigResult.java new file mode 100644 index 00000000..a2d0cbfa --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/result/gateway/IsvGatewayPayConfigResult.java @@ -0,0 +1,48 @@ +package org.dromara.daxpay.service.isv.result.gateway; + +import org.dromara.daxpay.core.enums.PayLimitPayEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 网关支付配置 + * @author xxm + * @since 2024/11/27 + */ +@Data +@Accessors(chain = true) +@Schema(title = "网关支付配置") +public class IsvGatewayPayConfigResult { + + /** 主键 */ + @Schema(description = "主键") + private Long id; + + /** PC收银台是否同时显示聚合收银码 */ + @Schema(description = "PC收银台是否同时显示聚合收银码") + private Boolean aggregateShow; + + /** PC收银台是否显示聚合付款码支付 */ + @Schema(description = "PC收银台是否显示聚合付款码支付") + private Boolean barPayShow; + + /** h5收银台自动升级聚合支付 */ + @Schema(description = "h5收银台自动升级聚合支付") + private Boolean h5AutoUpgrade; + + /** 小程序开启分账 */ + @Schema(description = "小程序开启分账") + private Boolean miniAppAllocation; + + /** 小程序自动分账 */ + @Schema(description = "小程序自动分账") + private Boolean miniAppAutoAllocation; + + /** + * 限制用户支付类型, 目前支持限制信用卡 + * @see PayLimitPayEnum + */ + @Schema(description = "限制用户支付类型") + private String miniAppLimitPay; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/config/IsvChannelConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/config/IsvChannelConfigService.java new file mode 100644 index 00000000..4e67aa4f --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/config/IsvChannelConfigService.java @@ -0,0 +1,55 @@ +package org.dromara.daxpay.service.isv.service.config; + +import cn.bootx.platform.core.exception.DataNotExistException; +import org.dromara.daxpay.service.isv.dao.config.IsvChannelConfigManager; +import org.dromara.daxpay.service.isv.entity.config.IsvChannelConfig; +import org.dromara.daxpay.service.isv.result.config.IsvChannelConfigResult; +import org.dromara.daxpay.service.pay.dao.constant.ChannelConstManager; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 服务商通道配置 + * @author xxm + * @since 2024/10/29 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class IsvChannelConfigService { + + private final IsvChannelConfigManager channelConfigManager; + + private final ChannelConstManager channelConstManager; + + /** + * 通道配置列表, 根据服务商进行查询, 默认返回所有通道配置, 如果未进行配置启用状态会为null + */ + public List findAll(){ + Map channelConfigMap = channelConfigManager.findAll() + .stream() + .collect(Collectors.toMap(IsvChannelConfig::getChannel, Function.identity(), (v1, v2) -> v1)); + // 遍历通道类型 + var channelList = channelConstManager.findAllByIsvAndEnable(); + return channelList.stream().map(o->{ + var channelConfig = channelConfigMap.get(o.getCode()); + if (Objects.isNull(channelConfig)){ + return new IsvChannelConfigResult() + .setChannel(o.getCode()) + .setName(o.getName()); + } else { + return channelConfig.toResult() + .setName(o.getName()); + } + }).toList(); + } + + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvAggregateConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvAggregateConfigService.java new file mode 100644 index 00000000..6a8c0c0e --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvAggregateConfigService.java @@ -0,0 +1,152 @@ +package org.dromara.daxpay.service.isv.service.gateway; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.DataNotExistException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.isv.dao.gateway.IsvAggregateBarPayConfigManager; +import org.dromara.daxpay.service.isv.dao.gateway.IsvAggregatePayConfigManager; +import org.dromara.daxpay.service.isv.entity.gateway.IsvAggregateBarPayConfig; +import org.dromara.daxpay.service.isv.entity.gateway.IsvAggregatePayConfig; +import org.dromara.daxpay.service.isv.param.gateway.IsvAggregateBarPayConfigParam; +import org.dromara.daxpay.service.isv.param.gateway.IsvAggregatePayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvAggregateBarPayConfigResult; +import org.dromara.daxpay.service.isv.result.gateway.IsvAggregatePayConfigResult; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * 聚合支付配置 + * @author xxm + * @since 2025/3/24 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class IsvAggregateConfigService { + private final IsvAggregatePayConfigManager aggregatePayConfigManager; + private final IsvAggregateBarPayConfigManager aggregateBarPayConfigManager; + + /** + * 支付配置列表 + */ + public List listByPay(){ + return MpUtil.toListResult(aggregatePayConfigManager.findAll()); + } + + /** + * 付款码配置列表 + */ + public List listByBar(){ + return MpUtil.toListResult(aggregateBarPayConfigManager.findAll()); + } + + /** + * 支付配置详情 + */ + public IsvAggregatePayConfigResult findPayById(Long id){ + return aggregatePayConfigManager.findById(id).map(IsvAggregatePayConfig::toResult).orElseThrow(() -> new DataNotExistException("聚合支付配置不存在")); + } + + /** + * 付款码配置详情 + */ + public IsvAggregateBarPayConfigResult findBarById(Long id){ + return aggregateBarPayConfigManager.findById(id).map(IsvAggregateBarPayConfig::toResult).orElseThrow(() -> new DataNotExistException("聚合付款码支付不存在")); + } + + /** + *保存聚合支付配置 + */ + public void savePay(IsvAggregatePayConfigParam param){ + if (aggregatePayConfigManager.existsByType(param.getAggregateType())){ + throw new OperationFailException("聚合支付配置已存在"); + } + var entity = IsvAggregatePayConfig.init(param); + aggregatePayConfigManager.save(entity); + } + + /** + *保存聚合付款码支付配置 + */ + public void saveBar(IsvAggregateBarPayConfigParam param){ + if (aggregateBarPayConfigManager.existsByType(param.getBarPayType())){ + throw new OperationFailException("聚合付款码支付配置已存在"); + } + aggregateBarPayConfigManager.save(IsvAggregateBarPayConfig.init(param)); + } + + /** + *更新聚合支付配置 + */ + public void updatePay(IsvAggregatePayConfigParam param){ + var payConfig = aggregatePayConfigManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("聚合支付配置不存在")); + if (!Objects.equals(param.getAggregateType(), payConfig.getAggregateType()) && aggregatePayConfigManager.existsByType(param.getAggregateType())){ + throw new OperationFailException("聚合支付类型已存在"); + } + BeanUtil.copyProperties(param, payConfig, CopyOptions.create().ignoreNullValue()); + aggregatePayConfigManager.updateById(payConfig); + } + + /** + *更新聚合付款码支付配置 + */ + public void updateBar(IsvAggregateBarPayConfigParam param){ + var barPayConfig = aggregateBarPayConfigManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("聚合付款码支付配置不存在")); + if (!Objects.equals(param.getBarPayType(), barPayConfig.getBarPayType()) && aggregateBarPayConfigManager.existsByType(param.getBarPayType())){ + throw new OperationFailException("聚合付款码支付类型已存在"); + } + BeanUtil.copyProperties(param, barPayConfig, CopyOptions.create().ignoreNullValue()); + aggregateBarPayConfigManager.updateById(barPayConfig); + } + + /** + *删除聚合支付配置 + */ + public void deletePay(Long id){ + aggregatePayConfigManager.deleteById(id); + } + + /** + *删除聚合付款码支付配置 + */ + public void deleteBar(Long id){ + aggregateBarPayConfigManager.deleteById(id); + } + + /** + * 根据应用ID和类型查询支付配置是否存在 + */ + public boolean existsPay(String type){ + return aggregatePayConfigManager.existsByType(type); + } + + /** + * 根据应用ID和类型查询支付配置是否存在 + */ + public boolean existsPay(String type, Long id){ + return aggregatePayConfigManager.existsByType(type, id); + } + + /** + * 根据应用ID和类型查询付款码支付配置是否存在 + */ + public boolean existsBar(String type){ + return aggregateBarPayConfigManager.existsByType( type); + } + + /** + * 根据应用ID和类型查询付款码支付配置是否存在 + */ + public boolean existsBar(String type, Long id){ + return aggregateBarPayConfigManager.existsByType( type, id); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvCashierConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvCashierConfigService.java new file mode 100644 index 00000000..904914f8 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvCashierConfigService.java @@ -0,0 +1,155 @@ +package org.dromara.daxpay.service.isv.service.gateway; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.DataNotExistException; +import org.dromara.daxpay.core.enums.GatewayCashierTypeEnum; +import org.dromara.daxpay.core.exception.DataErrorException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.isv.dao.gateway.IsvCashierGroupConfigManager; +import org.dromara.daxpay.service.isv.dao.gateway.IsvCashierItemConfigManager; +import org.dromara.daxpay.service.isv.entity.gateway.IsvCashierGroupConfig; +import org.dromara.daxpay.service.isv.entity.gateway.IsvCashierItemConfig; +import org.dromara.daxpay.service.isv.param.gateway.IsvCashierGroupConfigParam; +import org.dromara.daxpay.service.isv.param.gateway.IsvCashierItemConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvCashierGroupConfigResult; +import org.dromara.daxpay.service.isv.result.gateway.IsvCashierItemConfigResult; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * 收银台配置 + * + * @author xxm + * @since 2025/3/24 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class IsvCashierConfigService { + private final IsvCashierGroupConfigManager cashierGroupConfigManager; + private final IsvCashierItemConfigManager cashierItemConfigManager; + + /** + * 获取指定类型收银台分组列表 + */ + public List listByGroup(String cashierType) { + return MpUtil.toListResult(cashierGroupConfigManager.findAllByType(cashierType)); + } + + /** + * 获取收银台分组配置 + */ + public IsvCashierGroupConfigResult findGroupById(Long id) { + return cashierGroupConfigManager.findById(id) + .map(IsvCashierGroupConfig::toResult) + .orElseThrow(() -> new DataNotExistException("收银台分组配置不存在")); + } + + /** + * 获取配置项列表 + */ + public List listByItem(Long groupId) { + return MpUtil.toListResult(cashierItemConfigManager.findAllByGroupId(groupId)); + } + + /** + * 获取配置项 + */ + public IsvCashierItemConfigResult findItemById(Long groupId) { + return cashierItemConfigManager.findById(groupId) + .map(IsvCashierItemConfig::toResult) + .orElseThrow(() -> new DataNotExistException("收银台配置项不存在")); + } + + /** + * 保存分组配置 + */ + public void saveGroup(IsvCashierGroupConfigParam param) { + // h5只能创建一个 + if (Objects.equals(param.getCashierType(), GatewayCashierTypeEnum.H5.getCode()) && + cashierGroupConfigManager.existedByType(param.getCashierType())) { + throw new DataErrorException("H5网关支付分组只能有一个"); + } + var entity = IsvCashierGroupConfig.init(param); + cashierGroupConfigManager.save(entity); + } + + /** + * 保存默认分组配置(h5) + */ + public void saveDefaultGroup() { + // h5只能创建一个 + if (cashierGroupConfigManager.existedByType(GatewayCashierTypeEnum.H5.getCode())) { + throw new DataErrorException("H5网关支付分组只能有一个"); + } + var entity = new IsvCashierGroupConfig() + .setCashierType(GatewayCashierTypeEnum.H5.getCode()) + .setSortNo(0.0) + .setName("H5收银台"); + + cashierGroupConfigManager.save(entity); + } + + /** + * 更新分组配置 + */ + public void updateGroup(IsvCashierGroupConfigParam param) { + var cashierGroupConfig = cashierGroupConfigManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("分组配置不存在")); + BeanUtil.copyProperties(param, cashierGroupConfig, CopyOptions.create() + .ignoreNullValue()); + cashierGroupConfigManager.updateById(cashierGroupConfig); + } + + /** + * 删除分组配置 + */ + public void deleteGroup(Long id) { + if (!cashierGroupConfigManager.existedById(id)) { + throw new DataNotExistException("分组配置不存在"); + } + if (cashierItemConfigManager.existedByGroupId(id)) { + throw new OperationFailException("该分组下存在配置项,请先删除配置项"); + } + cashierGroupConfigManager.deleteById(id); + } + + /** + * 保存配置项 + */ + public void saveItem(IsvCashierItemConfigParam param) { + if (!cashierGroupConfigManager.existedById(param.getGroupId())) { + throw new DataNotExistException("所属分组配置不存在"); + } + var entity = IsvCashierItemConfig.init(param); + cashierItemConfigManager.save(entity); + + } + + /** + * 更新配置项 + */ + public void updateItem(IsvCashierItemConfigParam param) { + var cashierItemConfig = cashierItemConfigManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("配置项不存在")); + BeanUtil.copyProperties(param, cashierItemConfig, CopyOptions.create() + .ignoreNullValue()); + cashierItemConfigManager.updateById(cashierItemConfig); + } + + /** + * 删除配置项 + */ + public void deleteItem(Long id) { + if (!cashierItemConfigManager.existedById(id)) { + throw new DataNotExistException("配置项不存在"); + } + cashierItemConfigManager.deleteById(id); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvGatewayPayConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvGatewayPayConfigService.java new file mode 100644 index 00000000..9ce0fbe2 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/isv/service/gateway/IsvGatewayPayConfigService.java @@ -0,0 +1,47 @@ +package org.dromara.daxpay.service.isv.service.gateway; + +import cn.bootx.platform.core.exception.DataNotExistException; +import org.dromara.daxpay.service.isv.dao.gateway.IsvGatewayPayConfigManager; +import org.dromara.daxpay.service.isv.entity.gateway.IsvGatewayPayConfig; +import org.dromara.daxpay.service.isv.param.gateway.IsvGatewayPayConfigParam; +import org.dromara.daxpay.service.isv.result.gateway.IsvGatewayPayConfigResult; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 网关支付配置 + * @author xxm + * @since 2025/3/24 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class IsvGatewayPayConfigService { + private final IsvGatewayPayConfigManager gatewayPayConfigManager; + + /** + * 获取网关支付配置 + */ + public IsvGatewayPayConfigResult getConfig(){ + var gatewayPayConfig = gatewayPayConfigManager.findFirst(); + if (gatewayPayConfig.isEmpty()){ + var payConfig = new IsvGatewayPayConfig(); + gatewayPayConfigManager.save(payConfig); + return payConfig.toResult(); + } + return gatewayPayConfig.get().toResult(); + } + + /** + * 更新网关支付配置 + */ + public void update(IsvGatewayPayConfigParam param){ + var gatewayPayConfig = gatewayPayConfigManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("收银台网关支付不存在")); + BeanUtil.copyProperties(param, gatewayPayConfig); + gatewayPayConfigManager.updateById(gatewayPayConfig); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/cache/ChannelConfigCacheService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/ChannelConfigCacheService.java similarity index 81% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/cache/ChannelConfigCacheService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/ChannelConfigCacheService.java index d511e8e4..df2e1d55 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/cache/ChannelConfigCacheService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/ChannelConfigCacheService.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.common.cache; +package org.dromara.daxpay.service.merchant.cache; import org.dromara.daxpay.core.exception.ConfigNotEnableException; -import org.dromara.daxpay.service.dao.config.ChannelConfigManager; -import org.dromara.daxpay.service.entity.config.ChannelConfig; +import org.dromara.daxpay.service.merchant.dao.config.ChannelConfigManager; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/cache/MchAppCacheService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/MchAppCacheService.java similarity index 70% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/cache/MchAppCacheService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/MchAppCacheService.java index 4290818b..18effe08 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/cache/MchAppCacheService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/MchAppCacheService.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.common.cache; +package org.dromara.daxpay.service.merchant.cache; import org.dromara.daxpay.core.exception.ConfigNotEnableException; -import org.dromara.daxpay.service.dao.merchant.MchAppManager; -import org.dromara.daxpay.service.entity.merchant.MchApp; +import org.dromara.daxpay.service.merchant.dao.app.MchAppManager; +import org.dromara.daxpay.service.merchant.entity.app.MchApp; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; @@ -21,11 +21,11 @@ public class MchAppCacheService { private final MchAppManager mchAppManager; /** - * 获取通道配置 + * 获取通道配置(忽略租户) */ @Cacheable(value = "cache:mchApp", key = "#appId") public MchApp get(String appId) { - return mchAppManager.findByAppId(appId) + return mchAppManager.findByAppIdNotTenant(appId) .orElseThrow(() -> new ConfigNotEnableException("未找到指定的应用配置")); } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/MerchantCacheService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/MerchantCacheService.java new file mode 100644 index 00000000..3b8ded84 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/cache/MerchantCacheService.java @@ -0,0 +1,29 @@ +package org.dromara.daxpay.service.merchant.cache; + +import org.dromara.daxpay.core.exception.ConfigNotEnableException; +import org.dromara.daxpay.service.merchant.dao.info.MerchantManager; +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * 商户缓存服务 + * @author xxm + * @since 2024/6/29 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MerchantCacheService { + private final MerchantManager merchantManager; + + /** + * 获取商户配置 + */ + @Cacheable(value = "cache:merchant", key = "#mchNo") + public Merchant get(String mchNo) { + return merchantManager.findByMchNo(mchNo).orElseThrow(() -> new ConfigNotEnableException("未找到指定的商户配置")); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/merchant/MchAppConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/app/MchAppConvert.java similarity index 55% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/merchant/MchAppConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/app/MchAppConvert.java index a6ad0801..ee3f3a16 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/merchant/MchAppConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/app/MchAppConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.convert.merchant; +package org.dromara.daxpay.service.merchant.convert.app; -import org.dromara.daxpay.service.entity.merchant.MchApp; -import org.dromara.daxpay.service.param.merchant.MchAppParam; -import org.dromara.daxpay.service.result.merchant.MchAppResult; +import org.dromara.daxpay.service.merchant.entity.app.MchApp; +import org.dromara.daxpay.service.merchant.param.app.MchAppParam; +import org.dromara.daxpay.service.merchant.result.app.MchAppResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/config/ChannelConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/config/ChannelConfigConvert.java similarity index 60% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/config/ChannelConfigConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/config/ChannelConfigConvert.java index 52180a16..866ec519 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/config/ChannelConfigConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/config/ChannelConfigConvert.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.convert.config; +package org.dromara.daxpay.service.merchant.convert.config; -import org.dromara.daxpay.service.entity.config.ChannelConfig; -import org.dromara.daxpay.service.result.config.ChannelConfigResult; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; +import org.dromara.daxpay.service.merchant.result.config.ChannelConfigResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/AggregateBarPayConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/AggregateBarPayConfigConvert.java similarity index 58% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/AggregateBarPayConfigConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/AggregateBarPayConfigConvert.java index ceb6f656..5c359cea 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/AggregateBarPayConfigConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/AggregateBarPayConfigConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.convert.gateway; +package org.dromara.daxpay.service.merchant.convert.gateway; -import org.dromara.daxpay.service.entity.gateway.AggregateBarPayConfig; -import org.dromara.daxpay.service.param.gateway.AggregateBarPayConfigParam; -import org.dromara.daxpay.service.result.gateway.config.AggregateBarPayConfigResult; +import org.dromara.daxpay.service.merchant.entity.gateway.AggregateBarPayConfig; +import org.dromara.daxpay.service.merchant.param.gateway.AggregateBarPayConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.AggregateBarPayConfigResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -18,4 +18,5 @@ public interface AggregateBarPayConfigConvert { AggregateBarPayConfig toEntity(AggregateBarPayConfigParam param); AggregateBarPayConfigResult toResult(AggregateBarPayConfig aggregateBarPayConfig); + } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/AggregatePayConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/AggregatePayConfigConvert.java similarity index 58% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/AggregatePayConfigConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/AggregatePayConfigConvert.java index 97a38fed..9a4a8214 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/AggregatePayConfigConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/AggregatePayConfigConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.convert.gateway; +package org.dromara.daxpay.service.merchant.convert.gateway; -import org.dromara.daxpay.service.entity.gateway.AggregatePayConfig; -import org.dromara.daxpay.service.param.gateway.AggregatePayConfigParam; -import org.dromara.daxpay.service.result.gateway.config.AggregatePayConfigResult; +import org.dromara.daxpay.service.merchant.entity.gateway.AggregatePayConfig; +import org.dromara.daxpay.service.merchant.param.gateway.AggregatePayConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.AggregatePayConfigResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -18,4 +18,5 @@ public interface AggregatePayConfigConvert { AggregatePayConfigResult toResult(AggregatePayConfig aggregatePayConfig); AggregatePayConfig toEntity(AggregatePayConfigParam param); + } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierGroupConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/CashierGroupConfigConvert.java similarity index 58% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierGroupConfigConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/CashierGroupConfigConvert.java index c24c6894..70dfb1d5 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierGroupConfigConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/CashierGroupConfigConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.convert.gateway; +package org.dromara.daxpay.service.merchant.convert.gateway; -import org.dromara.daxpay.service.entity.gateway.CashierGroupConfig; -import org.dromara.daxpay.service.param.gateway.CashierGroupConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierGroupConfigResult; +import org.dromara.daxpay.service.merchant.entity.gateway.CashierGroupConfig; +import org.dromara.daxpay.service.merchant.param.gateway.CashierGroupConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.CashierGroupConfigResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -18,4 +18,6 @@ public interface CashierGroupConfigConvert { CashierGroupConfig toEntity(CashierGroupConfigParam param); CashierGroupConfigResult toResult(CashierGroupConfig cashierGroupConfig); + + } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierItemConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/CashierItemConfigConvert.java similarity index 58% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierItemConfigConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/CashierItemConfigConvert.java index f7bfe826..97d485dd 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/CashierItemConfigConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/CashierItemConfigConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.convert.gateway; +package org.dromara.daxpay.service.merchant.convert.gateway; -import org.dromara.daxpay.service.entity.gateway.CashierItemConfig; -import org.dromara.daxpay.service.param.gateway.CashierItemConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierItemConfigResult; +import org.dromara.daxpay.service.merchant.entity.gateway.CashierItemConfig; +import org.dromara.daxpay.service.merchant.param.gateway.CashierItemConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.CashierItemConfigResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -18,4 +18,6 @@ public interface CashierItemConfigConvert { CashierItemConfig toEntity(CashierItemConfigParam param); CashierItemConfigResult toResult(CashierItemConfig gatewayCashierItemConfig); + + } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/GatewayPayConfigConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/GatewayPayConfigConvert.java similarity index 57% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/GatewayPayConfigConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/GatewayPayConfigConvert.java index 31c41097..4810ef96 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/gateway/GatewayPayConfigConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/gateway/GatewayPayConfigConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.convert.gateway; +package org.dromara.daxpay.service.merchant.convert.gateway; -import org.dromara.daxpay.service.entity.gateway.GatewayPayConfig; -import org.dromara.daxpay.service.param.gateway.GatewayPayConfigParam; -import org.dromara.daxpay.service.result.gateway.config.GatewayPayConfigResult; +import org.dromara.daxpay.service.merchant.entity.gateway.GatewayPayConfig; +import org.dromara.daxpay.service.merchant.param.gateway.GatewayPayConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.GatewayPayConfigResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/info/MerchantConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/info/MerchantConvert.java new file mode 100644 index 00000000..ecea8046 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/convert/info/MerchantConvert.java @@ -0,0 +1,24 @@ +package org.dromara.daxpay.service.merchant.convert.info; + +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import org.dromara.daxpay.service.merchant.param.info.MerchantCreateParam; +import org.dromara.daxpay.service.merchant.param.info.MerchantParam; +import org.dromara.daxpay.service.merchant.result.info.MerchantResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2024/6/24 + */ +@Mapper +public interface MerchantConvert { + MerchantConvert CONVERT = Mappers.getMapper(MerchantConvert.class); + + Merchant toEntity(MerchantParam param); + + MerchantResult toResult(Merchant entity); + + Merchant toEntity(MerchantCreateParam param); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/merchant/MchAppManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/app/MchAppManager.java similarity index 58% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/merchant/MchAppManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/app/MchAppManager.java index 41196014..a27ef627 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/merchant/MchAppManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/app/MchAppManager.java @@ -1,12 +1,13 @@ -package org.dromara.daxpay.service.dao.merchant; +package org.dromara.daxpay.service.merchant.dao.app; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.annotation.IgnoreTenant; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.merchant.MchApp; +import org.dromara.daxpay.service.merchant.entity.app.MchApp; import org.dromara.daxpay.core.enums.MchAppStatusEnum; -import org.dromara.daxpay.service.param.merchant.MchAppQuery; +import org.dromara.daxpay.service.merchant.param.app.MchAppQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -47,11 +48,25 @@ public class MchAppManager extends BaseManager { } /** - * 根据应用AppId查询 + * 根据应用AppId查询, 商户端使用会过滤租户 */ public Optional findByAppId(String appId) { return this.findByField(MchApp::getAppId, appId); } + /** + * 根据应用AppId查询, 忽略租户拦截 + */ + @IgnoreTenant + public Optional findByAppIdNotTenant(String appId) { + return this.findByField(MchApp::getAppId, appId); + } + + /** + * 商户是否存在APP + */ + public boolean existByMchNo(String mchNo) { + return existedByField(MchApp::getMchNo, mchNo); + } /** * 分页 @@ -70,4 +85,30 @@ public class MchAppManager extends BaseManager { } + /** + * 根据商户号查询启用的商户 + */ + public List findAllByMchNoAndEnable(String mchNo) { + return lambdaQuery() + .eq(MchApp::getMchNo, mchNo) + .eq(MchApp::getStatus, MchAppStatusEnum.ENABLE.getCode()) + .list(); + } + + /** + * 根据商户号查询应用 + */ + public List findAllByMchNo(String mchNo) { + return lambdaQuery() + .eq(MchApp::getMchNo, mchNo) + .list(); + } + + /** + * 根据商户号判断是否存在 + */ + public boolean existsByAppId(String appId) { + return existedByField(MchApp::getAppId, appId); + } + } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/merchant/MchAppMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/app/MchAppMapper.java similarity index 66% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/merchant/MchAppMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/app/MchAppMapper.java index 2ed79787..baa13d4d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/merchant/MchAppMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/app/MchAppMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.merchant; +package org.dromara.daxpay.service.merchant.dao.app; -import org.dromara.daxpay.service.entity.merchant.MchApp; +import org.dromara.daxpay.service.merchant.entity.app.MchApp; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/ChannelConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/ChannelConfigManager.java similarity index 95% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/ChannelConfigManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/ChannelConfigManager.java index 5a8ef49d..f3eaa2bf 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/ChannelConfigManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/ChannelConfigManager.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.dao.config; +package org.dromara.daxpay.service.merchant.dao.config; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import org.dromara.daxpay.service.entity.config.ChannelConfig; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/ChannelConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/ChannelConfigMapper.java similarity index 66% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/ChannelConfigMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/ChannelConfigMapper.java index f6593ccd..41a4afe6 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/ChannelConfigMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/ChannelConfigMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.config; +package org.dromara.daxpay.service.merchant.dao.config; -import org.dromara.daxpay.service.entity.config.ChannelConfig; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/MerchantNotifyConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/MerchantNotifyConfigManager.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/MerchantNotifyConfigManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/MerchantNotifyConfigManager.java index d0e0da92..9e96abd1 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/MerchantNotifyConfigManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/MerchantNotifyConfigManager.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.dao.config; +package org.dromara.daxpay.service.merchant.dao.config; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.entity.config.MerchantNotifyConfig; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.merchant.entity.config.MerchantNotifyConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/MerchantNotifyConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/MerchantNotifyConfigMapper.java similarity index 66% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/MerchantNotifyConfigMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/MerchantNotifyConfigMapper.java index 00e82908..34b99d7f 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/config/MerchantNotifyConfigMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/config/MerchantNotifyConfigMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.config; +package org.dromara.daxpay.service.merchant.dao.config; -import org.dromara.daxpay.service.entity.config.MerchantNotifyConfig; +import org.dromara.daxpay.service.merchant.entity.config.MerchantNotifyConfig; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregateBarPayConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregateBarPayConfigManager.java similarity index 92% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregateBarPayConfigManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregateBarPayConfigManager.java index 00065d03..ee221d30 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregateBarPayConfigManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregateBarPayConfigManager.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.dao.gateway; +package org.dromara.daxpay.service.merchant.dao.gateway; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.entity.gateway.AggregateBarPayConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.AggregateBarPayConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregateBarPayConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregateBarPayConfigMapper.java similarity index 66% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregateBarPayConfigMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregateBarPayConfigMapper.java index 8ee3b3ed..4d797dc4 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregateBarPayConfigMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregateBarPayConfigMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.gateway; +package org.dromara.daxpay.service.merchant.dao.gateway; -import org.dromara.daxpay.service.entity.gateway.AggregateBarPayConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.AggregateBarPayConfig; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregatePayConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregatePayConfigManager.java similarity index 92% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregatePayConfigManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregatePayConfigManager.java index b68304cb..fc09cbe4 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregatePayConfigManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregatePayConfigManager.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.dao.gateway; +package org.dromara.daxpay.service.merchant.dao.gateway; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.entity.gateway.AggregatePayConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.AggregatePayConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregatePayConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregatePayConfigMapper.java similarity index 65% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregatePayConfigMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregatePayConfigMapper.java index 64b203b3..91977845 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/AggregatePayConfigMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/AggregatePayConfigMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.gateway; +package org.dromara.daxpay.service.merchant.dao.gateway; -import org.dromara.daxpay.service.entity.gateway.AggregatePayConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.AggregatePayConfig; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierGroupConfigManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/CashierGroupConfigManager.java similarity index 74% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierGroupConfigManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/CashierGroupConfigManager.java index 774d3584..7e30a0de 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/CashierGroupConfigManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/CashierGroupConfigManager.java @@ -1,9 +1,7 @@ -package org.dromara.daxpay.service.dao.gateway; +package org.dromara.daxpay.service.merchant.dao.gateway; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.service.entity.gateway.CashierGroupConfig; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; +import org.dromara.daxpay.service.merchant.entity.gateway.CashierGroupConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; @@ -20,7 +18,6 @@ import java.util.List; @RequiredArgsConstructor public class CashierGroupConfigManager extends BaseManager { - /** * 查询指定类型的分组, 并进行排序 */ @@ -35,7 +32,7 @@ public class CashierGroupConfigManager extends BaseManager findByAppId(String appId) { return findByField(MchAppBaseEntity::getAppId,appId); } - - /** - * 判重 - */ - public boolean existsByAppId(String appId){ - return existedByField(MchAppBaseEntity::getAppId, appId); - } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/GatewayPayConfigMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/GatewayPayConfigMapper.java similarity index 65% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/GatewayPayConfigMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/GatewayPayConfigMapper.java index c5092958..13e6314d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/gateway/GatewayPayConfigMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/gateway/GatewayPayConfigMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.gateway; +package org.dromara.daxpay.service.merchant.dao.gateway; -import org.dromara.daxpay.service.entity.gateway.GatewayPayConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.GatewayPayConfig; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantManager.java new file mode 100644 index 00000000..ac53e634 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantManager.java @@ -0,0 +1,82 @@ +package org.dromara.daxpay.service.merchant.dao.info; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.rest.param.PageParam; +import org.dromara.daxpay.core.enums.MerchantStatusEnum; +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import org.dromara.daxpay.service.merchant.param.info.MerchantQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Repository; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +/** + * 商户信息 + * @author xxm + * @since 2024/5/27 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class MerchantManager extends BaseManager { + + /** + * 根据id进行更新 + */ + @Override + @CacheEvict(value = "cache:merchantCache", key = "#merchant.mchNo") + public int updateById(Merchant merchant) { + return super.updateById(merchant); + } + + + /** + * 批量更新 + */ + @Override + @CacheEvict(value = "cache:merchantCache", allEntries = true) + public boolean updateAllById(Collection entityList) { + return super.updateAllById(entityList); + } + + /** + * 根据商户信息查询 + */ + public Optional findByMchNo(String mchNo) { + return this.findByField(Merchant::getMchNo, mchNo); + } + + /** + * 分页 + */ + public Page page(PageParam pageParam, MerchantQuery query) { + Page mpPage = MpUtil.getMpPage(pageParam); + QueryWrapper wrapper = QueryGenerator.generator(query); + return this.page(mpPage, wrapper); + } + + /** + * 查询启用的商户, + */ + public List findAllByEnable() { + return this.lambdaQuery() + .eq(Merchant::getStatus, MerchantStatusEnum.ENABLE.getCode()) + .list(); + } + + /** + * 查询商户号是否存在 + */ + public boolean existedByMchNo(String mchNo) { + return existedByField(Merchant::getMchNo, mchNo); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantMapper.java new file mode 100644 index 00000000..73c0a861 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.merchant.dao.info; + +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author xxm + * @since 2024/5/27 + */ +@Mapper +public interface MerchantMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantUserManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantUserManager.java new file mode 100644 index 00000000..c8c15aa4 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantUserManager.java @@ -0,0 +1,37 @@ +package org.dromara.daxpay.service.merchant.dao.info; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.merchant.entity.info.MerchantUser; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * + * @author xxm + * @since 2024/8/22 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class MerchantUserManager extends BaseManager { + + /** + * 判断用户是否存在 + */ + public boolean existsByUserId(Long userId){ + return existedByField(MerchantUser::getUserId, userId); + } + /** + * 判断用户是否存在 + */ + public boolean existsByUserIds(List userIds){ + Long count = lambdaQuery().in(MerchantUser::getUserId, userIds) + .count(); + return userIds.size() == count; + } + + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantUserMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantUserMapper.java new file mode 100644 index 00000000..070a1646 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/dao/info/MerchantUserMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.merchant.dao.info; + +import org.dromara.daxpay.service.merchant.entity.info.MerchantUser; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author xxm + * @since 2024/8/22 + */ +@Mapper +public interface MerchantUserMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/merchant/MchApp.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/app/MchApp.java similarity index 73% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/merchant/MchApp.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/app/MchApp.java index d4a69223..d9d72f1d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/merchant/MchApp.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/app/MchApp.java @@ -1,13 +1,12 @@ -package org.dromara.daxpay.service.entity.merchant; +package org.dromara.daxpay.service.merchant.entity.app; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.core.enums.MerchantTypeEnum; -import org.dromara.daxpay.core.enums.SignTypeEnum; -import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; -import org.dromara.daxpay.service.convert.merchant.MchAppConvert; import org.dromara.daxpay.core.enums.MchAppStatusEnum; -import org.dromara.daxpay.service.result.merchant.MchAppResult; +import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; +import org.dromara.daxpay.core.enums.SignTypeEnum; +import org.dromara.daxpay.service.merchant.convert.app.MchAppConvert; +import org.dromara.daxpay.service.merchant.result.app.MchAppResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @@ -28,15 +27,7 @@ import java.math.BigDecimal; @FieldNameConstants @Accessors(chain = true) @TableName("pay_mch_app") -public class MchApp extends MpBaseEntity implements ToResult { - - /** 商户号 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - private String mchNo; - - /** 应用号 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - private String appId; +public class MchApp extends MchAppBaseEntity implements ToResult { /** 应用名称 */ private String appName; @@ -89,12 +80,6 @@ public class MchApp extends MpBaseEntity implements ToResult { @TableField(updateStrategy = FieldStrategy.ALWAYS) private String notifyUrl; - /** - * 所属用户类型 - * @see MerchantTypeEnum - */ - @TableField(updateStrategy = FieldStrategy.ALWAYS) - private String merchantType; @Override diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/MerchantNotifyConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/config/MerchantNotifyConfig.java similarity index 79% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/MerchantNotifyConfig.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/config/MerchantNotifyConfig.java index 2f9aa4bb..96eeecd1 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/MerchantNotifyConfig.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/config/MerchantNotifyConfig.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.entity.config; +package org.dromara.daxpay.service.merchant.entity.config; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/AggregateBarPayConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/gateway/AggregateBarPayConfig.java similarity index 78% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/AggregateBarPayConfig.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/gateway/AggregateBarPayConfig.java index 19f4465e..9a3ec34e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/AggregateBarPayConfig.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/gateway/AggregateBarPayConfig.java @@ -1,13 +1,13 @@ -package org.dromara.daxpay.service.entity.gateway; +package org.dromara.daxpay.service.merchant.entity.gateway; import cn.bootx.platform.common.mybatisplus.function.ToResult; import org.dromara.daxpay.core.enums.AggregateBarPayTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.gateway.AggregateBarPayConfigConvert; -import org.dromara.daxpay.service.param.gateway.AggregateBarPayConfigParam; -import org.dromara.daxpay.service.result.gateway.config.AggregateBarPayConfigResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.merchant.convert.gateway.AggregateBarPayConfigConvert; +import org.dromara.daxpay.service.merchant.param.gateway.AggregateBarPayConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.AggregateBarPayConfigResult; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/AggregatePayConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/gateway/AggregatePayConfig.java similarity index 80% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/AggregatePayConfig.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/gateway/AggregatePayConfig.java index c3725600..ee67e36b 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/gateway/AggregatePayConfig.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/gateway/AggregatePayConfig.java @@ -1,14 +1,14 @@ -package org.dromara.daxpay.service.entity.gateway; +package org.dromara.daxpay.service.merchant.entity.gateway; import cn.bootx.platform.common.mybatisplus.function.ToResult; import org.dromara.daxpay.core.enums.AggregatePayTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.gateway.AggregatePayConfigConvert; -import org.dromara.daxpay.service.param.gateway.AggregatePayConfigParam; -import org.dromara.daxpay.service.result.gateway.config.AggregatePayConfigResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.merchant.convert.gateway.AggregatePayConfigConvert; +import org.dromara.daxpay.service.merchant.param.gateway.AggregatePayConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.AggregatePayConfigResult; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -56,6 +56,9 @@ public class AggregatePayConfig extends MchAppBaseEntity implements ToResult { + /** 是否读取系统配置 */ + private Boolean readSystem; + /** 显示名称 */ private String name; @@ -47,6 +50,12 @@ public class GatewayPayConfig extends MchAppBaseEntity implements ToResult { + + /** 商户号 */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private String mchNo; + + /** 商户名称 */ + private String mchName; + + /** 商户简称 */ + private String mchShortName; + + /** 是否有关联管理员 */ + private boolean administrator; + + /** 关联管理员用户 */ + private Long adminUserId; + + /** + * 状态 + * @see MerchantStatusEnum + */ + private String status; + + @Override + public MerchantResult toResult() { + return MerchantConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/info/MerchantUser.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/info/MerchantUser.java new file mode 100644 index 00000000..388c2e00 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/entity/info/MerchantUser.java @@ -0,0 +1,32 @@ +package org.dromara.daxpay.service.merchant.entity.info; + +import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 用户商户关联关系 + * @author xxm + * @since 2024/8/22 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@AllArgsConstructor +@RequiredArgsConstructor +@TableName("pay_merchant_user") +public class MerchantUser extends MpCreateEntity { + + /** 用户ID */ + private Long userId; + + /** 商户号 */ + private String mchNo; + + /** 是否为商户管理员 */ + private boolean administrator; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/local/MchContextLocal.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/local/MchContextLocal.java similarity index 92% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/local/MchContextLocal.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/local/MchContextLocal.java index 7ca18a0c..9f1dcefd 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/local/MchContextLocal.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/local/MchContextLocal.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.common.local; +package org.dromara.daxpay.service.merchant.local; import lombok.experimental.UtilityClass; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/app/MchAppParam.java similarity index 95% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/app/MchAppParam.java index 3ccd6d13..6a61d2aa 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/app/MchAppParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.merchant; +package org.dromara.daxpay.service.merchant.param.app; import cn.bootx.platform.core.validation.ValidationGroup; import org.dromara.daxpay.core.enums.MchAppStatusEnum; @@ -26,6 +26,10 @@ public class MchAppParam { @NotNull(message = "主键ID不可为空", groups = ValidationGroup.edit.class) private Long id; + /** 商户号 */ + @Schema(description = "商户号") + private String mchNo; + /** 应用名称 */ @Schema(description = "应用名称") @NotNull(message = "应用名称不可为空") diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/app/MchAppQuery.java similarity index 78% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppQuery.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/app/MchAppQuery.java index f0b36a63..ec30538b 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppQuery.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/app/MchAppQuery.java @@ -1,9 +1,8 @@ -package org.dromara.daxpay.service.param.merchant; +package org.dromara.daxpay.service.merchant.param.app; import cn.bootx.platform.core.annotation.QueryParam; import org.dromara.daxpay.core.enums.MchAppStatusEnum; import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; -import org.dromara.daxpay.core.enums.MerchantTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; @@ -19,6 +18,10 @@ import lombok.experimental.Accessors; @Schema(title = "商户应用查询参数") public class MchAppQuery { + /** 商户号 */ + @Schema(description = "商户号") + private String mchNo; + /** 应用名称 */ @Schema(description = "应用号") private String appId; @@ -48,13 +51,4 @@ public class MchAppQuery { @Schema(description = "应用状态") private String status; - /** - * 应用类型(所属用户类型) - * @see MerchantTypeEnum - */ - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "应用类型(所属用户类型)") - private String merchantType; - - } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/config/NotifySubscribeParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/config/NotifySubscribeParam.java similarity index 90% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/config/NotifySubscribeParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/config/NotifySubscribeParam.java index 41570793..6d4353d8 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/config/NotifySubscribeParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/config/NotifySubscribeParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.config; +package org.dromara.daxpay.service.merchant.param.config; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/AggregateBarPayConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/AggregateBarPayConfigParam.java similarity index 97% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/AggregateBarPayConfigParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/AggregateBarPayConfigParam.java index 28f5a8f3..7ae020be 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/AggregateBarPayConfigParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/AggregateBarPayConfigParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.gateway; +package org.dromara.daxpay.service.merchant.param.gateway; import cn.bootx.platform.core.validation.ValidationGroup; import org.dromara.daxpay.core.enums.AggregateBarPayTypeEnum; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/AggregatePayConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/AggregatePayConfigParam.java similarity index 93% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/AggregatePayConfigParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/AggregatePayConfigParam.java index 67db21ad..d0c15ee8 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/AggregatePayConfigParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/AggregatePayConfigParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.gateway; +package org.dromara.daxpay.service.merchant.param.gateway; import cn.bootx.platform.core.validation.ValidationGroup; import org.dromara.daxpay.core.enums.AggregatePayTypeEnum; @@ -69,6 +69,10 @@ public class AggregatePayConfigParam { @NotNull(message = "需要获取OpenId不可为空") private Boolean needOpenId; + /** OpenId获取方式 */ + @Schema(description = "OpenId获取方式") + private String openIdGetType; + /** * 发起调用的类型 * @see GatewayCallTypeEnum diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierGroupConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/CashierGroupConfigParam.java similarity index 96% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierGroupConfigParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/CashierGroupConfigParam.java index 639714f5..b7f39c84 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierGroupConfigParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/CashierGroupConfigParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.gateway; +package org.dromara.daxpay.service.merchant.param.gateway; import cn.bootx.platform.core.validation.ValidationGroup; import org.dromara.daxpay.core.enums.GatewayCashierTypeEnum; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierItemConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/CashierItemConfigParam.java similarity index 97% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierItemConfigParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/CashierItemConfigParam.java index 15188276..188e330f 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/CashierItemConfigParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/CashierItemConfigParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.gateway; +package org.dromara.daxpay.service.merchant.param.gateway; import cn.bootx.platform.core.validation.ValidationGroup; import org.dromara.daxpay.core.enums.ChannelEnum; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/GatewayPayConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/GatewayPayConfigParam.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/GatewayPayConfigParam.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/GatewayPayConfigParam.java index 865896f7..07900540 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/gateway/GatewayPayConfigParam.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/gateway/GatewayPayConfigParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.gateway; +package org.dromara.daxpay.service.merchant.param.gateway; import cn.bootx.platform.core.validation.ValidationGroup; import org.dromara.daxpay.core.enums.PayLimitPayEnum; @@ -26,6 +26,12 @@ public class GatewayPayConfigParam { @Schema(description = "主键") private Long id; + + /** 是否读取系统配置 */ + @NotNull(message = "是否读取系统配置不可为空") + @Schema(description = "是否读取系统配置") + private Boolean readSystem; + /** 名称 */ @Schema(description = "名称") private String name; @@ -54,6 +60,10 @@ public class GatewayPayConfigParam { @Size(max = 128, message = "限制用户支付类型不能超过128位") private String miniAppLimitPay; + /** 小程序关联终端号 */ + @Schema(description = "小程序关联终端号") + private String miniAppTerminalNo; + /** 应用号 */ @NotBlank(message = "应用号不可为空") @Size(max = 32, message = "应用号不可超过32位") diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantCreateParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantCreateParam.java new file mode 100644 index 00000000..3e050993 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantCreateParam.java @@ -0,0 +1,43 @@ +package org.dromara.daxpay.service.merchant.param.info; + +import cn.bootx.platform.core.validation.ValidationGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 商户创建参数 + * @author xxm + * @since 2025/6/6 + */ +@Data +@Accessors(chain = true) +@Schema(title = "商户参数") +public class MerchantCreateParam { + + /** 商户名称 */ + @NotBlank(message = "商户名称不可为空", groups = ValidationGroup.add.class) + @Schema(description = "商户名称") + private String mchName; + + /** 是否创建默认应用 */ + @Schema(description = "是否创建默认应用") + private Boolean createDefaultApp; + + @NotBlank(message = "用户名称不可为空") + @Schema(description = "用户名称") + private String name; + + @NotBlank(message = "登录账号不可为空") + @Schema(description = "登录账号") + private String account; + + @NotBlank(message = "密码不可为空") + @Schema(description = "密码") + private String password; + + public Boolean getCreateDefaultApp() { + return Boolean.TRUE.equals(createDefaultApp); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantParam.java new file mode 100644 index 00000000..aeec77ae --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantParam.java @@ -0,0 +1,49 @@ +package org.dromara.daxpay.service.merchant.param.info; + +import org.dromara.daxpay.core.enums.MerchantStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 商户参数 + * @author xxm + * @since 2024/6/24 + */ +@Data +@Accessors(chain = true) +@Schema(title = "商户参数") +public class MerchantParam { + + /** 主键ID */ + @Schema(description = "主键ID") + @NotNull(message = "主键ID不可为空") + private Long id; + + /** 商户名称 */ + @NotBlank(message = "商户名称不可为空") + @Schema(description = "商户名称") + private String mchName; + + /** 商户简称 */ + @NotBlank(message = "商户简称不可为空") + @Schema(description = "商户简称") + private String mchShortName; + + /** + * 状态 + * @see MerchantStatusEnum + */ + @Schema(description = "状态") + private String status; + + /** 是否创建默认应用 */ + @Schema(description = "是否创建默认应用") + private Boolean createDefaultApp; + + public Boolean getCreateDefaultApp() { + return Boolean.TRUE.equals(createDefaultApp); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantQuery.java new file mode 100644 index 00000000..c47efeb1 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantQuery.java @@ -0,0 +1,61 @@ +package org.dromara.daxpay.service.merchant.param.info; + +import cn.bootx.platform.core.annotation.QueryParam; +import org.dromara.daxpay.core.enums.MerchantStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 商户参数 + * @author xxm + * @since 2024/6/24 + */ +@Data +@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) +@Accessors(chain = true) +@Schema(title = "商户参数") +public class MerchantQuery { + + /** 商户名称 */ + @Schema(description = "商户名称") + private String mchName; + + /** 公司名称 */ + @Schema(description = "公司名称") + private String companyName; + + /** 证件类型 */ + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "证件类型") + private String idType; + + /** 证件号 */ + @Schema(description = "证件号") + private String idNo; + + /** 联系方式 */ + @Schema(description = "联系方式") + private String tel; + + /** 法人名称 */ + @Schema(description = "法人名称") + private String legalPerson; + + /** 法人证件号码 */ + @Schema(description = "法人证件号码") + private String legalPersonIdNo; + + /** 是否有关联管理员 */ + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "是否有关联管理员") + private Boolean administrator; + + /** + * 状态 + * @see MerchantStatusEnum + */ + @Schema(description = "状态") + private String status; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantUserQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantUserQuery.java new file mode 100644 index 00000000..337e5473 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/param/info/MerchantUserQuery.java @@ -0,0 +1,25 @@ +package org.dromara.daxpay.service.merchant.param.info; + +import cn.bootx.platform.common.mybatisplus.query.entity.SortParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 商户用户查询参数 + * @author xxm + * @since 2025/8/10 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "商户用户查询参数") +public class MerchantUserQuery extends SortParam { + + @Schema(description = "名称") + private String name; + + @Schema(description = "登录账号") + private String account; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/merchant/MchAppResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/app/MchAppResult.java similarity index 84% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/merchant/MchAppResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/app/MchAppResult.java index 442f660b..8955c3bd 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/merchant/MchAppResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/app/MchAppResult.java @@ -1,16 +1,18 @@ -package org.dromara.daxpay.service.result.merchant; +package org.dromara.daxpay.service.merchant.result.app; import cn.bootx.platform.core.result.BaseResult; import org.dromara.daxpay.core.enums.MchAppStatusEnum; import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; -import org.dromara.daxpay.core.enums.MerchantTypeEnum; import org.dromara.daxpay.core.enums.SignTypeEnum; +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import org.dromara.core.trans.anno.Trans; +import org.dromara.core.trans.constant.TransType; +import org.dromara.core.trans.vo.TransPojo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import lombok.experimental.FieldNameConstants; -import org.dromara.core.trans.vo.TransPojo; import java.math.BigDecimal; @@ -26,6 +28,10 @@ import java.math.BigDecimal; @Schema(title = "商户应用") public class MchAppResult extends BaseResult implements TransPojo { + @Schema(description = "商户号") + @Trans(type = TransType.SIMPLE, target = Merchant.class, fields = Merchant.Fields.mchName, ref = MchAppResult.Fields.mchName, uniqueField=Merchant.Fields.mchNo) + private String mchNo; + @Schema(description = "商户名称") private String mchName; @@ -92,11 +98,4 @@ public class MchAppResult extends BaseResult implements TransPojo { @Schema(description = "通知地址") private String notifyUrl; - /** - * 所属用户类型 - * @see MerchantTypeEnum - */ - @Schema(description = "所属用户类型") - private String merchantType; - } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/ChannelConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/config/ChannelConfigResult.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/ChannelConfigResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/config/ChannelConfigResult.java index 3e80f3e2..9c0a1d5d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/ChannelConfigResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/config/ChannelConfigResult.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.result.config; +package org.dromara.daxpay.service.merchant.result.config; import org.dromara.daxpay.core.enums.ChannelEnum; import io.swagger.v3.oas.annotations.media.Schema; @@ -41,6 +41,10 @@ public class ChannelConfigResult{ @Schema(description = "是否启用") private Boolean enable; + /** 商户号 */ + @Schema(description = "商户号") + private String mchNo; + /** 应用号 */ @Schema(description = "应用号") private String appId; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/MerchantNotifyConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/config/MerchantNotifyConfigResult.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/MerchantNotifyConfigResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/config/MerchantNotifyConfigResult.java index feb27097..d3efe8ce 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/MerchantNotifyConfigResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/config/MerchantNotifyConfigResult.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.result.config; +package org.dromara.daxpay.service.merchant.result.config; -import org.dromara.daxpay.service.common.result.MchResult; +import org.dromara.daxpay.service.merchant.result.info.MchResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/AggregateBarPayConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/AggregateBarPayConfigResult.java similarity index 89% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/AggregateBarPayConfigResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/AggregateBarPayConfigResult.java index 2e2d8152..9e1cb48f 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/AggregateBarPayConfigResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/AggregateBarPayConfigResult.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.service.result.gateway.config; +package org.dromara.daxpay.service.merchant.result.gateway; import org.dromara.daxpay.core.enums.AggregateBarPayTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.service.common.result.MchResult; +import org.dromara.daxpay.service.merchant.result.info.MchResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/AggregatePayConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/AggregatePayConfigResult.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/AggregatePayConfigResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/AggregatePayConfigResult.java index 9b9c30df..d372fff5 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/AggregatePayConfigResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/AggregatePayConfigResult.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.service.result.gateway.config; +package org.dromara.daxpay.service.merchant.result.gateway; import org.dromara.daxpay.core.enums.AggregatePayTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.service.common.result.MchResult; +import org.dromara.daxpay.service.merchant.result.info.MchResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -55,6 +55,10 @@ public class AggregatePayConfigResult extends MchResult { @Schema(description = "需要获取OpenId") private Boolean needOpenId; + /** OpenId获取方式 */ + @Schema(description = "OpenId获取方式") + private String openIdGetType; + /** * 发起调用的类型 * @see GatewayCallTypeEnum diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierGroupConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/CashierGroupConfigResult.java similarity index 88% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierGroupConfigResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/CashierGroupConfigResult.java index d3f3ad2d..aa6de75d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierGroupConfigResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/CashierGroupConfigResult.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.result.gateway.config; +package org.dromara.daxpay.service.merchant.result.gateway; -import org.dromara.daxpay.service.common.result.MchResult; +import org.dromara.daxpay.service.merchant.result.info.MchResult; import org.dromara.daxpay.core.enums.GatewayCashierTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -24,7 +24,7 @@ public class CashierGroupConfigResult extends MchResult { * @see GatewayCashierTypeEnum */ @Schema(description = "收银台类型") - private String CashierType; + private String cashierType; /** 名称 */ @Schema(description = "名称") diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierItemConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/CashierItemConfigResult.java similarity index 93% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierItemConfigResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/CashierItemConfigResult.java index fe886d76..ad055f62 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/CashierItemConfigResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/CashierItemConfigResult.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.service.result.gateway.config; +package org.dromara.daxpay.service.merchant.result.gateway; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; import org.dromara.daxpay.core.enums.GatewayPayEnvTypeEnum; import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.service.common.result.MchResult; +import org.dromara.daxpay.service.merchant.result.info.MchResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/GatewayPayConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/GatewayPayConfigResult.java similarity index 82% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/GatewayPayConfigResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/GatewayPayConfigResult.java index 886d4c4d..545dd75c 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/gateway/config/GatewayPayConfigResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/gateway/GatewayPayConfigResult.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.result.gateway.config; +package org.dromara.daxpay.service.merchant.result.gateway; import org.dromara.daxpay.core.enums.PayLimitPayEnum; import io.swagger.v3.oas.annotations.media.Schema; @@ -19,6 +19,10 @@ public class GatewayPayConfigResult { @Schema(description = "主键") private Long id; + /** 是否读取系统配置 */ + @Schema(description = "是否读取系统配置") + private Boolean readSystem; + /** 名称 */ @Schema(description = "名称") private String name; @@ -50,4 +54,7 @@ public class GatewayPayConfigResult { @Schema(description = "限制用户支付类型") private String miniAppLimitPay; + /** 小程序关联终端号 */ + @Schema(description = "小程序关联终端号") + private String miniAppTerminalNo; } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/MchResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MchResult.java similarity index 62% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/MchResult.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MchResult.java index 147a80f9..0c162f18 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/result/MchResult.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MchResult.java @@ -1,7 +1,9 @@ -package org.dromara.daxpay.service.common.result; +package org.dromara.daxpay.service.merchant.result.info; import cn.bootx.platform.core.result.BaseResult; -import org.dromara.daxpay.service.entity.merchant.MchApp; +import org.dromara.daxpay.service.merchant.entity.app.MchApp; +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,12 +25,15 @@ import org.dromara.core.trans.vo.TransPojo; @Schema(title = "商户应用基础返回结果") public class MchResult extends BaseResult implements TransPojo { + @Schema(description = "商户号") + @Trans(type = TransType.SIMPLE, target = Merchant.class, fields = Merchant.Fields.mchName, ref = Fields.mchName, uniqueField=Merchant.Fields.mchNo) + private String mchNo; + @Schema(description = "商户名称") private String mchName; - @Schema(description = "商户应用AppId") - @Trans(type = TransType.SIMPLE, target = MchApp.class, fields = MchApp.Fields.appName, ref = Fields.appName, uniqueField=MchApp.Fields.appId) + @Trans(type = TransType.SIMPLE, target = MchApp.class, fields = MchApp.Fields.appName, ref = Fields.appName, uniqueField= MchAppBaseEntity.Fields.appId) private String appId; @Schema(description = "商户应用名称") diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MerchantResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MerchantResult.java new file mode 100644 index 00000000..d7d35ff9 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MerchantResult.java @@ -0,0 +1,51 @@ +package org.dromara.daxpay.service.merchant.result.info; + +import cn.bootx.platform.core.result.BaseResult; +import org.dromara.daxpay.core.enums.MerchantStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import lombok.experimental.FieldNameConstants; +import org.dromara.core.trans.vo.TransPojo; + +/** + * 商户信息 + * @author xxm + * @since 2024/6/24 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@FieldNameConstants +@Accessors(chain = true) +@Schema(title = "商户信息") +public class MerchantResult extends BaseResult implements TransPojo { + + /** 商户号 */ + @Schema(description = "商户号") + private String mchNo; + + /** 商户名称 */ + @Schema(description = "商户名称") + private String mchName; + + /** 商户简称 */ + @Schema(description = "商户简称") + private String mchShortName; + + /** 是否有关联管理员 */ + @Schema(description = "是否有关联管理员") + private Boolean administrator; + + /** 关联管理员用户 */ + @Schema(description = "关联管理员用户") + private Long adminUserId; + + /** + * 商户状态 + * @see MerchantStatusEnum + */ + @Schema(description = "商户状态") + private String status; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MerchantUserResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MerchantUserResult.java new file mode 100644 index 00000000..d6cbc0f7 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/result/info/MerchantUserResult.java @@ -0,0 +1,55 @@ +package org.dromara.daxpay.service.merchant.result.info; + +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import cn.bootx.platform.iam.code.UserStatusEnum; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 商户用户信息 + * @author xxm + * @since 2025/8/10 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "商户用户信息") +public class MerchantUserResult extends MchResult implements ToResult { + /** 名称 */ + private String name; + + /** 账号 */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private String account; + + /** 密码 */ + private String password; + + /** 手机号 */ + private String phone; + + /** 邮箱 */ + private String email; + + /** 是否管理员, 管理员用户不在列表中显示 */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private boolean administrator; + + /** + * 账号状态 + * @see UserStatusEnum + */ + private String status; + + /** + * 转换 + */ + @Override + public MerchantUserResult toResult() { + return this; + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/app/MchAppService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/app/MchAppService.java new file mode 100644 index 00000000..95237273 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/app/MchAppService.java @@ -0,0 +1,184 @@ +package org.dromara.daxpay.service.merchant.service.app; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.BizException; +import cn.bootx.platform.core.exception.BizInfoException; +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.iam.service.client.ClientCodeService; +import org.dromara.daxpay.core.enums.MerchantStatusEnum; +import org.dromara.daxpay.core.exception.ConfigErrorException; +import org.dromara.daxpay.core.exception.ConfigNotEnableException; +import org.dromara.daxpay.core.exception.ConfigNotExistException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.convert.app.MchAppConvert; +import org.dromara.daxpay.service.merchant.dao.config.ChannelConfigManager; +import org.dromara.daxpay.service.merchant.dao.app.MchAppManager; +import org.dromara.daxpay.service.merchant.dao.info.MerchantManager; +import org.dromara.daxpay.service.merchant.entity.app.MchApp; +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import org.dromara.daxpay.service.merchant.param.app.MchAppParam; +import org.dromara.daxpay.service.merchant.param.app.MchAppQuery; +import org.dromara.daxpay.service.merchant.result.app.MchAppResult; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.util.RandomUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 商户应用管理 + * @author xxm + * @since 2024/8/28 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MchAppService { + + private final MerchantManager merchantManager; + + private final MchAppManager mchAppManager; + + private final ClientCodeService clientCodeService; + + private final ChannelConfigManager channelConfigManager; + + + /** + * 添加应用 + */ + public void add(MchAppParam param) { + String mchNo; + if (clientCodeService.getClientCode().equals(DaxPayCode.Client.MERCHANT)) { + mchNo = MchContextLocal.getMchNo(); + } else { + mchNo = param.getMchNo(); + } + if (mchNo == null) { + throw new BizInfoException("数据错误, 未发现商户号"); + } + Merchant merchant = merchantManager.findByMchNo(mchNo).orElseThrow(() -> new DataNotExistException("商户信息不存在")); + param.setMchNo(mchNo); + MchApp entity = MchAppConvert.CONVERT.toEntity(param); + // 生成应用号 + entity.setAppId(this.generateAppId()); + mchAppManager.save(entity); + } + /** + * 修改 + */ + public void update(MchAppParam param) { + MchApp mchApp = mchAppManager.findById(param.getId()).orElseThrow(()->new ConfigNotExistException("商户应用未找到")); + this.checkApp(mchApp); + BeanUtil.copyProperties(param, mchApp, CopyOptions.create().ignoreNullValue()); + mchAppManager.updateById(mchApp); + } + + /** + * 分页 + */ + public PageResult page(PageParam pageParam, MchAppQuery query) { + return MpUtil.toPageResult(mchAppManager.page(pageParam, query)); + } + + /** + * 商户列表 + */ + public List list() { + String mchNo = MchContextLocal.getMchNo(); + // 查询启用的应用 + return mchAppManager.findAllByMchNo(mchNo).stream() + .map(MchApp::toResult) + .collect(Collectors.toList()); + } + + /** + * 获取单条 + */ + public MchAppResult findById(Long id) { + var mchApp = mchAppManager.findById(id).orElseThrow(()->new ConfigNotExistException("商户应用未找到")); + this.checkApp(mchApp); + return mchApp.toResult(); + } + + /** + * 启用下拉列表, 需要应用和商户都是启用状态 + */ + public List dropdownByEnable(String mchNo){ + if (clientCodeService.getClientCode().equals(DaxPayCode.Client.MERCHANT)){ + mchNo = MchContextLocal.getMchNo(); + } + // 判断商户状态 + Merchant merchant = merchantManager.findByMchNo(mchNo) + .orElseThrow(() -> new DataNotExistException("商户信息未找到")); + if (!Objects.equals(merchant.getStatus(), MerchantStatusEnum.ENABLE.getCode())){ + throw new ConfigNotEnableException("商户未启用"); + } + // 查询启用的应用 + return mchAppManager.findAllByMchNoAndEnable(mchNo).stream() + .map(o->new LabelValue(o.getAppName(),o.getAppId())) + .collect(Collectors.toList()); + } + + /** + * 下拉列表, 不判断应用和商户的状态 + */ + public List dropdown(String mchNo){ + if (clientCodeService.getClientCode().equals(DaxPayCode.Client.MERCHANT)){ + mchNo = MchContextLocal.getMchNo(); + } + // 查询启用的应用 + return mchAppManager.findAllByMchNo(mchNo).stream() + .map(o->new LabelValue(o.getAppName(),o.getAppId())) + .collect(Collectors.toList()); + } + + /** + * 删除 + */ + public void delete(Long id) { + MchApp mchApp = mchAppManager.findById(id).orElseThrow(()->new ConfigNotExistException("商户应用未找到")); + this.checkApp(mchApp); + // 查看是否有配置的支付配置 + if (channelConfigManager.existedByField(ChannelConfig::getAppId, mchApp.getAppId())){ + throw new OperationFailException("该商户应用已有通道配置,不允许被删除"); + } + mchAppManager.deleteById(id); + } + + /** + * 生成应用号 + */ + private String generateAppId() { + String appId = RandomUtil.randomNumbers(16); + for (int i = 0; i < 10; i++){ + if (!mchAppManager.existsByAppId(appId)){ + return appId; + } + appId = "A"+ RandomUtil.randomNumbers(16); + } + throw new BizException("应用号生成失败"); + } + + /** + * 如果和商户不匹配, 抛出错误 + */ + public void checkApp(MchApp mchApp){ + if (clientCodeService.getClientCode().equals(DaxPayCode.Client.MERCHANT)) { + if (!mchApp.getMchNo().equals(MchContextLocal.getMchNo())) { + throw new ConfigErrorException("商户和应用号不匹配"); + } + } + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/ChannelConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/config/ChannelConfigService.java similarity index 65% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/ChannelConfigService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/config/ChannelConfigService.java index 94b16368..19f04280 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/ChannelConfigService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/config/ChannelConfigService.java @@ -1,16 +1,16 @@ -package org.dromara.daxpay.service.service.config; +package org.dromara.daxpay.service.merchant.service.config; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.rest.dto.LabelValue; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.merchant.dao.config.ChannelConfigManager; +import org.dromara.daxpay.service.pay.dao.constant.ChannelConstManager; +import org.dromara.daxpay.service.pay.entity.config.ChannelConfig; +import org.dromara.daxpay.service.pay.entity.constant.ChannelConst; +import org.dromara.daxpay.service.merchant.result.config.ChannelConfigResult; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.enums.MerchantTypeEnum; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.config.ChannelConfigManager; -import org.dromara.daxpay.service.entity.config.ChannelConfig; -import org.dromara.daxpay.service.entity.constant.ChannelConst; -import org.dromara.daxpay.service.result.config.ChannelConfigResult; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.springframework.stereotype.Service; import java.util.List; @@ -31,7 +31,7 @@ public class ChannelConfigService { private final ChannelConfigManager channelConfigManager; - private final org.dromara.daxpay.service.pay.dao.constant.ChannelConstManager channelConstManager; + private final ChannelConstManager channelConstManager; private final PaymentAssistService paymentAssistService; @@ -46,26 +46,21 @@ public class ChannelConfigService { .collect(Collectors.toMap(ChannelConfig::getChannel, Function.identity(), (v1, v2) -> v1)); // 商户应用 paymentAssistService.initMchAndApp(appId); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - // 遍历通道类型, 特约商户不显示普通类型 - List channelList; - if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){ - // 特约商户只显示服务商类型通道 - channelList = channelConstManager.findAllByIsvAndEnable(); - } else { - // 普通商户显示全部类型通道 - channelList = channelConstManager.findAllByEnable(); - } + var mchApp = PaymentContextLocal.get().getReqInfo(); + // 遍历通道类型 + List channelList = channelConstManager.findAllByEnable(); return channelList.stream().map(o->{ ChannelConfig channelConfig = channelConfigMap.get(o.getCode()); if (Objects.isNull(channelConfig)){ return new ChannelConfigResult() .setChannel(o.getCode()) .setName(o.getName()) + .setMchNo(mchApp.getMchNo()) .setAppId(mchApp.getAppId()); } else { return channelConfig.toResult() .setName(o.getName()) + .setMchNo(mchApp.getMchNo()) .setAppId(mchApp.getAppId()); } }).toList(); @@ -81,16 +76,8 @@ public class ChannelConfigService { // 商户应用 paymentAssistService.initMchAndApp(appId); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - // 遍历通道类型, 特约商户不显示普通类型 - List channelList; - if (Objects.equals(mchApp.getMchType(), MerchantTypeEnum.PARTNER.getCode())){ - // 特约商户只显示服务商类型通道 - channelList = channelConstManager.findAllByIsvAndEnable(); - } else { - // 普通商户显示全部类型通道 - channelList = channelConstManager.findAllByEnable(); - } + // 遍历通道类型 + List channelList = channelConstManager.findAllByEnable(); var constMap = channelList.stream().collect(Collectors.toMap(ChannelConst::getCode, Function.identity())); return channelList.stream() .map(o-> channelConfigMap.get(o.getCode())) diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/MerchantNotifyConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/config/MerchantNotifyConfigService.java similarity index 80% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/MerchantNotifyConfigService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/config/MerchantNotifyConfigService.java index 37b23a19..3537d65a 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/MerchantNotifyConfigService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/config/MerchantNotifyConfigService.java @@ -1,13 +1,13 @@ -package org.dromara.daxpay.service.service.config; +package org.dromara.daxpay.service.merchant.service.config; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import org.dromara.daxpay.service.common.cache.MchAppCacheService; -import org.dromara.daxpay.service.dao.config.MerchantNotifyConfigManager; -import org.dromara.daxpay.service.dao.constant.MerchantNotifyConstManager; -import org.dromara.daxpay.service.entity.config.MerchantNotifyConfig; -import org.dromara.daxpay.service.entity.constant.MerchantNotifyConst; -import org.dromara.daxpay.service.entity.merchant.MchApp; -import org.dromara.daxpay.service.result.config.MerchantNotifyConfigResult; +import org.dromara.daxpay.service.merchant.cache.MchAppCacheService; +import org.dromara.daxpay.service.merchant.dao.config.MerchantNotifyConfigManager; +import org.dromara.daxpay.service.pay.dao.constant.MerchantNotifyConstManager; +import org.dromara.daxpay.service.merchant.entity.config.MerchantNotifyConfig; +import org.dromara.daxpay.service.pay.entity.constant.MerchantNotifyConst; +import org.dromara.daxpay.service.merchant.entity.app.MchApp; +import org.dromara.daxpay.service.merchant.result.config.MerchantNotifyConfigResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; @@ -54,7 +54,8 @@ public class MerchantNotifyConfigService { .setName(o.getName()) .setDescription(o.getDescription()) .setSubscribe(subscribe); - result.setAppId(appId); + result.setAppId(appId) + .setMchNo(mchApp.getMchNo()); return result; }).toList(); } @@ -90,6 +91,7 @@ public class MerchantNotifyConfigService { } else { MerchantNotifyConfig merchantNotifyConfig = new MerchantNotifyConfig(); merchantNotifyConfig.setAppId(appId); + merchantNotifyConfig.setMchNo(mchApp.getMchNo()); merchantNotifyConfig.setCode(notifyType); merchantNotifyConfig.setSubscribe(subscribe); configManager.save(merchantNotifyConfig); diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/AggregateConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/AggregateConfigService.java similarity index 75% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/AggregateConfigService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/AggregateConfigService.java index e7c03bd1..fc3f6832 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/AggregateConfigService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/AggregateConfigService.java @@ -1,18 +1,20 @@ -package org.dromara.daxpay.service.service.gateway.config; +package org.dromara.daxpay.service.merchant.service.gateway; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; +import org.dromara.daxpay.core.exception.ConfigNotExistException; import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.gateway.AggregateBarPayConfigManager; -import org.dromara.daxpay.service.dao.gateway.AggregatePayConfigManager; -import org.dromara.daxpay.service.entity.gateway.AggregateBarPayConfig; -import org.dromara.daxpay.service.entity.gateway.AggregatePayConfig; -import org.dromara.daxpay.service.param.gateway.AggregateBarPayConfigParam; -import org.dromara.daxpay.service.param.gateway.AggregatePayConfigParam; -import org.dromara.daxpay.service.result.gateway.config.AggregateBarPayConfigResult; -import org.dromara.daxpay.service.result.gateway.config.AggregatePayConfigResult; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.merchant.dao.gateway.AggregateBarPayConfigManager; +import org.dromara.daxpay.service.merchant.dao.gateway.AggregatePayConfigManager; +import org.dromara.daxpay.service.merchant.entity.gateway.AggregateBarPayConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.AggregatePayConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.GatewayPayConfig; +import org.dromara.daxpay.service.merchant.param.gateway.AggregateBarPayConfigParam; +import org.dromara.daxpay.service.merchant.param.gateway.AggregatePayConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.AggregateBarPayConfigResult; +import org.dromara.daxpay.service.merchant.result.gateway.AggregatePayConfigResult; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import lombok.RequiredArgsConstructor; @@ -68,11 +70,12 @@ public class AggregateConfigService { */ public void savePay(AggregatePayConfigParam param){ paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); + var mchApp = PaymentContextLocal.get().getReqInfo(); if (aggregatePayConfigManager.existsByAppIdAndType(param.getAppId(), param.getAggregateType())){ throw new OperationFailException("聚合支付配置已存在"); } var entity = AggregatePayConfig.init(param); + entity.setMchNo(mchApp.getMchNo()); aggregatePayConfigManager.save(entity); } @@ -155,4 +158,19 @@ public class AggregateConfigService { return aggregateBarPayConfigManager.existsByAppIdAndType(appId, type, id); } + /** + * 获取聚合支付配置 + */ + public AggregatePayConfig getAggregatePayConfig(String appId, String aggregateType, GatewayPayConfig gatewayPayConfig) { + return aggregatePayConfigManager.findByAppIdAndType(appId, aggregateType) + .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); + } + + /** + * 获取聚合付款码 + */ + public List getAggregateBarPayConfigs(String appId, String barPayType, GatewayPayConfig gatewayPayConfig) { + return aggregateBarPayConfigManager.findByAppIdAndType(appId, barPayType); + } + } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/CashierConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/CashierConfigService.java similarity index 63% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/CashierConfigService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/CashierConfigService.java index 938f1c7b..cc9dafd6 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/CashierConfigService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/CashierConfigService.java @@ -1,20 +1,21 @@ -package org.dromara.daxpay.service.service.gateway.config; +package org.dromara.daxpay.service.merchant.service.gateway; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; import org.dromara.daxpay.core.enums.GatewayCashierTypeEnum; import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.gateway.CashierGroupConfigManager; -import org.dromara.daxpay.service.dao.gateway.CashierItemConfigManager; -import org.dromara.daxpay.service.entity.gateway.CashierGroupConfig; -import org.dromara.daxpay.service.entity.gateway.CashierItemConfig; -import org.dromara.daxpay.service.param.gateway.CashierGroupConfigParam; -import org.dromara.daxpay.service.param.gateway.CashierItemConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierGroupConfigResult; -import org.dromara.daxpay.service.result.gateway.config.CashierItemConfigResult; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.merchant.dao.gateway.CashierGroupConfigManager; +import org.dromara.daxpay.service.merchant.dao.gateway.CashierItemConfigManager; +import org.dromara.daxpay.service.merchant.entity.gateway.CashierGroupConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.CashierItemConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.GatewayPayConfig; +import org.dromara.daxpay.service.merchant.param.gateway.CashierGroupConfigParam; +import org.dromara.daxpay.service.merchant.param.gateway.CashierItemConfigParam; +import org.dromara.daxpay.service.merchant.result.gateway.CashierGroupConfigResult; +import org.dromara.daxpay.service.merchant.result.gateway.CashierItemConfigResult; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import lombok.RequiredArgsConstructor; @@ -23,6 +24,7 @@ import org.springframework.stereotype.Service; import java.util.List; import java.util.Objects; +import java.util.Optional; /** * 收银台配置 @@ -78,11 +80,31 @@ public class CashierConfigService { throw new DataErrorException("H5网关支付分组只能有一个"); } paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); + var mchApp = PaymentContextLocal.get().getReqInfo(); var entity = CashierGroupConfig.init(param); + entity.setMchNo(mchApp.getMchNo()); cashierGroupConfigManager.save(entity); } + /** + * 保存默认分组配置(h5) + */ + public void saveDefaultGroup(String appId) { + // h5只能创建一个 + if (cashierGroupConfigManager.existedByType(GatewayCashierTypeEnum.H5.getCode(), appId)) { + throw new DataErrorException("H5网关支付分组只能有一个"); + } + paymentAssistService.initMchAndApp(appId); + var mchApp = PaymentContextLocal.get().getReqInfo(); + var entity = new CashierGroupConfig() + .setCashierType(GatewayCashierTypeEnum.H5.getCode()) + .setSortNo(0.0) + .setName("H5收银台"); + entity.setMchNo(mchApp.getMchNo()); + cashierGroupConfigManager.save(entity); + } + + /** * 更新分组配置 */ @@ -114,8 +136,9 @@ public class CashierConfigService { throw new DataNotExistException("所属分组配置不存在"); } paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); + var mchApp = PaymentContextLocal.get().getReqInfo(); var entity = CashierItemConfig.init(param); + entity.setMchNo(mchApp.getMchNo()); cashierItemConfigManager.save(entity); } @@ -139,4 +162,26 @@ public class CashierConfigService { } cashierItemConfigManager.deleteById(id); } + + /** + * 网关收银台分组配置, 根据配置使用自定义或读取服务商配置 + */ + public List getCashierGroupConfigs(String appId, String cashierType, GatewayPayConfig gatewayConfig) { + return cashierGroupConfigManager.findAllByAppIdAndType(appId, cashierType); + } + + /** + * 网关收银台配置项列表 + */ + public List getCashierItemConfigs(List groupIds, GatewayPayConfig gatewayConfig) { + return cashierItemConfigManager.findAllByGroupIds(groupIds); + } + + /** + * 网关收银台配置项 + */ + public Optional getCashierItemConfig(Long itemId, String appId, GatewayPayConfig gatewayConfig){ + return cashierItemConfigManager.findByIdAndAppId(itemId,appId); + } + } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/GatewayPayConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/GatewayPayConfigService.java new file mode 100644 index 00000000..49ff566c --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/gateway/GatewayPayConfigService.java @@ -0,0 +1,60 @@ +package org.dromara.daxpay.service.merchant.service.gateway; + +import cn.bootx.platform.core.exception.DataNotExistException; +import org.dromara.daxpay.service.merchant.dao.gateway.GatewayPayConfigManager; +import org.dromara.daxpay.service.merchant.entity.gateway.GatewayPayConfig; +import org.dromara.daxpay.service.merchant.param.gateway.GatewayPayConfigParam; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 网关支付配置 + * @author xxm + * @since 2025/3/24 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class GatewayPayConfigService { + private final GatewayPayConfigManager gatewayPayConfigManager; + private final PaymentAssistService paymentAssistService; + + /** + * 获取网关支付配置 + */ + public GatewayPayConfig findByAppId(String appId){ + var configOptional = gatewayPayConfigManager.findByAppId(appId); + if (configOptional.isEmpty()){ + paymentAssistService.initMchAndApp(appId); + var mchApp = PaymentContextLocal.get().getReqInfo(); + // 特约商户 + var entity = new GatewayPayConfig().setReadSystem(true); + gatewayPayConfigManager.save(entity); + return entity; + } else { + return configOptional.get(); + } + } + + /** + * 更新网关支付配置 + */ + public void update(GatewayPayConfigParam param){ + var gatewayPayConfig = gatewayPayConfigManager.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("收银台网关支付不存在")); + BeanUtil.copyProperties(param, gatewayPayConfig); + gatewayPayConfigManager.updateById(gatewayPayConfig); + } + + /** + * 获取网关支付配置, 根据配置使用自定义或读取服务商配置 + */ + public GatewayPayConfig getGatewayConfig(String appId){ + return this.findByAppId(appId); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/info/MerchantInfoService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/info/MerchantInfoService.java new file mode 100644 index 00000000..a3a6fc79 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/info/MerchantInfoService.java @@ -0,0 +1,91 @@ +package org.dromara.daxpay.service.merchant.service.info; + +import cn.bootx.platform.core.exception.BizInfoException; +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.iam.service.client.ClientCodeService; +import org.dromara.daxpay.service.merchant.dao.info.MerchantManager; +import org.dromara.daxpay.service.merchant.entity.info.Merchant; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import org.dromara.daxpay.service.merchant.param.info.MerchantParam; +import org.dromara.daxpay.service.merchant.result.info.MerchantResult; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 商户信息管理 + * @author xxm + * @since 2024/8/27 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MerchantInfoService { + private final MerchantManager merchantManager; + private final ClientCodeService clientCodeService; + + /** + * 获取商户信息 + */ + public MerchantResult getMerchant() { + String mchNo = MchContextLocal.getMchNo(); + if (mchNo == null){ + throw new BizInfoException("数据错误, 未发现商户号"); + } + return merchantManager.findByMchNo(mchNo).map(Merchant::toResult).orElseThrow(() -> new DataNotExistException("商户信息不存在")); + } + + /** + * 修改 + */ + public void update(MerchantParam param) { + String mchNo = MchContextLocal.getMchNo(); + if (mchNo == null){ + throw new BizInfoException("数据错误, 未发现商户号"); + } + Merchant merchant = merchantManager.findByMchNo(mchNo) + .orElseThrow(() -> new DataNotExistException("商户信息不存在")); + BeanUtil.copyProperties(param, merchant, CopyOptions.create().ignoreNullValue()); + merchantManager.updateById(merchant); + } + + /** + * 商户下拉框 + */ + public List dropdown() { + List list; + if (clientCodeService.getClientCode().equals(DaxPayCode.Client.ADMIN)){ + list = merchantManager.findAll(); + } else { + list = merchantManager.findAllByField(Merchant::getMchNo, MchContextLocal.getMchNo()); + } + return list.stream() + .map(mch -> new LabelValue(mch.getMchName(),mch.getMchNo())) + .collect(Collectors.toList()); + } + + /** + * 商户下拉框 + */ + public List dropdownByEnable() { + List list; + if (clientCodeService.getClientCode().equals(DaxPayCode.Client.ADMIN)){ + list = merchantManager.findAllByEnable(); + } else { + list = merchantManager.findAllByField(Merchant::getMchNo, MchContextLocal.getMchNo()); + } + return list.stream() + .map(mch -> new LabelValue(mch.getMchName(),mch.getMchNo())) + .collect(Collectors.toList()); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/info/MerchantUserService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/info/MerchantUserService.java new file mode 100644 index 00000000..d7a39e56 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/merchant/service/info/MerchantUserService.java @@ -0,0 +1,171 @@ +package org.dromara.daxpay.service.merchant.service.info; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.iam.dao.user.UserInfoManager; +import cn.bootx.platform.iam.entity.user.UserInfo; +import cn.bootx.platform.iam.param.user.UserInfoParam; +import cn.bootx.platform.iam.result.user.UserInfoResult; +import cn.bootx.platform.iam.service.user.UserAdminService; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.merchant.dao.info.MerchantUserManager; +import org.dromara.daxpay.service.merchant.entity.info.MerchantUser; +import org.dromara.daxpay.service.merchant.param.info.MerchantUserQuery; +import org.dromara.daxpay.service.merchant.result.info.MerchantUserResult; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 用户商户关联关系 + * @author xxm + * @since 2024/8/22 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MerchantUserService { + + private final MerchantUserManager merchantUserManager; + private final UserAdminService userAdminService; + private final UserInfoManager userInfoManager; + + /** + * 根据用户id查询商户号 + */ + @Cacheable(value = "cache:merchant:user", key = "#userId") + public String findByUserId(Long userId){ + return merchantUserManager.findByField(MerchantUser::getUserId, userId) + .map(MerchantUser::getMchNo) + .orElse(null); + + } + + /** + * 分页 + */ + public PageResult page(PageParam pageParam, MerchantUserQuery query){ + Page mpPage = MpUtil.getMpPage(pageParam); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); + wrapper.innerJoin(UserInfo.class,UserInfo::getId, MerchantUser::getUserId) + .selectAll(UserInfo.class) + .select(MerchantUser::getMchNo) + .like(StrUtil.isNotBlank(query.getAccount()),UserInfo::getAccount, query.getAccount()) + .like(StrUtil.isNotBlank(query.getName()),UserInfo::getName, query.getName()); + Page page = merchantUserManager.selectJoinListPage(mpPage, MerchantUserResult.class, wrapper); + return MpUtil.toPageResult(page); + } + + /** + * 根据Id查询 + */ + public UserInfoResult findById(Long id) { + this.checkMerchantUser(id); + return userInfoManager.findById(id) + .map(UserInfo::toResult) + .orElseThrow(() -> new DataNotExistException("用户不存在")); + } + + /** + * 封禁用户 + */ + public void ban(Long userId) { + this.checkMerchantUser(userId); + userAdminService.ban(userId); + } + + /** + * 批量封禁用户 + */ + public void banBatch(List userIds) { + this.checkMerchantUser(userIds); + userAdminService.banBatch(userIds); + } + + /** + * 锁定用户 + */ + public void lock(Long userId) { + this.checkMerchantUser(userId); + userAdminService.lock(userId); + } + + /** + * 批量锁定用户 + */ + public void lockBatch(List userIds) { + this.checkMerchantUser(userIds); + userAdminService.lockBatch(userIds); + } + + /** + * 解锁用户 + */ + public void unlock(Long userId) { + this.checkMerchantUser(userId); + userAdminService.unlock(userId); + } + + /** + * 批量解锁用户 + */ + public void unlockBatch(List userIds) { + this.checkMerchantUser(userIds); + userAdminService.unlockBatch(userIds); + } + + + /** + * 重置密码 + */ + @Transactional(rollbackFor = Exception.class) + public void restartPassword(Long userId, String newPassword) { + this.checkMerchantUser(userId); + userAdminService.restartPassword(userId,newPassword); + } + + /** + * 批量重置密码 + */ + @Transactional(rollbackFor = Exception.class) + public void restartPasswordBatch(List userIds, String newPassword){ + this.checkMerchantUser(userIds); + userAdminService.restartPasswordBatch(userIds,newPassword); + } + + /** + * 编辑用户信息 + */ + public void update(UserInfoParam userInfoParam) { + this.checkMerchantUser(userInfoParam.getId()); + userAdminService.update(userInfoParam); + } + + /** + * 判断是否为商户用户 + */ + private void checkMerchantUser(Long userId){ + if (!merchantUserManager.existedByField(MerchantUser::getUserId, userId)){ + throw new OperationFailException("无法对当前用户进行操作"); + } + } + + /** + * 判断是否为商户用户 + */ + private void checkMerchantUser(List userIds){ + List users = merchantUserManager.findAllByField(MerchantUser::getUserId, userIds); + if (users.size() != userIds.size()){ + throw new OperationFailException("无法对当前用户进行操作"); + } + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/AllocConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/AllocConfigParam.java deleted file mode 100644 index 25d2cd41..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/AllocConfigParam.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.dromara.daxpay.service.param.allocation; - -import cn.bootx.platform.core.validation.ValidationGroup; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 分账配置参数 - * @author xxm - * @since 2024/12/9 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账配置参数") -public class AllocConfigParam { - - /** 主键 */ - @NotNull(message = "主键不可为空", groups = {ValidationGroup.edit.class}) - @Schema(description = "主键") - private Long id; - - /** 是否自动分账 */ - @NotNull(message = "是否自动分账不可为空") - @Schema(description = "是否自动分账") - private Boolean autoAlloc; - - /** 自动完结 */ - @NotNull(message = "自动完结不可为空") - @Schema(description = "自动完结") - private Boolean autoFinish; - - /** 分账起始额 */ - @DecimalMin(value = "0.1", message = "分账起始额不可小于0.1元") - @Schema(description = "分账起始额") - private BigDecimal minAmount; - - /** 分账延迟时长(分钟) */ - @DecimalMin(value = "0", message = "分账延迟时长不能为负数") - @Schema(description = "分账延迟时长(分钟)") - private Integer delayTime; - - /** 应用AppId */ - @NotNull(message = "应用AppId不可为空") - @Schema(description = "应用AppId") - private String appId; - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupBindParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupBindParam.java deleted file mode 100644 index 2a9cb7ee..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupBindParam.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.dromara.daxpay.service.param.allocation.group; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * 分账组绑定参数 - * @author xxm - * @since 2024/4/1 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账组绑定参数") -public class AllocGroupBindParam { - - @NotNull(message = "分账组ID不可为空") - @Schema(description = "分账组ID") - private Long groupId; - - @Valid - @NotEmpty(message = "分账接收方不可为空") - @Schema(description = "分账接收方集合") - private List receivers; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupParam.java deleted file mode 100644 index 01f0d3ef..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupParam.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.dromara.daxpay.service.param.allocation.group; - -import cn.bootx.platform.core.validation.ValidationGroup; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 分账组参数 - * @author xxm - * @since 2024/4/1 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账组参数") -public class AllocGroupParam { - - @NotNull(message = "主键不可为空", groups = {ValidationGroup.edit.class}) - @Schema(description = "主键") - private Long id; - - @NotBlank(message = "分组名称不可为空") - @Schema(description = "分组名称") - private String name; - - @NotBlank(message = "通道不可为空") - @Schema(description = "通道") - private String channel; - - @Schema(description = "备注") - private String remark; - - @NotBlank(message = "商户应用ID不可为空") - @Schema(description = "商户应用ID") - private String appId; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupQuery.java deleted file mode 100644 index 2e3c2a75..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupQuery.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.dromara.daxpay.service.param.allocation.group; - -import org.dromara.daxpay.service.common.param.MchQuery; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 分账组参数 - * @author xxm - * @since 2024/4/1 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "分账组参数") -public class AllocGroupQuery extends MchQuery { - - @Schema(description = "分账组编号") - private String groupNo; - - @Schema(description = "分组名称") - private String name; - - @Schema(description = "通道") - private String channel; - - @Schema(description = "备注") - private String remark; - - @Schema(description = "商户应用ID") - private String appId; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupReceiverParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupReceiverParam.java deleted file mode 100644 index e04d298b..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupReceiverParam.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.dromara.daxpay.service.param.allocation.group; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.DecimalMax; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.Digits; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 分账组接收者参数 - * @author xxm - * @since 2024/4/1 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账组接收者参数") -public class AllocGroupReceiverParam { - - @NotNull(message = "接收者ID不可为空") - @Schema(description = "接收者ID") - private Long receiverId; - - @Schema(description = "分账比例(百分之多少)") - @NotNull(message = "分账比例不可为空") - @DecimalMax(value = "100",message = "分账比例不可大于100%") - @DecimalMin(value = "0", message = "分账比例不可为负数") - @Digits(integer = 3, fraction = 2, message = "分账比例最多只允许两位小数") - private BigDecimal rate; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupUnbindParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupUnbindParam.java deleted file mode 100644 index 0666d910..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/group/AllocGroupUnbindParam.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.dromara.daxpay.service.param.allocation.group; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * 分账组接收者解除绑定 - * @author xxm - * @since 2024/4/1 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账组取消接收者绑定") -public class AllocGroupUnbindParam { - - @NotNull(message = "分账组ID不可为空") - @Schema(description = "分账组ID") - private Long groupId; - - @NotBlank(message = "分账接收方不可为空") - @Schema(description = "分账接收方集合") - List receiverIds; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/receiver/AllocReceiverQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/receiver/AllocReceiverQuery.java deleted file mode 100644 index abf99676..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/allocation/receiver/AllocReceiverQuery.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.dromara.daxpay.service.param.allocation.receiver; - -import cn.bootx.platform.core.annotation.QueryParam; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.common.param.MchQuery; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; - -/** - * 分账接收方查询条件 - * @author xxm - * @since 2024/4/1 - */ -@Getter -@Setter -public class AllocReceiverQuery extends MchQuery { - - @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) - @Schema(description = "接收方编号") - private String receiverNo; - - @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) - @Schema(description = "接收方名称") - private String receiverName; - - /** - * 分账通道 - * @see ChannelEnum - */ - @Schema(description = "分账通道") - private String channel; - - @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) - @Schema(description = "接收方账号") - private String receiverAccount; - - @QueryParam(type = QueryParam.CompareTypeEnum.EQ) - @Schema(description = "接收方类型") - private String receiverType; - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/config/PlatformConfigParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/config/PlatformConfigParam.java deleted file mode 100644 index a8de9fd6..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/config/PlatformConfigParam.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.dromara.daxpay.service.param.config; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.Digits; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 平台配置 - * @author xxm - * @since 2024/9/19 - */ -@Data -@Accessors(chain = true) -@Schema(title = "平台配置") -public class PlatformConfigParam { - - /** 支付网关地址 */ - @Schema(description = "支付网关地址") - private String gatewayServiceUrl; - - /** 网关移动端地址 */ - @Schema(description = "网关移动端地址") - private String gatewayMobileUrl; - - /** 全局单笔限额 */ - @DecimalMin(value = "0.01", message = "支付限额不可小于0.01元") - @Digits(integer = 10, fraction = 2, message = "最多只允许两位小数") - @Schema(description = "全局单笔限额") - private BigDecimal limitAmount; - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/order/allocation/AllocOrderQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/order/allocation/AllocOrderQuery.java deleted file mode 100644 index 0cd5529e..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/order/allocation/AllocOrderQuery.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.dromara.daxpay.service.param.order.allocation; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 分账订单查询参数 - * @author xxm - * @since 2024/4/7 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账订单查询参数") -public class AllocOrderQuery { - - @Schema(description = "分账订单号") - private String orderNo; - - @Schema(description = "支付订单ID") - private Long paymentId; - - @Schema(description = "支付订单标题") - private String title; - - @Schema(description = "分账业务号") - private String allocNo; - - @Schema(description = "分账通道") - private String channel; - - - - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/assist/ChannelTerminalBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/assist/ChannelTerminalBo.java new file mode 100644 index 00000000..74a3650d --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/assist/ChannelTerminalBo.java @@ -0,0 +1,35 @@ +package org.dromara.daxpay.service.pay.bo.assist; + +import org.dromara.daxpay.core.enums.ChannelTerminalStatusEnum; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 通道终端设备报送记录结果 + * @author xxm + * @since 2025/3/10 + */ +@Data +@Accessors(chain = true) +public class ChannelTerminalBo { + + /** + * 通道返回的设备注册号 + */ + private String deviceNo; + + /** + * 是否成功 + */ + private boolean success; + + /** + * 报备状态 + */ + private ChannelTerminalStatusEnum status; + + /** + * 错误提示 + */ + private String errorMsg; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/sync/PaySyncResultBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/sync/PaySyncResultBo.java similarity index 55% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/sync/PaySyncResultBo.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/sync/PaySyncResultBo.java index b155f295..d8fc7f1e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/sync/PaySyncResultBo.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/sync/PaySyncResultBo.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.bo.sync; +package org.dromara.daxpay.service.pay.bo.sync; import org.dromara.daxpay.core.enums.PayStatusEnum; import lombok.Data; @@ -31,6 +31,9 @@ public class PaySyncResultBo { /** 交易金额 */ private BigDecimal amount; + /** 实收金额 */ + private BigDecimal realAmount; + /** 支付完成时间 */ private LocalDateTime finishTime; @@ -42,4 +45,36 @@ public class PaySyncResultBo { /** 错误提示 */ private String syncErrorMsg; + + /** 付款用户ID */ + private String buyerId; + + /** 用户标识 */ + private String userId; + + /** + * 支付产品 + * 三方通道所使用的支付产品或类型 + */ + private String tradeProduct; + + /** + * 交易方式 + */ + private String tradeWay; + + /** + * 银行卡类型 + * 借记卡/贷记卡 + */ + private String bankType; + + /** + * 透传账号 + * 三方通道使用微信/支付宝/银联支付时产生的订单号 + */ + private String transOrderNo; + + /** 参加活动类型 */ + private String promotionType; } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/sync/RefundSyncResultBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/sync/RefundSyncResultBo.java similarity index 95% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/sync/RefundSyncResultBo.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/sync/RefundSyncResultBo.java index 2a7e8eee..fb13dd43 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/sync/RefundSyncResultBo.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/sync/RefundSyncResultBo.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.bo.sync; +package org.dromara.daxpay.service.pay.bo.sync; import org.dromara.daxpay.core.enums.RefundStatusEnum; import lombok.Data; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/sync/TransferSyncResultBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/sync/TransferSyncResultBo.java similarity index 95% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/sync/TransferSyncResultBo.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/sync/TransferSyncResultBo.java index 2d127fba..94e55f49 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/sync/TransferSyncResultBo.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/sync/TransferSyncResultBo.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.bo.sync; +package org.dromara.daxpay.service.pay.bo.sync; import org.dromara.daxpay.core.enums.TransferStatusEnum; import lombok.Data; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/PayResultBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/PayResultBo.java new file mode 100644 index 00000000..bcaac477 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/PayResultBo.java @@ -0,0 +1,68 @@ +package org.dromara.daxpay.service.pay.bo.trade; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 支付结果业务类 + * @author xxm + * @since 2024/7/23 + */ +@Data +@Accessors(chain = true) +public class PayResultBo { + + /** + * 第三方支付网关生成的订单号, 用与将记录关联起来 + * 1. 如付款码支付直接成功时会出现 + * 2. 部分通道创建订单是会直接返回 + */ + private String outOrderNo; + + /** 是否支付完成 */ + private boolean complete; + + /** 实收金额 */ + private BigDecimal realAmount; + + /** 完成时间 */ + private LocalDateTime finishTime; + + /** 支付参数体(通常用于发起支付的参数) */ + private String payBody; + + /** 付款用户ID */ + private String buyerId; + + /** 用户标识 */ + private String userId; + + /** + * 支付产品 + * 三方通道所使用的支付产品或类型 + */ + private String tradeProduct; + + /** + * 交易方式 + */ + private String tradeWay; + + /** + * 银行卡类型 + * 借记卡/贷记卡 + */ + private String bankType; + + /** + * 透传账号 + * 三方通道使用微信/支付宝/银联支付时产生的订单号 + */ + private String transOrderNo; + + /** 参加活动类型 */ + private String promotionType; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/RefundResultBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/RefundResultBo.java similarity index 91% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/RefundResultBo.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/RefundResultBo.java index ce2df1b5..a3067a76 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/RefundResultBo.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/RefundResultBo.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.bo.trade; +package org.dromara.daxpay.service.pay.bo.trade; import org.dromara.daxpay.core.enums.RefundStatusEnum; import lombok.Data; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/TransferResultBo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/TransferResultBo.java similarity index 91% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/TransferResultBo.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/TransferResultBo.java index 9316d37f..96330586 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/bo/trade/TransferResultBo.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/bo/trade/TransferResultBo.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.bo.trade; +package org.dromara.daxpay.service.pay.bo.trade; import org.dromara.daxpay.core.enums.TransferStatusEnum; import lombok.Data; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/anno/PaymentVerify.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/anno/PaymentVerify.java similarity index 92% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/anno/PaymentVerify.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/anno/PaymentVerify.java index 3dae989e..86df26eb 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/anno/PaymentVerify.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/anno/PaymentVerify.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.common.anno; +package org.dromara.daxpay.service.pay.common.anno; import java.lang.annotation.*; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/MchAppBaseEntity.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppBaseEntity.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/MchAppBaseEntity.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppBaseEntity.java index b23ca6be..b544a4c9 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/MchAppBaseEntity.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppBaseEntity.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.common.entity; +package org.dromara.daxpay.service.pay.common.entity; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import com.baomidou.mybatisplus.annotation.FieldFill; @@ -10,14 +10,14 @@ import lombok.experimental.Accessors; import lombok.experimental.FieldNameConstants; /** - *商户基础实体类 + * 商户基础实体类 * @author xxm * @since 2024/6/1 */ @EqualsAndHashCode(callSuper = true) @Data @Accessors(chain = true) -@FieldNameConstants(innerTypeName = "MchApp") +@FieldNameConstants public class MchAppBaseEntity extends MpBaseEntity { /** 商户号 */ diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppEditEntity.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppEditEntity.java new file mode 100644 index 00000000..436ff756 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppEditEntity.java @@ -0,0 +1,26 @@ +package org.dromara.daxpay.service.pay.common.entity; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import lombok.experimental.FieldNameConstants; + +/** + * 商户基础实体类 应用/商户/代理商/服务商号可以更新 + * @author xxm + * @since 2025/7/1 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@FieldNameConstants +public class MchAppEditEntity extends MpBaseEntity { + + /** 商户号 */ + private String mchNo; + + /** 应用号 */ + private String appId; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/MchAppRecordEntity.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppRecordEntity.java similarity index 93% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/MchAppRecordEntity.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppRecordEntity.java index 575c39a5..ca3b1e59 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/entity/MchAppRecordEntity.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/entity/MchAppRecordEntity.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.common.entity; +package org.dromara.daxpay.service.pay.common.entity; import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import com.baomidou.mybatisplus.annotation.FieldFill; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/filter/PaymentContextLocalFilter.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/filter/PaymentContextLocalFilter.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/filter/PaymentContextLocalFilter.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/filter/PaymentContextLocalFilter.java index 0594d4c6..49831fb9 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/filter/PaymentContextLocalFilter.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/filter/PaymentContextLocalFilter.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.common.filter; +package org.dromara.daxpay.service.pay.common.filter; -import org.dromara.daxpay.service.common.local.MchContextLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.merchant.local.MchContextLocal; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/local/PaymentContextLocal.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/local/PaymentContextLocal.java similarity index 77% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/local/PaymentContextLocal.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/local/PaymentContextLocal.java index 8b41b910..eae10e21 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/local/PaymentContextLocal.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/local/PaymentContextLocal.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.common.local; +package org.dromara.daxpay.service.pay.common.local; import org.dromara.daxpay.core.context.PaymentContext; import com.alibaba.ttl.TransmittableThreadLocal; @@ -12,9 +12,9 @@ import java.util.Objects; * @since 2023/12/22 */ @UtilityClass -public final class PaymentContextLocal { +public class PaymentContextLocal { - private static final ThreadLocal THREAD_LOCAL = new TransmittableThreadLocal<>(); + private final ThreadLocal THREAD_LOCAL = new TransmittableThreadLocal<>(); /** * 获取 diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/MchQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/param/MchQuery.java similarity index 55% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/MchQuery.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/param/MchQuery.java index 45ab7b2e..b4449f74 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/common/param/MchQuery.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/common/param/MchQuery.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.service.common.param; +package org.dromara.daxpay.service.pay.common.param; import cn.bootx.platform.common.mybatisplus.query.entity.SortParam; import cn.bootx.platform.core.annotation.QueryParam; import cn.bootx.platform.iam.service.client.ClientCodeService; -import org.dromara.daxpay.service.code.DaxPayCode; +import org.dromara.daxpay.service.common.code.DaxPayCode; import cn.hutool.extra.spring.SpringUtil; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -23,9 +23,22 @@ import java.util.Objects; @Schema(title = "商户查询参数") public class MchQuery extends SortParam { + /** 商户号 */ + @QueryParam(type = QueryParam.CompareTypeEnum.EQ) + @Schema(description = "商户号") + private String mchNo; + /** 应用号 */ @QueryParam(type = QueryParam.CompareTypeEnum.EQ) @Schema(description = "应用号") private String appId; + public String getMchNo() { + // 判断是否管理端, 如果不是管理端将值设置为null, 防止越权 + var clientCodeService = SpringUtil.getBean(ClientCodeService.class); + if (!Objects.equals(clientCodeService.getClientCode(), DaxPayCode.Client.ADMIN)){ + return null; + } + return mchNo; + } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/ApiConstConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/ApiConstConvert.java similarity index 59% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/ApiConstConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/ApiConstConvert.java index 9c408472..38006253 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/ApiConstConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/ApiConstConvert.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.convert.constant; +package org.dromara.daxpay.service.pay.convert.constant; -import org.dromara.daxpay.service.entity.constant.ApiConst; -import org.dromara.daxpay.service.result.constant.ApiConstResult; +import org.dromara.daxpay.service.pay.entity.constant.ApiConst; +import org.dromara.daxpay.service.pay.result.constant.ApiConstResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/ChannelConstConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/ChannelConstConvert.java similarity index 60% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/ChannelConstConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/ChannelConstConvert.java index 408c9b02..55039dea 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/ChannelConstConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/ChannelConstConvert.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.convert.constant; +package org.dromara.daxpay.service.pay.convert.constant; -import org.dromara.daxpay.service.entity.constant.ChannelConst; -import org.dromara.daxpay.service.result.constant.ChannelConstResult; +import org.dromara.daxpay.service.pay.entity.constant.ChannelConst; +import org.dromara.daxpay.service.pay.result.constant.ChannelConstResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/MerchantNotifyConstConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/MerchantNotifyConstConvert.java similarity index 60% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/MerchantNotifyConstConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/MerchantNotifyConstConvert.java index b894961f..0f29fa17 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/MerchantNotifyConstConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/MerchantNotifyConstConvert.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.convert.constant; +package org.dromara.daxpay.service.pay.convert.constant; -import org.dromara.daxpay.service.entity.constant.MerchantNotifyConst; -import org.dromara.daxpay.service.result.constant.MerchantNotifyConstResult; +import org.dromara.daxpay.service.pay.entity.constant.MerchantNotifyConst; +import org.dromara.daxpay.service.pay.result.constant.MerchantNotifyConstResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/MethodConstConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/MethodConstConvert.java similarity index 59% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/MethodConstConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/MethodConstConvert.java index e19f33a3..3551a252 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/constant/MethodConstConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/MethodConstConvert.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.convert.constant; +package org.dromara.daxpay.service.pay.convert.constant; -import org.dromara.daxpay.service.entity.constant.PayMethodConst; -import org.dromara.daxpay.service.result.constant.PayMethodConstResult; +import org.dromara.daxpay.service.pay.entity.constant.PayMethodConst; +import org.dromara.daxpay.service.pay.result.constant.PayMethodConstResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/TerminalConstConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/TerminalConstConvert.java new file mode 100644 index 00000000..978beeb8 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/constant/TerminalConstConvert.java @@ -0,0 +1,18 @@ +package org.dromara.daxpay.service.pay.convert.constant; + +import org.dromara.daxpay.service.pay.entity.constant.TerminalConst; +import org.dromara.daxpay.service.pay.result.constant.TerminalConstResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2025/3/12 + */ +@Mapper +public interface TerminalConstConvert { + TerminalConstConvert CONVERT = Mappers.getMapper(TerminalConstConvert.class); + + TerminalConstResult toResult(TerminalConst channelTerminalTypeConst); +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/notice/MerchantCallbackConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/notice/MerchantCallbackConvert.java similarity index 50% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/notice/MerchantCallbackConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/notice/MerchantCallbackConvert.java index 19f9264c..933a7882 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/notice/MerchantCallbackConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/notice/MerchantCallbackConvert.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.service.convert.notice; +package org.dromara.daxpay.service.pay.convert.notice; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackRecord; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackTask; -import org.dromara.daxpay.service.result.notice.callback.MerchantCallbackRecordResult; -import org.dromara.daxpay.service.result.notice.callback.MerchantCallbackTaskResult; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackRecord; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackTask; +import org.dromara.daxpay.service.pay.result.notice.callback.MerchantCallbackRecordResult; +import org.dromara.daxpay.service.pay.result.notice.callback.MerchantCallbackTaskResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/notice/MerchantNotifyConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/notice/MerchantNotifyConvert.java similarity index 50% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/notice/MerchantNotifyConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/notice/MerchantNotifyConvert.java index 662d1605..075f4afc 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/notice/MerchantNotifyConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/notice/MerchantNotifyConvert.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.service.convert.notice; +package org.dromara.daxpay.service.pay.convert.notice; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyRecord; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyTask; -import org.dromara.daxpay.service.result.notice.notify.MerchantNotifyRecordResult; -import org.dromara.daxpay.service.result.notice.notify.MerchantNotifyTaskResult; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyRecord; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyTask; +import org.dromara.daxpay.service.pay.result.notice.notify.MerchantNotifyRecordResult; +import org.dromara.daxpay.service.pay.result.notice.notify.MerchantNotifyTaskResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/order/pay/PayOrderConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/order/pay/PayOrderConvert.java similarity index 50% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/order/pay/PayOrderConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/order/pay/PayOrderConvert.java index 4491262f..0509b20c 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/order/pay/PayOrderConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/order/pay/PayOrderConvert.java @@ -1,8 +1,10 @@ -package org.dromara.daxpay.service.convert.order.pay; +package org.dromara.daxpay.service.pay.convert.order.pay; import org.dromara.daxpay.core.result.trade.pay.PayOrderResult; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.result.order.pay.PayOrderVo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrderExpand; +import org.dromara.daxpay.service.pay.result.order.pay.PayOrderExpandResult; +import org.dromara.daxpay.service.pay.result.order.pay.PayOrderVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -18,4 +20,6 @@ public interface PayOrderConvert { PayOrderVo toVo(PayOrder payOrder); PayOrderResult toResult(PayOrder payOrder); + + PayOrderExpandResult toResult(PayOrderExpand payOrder); } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/order/refund/RefundOrderConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/order/refund/RefundOrderConvert.java similarity index 66% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/order/refund/RefundOrderConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/order/refund/RefundOrderConvert.java index bc4c291f..355ce7b8 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/order/refund/RefundOrderConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/order/refund/RefundOrderConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.convert.order.refund; +package org.dromara.daxpay.service.pay.convert.order.refund; import org.dromara.daxpay.core.result.trade.refund.RefundOrderResult; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.result.order.refund.RefundOrderVo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.result.order.refund.RefundOrderVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/order/transfer/TransferOrderConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/order/transfer/TransferOrderConvert.java similarity index 66% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/order/transfer/TransferOrderConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/order/transfer/TransferOrderConvert.java index 548c8f0c..d887be2a 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/order/transfer/TransferOrderConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/order/transfer/TransferOrderConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.convert.order.transfer; +package org.dromara.daxpay.service.pay.convert.order.transfer; import org.dromara.daxpay.core.result.trade.transfer.TransferOrderResult; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.result.order.transfer.TransferOrderVo; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.result.order.transfer.TransferOrderVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/PayCloseRecordConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/PayCloseRecordConvert.java similarity index 61% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/PayCloseRecordConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/PayCloseRecordConvert.java index 69a147d1..ee0738d0 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/PayCloseRecordConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/PayCloseRecordConvert.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.convert.record; +package org.dromara.daxpay.service.pay.convert.record; -import org.dromara.daxpay.service.entity.record.close.PayCloseRecord; -import org.dromara.daxpay.service.result.record.close.PayCloseRecordResult; +import org.dromara.daxpay.service.pay.entity.record.close.PayCloseRecord; +import org.dromara.daxpay.service.pay.result.record.close.PayCloseRecordResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/TradeCallbackRecordConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/TradeCallbackRecordConvert.java similarity index 60% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/TradeCallbackRecordConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/TradeCallbackRecordConvert.java index 8fa01fdf..a0059169 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/TradeCallbackRecordConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/TradeCallbackRecordConvert.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.convert.record; +package org.dromara.daxpay.service.pay.convert.record; -import org.dromara.daxpay.service.entity.record.callback.TradeCallbackRecord; -import org.dromara.daxpay.service.result.record.callback.TradeCallbackRecordResult; +import org.dromara.daxpay.service.pay.entity.record.callback.TradeCallbackRecord; +import org.dromara.daxpay.service.pay.result.record.callback.TradeCallbackRecordResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/TradeFlowRecordConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/TradeFlowRecordConvert.java similarity index 59% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/TradeFlowRecordConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/TradeFlowRecordConvert.java index 74811db4..76c80a01 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/TradeFlowRecordConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/TradeFlowRecordConvert.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.convert.record; +package org.dromara.daxpay.service.pay.convert.record; -import org.dromara.daxpay.service.entity.record.flow.TradeFlowRecord; -import org.dromara.daxpay.service.result.record.flow.TradeFlowRecordResult; +import org.dromara.daxpay.service.pay.entity.record.flow.TradeFlowRecord; +import org.dromara.daxpay.service.pay.result.record.flow.TradeFlowRecordResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/TradeSyncRecordConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/TradeSyncRecordConvert.java similarity index 61% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/TradeSyncRecordConvert.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/TradeSyncRecordConvert.java index 026937b7..3767926a 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/record/TradeSyncRecordConvert.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/convert/record/TradeSyncRecordConvert.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.convert.record; +package org.dromara.daxpay.service.pay.convert.record; -import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; -import org.dromara.daxpay.service.result.record.sync.TradeSyncRecordResult; +import org.dromara.daxpay.service.pay.entity.record.sync.TradeSyncRecord; +import org.dromara.daxpay.service.pay.result.record.sync.TradeSyncRecordResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ApiConstManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ApiConstManager.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ApiConstManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ApiConstManager.java index a1bf946d..68350bee 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ApiConstManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ApiConstManager.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.dao.constant; +package org.dromara.daxpay.service.pay.dao.constant; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.constant.ApiConst; -import org.dromara.daxpay.service.param.constant.ApiConstQuery; +import org.dromara.daxpay.service.pay.entity.constant.ApiConst; +import org.dromara.daxpay.service.pay.param.constant.ApiConstQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ApiConstMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ApiConstMapper.java similarity index 64% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ApiConstMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ApiConstMapper.java index 5bd97678..61247037 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ApiConstMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ApiConstMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.constant; +package org.dromara.daxpay.service.pay.dao.constant; -import org.dromara.daxpay.service.entity.constant.ApiConst; +import org.dromara.daxpay.service.pay.entity.constant.ApiConst; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ChannelConstManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ChannelConstManager.java similarity index 81% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ChannelConstManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ChannelConstManager.java index 61808c18..4567e17a 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ChannelConstManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ChannelConstManager.java @@ -5,13 +5,12 @@ import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; +import org.dromara.daxpay.service.pay.entity.constant.ChannelConst; +import org.dromara.daxpay.service.pay.param.constant.ChannelConstQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.service.dao.constant.ChannelConstMapper; -import org.dromara.daxpay.service.entity.constant.ChannelConst; -import org.dromara.daxpay.service.param.constant.ChannelConstQuery; import org.springframework.stereotype.Repository; import java.util.List; @@ -68,4 +67,15 @@ public class ChannelConstManager extends BaseManager findAllByApplyAndEnable() { + return lambdaQuery() + .eq(ChannelConst::isEnable, true) + .eq(ChannelConst::isApply, true) + .orderByAsc(MpIdEntity::getId) + .list(); + } + } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ChannelConstMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ChannelConstMapper.java similarity index 65% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ChannelConstMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ChannelConstMapper.java index 55b4b991..752f12a8 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/ChannelConstMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/ChannelConstMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.constant; +package org.dromara.daxpay.service.pay.dao.constant; -import org.dromara.daxpay.service.entity.constant.ChannelConst; +import org.dromara.daxpay.service.pay.entity.constant.ChannelConst; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MerchantNotifyConstManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MerchantNotifyConstManager.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MerchantNotifyConstManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MerchantNotifyConstManager.java index c03ebe9c..66229faf 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MerchantNotifyConstManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MerchantNotifyConstManager.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.dao.constant; +package org.dromara.daxpay.service.pay.dao.constant; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.constant.MerchantNotifyConst; -import org.dromara.daxpay.service.param.constant.MerchantNotifyConstQuery; +import org.dromara.daxpay.service.pay.entity.constant.MerchantNotifyConst; +import org.dromara.daxpay.service.pay.param.constant.MerchantNotifyConstQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MerchantNotifyConstMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MerchantNotifyConstMapper.java similarity index 65% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MerchantNotifyConstMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MerchantNotifyConstMapper.java index e21f8e7f..587c5414 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MerchantNotifyConstMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MerchantNotifyConstMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.constant; +package org.dromara.daxpay.service.pay.dao.constant; -import org.dromara.daxpay.service.entity.constant.MerchantNotifyConst; +import org.dromara.daxpay.service.pay.entity.constant.MerchantNotifyConst; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MethodConstManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MethodConstManager.java similarity index 82% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MethodConstManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MethodConstManager.java index 85eb572a..456d7e65 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MethodConstManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MethodConstManager.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.dao.constant; +package org.dromara.daxpay.service.pay.dao.constant; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.constant.PayMethodConst; -import org.dromara.daxpay.service.param.constant.MethodConstQuery; +import org.dromara.daxpay.service.pay.entity.constant.PayMethodConst; +import org.dromara.daxpay.service.pay.param.constant.MethodConstQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -13,7 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; /** - * + * 支付方式常量 * @author xxm * @since 2024/6/26 */ diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MethodConstMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MethodConstMapper.java similarity index 66% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MethodConstMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MethodConstMapper.java index f516823b..65cfdbc1 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/constant/MethodConstMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/MethodConstMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.constant; +package org.dromara.daxpay.service.pay.dao.constant; -import org.dromara.daxpay.service.entity.constant.PayMethodConst; +import org.dromara.daxpay.service.pay.entity.constant.PayMethodConst; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/TerminalConstManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/TerminalConstManager.java new file mode 100644 index 00000000..cb266a03 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/TerminalConstManager.java @@ -0,0 +1,58 @@ +package org.dromara.daxpay.service.pay.dao.constant; + +import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.rest.param.PageParam; +import org.dromara.daxpay.service.pay.entity.constant.TerminalConst; +import org.dromara.daxpay.service.pay.param.constant.TerminalConstQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 通道终端报送类型 + * @author xxm + * @since 2025/3/12 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class TerminalConstManager extends BaseManager { + + /** + * 分页 + */ + public Page page(PageParam pageParam, TerminalConstQuery query) { + Page mpPage = MpUtil.getMpPage(pageParam); + QueryWrapper wrapper = QueryGenerator.generator(query); + wrapper.orderByAsc(MpIdEntity.Id.id); + return this.page(mpPage, wrapper); + } + + /** + * 查询启用的类型 + */ + public List findAllEnable() { + return lambdaQuery() + .eq(TerminalConst::isEnable, true) + .orderByAsc(MpIdEntity::getId) + .list(); + } + + /** + * 根据通道查询启用的类型 + */ + public List findAllByChannel(String channel) { + return lambdaQuery() + .eq(TerminalConst::getChannel, channel) + .orderByAsc(MpIdEntity::getId) + .list(); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/TerminalConstMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/TerminalConstMapper.java new file mode 100644 index 00000000..3afddaf6 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/constant/TerminalConstMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.pay.dao.constant; + +import org.dromara.daxpay.service.pay.entity.constant.TerminalConst; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 通道终端报送类型 + * @author xxm + * @since 2025/3/12 + */ +@Mapper +public interface TerminalConstMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackRecordManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackRecordManager.java similarity index 85% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackRecordManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackRecordManager.java index de5b8d90..70e8f9e5 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackRecordManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackRecordManager.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.service.dao.notice.callback; +package org.dromara.daxpay.service.pay.dao.notice.callback; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackRecord; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackRecord; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackRecordMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackRecordMapper.java similarity index 62% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackRecordMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackRecordMapper.java index 56bc529d..26e1f2a4 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackRecordMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackRecordMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.notice.callback; +package org.dromara.daxpay.service.pay.dao.notice.callback; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackRecord; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackRecord; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackTaskManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackTaskManager.java similarity index 85% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackTaskManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackTaskManager.java index 9ce8ff16..93af8a40 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackTaskManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackTaskManager.java @@ -1,12 +1,12 @@ -package org.dromara.daxpay.service.dao.notice.callback; +package org.dromara.daxpay.service.pay.dao.notice.callback; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.annotation.IgnoreTenant; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackTask; -import org.dromara.daxpay.service.param.notice.callback.MerchantCallbackTaskQuery; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackTask; +import org.dromara.daxpay.service.pay.param.notice.callback.MerchantCallbackTaskQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackTaskMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackTaskMapper.java similarity index 62% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackTaskMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackTaskMapper.java index bfa7d760..a5ddb81e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/callback/MerchantCallbackTaskMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/callback/MerchantCallbackTaskMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.notice.callback; +package org.dromara.daxpay.service.pay.dao.notice.callback; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackTask; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackTask; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyRecordManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyRecordManager.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyRecordManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyRecordManager.java index 161b25df..55f1251e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyRecordManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyRecordManager.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.service.dao.notice.notify; +package org.dromara.daxpay.service.pay.dao.notice.notify; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyRecord; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyRecord; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyRecordMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyRecordMapper.java similarity index 63% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyRecordMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyRecordMapper.java index d9049b30..4399636f 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyRecordMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyRecordMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.notice.notify; +package org.dromara.daxpay.service.pay.dao.notice.notify; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyRecord; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyRecord; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyTaskManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyTaskManager.java similarity index 85% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyTaskManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyTaskManager.java index 17bd9233..e2450813 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyTaskManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyTaskManager.java @@ -1,12 +1,12 @@ -package org.dromara.daxpay.service.dao.notice.notify; +package org.dromara.daxpay.service.pay.dao.notice.notify; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.annotation.IgnoreTenant; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyTask; -import org.dromara.daxpay.service.param.notice.notify.MerchantNotifyTaskQuery; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyTask; +import org.dromara.daxpay.service.pay.param.notice.notify.MerchantNotifyTaskQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyTaskMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyTaskMapper.java similarity index 63% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyTaskMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyTaskMapper.java index 5403f5d5..1c7432a9 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/notice/notify/MerchantNotifyTaskMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/notice/notify/MerchantNotifyTaskMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.notice.notify; +package org.dromara.daxpay.service.pay.dao.notice.notify; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyTask; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyTask; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderExpandManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderExpandManager.java new file mode 100644 index 00000000..266567e7 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderExpandManager.java @@ -0,0 +1,19 @@ +package org.dromara.daxpay.service.pay.dao.order.pay; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrderExpand; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * 支付订单扩展信息 + * @author xxm + * @since 2025/6/16 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class PayOrderExpandManager extends BaseManager { + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderExpandMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderExpandMapper.java new file mode 100644 index 00000000..32319c4d --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderExpandMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.pay.dao.order.pay; + +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrderExpand; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单扩展表 + * @author xxm + * @since 2025/6/16 + */ +@Mapper +public interface PayOrderExpandMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/pay/PayOrderManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderManager.java similarity index 80% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/pay/PayOrderManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderManager.java index c56e9e83..dfdd1031 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/pay/PayOrderManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderManager.java @@ -1,14 +1,15 @@ -package org.dromara.daxpay.service.dao.order.pay; +package org.dromara.daxpay.service.pay.dao.order.pay; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.annotation.IgnoreTenant; +import cn.bootx.platform.core.exception.DangerSqlException; import cn.bootx.platform.core.rest.param.PageParam; import org.dromara.daxpay.core.enums.PayAllocStatusEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.param.order.pay.PayOrderQuery; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.param.order.pay.PayOrderQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -116,6 +117,17 @@ public class PayOrderManager extends BaseManager { .list(); } + /** + * 查询指定时间的的未支付订单 + */ + @IgnoreTenant + public List queryExpiredOrderNotTenant(LocalDateTime start, LocalDateTime end) { + return lambdaQuery() + .in(PayOrder::getStatus, PayStatusEnum.PROGRESS.getCode(),PayStatusEnum.WAIT.getCode()) + .between(PayOrder::getExpiredTime, start,end) + .list(); + } + /** * 查询订单, 不过滤租户 */ @@ -124,5 +136,15 @@ public class PayOrderManager extends BaseManager { return this.findById(id); } - + /** + * 根据id进行更新 + */ + @Override + public int updateById(PayOrder payOrder) { + int i = super.updateById(payOrder); + if (i<1){ + throw new DangerSqlException("更新支付订单失败"); + } + return i; + } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/pay/PayOrderMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderMapper.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/pay/PayOrderMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderMapper.java index 6178671f..5a7cc800 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/pay/PayOrderMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/pay/PayOrderMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.order.pay; +package org.dromara.daxpay.service.pay.dao.order.pay; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.github.yulichang.base.MPJBaseMapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/refund/RefundOrderManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/refund/RefundOrderManager.java similarity index 69% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/refund/RefundOrderManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/refund/RefundOrderManager.java index 947805d5..60e03a77 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/refund/RefundOrderManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/refund/RefundOrderManager.java @@ -1,14 +1,15 @@ -package org.dromara.daxpay.service.dao.order.refund; +package org.dromara.daxpay.service.pay.dao.order.refund; import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.annotation.IgnoreTenant; +import cn.bootx.platform.core.exception.DangerSqlException; import cn.bootx.platform.core.rest.param.PageParam; import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.param.order.refund.RefundOrderQuery; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.param.order.refund.RefundOrderQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -64,14 +65,24 @@ public class RefundOrderManager extends BaseManager findAllByProgress() { + public List findAllByBeforeProgress(LocalDateTime dateTime) { LocalDateTime now = LocalDateTime.now(); return lambdaQuery() .eq(RefundOrder::getStatus, RefundStatusEnum.PROGRESS.getCode()) - .le(MpCreateEntity::getCreateTime, now.plusMinutes(-1L)) + .le(MpCreateEntity::getCreateTime, dateTime) + .list(); + } + /** + * 查询指定时间的退款中的订单 + */ + @IgnoreTenant + public List findAllByProgress(LocalDateTime startTime, LocalDateTime endTime) { + return lambdaQuery() + .eq(RefundOrder::getStatus, RefundStatusEnum.PROGRESS.getCode()) + .between(MpCreateEntity::getCreateTime, startTime, endTime) .list(); } @@ -84,11 +95,24 @@ public class RefundOrderManager extends BaseManager findByIdNotTenant(Long id) { return findById(id); } + + /** + * 根据id进行更新 + * + */ + @Override + public int updateById(RefundOrder refundOrder) { + int i = super.updateById(refundOrder); + if (i<1){ + throw new DangerSqlException("更新退款订单失败"); + } + return i; + } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/refund/RefundOrderMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/refund/RefundOrderMapper.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/refund/RefundOrderMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/refund/RefundOrderMapper.java index ed860102..78888c51 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/refund/RefundOrderMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/refund/RefundOrderMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.order.refund; +package org.dromara.daxpay.service.pay.dao.order.refund; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.github.yulichang.base.MPJBaseMapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/transfer/TransferOrderManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/transfer/TransferOrderManager.java similarity index 92% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/transfer/TransferOrderManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/transfer/TransferOrderManager.java index 19cd4e28..4cc5676f 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/transfer/TransferOrderManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/transfer/TransferOrderManager.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.dao.order.transfer; +package org.dromara.daxpay.service.pay.dao.order.transfer; import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; @@ -7,8 +7,8 @@ import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.annotation.IgnoreTenant; import cn.bootx.platform.core.rest.param.PageParam; import org.dromara.daxpay.core.enums.TransferStatusEnum; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.param.order.transfer.TransferOrderQuery; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.param.order.transfer.TransferOrderQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/transfer/TransferOrderMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/transfer/TransferOrderMapper.java similarity index 76% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/transfer/TransferOrderMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/transfer/TransferOrderMapper.java index ee0cb1ac..0f6c6af7 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/order/transfer/TransferOrderMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/order/transfer/TransferOrderMapper.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.dao.order.transfer; +package org.dromara.daxpay.service.pay.dao.order.transfer; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.param.order.transfer.TransferOrderQuery; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.param.order.transfer.TransferOrderQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.github.yulichang.base.MPJBaseMapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/callback/TradeCallbackRecordManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/callback/TradeCallbackRecordManager.java similarity index 82% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/callback/TradeCallbackRecordManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/callback/TradeCallbackRecordManager.java index 2647ac88..b175b14d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/callback/TradeCallbackRecordManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/callback/TradeCallbackRecordManager.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.dao.record.callback; +package org.dromara.daxpay.service.pay.dao.record.callback; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.record.callback.TradeCallbackRecord; -import org.dromara.daxpay.service.param.record.TradeCallbackRecordQuery; +import org.dromara.daxpay.service.pay.entity.record.callback.TradeCallbackRecord; +import org.dromara.daxpay.service.pay.param.record.TradeCallbackRecordQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/callback/TradeCallbackRecordMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/callback/TradeCallbackRecordMapper.java similarity index 62% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/callback/TradeCallbackRecordMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/callback/TradeCallbackRecordMapper.java index 6471b656..cb84c34d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/callback/TradeCallbackRecordMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/callback/TradeCallbackRecordMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.record.callback; +package org.dromara.daxpay.service.pay.dao.record.callback; -import org.dromara.daxpay.service.entity.record.callback.TradeCallbackRecord; +import org.dromara.daxpay.service.pay.entity.record.callback.TradeCallbackRecord; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/close/PayCloseRecordManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/close/PayCloseRecordManager.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/close/PayCloseRecordManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/close/PayCloseRecordManager.java index ac8ea1ec..3fc67e2e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/close/PayCloseRecordManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/close/PayCloseRecordManager.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.dao.record.close; +package org.dromara.daxpay.service.pay.dao.record.close; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.record.close.PayCloseRecord; -import org.dromara.daxpay.service.param.record.PayCloseRecordQuery; +import org.dromara.daxpay.service.pay.entity.record.close.PayCloseRecord; +import org.dromara.daxpay.service.pay.param.record.PayCloseRecordQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/close/PayCloseRecordMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/close/PayCloseRecordMapper.java similarity index 63% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/close/PayCloseRecordMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/close/PayCloseRecordMapper.java index 3e855715..3fc5320b 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/close/PayCloseRecordMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/close/PayCloseRecordMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.record.close; +package org.dromara.daxpay.service.pay.dao.record.close; -import org.dromara.daxpay.service.entity.record.close.PayCloseRecord; +import org.dromara.daxpay.service.pay.entity.record.close.PayCloseRecord; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/flow/TradeFlowRecordManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/flow/TradeFlowRecordManager.java similarity index 88% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/flow/TradeFlowRecordManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/flow/TradeFlowRecordManager.java index 05c8d5bd..1c9f3b9e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/flow/TradeFlowRecordManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/flow/TradeFlowRecordManager.java @@ -1,12 +1,12 @@ -package org.dromara.daxpay.service.dao.record.flow; +package org.dromara.daxpay.service.pay.dao.record.flow; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.service.entity.record.flow.TradeFlowRecord; -import org.dromara.daxpay.service.param.record.TradeFlowRecordQuery; +import org.dromara.daxpay.service.pay.entity.record.flow.TradeFlowRecord; +import org.dromara.daxpay.service.pay.param.record.TradeFlowRecordQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/flow/TradeFlowRecordMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/flow/TradeFlowRecordMapper.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/flow/TradeFlowRecordMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/flow/TradeFlowRecordMapper.java index 80675ea1..0c4c84d3 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/flow/TradeFlowRecordMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/flow/TradeFlowRecordMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.record.flow; +package org.dromara.daxpay.service.pay.dao.record.flow; -import org.dromara.daxpay.service.entity.record.flow.TradeFlowRecord; +import org.dromara.daxpay.service.pay.entity.record.flow.TradeFlowRecord; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.github.yulichang.base.MPJBaseMapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/sync/TradeSyncRecordManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/sync/TradeSyncRecordManager.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/sync/TradeSyncRecordManager.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/sync/TradeSyncRecordManager.java index 09a7ac8b..40cef54f 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/sync/TradeSyncRecordManager.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/sync/TradeSyncRecordManager.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.dao.record.sync; +package org.dromara.daxpay.service.pay.dao.record.sync; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; -import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; -import org.dromara.daxpay.service.param.record.TradeSyncRecordQuery; +import org.dromara.daxpay.service.pay.entity.record.sync.TradeSyncRecord; +import org.dromara.daxpay.service.pay.param.record.TradeSyncRecordQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/sync/TradeSyncRecordMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/sync/TradeSyncRecordMapper.java similarity index 65% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/sync/TradeSyncRecordMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/sync/TradeSyncRecordMapper.java index fba8b769..8aa7d4e2 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/record/sync/TradeSyncRecordMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/record/sync/TradeSyncRecordMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.service.dao.record.sync; +package org.dromara.daxpay.service.pay.dao.record.sync; -import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; +import org.dromara.daxpay.service.pay.entity.record.sync.TradeSyncRecord; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/report/IndexMerchantReportMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/report/IndexMerchantReportMapper.java similarity index 77% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/report/IndexMerchantReportMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/report/IndexMerchantReportMapper.java index b193a655..2040811c 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/report/IndexMerchantReportMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/report/IndexMerchantReportMapper.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.dao.report; +package org.dromara.daxpay.service.pay.dao.report; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/report/IndexTradeReportMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/report/IndexTradeReportMapper.java similarity index 70% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/report/IndexTradeReportMapper.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/report/IndexTradeReportMapper.java index 08921659..c44a44ba 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/report/IndexTradeReportMapper.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/dao/report/IndexTradeReportMapper.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.dao.report; +package org.dromara.daxpay.service.pay.dao.report; -import org.dromara.daxpay.service.param.report.TradeReportQuery; -import org.dromara.daxpay.service.result.report.TradeReportResult; +import org.dromara.daxpay.service.pay.param.report.TradeReportQuery; +import org.dromara.daxpay.service.pay.result.report.TradeReportResult; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Mapper; @@ -47,7 +47,7 @@ public interface IndexTradeReportMapper { TradeReportResult refundTradeReport(@Param(Constants.WRAPPER) QueryWrapper param); /** - * 支付通道 + * 支付通道分布 */ @Select(""" select @@ -62,7 +62,7 @@ public interface IndexTradeReportMapper { List payChannelReport(@Param(Constants.WRAPPER) QueryWrapper param); /** - * 退款通道 + * 退款通道分布 */ @Select(""" select @@ -91,6 +91,30 @@ public interface IndexTradeReportMapper { """) List payMethodReport(@Param(Constants.WRAPPER) QueryWrapper param); + /** + * 支付统计 + */ + @Select(""" + select + ${dateField} as time, + sum(amount) as tradeAmount, + count(amount) as tradeCount + from pay_order + ${ew.customSqlSegment} + """) + List payTradeStatistics(@Param(Constants.WRAPPER) QueryWrapper param, @Param("dateField") String dateField); + /** + * 退款统计 + */ + @Select(""" + select + ${dateField} as time, + sum(amount) as tradeAmount, + count(amount) as tradeCount + from pay_refund_order + ${ew.customSqlSegment} + """) + List refundTradeStatistics(@Param(Constants.WRAPPER) QueryWrapper param, @Param("dateField") String dateField); } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/ChannelConfig.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/config/ChannelConfig.java similarity index 79% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/ChannelConfig.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/config/ChannelConfig.java index e210ccb7..263d2342 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/config/ChannelConfig.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/config/ChannelConfig.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.entity.config; +package org.dromara.daxpay.service.pay.entity.config; import cn.bootx.platform.common.mybatisplus.function.ToResult; import cn.bootx.platform.core.annotation.BigField; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.config.ChannelConfigConvert; -import org.dromara.daxpay.service.result.config.ChannelConfigResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.merchant.convert.config.ChannelConfigConvert; +import org.dromara.daxpay.service.merchant.result.config.ChannelConfigResult; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/constant/ApiConst.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/constant/ApiConst.java similarity index 81% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/constant/ApiConst.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/constant/ApiConst.java index 262341ad..9132022d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/constant/ApiConst.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/constant/ApiConst.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.service.entity.constant; +package org.dromara.daxpay.service.pay.entity.constant; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.convert.constant.ApiConstConvert; -import org.dromara.daxpay.service.result.constant.ApiConstResult; +import org.dromara.daxpay.service.pay.convert.constant.ApiConstConvert; +import org.dromara.daxpay.service.pay.result.constant.ApiConstResult; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/constant/ChannelConst.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/constant/ChannelConst.java similarity index 75% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/constant/ChannelConst.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/constant/ChannelConst.java index 5412bcf1..e0795fd5 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/constant/ChannelConst.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/constant/ChannelConst.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.service.entity.constant; +package org.dromara.daxpay.service.pay.entity.constant; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.convert.constant.ChannelConstConvert; -import org.dromara.daxpay.service.result.constant.ChannelConstResult; +import org.dromara.daxpay.service.pay.convert.constant.ChannelConstConvert; +import org.dromara.daxpay.service.pay.result.constant.ChannelConstResult; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -35,8 +35,11 @@ public class ChannelConst extends MpIdEntity implements ToResult { + + /** 所属通道 */ + private String channel; + + /** + * 终端报送类型 + * @see TerminalTypeEnum + */ + private String type; + + /** 终端报送名称 */ + private String name; + + /** 是否启用 */ + private boolean enable; + + /** 备注 */ + private String remark; + + /** + * 转换 + */ + @Override + public TerminalConstResult toResult() { + return TerminalConstConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/callback/MerchantCallbackRecord.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/callback/MerchantCallbackRecord.java similarity index 74% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/callback/MerchantCallbackRecord.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/callback/MerchantCallbackRecord.java index 7f9d0e97..002f98a7 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/callback/MerchantCallbackRecord.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/callback/MerchantCallbackRecord.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.service.entity.notice.callback; +package org.dromara.daxpay.service.pay.entity.notice.callback; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.common.entity.MchAppRecordEntity; -import org.dromara.daxpay.service.convert.notice.MerchantCallbackConvert; -import org.dromara.daxpay.service.enums.NoticeSendTypeEnum; -import org.dromara.daxpay.service.result.notice.callback.MerchantCallbackRecordResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppRecordEntity; +import org.dromara.daxpay.service.pay.convert.notice.MerchantCallbackConvert; +import org.dromara.daxpay.service.pay.enums.NoticeSendTypeEnum; +import org.dromara.daxpay.service.pay.result.notice.callback.MerchantCallbackRecordResult; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/callback/MerchantCallbackTask.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/callback/MerchantCallbackTask.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/callback/MerchantCallbackTask.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/callback/MerchantCallbackTask.java index bf2d1f9e..8333926b 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/callback/MerchantCallbackTask.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/callback/MerchantCallbackTask.java @@ -1,13 +1,13 @@ -package org.dromara.daxpay.service.entity.notice.callback; +package org.dromara.daxpay.service.pay.entity.notice.callback; import cn.bootx.platform.common.mybatisplus.function.ToResult; import org.dromara.daxpay.core.enums.TradeTypeEnum; import org.dromara.daxpay.core.result.trade.pay.PayOrderResult; import org.dromara.daxpay.core.result.trade.refund.RefundOrderResult; import org.dromara.daxpay.core.result.trade.transfer.TransferOrderResult; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.notice.MerchantCallbackConvert; -import org.dromara.daxpay.service.result.notice.callback.MerchantCallbackTaskResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.pay.convert.notice.MerchantCallbackConvert; +import org.dromara.daxpay.service.pay.result.notice.callback.MerchantCallbackTaskResult; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/notify/MerchantNotifyRecord.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/notify/MerchantNotifyRecord.java similarity index 74% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/notify/MerchantNotifyRecord.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/notify/MerchantNotifyRecord.java index f1ca497b..e7b2bc7b 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/notify/MerchantNotifyRecord.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/notify/MerchantNotifyRecord.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.service.entity.notice.notify; +package org.dromara.daxpay.service.pay.entity.notice.notify; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.common.entity.MchAppRecordEntity; -import org.dromara.daxpay.service.convert.notice.MerchantNotifyConvert; -import org.dromara.daxpay.service.enums.NoticeSendTypeEnum; -import org.dromara.daxpay.service.result.notice.notify.MerchantNotifyRecordResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppRecordEntity; +import org.dromara.daxpay.service.pay.convert.notice.MerchantNotifyConvert; +import org.dromara.daxpay.service.pay.enums.NoticeSendTypeEnum; +import org.dromara.daxpay.service.pay.result.notice.notify.MerchantNotifyRecordResult; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/notify/MerchantNotifyTask.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/notify/MerchantNotifyTask.java similarity index 80% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/notify/MerchantNotifyTask.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/notify/MerchantNotifyTask.java index 0e86db5d..f39bce1a 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/notice/notify/MerchantNotifyTask.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/notice/notify/MerchantNotifyTask.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.service.entity.notice.notify; +package org.dromara.daxpay.service.pay.entity.notice.notify; import cn.bootx.platform.common.mybatisplus.function.ToResult; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.notice.MerchantNotifyConvert; -import org.dromara.daxpay.service.enums.NotifyContentTypeEnum; -import org.dromara.daxpay.service.result.notice.notify.MerchantNotifyTaskResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.pay.convert.notice.MerchantNotifyConvert; +import org.dromara.daxpay.service.pay.enums.NotifyContentTypeEnum; +import org.dromara.daxpay.service.pay.result.notice.notify.MerchantNotifyTaskResult; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/order/pay/PayOrder.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/pay/PayOrder.java similarity index 88% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/order/pay/PayOrder.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/pay/PayOrder.java index fbc9e729..64535289 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/order/pay/PayOrder.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/pay/PayOrder.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.service.entity.order.pay; +package org.dromara.daxpay.service.pay.entity.order.pay; import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.pay.convert.order.pay.PayOrderConvert; +import org.dromara.daxpay.service.pay.result.order.pay.PayOrderVo; import org.dromara.daxpay.core.enums.*; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.order.pay.PayOrderConvert; -import org.dromara.daxpay.service.result.order.pay.PayOrderVo; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; @@ -78,6 +78,9 @@ public class PayOrder extends MchAppBaseEntity implements ToResult { /** 可退金额(元) */ private BigDecimal refundableBalance; + /** 实收金额 */ + private BigDecimal realAmount; + /** * 支付状态 * @see PayStatusEnum @@ -96,6 +99,12 @@ public class PayOrder extends MchAppBaseEntity implements ToResult { */ private String allocStatus; + /** + * 结算状态 + * @see SettleStatusEnum + */ + private String settleStatus; + /** 过期时间 */ private LocalDateTime expiredTime; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/pay/PayOrderExpand.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/pay/PayOrderExpand.java new file mode 100644 index 00000000..c87674ce --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/pay/PayOrderExpand.java @@ -0,0 +1,65 @@ +package org.dromara.daxpay.service.pay.entity.order.pay; + +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.pay.convert.order.pay.PayOrderConvert; +import org.dromara.daxpay.service.pay.result.order.pay.PayOrderExpandResult; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 支付订单扩展存储参数 + * @author xxm + * @since 2025/6/16 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName(value = "pay_order_expand",autoResultMap = true) +public class PayOrderExpand extends MchAppBaseEntity implements ToResult{ + + /** 付款用户ID */ + private String buyerId; + + /** 用户标识 */ + private String userId; + + /** + * 支付产品 + * 三方通道所使用的支付产品或类型 + */ + private String tradeProduct; + + /** + * 交易方式 + */ + private String tradeWay; + + /** + * 银行卡类型 + * 借记卡/贷记卡 + */ + private String bankType; + + /** + * 透传订单号 + * 三方通道使用微信/支付宝/银联支付时产生的订单号 + */ + private String transOrderNo; + + /** 参加活动类型 */ + private String promotionType; + + /** 扩展参数存储字段 */ + private String ext; + + /** + * 转换 + */ + @Override + public PayOrderExpandResult toResult() { + return PayOrderConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/order/refund/RefundOrder.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/refund/RefundOrder.java similarity index 86% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/order/refund/RefundOrder.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/refund/RefundOrder.java index bbb181ee..e04b4a74 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/order/refund/RefundOrder.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/entity/order/refund/RefundOrder.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.entity.order.refund; +package org.dromara.daxpay.service.pay.entity.order.refund; import cn.bootx.platform.common.mybatisplus.function.ToResult; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.order.refund.RefundOrderConvert; -import org.dromara.daxpay.service.result.order.refund.RefundOrderVo; +import org.dromara.daxpay.service.pay.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.pay.convert.order.refund.RefundOrderConvert; +import org.dromara.daxpay.service.pay.result.order.refund.RefundOrderVo; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @@ -39,7 +39,7 @@ public class RefundOrder extends MchAppBaseEntity implements ToResult payMethodList(String channel){ + var basicStrategy = PaymentStrategyFactory.create(channel, AbsChannelBasicStrategy.class); + return basicStrategy.payMethodList().stream() + .map(keyValue -> new LabelValue(keyValue.getValue(), keyValue.getKey())) + .toList(); + + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/assist/PaymentAssistService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/assist/PaymentAssistService.java new file mode 100644 index 00000000..29f1dc80 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/assist/PaymentAssistService.java @@ -0,0 +1,146 @@ +package org.dromara.daxpay.service.pay.service.assist; + +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.exception.ValidationFailedException; +import cn.bootx.platform.core.util.DateTimeUtil; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; +import org.dromara.daxpay.core.context.PaymentClientLocal; +import org.dromara.daxpay.core.enums.*; +import org.dromara.daxpay.core.exception.ConfigNotEnableException; +import org.dromara.daxpay.core.exception.VerifySignFailedException; +import org.dromara.daxpay.core.param.PaymentCommonParam; +import org.dromara.daxpay.core.result.DaxResult; +import org.dromara.daxpay.core.util.PaySignUtil; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import cn.hutool.core.date.LocalDateTimeUtil; + +import java.time.LocalDateTime; +import java.util.Objects; + +/** + * 交易支持服务接口 + * @author xxm + * @since 2023/12/26 + */ +public interface PaymentAssistService { + + /** + * 初始化请求相关信息上下文 + */ + default void initClient(PaymentCommonParam paymentCommonParam){ + PaymentClientLocal request = PaymentContextLocal.get().getClientInfo(); + request.setClientIp(paymentCommonParam.getClientIp()); + } + + /** + * 入参签名校验 + */ + default void signVerify(PaymentCommonParam param) { + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + // 判断是否不需要签名 + if (!reqInfo.getReqSign()){ + return; + } + String sign = this.genSign(param); + if (!Objects.equals(sign,param.getSign())){ + throw new VerifySignFailedException(); + } + } + + /** + * 请求有效时间校验 + */ + default void reqTimeoutVerify(PaymentCommonParam param) { + var reqInfo = PaymentContextLocal.get().getReqInfo(); + // 开启请求超时校验并设置值 + if (reqInfo.getReqTimeout() && Objects.nonNull(reqInfo.getReqTimeoutSecond()) ){ + LocalDateTime now = LocalDateTime.now(); + // 时间差值(秒) + long durationSeconds = Math.abs(LocalDateTimeUtil.between(now, param.getReqTime()).getSeconds()); + // 当前时间是否晚于请求时间 + if (DateTimeUtil.lt(now, param.getReqTime())){ + // 请求时间比服务器时间晚, 超过配置时间直接打回 + if (durationSeconds > reqInfo.getReqTimeoutSecond()){ + throw new ValidationFailedException("请求时间晚于服务器接收到的时间,请检查"); + } + } else { + // 请求时间比服务器时间早, 超过配置时间直接打回 + if (durationSeconds > reqInfo.getReqTimeoutSecond()){ + throw new ValidationFailedException("请求已过期,请重新发送!"); + } + } + + } + } + + /** + * 对响应对象进行签名 + */ + default void sign(DaxResult result) { + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + String signType = reqInfo.getSignType(); + if (Objects.equals(SignTypeEnum.HMAC_SHA256.getCode(), signType)){ + result.setSign(PaySignUtil.hmacSha256Sign(result, reqInfo.getSignSecret())); + } + else if (Objects.equals(SignTypeEnum.MD5.getCode(), signType)){ + result.setSign(PaySignUtil.md5Sign(result, reqInfo.getSignSecret())); + } else if (Objects.equals(SignTypeEnum.SM3.getCode(), signType)){ + result.setSign(PaySignUtil.md5Sign(result, reqInfo.getSignSecret())); + } + else { + throw new ValidationFailedException("未获取到签名方式,请检查"); + } + } + + /** + * 获取请求参数的签名值 + */ + default String genSign(PaymentCommonParam param) { + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + String signType = reqInfo.getSignType(); + if (Objects.equals(SignTypeEnum.HMAC_SHA256.getCode(), signType)){ + return PaySignUtil.hmacSha256Sign(param, reqInfo.getSignSecret()); + } else if (Objects.equals(SignTypeEnum.MD5.getCode(), signType)){ + return PaySignUtil.md5Sign(param, reqInfo.getSignSecret()); + } else if (Objects.equals(SignTypeEnum.SM3.getCode(), signType)){ + return PaySignUtil.md5Sign(param, reqInfo.getSignSecret()); + } + else { + throw new ValidationFailedException("未获取到签名方式,请检查"); + } + } + + /** + * 初始化商户和应用信息, 用于设置当前的商户和应用上下文, 默认为空 + * 1. 统一支付相关接口调用时,要进行初始化 + * 2. 接收到回调时,要进行初始化 + * 3. 接收到消息通知时, 要进行初始化 + * 4. 运营端或代理商端进行操作时, 手动指定 + */ + default void initMchAndApp(String mchNo, String appId) { + } + + /** + * 初始化商户和应用信息, 用于设置当前的商户和应用上下文 + */ + default void initMchAndApp(String appId) { + } + + /** + * 验证 + */ + default void checkStatus(){ + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + if (Objects.isNull(reqInfo)){ + throw new DataNotExistException("未获取到商户和应用信息,请检查"); + } + // 应用 + if (!Objects.equals(reqInfo.getStatus(), MchAppStatusEnum.ENABLE.getCode())){ + throw new ConfigNotEnableException("商户应用未启用"); + } + // 商户 + if (!Objects.equals(reqInfo.getMchStatus(), MerchantStatusEnum.ENABLE.getCode())){ + throw new ConfigNotEnableException("商户未启用"); + } + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/WechatOpenAuthService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/assist/WechatOpenAuthService.java similarity index 68% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/WechatOpenAuthService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/assist/WechatOpenAuthService.java index db8432ee..49c63bb4 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/WechatOpenAuthService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/assist/WechatOpenAuthService.java @@ -1,11 +1,10 @@ -package org.dromara.daxpay.service.service.assist; +package org.dromara.daxpay.service.pay.service.assist; -import org.dromara.daxpay.core.context.MchAppLocal; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.assist.AuthUrlResult; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; @@ -28,24 +27,6 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class WechatOpenAuthService { - /** - * 构建微信oauth2授权的url连接 - */ - @Deprecated - public AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param, String channelAuthPath,String appId, String appSecret) { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - WxMpService wxMpService = this.getWxMpService(appId,appSecret); - // 手段传输回调地址, 直接拼接不做处理 - String queryCode = RandomUtil.randomString(10); - // 如果配置中有地址配置则使用, 没有的话使用平台地址进行拼接 - String serverUrl =channelAuthPath; - if (StrUtil.isBlank(serverUrl)){ - serverUrl = mchAppInfo.getGatewayMobileUrl(); - } - String redirectUrl = StrUtil.format("{}/auth/wechat/{}/{}/{}", param.getAppId(), param.getChannel(),queryCode); - String authUrl = wxMpService.getOAuth2Service().buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, ""); - return new AuthUrlResult().setAuthUrl(authUrl).setQueryCode(queryCode); - } /** * 生成内部使用的授权链接, 返回授权码给调用者, 由调用者自己再去获取授权信息 @@ -56,8 +37,8 @@ public class WechatOpenAuthService { WxMpService wxMpService = this.getWxMpService(wxAppId,appSecret); // 如果配置中有地址配置则使用, 没有的话使用平台地址进行拼接 if (StrUtil.isBlank(serverUrl)){ - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - serverUrl = mchAppInfo.getGatewayMobileUrl(); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); + serverUrl = reqInfo.getGatewayH5Url(); } String queryCode = RandomUtil.randomString(10); // 如果授权地址为空 diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/ApiConstService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/ApiConstService.java similarity index 71% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/ApiConstService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/ApiConstService.java index 0d469478..bce2cabf 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/ApiConstService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/ApiConstService.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.service.constant; +package org.dromara.daxpay.service.pay.service.constant; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.service.dao.constant.ApiConstManager; -import org.dromara.daxpay.service.param.constant.ApiConstQuery; -import org.dromara.daxpay.service.result.constant.ApiConstResult; +import org.dromara.daxpay.service.pay.dao.constant.ApiConstManager; +import org.dromara.daxpay.service.pay.param.constant.ApiConstQuery; +import org.dromara.daxpay.service.pay.result.constant.ApiConstResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/ChannelConstService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/ChannelConstService.java similarity index 65% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/ChannelConstService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/ChannelConstService.java index f1d66fba..7b87b582 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/ChannelConstService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/ChannelConstService.java @@ -1,12 +1,13 @@ -package org.dromara.daxpay.service.service.constant; +package org.dromara.daxpay.service.pay.service.constant; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.dto.LabelValue; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.service.entity.constant.ChannelConst; -import org.dromara.daxpay.service.param.constant.ChannelConstQuery; -import org.dromara.daxpay.service.result.constant.ChannelConstResult; +import org.dromara.daxpay.service.pay.dao.constant.ChannelConstManager; +import org.dromara.daxpay.service.pay.entity.constant.ChannelConst; +import org.dromara.daxpay.service.pay.param.constant.ChannelConstQuery; +import org.dromara.daxpay.service.pay.result.constant.ChannelConstResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; @@ -23,7 +24,7 @@ import java.util.List; @Service @RequiredArgsConstructor public class ChannelConstService { - private final org.dromara.daxpay.service.pay.dao.constant.ChannelConstManager channelConstManager; + private final ChannelConstManager channelConstManager; /** * 分页 @@ -45,10 +46,20 @@ public class ChannelConstService { * 服务商通道列表 */ public List dropdownByIsv(){ - // 遍历通道类型 List channelList = channelConstManager.findAllByIsvAndEnable(); return channelList.stream() .map(o->new LabelValue(o.getName(), o.getCode())) .toList(); } + + /** + * 可进件通道下拉列表 + */ + public List dropdownByApply() { + List channelList = channelConstManager.findAllByApplyAndEnable(); + return channelList.stream() + .map(o->new LabelValue(o.getName(), o.getCode())) + .toList(); + + } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/MerchantNotifyConstService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/MerchantNotifyConstService.java similarity index 70% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/MerchantNotifyConstService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/MerchantNotifyConstService.java index 049b0f2a..fdf3520d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/MerchantNotifyConstService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/MerchantNotifyConstService.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.service.service.constant; +package org.dromara.daxpay.service.pay.service.constant; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.service.dao.constant.MerchantNotifyConstManager; -import org.dromara.daxpay.service.param.constant.MerchantNotifyConstQuery; -import org.dromara.daxpay.service.result.constant.MerchantNotifyConstResult; +import org.dromara.daxpay.service.pay.dao.constant.MerchantNotifyConstManager; +import org.dromara.daxpay.service.pay.param.constant.MerchantNotifyConstQuery; +import org.dromara.daxpay.service.pay.result.constant.MerchantNotifyConstResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/MethodConstService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/MethodConstService.java similarity index 69% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/MethodConstService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/MethodConstService.java index cd285909..65a01db8 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/constant/MethodConstService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/MethodConstService.java @@ -1,17 +1,17 @@ -package org.dromara.daxpay.service.service.constant; +package org.dromara.daxpay.service.pay.service.constant; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.service.dao.constant.MethodConstManager; -import org.dromara.daxpay.service.param.constant.MethodConstQuery; -import org.dromara.daxpay.service.result.constant.PayMethodConstResult; +import org.dromara.daxpay.service.pay.dao.constant.MethodConstManager; +import org.dromara.daxpay.service.pay.param.constant.MethodConstQuery; +import org.dromara.daxpay.service.pay.result.constant.PayMethodConstResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** - * + * 支付方式常量 * @author xxm * @since 2024/7/14 */ diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/TerminalConstService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/TerminalConstService.java new file mode 100644 index 00000000..3e4bd7ae --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/constant/TerminalConstService.java @@ -0,0 +1,31 @@ +package org.dromara.daxpay.service.pay.service.constant; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import org.dromara.daxpay.service.pay.dao.constant.TerminalConstManager; +import org.dromara.daxpay.service.pay.param.constant.TerminalConstQuery; +import org.dromara.daxpay.service.pay.result.constant.TerminalConstResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 通道终端报送类型 + * @author xxm + * @since 2025/3/12 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class TerminalConstService { + private final TerminalConstManager terminalConstManager; + + /** + * 分页 + */ + public PageResult page(PageParam pageParam, TerminalConstQuery query) { + return MpUtil.toPageResult(terminalConstManager.page(pageParam, query)); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/develop/DevelopTradeService.java similarity index 70% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/develop/DevelopTradeService.java index b421769a..92fe0505 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/develop/DevelopTradeService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.develop; +package org.dromara.daxpay.service.pay.service.develop; import org.dromara.daxpay.core.param.PaymentCommonParam; import org.dromara.daxpay.core.param.gateway.GatewayPayParam; @@ -8,12 +8,12 @@ import org.dromara.daxpay.core.param.trade.transfer.TransferParam; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.result.trade.refund.RefundResult; import org.dromara.daxpay.core.result.trade.transfer.TransferResult; -import org.dromara.daxpay.service.result.gateway.GatewayPayUrlResult; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.gateway.GatewayPayService; -import org.dromara.daxpay.service.service.trade.pay.PayService; -import org.dromara.daxpay.service.service.trade.refund.RefundService; -import org.dromara.daxpay.service.service.trade.transfer.TransferService; +import org.dromara.daxpay.service.pay.result.gateway.GatewayPayUrlResult; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.gateway.GatewayPayService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -37,7 +37,7 @@ public class DevelopTradeService { * 生成签名 */ public String genSign(PaymentCommonParam param){ - paymentAssistService.initMchAndApp(param.getAppId()); + paymentAssistService.initMchAndApp(param.getMchNo(), param.getAppId()); return paymentAssistService.genSign(param); } @@ -46,7 +46,7 @@ public class DevelopTradeService { */ public PayResult pay(PayParam param) { // 初始化 - paymentAssistService.initMchAndApp(param.getAppId()); + paymentAssistService.initMchAndApp(param.getMchNo(), param.getAppId()); // 签名校验 paymentAssistService.signVerify(param); return payService.pay(param); @@ -57,7 +57,7 @@ public class DevelopTradeService { */ public RefundResult refund(RefundParam param) { // 初始化 - paymentAssistService.initMchAndApp(param.getAppId()); + paymentAssistService.initMchAndApp(param.getMchNo(), param.getAppId()); // 签名校验 paymentAssistService.signVerify(param); return refundService.refund(param); @@ -68,7 +68,7 @@ public class DevelopTradeService { */ public TransferResult transfer(TransferParam param) { // 初始化 - paymentAssistService.initMchAndApp(param.getAppId()); + paymentAssistService.initMchAndApp(param.getMchNo(), param.getAppId()); // 签名校验 paymentAssistService.signVerify(param); return transferService.transfer(param); @@ -79,7 +79,7 @@ public class DevelopTradeService { */ public GatewayPayUrlResult checkoutUrl(GatewayPayParam param) { // 初始化 - paymentAssistService.initMchAndApp(param.getAppId()); + paymentAssistService.initMchAndApp(param.getMchNo(), param.getAppId()); // 签名校验 paymentAssistService.signVerify(param); return gatewayPayService.prePay(param); diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/CashierCodePayService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/CashierCodePayService.java new file mode 100644 index 00000000..93d02b96 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/CashierCodePayService.java @@ -0,0 +1,156 @@ +package org.dromara.daxpay.service.pay.service.gateway; + +import cn.bootx.platform.common.spring.util.WebServletUtil; +import cn.bootx.platform.core.annotation.IgnoreTenant; +import cn.bootx.platform.core.exception.DataNotExistException; +import org.dromara.daxpay.core.enums.CashierSceneEnum; +import org.dromara.daxpay.core.enums.ChannelAuthTypeEnum; +import org.dromara.daxpay.core.exception.UnsupportedAbilityException; +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; +import org.dromara.daxpay.core.param.gateway.GatewayCashierCodeAuthParam; +import org.dromara.daxpay.core.param.gateway.GatewayCashierCodeAuthUrlParam; +import org.dromara.daxpay.core.param.gateway.GatewayCashierCodePayParam; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.assist.AuthResult; +import org.dromara.daxpay.core.result.trade.pay.PayResult; +import org.dromara.daxpay.core.util.TradeNoGenerateUtil; +import org.dromara.daxpay.service.device.dao.qrcode.config.CashierCodeConfigManager; +import org.dromara.daxpay.service.device.dao.qrcode.config.CashierCodeSceneConfigManager; +import org.dromara.daxpay.service.device.service.qrcode.CashierCodeService; +import org.dromara.daxpay.service.pay.result.gateway.GatewayCashierCodeConfigResult; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayService; +import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Optional; + +/** + * 收银码牌支付 + * @author xxm + * @since 2025/6/30 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CashierCodePayService { + + private final CashierCodeSceneConfigManager codeSceneConfigManager; + private final CashierCodeConfigManager cashierCodeConfigManager; + private final CashierCodeService cashierCodeService; + private final PaymentAssistService paymentAssistService; + private final PayService payService; + + /** + * 收银码牌支付 + */ + @IgnoreTenant + public PayResult cashierCodePay(GatewayCashierCodePayParam param){ + // 查询并查询码牌 + var cashierCode = cashierCodeService.getAndCheckCode(param.getCashierCode()); + // 查询码牌配置 + var codeConfig = cashierCodeConfigManager.findById(cashierCode.getConfigId()) + .orElseThrow(() -> new DataNotExistException("码牌配置不存在")); + var sceneConfig = codeSceneConfigManager.findByConfigAndScene(cashierCode.getConfigId(), param.getCashierScene()) + .orElseThrow(() -> new DataNotExistException("码牌支付场景配置不存在")); + + paymentAssistService.initMchAndApp(cashierCode.getMchNo(), cashierCode.getAppId()); + // 构建支付参数 + PayParam payParam = new PayParam(); + payParam.setBizOrderNo(TradeNoGenerateUtil.pay()); + + payParam.setChannel(sceneConfig.getChannel()); + payParam.setMethod(sceneConfig.getPayMethod()); + payParam.setOtherMethod(sceneConfig.getOtherMethod()); + payParam.setTitle(StrUtil.format("{} 码牌收款: {}元", Optional.ofNullable(cashierCode.getName()).orElse(""), param.getAmount())); + payParam.setLimitPay(codeConfig.getLimitPay()); + payParam.setDescription(param.getDescription()); + payParam.setAmount(param.getAmount()); + payParam.setOpenId(param.getOpenId()); + payParam.setReqTime(LocalDateTime.now()); + payParam.setAppId(cashierCode.getAppId()); + payParam.setMchNo(cashierCode.getMchNo()); + // 设置IP + String ip = Optional.ofNullable(WebServletUtil.getRequest()) + .map(JakartaServletUtil::getClientIP) + .orElse("127.0.0.1"); + payParam.setClientIp(ip); + + // 发起支付 + return payService.pay(payParam); + } + + /** + * 根据码牌编码和类型查询信息和配置 + */ + @IgnoreTenant + public GatewayCashierCodeConfigResult getCashierCodeConfig(String code, String scene) { + // 查询并查询码牌 + var cashierCode = cashierCodeService.getAndCheckCode(code); + var sceneConfig = codeSceneConfigManager.findByConfigAndScene(cashierCode.getConfigId(), scene) + .orElseThrow(() -> new DataNotExistException("码牌支付场景配置不存在")); + var result = new GatewayCashierCodeConfigResult(); + BeanUtil.copyProperties(sceneConfig, result); + return result.setName(cashierCode.getName()) + .setAmountType(cashierCode.getAmountType()) + .setAmount(cashierCode.getAmount()) + .setEnable(cashierCode.getEnable()); + } + + /** + * 生成码牌所需授权链接跳转链接, 主要是微信类通道使用, 用于获取OpenId + */ + @IgnoreTenant + public String genAuthUrl(GatewayCashierCodeAuthUrlParam param){ + // 查询并查询码牌 + var cashierCode = cashierCodeService.getAndCheckCode(param.getCashierCode()); + // 查询码牌支付场景配置 + var sceneConfig = codeSceneConfigManager.findByConfigAndScene(cashierCode.getConfigId(), param.getCashierScene()) + .orElseThrow(() -> new DataNotExistException("码牌支付场景配置不存在")); + // 获取认证策略 + var channelAuthStrategy = PaymentStrategyFactory.create(sceneConfig.getChannel(), AbsChannelAuthStrategy.class); + var cashierCodeType = CashierSceneEnum.findByCode(sceneConfig.getScene()); + return switch (cashierCodeType) { + case WECHAT_PAY -> { + var authUrlParam = new GenerateAuthUrlParam() + .setAuthType(ChannelAuthTypeEnum.WECHAT.getCode()) + .setAuthPath(StrUtil.format("/wechat/cashier/code/{}", cashierCode.getCode())); + yield channelAuthStrategy.generateAuthUrl(authUrlParam).getAuthUrl(); + } + case ALIPAY, UNION_PAY -> throw new UnsupportedAbilityException("暂不支持该认证方式"); + }; + } + + /** + * 获取码牌认证结果 + */ + @IgnoreTenant + public AuthResult auth(GatewayCashierCodeAuthParam param){ + // 查询并查询码牌 + var cashierCode = cashierCodeService.getAndCheckCode(param.getCashierCode()); + // 查询码牌配置 + var sceneConfig = codeSceneConfigManager.findByConfigAndScene(cashierCode.getConfigId(), param.getCashierScene()) + .orElseThrow(() -> new DataNotExistException("码牌支付场景配置不存在")); + paymentAssistService.initMchAndApp(cashierCode.getMchNo(), cashierCode.getAppId()); + // 查询码牌支付场景配置 + var channelAuthStrategy = PaymentStrategyFactory.create(sceneConfig.getChannel(), AbsChannelAuthStrategy.class); + var cashierCodeType = CashierSceneEnum.findByCode(sceneConfig.getScene()); + return switch (cashierCodeType) { + case WECHAT_PAY -> { + var codeParam = new AuthCodeParam() + .setAuthType(ChannelAuthTypeEnum.WECHAT.getCode()) + .setAuthCode(param.getAuthCode()); + yield channelAuthStrategy.doAuth(codeParam); + } + case ALIPAY, UNION_PAY -> throw new UnsupportedAbilityException("暂不支持该认证方式"); + }; + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/CashierPayService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/CashierPayService.java new file mode 100644 index 00000000..c580fc8e --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/CashierPayService.java @@ -0,0 +1,137 @@ +package org.dromara.daxpay.service.pay.service.gateway; + +import cn.bootx.platform.common.spring.util.WebServletUtil; +import cn.bootx.platform.core.annotation.IgnoreTenant; +import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; +import org.dromara.daxpay.core.exception.ConfigNotExistException; +import org.dromara.daxpay.core.exception.TradeProcessingException; +import org.dromara.daxpay.core.exception.UnsupportedAbilityException; +import org.dromara.daxpay.core.param.gateway.GatewayCashierBarPayParam; +import org.dromara.daxpay.core.param.gateway.GatewayCashierPayParam; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.trade.pay.PayResult; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.merchant.entity.gateway.CashierItemConfig; +import org.dromara.daxpay.service.merchant.entity.gateway.GatewayPayConfig; +import org.dromara.daxpay.service.merchant.service.gateway.AggregateConfigService; +import org.dromara.daxpay.service.merchant.service.gateway.CashierConfigService; +import org.dromara.daxpay.service.merchant.service.gateway.GatewayPayConfigService; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayService; +import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Objects; +import java.util.Optional; + +/** + * 网关收银台支付服务 + * @author xxm + * @since 2025/4/12 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CashierPayService { + + private final PayService payService; + private final GatewayPayAssistService gatewayPayAssistService; + private final PaymentAssistService paymentAssistService; + private final GatewayPayConfigService gatewayPayConfigService; + private final AggregateConfigService aggregateConfigService; + private final CashierConfigService cashierConfigService; + + /** + * 收银台聚合支付(付款码) + */ + @IgnoreTenant + public PayResult cashierBarPay(GatewayCashierBarPayParam param) { + var payOrder = gatewayPayAssistService.getOrderAndCheck(param.getOrderNo()); + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); + // 识别付款码类型 + var aggregatePayType = PayUtil.getBarCodeType(param.getAuthCode()); + // 获取聚合付款码支付配置 + GatewayPayConfig gatewayConfig = gatewayPayConfigService.getGatewayConfig(payOrder.getAppId()); + var barPayConfigs = aggregateConfigService.getAggregateBarPayConfigs(payOrder.getAppId(), aggregatePayType.getCode(), gatewayConfig); + if (CollUtil.isEmpty(barPayConfigs)){ + throw new ConfigNotExistException("未找到支持该付款码的支付通道"); + } + // 获取支付策略 + var barPayConfig = barPayConfigs.getFirst(); + var payParam = new PayParam(); + payParam.setChannel(barPayConfig.getChannel()); + payParam.setMethod(barPayConfig.getBarPayType()); + payParam.setOtherMethod(barPayConfig.getOtherMethod()); + payParam.setAuthCode(param.getAuthCode()); + payParam.setAppId(barPayConfig.getAppId()); + payParam.setMchNo(barPayConfig.getMchNo()); + // 设置IP + if (Objects.isNull(payParam.getClientIp())){ + String ip = Optional.ofNullable(WebServletUtil.getRequest()) + .map(JakartaServletUtil::getClientIP) + .orElse("127.0.0.1"); + payParam.setClientIp(ip); + } + return payService.payHandle(payParam,payOrder); + } + + /** + * 网关收银台支付调用 + */ + @IgnoreTenant + public PayResult cashierPay(GatewayCashierPayParam param){ + // 订单信息 + PayOrder payOrder = gatewayPayAssistService.getOrderAndCheck(param.getOrderNo()); + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); + // 获取收银台配置 + var cashierConfig = gatewayPayConfigService.getGatewayConfig(payOrder.getAppId()); + // 读取收银台类目配置内容 + var itemConfig = cashierConfigService.getCashierItemConfig(param.getItemId(),payOrder.getAppId(), cashierConfig) + .orElseThrow(() -> new TradeProcessingException("支付配置项不存在")); + // 判断支付调用类型 + var callTypeEnum = GatewayCallTypeEnum.findBuyCode(itemConfig.getCallType()); + switch (callTypeEnum) { + case QR_CODE, LINK, BAR_CODE, JSAPI, FROM -> { + return this.payHandle(param, itemConfig, payOrder); + } + default -> throw new UnsupportedAbilityException("不支持的支付调用类型"); + } + } + + /** + * 处理网关支付参数后使用通用支付接口调起支付 + */ + private PayResult payHandle(GatewayCashierPayParam param, CashierItemConfig itemConfig, PayOrder payOrder){ + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); + // 构建支付参数 + var payParam = new PayParam(); + payParam.setChannel(itemConfig.getChannel()); + payParam.setMethod(itemConfig.getPayMethod()); + payParam.setOtherMethod(itemConfig.getOtherMethod()); + payParam.setAuthCode(param.getAuthCode()); + payParam.setOpenId(param.getOpenId()); + payParam.setAppId(itemConfig.getAppId()); + payParam.setMchNo(payOrder.getMchNo()); + // 设置IP + if (Objects.isNull(payParam.getClientIp())){ + String ip = Optional.ofNullable(WebServletUtil.getRequest()) + .map(JakartaServletUtil::getClientIP) + .orElse("127.0.0.1"); + payParam.setClientIp(ip); + } + + // 获取策略 + var cashierStrategy = PaymentStrategyFactory.create(itemConfig.getChannel(), AbsGatewayPayStrategy.class); + // 进行参数预处理 + cashierStrategy.handlePayParam(param, payParam); + // 发起支付 + return payService.payHandle(payParam,payOrder); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/GatewayPayAssistService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/GatewayPayAssistService.java similarity index 71% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/GatewayPayAssistService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/GatewayPayAssistService.java index af7f372d..e85b6ae8 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/GatewayPayAssistService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/GatewayPayAssistService.java @@ -1,19 +1,18 @@ -package org.dromara.daxpay.service.service.gateway; +package org.dromara.daxpay.service.pay.service.gateway; import cn.bootx.platform.starter.redis.delay.service.DelayJobService; -import org.dromara.daxpay.core.context.MchAppLocal; import org.dromara.daxpay.core.enums.PayAllocStatusEnum; import org.dromara.daxpay.core.enums.PayRefundStatusEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.param.gateway.GatewayPayParam; -import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; -import org.dromara.daxpay.service.service.trade.pay.PayAssistService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderExpandManager; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrderExpand; +import org.dromara.daxpay.service.pay.service.order.pay.PayOrderQueryService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayAssistService; import cn.hutool.core.bean.BeanUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -36,6 +35,7 @@ public class GatewayPayAssistService { private final PayOrderManager payOrderManager; private final PayOrderQueryService payOrderQueryService; private final PayAssistService payAssistService; + private final PayOrderExpandManager payOrderExpandManager; /** * 校验支付状态,支付成功则返回,支付失败则抛出对应的异常 @@ -68,23 +68,15 @@ public class GatewayPayAssistService { if (order.getAllocation()) { order.setAllocStatus(PayAllocStatusEnum.WAITING.getCode()); } + // 保存订单 payOrderManager.save(order); + // 保存订单扩展信息 + var orderExpand = new PayOrderExpand(); + orderExpand.setId(order.getId()); + payOrderExpandManager.save(orderExpand); // 注册支付超时任务 delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.ORDER_PAY_TIMEOUT, order.getExpiredTime()); return order; } - /** - * 获取支付订单超时时间 - */ - private LocalDateTime getExpiredTime(GatewayPayParam payParam) { - MchAppLocal mchAppLocal = PaymentContextLocal.get().getMchAppInfo(); - // 支付参数传入 - if (Objects.nonNull(payParam.getExpiredTime())) { - return payParam.getExpiredTime(); - } - // 根据商户应用配置计算出时间 - return PayUtil.getPaymentExpiredTime(mchAppLocal.getOrderTimeout()); - } - } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/GatewayPayQueryService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/GatewayPayQueryService.java similarity index 63% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/GatewayPayQueryService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/GatewayPayQueryService.java index 0a4c76ee..dbff19e0 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/GatewayPayQueryService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/GatewayPayQueryService.java @@ -1,35 +1,32 @@ -package org.dromara.daxpay.service.service.gateway; +package org.dromara.daxpay.service.pay.service.gateway; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.core.annotation.IgnoreTenant; import cn.bootx.platform.core.exception.DataNotExistException; -import cn.hutool.core.bean.BeanUtil; +import org.dromara.daxpay.core.enums.GatewayCashierTypeEnum; +import org.dromara.daxpay.core.enums.GatewayPayEnvTypeEnum; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.param.gateway.GatewayOrderAndConfigParam; +import org.dromara.daxpay.service.common.service.config.PlatformConfigService; +import org.dromara.daxpay.service.merchant.convert.gateway.AggregatePayConfigConvert; +import org.dromara.daxpay.service.merchant.convert.gateway.CashierGroupConfigConvert; +import org.dromara.daxpay.service.merchant.convert.gateway.CashierItemConfigConvert; +import org.dromara.daxpay.service.merchant.entity.gateway.CashierItemConfig; +import org.dromara.daxpay.service.merchant.result.gateway.CashierGroupConfigResult; +import org.dromara.daxpay.service.merchant.result.gateway.CashierItemConfigResult; +import org.dromara.daxpay.service.merchant.result.gateway.GatewayPayConfigResult; +import org.dromara.daxpay.service.merchant.service.gateway.AggregateConfigService; +import org.dromara.daxpay.service.merchant.service.gateway.CashierConfigService; +import org.dromara.daxpay.service.merchant.service.gateway.GatewayPayConfigService; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.result.gateway.AggregateOrderAndConfigResult; +import org.dromara.daxpay.service.pay.result.gateway.GatewayOrderAndConfigResult; +import org.dromara.daxpay.service.pay.result.gateway.GatewayOrderResult; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.enums.GatewayCashierTypeEnum; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.exception.ConfigNotEnableException; -import org.dromara.daxpay.core.param.gateway.GatewayOrderAndConfigParam; -import org.dromara.daxpay.service.convert.gateway.AggregatePayConfigConvert; -import org.dromara.daxpay.service.convert.gateway.CashierGroupConfigConvert; -import org.dromara.daxpay.service.convert.gateway.CashierItemConfigConvert; -import org.dromara.daxpay.service.convert.gateway.GatewayPayConfigConvert; -import org.dromara.daxpay.service.dao.gateway.*; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.gateway.AggregatePayConfig; -import org.dromara.daxpay.service.entity.gateway.CashierCodeConfig; -import org.dromara.daxpay.service.entity.gateway.CashierItemConfig; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.result.gateway.AggregateOrderAndConfigResult; -import org.dromara.daxpay.service.result.gateway.GatewayCashierCodeConfigResult; -import org.dromara.daxpay.service.result.gateway.GatewayOrderAndConfigResult; -import org.dromara.daxpay.service.result.gateway.GatewayOrderResult; -import org.dromara.daxpay.service.result.gateway.config.CashierGroupConfigResult; -import org.dromara.daxpay.service.result.gateway.config.CashierItemConfigResult; -import org.dromara.daxpay.service.result.gateway.config.GatewayPayConfigResult; -import org.dromara.daxpay.service.service.config.PlatformConfigService; import org.springframework.stereotype.Service; import java.util.*; @@ -44,14 +41,11 @@ import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class GatewayPayQueryService { - private final GatewayPayConfigManager gatewayPayConfigManager; - private final CashierGroupConfigManager cashierGroupConfigManager; - private final CashierItemConfigManager gatewayItemConfigManager; - private final AggregatePayConfigManager aggregatePayConfigManager; + private final AggregateConfigService aggregateConfigService; + private final GatewayPayConfigService gatewayPayConfigService; + private final CashierConfigService cashierConfigService; private final GatewayPayAssistService gatewayAssistService; private final PayOrderManager payOrderManager; - private final CashierCodeConfigManager cashierCodeConfigManager; - private final CashierCodeItemConfigManager cashierCodeItemConfigManager; private final PlatformConfigService platformConfigService; /** @@ -64,7 +58,7 @@ public class GatewayPayQueryService { var payOrder = Optional.ofNullable(gatewayAssistService.getOrderAndCheck(param.getOrderNo())) .orElseThrow(() -> new DataNotExistException("订单不存在")); - GatewayOrderResult order = new GatewayOrderResult() + var order = new GatewayOrderResult() .setTitle(payOrder.getTitle()) .setDescription(payOrder.getDescription()) .setAmount(payOrder.getAmount()) @@ -75,52 +69,33 @@ public class GatewayPayQueryService { // 获取收银台配置 gatewayInfo.setConfig(this.getConfig(payOrder.getAppId())); // 获取收银台分组和明细配置 - gatewayInfo.setGroupConfigs(this.getGroupConfigs(payOrder.getAppId(), param.getCashierType(), param.getPayEnvType())); + List groupConfigs = this.getGroupConfigs(payOrder.getAppId(), param.getCashierType(), param.getPayEnvType()); + gatewayInfo.setGroupConfigs(groupConfigs); // 判断是否需要显示聚合扫码支付链接 同时满足 pc + 开启显示 if (Objects.equals(param.getCashierType(), GatewayCashierTypeEnum.PC.getCode()) &&gatewayInfo.getConfig().getAggregateShow()){ - var config = platformConfigService.getConfig(); - String url = StrUtil.format("{}/cashier/{}", config.getGatewayMobileUrl(), payOrder.getOrderNo()); + var config = platformConfigService.getUrlConfig(); + String url = StrUtil.format("{}/cashier/{}", config.getGatewayH5Url(), payOrder.getOrderNo()); gatewayInfo.setAggregateUrl(url); } return gatewayInfo; } - /** - * 根据码牌编码和类型查询信息和配置 - */ - @IgnoreTenant - public GatewayCashierCodeConfigResult getCashierCodeConfig(String cashierCode, String cashierType) { - CashierCodeConfig codeConfig = cashierCodeConfigManager.findByCode(cashierCode) - .orElseThrow(() -> new DataNotExistException("支付码牌不存在")); - // 是否启用 - if (!codeConfig.getEnable()) { - throw new ConfigNotEnableException("支付码牌已禁用"); - } - var codeItemConfig = cashierCodeItemConfigManager.findByCodeAndType(codeConfig.getId(), cashierType) - .orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); - var result = new GatewayCashierCodeConfigResult(); - BeanUtil.copyProperties(codeItemConfig, result); - return result.setName(codeConfig.getName()); - } - - /** * 获取收银台配置 */ private GatewayPayConfigResult getConfig(String appId){ - // 查询配置 - return gatewayPayConfigManager.findByAppId(appId) - .map(GatewayPayConfigConvert.CONVERT::toResult) - .orElse(new GatewayPayConfigResult()); + return gatewayPayConfigService.getGatewayConfig(appId).toResult(); } /** * 获取收银台分组配置, 包含明细配置, 根据传入的 payEnvType 进行过滤, 不传返回全部 + * @see GatewayPayEnvTypeEnum payEnvType */ private List getGroupConfigs(String appId, String cashierType, String payEnvType){ // 查询类目 - var groups = cashierGroupConfigManager.findAllByAppIdAndType(appId, cashierType); + var gatewayConfig = gatewayPayConfigService.getGatewayConfig(appId); + var groups = cashierConfigService.getCashierGroupConfigs(appId, cashierType, gatewayConfig); if (groups.isEmpty()){ return new ArrayList<>(); } @@ -128,7 +103,7 @@ public class GatewayPayQueryService { .map(MpIdEntity::getId) .toList(); // 查询明细配置, 根据传入支付环境进行过滤后分组 - var itemGroupMap = gatewayItemConfigManager.findAllByGroupIds(groupIds).stream() + var itemGroupMap = cashierConfigService.getCashierItemConfigs(groupIds, gatewayConfig).stream() .filter(o-> { // 如果传入支付环境不为空, 则进行筛选 if (StrUtil.isNotBlank(payEnvType)){ @@ -169,8 +144,8 @@ public class GatewayPayQueryService { // 获取收银台配置 gatewayInfoResult.setConfig(this.getConfig(payOrder.getAppId())); // 获取聚合支付配置 - AggregatePayConfig aggregateConfig = aggregatePayConfigManager.findByAppIdAndType(payOrder.getAppId(), aggregateType) - .orElseThrow(() -> new DataNotExistException("聚合支付配置不存在")); + var gatewayConfig = gatewayPayConfigService.getGatewayConfig(payOrder.getAppId()); + var aggregateConfig = aggregateConfigService.getAggregatePayConfig(payOrder.getAppId(), aggregateType, gatewayConfig); gatewayInfoResult.setAggregateConfig(AggregatePayConfigConvert.CONVERT.toResult(aggregateConfig)); return gatewayInfoResult; } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/GatewayPayService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/GatewayPayService.java similarity index 76% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/GatewayPayService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/GatewayPayService.java index 9fb33e29..a76df0d4 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/GatewayPayService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/gateway/GatewayPayService.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.service.gateway; +package org.dromara.daxpay.service.pay.service.gateway; import cn.bootx.platform.common.spring.util.WebServletUtil; import cn.bootx.platform.core.annotation.IgnoreTenant; -import org.dromara.daxpay.core.context.MchAppLocal; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; import org.dromara.daxpay.core.enums.AggregatePayTypeEnum; import org.dromara.daxpay.core.enums.ChannelAuthTypeEnum; import org.dromara.daxpay.core.enums.GatewayPayTypeEnum; @@ -21,18 +21,16 @@ import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.gateway.AggregateBarPayConfigManager; -import org.dromara.daxpay.service.dao.gateway.AggregatePayConfigManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.result.gateway.GatewayPayUrlResult; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.config.PlatformConfigService; -import org.dromara.daxpay.service.service.trade.pay.PayAssistService; -import org.dromara.daxpay.service.service.trade.pay.PayService; -import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy; -import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; +import org.dromara.daxpay.service.merchant.service.gateway.AggregateConfigService; +import org.dromara.daxpay.service.merchant.service.gateway.GatewayPayConfigService; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.result.gateway.GatewayPayUrlResult; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayService; +import org.dromara.daxpay.service.pay.strategy.AbsChannelAuthStrategy; +import org.dromara.daxpay.service.pay.strategy.AbsGatewayPayStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; @@ -57,12 +55,11 @@ import java.util.Optional; public class GatewayPayService { private final GatewayPayAssistService gatewayPayAssistService; private final LockTemplate lockTemplate; - private final PlatformConfigService platformConfigService; private final PaymentAssistService paymentAssistService; private final PayService payService; - private final AggregatePayConfigManager aggregatePayConfigManager; private final PayAssistService payAssistService; - private final AggregateBarPayConfigManager aggregateBarPayConfigManager; + private final AggregateConfigService aggregateConfigService; + private final GatewayPayConfigService gatewayPayConfigService; /** * 预支付: 生成收银台链接 @@ -82,7 +79,7 @@ public class GatewayPayService { } try { // 检查支付订单 - PayOrder payOrder = payAssistService.getOrderAndCheck(payParam.getBizOrderNo(), payParam.getAppId()); + var payOrder = payAssistService.getOrderAndCheck(payParam.getBizOrderNo(), payParam.getAppId()); // 订单已经存在直接返回链接, 不存在创建订单后返回链接 if (Objects.isNull(payOrder)){ // 执行支付前的保存动作, 保存支付订单和扩展记录 @@ -100,16 +97,16 @@ public class GatewayPayService { */ public String getGatewayUrl(String orderNo, String gatewayPayType){ var gatewayPayTypeEnum = GatewayPayTypeEnum.findBuyCode(gatewayPayType); - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); switch (gatewayPayTypeEnum) { case H5 -> { - return StrUtil.format("{}/cashier/{}",mchAppInfo.getGatewayMobileUrl(), orderNo); + return StrUtil.format("{}/cashier/{}",reqInfo.getGatewayH5Url(), orderNo); } case PC -> { - return StrUtil.format("{}/pc/cashier/{}",mchAppInfo.getGatewayMobileUrl(), orderNo); + return StrUtil.format("{}/pc/cashier/{}",reqInfo.getGatewayH5Url(), orderNo); } case AGGREGATE -> { - return StrUtil.format("{}/aggregate/{}",mchAppInfo.getGatewayMobileUrl(), orderNo); + return StrUtil.format("{}/aggregate/{}",reqInfo.getGatewayH5Url(), orderNo); } case MINI_APP -> throw new UnsupportedAbilityException("暂不支持小程序收银台"); default -> throw new UnsupportedAbilityException("不支持的网关支付类型"); @@ -124,9 +121,9 @@ public class GatewayPayService { // 订单信息 var payOrder = gatewayPayAssistService.getOrderAndCheck(param.getOrderNo()); // 获取聚合类型 - var aggregateConfig = aggregatePayConfigManager.findByAppIdAndType(payOrder.getAppId(), param.getAggregateType()) - .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); - paymentAssistService.initMchAndApp(payOrder.getAppId()); + var gatewayConfig = gatewayPayConfigService.getGatewayConfig(payOrder.getAppId()); + var aggregateConfig = aggregateConfigService.getAggregatePayConfig(payOrder.getAppId(), param.getAggregateType(), gatewayConfig); + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); // 构建支付参数 var payParam = new PayParam(); payParam.setChannel(aggregateConfig.getChannel()); @@ -134,6 +131,7 @@ public class GatewayPayService { payParam.setOtherMethod(aggregateConfig.getOtherMethod()); payParam.setOpenId(param.getOpenId()); payParam.setAppId(aggregateConfig.getAppId()); + payParam.setMchNo(payOrder.getMchNo()); // 设置IP if (Objects.isNull(payParam.getClientIp())){ String ip = Optional.ofNullable(WebServletUtil.getRequest()) @@ -157,7 +155,8 @@ public class GatewayPayService { // 识别付款码类型 var aggregatePayType = PayUtil.getBarCodeType(param.getAuthCode()); // 获取聚合付款码支付配置 - var barPayConfigs = aggregateBarPayConfigManager.findByAppIdAndType(param.getAppId(), aggregatePayType.getCode()); + var gatewayConfig = gatewayPayConfigService.getGatewayConfig(param.getAppId()); + var barPayConfigs = aggregateConfigService.getAggregateBarPayConfigs(param.getAppId(), aggregatePayType.getCode(), gatewayConfig); if (CollUtil.isEmpty(barPayConfigs)){ throw new ConfigNotExistException("未找到支持该付款码的支付通道"); } @@ -172,6 +171,7 @@ public class GatewayPayService { payParam.setAuthCode(param.getAuthCode()); payParam.setTerminalNo(param.getTerminalNo()); payParam.setAppId(barPayConfig.getAppId()); + payParam.setMchNo(barPayConfig.getMchNo()); // 设置IP if (Objects.isNull(payParam.getClientIp())){ String ip = Optional.ofNullable(WebServletUtil.getRequest()) @@ -189,17 +189,16 @@ public class GatewayPayService { @IgnoreTenant public String genAuthUrl(GatewayAuthUrlParam param){ // 订单信息 - PayOrder payOrder = gatewayPayAssistService.getOrderAndCheck(param.getOrderNo()); + var payOrder = gatewayPayAssistService.getOrderAndCheck(param.getOrderNo()); // 获取聚合类型 - var aggregateConfig = aggregatePayConfigManager.findByAppIdAndType(payOrder.getAppId(), param.getAggregateType()) - .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); + var gatewayConfig = gatewayPayConfigService.getGatewayConfig(payOrder.getAppId()); + var aggregateConfig = aggregateConfigService.getAggregatePayConfig(payOrder.getAppId(), param.getAggregateType(),gatewayConfig); paymentAssistService.initMchAndApp(aggregateConfig.getAppId()); // 获取认证策略 var channelAuthStrategy = PaymentStrategyFactory.create(aggregateConfig.getChannel(), AbsChannelAuthStrategy.class); var aggregatePayType = AggregatePayTypeEnum.findByCode(aggregateConfig.getAggregateType()); return switch (aggregatePayType) { case WECHAT -> { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); var authUrlParam = new GenerateAuthUrlParam() .setAuthType(ChannelAuthTypeEnum.WECHAT.getCode()) .setAuthPath(StrUtil.format("/aggregate/wechat/{}", param.getOrderNo())); @@ -215,10 +214,10 @@ public class GatewayPayService { @IgnoreTenant public AuthResult auth(GatewayAuthCodeParam param) { // 订单信息 - PayOrder payOrder = gatewayPayAssistService.getOrderAndCheck(param.getOrderNo()); + var payOrder = gatewayPayAssistService.getOrderAndCheck(param.getOrderNo()); // 获取聚合类型 - var aggregateConfig = aggregatePayConfigManager.findByAppIdAndType(payOrder.getAppId(), param.getAggregateType()) - .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); + var gatewayConfig = gatewayPayConfigService.getGatewayConfig(payOrder.getAppId()); + var aggregateConfig = aggregateConfigService.getAggregatePayConfig(payOrder.getAppId(), param.getAggregateType(),gatewayConfig); paymentAssistService.initMchAndApp(payOrder.getAppId()); // 获取认证策略 var channelAuthStrategy = PaymentStrategyFactory.create(aggregateConfig.getChannel(), AbsChannelAuthStrategy.class); diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeAssistService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/MerchantNoticeAssistService.java similarity index 96% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeAssistService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/MerchantNoticeAssistService.java index 5f066551..f73115e8 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeAssistService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/MerchantNoticeAssistService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.notice; +package org.dromara.daxpay.service.pay.service.notice; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/MerchantNoticeService.java similarity index 60% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/MerchantNoticeService.java index cf62fb29..0e3e8799 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/MerchantNoticeService.java @@ -1,12 +1,10 @@ -package org.dromara.daxpay.service.service.notice; +package org.dromara.daxpay.service.pay.service.notice; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.service.notice.callback.MerchantCallbackTaskService; -import org.dromara.daxpay.service.service.notice.notify.MerchantNotifyTaskService; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.service.notice.callback.MerchantCallbackTaskService; +import org.dromara.daxpay.service.pay.service.notice.notify.MerchantNotifyTaskService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -52,13 +50,4 @@ public class MerchantNoticeService { merchantNotifyService.registerTransferNotice(order); merchantCallbackService.registerTransferNotice(order); } - - /** - * 注册分账通知 - */ - @Transactional(rollbackFor = Exception.class) - public void registerAllocNotice(AllocOrder order, List details) { - merchantNotifyService.registerAllocNotice(order,details); - merchantCallbackService.registerAllocNotice(order,details); - } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackQueryService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/callback/MerchantCallbackQueryService.java similarity index 70% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackQueryService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/callback/MerchantCallbackQueryService.java index 0c28c36c..6700747d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackQueryService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/callback/MerchantCallbackQueryService.java @@ -1,16 +1,16 @@ -package org.dromara.daxpay.service.service.notice.callback; +package org.dromara.daxpay.service.pay.service.notice.callback; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.service.dao.notice.callback.MerchantCallbackRecordManager; -import org.dromara.daxpay.service.dao.notice.callback.MerchantCallbackTaskManager; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackRecord; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackTask; -import org.dromara.daxpay.service.param.notice.callback.MerchantCallbackTaskQuery; -import org.dromara.daxpay.service.result.notice.callback.MerchantCallbackRecordResult; -import org.dromara.daxpay.service.result.notice.callback.MerchantCallbackTaskResult; +import org.dromara.daxpay.service.pay.dao.notice.callback.MerchantCallbackRecordManager; +import org.dromara.daxpay.service.pay.dao.notice.callback.MerchantCallbackTaskManager; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackRecord; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackTask; +import org.dromara.daxpay.service.pay.param.notice.callback.MerchantCallbackTaskQuery; +import org.dromara.daxpay.service.pay.result.notice.callback.MerchantCallbackRecordResult; +import org.dromara.daxpay.service.pay.result.notice.callback.MerchantCallbackTaskResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackSendService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/callback/MerchantCallbackSendService.java similarity index 85% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackSendService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/callback/MerchantCallbackSendService.java index 2fb8a2dd..7bb08b16 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackSendService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/callback/MerchantCallbackSendService.java @@ -1,8 +1,17 @@ -package org.dromara.daxpay.service.service.notice.callback; +package org.dromara.daxpay.service.pay.service.notice.callback; import cn.bootx.platform.core.code.CommonCode; import cn.bootx.platform.core.util.JsonUtil; import cn.bootx.platform.starter.redis.delay.service.DelayJobService; +import org.dromara.daxpay.core.result.DaxNoticeResult; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.dao.notice.callback.MerchantCallbackRecordManager; +import org.dromara.daxpay.service.pay.dao.notice.callback.MerchantCallbackTaskManager; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackRecord; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackTask; +import org.dromara.daxpay.service.pay.enums.NoticeSendTypeEnum; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeAssistService; import cn.hutool.core.util.StrUtil; import cn.hutool.http.ContentType; import cn.hutool.http.HttpResponse; @@ -10,15 +19,6 @@ import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.result.DaxNoticeResult; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.dao.notice.callback.MerchantCallbackRecordManager; -import org.dromara.daxpay.service.dao.notice.callback.MerchantCallbackTaskManager; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackRecord; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackTask; -import org.dromara.daxpay.service.enums.NoticeSendTypeEnum; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.notice.MerchantNoticeAssistService; import org.slf4j.MDC; import org.springframework.stereotype.Service; @@ -45,6 +45,7 @@ public class MerchantCallbackSendService { private final MerchantCallbackTaskManager taskManager; private final PaymentAssistService paymentAssistService; + private final DelayJobService delayJobService; @@ -64,7 +65,9 @@ public class MerchantCallbackSendService { try { // 构造通知消息并签名 var daxResult = new DaxNoticeResult>(SUCCESS_CODE, JSONUtil.parseObj(task.getContent()), SUCCESS_MSG) + .setMchNo(task.getMchNo()) .setAppId(task.getAppId()); + // 设置响应时间和追踪ID daxResult.setTraceId(MDC.get(CommonCode.TRACE_ID)); daxResult.setResTime(LocalDateTime.now()); paymentAssistService.sign(daxResult); @@ -81,7 +84,7 @@ public class MerchantCallbackSendService { if (StrUtil.equalsIgnoreCase(body, "SUCCESS")){ task.setSendCount(task.getSendCount() + 1) .setLatestTime(sendTime) - .setSuccess(true);; + .setSuccess(true); record.setSuccess(true); // 如果为自动发送且延迟次数, 延迟次数也+1 if (autoSend && Objects.nonNull(task.getDelayCount())){ @@ -140,7 +143,7 @@ public class MerchantCallbackSendService { var taskOpt = taskManager.findById(taskId); if (taskOpt.isPresent()){ var task = taskOpt.get(); - paymentAssistService.initMchAndApp(task.getAppId()); + paymentAssistService.initMchAndApp(task.getMchNo(), task.getAppId()); this.sendData(task,false); } else { log.error("发送任务不存在,任务ID:{}",taskId); diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/callback/MerchantCallbackTaskService.java similarity index 63% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/callback/MerchantCallbackTaskService.java index 2c35cfe6..1d57aeed 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/callback/MerchantCallbackTaskService.java @@ -1,21 +1,17 @@ -package org.dromara.daxpay.service.service.notice.callback; +package org.dromara.daxpay.service.pay.service.notice.callback; import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.starter.redis.delay.service.DelayJobService; import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; -import org.dromara.daxpay.service.convert.order.pay.PayOrderConvert; -import org.dromara.daxpay.service.convert.order.refund.RefundOrderConvert; -import org.dromara.daxpay.service.convert.order.transfer.TransferOrderConvert; -import org.dromara.daxpay.service.dao.notice.callback.MerchantCallbackTaskManager; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackTask; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.convert.order.pay.PayOrderConvert; +import org.dromara.daxpay.service.pay.convert.order.refund.RefundOrderConvert; +import org.dromara.daxpay.service.pay.convert.order.transfer.TransferOrderConvert; +import org.dromara.daxpay.service.pay.dao.notice.callback.MerchantCallbackTaskManager; +import org.dromara.daxpay.service.pay.entity.notice.callback.MerchantCallbackTask; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -107,28 +103,4 @@ public class MerchantCallbackTaskService { log.info("注册转账通知"); } - /** - * 注册分账通知 - */ - public void registerAllocNotice(AllocOrder order, List details) { - // 判断是否需要进行通知 - if (StrUtil.isBlank(order.getNotifyUrl())){ - log.info("分账订单无需通知,订单号:{}",order.getAllocNo()); - return; - } - var noticeResult = AllocOrderConvert.CONVERT.toResult(order); - List detailResults = AllocOrderConvert.CONVERT.toList(details); - noticeResult.setDetails(detailResults); - var task = new MerchantCallbackTask() - // 时间序列化进行了重写, 所以使用Jackson的序列化工具类 - .setContent(JacksonUtil.toJson(noticeResult)) - .setTradeType(TradeTypeEnum.ALLOCATION.getCode()) - .setUrl(order.getNotifyUrl()) - .setSendCount(0) - .setTradeId(order.getId()) - .setTradeNo(order.getAllocNo()); - taskManager.save(task); - delayJobService.registerByTransaction(task.getId(), DaxPayCode.Event.MERCHANT_CALLBACK_SENDER, 0); - log.info("注册分账通知"); - } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyQueryService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/notify/MerchantNotifyQueryService.java similarity index 71% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyQueryService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/notify/MerchantNotifyQueryService.java index 12edf906..3f714764 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyQueryService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/notify/MerchantNotifyQueryService.java @@ -1,16 +1,16 @@ -package org.dromara.daxpay.service.service.notice.notify; +package org.dromara.daxpay.service.pay.service.notice.notify; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.service.dao.notice.notify.MerchantNotifyRecordManager; -import org.dromara.daxpay.service.dao.notice.notify.MerchantNotifyTaskManager; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyRecord; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyTask; -import org.dromara.daxpay.service.param.notice.notify.MerchantNotifyTaskQuery; -import org.dromara.daxpay.service.result.notice.notify.MerchantNotifyRecordResult; -import org.dromara.daxpay.service.result.notice.notify.MerchantNotifyTaskResult; +import org.dromara.daxpay.service.pay.dao.notice.notify.MerchantNotifyRecordManager; +import org.dromara.daxpay.service.pay.dao.notice.notify.MerchantNotifyTaskManager; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyRecord; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyTask; +import org.dromara.daxpay.service.pay.param.notice.notify.MerchantNotifyTaskQuery; +import org.dromara.daxpay.service.pay.result.notice.notify.MerchantNotifyRecordResult; +import org.dromara.daxpay.service.pay.result.notice.notify.MerchantNotifyTaskResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifySendService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/notify/MerchantNotifySendService.java similarity index 81% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifySendService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/notify/MerchantNotifySendService.java index fea3f38a..8637a22a 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifySendService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/notify/MerchantNotifySendService.java @@ -1,25 +1,25 @@ -package org.dromara.daxpay.service.service.notice.notify; +package org.dromara.daxpay.service.pay.service.notice.notify; import cn.bootx.platform.core.code.CommonCode; import cn.bootx.platform.core.util.JsonUtil; import cn.bootx.platform.starter.redis.delay.service.DelayJobService; -import cn.hutool.json.JSONUtil; import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; import org.dromara.daxpay.core.result.DaxNoticeResult; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.notice.notify.MerchantNotifyRecordManager; -import org.dromara.daxpay.service.dao.notice.notify.MerchantNotifyTaskManager; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyRecord; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyTask; -import org.dromara.daxpay.service.enums.NoticeSendTypeEnum; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.config.MerchantNotifyConfigService; -import org.dromara.daxpay.service.service.notice.MerchantNoticeAssistService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.notice.notify.MerchantNotifyRecordManager; +import org.dromara.daxpay.service.pay.dao.notice.notify.MerchantNotifyTaskManager; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyRecord; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyTask; +import org.dromara.daxpay.service.pay.enums.NoticeSendTypeEnum; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.merchant.service.config.MerchantNotifyConfigService; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeAssistService; import cn.hutool.core.util.StrUtil; import cn.hutool.http.ContentType; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; @@ -71,12 +71,13 @@ public class MerchantNotifySendService { try { // 构造通知消息并签名 var daxResult = new DaxNoticeResult>(SUCCESS_CODE, JSONUtil.parseObj(task.getContent()), SUCCESS_MSG) + .setMchNo(task.getMchNo()) .setAppId(task.getAppId()) .setNoticeType(task.getNotifyType()); + // 设置响应时间和追踪ID daxResult.setTraceId(MDC.get(CommonCode.TRACE_ID)); daxResult.setResTime(LocalDateTime.now()); paymentAssistService.sign(daxResult); - HttpResponse execute = HttpUtil.createPost(url) .body(JsonUtil.toJsonStr(daxResult), ContentType.JSON.getValue()) .timeout(5000) @@ -149,12 +150,12 @@ public class MerchantNotifySendService { var taskOpt = taskManager.findById(taskId); if (taskOpt.isPresent()){ var task = taskOpt.get(); - paymentAssistService.initMchAndApp(task.getAppId()); - var mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); + paymentAssistService.initMchAndApp(task.getMchNo(), task.getAppId()); + var reqInfo = PaymentContextLocal.get().getReqInfo(); // 判断通知方式是否为http并且订阅了该类型的通知 - boolean subscribe = notifyConfigService.getSubscribeByAppIdAndType(mchAppInfo.getAppId(), task.getNotifyType()); - if (Objects.equals(mchAppInfo.getNotifyType(), MerchantNotifyTypeEnum.HTTP.getCode()) && subscribe){ - this.sendData(task, mchAppInfo.getNotifyUrl(), LocalDateTime.now(), false); + boolean subscribe = notifyConfigService.getSubscribeByAppIdAndType(reqInfo.getAppId(), task.getNotifyType()); + if (Objects.equals(reqInfo.getNotifyType(), MerchantNotifyTypeEnum.HTTP.getCode()) && subscribe){ + this.sendData(task, reqInfo.getNotifyUrl(), LocalDateTime.now(), false); } else { log.info("商户消息通知未开启,任务ID:{}",taskId); } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/notify/MerchantNotifyTaskService.java similarity index 58% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/notify/MerchantNotifyTaskService.java index aa3bf892..ca4f546e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/notice/notify/MerchantNotifyTaskService.java @@ -1,31 +1,26 @@ -package org.dromara.daxpay.service.service.notice.notify; +package org.dromara.daxpay.service.pay.service.notice.notify; import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.starter.redis.delay.service.DelayJobService; -import org.dromara.daxpay.core.context.MchAppLocal; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; -import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; -import org.dromara.daxpay.service.convert.order.pay.PayOrderConvert; -import org.dromara.daxpay.service.convert.order.refund.RefundOrderConvert; -import org.dromara.daxpay.service.convert.order.transfer.TransferOrderConvert; -import org.dromara.daxpay.service.dao.notice.notify.MerchantNotifyTaskManager; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyTask; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.enums.NotifyContentTypeEnum; -import org.dromara.daxpay.service.service.config.MerchantNotifyConfigService; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.convert.order.pay.PayOrderConvert; +import org.dromara.daxpay.service.pay.convert.order.refund.RefundOrderConvert; +import org.dromara.daxpay.service.pay.convert.order.transfer.TransferOrderConvert; +import org.dromara.daxpay.service.pay.dao.notice.notify.MerchantNotifyTaskManager; +import org.dromara.daxpay.service.pay.entity.notice.notify.MerchantNotifyTask; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.enums.NotifyContentTypeEnum; +import org.dromara.daxpay.service.merchant.service.config.MerchantNotifyConfigService; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.List; import java.util.Objects; /** @@ -106,48 +101,25 @@ public class MerchantNotifyTaskService { } - /** - * 注册分账通知 - */ - public void registerAllocNotice(AllocOrder order, List details) { - if (this.nonRegister(NotifyContentTypeEnum.ALLOCATION)){ - log.info("分账无需回调,订单号:{}",order.getAllocNo()); - return; - } - var noticeResult = AllocOrderConvert.CONVERT.toResult(order); - List detailResults = AllocOrderConvert.CONVERT.toList(details); - noticeResult.setDetails(detailResults); - var task = new MerchantNotifyTask() - // 时间序列化进行了重写, 所以使用Jackson的序列化工具类 - .setContent(JacksonUtil.toJson(noticeResult)) - .setNotifyType(NotifyContentTypeEnum.ALLOCATION.getCode()) - .setSendCount(0) - .setTradeId(order.getId()) - .setTradeNo(order.getAllocNo()); - taskManager.save(task); - delayJobService.registerByTransaction(task.getId(), DaxPayCode.Event.MERCHANT_NOTIFY_SENDER, 0); - log.info("注册分账通知"); - } - /** * 判断是否 不需要注册通知 * true 不需要 * false 需要 */ private boolean nonRegister(NotifyContentTypeEnum notifyType) { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); // 判断是否开启消息通知功能, 不需要注册通知 - if (!Objects.equals(mchAppInfo.getNotifyType(), MerchantNotifyTypeEnum.HTTP.getCode())){ + if (!Objects.equals(reqInfo.getNotifyType(), MerchantNotifyTypeEnum.HTTP.getCode())){ return true; } // http方式且地址 - if (StrUtil.isBlank(mchAppInfo.getNotifyUrl())){ + if (StrUtil.isBlank(reqInfo.getNotifyUrl())){ return true; } // 判断是否订阅该类型的通知 - return !notifyConfigService.getSubscribeByAppIdAndType(mchAppInfo.getAppId(), notifyType.getCode()); + return !notifyConfigService.getSubscribeByAppIdAndType(reqInfo.getAppId(), notifyType.getCode()); } } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderQueryService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/pay/PayOrderQueryService.java similarity index 68% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderQueryService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/pay/PayOrderQueryService.java index 21c4aec8..538676ee 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderQueryService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/pay/PayOrderQueryService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.order.pay; +package org.dromara.daxpay.service.pay.service.order.pay; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.ValidationFailedException; @@ -7,11 +7,14 @@ import cn.bootx.platform.core.rest.result.PageResult; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.trade.pay.QueryPayParam; import org.dromara.daxpay.core.result.trade.pay.PayOrderResult; -import org.dromara.daxpay.service.convert.order.pay.PayOrderConvert; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.param.order.pay.PayOrderQuery; -import org.dromara.daxpay.service.result.order.pay.PayOrderVo; +import org.dromara.daxpay.service.pay.convert.order.pay.PayOrderConvert; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderExpandManager; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrderExpand; +import org.dromara.daxpay.service.pay.param.order.pay.PayOrderQuery; +import org.dromara.daxpay.service.pay.result.order.pay.PayOrderExpandResult; +import org.dromara.daxpay.service.pay.result.order.pay.PayOrderVo; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -32,6 +35,7 @@ import java.util.Optional; @RequiredArgsConstructor public class PayOrderQueryService { private final PayOrderManager payOrderManager; + private final PayOrderExpandManager payOrderExpandManager; /** * 分页 @@ -48,6 +52,15 @@ public class PayOrderQueryService { return payOrderManager.findById(orderId); } + /** + * 根据ID查询订单扩展参数 + */ + public PayOrderExpandResult findExpandByById(Long id){ + return payOrderExpandManager.findById(id) + .map(PayOrderExpand::toResult) + .orElse(new PayOrderExpandResult()); + } + /** * 根据订单号查询 */ @@ -86,11 +99,25 @@ public class PayOrderQueryService { return payOrderManager.findByBizOrderNo(bizOrderNo,appId); } if (Objects.nonNull(outOrderNo)){ - return payOrderManager.findByBizOrderNo(outOrderNo,appId); + return payOrderManager.findByOutOrderNo(outOrderNo,appId); } return Optional.empty(); } + /** + * 根据订单号或商户订单号查询 平台 > 商户 > 通道 如果不存在使用下一种查询方式 + */ + public Optional findAnyOrderNo(String orderNo, String appId) { + Optional optional = payOrderManager.findByOrderNo(orderNo, appId); + if (optional.isEmpty()){ + optional = payOrderManager.findByBizOrderNo(orderNo,appId); + } + if (optional.isEmpty()){ + optional = payOrderManager.findByOutOrderNo(orderNo,appId); + } + return optional; + } + /** * 查询支付记录 */ diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/pay/PayOrderService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/pay/PayOrderService.java new file mode 100644 index 00000000..d28b15d4 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/pay/PayOrderService.java @@ -0,0 +1,58 @@ +package org.dromara.daxpay.service.pay.service.order.pay; + +import org.dromara.daxpay.core.exception.TradeNotExistException; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.pay.PayCloseService; +import org.dromara.daxpay.service.pay.service.trade.pay.PaySyncService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 支付订单服务 + * @author xxm + * @since 2023/12/18 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PayOrderService { + private final PayOrderManager payOrderManager; + private final PaySyncService paySyncService; + + private final PaymentAssistService paymentAssistService; + private final PayCloseService payCloseService; + + /** + * 同步 + */ + public void sync(Long id) { + PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); + // 初始化商户和应用 + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); + paySyncService.syncPayOrder(payOrder); + } + + /** + * 关闭订单 + */ + public void close(Long id) { + PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); + // 初始化商户和应用 + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); + payCloseService.closeOrder(payOrder,false); + } + + /** + * 撤销订单 + */ + public void cancel(Long id) { + PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); + // 初始化商户和应用 + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); + payCloseService.closeOrder(payOrder,true); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/refund/RefundOrderQueryService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/refund/RefundOrderQueryService.java similarity index 87% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/refund/RefundOrderQueryService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/refund/RefundOrderQueryService.java index 12955829..2612f44e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/refund/RefundOrderQueryService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/refund/RefundOrderQueryService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.order.refund; +package org.dromara.daxpay.service.pay.service.order.refund; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; @@ -8,11 +8,11 @@ import cn.bootx.platform.core.rest.result.PageResult; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.trade.refund.QueryRefundParam; import org.dromara.daxpay.core.result.trade.refund.RefundOrderResult; -import org.dromara.daxpay.service.convert.order.refund.RefundOrderConvert; -import org.dromara.daxpay.service.dao.order.refund.RefundOrderManager; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.param.order.refund.RefundOrderQuery; -import org.dromara.daxpay.service.result.order.refund.RefundOrderVo; +import org.dromara.daxpay.service.pay.convert.order.refund.RefundOrderConvert; +import org.dromara.daxpay.service.pay.dao.order.refund.RefundOrderManager; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.param.order.refund.RefundOrderQuery; +import org.dromara.daxpay.service.pay.result.order.refund.RefundOrderVo; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/refund/RefundOrderService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/refund/RefundOrderService.java similarity index 77% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/refund/RefundOrderService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/refund/RefundOrderService.java index 575d3334..5d0b80f3 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/refund/RefundOrderService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/refund/RefundOrderService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.order.refund; +package org.dromara.daxpay.service.pay.service.order.refund; import cn.bootx.platform.common.spring.util.WebServletUtil; import org.dromara.daxpay.core.enums.RefundStatusEnum; @@ -7,14 +7,14 @@ import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.core.param.trade.refund.RefundParam; import org.dromara.daxpay.core.result.trade.refund.RefundResult; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.dao.order.refund.RefundOrderManager; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.param.order.refund.RefundCreateParam; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.trade.refund.RefundAssistService; -import org.dromara.daxpay.service.service.trade.refund.RefundService; -import org.dromara.daxpay.service.service.trade.refund.RefundSyncService; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.dao.order.refund.RefundOrderManager; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.param.order.refund.RefundCreateParam; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundAssistService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundService; +import org.dromara.daxpay.service.pay.service.trade.refund.RefundSyncService; import cn.hutool.extra.servlet.JakartaServletUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -56,7 +56,7 @@ public class RefundOrderService { .orElseThrow(() -> new TradeNotExistException("支付订单不存在")); // 初始化商户和应用 - paymentAssistService.initMchAndApp(payOrder.getAppId()); + paymentAssistService.initMchAndApp(payOrder.getMchNo(),payOrder.getAppId()); String ip = Optional.ofNullable(WebServletUtil.getRequest()) .map(JakartaServletUtil::getClientIP) @@ -64,6 +64,7 @@ public class RefundOrderService { // 构建退款参数并发起 var refundParam = new RefundParam(); + refundParam.setMchNo(payOrder.getMchNo()); refundParam.setAppId(payOrder.getAppId()); refundParam.setClientIp(ip); refundParam.setReqTime(LocalDateTime.now()); @@ -81,7 +82,7 @@ public class RefundOrderService { RefundOrder refundOrder = refundOrderManager.findById(id) .orElseThrow(() -> new TradeNotExistException("退款订单不存在")); // 初始化商户和应用 - paymentAssistService.initMchAndApp(refundOrder.getAppId()); + paymentAssistService.initMchAndApp(refundOrder.getMchNo(),refundOrder.getAppId()); // 同步退款订单状态 refundSyncService.syncRefundOrder(refundOrder); } @@ -93,7 +94,7 @@ public class RefundOrderService { RefundOrder refundOrder = refundOrderManager.findById(id) .orElseThrow(() -> new TradeNotExistException("退款订单不存在")); // 初始化商户和应用 - paymentAssistService.initMchAndApp(refundOrder.getAppId()); + paymentAssistService.initMchAndApp(refundOrder.getMchNo(),refundOrder.getAppId()); String ip = Optional.ofNullable(WebServletUtil.getRequest()) .map(JakartaServletUtil::getClientIP) @@ -101,6 +102,7 @@ public class RefundOrderService { // 构建退款参数并发起 var refundParam = new RefundParam(); + refundParam.setMchNo(refundOrder.getMchNo()); refundParam.setAppId(refundOrder.getAppId()); refundParam.setClientIp(ip); refundParam.setReqTime(LocalDateTime.now()); @@ -118,7 +120,7 @@ public class RefundOrderService { RefundOrder refundOrder = refundOrderManager.findById(id) .orElseThrow(() -> new TradeNotExistException("退款订单不存在")); // 初始化商户和应用 - paymentAssistService.initMchAndApp(refundOrder.getAppId()); + paymentAssistService.initMchAndApp(refundOrder.getMchNo(),refundOrder.getAppId()); if (!Objects.equals(refundOrder.getStatus(), RefundStatusEnum.FAIL.getCode())) { throw new TradeStatusErrorException("只有失败状态的才可以关闭退款"); } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/transfer/TransferOrderQueryService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/transfer/TransferOrderQueryService.java similarity index 87% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/transfer/TransferOrderQueryService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/transfer/TransferOrderQueryService.java index 1e22e32f..3f1693d3 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/transfer/TransferOrderQueryService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/transfer/TransferOrderQueryService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.order.transfer; +package org.dromara.daxpay.service.pay.service.order.transfer; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; @@ -8,11 +8,11 @@ import cn.bootx.platform.core.rest.result.PageResult; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.trade.transfer.QueryTransferParam; import org.dromara.daxpay.core.result.trade.transfer.TransferOrderResult; -import org.dromara.daxpay.service.convert.order.transfer.TransferOrderConvert; -import org.dromara.daxpay.service.dao.order.transfer.TransferOrderManager; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.param.order.transfer.TransferOrderQuery; -import org.dromara.daxpay.service.result.order.transfer.TransferOrderVo; +import org.dromara.daxpay.service.pay.convert.order.transfer.TransferOrderConvert; +import org.dromara.daxpay.service.pay.dao.order.transfer.TransferOrderManager; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.param.order.transfer.TransferOrderQuery; +import org.dromara.daxpay.service.pay.result.order.transfer.TransferOrderVo; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/transfer/TransferOrderService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/transfer/TransferOrderService.java similarity index 77% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/transfer/TransferOrderService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/transfer/TransferOrderService.java index 4379d61d..0ff61568 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/transfer/TransferOrderService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/order/transfer/TransferOrderService.java @@ -1,15 +1,15 @@ -package org.dromara.daxpay.service.service.order.transfer; +package org.dromara.daxpay.service.pay.service.order.transfer; import cn.bootx.platform.common.spring.util.WebServletUtil; import org.dromara.daxpay.core.enums.TransferStatusEnum; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.exception.TradeProcessingException; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; -import org.dromara.daxpay.service.dao.order.transfer.TransferOrderManager; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.trade.transfer.TransferAssistService; -import org.dromara.daxpay.service.service.trade.transfer.TransferService; -import org.dromara.daxpay.service.service.trade.transfer.TransferSyncService; +import org.dromara.daxpay.service.pay.dao.order.transfer.TransferOrderManager; +import org.dromara.daxpay.service.pay.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferAssistService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferService; +import org.dromara.daxpay.service.pay.service.trade.transfer.TransferSyncService; import cn.hutool.extra.servlet.JakartaServletUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -42,7 +42,7 @@ public class TransferOrderService { var transferOrder = transferOrderManager.findById(id) .orElseThrow(() -> new TradeNotExistException("转账订单不存在")); // 初始化商户和应用 - paymentAssistService.initMchAndApp(transferOrder.getAppId()); + paymentAssistService.initMchAndApp(transferOrder.getMchNo(),transferOrder.getAppId()); // 同步转账订单状态 transferSyncService.syncTransferOrder(transferOrder); } @@ -54,7 +54,7 @@ public class TransferOrderService { var transferOrder = transferOrderManager.findById(id) .orElseThrow(() -> new TradeNotExistException("转账订单不存在")); // 初始化商户和应用 - paymentAssistService.initMchAndApp(transferOrder.getAppId()); + paymentAssistService.initMchAndApp(transferOrder.getMchNo(),transferOrder.getAppId()); String ip = Optional.ofNullable(WebServletUtil.getRequest()) .map(JakartaServletUtil::getClientIP) @@ -62,6 +62,7 @@ public class TransferOrderService { // 构建转账参数并发起 var transferParam = new TransferParam(); + transferParam.setMchNo(transferOrder.getMchNo()); transferParam.setAppId(transferOrder.getAppId()); transferParam.setClientIp(ip); transferParam.setReqTime(LocalDateTime.now()); @@ -78,7 +79,7 @@ public class TransferOrderService { var transferOrder = transferOrderManager.findById(id) .orElseThrow(() -> new TradeNotExistException("转账订单不存在")); // 初始化商户和应用 - paymentAssistService.initMchAndApp(transferOrder.getAppId()); + paymentAssistService.initMchAndApp(transferOrder.getMchNo(),transferOrder.getAppId()); // 更新订单状态 if (!Objects.equals(TransferStatusEnum.FAIL.getCode(), transferOrder.getStatus())){ throw new TradeProcessingException("只有失败状态的才可以关闭"); diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/callback/TradeCallbackRecordService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/callback/TradeCallbackRecordService.java similarity index 81% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/callback/TradeCallbackRecordService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/callback/TradeCallbackRecordService.java index 92adbd2f..d8590159 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/callback/TradeCallbackRecordService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/callback/TradeCallbackRecordService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.record.callback; +package org.dromara.daxpay.service.pay.service.record.callback; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; @@ -6,11 +6,11 @@ import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.util.JsonUtil; import org.dromara.daxpay.core.context.CallbackLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.record.callback.TradeCallbackRecordManager; -import org.dromara.daxpay.service.entity.record.callback.TradeCallbackRecord; -import org.dromara.daxpay.service.param.record.TradeCallbackRecordQuery; -import org.dromara.daxpay.service.result.record.callback.TradeCallbackRecordResult; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.record.callback.TradeCallbackRecordManager; +import org.dromara.daxpay.service.pay.entity.record.callback.TradeCallbackRecord; +import org.dromara.daxpay.service.pay.param.record.TradeCallbackRecordQuery; +import org.dromara.daxpay.service.pay.result.record.callback.TradeCallbackRecordResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -18,7 +18,7 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** - * + * 交易回调记录服务 * @author xxm * @since 2024/7/22 */ diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/close/PayCloseRecordService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/close/PayCloseRecordService.java similarity index 78% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/close/PayCloseRecordService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/close/PayCloseRecordService.java index e99752a8..294f1190 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/close/PayCloseRecordService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/close/PayCloseRecordService.java @@ -1,13 +1,13 @@ -package org.dromara.daxpay.service.service.record.close; +package org.dromara.daxpay.service.pay.service.record.close; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.service.dao.record.close.PayCloseRecordManager; -import org.dromara.daxpay.service.entity.record.close.PayCloseRecord; -import org.dromara.daxpay.service.param.record.PayCloseRecordQuery; -import org.dromara.daxpay.service.result.record.close.PayCloseRecordResult; +import org.dromara.daxpay.service.pay.dao.record.close.PayCloseRecordManager; +import org.dromara.daxpay.service.pay.entity.record.close.PayCloseRecord; +import org.dromara.daxpay.service.pay.param.record.PayCloseRecordQuery; +import org.dromara.daxpay.service.pay.result.record.close.PayCloseRecordResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/flow/TradeFlowRecordService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/flow/TradeFlowRecordService.java similarity index 84% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/flow/TradeFlowRecordService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/flow/TradeFlowRecordService.java index 507ab0a7..c7d5e0d2 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/flow/TradeFlowRecordService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/flow/TradeFlowRecordService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.record.flow; +package org.dromara.daxpay.service.pay.service.record.flow; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; @@ -6,14 +6,14 @@ import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import org.dromara.daxpay.core.enums.TradeFlowTypeEnum; import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.service.dao.record.flow.TradeFlowRecordManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.entity.record.flow.TradeFlowRecord; -import org.dromara.daxpay.service.param.record.TradeFlowRecordQuery; -import org.dromara.daxpay.service.result.record.flow.TradeFlowAmountResult; -import org.dromara.daxpay.service.result.record.flow.TradeFlowRecordResult; +import org.dromara.daxpay.service.pay.dao.record.flow.TradeFlowRecordManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.entity.record.flow.TradeFlowRecord; +import org.dromara.daxpay.service.pay.param.record.TradeFlowRecordQuery; +import org.dromara.daxpay.service.pay.result.record.flow.TradeFlowAmountResult; +import org.dromara.daxpay.service.pay.result.record.flow.TradeFlowRecordResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/sync/TradeSyncRecordService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/sync/TradeSyncRecordService.java similarity index 80% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/sync/TradeSyncRecordService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/sync/TradeSyncRecordService.java index e80ca3ec..63296523 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/record/sync/TradeSyncRecordService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/record/sync/TradeSyncRecordService.java @@ -1,13 +1,13 @@ -package org.dromara.daxpay.service.service.record.sync; +package org.dromara.daxpay.service.pay.service.record.sync; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.service.dao.record.sync.TradeSyncRecordManager; -import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; -import org.dromara.daxpay.service.param.record.TradeSyncRecordQuery; -import org.dromara.daxpay.service.result.record.sync.TradeSyncRecordResult; +import org.dromara.daxpay.service.pay.dao.record.sync.TradeSyncRecordManager; +import org.dromara.daxpay.service.pay.entity.record.sync.TradeSyncRecord; +import org.dromara.daxpay.service.pay.param.record.TradeSyncRecordQuery; +import org.dromara.daxpay.service.pay.result.record.sync.TradeSyncRecordResult; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/report/IndexTradeReportService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/report/IndexTradeReportService.java new file mode 100644 index 00000000..b0ca97bb --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/report/IndexTradeReportService.java @@ -0,0 +1,209 @@ +package org.dromara.daxpay.service.pay.service.report; + +import cn.bootx.platform.baseapi.service.dict.DictionaryItemService; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.service.merchant.dao.info.MerchantManager; +import org.dromara.daxpay.service.pay.dao.report.IndexTradeReportMapper; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.param.report.TradeReportQuery; +import org.dromara.daxpay.service.pay.result.report.MerchantReportResult; +import org.dromara.daxpay.service.pay.result.report.TradeReportResult; +import org.dromara.daxpay.service.pay.result.report.TradeStatisticsReport; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 交易类报表 + * @author xxm + * @since 2024/11/16 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class IndexTradeReportService { + private final IndexTradeReportMapper tradeReportMapper; + private final MerchantManager merchantManager; + private final DictionaryItemService dictionaryItemService; + + /** + * 支付交易统计: 笔数, 金额 + */ + public TradeReportResult pryTradeReport(TradeReportQuery query){ + QueryWrapper param = new QueryWrapper<>(); + // 获取开始时间和结束时间 + var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); + var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); + + param.between(MpUtil.getColumnName(PayOrder::getPayTime), startTime, endTime) + .eq(Objects.nonNull(query.getAppId()), MpUtil.getColumnName(PayOrder::getAppId), query.getAppId()) + .eq(MpUtil.getColumnName(PayOrder::getStatus), PayStatusEnum.SUCCESS.getCode()); + return tradeReportMapper.payTradeReport(param); + } + + /** + * 退款交易统计: 笔数, 金额 + */ + public TradeReportResult refundTradeReport(TradeReportQuery query){ + QueryWrapper param = new QueryWrapper<>(); + // 获取开始时间和结束时间 + var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); + var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); + + param.between(MpUtil.getColumnName(RefundOrder::getFinishTime),startTime, endTime) + .eq(Objects.nonNull(query.getMchNo()), MpUtil.getColumnName(RefundOrder::getMchNo), query.getMchNo()) + .eq(Objects.nonNull(query.getAppId()), MpUtil.getColumnName(RefundOrder::getAppId), query.getAppId()) + .eq(MpUtil.getColumnName(RefundOrder::getStatus), RefundStatusEnum.SUCCESS.getCode()); + return tradeReportMapper.refundTradeReport(param); + } + + /** + * 支付通道统计 + */ + public List payChannelReport(TradeReportQuery query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 获取开始时间和结束时间 + var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); + var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); + + queryWrapper.between(MpUtil.getColumnName(PayOrder::getPayTime),startTime, endTime) + .eq(Objects.nonNull(query.getMchNo()), MpUtil.getColumnName(PayOrder::getMchNo), query.getMchNo()) + .eq(Objects.nonNull(query.getAppId()), MpUtil.getColumnName(PayOrder::getAppId), query.getAppId()) + .eq(MpUtil.getColumnName(PayOrder::getStatus), PayStatusEnum.SUCCESS.getCode()) + .groupBy(MpUtil.getColumnName(PayOrder::getChannel)); + var list = tradeReportMapper.payChannelReport(queryWrapper); + var dictMap = dictionaryItemService.findEnableByDictCode("channel"); + list.forEach(item -> item.setTitle(dictMap.get(item.getTitle()))); + return list; + } + + /** + * 退款通道统计 + */ + public List refundChannelReport(TradeReportQuery query){ + QueryWrapper param = new QueryWrapper<>(); + // 获取开始时间和结束时间 + var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); + var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); + + param.between(MpUtil.getColumnName(RefundOrder::getFinishTime),startTime, endTime) + .groupBy(MpUtil.getColumnName(RefundOrder::getChannel)) + .eq(Objects.nonNull(query.getMchNo()), MpUtil.getColumnName(RefundOrder::getMchNo), query.getMchNo()) + .eq(Objects.nonNull(query.getAppId()), MpUtil.getColumnName(RefundOrder::getAppId), query.getAppId()) + .eq(MpUtil.getColumnName(RefundOrder::getStatus), RefundStatusEnum.SUCCESS.getCode()); + + var list = tradeReportMapper.refundChannelReport(param); + var dictMap = dictionaryItemService.findEnableByDictCode("channel"); + list.forEach(item -> item.setTitle(dictMap.get(item.getTitle()))); + return list; + } + + /** + * 支付方式统计 + */ + public List payMethodReport(TradeReportQuery query){ + QueryWrapper param = new QueryWrapper<>(); + // 获取开始时间和结束时间 + var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); + var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); + + param.between(MpUtil.getColumnName(PayOrder::getPayTime),startTime, endTime) + .eq(MpUtil.getColumnName(PayOrder::getStatus), PayStatusEnum.SUCCESS.getCode()) + .eq(Objects.nonNull(query.getMchNo()), MpUtil.getColumnName(PayOrder::getMchNo), query.getMchNo()) + .eq(Objects.nonNull(query.getAppId()), MpUtil.getColumnName(PayOrder::getAppId), query.getAppId()) + .groupBy(MpUtil.getColumnName(PayOrder::getMethod)); + var list = tradeReportMapper.payMethodReport(param); + var dictMap = dictionaryItemService.findEnableByDictCode("pay_method"); + list.forEach(item -> item.setTitle(dictMap.get(item.getTitle()))); + return list; + } + + + /** + * 商户类型数量分类 + */ + public MerchantReportResult merchantCount(TradeReportQuery query) { + var result = new MerchantReportResult(); + // 商户数量 + Long commonCount = merchantManager.lambdaQuery() + .count(); + // APP数量 + Long commonAppCount = merchantManager.lambdaQuery() + .count(); + result.setNormalCount(commonCount.intValue()) + .setNormalAppCount(commonAppCount.intValue()); + return result; + } + + /** + * 交易统计信息 + */ + public List tradeStatistics(TradeReportQuery query){ + // 获取开始时间和结束时间 + var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); + var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); + // 查询支付金额和笔数 + QueryWrapper payQueryWrapper = new QueryWrapper<>(); + QueryWrapper refundQueryWrapper = new QueryWrapper<>(); + payQueryWrapper.between(MpUtil.getColumnName(PayOrder::getPayTime),startTime, endTime) + .eq(MpUtil.getColumnName(PayOrder::getStatus), PayStatusEnum.SUCCESS.getCode()) + .eq(Objects.nonNull(query.getMchNo()), MpUtil.getColumnName(PayOrder::getMchNo), query.getMchNo()) + .eq(Objects.nonNull(query.getAppId()), MpUtil.getColumnName(PayOrder::getAppId), query.getAppId()); + refundQueryWrapper.between(MpUtil.getColumnName(RefundOrder::getFinishTime),startTime, endTime) + .eq(MpUtil.getColumnName(RefundOrder::getStatus), RefundStatusEnum.SUCCESS.getCode()) + .eq(Objects.nonNull(query.getMchNo()), MpUtil.getColumnName(RefundOrder::getMchNo), query.getMchNo()) + .eq(Objects.nonNull(query.getAppId()), MpUtil.getColumnName(RefundOrder::getAppId), query.getAppId()); + // 判断pg还是Mysql, 使用不同的SQL语法 + String payFiled, refundFiled; + if (MpUtil.getDbType().equalsIgnoreCase("mysql")){ + payFiled = "DATE("+MpUtil.getColumnName(PayOrder::getPayTime)+")"; + refundFiled = "DATE("+MpUtil.getColumnName(RefundOrder::getFinishTime)+")"; + payQueryWrapper.groupBy(payFiled); + refundQueryWrapper.groupBy(refundFiled); + } else { + payFiled = "CAST("+MpUtil.getColumnName(PayOrder::getPayTime)+" AS DATE)"; + refundFiled = "CAST("+MpUtil.getColumnName(RefundOrder::getFinishTime)+" AS DATE)"; + payQueryWrapper.groupBy(payFiled); + refundQueryWrapper.groupBy(refundFiled); + } + var payList = tradeReportMapper.payTradeStatistics(payQueryWrapper, payFiled); + var refundList = tradeReportMapper.refundTradeStatistics(refundQueryWrapper, refundFiled ); + Map payMap = payList.stream() + .collect(Collectors.toMap(TradeReportResult::getTime, Function.identity())); + Map refundMap = refundList.stream() + .collect(Collectors.toMap(TradeReportResult::getTime, Function.identity())); + + // 根据开始和结束时间生成改时间段的对象 + int daysBetween = Math.toIntExact(ChronoUnit.DAYS.between(query.getStartDate(), query.getEndDate().plusDays(1))); + List list = new ArrayList<>(daysBetween); + for (long i = 0; i < daysBetween; i++) { + var tradeStatistics = new TradeStatisticsReport() + .setLocalDate(query.getStartDate().plusDays(i)); + // 获取支付金额和笔数 + var pay = payMap.get(LocalDateTimeUtil.format(tradeStatistics.getLocalDate(), DatePattern.NORM_DATE_PATTERN)); + tradeStatistics.setPayAmount(pay == null ? BigDecimal.valueOf(0) : pay.getTradeAmount()) + .setPayCount(pay == null ? 0 : pay.getTradeCount()); + // 获取退款金额和笔数 + var refund = refundMap.get(LocalDateTimeUtil.format(tradeStatistics.getLocalDate(), DatePattern.NORM_DATE_PATTERN)); + tradeStatistics.setRefundAmount(refund == null ? BigDecimal.valueOf(0) : refund.getTradeAmount()) + .setRefundCount(refund == null ? 0 : refund.getTradeCount()); + list.add(tradeStatistics); + } + return list; + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayAssistService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayAssistService.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayAssistService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayAssistService.java index 53dba847..74e0e7e2 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayAssistService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayAssistService.java @@ -1,26 +1,27 @@ -package org.dromara.daxpay.service.service.trade.pay; +package org.dromara.daxpay.service.pay.service.trade.pay; +import cn.bootx.platform.core.annotation.IgnoreTenant; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; import cn.bootx.platform.core.util.DateTimeUtil; import cn.bootx.platform.starter.redis.delay.service.DelayJobService; -import org.dromara.daxpay.core.context.MchAppLocal; -import org.dromara.daxpay.core.enums.PayAllocStatusEnum; -import org.dromara.daxpay.core.enums.PayRefundStatusEnum; -import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; +import org.dromara.daxpay.core.enums.*; import org.dromara.daxpay.core.exception.AmountExceedLimitException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderExpandManager; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrderExpand; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.order.pay.PayOrderQueryService; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; @@ -49,6 +50,7 @@ public class PayAssistService { private final DelayJobService delayJobService; private final MerchantNoticeService merchantNoticeService; private final PayCloseService payCloseService; + private final PayOrderExpandManager payOrderExpandManager; /** * 创建支付订单并保存, 返回支付订单 @@ -70,6 +72,10 @@ public class PayAssistService { order.setAllocStatus(PayAllocStatusEnum.WAITING.getCode()); } payOrderManager.save(order); + // 保存订单扩展信息 + var orderExpand = new PayOrderExpand(); + orderExpand.setId(order.getId()); + payOrderExpandManager.save(orderExpand); // 注册支付超时任务 delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.ORDER_PAY_TIMEOUT, order.getExpiredTime()); return order; @@ -90,6 +96,7 @@ public class PayAssistService { /** * 失败处理 */ + @IgnoreTenant public void fail(PayOrder payOrder, String errMsg){ // 执行策略的关闭方法 payOrder.setStatus(PayStatusEnum.FAIL.getCode()) @@ -97,7 +104,6 @@ public class PayAssistService { .setCloseTime(LocalDateTime.now()); payOrderManager.updateById(payOrder); merchantNoticeService.registerPayNotice(payOrder); - } /** @@ -146,7 +152,7 @@ public class PayAssistService { PayStatusEnum.CLOSE.getCode(), PayStatusEnum.CANCEL.getCode()); if (tradesStatus.contains(payOrder.getStatus())) { - throw new TradeStatusErrorException("支付失败或已经被关闭"); + throw new TradeStatusErrorException("该订单支付失败或已经被关闭"); } // 退款类型状态 if (Objects.equals(payOrder.getRefundStatus(), PayRefundStatusEnum.REFUNDING.getCode())) { @@ -160,9 +166,9 @@ public class PayAssistService { * 检验订单是否超过限额 */ public void validationLimitAmount(BigDecimal amount) { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); // 总额校验 - if (BigDecimalUtil.isGreaterThan(amount,mchAppInfo.getLimitAmount())) { + if (BigDecimalUtil.isGreaterThan(amount,reqInfo.getLimitAmount())) { throw new AmountExceedLimitException("支付金额超过限额"); } } @@ -191,13 +197,13 @@ public class PayAssistService { * 获取支付订单超时时间, 后续会根据各通道调整订单的超时时间 */ public LocalDateTime getExpiredTime(LocalDateTime expiredTime) { - MchAppLocal mchAppLocal = PaymentContextLocal.get().getMchAppInfo(); + PaymentReqInfoLocal reqInfoLocal = PaymentContextLocal.get().getReqInfo(); // 参数传入 if (Objects.nonNull(expiredTime)) { return expiredTime; } // 根据商户应用配置计算出时间 - return PayUtil.getPaymentExpiredTime(mchAppLocal.getOrderTimeout()); + return PayUtil.getPaymentExpiredTime(reqInfoLocal.getOrderTimeout()); } /** diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayCallbackService.java similarity index 77% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayCallbackService.java index ae73dd6c..679dca06 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayCallbackService.java @@ -1,23 +1,28 @@ -package org.dromara.daxpay.service.service.trade.pay; +package org.dromara.daxpay.service.pay.service.trade.pay; import cn.bootx.platform.core.util.DateTimeUtil; import org.dromara.daxpay.core.context.CallbackLocal; -import org.dromara.daxpay.core.context.MchAppLocal; +import org.dromara.daxpay.core.context.PaymentReqInfoLocal; import org.dromara.daxpay.core.enums.CallbackStatusEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.allocation.AllocationService; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; -import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.core.exception.DataErrorException; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderExpandManager; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrderExpand; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.order.pay.PayOrderQueryService; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Opt; import cn.hutool.core.util.StrUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.Objects; @@ -43,11 +48,12 @@ public class PayCallbackService { private final MerchantNoticeService merchantNoticeService; - private final AllocationService allocationService; + private final PayOrderExpandManager payOrderExpandManager; /** * 支付统一回调处理 */ + @Transactional(rollbackFor = Exception.class) public void payCallback() { var callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 加锁 @@ -58,12 +64,12 @@ public class PayCallbackService { return; } try { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); + PaymentReqInfoLocal reqInfo = PaymentContextLocal.get().getReqInfo(); // 首先使用本地订单号进行查询 - var payOrder = payOrderQueryService.findByOrderNo(callbackInfo.getTradeNo(),mchAppInfo.getAppId()).orElse(null); + var payOrder = payOrderQueryService.findByOrderNo(callbackInfo.getTradeNo(),reqInfo.getAppId()).orElse(null); if (Objects.isNull(payOrder)){ // 使用通道订单号获取支付单 - payOrder = payOrderQueryService.findByOutOrderNo(callbackInfo.getOutTradeNo(),mchAppInfo.getAppId()).orElse(null); + payOrder = payOrderQueryService.findByOutOrderNo(callbackInfo.getOutTradeNo(),reqInfo.getAppId()).orElse(null); } // 本地支付单不存在,记录回调记录, TODO 需要补单或进行退款 if (Objects.isNull(payOrder)) { @@ -111,13 +117,17 @@ public class PayCallbackService { } // 修改订单支付状态为成功 payOrder.setStatus(PayStatusEnum.SUCCESS.getCode()) + .setRealAmount(Opt.ofNullable(callbackInfo.getRealAmount()).orElse(payOrder.getAmount())) .setPayTime(callbackInfo.getFinishTime()) .setOutOrderNo(callbackInfo.getOutTradeNo()) .setCloseTime(null); + // 保存附加参数到订单 + PayOrderExpand orderExpand = payOrderExpandManager.findById(payOrder.getId()).orElseThrow(() -> new DataErrorException("支付订单扩展信息不存在")); + BeanUtil.copyProperties(callbackInfo,orderExpand); payOrderManager.updateById(payOrder); + payOrderExpandManager.updateById(orderExpand); tradeFlowRecordService.savePay(payOrder); merchantNoticeService.registerPayNotice(payOrder); - allocationService.registerAutoAlloc(payOrder); } /** @@ -136,7 +146,6 @@ public class PayCallbackService { return; } // 执行支付关闭的调整逻辑 - // 执行策略的关闭方法 payOrder.setStatus(PayStatusEnum.CLOSE.getCode()) .setErrorMsg(callbackInfo.getTradeErrorMsg()) .setCloseTime(LocalDateTime.now()); diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCloseService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayCloseService.java similarity index 87% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCloseService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayCloseService.java index ee149b4a..78f2ee8c 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCloseService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayCloseService.java @@ -1,19 +1,19 @@ -package org.dromara.daxpay.service.service.trade.pay; +package org.dromara.daxpay.service.pay.service.trade.pay; import cn.bootx.platform.core.exception.ValidationFailedException; import org.dromara.daxpay.core.enums.CloseTypeEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.exception.*; import org.dromara.daxpay.core.param.trade.pay.PayCloseParam; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.record.close.PayCloseRecord; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; -import org.dromara.daxpay.service.service.record.close.PayCloseRecordService; -import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.record.close.PayCloseRecord; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.order.pay.PayOrderQueryService; +import org.dromara.daxpay.service.pay.service.record.close.PayCloseRecordService; +import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; import cn.hutool.core.util.StrUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayService.java similarity index 78% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayService.java index 60af109c..7eb5918d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PayService.java @@ -1,18 +1,22 @@ -package org.dromara.daxpay.service.service.trade.pay; +package org.dromara.daxpay.service.pay.service.trade.pay; import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.exception.PayFailureException; import org.dromara.daxpay.core.exception.TradeProcessingException; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.trade.pay.PayResult; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.allocation.AllocationService; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; -import org.dromara.daxpay.service.strategy.AbsPayStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderExpandManager; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrderExpand; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.service.pay.strategy.AbsPayStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Opt; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; @@ -39,7 +43,7 @@ public class PayService { private final PayOrderManager payOrderManager; private final TradeFlowRecordService tradeFlowRecordService; private final MerchantNoticeService merchantNoticeService; - private final AllocationService allocationService; + private final PayOrderExpandManager payOrderExpandManager; /** * 支付入口 @@ -81,7 +85,7 @@ public class PayService { payStrategy.setPayParam(payParam); // 执行支付前处理动作, 进行各种校验, 校验通过才会进行下面的操作 payStrategy.doBeforePayHandler(); - // 订单不存在执行支付前的保存动作, 保存支付订单和扩展记录, 默认状态为支付中 + // 订单不存在执行支付前的保存动作, 保存支付订单默认状态为支付中 if (Objects.isNull(payOrder)){ payOrder = payAssistService.createPayOrder(payParam); } @@ -121,12 +125,16 @@ public class PayService { payOrder.setOutOrderNo(result.getOutOrderNo()); payOrder.setErrorCode(null); payOrder.setErrorMsg(null); + payOrder.setRealAmount(Opt.ofNullable(result.getRealAmount()).orElse(payOrder.getAmount())); payOrderManager.updateById(payOrder); // 如果支付完成 发送通知, 记录流水 if (Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){ tradeFlowRecordService.savePay(payOrder); merchantNoticeService.registerPayNotice(payOrder); - allocationService.registerAutoAlloc(payOrder); + // 保存附加参数到订单 + PayOrderExpand orderExpand = payOrderExpandManager.findById(payOrder.getId()).orElseThrow(() -> new DataErrorException("支付订单扩展信息不存在")); + BeanUtil.copyProperties(result,orderExpand); + payOrderExpandManager.updateById(orderExpand); } return payAssistService.buildResult(payOrder,result); } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PaySyncService.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PaySyncService.java index 8df77abc..7458e559 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/pay/PaySyncService.java @@ -1,27 +1,28 @@ -package org.dromara.daxpay.service.service.trade.pay; +package org.dromara.daxpay.service.pay.service.trade.pay; import cn.bootx.platform.core.exception.RepetitiveOperationException; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.DateTimeUtil; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.core.exception.PayFailureException; -import org.dromara.daxpay.core.exception.SystemUnknownErrorException; -import org.dromara.daxpay.core.exception.TradeNotExistException; -import org.dromara.daxpay.core.exception.TradeStatusErrorException; +import org.dromara.daxpay.core.exception.*; import org.dromara.daxpay.core.param.trade.pay.PaySyncParam; import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; -import org.dromara.daxpay.service.service.record.sync.TradeSyncRecordService; -import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy; -import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderExpandManager; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.record.sync.TradeSyncRecord; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.order.pay.PayOrderQueryService; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.service.pay.service.record.sync.TradeSyncRecordService; +import org.dromara.daxpay.service.pay.strategy.AbsPayCloseStrategy; +import org.dromara.daxpay.service.pay.strategy.AbsSyncPayOrderStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Opt; import cn.hutool.core.util.StrUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; @@ -56,6 +57,10 @@ public class PaySyncService { private final MerchantNoticeService merchantNoticeService; + private final PayOrderExpandManager payOrderExpandManager; + + private final TradeFlowRecordService tradeFlowRecordService; + /** * 支付同步, 开启一个新的事务, 不受外部抛出异常的影响 */ @@ -87,7 +92,7 @@ public class PaySyncService { throw new RepetitiveOperationException("支付同步处理中,请勿重复操作"); } // 获取支付同步策略类并初始化 - AbsSyncPayOrderStrategy syncPayStrategy = PaymentStrategyFactory.create(payOrder.getChannel(), AbsSyncPayOrderStrategy.class); + var syncPayStrategy = PaymentStrategyFactory.create(payOrder.getChannel(), AbsSyncPayOrderStrategy.class); syncPayStrategy.setOrder(payOrder); try { // 执行操作, 获取支付网关同步的结果 @@ -174,17 +179,22 @@ public class PaySyncService { /** - * 变更为已支付 + * 变更为已支付, 更新扩展记录 * 同步: 将异步支付状态修改为成功 * 回调: 将异步支付状态修改为成功 */ - private void success(PayOrder order, PaySyncResultBo param) { + private void success(PayOrder order, PaySyncResultBo resultBo) { + var payOrderExpand = payOrderExpandManager.findById(order.getId()).orElseThrow(() -> new DataErrorException("支付订单扩展信息不存在")); // 修改订单支付状态为成功 order.setStatus(SUCCESS.getCode()) - .setPayTime(param.getFinishTime()) + .setRealAmount(Opt.ofNullable(resultBo.getRealAmount()).orElse(order.getAmount())) + .setPayTime(resultBo.getFinishTime()) .setCloseTime(null); + BeanUtil.copyProperties(resultBo, payOrderExpand); payOrderManager.updateById(order); + payOrderExpandManager.updateById(payOrderExpand); merchantNoticeService.registerPayNotice(order); + tradeFlowRecordService.savePay(order); } /** diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundAssistService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundAssistService.java similarity index 84% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundAssistService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundAssistService.java index dee2c6a6..99df2380 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundAssistService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundAssistService.java @@ -1,22 +1,19 @@ -package org.dromara.daxpay.service.service.trade.refund; +package org.dromara.daxpay.service.pay.service.trade.refund; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; -import org.dromara.daxpay.core.enums.PayRefundStatusEnum; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.core.enums.*; import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.core.param.trade.refund.RefundParam; import org.dromara.daxpay.core.result.trade.refund.RefundResult; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.dao.order.refund.RefundOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.dao.order.refund.RefundOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -87,7 +84,7 @@ public class RefundAssistService { .setStatus(RefundStatusEnum.PROGRESS.getCode()) .setOrderAmount(payOrder.getAmount()) .setAmount(refundParam.getAmount()) - .setTitle(payOrder.getTitle()) + .setTitle(payOrder.getTitle()+" - 退款") .setReason(refundParam.getReason()) .setClientIp(refundParam.getClientIp()) .setReqTime(refundParam.getReqTime()) @@ -97,21 +94,6 @@ public class RefundAssistService { return refundOrder; } - /** - * 更新退款成功信息 - */ - @Transactional(rollbackFor = Exception.class) - public void updateOrder(RefundOrder refundOrder, RefundResultBo resultBo){ - refundOrder.setStatus(resultBo.getStatus().getCode()) - .setOutRefundNo(resultBo.getOutRefundNo()); - // 是否直接返回了退款成功 - if (Objects.equals(refundOrder.getStatus(), RefundStatusEnum.SUCCESS.getCode())){ - // 读取网关返回的退款时间和完成时间 - refundOrder.setFinishTime(resultBo.getFinishTime()); - } - refundOrderManager.updateById(refundOrder); - } - /** * 更新退款错误信息 */ @@ -175,11 +157,9 @@ public class RefundAssistService { .setFinishTime(finishTime) .setErrorMsg(null); payOrder.setRefundStatus(afterPayRefundStatus.getCode()); - // 更新订单和退款相关订单 payOrderManager.updateById(payOrder); refundOrderManager.updateById(refundOrder); - // 记录流水 tradeFlowRecordService.saveRefund(refundOrder); // 发送通知 diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundCallbackService.java similarity index 88% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundCallbackService.java index 2e6144d3..da7d74cf 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundCallbackService.java @@ -1,19 +1,16 @@ -package org.dromara.daxpay.service.service.trade.refund; +package org.dromara.daxpay.service.pay.service.trade.refund; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.util.BigDecimalUtil; -import org.dromara.daxpay.core.enums.CallbackStatusEnum; -import org.dromara.daxpay.core.enums.PayRefundStatusEnum; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.context.CallbackLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.dao.order.refund.RefundOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.core.enums.*; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.dao.order.refund.RefundOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; @@ -100,16 +97,14 @@ public class RefundCallbackService { } else { payRefundStatusEnum = PayRefundStatusEnum.PARTIAL_REFUND; } + payOrder.setRefundStatus(payRefundStatusEnum.getCode()); // 设置退款为完成状态和完成时间 refundOrder.setStatus(RefundStatusEnum.SUCCESS.getCode()) .setFinishTime(callbackInfo.getFinishTime()) .setErrorMsg(null); - payOrder.setRefundStatus(payRefundStatusEnum.getCode()); - // 更新订单和退款相关订单 payOrderManager.updateById(payOrder); refundOrderManager.updateById(refundOrder); - // 记录流水 tradeFlowRecordService.saveRefund(refundOrder); // 发送通知 diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundService.java similarity index 58% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundService.java index e5075ccd..5ea4e23d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundService.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.service.service.trade.refund; +package org.dromara.daxpay.service.pay.service.trade.refund; -import cn.bootx.platform.core.exception.ValidationFailedException; -import cn.bootx.platform.starter.redis.delay.service.DelayJobService; import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; import cn.bootx.platform.core.util.ValidationUtil; +import cn.bootx.platform.starter.redis.delay.service.DelayJobService; import org.dromara.daxpay.core.enums.PayRefundStatusEnum; import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.exception.TradeNotExistException; @@ -12,17 +12,17 @@ import org.dromara.daxpay.core.exception.TradeProcessingException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.core.param.trade.refund.RefundParam; import org.dromara.daxpay.core.result.trade.refund.RefundResult; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.dao.order.refund.RefundOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; -import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; -import org.dromara.daxpay.service.strategy.AbsRefundStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.pay.dao.order.refund.RefundOrderManager; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.order.pay.PayOrderQueryService; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.service.pay.strategy.AbsRefundStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.lock.LockInfo; @@ -75,22 +75,12 @@ public class RefundService { if (StrUtil.isBlank(param.getOrderNo()) && Objects.isNull(param.getBizOrderNo())&& Objects.isNull(param.getOutOrderNo())){ throw new ValidationFailedException("支付订单号不能都为空"); } - - // 加锁 - LockInfo lock = lockTemplate.lock("payment:refund:" + param.getBizRefundNo(),10000,200); - if (Objects.isNull(lock)){ - throw new TradeProcessingException("退款处理中,请勿重复操作"); - } - try { - // 判断是否是首次发起退款 - Optional refund = refundOrderManager.findByBizRefundNo(param.getBizRefundNo(),param.getAppId()); - if (refund.isPresent()){ - return this.repeatRefund(refund.get(),param); - } else { - return this.firstRefund(param); - } - } finally { - lockTemplate.releaseLock(lock); + // 判断是否是首次发起退款 + Optional refund = refundOrderManager.findByBizRefundNo(param.getBizRefundNo(),param.getAppId()); + if (refund.isPresent()){ + return this.repeatRefund(refund.get(),param); + } else { + return this.firstRefund(param); } } @@ -101,28 +91,38 @@ public class RefundService { // 获取支付订单 PayOrder payOrder = payOrderQueryService.findAnyOrderNo(param.getOrderNo(), param.getBizOrderNo(), param.getOutOrderNo(), param.getAppId()) .orElseThrow(() -> new DataNotExistException("支付订单不存在")); - // 检查退款参数 - refundAssistService.checkAndParam(param, payOrder); - // 通过退款参数获取退款策略 - AbsRefundStrategy refundStrategy = PaymentStrategyFactory.create(payOrder.getChannel(), AbsRefundStrategy.class); - // 进行退款前预处理 - refundStrategy.doBeforeRefundHandler(); - // 退款操作的预处理, 对支付订单进行预扣款, 返回创建成功的退款订单, 成功后才可以进行下一阶段的操作 - RefundOrder refundOrder = SpringUtil.getBean(this.getClass()) - .preRefundMethod(param, payOrder); - refundStrategy.setRefundOrder(refundOrder); - RefundResultBo refundResultBo; - try { - // 执行退款策略 - refundResultBo = refundStrategy.doRefundHandler(); - } catch (Exception e) { - log.error("退款出现错误", e); - // 更新退款失败的记录 - refundAssistService.updateOrderByError(refundOrder, e.getMessage()); - return refundAssistService.buildResult(refundOrder); + // 加锁, 使用支付订单id, 防止同时多个退款被发起 + LockInfo lock = lockTemplate.lock("payment:refund:" + payOrder.getId(),10000,200); + if (Objects.isNull(lock)){ + throw new TradeProcessingException("退款处理中,请勿重复操作"); + } + try { + // 检查退款参数 + refundAssistService.checkAndParam(param, payOrder); + // 通过退款参数获取退款策略 + AbsRefundStrategy refundStrategy = PaymentStrategyFactory.create(payOrder.getChannel(), AbsRefundStrategy.class); + // 进行退款前预处理 + refundStrategy.doBeforeRefundHandler(); + // 退款操作的预处理, 对支付订单进行预扣款, 返回创建成功的退款订单, 成功后才可以进行下一阶段的操作 + RefundOrder refundOrder = SpringUtil.getBean(this.getClass()) + .preRefundMethod(param, payOrder); + refundStrategy.setRefundOrder(refundOrder); + RefundResultBo refundResultBo; + try { + // 执行退款策略 + refundResultBo = refundStrategy.doRefundHandler(); + } catch (Exception e) { + log.error("退款出现错误", e); + // 更新退款失败的记录 + refundAssistService.updateOrderByError(refundOrder, e.getMessage()); + return refundAssistService.buildResult(refundOrder); + } + SpringUtil.getBean(this.getClass()) + .successHandler(refundOrder, payOrder, refundResultBo); + return refundAssistService.buildResult(refundOrder); + } finally { + lockTemplate.releaseLock(lock); } - SpringUtil.getBean(this.getClass()).successHandler(refundOrder, payOrder, refundResultBo); - return refundAssistService.buildResult(refundOrder); } /** @@ -147,36 +147,45 @@ public class RefundService { * 3. 构建退款策略, 发起退款 */ private RefundResult repeatRefund(RefundOrder refundOrder, RefundParam param) { - // 退款失败才可以重新发起退款 - if (!Objects.equals(refundOrder.getStatus(), RefundStatusEnum.FAIL.getCode())) { - throw new TradeStatusErrorException("只有失败状态的才可以重新发起退款"); + // 加锁 + LockInfo lock = lockTemplate.lock("payment:refund:" + refundOrder.getId(),10000,200); + if (Objects.isNull(lock)){ + throw new TradeProcessingException("退款处理中,请勿重复操作"); } - // 获取支付订单 - PayOrder payOrder = payOrderQueryService.findAnyOrderNo(refundOrder.getOrderNo(), refundOrder.getBizOrderNo(), refundOrder.getOutOrderNo(), refundOrder.getAppId()) - .orElseThrow(() -> new TradeNotExistException("支付订单不存在")); - AbsRefundStrategy refundStrategy = PaymentStrategyFactory.create(refundOrder.getChannel(), AbsRefundStrategy.class); - // 设置退款订单对象 - refundStrategy.setRefundOrder(refundOrder); - // 退款前准备操作 - refundStrategy.doBeforeRefundHandler(); - // 进行发起退款前的操作, 更新扩展记录信息 - this.updateOrder(param, refundOrder); - RefundResultBo refundResultBo; try { - // 执行退款策略 - refundResultBo = refundStrategy.doRefundHandler(); - // 注册一个两分钟后执行的同步任务, 作为接不到回调任务的兜底 - delayJobService.registerByTransaction(refundOrder.getId(), DaxPayCode.Event.ORDER_REFUND_SYNC, 2*60*1000L); - } catch (Exception e) { - log.error("重新退款失败:", e); - // 记录退款失败的记录 - refundAssistService.updateOrderByError(refundOrder, e.getMessage()); - // 返回错误响应对象 + // 退款失败才可以重新发起退款 + if (!Objects.equals(refundOrder.getStatus(), RefundStatusEnum.FAIL.getCode())) { + throw new TradeStatusErrorException("只有失败状态的才可以重新发起退款"); + } + // 获取支付订单 + PayOrder payOrder = payOrderQueryService.findAnyOrderNo(refundOrder.getOrderNo(), refundOrder.getBizOrderNo(), refundOrder.getOutOrderNo(), refundOrder.getAppId()) + .orElseThrow(() -> new TradeNotExistException("支付订单不存在")); + AbsRefundStrategy refundStrategy = PaymentStrategyFactory.create(refundOrder.getChannel(), AbsRefundStrategy.class); + // 设置退款订单对象 + refundStrategy.setRefundOrder(refundOrder); + // 退款前准备操作 + refundStrategy.doBeforeRefundHandler(); + // 进行发起退款前的操作, 更新扩展记录信息 + this.updateOrder(param, refundOrder); + RefundResultBo refundResultBo; + try { + // 执行退款策略 + refundResultBo = refundStrategy.doRefundHandler(); + // 注册一个两分钟后执行的同步任务, 作为接不到回调任务的兜底 + delayJobService.registerByTransaction(refundOrder.getId(), DaxPayCode.Event.ORDER_REFUND_SYNC, 2*60*1000L); + } catch (Exception e) { + log.error("重新退款失败:", e); + // 记录退款失败的记录 + refundAssistService.updateOrderByError(refundOrder, e.getMessage()); + // 返回错误响应对象 + return refundAssistService.buildResult(refundOrder); + } + // 退款发起成功处理 + SpringUtil.getBean(this.getClass()).successHandler(refundOrder, payOrder, refundResultBo); return refundAssistService.buildResult(refundOrder); + } finally { + lockTemplate.releaseLock(lock); } - // 退款发起成功处理 - SpringUtil.getBean(this.getClass()).successHandler(refundOrder, payOrder, refundResultBo); - return refundAssistService.buildResult(refundOrder); } /** diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundSyncService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundSyncService.java similarity index 90% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundSyncService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundSyncService.java index a3019533..cdc842ae 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundSyncService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/refund/RefundSyncService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.trade.refund; +package org.dromara.daxpay.service.pay.service.trade.refund; import cn.bootx.platform.core.exception.RepetitiveOperationException; import org.dromara.daxpay.core.enums.RefundStatusEnum; @@ -6,15 +6,15 @@ import org.dromara.daxpay.core.enums.TradeTypeEnum; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.trade.refund.RefundSyncParam; import org.dromara.daxpay.core.result.trade.refund.RefundSyncResult; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.refund.RefundOrderManager; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; -import org.dromara.daxpay.service.service.order.refund.RefundOrderQueryService; -import org.dromara.daxpay.service.service.record.sync.TradeSyncRecordService; -import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.order.refund.RefundOrderManager; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.entity.record.sync.TradeSyncRecord; +import org.dromara.daxpay.service.pay.service.order.refund.RefundOrderQueryService; +import org.dromara.daxpay.service.pay.service.record.sync.TradeSyncRecordService; +import org.dromara.daxpay.service.pay.strategy.AbsSyncRefundOrderStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferAssistService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferAssistService.java similarity index 90% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferAssistService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferAssistService.java index abe46923..7e64ea97 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferAssistService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferAssistService.java @@ -1,12 +1,12 @@ -package org.dromara.daxpay.service.service.trade.transfer; +package org.dromara.daxpay.service.pay.service.trade.transfer; import org.dromara.daxpay.core.enums.TransferStatusEnum; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; import org.dromara.daxpay.core.result.trade.transfer.TransferResult; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.dao.order.transfer.TransferOrderManager; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.dao.order.transfer.TransferOrderManager; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferCallbackService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferCallbackService.java similarity index 89% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferCallbackService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferCallbackService.java index c6bcc23d..b9cdce3e 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferCallbackService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferCallbackService.java @@ -1,13 +1,13 @@ -package org.dromara.daxpay.service.service.trade.transfer; +package org.dromara.daxpay.service.pay.service.trade.transfer; import org.dromara.daxpay.core.enums.CallbackStatusEnum; import org.dromara.daxpay.core.enums.TransferStatusEnum; import org.dromara.daxpay.core.context.CallbackLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.transfer.TransferOrderManager; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.order.transfer.TransferOrderManager; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.lock.LockInfo; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferService.java similarity index 87% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferService.java index e7176a62..f2ff1a0d 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.trade.transfer; +package org.dromara.daxpay.service.pay.service.trade.transfer; import cn.bootx.platform.core.util.ValidationUtil; import cn.bootx.platform.starter.redis.delay.service.DelayJobService; @@ -6,14 +6,14 @@ import org.dromara.daxpay.core.enums.TransferStatusEnum; import org.dromara.daxpay.core.exception.TradeProcessingException; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; import org.dromara.daxpay.core.result.trade.transfer.TransferResult; -import org.dromara.daxpay.service.bo.trade.TransferResultBo; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.dao.order.transfer.TransferOrderManager; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; -import org.dromara.daxpay.service.strategy.AbsTransferStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; +import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo; +import org.dromara.daxpay.service.common.code.DaxPayCode; +import org.dromara.daxpay.service.pay.dao.order.transfer.TransferOrderManager; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.service.pay.strategy.AbsTransferStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; @@ -50,7 +50,7 @@ public class TransferService { // 参数校验 ValidationUtil.validateParam(param); // 加锁 - LockInfo lock = lockTemplate.lock("payment:refund:" + param.getBizTransferNo(),10000,200); + LockInfo lock = lockTemplate.lock("payment:transfer:" + param.getBizTransferNo(),10000,200); if (Objects.isNull(lock)){ throw new TradeProcessingException("转账处理中,请勿重复操作"); } diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferSyncService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferSyncService.java similarity index 89% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferSyncService.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferSyncService.java index de66df71..e033357b 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferSyncService.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/service/trade/transfer/TransferSyncService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.trade.transfer; +package org.dromara.daxpay.service.pay.service.trade.transfer; import cn.bootx.platform.core.exception.BizException; import cn.bootx.platform.core.exception.RepetitiveOperationException; @@ -7,17 +7,17 @@ import org.dromara.daxpay.core.enums.TransferStatusEnum; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.trade.transfer.TransferSyncParam; import org.dromara.daxpay.core.result.trade.transfer.TransferSyncResult; -import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.order.transfer.TransferOrderManager; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.order.transfer.TransferOrderQueryService; -import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; -import org.dromara.daxpay.service.service.record.sync.TradeSyncRecordService; -import org.dromara.daxpay.service.strategy.AbsSyncTransferOrderStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; +import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo; +import org.dromara.daxpay.service.pay.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.pay.dao.order.transfer.TransferOrderManager; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.entity.record.sync.TradeSyncRecord; +import org.dromara.daxpay.service.pay.service.notice.MerchantNoticeService; +import org.dromara.daxpay.service.pay.service.order.transfer.TransferOrderQueryService; +import org.dromara.daxpay.service.pay.service.record.flow.TradeFlowRecordService; +import org.dromara.daxpay.service.pay.service.record.sync.TradeSyncRecordService; +import org.dromara.daxpay.service.pay.strategy.AbsSyncTransferOrderStrategy; +import org.dromara.daxpay.service.pay.util.PaymentStrategyFactory; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.lock.LockInfo; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsChannelAuthStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelAuthStrategy.java similarity index 92% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsChannelAuthStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelAuthStrategy.java index e6457fe7..c6c6dc0c 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsChannelAuthStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelAuthStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; import org.dromara.daxpay.core.param.assist.AuthCodeParam; import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelBasicStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelBasicStrategy.java new file mode 100644 index 00000000..159cdd8f --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelBasicStrategy.java @@ -0,0 +1,19 @@ +package org.dromara.daxpay.service.pay.strategy; + +import cn.bootx.platform.core.rest.dto.KeyValue; + +import java.util.List; + +/** + * 通道基础数据获取策略 + * @author xxm + * @since 2025/6/4 + */ +public abstract class AbsChannelBasicStrategy implements PaymentStrategy{ + + /** + * 获取通道的支付列表 + */ + public abstract List payMethodList(); + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelTerminalStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelTerminalStrategy.java new file mode 100644 index 00000000..887d6034 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsChannelTerminalStrategy.java @@ -0,0 +1,31 @@ +package org.dromara.daxpay.service.pay.strategy; + +import org.dromara.daxpay.service.pay.bo.assist.ChannelTerminalBo; +import org.dromara.daxpay.service.device.entity.terminal.ChannelTerminal; +import org.dromara.daxpay.service.device.entity.terminal.TerminalDevice; + +/** + * 支付终端设备通道管理策略 + * @author xxm + * @since 2025/3/8 + */ +public abstract class AbsChannelTerminalStrategy implements PaymentStrategy{ + + /** + * 报备 + */ + public abstract ChannelTerminalBo submit(TerminalDevice terminalDevice, ChannelTerminal terminalChannel); + + /** + * 注销 + */ + public abstract ChannelTerminalBo cancel(TerminalDevice terminal, ChannelTerminal terminalChannel); + + /** + * 同步 + */ + public ChannelTerminalBo sync(TerminalDevice terminal, ChannelTerminal terminalChannel){ + throw new UnsupportedOperationException("该通道不支持终端报备同步"); + } + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsGatewayPayStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsGatewayPayStrategy.java similarity index 89% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsGatewayPayStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsGatewayPayStrategy.java index 27dbe1d0..78373961 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsGatewayPayStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsGatewayPayStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; import org.dromara.daxpay.core.param.gateway.GatewayCashierPayParam; import org.dromara.daxpay.core.param.trade.pay.PayParam; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsPayCloseStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsPayCloseStrategy.java similarity index 87% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsPayCloseStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsPayCloseStrategy.java index 926f4291..1a32e683 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsPayCloseStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsPayCloseStrategy.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; import org.dromara.daxpay.core.enums.CloseTypeEnum; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsPayStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsPayStrategy.java similarity index 83% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsPayStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsPayStrategy.java index 273c8412..641c25e2 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsPayStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsPayStrategy.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; import org.dromara.daxpay.core.param.trade.pay.PayParam; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsRefundStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsRefundStrategy.java similarity index 72% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsRefundStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsRefundStrategy.java index 81d05fb9..ef5e15eb 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsRefundStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsRefundStrategy.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; -import org.dromara.daxpay.service.bo.trade.RefundResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsSyncPayOrderStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsSyncPayOrderStrategy.java similarity index 69% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsSyncPayOrderStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsSyncPayOrderStrategy.java index df445e18..738a39de 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsSyncPayOrderStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsSyncPayOrderStrategy.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; -import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.pay.PayOrder; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsSyncRefundOrderStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsSyncRefundOrderStrategy.java similarity index 75% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsSyncRefundOrderStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsSyncRefundOrderStrategy.java index 37f2b194..eb68f6a5 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsSyncRefundOrderStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsSyncRefundOrderStrategy.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.refund.RefundOrder; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsSyncTransferOrderStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsSyncTransferOrderStrategy.java similarity index 74% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsSyncTransferOrderStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsSyncTransferOrderStrategy.java index df6c38b8..bba53ddd 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsSyncTransferOrderStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsSyncTransferOrderStrategy.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; -import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.bo.sync.TransferSyncResultBo; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsTransferStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsTransferStrategy.java similarity index 76% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsTransferStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsTransferStrategy.java index 4af0702b..c617cd72 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsTransferStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/AbsTransferStrategy.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; -import org.dromara.daxpay.service.bo.trade.TransferResultBo; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.service.pay.bo.trade.TransferResultBo; +import org.dromara.daxpay.service.pay.entity.order.transfer.TransferOrder; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; import lombok.Getter; import lombok.Setter; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/PaymentStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/PaymentStrategy.java similarity index 85% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/PaymentStrategy.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/PaymentStrategy.java index 458011f1..ffe68234 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/PaymentStrategy.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/strategy/PaymentStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.strategy; +package org.dromara.daxpay.service.pay.strategy; import org.dromara.daxpay.core.enums.ChannelEnum; diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/util/PaymentStrategyFactory.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/util/PaymentStrategyFactory.java similarity index 89% rename from daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/util/PaymentStrategyFactory.java rename to daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/util/PaymentStrategyFactory.java index c5d89a96..bb227b3a 100644 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/util/PaymentStrategyFactory.java +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/pay/util/PaymentStrategyFactory.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.service.util; +package org.dromara.daxpay.service.pay.util; import org.dromara.daxpay.core.exception.UnsupportedAbilityException; -import org.dromara.daxpay.service.strategy.PaymentStrategy; +import org.dromara.daxpay.service.pay.strategy.PaymentStrategy; import cn.hutool.extra.spring.SpringUtil; import lombok.experimental.UtilityClass; @@ -28,7 +28,7 @@ public class PaymentStrategyFactory { return beansOfType.values().stream() .filter(strategy -> strategy.getChannel().equals(channel)) .findFirst() - .orElseThrow(() -> new UnsupportedAbilityException("不支持的能力")); + .orElseThrow(() -> new UnsupportedAbilityException("不支持的能力: "+channel)); } /** diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/AllocConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/AllocConfigResult.java deleted file mode 100644 index 47ea5aaf..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/AllocConfigResult.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.dromara.daxpay.service.result.allocation; - -import org.dromara.daxpay.service.common.result.MchResult; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 分账配置 - * @author xxm - * @since 2024/12/9 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "分账配置") -public class AllocConfigResult extends MchResult { - - @Schema(description = "是否自动分账") - private Boolean autoAlloc; - - @Schema(description = "分账起始额") - private BigDecimal minAmount; - - /** 自动完结 */ - @Schema(description = "是否自动完结") - private Boolean autoFinish; - - /** 分账延迟时长(分钟) */ - @Schema(description = "分账延迟时长(分钟)") - private Integer delayTime; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocDetailVo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocDetailVo.java deleted file mode 100644 index ee24b5b5..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocDetailVo.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.dromara.daxpay.service.result.allocation.order; - -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.service.common.result.MchResult; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import lombok.experimental.FieldNameConstants; -import org.dromara.core.trans.anno.Trans; -import org.dromara.core.trans.constant.TransType; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 分账订单明细 - * @author xxm - * @since 2024/5/21 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@FieldNameConstants -@Accessors(chain = true) -@Schema(title = "分账订单明细") -public class AllocDetailVo extends MchResult { - - /** 分账订单ID */ - @Schema(description = "分账订单ID") - private Long allocationId; - - /** 外部明细ID */ - @Schema(description = "外部明细ID") - private String outDetailId; - - @Schema(description = "分账接收方编号") - private String receiverNo; - - @Trans(type = TransType.SIMPLE, target = AllocReceiver.class, fields = AllocReceiver.Fields.receiverName, ref = AllocDetailVo.Fields.name) - @Schema(description = "分账接收方Id") - private Long receiverId; - - @Schema(description = "名称") - private String name; - - /** 分账金额 */ - @Schema(description = "分账金额") - private BigDecimal amount; - - /** 分账比例 */ - @Schema(description = "分账比例(百分之多少)") - private BigDecimal rate; - - /** - * 分账接收方类型 - * @see AllocReceiverTypeEnum - */ - @Schema(description = "分账接收方类型") - private String receiverType; - - /** 接收方账号 */ - @Schema(description = "接收方账号") - private String receiverAccount; - - /** 接收方姓名 */ - @Schema(description = "接收方姓名") - private String receiverName; - - /** - * 分账结果 - * @see AllocDetailResultEnum - */ - @Schema(description = "分账结果") - private String result; - - /** 错误代码 */ - @Schema(description = "错误代码") - private String errorCode; - - /** 错误原因 */ - @Schema(description = "错误原因") - private String errorMsg; - - /** 分账完成时间 */ - @Schema(description = "分账完成时间") - private LocalDateTime finishTime; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocOrderVo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocOrderVo.java deleted file mode 100644 index b5fe8918..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocOrderVo.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.dromara.daxpay.service.result.allocation.order; - -import org.dromara.daxpay.core.enums.AllocationResultEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.common.result.MchResult; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 分账订单 - * @author xxm - * @since 2024/5/21 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "分账订单") -public class AllocOrderVo extends MchResult { - - /** 分账单号 */ - @Schema(description = "分账单号") - private String allocNo; - - /** 商户分账单号 */ - @Schema(description = "商户分账单号") - private String bizAllocNo; - - /** 通道分账号 */ - @Schema(description = "通道分账号") - private String outAllocNo; - - /** - * 支付订单号 - */ - @Schema(description = "支付订单号") - private String orderNo; - - /** 商户支付订单号 */ - @Schema(description = "商户支付订单号") - private String bizOrderNo; - - /** 通道支付订单号 */ - @Schema(description = "通道支付订单号") - private String outOrderNo; - - /** - * 支付订单标题 - */ - @Schema(description = "支付订单标题") - private String title; - - /** - * 所属通道 - * @see ChannelEnum - */ - @Schema(description = "所属通道") - private String channel; - - /** - * 总分账金额 - */ - @Schema(description = "总分账金额") - private BigDecimal amount; - - /** - * 分账描述 - */ - @Schema(description = "分账描述") - private String description; - - /** - * 状态 - * @see AllocationStatusEnum - */ - @Schema(description = "状态") - private String status; - - /** - * 处理结果 - * @see AllocationResultEnum - */ - @Schema(description = "处理结果") - private String result; - - /** - * 错误码 - */ - @Schema(description = "错误码") - private String errorCode; - - /** - * 错误信息 - */ - @Schema(description = "错误原因") - private String errorMsg; - - /** 分账订单完成时间 */ - @Schema(description = "分账订单完成时间") - private LocalDateTime finishTime; - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java deleted file mode 100644 index 058925b2..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.dromara.daxpay.service.result.allocation.receiver; - -import org.dromara.daxpay.service.common.result.MchResult; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 分账组接收方信息 - * @author xxm - * @since 2024/4/1 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "分账组接收方信息") -public class AllocGroupReceiverVo extends MchResult { - - @Schema(description = "接收方ID") - private Long receiverId; - - @Schema(description = "接收方编号") - private String receiverNo; - - @Schema(description = "接收方名称") - private String name; - - @Schema(description = "分账比例(百分之多少)") - private BigDecimal rate; - - @Schema(description = "接收方类型") - private String receiverType; - - @Schema(description = "接收方账号") - private String receiverAccount; - - /** 接收方名称 */ - @Schema(description = "接收方名称") - private String receiverName; - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupVo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupVo.java deleted file mode 100644 index 8dc42337..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupVo.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.dromara.daxpay.service.result.allocation.receiver; - -import org.dromara.daxpay.service.common.result.MchResult; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 分账组 - * @author xxm - * @since 2024/4/1 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "分账组") -public class AllocGroupVo extends MchResult { - - @Schema(description = "分账组编号") - private String groupNo; - - @Schema(description = "名称") - private String name; - - @Schema(description = "通道") - private String channel; - - @Schema(description = "默认分账组") - private Boolean defaultGroup; - - @Schema(description = "分账比例(百分之多少)") - private BigDecimal totalRate; - - @Schema(description = "备注") - private String remark; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java deleted file mode 100644 index 2799815b..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.dromara.daxpay.service.result.allocation.receiver; - -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.common.result.MchResult; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 分账接收方 - * @author xxm - * @since 2024/3/28 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "分账接收方") -public class AllocReceiverVo extends MchResult { - - @Schema(description = "接收方编号") - private String receiverNo; - - /** - * 接收方类型 - * @see AllocReceiverTypeEnum - */ - @Schema(description = "接收方类型") - private String receiverType; - - @Schema(description = "接收方账号") - private String receiverAccount; - - @Schema(description = "接收方名称") - private String receiverName; - - /** - * @see ChannelEnum - */ - @Schema(description = "所属通道") - private String channel; - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/PlatformConfigResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/PlatformConfigResult.java deleted file mode 100644 index 743c858a..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/config/PlatformConfigResult.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.dromara.daxpay.service.result.config; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 平台配置 - * @author xxm - * @since 2024/9/19 - */ -@Data -@Accessors(chain = true) -@Schema(title = "平台配置") -public class PlatformConfigResult { - - /** 支付网关地址 */ - @Schema(description = "支付网关地址") - private String gatewayServiceUrl; - - /** 网关移动端地址 */ - @Schema(description = "网关移动端地址") - private String gatewayMobileUrl; - - /** 全局单笔限额 */ - @Schema(description = "全局单笔限额") - private BigDecimal limitAmount; -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java deleted file mode 100644 index ee7e4e5e..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.dromara.daxpay.service.service.allocation; - -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.exception.RepetitiveOperationException; -import org.dromara.daxpay.service.convert.allocation.AllocConfigConvert; -import org.dromara.daxpay.service.dao.allocation.AllocConfigManager; -import org.dromara.daxpay.service.entity.allocation.AllocConfig; -import org.dromara.daxpay.service.param.allocation.AllocConfigParam; -import org.dromara.daxpay.service.result.allocation.AllocConfigResult; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 分账配置 - * @author xxm - * @since 2024/12/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AllocConfigService { - private final AllocConfigManager allocConfigManager; - - /** - * 新增 - */ - public void save(AllocConfigParam param) { - // 判断是否已经存在 - if (allocConfigManager.existsByAppId(param.getAppId())){ - throw new RepetitiveOperationException("该应用已存在收银台配置"); - } - - AllocConfig entity = AllocConfigConvert.CONVERT.toEntity(param); - allocConfigManager.save(entity); - } - - /** - * 修改 - */ - public void update(AllocConfigParam param) { - AllocConfig config = allocConfigManager.findById(param.getId()) - .orElseThrow(() -> new DataNotExistException("分账配置不存在")); - BeanUtil.copyProperties(param, config, CopyOptions.create().ignoreNullValue()); - allocConfigManager.updateById(config); - } - - /** - * 根据AppId查询 - */ - public AllocConfigResult findByAppId(String appId) { - return allocConfigManager.findByAppId(appId).map(AllocConfig::toResult) - .orElse(new AllocConfigResult().setAutoAlloc(false)); - } - - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java deleted file mode 100644 index f642b918..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java +++ /dev/null @@ -1,316 +0,0 @@ -package org.dromara.daxpay.service.service.allocation; - -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.exception.RepetitiveOperationException; -import cn.bootx.platform.starter.redis.delay.service.DelayJobService; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocationResultEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.core.exception.TradeStatusErrorException; -import org.dromara.daxpay.core.param.allocation.order.AllocFinishParam; -import org.dromara.daxpay.core.param.allocation.order.AllocationParam; -import org.dromara.daxpay.core.param.allocation.order.QueryAllocOrderParam; -import org.dromara.daxpay.core.result.allocation.AllocationResult; -import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; -import org.dromara.daxpay.service.dao.allocation.AllocConfigManager; -import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; -import org.dromara.daxpay.service.entity.allocation.AllocConfig; -import org.dromara.daxpay.service.entity.allocation.order.AllocAndDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.allocation.order.AllocOrderQueryService; -import org.dromara.daxpay.service.service.allocation.order.AllocOrderService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; -import com.baomidou.lock.LockInfo; -import com.baomidou.lock.LockTemplate; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - - -/** - * 分账处理 - * @author xxm - * @since 2024/11/14 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AllocationService { - - private final AllocOrderManager allocationOrderManager; - - private final AllocDetailManager allocOrderDetailManager; - - private final LockTemplate lockTemplate; - - private final PaymentAssistService paymentAssistService; - - private final AllocOrderQueryService allocOrderQueryService; - - private final AllocOrderService allocOrderService; - - private final MerchantNoticeService merchantNoticeService; - - private final DelayJobService delayJobService; - - private final AllocConfigManager allocConfigManager; - - /** - * 开启分账 多次请求只会分账一次 - * 优先级 分账接收方列表 > 分账组编号 > 默认分账组 - */ - public AllocationResult start(AllocationParam param) { - // 判断是否已经有分账订单 - var allocOrder = allocationOrderManager.findByBizAllocNo(param.getBizAllocNo(), param.getAppId()).orElse(null); - if (Objects.nonNull(allocOrder)){ - // 重复分账 - return this.retryAlloc(param, allocOrder); - } else { - // 首次分账 - PayOrder payOrder = allocOrderQueryService.getAndCheckPayOrder(param); - return this.start(param, payOrder); - } - } - - /** - * 开启分账 优先级 分账接收方列表 > 分账组编号 > 默认分账组 - */ - public AllocationResult start(AllocationParam param, PayOrder payOrder) { - LockInfo lock = lockTemplate.lock("payment:allocation:" + payOrder.getId(),10000,200); - if (Objects.isNull(lock)){ - throw new RepetitiveOperationException("分账发起处理中,请勿重复操作"); - } - try { - // 构建分账订单相关信息 - AllocAndDetail orderAndDetail = allocOrderService.checkAndCreateAlloc(param, payOrder); - // 检查是否需要进行分账 - var allocOrder = orderAndDetail.transaction(); - List details = orderAndDetail.details(); - // 无需进行分账, - if (Objects.equals(allocOrder.getStatus(), AllocationStatusEnum.IGNORE.getCode())){ - return new AllocationResult() - .setAllocNo(allocOrder.getAllocNo()) - .setBizAllocNo(allocOrder.getBizAllocNo()) - .setStatus(allocOrder.getStatus()) - .setResult(allocOrder.getResult()); - } - // 通用处理 - return startAlloc(allocOrder, details, param); - } finally { - lockTemplate.releaseLock(lock); - } - } - - /** - * 重新分账 - */ - public AllocationResult retryAlloc(Long id){ - var allocOrder = allocationOrderManager.findById(id).orElseThrow(() -> new DataNotExistException("分账单不存在")); - AllocationParam param = new AllocationParam(); - param.setNotifyUrl(allocOrder.getNotifyUrl()) - .setAttach(allocOrder.getAttach()) - .setReqTime(allocOrder.getReqTime()); - param.setClientIp(allocOrder.getClientIp()); - return this.retryAlloc(param, allocOrder); - } - - /** - * 重新分账 - */ - private AllocationResult retryAlloc(AllocationParam param, AllocOrder allocOrder){ - LockInfo lock = lockTemplate.lock("payment:allocation:" + allocOrder.getOrderId(),10000,200); - if (Objects.isNull(lock)){ - throw new RepetitiveOperationException("分账发起处理中,请勿重复操作"); - } - try { - // 需要是分账中分账中或者完成状态才能重新分账 - List list = Arrays.asList( - AllocationStatusEnum.ALLOC_END.getCode(), - AllocationStatusEnum.ALLOC_FAILED.getCode(), - AllocationStatusEnum.PROCESSING.getCode()); - if (!list.contains(allocOrder.getStatus())){ - throw new TradeStatusErrorException("分账单状态错误,无法重试"); - } - List details = allocOrderQueryService.getDetails(allocOrder.getId()); - // 通用处理 - return startAlloc(allocOrder, details, param); - } finally { - lockTemplate.releaseLock(lock); - } - } - - /** - * 分账发起通用处理 - */ - private AllocationResult startAlloc(AllocOrder allocOrder, List details, AllocationParam param){ - // 创建分账策略并初始化 - var allocationStrategy = PaymentStrategyFactory.create(allocOrder.getChannel(), AbsAllocationStrategy.class); - allocationStrategy.initParam(allocOrder, details); - // 分账预处理 - allocationStrategy.doBeforeHandler(); - // 更新分账单信息 - allocOrderService.updateOrder(param, allocOrder); - try { - // 重复分账处理 - var result = allocationStrategy.start(); - // 如果返回分账成功, 走分账完成分支 - if (result.getResult() == AllocationResultEnum.ALL_SUCCESS){ - // 分账成功, 判断是否需要完结 - allocOrder.setStatus(result.isNeedFinish()?AllocationStatusEnum.ALLOC_END.getCode():AllocationStatusEnum.FINISH.getCode()) - .setResult(AllocationResultEnum.ALL_SUCCESS.getCode()) - .setOutAllocNo(result.getOutAllocNo()) - .setFinishTime(result.getFinishTime()) - .setErrorMsg(null); - // 明细设置为成功 - details.forEach(o->o.setFinishTime(LocalDateTime.now()).setResult(AllocDetailResultEnum.SUCCESS.getCode())); - // 发送通知 - merchantNoticeService.registerAllocNotice(allocOrder, details); - } else { - // 分账处理中 - allocOrder.setStatus(AllocationStatusEnum.PROCESSING.getCode()) - .setResult(AllocationResultEnum.ALL_PENDING.getCode()) - .setOutAllocNo(result.getOutAllocNo()) - .setErrorMsg(null); - // 注册两分钟后的分账同步事件 - delayJobService.registerByTransaction(allocOrder.getId(), DaxPayCode.Event.ORDER_ALLOC_SYNC, 2*60*1000L); - } - } catch (Exception e) { - log.error("重新分账出现错误:", e); - allocOrder.setStatus(AllocationStatusEnum.ALLOC_FAILED.getCode()) - .setErrorMsg(e.getMessage()); - } - return new AllocationResult() - .setAllocNo(allocOrder.getAllocNo()) - .setBizAllocNo(allocOrder.getBizAllocNo()) - .setStatus(allocOrder.getStatus()) - .setResult(allocOrder.getResult()); - } - - /** - * 自动分账完结 - */ - public void autoFinish(AllocOrder allocOrder) { - if (!Arrays.asList(AllocationStatusEnum.ALLOC_END.getCode(),AllocationStatusEnum.FINISH_FAILED.getCode()).contains(allocOrder.getStatus())) { - log.warn("忽略分账完结自动处理,分账单状态不正确:{}", allocOrder.getStatus()); - return; - } - paymentAssistService.initMchAndApp(allocOrder.getAppId()); - this.finish(allocOrder); - } - - /** - * 分账完结 - */ - public AllocationResult finish(Long id) { - AllocOrder allocOrder = allocationOrderManager.findById(id) - .orElseThrow(() -> new DataNotExistException("未查询到分账单信息")); - paymentAssistService.initMchAndApp(allocOrder.getAppId()); - return this.finish(allocOrder); - } - - /** - * 分账完结 - */ - public AllocationResult finish(AllocFinishParam param) { - AllocOrder allocOrder; - if (Objects.nonNull(param.getAllocNo())){ - allocOrder = allocationOrderManager.findByAllocNo(param.getAllocNo(), param.getAppId()) - .orElseThrow(() -> new DataNotExistException("未查询到分账单信息")); - } else { - allocOrder = allocationOrderManager.findByBizAllocNo(param.getBizAllocNo(), param.getAppId()) - .orElseThrow(() -> new DataNotExistException("未查询到分账单信息")); - } - return this.finish(allocOrder); - } - - /** - * 分账完结 - */ - public AllocationResult finish(AllocOrder allocOrder) { - // 只有分账结束后才可以完结 - if (!Arrays.asList(AllocationStatusEnum.ALLOC_END.getCode(),AllocationStatusEnum.FINISH_FAILED.getCode()).contains(allocOrder.getStatus())) { - throw new TradeStatusErrorException("分账单状态错误"); - } - List details = allocOrderQueryService.getDetails(allocOrder.getId()); - - // 创建分账策略并初始化 - AbsAllocationStrategy allocationStrategy = PaymentStrategyFactory.create(allocOrder.getChannel(),AbsAllocationStrategy.class); - allocationStrategy.initParam(allocOrder, details); - - // 分账完结预处理 - allocationStrategy.doBeforeHandler(); - try { - // 完结处理 - allocationStrategy.finish(); - // 完结状态 - allocOrder.setStatus(AllocationStatusEnum.FINISH.getCode()) - .setFinishTime(LocalDateTime.now()) - .setErrorMsg(null); - } catch (Exception e) { - log.error("分账完结错误:", e); - // 失败 - allocOrder.setStatus(AllocationStatusEnum.FINISH_FAILED.getCode()) - .setErrorMsg(e.getMessage()); - } - allocationOrderManager.updateById(allocOrder); - merchantNoticeService.registerAllocNotice(allocOrder, details); - return new AllocationResult() - .setAllocNo(allocOrder.getAllocNo()) - .setBizAllocNo(allocOrder.getBizAllocNo()) - .setStatus(allocOrder.getStatus()) - .setResult(allocOrder.getResult()); - } - - /** - * 查询分账结果 - */ - public AllocOrderResult queryAllocOrder(QueryAllocOrderParam param) { - // 查询分账单 - var allocOrder = allocationOrderManager.findByAllocNo(param.getAllocNo(), param.getAppId()) - .orElseThrow(() -> new DataErrorException("分账单不存在")); - var result = AllocOrderConvert.CONVERT.toResult(allocOrder); - // 查询分账单明细 - var details = allocOrderDetailManager.findAllByOrderId(allocOrder.getId()).stream() - .map(AllocOrderConvert.CONVERT::toResult) - .collect(Collectors.toList()); - result.setDetails(details); - return result; - } - - - /** - * 注册自动分账事件 - */ - public void registerAutoAlloc(PayOrder payOrder) { - // 订单是否完成 - if (!Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){ - return; - } - // 是否开启自动分账 - if (payOrder.getAllocation() && payOrder.getAutoAllocation()){ - AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null); - if (Objects.nonNull(allocConfig)&&allocConfig.getAutoAlloc()){ - // 注册定时执行的分账完结任务, 如果未设置默认为一天后进行分账 - Integer delayTime = Optional.ofNullable(allocConfig.getDelayTime()).orElse(24*60); - delayJobService.registerByTransaction(payOrder.getId(), DaxPayCode.Event.ORDER_ALLOC_START, delayTime*60*1000L); - } - } - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java deleted file mode 100644 index 2778c57a..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java +++ /dev/null @@ -1,215 +0,0 @@ -package org.dromara.daxpay.service.service.allocation; - -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.exception.RepetitiveOperationException; -import cn.bootx.platform.starter.redis.delay.service.DelayJobService; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocationResultEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.core.param.allocation.order.AllocSyncParam; -import org.dromara.daxpay.core.result.allocation.AllocSyncResult; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.code.DaxPayCode; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.allocation.AllocConfigManager; -import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; -import org.dromara.daxpay.service.entity.allocation.AllocConfig; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.notice.MerchantNoticeService; -import org.dromara.daxpay.service.service.record.sync.TradeSyncRecordService; -import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; -import com.baomidou.lock.LockInfo; -import com.baomidou.lock.LockTemplate; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -/** - * 分账同步 - * @author xxm - * @since 2024/5/23 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AllocationSyncService { - - private final AllocOrderManager allocationOrderManager; - - private final AllocDetailManager allocOrderDetailManager; - - private final TradeSyncRecordService paySyncRecordService; - - private final LockTemplate lockTemplate; - private final PaymentAssistService paymentAssistService; - private final MerchantNoticeService merchantNoticeService; - private final AllocConfigManager allocConfigManager; - private final DelayJobService delayJobService; - - /** - * 自动分账同步 - */ - @Transactional(rollbackFor = Exception.class) - public void autoSync(AllocOrder allocOrder) { - // 如果类型为忽略, 不进行同步处理 - if (Objects.equals(allocOrder.getStatus(), AllocationStatusEnum.IGNORE.getCode())){ - return; - } - // 调用同步逻辑 - this.sync(allocOrder); - } - /** - * 分账同步, 手动发起 - */ - @Transactional(rollbackFor = Exception.class) - public void sync(Long id) { - AllocOrder allocOrder = allocationOrderManager.findById(id) - .orElseThrow(() -> new DataNotExistException("分账单不存在")); - // 如果类型为忽略, 不进行同步处理 - if (Objects.equals(allocOrder.getStatus(), AllocationStatusEnum.IGNORE.getCode())){ - return; - } - paymentAssistService.initMchAndApp(allocOrder.getAppId()); - // 调用同步逻辑 - this.sync(allocOrder); - } - - /** - * 分账同步 - */ - @Transactional(rollbackFor = Exception.class) - public AllocSyncResult sync(AllocSyncParam param) { - // 获取分账订单 - AllocOrder allocOrder = null; - if (Objects.nonNull(param.getAllocNo())){ - allocOrder = allocationOrderManager.findByAllocNo(param.getAllocNo(),param.getAppId()) - .orElseThrow(() -> new DataNotExistException("分账单不存在")); - } - if (Objects.isNull(allocOrder)){ - allocOrder = allocationOrderManager.findByAllocNo(param.getBizAllocNo(),param.getAppId()) - .orElseThrow(() -> new DataNotExistException("分账单不存在")); - } - // 如果类型为忽略, 不进行同步处理 - if (Objects.equals(allocOrder.getStatus(), AllocationStatusEnum.IGNORE.getCode())){ - return new AllocSyncResult(); - } - - // 调用同步逻辑 - this.sync(allocOrder); - return new AllocSyncResult().setResult(allocOrder.getResult()).setStatus(allocOrder.getStatus()); - } - - /** - * 分账同步 - */ - @Transactional(rollbackFor = Exception.class) - public void sync(AllocOrder allocOrder){ - LockInfo lock = lockTemplate.lock("payment:allocation:" + allocOrder.getOrderId(),10000,200); - if (Objects.isNull(lock)){ - throw new RepetitiveOperationException("分账同步中,请勿重复操作"); - } - String beforeStatus = allocOrder.getStatus(); - try { - List detailList = allocOrderDetailManager.findAllByOrderId(allocOrder.getId()); - // 获取分账策略 - var allocationStrategy = PaymentStrategyFactory.create(allocOrder.getChannel(), AbsAllocationStrategy.class); - allocationStrategy.initParam(allocOrder, detailList); - // 分账完结预处理 - allocationStrategy.doBeforeHandler(); - // 执行同步操作, 分账明细的状态变更会在这个里面进行, 由通道自己处理, 订单的状态和结果不要进行变更, - AllocSyncResultBo allocSyncResultBo = allocationStrategy.doSync(); - // 保存分账同步记录 - this.saveRecord(allocOrder, allocSyncResultBo); - // 根据订单明细更新订单的状态和处理结果 - allocOrder.setErrorMsg(null).setErrorCode(null); - // 根据订单明细更新订单的状态和处理结果, 如果订单是分账结束或失败, 不更新状态 - this.updateOrderStatus(allocOrder, detailList,beforeStatus); - } finally { - lockTemplate.releaseLock(lock); - } - } - - /** - * 根据订单明细更新订单的状态和处理结果, 如果订单是分账结束或失败, 不更新状态 - */ - private void updateOrderStatus(AllocOrder allocOrder, List details, String beforeStatus){ - // 如果是分账结束或失败, 不更新状态, 不进行对订单进行处理 - String status = allocOrder.getStatus(); - List list = Arrays.asList(AllocationStatusEnum.FINISH.getCode(), AllocationStatusEnum.FINISH_FAILED.getCode()); - if (list.contains(status)) { - return; - } - // 判断明细状态. 获取成功和失败的 - long successCount = details.stream() - .map(AllocDetail::getResult) - .filter(AllocDetailResultEnum.SUCCESS.getCode()::equals) - .count(); - long failCount = details.stream() - .map(AllocDetail::getResult) - .filter(AllocDetailResultEnum.FAIL.getCode()::equals) - .count(); - - // 成功和失败都为0 表示进行中 - if (successCount == 0 && failCount == 0){ - allocOrder.setStatus(AllocationStatusEnum.PROCESSING.getCode()) - .setResult(AllocationResultEnum.ALL_PENDING.getCode()); - } else { - if (failCount == details.size()){ - // 全部失败 - allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) - .setResult(AllocationResultEnum.ALL_FAILED.getCode()); - } else if (successCount == details.size()){ - // 全部成功 - allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) - .setResult(AllocationResultEnum.ALL_SUCCESS.getCode()); - } else { - // 部分成功 - allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) - .setResult(AllocationResultEnum.PART_SUCCESS.getCode()); - } - } - allocOrderDetailManager.updateAllById(details); - allocationOrderManager.updateById(allocOrder); - - // 如果状态为分账处理完成, 且与类型发生了变动, 发送通知 - if (Objects.equals(AllocationStatusEnum.ALLOC_END.getCode(), allocOrder.getStatus()) - && !Objects.equals(beforeStatus, AllocationStatusEnum.ALLOC_END.getCode())){ - // 注册通知 多次同步会产生多次变动, 注意处理多次推送通知的问题 - merchantNoticeService.registerAllocNotice(allocOrder, details); - - // 是否开启自动完结 - AllocConfig allocConfig = allocConfigManager.findByAppId(allocOrder.getAppId()).orElse(null); - if (Objects.nonNull(allocConfig)&& allocConfig.getAutoFinish()){ - // 注册一分钟后的分账完结任务 - delayJobService.registerByTransaction(allocOrder.getId(), DaxPayCode.Event.ORDER_ALLOC_FINISH, 60 * 1000L); - } - } - } - - - /** - * 保存同步记录 - */ - private void saveRecord(AllocOrder order, AllocSyncResultBo syncResult){ - TradeSyncRecord syncRecord = new TradeSyncRecord() - .setBizTradeNo(order.getBizAllocNo()) - .setTradeNo(order.getAllocNo()) - .setOutTradeNo(order.getOutAllocNo()) - .setTradeType(TradeTypeEnum.ALLOCATION.getCode()) - .setChannel(order.getChannel()) - .setSyncInfo(syncResult.getSyncInfo()) - .setClientIp(PaymentContextLocal.get().getClientInfo().getClientIp()); - paySyncRecordService.saveRecord(syncRecord); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java deleted file mode 100644 index 6f335756..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.dromara.daxpay.service.service.allocation.order; - -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.exception.ValidationFailedException; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.PayAllocStatusEnum; -import org.dromara.daxpay.core.exception.OperationUnsupportedException; -import org.dromara.daxpay.core.exception.TradeNotExistException; -import org.dromara.daxpay.core.exception.TradeStatusErrorException; -import org.dromara.daxpay.core.param.allocation.order.AllocationParam; -import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; -import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; -import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 分账订单查询服务类 - * @author xxm - * @since 2024/5/30 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AllocOrderQueryService { - - private final AllocDetailManager allocOrderDetailManager; - - private final AllocOrderManager allocationOrderManager; - private final PayOrderQueryService payOrderQueryService; - - /** - * 分页查询 - */ - public PageResult page(PageParam pageParam, AllocOrderQuery param){ - return MpUtil.toPageResult(allocationOrderManager.page(pageParam, param)); - } - - /** - * 查询详情 - */ - public AllocOrderVo findById(Long id) { - return allocationOrderManager.findById(id).map(AllocOrder::toResult).orElseThrow(() -> new DataNotExistException("分账订单不存在")); - } - - /** - * 查询订单明细列表 - */ - public List findDetailsByOrderId(Long orderId){ - return MpUtil.toListResult(allocOrderDetailManager.findAllByOrderId(orderId)); - } - - /** - * 查询订单明细详情 - */ - public AllocDetailVo findDetailById(Long id){ - return allocOrderDetailManager.findById(id).map(AllocDetail::toResult).orElseThrow(() -> new DataNotExistException("分账订单明细不存在")); - } - - /** - * 获取发起分账或完结的明细 - */ - public List getDetails(Long allocOrderId){ - List details = allocOrderDetailManager.findAllByOrderId(allocOrderId); - // 过滤掉忽略的条目 - return details.stream() - .filter(detail -> !Objects.equals(detail.getResult(), AllocDetailResultEnum.IGNORE.getCode())) - .collect(Collectors.toList()); - } - - /** - * 获取并检查支付订单 - */ - public PayOrder getAndCheckPayOrder(AllocationParam param) { - // 校验参数 - if (StrUtil.isBlank(param.getOrderNo()) && Objects.isNull(param.getBizOrderNo())&& Objects.isNull(param.getOutOrderNo())){ - throw new ValidationFailedException("支付订单号不能都为空"); - } - // 查询支付单 - PayOrder payOrder = payOrderQueryService.findAnyOrderNo(param.getOrderNo(), param.getBizOrderNo(), param.getOutOrderNo(), param.getAppId()) - .orElseThrow(() -> new TradeNotExistException("支付单不存在")); - // 判断订单是否可以分账 - if (!payOrder.getAllocation()){ - throw new OperationUnsupportedException("该订单不允许分账"); - } - // 判断分账状态 - if (Objects.equals(PayAllocStatusEnum.ALLOCATION.getCode(), payOrder.getAllocStatus())){ - throw new TradeStatusErrorException("该订单已分账完成"); - } - return payOrder; - } -} - diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java deleted file mode 100644 index d00126e8..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java +++ /dev/null @@ -1,244 +0,0 @@ -package org.dromara.daxpay.service.service.allocation.order; - -import cn.bootx.platform.core.exception.ValidationFailedException; -import cn.bootx.platform.core.util.BigDecimalUtil; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocationResultEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; -import org.dromara.daxpay.core.enums.PayAllocStatusEnum; -import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.core.param.allocation.order.AllocationParam; -import org.dromara.daxpay.core.param.allocation.order.AllocationParam.ReceiverParam; -import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupManager; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.allocation.order.AllocAndDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; -import org.dromara.daxpay.service.service.allocation.receiver.AllocGroupService; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 分账交易记录服务 - * @author xxm - * @since 2024/11/14 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AllocOrderService { - - private final AllocReceiverManager receiverManager; - - private final AllocOrderManager transactionManager; - - private final AllocGroupManager groupManager; - - private final AllocGroupService allocGroupService; - - private final AllocDetailManager transactionDetailManager; - - private final PayOrderManager payOrderManager; - - /** - * 生成分账订单, 根据分账组创建 - */ - @Transactional(rollbackFor = Exception.class) - public AllocAndDetail createAndUpdate(AllocationParam param, PayOrder payOrder, List receiversByGroups) { - // 订单明细 - List details = receiversByGroups.stream() - .map(o -> { - // 计算分账金额, 小数部分直接舍弃, 防止分账金额超过上限 - // 等同于 payOrder.getAmount() * rate / 100; - var amount = payOrder.getAmount() - .multiply(o.getRate()) - .divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN); - - AllocDetail detail = new AllocDetail() - .setReceiverNo(o.getReceiverNo()) - .setReceiverId(o.getReceiverId()) - .setAmount(amount) - .setResult(AllocDetailResultEnum.PENDING.getCode()) - .setRate(o.getRate()) - .setReceiverName(o.getReceiverName()) - .setReceiverAccount(o.getReceiverAccount()) - .setReceiverType(o.getReceiverType()); - // 如果金额为0, 设置为分账失败, 不参与分账 - if (BigDecimalUtil.isEqual(amount, BigDecimal.ZERO)) { - detail.setResult(AllocDetailResultEnum.IGNORE.getCode()) - .setErrorMsg("分账比例有误或金额太小, 无法进行分账") - .setFinishTime(LocalDateTime.now()); - } - return detail; - }) - .collect(Collectors.toList()); - return this.saveAllocOrder(param, payOrder, details); - } - - /** - * 生成分账订单, 通过传入的分账方创建 - */ - @Transactional(rollbackFor = Exception.class) - public AllocAndDetail createAndUpdate(AllocationParam param, PayOrder payOrder) { - List receiverNos = param.getReceivers() - .stream() - .map(ReceiverParam::getReceiverNo) - .distinct() - .collect(Collectors.toList()); - if (receiverNos.size() != param.getReceivers() - .size()) { - throw new ValidationFailedException("分账接收方编号重复"); - } - var receiverNoMap = param.getReceivers() - .stream() - .collect(Collectors.toMap(ReceiverParam::getReceiverNo, ReceiverParam::getAmount)); - // 查询分账接收方信息 - var receivers = receiverManager.findAllByReceiverNos(receiverNos, payOrder.getAppId()); - if (receivers.size() != receiverNos.size()) { - throw new ValidationFailedException("分账接收方列表存在重复或无效的数据"); - } - // 判断分账接收方类型是否都与分账订单类型匹配 - boolean anyMatch = receivers.stream() - .anyMatch(o -> !Objects.equals(o.getChannel(), payOrder.getChannel())); - if (anyMatch) { - throw new ValidationFailedException("分账接收方列表存在非本通道的数据"); - } - long allocId = IdUtil.getSnowflakeNextId(); - // 订单明细 - List details = receivers.stream() - .map(o -> { - // 计算分账比例, 不是很精确 - var amount = receiverNoMap.get(o.getReceiverNo()); - var rate = amount - .divide(payOrder.getAmount(), 2, RoundingMode.DOWN) - .multiply(BigDecimal.valueOf(100)); - AllocDetail detail = new AllocDetail(); - detail.setAllocationId(allocId) - .setReceiverId(o.getId()) - .setReceiverNo(o.getReceiverNo()) - .setAmount(amount) - .setResult(AllocDetailResultEnum.PENDING.getCode()) - .setRate(rate) - .setReceiverType(o.getReceiverType()) - .setReceiverName(o.getReceiverName()) - .setReceiverAccount(o.getReceiverAccount()); - return detail; - }) - .collect(Collectors.toList()); - return this.saveAllocOrder(param, payOrder, details); - } - - /** - * 保存分账相关订单信息 - */ - private AllocAndDetail saveAllocOrder(AllocationParam param, PayOrder payOrder, List details) { - long allocId = IdUtil.getSnowflakeNextId(); - // 分账明细设置ID - details.forEach(o -> o.setAllocationId(allocId)); - // 求分账的总额 - var sumAmount = details.stream() - .map(AllocDetail::getAmount) - .reduce(BigDecimal.ZERO, BigDecimal::add); - // 分账订单 - var allocOrder = new AllocOrder() - .setOrderId(payOrder.getId()) - .setOrderNo(payOrder.getOrderNo()) - .setBizOrderNo(payOrder.getBizOrderNo()) - .setOutOrderNo(payOrder.getOutOrderNo()) - .setAllocNo(TradeNoGenerateUtil.allocation()) - .setBizAllocNo(param.getBizAllocNo()) - .setChannel(payOrder.getChannel()) - .setTitle(param.getTitle()) - .setDescription(param.getDescription()) - .setStatus(AllocationStatusEnum.PROCESSING.getCode()) - .setResult(AllocationResultEnum.ALL_PENDING.getCode()) - .setAmount(sumAmount) - .setNotifyUrl(param.getNotifyUrl()) - .setAttach(param.getAttach()) - .setClientIp(param.getClientIp()); - // 订单标题为空, 则使用支付订单标题 - if (StrUtil.isBlank(allocOrder.getTitle())){ - allocOrder.setTitle(payOrder.getTitle()); - } - // 如果分账订单金额为0, 设置为忽略状态 - if (BigDecimalUtil.isEqual(sumAmount, BigDecimal.ZERO)) { - allocOrder.setStatus(AllocationStatusEnum.IGNORE.getCode()) - .setFinishTime(LocalDateTime.now()) - .setResult(AllocationStatusEnum.ALLOC_FAILED.getCode()) - .setErrorMsg("分账比例有误或金额太小, 无法进行分账"); - } - - allocOrder.setId(allocId); - // 更新支付订单分账状态 - payOrder.setAllocStatus(PayAllocStatusEnum.ALLOCATION.getCode()); - payOrderManager.updateById(payOrder); - transactionDetailManager.saveAll(details); - transactionManager.save(allocOrder); - return new AllocAndDetail(allocOrder,details); - } - - /** - * 根据新传入的分账订单更新订单信息 - */ - @Transactional(rollbackFor = Exception.class) - public void updateOrder(AllocationParam allocationParam, AllocOrder orderExtra) { - // 扩展信息 - orderExtra.setClientIp(allocationParam.getClientIp()) - .setAttach(allocationParam.getAttach()) - .setReqTime(allocationParam.getReqTime()); - transactionManager.updateById(orderExtra); - } - - - /** - * 检查并构建分账订单相关信息 - */ - @Transactional(rollbackFor = Exception.class) - public AllocAndDetail checkAndCreateAlloc(AllocationParam param, PayOrder payOrder){ - // 创建分账单和明细并保存, 同时更新支付订单状态 使用事务 - AllocAndDetail orderAndDetail; - // 判断是否传输了分账接收方列表 - if (CollUtil.isNotEmpty(param.getReceivers())) { - orderAndDetail = this.createAndUpdate(param, payOrder); - } else { - AllocGroup allocationGroup; - if (Objects.nonNull(param.getGroupNo())){ - // 指定分账组 - allocationGroup = groupManager.findByGroupNo(payOrder.getChannel(), param.getGroupNo(),param.getAppId()) - .orElseThrow(() -> new DataErrorException("未查询到分账组")); - } else { - // 默认分账组 - allocationGroup = groupManager.findDefaultGroup(payOrder.getChannel(),param.getAppId()) - .orElseThrow(() -> new DataErrorException("未查询到默认分账组")); - } - // 判断通道类型是否一致 - if (!Objects.equals(allocationGroup.getChannel(), payOrder.getChannel())){ - throw new ValidationFailedException("分账接收方列表存在非本通道的数据"); - } - - var receiversByGroups = allocGroupService.findReceiversByGroups(allocationGroup.getId()); - orderAndDetail = this.createAndUpdate(param ,payOrder, receiversByGroups); - } - return orderAndDetail; - } -} - diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java deleted file mode 100644 index 9e326fa9..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java +++ /dev/null @@ -1,246 +0,0 @@ -package org.dromara.daxpay.service.service.allocation.receiver; - -import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.exception.BizException; -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.lang.UUID; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.service.convert.allocation.AllocGroupConvert; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupManager; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupReceiverManager; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroupReceiver; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; -import org.dromara.daxpay.service.param.allocation.group.*; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupVo; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * 分账组服务 - * @author xxm - * @since 2024/4/1 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AllocGroupService { - private final AllocGroupManager groupManager; - private final AllocGroupReceiverManager groupReceiverManager; - private final AllocReceiverManager receiverManager; - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, AllocGroupQuery query){ - return MpUtil.toPageResult(groupManager.page(pageParam, query)); - } - - /** - * 查询详情 - */ - public AllocGroupVo findById(Long id){ - return groupManager.findById(id).map(AllocGroup::toResult).orElseThrow(()->new DataNotExistException("分账组不存在")); - } - - /** - * 查询分账接收方 - */ - public List findReceiversByGroups(Long groupId){ - List groupReceivers = groupReceiverManager.findByGroupId(groupId); - List receiverIds = groupReceivers.stream() - .map(AllocGroupReceiver::getReceiverId) - .collect(Collectors.toList()); - // 查询关联接收方信息 - Map receiverMap = receiverManager.findAllByIds(receiverIds) - .stream() - .collect(Collectors.toMap(AllocReceiver::getId, Function.identity(), CollectorsFunction::retainLatest)); - // 组装信息 - return groupReceivers.stream() - .map(o -> { - AllocReceiver receiver = receiverMap.get(o.getReceiverId()); - AllocGroupReceiverVo result = new AllocGroupReceiverVo() - .setReceiverId(receiver.getId()) - .setReceiverNo(receiver.getReceiverNo()) - .setReceiverType(receiver.getReceiverType()) - .setReceiverAccount(receiver.getReceiverAccount()) - .setReceiverName(receiver.getReceiverName()) - .setRate(o.getRate()); - result.setId(o.getId()); - return result; - }) - .collect(Collectors.toList()); - } - - /** - * 创建分账组 - */ - public void create(AllocGroupParam param){ - String uuid = UUID.fastUUID().toString(true); - AllocGroup group = AllocGroupConvert.CONVERT.toEntity(param); - group.setTotalRate(BigDecimal.ZERO); - // 默认设置分账组编号 - group.setGroupNo(uuid); - groupManager.save(group); - } - - /** - * 设置默认分账组 - */ - @Transactional(rollbackFor = Exception.class) - public void setUpDefault(Long id){ - // 分账组 - AllocGroup group = groupManager.findById(id).orElseThrow(() -> new DataNotExistException("未找到分账组")); - groupManager.clearDefault(group.getChannel(), group.getAppId()); - group.setDefaultGroup(true); - groupManager.updateById(group); - } - - /** - * 清除默认分账组 - */ - @Transactional(rollbackFor = Exception.class) - public void clearDefault(Long id){ - AllocGroup group = groupManager.findById(id).orElseThrow(() -> new DataNotExistException("未找到分账组")); - group.setDefaultGroup(false); - groupManager.updateById(group); - } - - /** - * 更新分账组 - */ - public void update(AllocGroupParam param){ - AllocGroup group = groupManager.findById(param.getId()).orElseThrow(() -> new DataNotExistException("未找到分账组")); - BeanUtil.copyProperties(param,group, CopyOptions.create().ignoreNullValue()); - group.setTotalRate(null); - groupManager.updateById(group); - } - - /** - * 删除分账组 - */ - @Transactional(rollbackFor = Exception.class) - public void delete(Long id){ - groupManager.deleteById(id); - groupReceiverManager.deleteByGroupId(id); - } - - /** - * 绑定分账接收方 - */ - @Transactional(rollbackFor = Exception.class) - public void bindReceivers(AllocGroupBindParam param) { - // 分账组 - AllocGroup group = groupManager.findById(param.getGroupId()).orElseThrow(() -> new DataNotExistException("未找到分账组")); - // 查询接收方 - List receiverParams = param.getReceivers(); - List receiverIds = receiverParams.stream() - .map(AllocGroupReceiverParam::getReceiverId) - .collect(Collectors.toList()); - List receivers = receiverManager.findAllByIds(receiverIds); - if (receivers.size() != receiverIds.size()){ - throw new DataNotExistException("传入的分账接收房数量与查询到的不一致"); - } - // 接收方只能为一个支付通道 - long count = receivers.stream() - .map(AllocReceiver::getChannel) - .distinct() - .count(); - if (count > 1){ - throw new BizException("接收方只能为一个支付通道"); - } - // 检查接收方和传入的通道是否是不一致 - if (!Objects.equals(group.getChannel(), receivers.getFirst().getChannel())){ - throw new BizException("接收方和传入的通道不一致"); - } - - // 保存分账接收者 - List groupReceivers = receivers.stream() - .map(receiver -> { - var groupReceiver = new AllocGroupReceiver().setGroupId(group.getId()) - .setReceiverId(receiver.getId()) - .setRate(receiverParams.get(receivers.indexOf(receiver)) - .getRate()); - groupReceiver.setAppId(group.getAppId()); - return groupReceiver; - }) - .collect(Collectors.toList()); - groupReceiverManager.saveAll(groupReceivers); - // 计算分账比例 - var sum = receiverParams.stream() - .map(AllocGroupReceiverParam::getRate) - .reduce(BigDecimal.ZERO, BigDecimal::add); - group.setTotalRate(group.getTotalRate().add(sum)); - groupManager.updateById(group); - } - - /** - * 批量删除分账接收方 - */ - @Transactional(rollbackFor = Exception.class) - public void unbindReceivers(AllocGroupUnbindParam param){ - // 分账组 - AllocGroup group = groupManager.findById(param.getGroupId()) - .orElseThrow(() -> new DataNotExistException("未找到分账组")); - // 删除接收方 - List receivers = groupReceiverManager.findAllByIds(param.getReceiverIds()); - if (receivers.size() != param.getReceiverIds().size()){ - throw new DataNotExistException("传入的分账接收房数量与查询到的不一致"); - } - groupReceiverManager.deleteByIds(param.getReceiverIds()); - // 计算分账比例 - var sum = receivers.stream() - .map(AllocGroupReceiver::getRate) - .reduce(BigDecimal.ZERO, BigDecimal::add); - group.setTotalRate(group.getTotalRate().subtract(sum)); - groupManager.updateById(group); - } - - /** - * 删除单个分账接收方 - */ - @Transactional - public void unbindReceiver(Long receiverId){ - AllocGroupReceiver groupReceiver = groupReceiverManager.findById(receiverId) - .orElseThrow(() -> new DataNotExistException("未找到分账接收方")); - AllocGroup group = groupManager.findById(groupReceiver.getGroupId()) - .orElseThrow(() -> new DataNotExistException("未找到分账组")); - // 更新分账比例 - group.setTotalRate(group.getTotalRate().subtract(groupReceiver.getRate())); - // 更新接收比例 - groupReceiverManager.deleteById(receiverId); - groupManager.updateById(group); - } - - /** - * 修改分账比例 - */ - @Transactional(rollbackFor = Exception.class) - public void updateRate(Long receiverId, BigDecimal rate){ - AllocGroupReceiver groupReceiver = groupReceiverManager.findById(receiverId) - .orElseThrow(() -> new DataNotExistException("未找到分账接收方")); - AllocGroup group = groupManager.findById(groupReceiver.getGroupId()) - .orElseThrow(() -> new DataNotExistException("未找到分账组")); - // 更新分账比例 - group.setTotalRate(group.getTotalRate().subtract(groupReceiver.getRate()).add(rate)); - // 更新接收比例 - groupReceiver.setRate(rate); - groupReceiverManager.updateById(groupReceiver); - groupManager.updateById(group); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java deleted file mode 100644 index 019a09a6..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.dromara.daxpay.service.service.allocation.receiver; - -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.rest.dto.LabelValue; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.service.pay.dao.constant.ChannelConstManager; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverQueryParam; -import org.dromara.daxpay.core.result.allocation.receiver.AllocReceiverResult; -import org.dromara.daxpay.service.convert.allocation.AllocReceiverConvert; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupReceiverManager; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; -import org.dromara.daxpay.service.param.allocation.receiver.AllocReceiverQuery; -import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * 分账接收方服务类 - * @author xxm - * @since 2024/3/27 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AllocReceiverService { - - private final AllocGroupReceiverManager groupReceiverManager; - - private final AllocReceiverManager allocReceiverManager; - - private final ChannelConstManager channelConstManager; - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, AllocReceiverQuery query) { - return MpUtil.toPageResult(allocReceiverManager.page(pageParam, query)); - } - - /** - * 查询详情 - */ - public AllocReceiverVo findById(Long id) { - return allocReceiverManager.findById(id) - .map(AllocReceiver::toResult) - .orElseThrow(() -> new DataNotExistException("分账接收方不存在")); - } - - - /** - * 分账接收方列表 - */ - public AllocReceiverResult list(AllocReceiverQueryParam param){ - List allocReceivers = allocReceiverManager.findAllByChannel(param.getChannel(), param.getAppId()); - List list = AllocReceiverConvert.CONVERT.toList(allocReceivers); - return new AllocReceiverResult().setReceivers(list); - } - - - /** - * 分账方删除 - */ - @Transactional(rollbackFor = Exception.class) - public void remove(Long id) { - // 判断是否存在 - var receiver = allocReceiverManager.findById(id).orElseThrow(() -> new DataErrorException("该接收方不存在")); - if (groupReceiverManager.isUsed(receiver.getId())) { - throw new OperationFailException("该接收方已被使用,无法被删除"); - } - allocReceiverManager.deleteById(receiver.getId()); - } - - /** - * 可分账的通道列表 - */ - public List findChannels() { - return channelConstManager.findAllByAllocatable().stream() - .map(item->new LabelValue(item.getName(), item.getCode())) - .toList(); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java deleted file mode 100644 index 65ee24a4..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java +++ /dev/null @@ -1,198 +0,0 @@ -package org.dromara.daxpay.service.service.assist; - -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.exception.ValidationFailedException; -import cn.bootx.platform.core.util.DateTimeUtil; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.date.LocalDateTimeUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.context.MchAppLocal; -import org.dromara.daxpay.core.context.PaymentClientLocal; -import org.dromara.daxpay.core.enums.MchAppStatusEnum; -import org.dromara.daxpay.core.enums.MerchantStatusEnum; -import org.dromara.daxpay.core.enums.SignTypeEnum; -import org.dromara.daxpay.core.exception.ConfigNotEnableException; -import org.dromara.daxpay.core.exception.VerifySignFailedException; -import org.dromara.daxpay.core.param.PaymentCommonParam; -import org.dromara.daxpay.core.result.DaxResult; -import org.dromara.daxpay.core.util.PaySignUtil; -import org.dromara.daxpay.service.common.cache.MchAppCacheService; -import org.dromara.daxpay.service.common.local.MchContextLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.entity.merchant.MchApp; -import org.dromara.daxpay.service.service.config.PlatformConfigService; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.Objects; - -/** - * 交易支持服务接口 - * @author xxm - * @since 2023/12/26 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PaymentAssistService { - - private final PlatformConfigService platformConfigService; - - private final MchAppCacheService mchAppCacheService; - - /** - * 初始化请求相关信息上下文 - */ - public void initClient(PaymentCommonParam paymentCommonParam){ - PaymentClientLocal request = PaymentContextLocal.get().getClientInfo(); - request.setClientIp(paymentCommonParam.getClientIp()); - } - - /** - * 入参签名校验 - */ - public void signVerify(PaymentCommonParam param) { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - // 判断是否不需要签名 - if (!mchAppInfo.getReqSign()){ - return; - } - String sign = this.genSign(param); - if (!Objects.equals(sign,param.getSign())){ - throw new VerifySignFailedException(); - } - } - - /** - * 请求有效时间校验 - */ - public void reqTimeoutVerify(PaymentCommonParam param) { - var mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - // 开启请求超时校验并设置值 - if (mchAppInfo.getReqTimeout() && Objects.nonNull(mchAppInfo.getReqTimeoutSecond()) ){ - LocalDateTime now = LocalDateTime.now(); - // 时间差值(秒) - long durationSeconds = Math.abs(LocalDateTimeUtil.between(now, param.getReqTime()).getSeconds()); - // 当前时间是否晚于请求时间 - if (DateTimeUtil.lt(now, param.getReqTime())){ - // 请求时间比服务器时间晚, 超过配置时间直接打回 - if (durationSeconds > mchAppInfo.getReqTimeoutSecond()){ - throw new ValidationFailedException("请求时间晚于服务器接收到的时间,请检查"); - } - } else { - // 请求时间比服务器时间早, 超过配置时间直接打回 - if (durationSeconds > mchAppInfo.getReqTimeoutSecond()){ - throw new ValidationFailedException("请求已过期,请重新发送!"); - } - } - - } - } - - /** - * 对响应对象进行签名 - */ - public void sign(DaxResult result) { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - String signType = mchAppInfo.getSignType(); - if (Objects.equals(SignTypeEnum.HMAC_SHA256.getCode(), signType)){ - result.setSign(PaySignUtil.hmacSha256Sign(result, mchAppInfo.getSignSecret())); - } - else if (Objects.equals(SignTypeEnum.MD5.getCode(), signType)){ - result.setSign(PaySignUtil.md5Sign(result, mchAppInfo.getSignSecret())); - } else if (Objects.equals(SignTypeEnum.SM3.getCode(), signType)){ - result.setSign(PaySignUtil.md5Sign(result, mchAppInfo.getSignSecret())); - } - else { - throw new ValidationFailedException("未获取到签名方式,请检查"); - } - } - - /** - * 获取请求参数的签名值 - */ - public String genSign(PaymentCommonParam param) { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - String signType = mchAppInfo.getSignType(); - if (Objects.equals(SignTypeEnum.HMAC_SHA256.getCode(), signType)){ - return PaySignUtil.hmacSha256Sign(param, mchAppInfo.getSignSecret()); - } else if (Objects.equals(SignTypeEnum.MD5.getCode(), signType)){ - return PaySignUtil.md5Sign(param, mchAppInfo.getSignSecret()); - } else if (Objects.equals(SignTypeEnum.SM3.getCode(), signType)){ - return PaySignUtil.md5Sign(param, mchAppInfo.getSignSecret()); - } - else { - throw new ValidationFailedException("未获取到签名方式,请检查"); - } - } - - /** - * 初始化商户和应用等相关信息, 商户号设置不会生效 - */ - public void initMchAndApp(String mchNo, String appId) { - // 获取应用信息 - MchApp mchApp = mchAppCacheService.get(appId); - this.initData(mchApp); - } - - /** - * 初始化商户和应用信息 - * 1. 统一支付相关接口调用时,要进行初始化 - * 2. 接收到回调时,要进行初始化 - * 3. 接收到消息通知时, 要进行初始化 - * 4. 手动发起根据订单记录发起一些操作时, 读取信息进行初始化 - * 5. 针对核心能力进行包装成功能时(收银台), 手动进行初始化 - */ - public void initMchAndApp(String appId) { - // 获取应用信息 - var mchApp = mchAppCacheService.get(appId); - this.initData(mchApp); - } - - /** - * 初始化数据, - * 2.应用信息 - * 5.平台配置信息 - */ - private void initData(MchApp mchApp){ - // 初始化支付上下文信息 - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - BeanUtil.copyProperties(mchApp, mchAppInfo); - - // 平台信息 - var platformConfig = platformConfigService.getConfig(); - mchAppInfo.setGatewayServiceUrl(platformConfig.getGatewayServiceUrl()) - .setGatewayMobileUrl(platformConfig.getGatewayMobileUrl()); - // 支付限额 - if (platformConfig.getLimitAmount() != null){ - // 如果应用为空读取平台配置 - if (mchAppInfo.getLimitAmount() == null){ - mchAppInfo.setLimitAmount(platformConfig.getLimitAmount()); - } else { - // 都不为空读取小的 - mchAppInfo.setLimitAmount(mchAppInfo.getLimitAmount().min(platformConfig.getLimitAmount())); - } - } - // 初始化商户上下文信息 - MchContextLocal.setMchNo(mchAppInfo.getMchNo()); - } - - /** - * 验证 - */ - public void checkStatus(){ - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - if (Objects.isNull(mchAppInfo)){ - throw new DataNotExistException("未获取到商户和应用信息,请检查"); - } - // 应用 - if (!Objects.equals(mchAppInfo.getStatus(), MchAppStatusEnum.ENABLE.getCode())){ - throw new ConfigNotEnableException("商户应用未启用"); - } - // 商户 - if (!Objects.equals(mchAppInfo.getMchStatus(), MerchantStatusEnum.ENABLE.getCode())){ - throw new ConfigNotEnableException("商户未启用"); - } - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/TerminalDeviceService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/TerminalDeviceService.java deleted file mode 100644 index d7f1660b..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/TerminalDeviceService.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.dromara.daxpay.service.service.assist; - -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.rest.dto.LabelValue; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.lang.UUID; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.assist.TerminalDeviceManager; -import org.dromara.daxpay.service.entity.assist.TerminalDevice; -import org.dromara.daxpay.service.param.termina.TerminalDeviceParam; -import org.dromara.daxpay.service.param.termina.TerminalDeviceQuery; -import org.dromara.daxpay.service.result.termina.TerminalDeviceResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 支付终端设备管理 - * @author xxm - * @since 2025/3/7 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class TerminalDeviceService { - private final TerminalDeviceManager terminalManager; - private final PaymentAssistService paymentAssistService; - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, TerminalDeviceQuery query){ - return MpUtil.toPageResult(terminalManager.page(pageParam, query)); - } - - /** - * 查询详情 - */ - public TerminalDeviceResult findById(Long id){ - return terminalManager.findById(id).map(TerminalDevice::toResult) - .orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); - } - - /** - * 添加 - */ - public void add(TerminalDeviceParam param){ - paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - String uuid = UUID.fastUUID().toString(true); - TerminalDevice entity = TerminalDevice.init(param); - entity.setTerminalNo(uuid) - .setAppId(mchApp.getAppId()) - .setMchNo(mchApp.getMchNo()); - terminalManager.save(entity); - } - - /** - * 修改 - */ - public void edit(TerminalDeviceParam param){ - var entity = terminalManager.findById(param.getId()).orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); - BeanUtil.copyProperties(param, entity, CopyOptions.create().ignoreNullValue()); - terminalManager.updateById(entity); - } - - /** - * 删除 - */ - public void delete(Long id){ - terminalManager.deleteById(id); - } - - /** - * 终端下拉列表 - */ - public List dropdown(String appId) { - return terminalManager.findAllByField(MchAppBaseEntity::getAppId, appId).stream() - .map(o -> new LabelValue(o.getName(), o.getTerminalNo())) - .toList(); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/PlatformConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/PlatformConfigService.java deleted file mode 100644 index 324fa03c..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/config/PlatformConfigService.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.dromara.daxpay.service.service.config; - -import cn.bootx.platform.core.exception.BizInfoException; -import org.dromara.daxpay.service.dao.config.PlatformConfigManager; -import org.dromara.daxpay.service.entity.config.PlatformConfig; -import org.dromara.daxpay.service.param.config.PlatformConfigParam; -import org.dromara.daxpay.service.result.config.PlatformConfigResult; -import cn.hutool.core.bean.BeanUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -/** - * 平台配置 - * @author xxm - * @since 2024/7/17 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PlatformConfigService { - private final PlatformConfigManager platformConfigManager; - - - /** - * 获取平台配置 - */ - @Cacheable(value = "cache:PlatformConfig") - public PlatformConfig getConfig(){ - return platformConfigManager.findById(1L).orElseThrow(() -> new BizInfoException("平台配置不存在")); - } - - /** - * 获取平台配置 - */ - public PlatformConfigResult findConfig(){ - return platformConfigManager.findById(1L).map(PlatformConfig::toResult) - .orElse(new PlatformConfigResult()); - } - - /** - * 新增 - */ - @CacheEvict(value = "cache:PlatformConfig", allEntries = true) - public void update(PlatformConfigParam param){ - var platformConfig = platformConfigManager.findById(1L); - if (platformConfig.isEmpty()){ - PlatformConfig config = new PlatformConfig(); - BeanUtil.copyProperties(param, config); - config.setId(1L); - platformConfigManager.save(config); - } else{ - var config = platformConfig.get(); - BeanUtil.copyProperties(param, config); - platformConfigManager.updateById(config); - } - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/CashierPayService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/CashierPayService.java deleted file mode 100644 index 1cfcbf6c..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/CashierPayService.java +++ /dev/null @@ -1,243 +0,0 @@ -package org.dromara.daxpay.service.service.gateway; - -import cn.bootx.platform.common.spring.util.WebServletUtil; -import cn.bootx.platform.core.annotation.IgnoreTenant; -import cn.bootx.platform.core.exception.DataNotExistException; -import org.dromara.daxpay.core.enums.CashierCodeTypeEnum; -import org.dromara.daxpay.core.enums.ChannelAuthTypeEnum; -import org.dromara.daxpay.core.enums.GatewayCallTypeEnum; -import org.dromara.daxpay.core.exception.ConfigNotEnableException; -import org.dromara.daxpay.core.exception.ConfigNotExistException; -import org.dromara.daxpay.core.exception.TradeProcessingException; -import org.dromara.daxpay.core.exception.UnsupportedAbilityException; -import org.dromara.daxpay.core.param.assist.AuthCodeParam; -import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; -import org.dromara.daxpay.core.param.gateway.*; -import org.dromara.daxpay.core.param.trade.pay.PayParam; -import org.dromara.daxpay.core.result.assist.AuthResult; -import org.dromara.daxpay.core.result.trade.pay.PayResult; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.dao.gateway.AggregateBarPayConfigManager; -import org.dromara.daxpay.service.dao.gateway.CashierCodeConfigManager; -import org.dromara.daxpay.service.dao.gateway.CashierCodeItemConfigManager; -import org.dromara.daxpay.service.dao.gateway.CashierItemConfigManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.trade.pay.PayService; -import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy; -import org.dromara.daxpay.service.strategy.AbsGatewayPayStrategy; -import org.dromara.daxpay.service.util.PaymentStrategyFactory; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.servlet.JakartaServletUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.Objects; -import java.util.Optional; - -/** - * 网关收银台支付服务 - * @author xxm - * @since 2025/4/12 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CashierPayService { - - private final GatewayPayAssistService gatewayPayAssistService; - private final PaymentAssistService paymentAssistService; - private final AggregateBarPayConfigManager aggregateBarPayConfigManager; - private final PayService payService; - private final CashierCodeConfigManager cashierCodeConfigManager; - private final CashierCodeItemConfigManager cashierCodeItemConfigManager; - private final CashierItemConfigManager cashierItemConfigManager; - - /** - * 收银台聚合支付(付款码) - */ - @IgnoreTenant - public PayResult cashierBarPay(GatewayCashierBarPayParam param) { - var payOrder = gatewayPayAssistService.getOrderAndCheck(param.getOrderNo()); - paymentAssistService.initMchAndApp(payOrder.getAppId()); - // 识别付款码类型 - var aggregatePayType = PayUtil.getBarCodeType(param.getAuthCode()); - // 获取聚合付款码支付配置 - var barPayConfigs = aggregateBarPayConfigManager.findByAppIdAndType(payOrder.getAppId(), aggregatePayType.getCode()); - if (CollUtil.isEmpty(barPayConfigs)){ - throw new ConfigNotExistException("未找到支持该付款码的支付通道"); - } - // 获取支付策略 - var barPayConfig = barPayConfigs.getFirst(); - var payParam = new PayParam(); - payParam.setChannel(barPayConfig.getChannel()); - payParam.setMethod(barPayConfig.getBarPayType()); - payParam.setOtherMethod(barPayConfig.getOtherMethod()); - payParam.setAuthCode(param.getAuthCode()); - payParam.setAppId(barPayConfig.getAppId()); - // 设置IP - if (Objects.isNull(payParam.getClientIp())){ - String ip = Optional.ofNullable(WebServletUtil.getRequest()) - .map(JakartaServletUtil::getClientIP) - .orElse("127.0.0.1"); - payParam.setClientIp(ip); - } - return payService.payHandle(payParam,payOrder); - } - - /** - * 网关收银台支付调用 - */ - @IgnoreTenant - public PayResult cashierPay(GatewayCashierPayParam param){ - // 订单信息 - PayOrder payOrder = gatewayPayAssistService.getOrderAndCheck(param.getOrderNo()); - paymentAssistService.initMchAndApp(payOrder.getAppId()); - // 获取配置项 - var itemConfig = cashierItemConfigManager.findByIdAndAppId(param.getItemId(),payOrder.getAppId()) - .orElseThrow(() -> new TradeProcessingException("支付配置项不存在")); - // 判断支付调用类型 - var callTypeEnum = GatewayCallTypeEnum.findBuyCode(itemConfig.getCallType()); - switch (callTypeEnum) { - case QR_CODE, LINK, BAR_CODE, JSAPI, FROM -> { - return this.payHandle(param, payOrder); - } - default -> throw new UnsupportedAbilityException("不支持的支付调用类型"); - } - } - - /** - * 处理网关支付参数后使用通用支付接口调起支付 - */ - private PayResult payHandle(GatewayCashierPayParam param, PayOrder payOrder){ - // 查询配置 - var itemConfig = cashierItemConfigManager.findByIdAndAppId(param.getItemId(),payOrder.getAppId()) - .orElseThrow(() -> new TradeProcessingException("支付配置项不存在")); - paymentAssistService.initMchAndApp(payOrder.getAppId()); - // 构建支付参数 - var payParam = new PayParam(); - payParam.setChannel(itemConfig.getChannel()); - payParam.setMethod(itemConfig.getPayMethod()); - payParam.setOtherMethod(itemConfig.getOtherMethod()); - payParam.setAuthCode(param.getAuthCode()); - payParam.setOpenId(param.getOpenId()); - payParam.setAppId(itemConfig.getAppId()); - // 设置IP - if (Objects.isNull(payParam.getClientIp())){ - String ip = Optional.ofNullable(WebServletUtil.getRequest()) - .map(JakartaServletUtil::getClientIP) - .orElse("127.0.0.1"); - payParam.setClientIp(ip); - } - - // 获取策略 - var cashierStrategy = PaymentStrategyFactory.create(itemConfig.getChannel(), AbsGatewayPayStrategy.class); - // 进行参数预处理 - cashierStrategy.handlePayParam(param, payParam); - // 发起支付 - return payService.payHandle(payParam,payOrder); - } - - /** - * 收银码牌支付 - */ - @IgnoreTenant - public PayResult cashierCodePay(GatewayCashierCodePayParam param){ - // 查询码牌配置 - var codeConfig = cashierCodeConfigManager.findByCode(param.getCashierCode()) - .orElseThrow(() -> new DataNotExistException("码牌不存在")); - // 是否启用 - if (!codeConfig.getEnable()) { - throw new ConfigNotEnableException("支付码牌已禁用"); - } - paymentAssistService.initMchAndApp(codeConfig.getAppId()); - var itemConfig = cashierCodeItemConfigManager.findByCodeAndType(codeConfig.getId(), param.getCashierType()) - .orElseThrow(() -> new DataNotExistException("码牌配置不存在")); - // 构建支付参数 - PayParam payParam = new PayParam(); - payParam.setBizOrderNo(TradeNoGenerateUtil.pay()); - - payParam.setChannel(itemConfig.getChannel()); - payParam.setMethod(itemConfig.getPayMethod()); - payParam.setOtherMethod(itemConfig.getOtherMethod()); - payParam.setAppId(itemConfig.getAppId()); - payParam.setTitle(StrUtil.format("手机收银金额: {}元", param.getAmount())); - payParam.setLimitPay(codeConfig.getLimitPay()); - payParam.setDescription(param.getDescription()); - payParam.setAmount(param.getAmount()); - payParam.setOpenId(param.getOpenId()); - payParam.setReqTime(LocalDateTime.now()); - // 设置IP - String ip = Optional.ofNullable(WebServletUtil.getRequest()) - .map(JakartaServletUtil::getClientIP) - .orElse("127.0.0.1"); - payParam.setClientIp(ip); - - // 发起支付 - return payService.pay(payParam); - } - - - /** - * 生成码牌所需授权链接跳转链接, 主要是微信类通道使用, 用于获取OpenId - */ - @IgnoreTenant - public String genAuthUrl(GatewayCashierCodeAuthUrlParam param){ - // 查询码牌配置 - var codeConfig = cashierCodeConfigManager.findByCode(param.getCashierCode()) - .orElseThrow(() -> new DataNotExistException("码牌不存在")); - // 是否启用 - if (!codeConfig.getEnable()) { - throw new ConfigNotEnableException("支付码牌已禁用"); - } - paymentAssistService.initMchAndApp(codeConfig.getAppId()); - var codeItemConfig = cashierCodeItemConfigManager.findByCodeAndType(codeConfig.getId(), param.getCashierType()) - .orElseThrow(() -> new DataNotExistException("码牌配置不存在")); - // 获取认证策略 - var channelAuthStrategy = PaymentStrategyFactory.create(codeItemConfig.getChannel(), AbsChannelAuthStrategy.class); - var cashierCodeType = CashierCodeTypeEnum.findByCode(codeItemConfig.getType()); - return switch (cashierCodeType) { - case WECHAT_PAY -> { - var authUrlParam = new GenerateAuthUrlParam() - .setAuthType(ChannelAuthTypeEnum.WECHAT.getCode()) - .setAuthPath(StrUtil.format("/wechat/cashier/code/{}", codeConfig.getCode())); - yield channelAuthStrategy.generateAuthUrl(authUrlParam).getAuthUrl(); - } - case ALIPAY, UNION_PAY -> throw new UnsupportedAbilityException("暂不支持该认证方式"); - }; - - } - - /** - * 获取认证结果 - */ - @IgnoreTenant - public AuthResult auth(GatewayCashierCodeAuthParam param){ - // 查询码牌配置 - var codeConfig = cashierCodeConfigManager.findByCode(param.getCashierCode()) - .orElseThrow(() -> new DataNotExistException("码牌不存在")); - // 是否启用 - if (!codeConfig.getEnable()) { - throw new ConfigNotEnableException("支付码牌已禁用"); - } - paymentAssistService.initMchAndApp(codeConfig.getAppId()); - var codeItemConfig = cashierCodeItemConfigManager.findByCodeAndType(codeConfig.getId(), param.getCashierType()) - .orElseThrow(() -> new DataNotExistException("码牌配置不存在")); - // 获取认证策略 - var channelAuthStrategy = PaymentStrategyFactory.create(codeItemConfig.getChannel(), AbsChannelAuthStrategy.class); - var cashierCodeType = CashierCodeTypeEnum.findByCode(codeItemConfig.getType()); - return switch (cashierCodeType) { - case WECHAT_PAY -> { - var codeParam = new AuthCodeParam() - .setAuthType(ChannelAuthTypeEnum.WECHAT.getCode()) - .setAuthCode(param.getAuthCode()); - yield channelAuthStrategy.doAuth(codeParam); - } - case ALIPAY, UNION_PAY -> throw new UnsupportedAbilityException("暂不支持该认证方式"); - }; - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/CashierCodeConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/CashierCodeConfigService.java deleted file mode 100644 index bfc79b17..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/CashierCodeConfigService.java +++ /dev/null @@ -1,173 +0,0 @@ -package org.dromara.daxpay.service.service.gateway.config; - -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.exception.DataNotExistException; -import org.dromara.daxpay.service.common.local.MchContextLocal; -import org.dromara.daxpay.service.dao.gateway.CashierCodeConfigManager; -import org.dromara.daxpay.service.dao.gateway.CashierCodeItemConfigManager; -import org.dromara.daxpay.service.entity.config.PlatformConfig; -import org.dromara.daxpay.service.entity.gateway.CashierCodeConfig; -import org.dromara.daxpay.service.entity.gateway.CashierCodeItemConfig; -import org.dromara.daxpay.service.param.gateway.CashierCodeConfigParam; -import org.dromara.daxpay.service.param.gateway.CashierCodeItemConfigParam; -import org.dromara.daxpay.service.result.gateway.config.CashierCodeConfigResult; -import org.dromara.daxpay.service.result.gateway.config.CashierCodeItemConfigResult; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.config.PlatformConfigService; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.lang.UUID; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * 收银码牌配置 - * @author xxm - * @since 2025/4/1 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CashierCodeConfigService { - - private final CashierCodeConfigManager cashierCodeConfigManager; - - private final CashierCodeItemConfigManager codeItemConfigManager; - - private final PlatformConfigService platformConfigService; - - private final PaymentAssistService paymentAssistService; - - /** - * 添加 - */ - public void save(CashierCodeConfigParam param) { - paymentAssistService.initMchAndApp(param.getAppId()); - String uuid = UUID.fastUUID().toString(true); - CashierCodeConfig config = CashierCodeConfig.init(param); - config.setCode(uuid); - cashierCodeConfigManager.save(config); - } - - /** - * 更新 - */ - public void update(CashierCodeConfigParam param) { - CashierCodeConfig channelCashierConfig = cashierCodeConfigManager.findById(param.getId()) - .orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); - BeanUtil.copyProperties(param, channelCashierConfig, CopyOptions.create().ignoreNullValue()); - cashierCodeConfigManager.updateById(channelCashierConfig); - } - - /** - * 列表 - */ - public List findAllByAppId(String appId) { - return MpUtil.toListResult(cashierCodeConfigManager.findAllByAppId(appId)); - } - - /** - * 查询详情 - */ - public CashierCodeConfigResult findById(Long id) { - return cashierCodeConfigManager.findById(id).map(CashierCodeConfig::toResult).orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); - } - - /** - * 删除 - */ - @Transactional(rollbackFor = Exception.class) - public void delete(Long id) { - if (!cashierCodeConfigManager.existedById(id)){ - throw new DataNotExistException("收银码牌配置不存在"); - } - // 删除类型配置 - codeItemConfigManager.deleteByCode(id); - cashierCodeConfigManager.deleteById(id); - } - - /** - * 获取码牌地址 - */ - public String getCashierCodeUrl(Long id) { - var codeConfig= cashierCodeConfigManager.findById(id).orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); - PlatformConfig platformConfig = platformConfigService.getConfig(); - String serverUrl = platformConfig.getGatewayMobileUrl(); - return StrUtil.format("{}/cashier/code/{}", serverUrl, codeConfig.getCode()); - } - - /** - * 明细配置列表 - */ - public List findItemByCodeId(Long codeId) { - return MpUtil.toListResult(codeItemConfigManager.findAllByCodeId(codeId)); - } - - /** - * 查询明细配置详情 - */ - public CashierCodeItemConfigResult findItemById(Long id) { - return codeItemConfigManager.findById(id).map(CashierCodeItemConfig::toResult).orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); - } - - /** - * 判断明细配置收银台类型是否存在 - */ - public boolean existsByTypeItem(String type, Long codeId) { - return codeItemConfigManager.existsByType(type, codeId); - } - - /** - * 判断明细配置收银台类型是否存在 - */ - public boolean existsByTypeItem(String type, Long codeId, Long id) { - return codeItemConfigManager.existsByType(type, codeId, id); - } - - /** - * 添加明细配置 - */ - public void saveItem(CashierCodeItemConfigParam param) { - var codeConfig = cashierCodeConfigManager.findById(param.getCodeId()) - .orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); - // 收银码牌类型不能重复 - boolean existed = codeItemConfigManager.existsByType(param.getType(), param.getId()); - if (existed){ - throw new DataNotExistException("收银码牌类型不可重复配置"); - } - - CashierCodeItemConfig entity = CashierCodeItemConfig.init(param); - entity.setAppId(codeConfig.getAppId()); - codeItemConfigManager.save(entity); - } - - /** - * 更新明细配置 - */ - public void updateItem(CashierCodeItemConfigParam param) { - // 收银码牌类型不能重复 - boolean existed = codeItemConfigManager.existsByType(param.getType(), param.getId(), param.getId()); - if (existed){ - throw new DataNotExistException("收银码牌类型不可重复配置"); - } - var channelCashierConfig = codeItemConfigManager.findById(param.getId()) - .orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); - BeanUtil.copyProperties(param, channelCashierConfig, CopyOptions.create().ignoreNullValue()); - codeItemConfigManager.updateById(channelCashierConfig); - } - /** - * 删除明细配置 - */ - public void deleteItem(Long id) { - if (!codeItemConfigManager.existedById(id)){ - throw new DataNotExistException("该码牌类型配置不存在"); - } - codeItemConfigManager.deleteById(id); - } - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/GatewayPayConfigService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/GatewayPayConfigService.java deleted file mode 100644 index c85bf4c8..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/gateway/config/GatewayPayConfigService.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.dromara.daxpay.service.service.gateway.config; - -import cn.bootx.platform.core.exception.DataNotExistException; -import cn.bootx.platform.core.exception.RepetitiveOperationException; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.gateway.GatewayPayConfigManager; -import org.dromara.daxpay.service.entity.gateway.GatewayPayConfig; -import org.dromara.daxpay.service.param.gateway.GatewayPayConfigParam; -import org.dromara.daxpay.service.result.gateway.config.GatewayPayConfigResult; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import cn.hutool.core.bean.BeanUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 网关支付配置 - * @author xxm - * @since 2025/3/24 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class GatewayPayConfigService { - private final GatewayPayConfigManager gatewayPayConfigManager; - private final PaymentAssistService paymentAssistService; - - /** - * 获取网关支付配置 - */ - public GatewayPayConfigResult getConfig(String appId){ - return gatewayPayConfigManager.findByAppId(appId).map(GatewayPayConfig::toResult) - .orElse(new GatewayPayConfigResult()); - } - - /** - * 保存网关支付配置 - */ - public void save(GatewayPayConfigParam param){ - // 判断是否已经存在 - if (gatewayPayConfigManager.existsByAppId(param.getAppId())){ - throw new RepetitiveOperationException("该应用已存在网关支付配置"); - } - paymentAssistService.initMchAndApp(param.getAppId()); - var mchApp = PaymentContextLocal.get().getMchAppInfo(); - var entity = GatewayPayConfig.init(param); - gatewayPayConfigManager.save(entity); - } - - /** - * 更新网关支付配置 - */ - public void update(GatewayPayConfigParam param){ - var gatewayPayConfig = gatewayPayConfigManager.findById(param.getId()) - .orElseThrow(() -> new DataNotExistException("收银台网关支付不存在")); - BeanUtil.copyProperties(param, gatewayPayConfig); - gatewayPayConfigManager.updateById(gatewayPayConfig); - } - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/merchant/MchAppService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/merchant/MchAppService.java deleted file mode 100644 index 93aa3f9d..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/merchant/MchAppService.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.dromara.daxpay.service.service.merchant; - -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.core.exception.BizException; -import cn.bootx.platform.core.rest.dto.LabelValue; -import cn.bootx.platform.core.rest.param.PageParam; -import cn.bootx.platform.core.rest.result.PageResult; -import org.dromara.daxpay.core.enums.MchAppStatusEnum; -import org.dromara.daxpay.core.enums.MerchantTypeEnum; -import org.dromara.daxpay.core.exception.ConfigNotExistException; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.service.convert.merchant.MchAppConvert; -import org.dromara.daxpay.service.dao.config.ChannelConfigManager; -import org.dromara.daxpay.service.dao.merchant.MchAppManager; -import org.dromara.daxpay.service.entity.config.ChannelConfig; -import org.dromara.daxpay.service.entity.merchant.MchApp; -import org.dromara.daxpay.service.param.merchant.MchAppParam; -import org.dromara.daxpay.service.param.merchant.MchAppQuery; -import org.dromara.daxpay.service.result.merchant.MchAppResult; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.util.RandomUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 商户应用服务类(运营端) - * @author xxm - * @since 2024/8/28 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class MchAppService { - - private final MchAppManager mchAppManager; - - private final ChannelConfigManager channelConfigManager; - - /** - * 添加应用 - */ - public void add(MchAppParam param) { - var entity = MchAppConvert.CONVERT.toEntity(param); - entity.setMerchantType(MerchantTypeEnum.COMMON.getCode()) - .setMchNo("M001"); - // 生成应用号 - entity.setAppId(this.generateAppId()).setStatus(MchAppStatusEnum.ENABLE.getCode()); - mchAppManager.save(entity); - } - - /** - * 修改 - */ - public void update(MchAppParam param) { - MchApp mchApp = mchAppManager.findById(param.getId()).orElseThrow(ConfigNotExistException::new); - BeanUtil.copyProperties(param, mchApp, CopyOptions.create().ignoreNullValue()); - mchAppManager.updateById(mchApp); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, MchAppQuery query) { - return MpUtil.toPageResult(mchAppManager.page(pageParam, query)); - } - - /** - * 获取单条 - */ - public MchAppResult findById(Long id) { - return mchAppManager.findById(id).map(MchApp::toResult).orElseThrow(ConfigNotExistException::new); - } - - /** - * 删除 - */ - public void delete(Long id) { - MchApp mchApp = mchAppManager.findById(id) - .orElseThrow(ConfigNotExistException::new); - - // 查看是否有配置的支付配置 - if (channelConfigManager.existedByField(ChannelConfig::getAppId, mchApp.getAppId())){ - throw new OperationFailException("该商户应用已绑定支付配置,请先删除支付配置"); - } - - mchAppManager.deleteById(id); - } - - /** - * 启用下拉列表, 需要应用和商户都是启用状态 - */ - public List dropdownByEnable(){ - - // 查询启用的应用 - return mchAppManager.findAllByStatus(MchAppStatusEnum.ENABLE).stream() - .map(o->new LabelValue(o.getAppName(),o.getAppId())) - .collect(Collectors.toList()); - } - - /** - * 下拉列表, 不判断应用和商户的中途 - */ - public List dropdown(){ - // 查询启用的应用 - return mchAppManager.findAll().stream() - .map(o->new LabelValue(o.getAppName(),o.getAppId())) - .collect(Collectors.toList()); - } - - /** - * 生成应用号 - */ - private String generateAppId() { - String appId = RandomUtil.randomNumbers(16); - for (int i = 0; i < 10; i++){ - if (!mchAppManager.existedByField(MchApp::getAppId, appId)){ - return "A"+ appId; - } - appId = String.valueOf(System.currentTimeMillis()); - } - throw new BizException("应用号生成失败"); - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java deleted file mode 100644 index 81a2e88e..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.dromara.daxpay.service.service.order.pay; - -import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.core.exception.TradeNotExistException; -import org.dromara.daxpay.core.param.allocation.order.AllocationParam; -import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.dao.allocation.AllocConfigManager; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.allocation.AllocConfig; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.allocation.AllocationService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.trade.pay.PayCloseService; -import org.dromara.daxpay.service.service.trade.pay.PaySyncService; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Objects; - -/** - * 支付订单服务 - * @author xxm - * @since 2023/12/18 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayOrderService { - private final PayOrderManager payOrderManager; - private final PaySyncService paySyncService; - - private final PaymentAssistService paymentAssistService; - private final PayCloseService payCloseService; - private final AllocConfigManager allocConfigManager; - private final AllocationService allocationService; - - /** - * 同步 - */ - public void sync(Long id) { - PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); - // 初始化商户和应用 - paymentAssistService.initMchAndApp(payOrder.getAppId()); - paySyncService.syncPayOrder(payOrder); - } - - /** - * 关闭订单 - */ - public void close(Long id) { - PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); - // 初始化商户和应用 - paymentAssistService.initMchAndApp(payOrder.getAppId()); - payCloseService.closeOrder(payOrder,false); - } - - /** - * 撤销订单 - */ - public void cancel(Long id) { - PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); - // 初始化商户和应用 - paymentAssistService.initMchAndApp(payOrder.getAppId()); - payCloseService.closeOrder(payOrder,true); - } - - - /** - * 分账 - */ - public void allocation(@NotNull(message = "支付订单id不能为空") Long id) { - PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); - paymentAssistService.initMchAndApp(payOrder.getAppId()); - AllocationParam param = new AllocationParam() - .setBizAllocNo("B"+ TradeNoGenerateUtil.allocation()); - param.setAppId(payOrder.getAppId()); - allocationService.start(param, payOrder); - } - - /** - * 自动分账 - */ - public void autoAllocation(PayOrder payOrder){ - try { - // 是否开启自动完结 - AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null); - if (Objects.nonNull(allocConfig)){ - paymentAssistService.initMchAndApp(payOrder.getAppId()); - AllocationParam param = new AllocationParam() - .setBizAllocNo("B"+TradeNoGenerateUtil.allocation()); - param.setAppId(payOrder.getAppId()); - allocationService.start(param, payOrder); - } - } catch (DataErrorException e) { - // 如果没有默认分账组, 会触发分账失败, 并不需要额外处理 - log.warn("自动分账失败", e); - } - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/report/IndexMerchantReportService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/report/IndexMerchantReportService.java deleted file mode 100644 index cd3c8c6e..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/report/IndexMerchantReportService.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.dromara.daxpay.service.service.report; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 首页商户报表服务 - * @author xxm - * @since 2024/11/17 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class IndexMerchantReportService { - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/report/IndexTradeReportService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/report/IndexTradeReportService.java deleted file mode 100644 index 0a392ca4..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/report/IndexTradeReportService.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.dromara.daxpay.service.service.report; - -import cn.bootx.platform.baseapi.service.dict.DictionaryItemService; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.service.dao.report.IndexTradeReportMapper; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.param.report.TradeReportQuery; -import org.dromara.daxpay.service.result.report.TradeReportResult; -import cn.hutool.core.date.LocalDateTimeUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Objects; - -/** - * 交易类报表 - * @author xxm - * @since 2024/11/16 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class IndexTradeReportService { - private final IndexTradeReportMapper tradeReportMapper; - private final DictionaryItemService dictionaryItemService; - - /** - * 支付交易统计: 笔数, 金额 - */ - public TradeReportResult pryTradeReport(TradeReportQuery query){ - QueryWrapper param = new QueryWrapper<>(); - // 获取开始时间和结束时间 - var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); - var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); - - param.between(MpUtil.getColumnName(PayOrder::getPayTime), startTime, endTime) - .eq(MpUtil.getColumnName(PayOrder::getStatus), PayStatusEnum.SUCCESS.getCode()); - return tradeReportMapper.payTradeReport(param); - } - - /** - * 退款交易统计: 笔数, 金额 - */ - public TradeReportResult refundTradeReport(TradeReportQuery query){ - QueryWrapper param = new QueryWrapper<>(); - // 获取开始时间和结束时间 - var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); - var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); - - param.between(MpUtil.getColumnName(RefundOrder::getFinishTime),startTime, endTime) - .eq(MpUtil.getColumnName(RefundOrder::getStatus), RefundStatusEnum.SUCCESS.getCode()); - return tradeReportMapper.refundTradeReport(param); - } - - /** - * 支付通道统计 - */ - public List payChannelReport(TradeReportQuery query){ - QueryWrapper queryWrapper = new QueryWrapper<>(); - // 获取开始时间和结束时间 - var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); - var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); - - queryWrapper.between(MpUtil.getColumnName(PayOrder::getPayTime),startTime, endTime) - .eq(MpUtil.getColumnName(PayOrder::getStatus), PayStatusEnum.SUCCESS.getCode()) - .groupBy(MpUtil.getColumnName(PayOrder::getChannel)); - var list = tradeReportMapper.payChannelReport(queryWrapper); - var dictMap = dictionaryItemService.findEnableByDictCode("channel"); - list.forEach(item -> item.setTitle(dictMap.get(item.getTitle()))); - return list; - } - - /** - * 退款通道统计 - */ - public List refundChannelReport(TradeReportQuery query){ - QueryWrapper param = new QueryWrapper<>(); - // 获取开始时间和结束时间 - var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); - var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); - - param.between(MpUtil.getColumnName(RefundOrder::getFinishTime),startTime, endTime) - .groupBy(MpUtil.getColumnName(RefundOrder::getChannel)) - .eq(MpUtil.getColumnName(RefundOrder::getStatus), RefundStatusEnum.SUCCESS.getCode()); - - var list = tradeReportMapper.refundChannelReport(param); - var dictMap = dictionaryItemService.findEnableByDictCode("channel"); - list.forEach(item -> item.setTitle(dictMap.get(item.getTitle()))); - return list; - } - - /** - * 支付方式统计 - */ - public List payMethodReport(TradeReportQuery query){ - QueryWrapper param = new QueryWrapper<>(); - // 获取开始时间和结束时间 - var startTime = LocalDateTimeUtil.beginOfDay(query.getStartDate()); - var endTime = LocalDateTimeUtil.endOfDay(query.getEndDate()); - - param.between(MpUtil.getColumnName(PayOrder::getPayTime),startTime, endTime) - .eq(MpUtil.getColumnName(PayOrder::getStatus), PayStatusEnum.SUCCESS.getCode()) - .groupBy(MpUtil.getColumnName(PayOrder::getMethod)); - var list = tradeReportMapper.payMethodReport(param); - var dictMap = dictionaryItemService.findEnableByDictCode("pay_method"); - list.forEach(item -> item.setTitle(dictMap.get(item.getTitle()))); - return list; - } -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java deleted file mode 100644 index 47f8ad6a..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.dromara.daxpay.service.strategy; - -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; - -/** - * 分账处理抽象策略 - * @author xxm - * @since 2024/4/1 - */ -@Slf4j -@Getter -@Setter -public abstract class AbsAllocationStrategy implements PaymentStrategy{ - private AllocOrder order; - - private List details; - - /** - * 初始化参数 - */ - public void initParam(AllocOrder order, List details) { - this.order = order; - this.details = details; - } - - /** - * 操作前处理, 校验和初始化支付配置 - */ - public void doBeforeHandler(){ - - }; - - /** - * 开始分账 - */ - public abstract AllocStartResultBo start(); - - /** - * 分账完结 - */ - public abstract void finish(); - - - /** - * 同步状态 - * 分账明细的状态变更会在这个里面进行, 由通道自己处理, 同时订单的状态和结果不要进行变更, 其他参数可以进行更新 - */ - public abstract AllocSyncResultBo doSync(); - -} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/task/OrderSyncTaskService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/task/OrderSyncTaskService.java deleted file mode 100644 index 67871e65..00000000 --- a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/task/OrderSyncTaskService.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.dromara.daxpay.service.task; - -import cn.bootx.platform.core.util.DateTimeUtil; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.dao.order.refund.RefundOrderManager; -import org.dromara.daxpay.service.dao.order.transfer.TransferOrderManager; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.dromara.daxpay.service.service.trade.pay.PayAssistService; -import org.dromara.daxpay.service.service.trade.pay.PayCloseService; -import org.dromara.daxpay.service.service.trade.pay.PaySyncService; -import org.dromara.daxpay.service.service.trade.refund.RefundSyncService; -import org.dromara.daxpay.service.service.trade.transfer.TransferSyncService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; - -/** - * 交易订单同步定时任务 - * @author xxm - * @since 2024/8/29 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class OrderSyncTaskService { - - private final PayOrderManager payOrderManager; - private final PaySyncService paySyncService; - private final RefundOrderManager refundOrderManager; - private final RefundSyncService refundSyncService; - private final TransferOrderManager transferOrderManager; - private final TransferSyncService transferSyncService; - private final PaymentAssistService paymentAssistService; - private final PayAssistService payAssistService; - private final PayCloseService payCloseService; - - /** - * 支付单超时检测 一分钟一次, 查询支付 - */ - @Scheduled(cron = "0 */1 * * * ?") - public void queryExpiredTask(){ - // 从数据库查询获取超时的任务对象 - List payOrders = payOrderManager.queryExpiredOrderNotTenant(); - for (PayOrder order : payOrders) { - try { - paymentAssistService.initMchAndApp(order.getAppId()); - if (!List.of(PayStatusEnum.WAIT.getCode(),PayStatusEnum.TIMEOUT.getCode()).contains(order.getStatus())){ - paySyncService.syncPayOrder(order); - } else { - // 判断是超时走关闭订单 - if (Objects.nonNull(order.getExpiredTime()) && DateTimeUtil.ge(LocalDateTime.now(), order.getExpiredTime())) { - payCloseService.closeOrder(order,false); - } - } - } catch (Exception e) { - log.error("超时取消任务异常, ID: {}, 订单号: {}",order.getId(), order.getOrderNo(), e); - // 设置订单任务为失败 - payAssistService.fail(order, e.getMessage()); - } - } - } - - - /** - * 退款定时同步任务 一分钟一次, 查询一分钟之前退款中的订单进行同步 - * 10分钟内一分钟一次 - * 一天内一小时一次 - * 超过一天一天一次 - * - */ - @Scheduled(cron = "0 */1 * * * ?") - public void refundSyncTask(){ - // 查询退款中的退款订单 - List list = refundOrderManager.findAllByProgress(); - for (RefundOrder refundOrder : list) { - try { - // 调用同步方法 - paymentAssistService.initMchAndApp(refundOrder.getAppId()); - refundSyncService.syncRefundOrder(refundOrder); - } catch (Exception e) { - log.warn("退款执行同步失败, ID: {}, 退款号: {}",refundOrder.getId(), refundOrder.getRefundNo(), e); - } - } - } - - /** - * 转账订单同步, 一分钟一次, 获取一分钟之前转账中的订单 - */ - @Scheduled(cron = "0 */1 * * * ?") - public void transferSyncTask(){ - List list = transferOrderManager.findAllByProgress(); - for (var transferOrder : list) { - try { - // 调用同步方法 - paymentAssistService.initMchAndApp(transferOrder.getAppId()); - transferSyncService.syncTransferOrder(transferOrder); - } catch (Exception e) { - log.warn("转账执行同步失败, ID: {}, 转账号: {}",transferOrder.getId(),transferOrder.getTransferNo(), e); - } - } - } -}