From 36b0288386956f5ea66d782c7742c05e278d78a5 Mon Sep 17 00:00:00 2001 From: bootx Date: Thu, 18 Jan 2024 23:01:01 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=94=AF=E4=BB=98=E5=AF=B9=E8=B4=A6?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/PayReconcileRecordController.java | 20 ++++++++ .../gateway/controller/TestController.java | 4 +- .../AliReconcileBillDetail.java | 2 +- .../AliReconcileBillTotal.java | 2 +- ...rvice.java => AliPayReconcileService.java} | 6 +-- .../dao/WxReconcileBillDetailManager.java | 18 +++++++ .../dao/WxReconcileBillDetailMapper.java | 14 ++++++ .../dao/WxReconcileBillTotalManger.java | 18 +++++++ .../dao/WxReconcileBillTotalMapper.java | 14 ++++++ .../WxReconcileBillDetail.java | 12 +++-- .../WxReconcileBillTotal.java | 9 +++- .../WxReconcileFundFlowDetail.java | 9 +++- .../WxReconcileFundFlowTotal.java | 12 +++-- .../service/WechatPayReconcileService.java | 12 +++-- .../factory/PayReconcileStrategyFactory.java | 42 ++++++++++++++++ .../service/PayReconcileService.java | 35 +++++++++++++- .../strategy/AlipayReconcileStrategy.java | 48 ++++++++++++++++++- .../strategy/WechatPayReconcileStrategy.java | 44 ++++++++++++++++- .../dao/PayReconcileRecordManager.java | 18 +++++++ .../dao/PayReconcileRecordMapper.java | 14 ++++++ .../entity/PayReconcileDetailRecord.java | 44 +++++++++++++++++ .../reconcile/entity/PayReconcileRecord.java | 15 ++++++ .../service/func/AbsReconcileStrategy.java | 43 +++++++++++++++++ 23 files changed, 425 insertions(+), 30 deletions(-) create mode 100644 daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/record/PayReconcileRecordController.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/{domain => entity}/AliReconcileBillDetail.java (96%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/{domain => entity}/AliReconcileBillTotal.java (94%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/{AlipayReconcileService.java => AliPayReconcileService.java} (95%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillDetailManager.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillDetailMapper.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillTotalManger.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillTotalMapper.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/{domain => entity}/WxReconcileBillDetail.java (82%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/{domain => entity}/WxReconcileBillTotal.java (63%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/{domain => entity}/WxReconcileFundFlowDetail.java (67%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/{domain => entity}/WxReconcileFundFlowTotal.java (54%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/factory/PayReconcileStrategyFactory.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/dao/PayReconcileRecordManager.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/dao/PayReconcileRecordMapper.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/entity/PayReconcileDetailRecord.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsReconcileStrategy.java diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/record/PayReconcileRecordController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/record/PayReconcileRecordController.java new file mode 100644 index 000000000..11f82c683 --- /dev/null +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/record/PayReconcileRecordController.java @@ -0,0 +1,20 @@ +package cn.bootx.platform.daxpay.admin.controller.record; + +import cn.bootx.platform.daxpay.service.core.payment.reconcile.service.PayReconcileService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 支付对账 + * @author xxm + * @since 2024/1/18 + */ +@Tag(name = "支付对账控制器") +@RestController +@RequestMapping("/record/reconcile") +@RequiredArgsConstructor +public class PayReconcileRecordController { + private final PayReconcileService reconcileService; +} diff --git a/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/TestController.java b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/TestController.java index ceb332b94..ab2709c8c 100644 --- a/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/TestController.java +++ b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/TestController.java @@ -3,7 +3,7 @@ package cn.bootx.platform.daxpay.gateway.controller; import cn.bootx.platform.common.core.exception.BizException; import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.daxpay.service.core.channel.alipay.service.AlipayReconcileService; +import cn.bootx.platform.daxpay.service.core.channel.alipay.service.AliPayReconcileService; import cn.bootx.platform.daxpay.service.core.channel.wechat.service.WechatPayReconcileService; import cn.bootx.platform.daxpay.service.core.timeout.task.PayExpiredTimeTask; import cn.bootx.platform.daxpay.service.core.timeout.task.PayWaitOrderSyncTask; @@ -31,7 +31,7 @@ import java.util.Objects; public class TestController { private final PayExpiredTimeTask expiredTimeTask;; private final PayWaitOrderSyncTask waitOrderSyncTask; - private final AlipayReconcileService alipayReconcileService; + private final AliPayReconcileService alipayReconcileService; private final WechatPayReconcileService wechatPayReconcileService; private final LockTemplate lockTemplate; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/domain/AliReconcileBillDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillDetail.java similarity index 96% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/domain/AliReconcileBillDetail.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillDetail.java index 91a0b6866..f05f75d1d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/domain/AliReconcileBillDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillDetail.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.service.core.channel.alipay.domain; +package cn.bootx.platform.daxpay.service.core.channel.alipay.entity; import cn.hutool.core.annotation.Alias; import lombok.Data; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/domain/AliReconcileBillTotal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillTotal.java similarity index 94% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/domain/AliReconcileBillTotal.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillTotal.java index ad231fc12..bcbf76efa 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/domain/AliReconcileBillTotal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillTotal.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.service.core.channel.alipay.domain; +package cn.bootx.platform.daxpay.service.core.channel.alipay.entity; import cn.hutool.core.annotation.Alias; import lombok.Data; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AlipayReconcileService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayReconcileService.java similarity index 95% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AlipayReconcileService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayReconcileService.java index c703408dd..b7d447809 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AlipayReconcileService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayReconcileService.java @@ -2,8 +2,8 @@ package cn.bootx.platform.daxpay.service.core.channel.alipay.service; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.code.AliPayCode; -import cn.bootx.platform.daxpay.service.core.channel.alipay.domain.AliReconcileBillDetail; -import cn.bootx.platform.daxpay.service.core.channel.alipay.domain.AliReconcileBillTotal; +import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliReconcileBillDetail; +import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliReconcileBillTotal; import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; import cn.hutool.core.io.IoUtil; import cn.hutool.core.text.csv.CsvReader; @@ -37,7 +37,7 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class AlipayReconcileService { +public class AliPayReconcileService { private final AliPayConfigService configService; /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillDetailManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillDetailManager.java new file mode 100644 index 000000000..67ea4f12a --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillDetailManager.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.daxpay.service.core.channel.wechat.dao; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WxReconcileBillDetail; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * + * @author xxm + * @since 2024/1/18 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class WxReconcileBillDetailManager extends BaseManager { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillDetailMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillDetailMapper.java new file mode 100644 index 000000000..0562304a1 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillDetailMapper.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay.service.core.channel.wechat.dao; + +import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WxReconcileBillDetail; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 微信对账单明细表 + * @author xxm + * @since 2024/1/18 + */ +@Mapper +public interface WxReconcileBillDetailMapper extends BaseMapper { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillTotalManger.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillTotalManger.java new file mode 100644 index 000000000..5c1ad1035 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillTotalManger.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.daxpay.service.core.channel.wechat.dao; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WxReconcileBillTotal; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * + * @author xxm + * @since 2024/1/18 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class WxReconcileBillTotalManger extends BaseManager { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillTotalMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillTotalMapper.java new file mode 100644 index 000000000..aeb8264ce --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/dao/WxReconcileBillTotalMapper.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay.service.core.channel.wechat.dao; + +import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WxReconcileBillTotal; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 微信对账单总表 + * @author xxm + * @since 2024/1/18 + */ +@Mapper +public interface WxReconcileBillTotalMapper extends BaseMapper { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileBillDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileBillDetail.java similarity index 82% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileBillDetail.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileBillDetail.java index aec353dfa..a54c761f2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileBillDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileBillDetail.java @@ -1,15 +1,20 @@ -package cn.bootx.platform.daxpay.service.core.channel.wechat.domain; +package cn.bootx.platform.daxpay.service.core.channel.wechat.entity; +import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.hutool.core.annotation.Alias; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import lombok.EqualsAndHashCode; /** * 微信对账单明细 * @author xxm * @since 2024/1/17 */ +@EqualsAndHashCode(callSuper = true) @Data -public class WxReconcileBillDetail { +@TableName("pay_wechat_reconcile_bill_detail") +public class WxReconcileBillDetail extends MpCreateEntity { @Alias("交易时间") private String transactionTime; @@ -34,9 +39,6 @@ public class WxReconcileBillDetail { @Alias("设备号") private String deviceInfo; - @Alias("交易状态") - private String transactionState; - @Alias("交易类型") private String type; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileBillTotal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileBillTotal.java similarity index 63% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileBillTotal.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileBillTotal.java index 5302468fd..805cb5d09 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileBillTotal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileBillTotal.java @@ -1,15 +1,20 @@ -package cn.bootx.platform.daxpay.service.core.channel.wechat.domain; +package cn.bootx.platform.daxpay.service.core.channel.wechat.entity; +import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.hutool.core.annotation.Alias; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import lombok.EqualsAndHashCode; /** * 微信对账单汇总 * @author xxm * @since 2024/1/17 */ +@EqualsAndHashCode(callSuper = true) @Data -public class WxReconcileBillTotal { +@TableName("pay_wechat_reconcile_bill_total") +public class WxReconcileBillTotal extends MpCreateEntity { @Alias("总交易单数") private String totalNum; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileFundFlowDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowDetail.java similarity index 67% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileFundFlowDetail.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowDetail.java index 5dbf5d95e..837b4f9d5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileFundFlowDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowDetail.java @@ -1,15 +1,20 @@ -package cn.bootx.platform.daxpay.service.core.channel.wechat.domain; +package cn.bootx.platform.daxpay.service.core.channel.wechat.entity; +import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.hutool.core.annotation.Alias; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import lombok.EqualsAndHashCode; /** * 微信资金账单明细 * @author xxm * @since 2024/1/18 */ +@EqualsAndHashCode(callSuper = true) @Data -public class WxReconcileFundFlowDetail { +@TableName("pay_wechat_reconcile_fund_flow_detail") +public class WxReconcileFundFlowDetail extends MpCreateEntity { @Alias("记账时间") private String time; @Alias("微信支付业务单号") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileFundFlowTotal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowTotal.java similarity index 54% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileFundFlowTotal.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowTotal.java index 13073460f..90941d5f8 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/domain/WxReconcileFundFlowTotal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowTotal.java @@ -1,19 +1,21 @@ -package cn.bootx.platform.daxpay.service.core.channel.wechat.domain; +package cn.bootx.platform.daxpay.service.core.channel.wechat.entity; +import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.hutool.core.annotation.Alias; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import lombok.experimental.Accessors; +import lombok.EqualsAndHashCode; /** * 微信资金账单汇总 * @author xxm * @since 2024/1/18 */ +@EqualsAndHashCode(callSuper = true) @Data -@Accessors(chain = true) -public class WxReconcileFundFlowTotal { +@TableName("pay_wechat_reconcile_fund_flow_total") +public class WxReconcileFundFlowTotal extends MpCreateEntity { - // 资金流水总笔数,收入笔数,收入金额,支出笔数,支出金额 @Alias("资金流水总笔数") private String totalNum; @Alias("收入笔数") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatPayReconcileService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatPayReconcileService.java index f3d3db9f9..ace236288 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatPayReconcileService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatPayReconcileService.java @@ -2,10 +2,12 @@ package cn.bootx.platform.daxpay.service.core.channel.wechat.service; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.code.WeChatPayCode; -import cn.bootx.platform.daxpay.service.core.channel.wechat.domain.WxReconcileBillDetail; -import cn.bootx.platform.daxpay.service.core.channel.wechat.domain.WxReconcileBillTotal; -import cn.bootx.platform.daxpay.service.core.channel.wechat.domain.WxReconcileFundFlowDetail; +import cn.bootx.platform.daxpay.service.core.channel.wechat.dao.WxReconcileBillDetailManager; +import cn.bootx.platform.daxpay.service.core.channel.wechat.dao.WxReconcileBillTotalManger; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConfig; +import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WxReconcileBillDetail; +import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WxReconcileBillTotal; +import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WxReconcileFundFlowDetail; import cn.hutool.core.codec.Base64; import cn.hutool.core.text.csv.CsvReader; import cn.hutool.core.text.csv.CsvUtil; @@ -34,8 +36,10 @@ import static cn.bootx.platform.daxpay.service.code.WeChatPayCode.ACCOUNT_TYPE_B @Slf4j @Service @RequiredArgsConstructor -public class WechatPayReconcileService { +public class WechatPayReconcileService{ private final WeChatPayConfigService weChatPayConfigService; + private final WxReconcileBillTotalManger reconcileBillTotalManger; + private final WxReconcileBillDetailManager reconcileBillDetailManager; /** * 下载对账单并保存 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/factory/PayReconcileStrategyFactory.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/factory/PayReconcileStrategyFactory.java new file mode 100644 index 000000000..17e769c64 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/factory/PayReconcileStrategyFactory.java @@ -0,0 +1,42 @@ +package cn.bootx.platform.daxpay.service.core.payment.reconcile.factory; + +import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.exception.pay.PayUnsupportedMethodException; +import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; +import cn.hutool.extra.spring.SpringUtil; +import lombok.experimental.UtilityClass; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 支付对账工厂类 + * @author xxm + * @since 2024/1/18 + */ +@UtilityClass +public class PayReconcileStrategyFactory { + + /** + * 根据传入的支付类型批量创建策略 + */ + public List create() { + Map beansOfType = SpringUtil.getBeansOfType(AbsReconcileStrategy.class); + return new ArrayList<>(beansOfType.values()); + } + + /** + * 根据传入的支付类型批量创建策略 + */ + public AbsReconcileStrategy create(String channel) { + PayChannelEnum channelEnum = PayChannelEnum.findByCode(channel); + Map beansOfType = SpringUtil.getBeansOfType(AbsReconcileStrategy.class); + return beansOfType.values().stream() + .filter(strategy -> Objects.equals(strategy.getType(), channelEnum)) + .findFirst() + .orElseThrow(PayUnsupportedMethodException::new); + } + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/PayReconcileService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/PayReconcileService.java index 42bbc881f..4623a921c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/PayReconcileService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/PayReconcileService.java @@ -1,9 +1,14 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.service; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.factory.PayReconcileStrategyFactory; +import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.util.List; + /** * 支付对账单下载服务 * @author xxm @@ -13,11 +18,37 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class PayReconcileService { - /** * 下载对账单 */ - public void downReconcileBill(){ + public void downAll(LocalDate date){ + List strategies = PayReconcileStrategyFactory.create(); + strategies.forEach(AbsReconcileStrategy::doBeforeHandler); + } + /** + * 手动发起对账下载 + */ + public void downByChannel(LocalDate date, String channel){ + AbsReconcileStrategy absReconcileStrategy = PayReconcileStrategyFactory.create(channel); + absReconcileStrategy.doBeforeHandler(); + absReconcileStrategy.downAndSave(date); + } + + /** + * 全部对账 + */ + public void offsetting(LocalDate date){ + List strategies = PayReconcileStrategyFactory.create(); + strategies.forEach(AbsReconcileStrategy::doBeforeHandler); + } + + /** + * 全部对账 + */ + public void offsettingByChannel(LocalDate date, String channel){ + AbsReconcileStrategy absReconcileStrategy = PayReconcileStrategyFactory.create(channel); + absReconcileStrategy.doBeforeHandler(); + absReconcileStrategy.offsetting(date); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/strategy/AlipayReconcileStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/strategy/AlipayReconcileStrategy.java index e2e2bcbdd..6c126aabe 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/strategy/AlipayReconcileStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/strategy/AlipayReconcileStrategy.java @@ -1,10 +1,19 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.strategy; +import cn.bootx.platform.common.core.util.LocalDateTimeUtil; +import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; +import cn.bootx.platform.daxpay.service.core.channel.alipay.service.AliPayConfigService; +import cn.bootx.platform.daxpay.service.core.channel.alipay.service.AliPayReconcileService; +import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; +import cn.hutool.core.date.DatePattern; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import java.time.LocalDate; + import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; /** @@ -13,8 +22,43 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT * @since 2024/1/17 */ @Slf4j -@Scope(SCOPE_PROTOTYPE) @Service +@Scope(SCOPE_PROTOTYPE) @RequiredArgsConstructor -public class AlipayReconcileStrategy { +public class AlipayReconcileStrategy extends AbsReconcileStrategy { + + private final AliPayReconcileService reconcileService; + + private final AliPayConfigService configService; + + private AliPayConfig config; + + + /** + * 策略标识 + * + * @see PayChannelEnum + */ + @Override + public PayChannelEnum getType() { + return PayChannelEnum.ALI; + } + + /** + * 对账前处理, 主要是初始化支付SDK配置 + */ + @Override + public void doBeforeHandler() { + this.config = configService.getConfig(); + configService.initConfig(this.config); + } + + /** + * 下载对账单 + */ + @Override + public void downAndSave(LocalDate date) { + String format = LocalDateTimeUtil.format(date, DatePattern.NORM_DATE_PATTERN); + reconcileService.downAndSave(format); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/strategy/WechatPayReconcileStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/strategy/WechatPayReconcileStrategy.java index 0a1a9f425..1ea9bf60d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/strategy/WechatPayReconcileStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/strategy/WechatPayReconcileStrategy.java @@ -1,10 +1,19 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.strategy; +import cn.bootx.platform.common.core.util.LocalDateTimeUtil; +import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConfig; +import cn.bootx.platform.daxpay.service.core.channel.wechat.service.WeChatPayConfigService; +import cn.bootx.platform.daxpay.service.core.channel.wechat.service.WechatPayReconcileService; +import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; +import cn.hutool.core.date.DatePattern; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import java.time.LocalDate; + import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; /** @@ -16,5 +25,38 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Service @RequiredArgsConstructor -public class WechatPayReconcileStrategy { +public class WechatPayReconcileStrategy extends AbsReconcileStrategy { + + private final WechatPayReconcileService reconcileService; + + private final WeChatPayConfigService weChatPayConfigService; + + private WeChatPayConfig config; + + /** + * 策略标识 + * + * @see PayChannelEnum + */ + @Override + public PayChannelEnum getType() { + return PayChannelEnum.WECHAT; + } + + /** + * 对账前处理, 主要是初始化支付SDK配置 + */ + @Override + public void doBeforeHandler() { + this.config = weChatPayConfigService.getConfig(); + } + + /** + * 下载对账单 + */ + @Override + public void downAndSave(LocalDate date) { + String format = LocalDateTimeUtil.format(date, DatePattern.PURE_DATE_PATTERN); + reconcileService.downAndSave(format,this.config); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/dao/PayReconcileRecordManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/dao/PayReconcileRecordManager.java new file mode 100644 index 000000000..50c362d37 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/dao/PayReconcileRecordManager.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.daxpay.service.core.record.reconcile.dao; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.daxpay.service.core.record.reconcile.entity.PayReconcileRecord; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * + * @author xxm + * @since 2024/1/18 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class PayReconcileRecordManager extends BaseManager { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/dao/PayReconcileRecordMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/dao/PayReconcileRecordMapper.java new file mode 100644 index 000000000..d92513c0e --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/dao/PayReconcileRecordMapper.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay.service.core.record.reconcile.dao; + +import cn.bootx.platform.daxpay.service.core.record.reconcile.entity.PayReconcileRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author xxm + * @since 2024/1/18 + */ +@Mapper +public interface PayReconcileRecordMapper extends BaseMapper { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/entity/PayReconcileDetailRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/entity/PayReconcileDetailRecord.java new file mode 100644 index 000000000..467fc1626 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/entity/PayReconcileDetailRecord.java @@ -0,0 +1,44 @@ +package cn.bootx.platform.daxpay.service.core.record.reconcile.entity; + +import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 支付对账记录详情 + * @author xxm + * @since 2024/1/18 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_reconcile_detail_record") +public class PayReconcileDetailRecord extends MpCreateEntity { + + /** 交易状态 */ + private String status; + + /** 交易类型 支付/退款 */ + private String type; + + /** 订单号 - 支付ID/退款ID */ + private String paymentId; + + /** 网关订单号 - 支付宝/微信的订单号 */ + private String gatewayOrderNo; + + /** 交易金额 */ + private Integer amount; + + /** 手续费 */ + private Integer poundage; + + /** 费率 */ + private Integer rate; + + /** 商品名称 */ + private String title; + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/entity/PayReconcileRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/entity/PayReconcileRecord.java index 70d34e546..47d2b3f14 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/entity/PayReconcileRecord.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/reconcile/entity/PayReconcileRecord.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDate; + /** * 支付对账单记录 * @author xxm @@ -18,4 +20,17 @@ import lombok.experimental.Accessors; @DbTable(comment = "支付对账单记录") @TableName("pay_reconcile_record") public class PayReconcileRecord extends MpCreateEntity { + + /** 日期 */ + private LocalDate date; + + /** 通道 */ + private String channel; + + /** 对账单是否下载成功 */ + private boolean success; + + /** 错误信息 */ + private String errorMsg; + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsReconcileStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsReconcileStrategy.java new file mode 100644 index 000000000..92b4ab360 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsReconcileStrategy.java @@ -0,0 +1,43 @@ +package cn.bootx.platform.daxpay.service.func; + +import cn.bootx.platform.daxpay.code.PayChannelEnum; + +import java.time.LocalDate; + +/** + * 支付对账策略 + * @author xxm + * @since 2024/1/18 + */ +public abstract class AbsReconcileStrategy { + + + + /** + * 策略标识 + * @see PayChannelEnum + */ + public abstract PayChannelEnum getType(); + + /** + * 对账前处理, 主要是初始化支付SDK配置 + */ + public void doBeforeHandler() { + } + + + /** + * 下载对账单到本地进行保存 + */ + public abstract void downAndSave(LocalDate date); + + /** + * 轧差 + * 1. 远程有, 本地无 补单(追加回订单/记录差异表) + * 2. 远程无, 本地有 记录差错表 + * 3. 远程有, 本地有, 但状态不一致 + */ + public void offsetting(LocalDate date){ + } + +}