From ba7eb687803dc3d9c0dc01bce07bb4df460a252b Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Wed, 28 Feb 2024 10:40:34 +0800 Subject: [PATCH 01/10] =?UTF-8?q?fix=20=E5=89=8D=E7=AB=AF=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E8=AE=A2=E5=8D=95=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD"=E6=94=AF=E4=BB=98ID"=E6=9D=A1=E4=BB=B6=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 4 ++++ _doc/Task.md | 17 ++--------------- .../src/main/resources/static/front/.gitkeep | 0 .../src/main/resources/static/h5/.gitkeep | 0 .../service/param/order/PayOrderQuery.java | 2 +- 5 files changed, 7 insertions(+), 16 deletions(-) create mode 100644 daxpay-single/daxpay-single-admin/src/main/resources/static/front/.gitkeep create mode 100644 daxpay-single/daxpay-single-gateway/src/main/resources/static/h5/.gitkeep diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 60af7402..6c89beb7 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,4 +1,8 @@ # CHANGELOG +## [v2.0.2] +- fix: 前端支付订单查询条件中"支付ID"条件不生效 + + ## [v2.0.1] - 增加支付、退款时客户通知功能,支持多次重发 - 开源文档增加支付通知和退款通知文档 diff --git a/_doc/Task.md b/_doc/Task.md index c314e52b..730156cf 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,28 +1,16 @@ -2.0.1: -- [x] 完善各种同步支付方式 - - [x] 现金支付, 现金流水 - - [x] 钱包支付, 钱包流水 - - [x] 储值卡支付, 储值卡流水 -- [x] 支付回调通知和退款回调通知功能 - - [x] 回调任务发起 - - [ ] 支付关闭发送回调 - - [ ] 退款关闭发送回调 - - [x] 回调调用记录 - - [x] SDK接收对象编写 - - [x] Demo模块接收回调演示 -- [x] 通道配置启用停用配置生效 -- [x] 支付对账的序列化生成器有问题,待platform更新 2.0.2: - [ ] 对账功能补全账单比对功能 - [ ] 数据库表进行规则, 字段设置长度, 增加索引 - [ ] 退款操作支持重试 +- [x] 支付对账的序列化生成器有问题,待platform更新 2.0.x 版本内容 - [ ] 云闪付接入 - [ ] 增加各类日志记录,例如钱包的各项操作 - [ ] 支付流程也改为先落库后支付情况, 避免极端情况导致掉单 - [ ] 支付流程涉及异步支付时, 更换支付方式需要控制预防客户重复付款 +- [ ] 增加撤销功能,用于处理线下支付订单的情况 **任务池** - [x] 支付SDK编写 @@ -30,7 +18,6 @@ - [x] 增加聚合支付功能支持 - [x] 增加手机用户收银台功能 - [ ] 订单超时支持数据表级别触发 -- [ ] 支付宝关闭支付时支持撤销方式, - [ ] 支持转账操作, 通过支付通道专有参数进行实现, 转账时只能单个通道进行操作 - [ ] 支付成功回调后, 如果订单已超时, 则进入待退款订单中,提示进行退款,或者自动退款 - [x] 增加回调机制(通知客户端) diff --git a/daxpay-single/daxpay-single-admin/src/main/resources/static/front/.gitkeep b/daxpay-single/daxpay-single-admin/src/main/resources/static/front/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/daxpay-single/daxpay-single-gateway/src/main/resources/static/h5/.gitkeep b/daxpay-single/daxpay-single-gateway/src/main/resources/static/h5/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/order/PayOrderQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/order/PayOrderQuery.java index 31cdf811..ae1a9a4f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/order/PayOrderQuery.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/order/PayOrderQuery.java @@ -23,7 +23,7 @@ public class PayOrderQuery extends QueryOrder { @QueryParam(type = QueryParam.CompareTypeEnum.EQ) @Schema(description = "支付订单id") - private Long paymentId; + private Long id; /** 关联的业务号 */ @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) -- Gitee From 75ef54085d83345828abb39bfbf8d966ef5743a1 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Wed, 28 Feb 2024 16:58:42 +0800 Subject: [PATCH 02/10] =?UTF-8?q?feat=20=E6=94=AF=E4=BB=98=E5=AF=B9?= =?UTF-8?q?=E8=B4=A6=E5=BC=80=E5=8F=91,=20=E8=B0=83=E6=95=B4=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E6=B5=81=E6=B0=B4=E8=A1=A8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84,=20=E6=94=AF=E4=BB=98=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E9=97=AE=E9=A2=98=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/PayReconcileOrderController.java | 11 +- .../common/context/ReconcileLocal.java | 5 - .../sequence/DaxPaySequenceConfiguration.java | 34 ++++++ .../alipay/dao/AliPayRecordManager.java | 12 +++ .../channel/alipay/entity/AliPayRecord.java | 6 ++ .../service/AliPayReconcileService.java | 4 +- .../alipay/service/AliPayRecordService.java | 6 +- .../wechat/dao/WeChatPayRecordManager.java | 12 +++ .../wechat/entity/WeChatPayRecord.java | 6 ++ .../service/WeChatPayRecordService.java | 6 +- .../service/WechatPayReconcileService.java | 4 +- .../order/pay/entity/PayChannelOrder.java | 1 + .../core/order/pay/entity/PayOrder.java | 6 +- .../dao/PayReconcileDetailManager.java | 10 ++ .../reconcile/entity/PayReconcileDetail.java | 4 + .../reconcile/entity/PayReconcileOrder.java | 3 - .../service/PayReconcileOrderService.java | 38 ------- .../service/PayReconcileService.java | 94 ++++++++++++++-- .../strategy/AlipayReconcileStrategy.java | 102 ++++++++++++++++++ .../strategy/WechatPayReconcileStrategy.java | 100 +++++++++++++++++ .../repair/service/PayRepairService.java | 17 +-- .../strategy/pay/AliPayRepairStrategy.java | 8 +- .../strategy/pay/WeChatPayRepairStrategy.java | 12 ++- .../payment/sync/service/PaySyncService.java | 3 +- .../dto/channel/alipay/AliPayRecordDto.java | 6 ++ .../channel/wechat/WeChatPayRecordDto.java | 6 ++ .../service/func/AbsPayRepairStrategy.java | 4 +- .../service/func/AbsReconcileStrategy.java | 26 +++-- .../service/param/order/RefundOrderQuery.java | 7 +- .../daxpay/service/task/PayReconcileTask.java | 4 +- .../task/service/PayReconcileTaskService.java | 8 +- lombok.config | 1 + pom.xml | 2 +- 33 files changed, 460 insertions(+), 108 deletions(-) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/configuration/sequence/DaxPaySequenceConfiguration.java diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayReconcileOrderController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayReconcileOrderController.java index 4e77b9f9..a581a859 100644 --- a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayReconcileOrderController.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayReconcileOrderController.java @@ -5,7 +5,6 @@ import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.core.util.ValidationUtil; -import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileOrderService; import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileQueryService; import cn.bootx.platform.daxpay.service.core.payment.reconcile.service.PayReconcileService; import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileDetailDto; @@ -29,14 +28,13 @@ import org.springframework.web.bind.annotation.*; @RequiredArgsConstructor public class PayReconcileOrderController { private final PayReconcileService reconcileService; - private final PayReconcileOrderService reconcileOrderService; private final PayReconcileQueryService reconcileQueryService; @Operation(summary = "手动创建支付对账订单") @PostMapping("/create") public ResResult create(@RequestBody ReconcileOrderCreate param){ ValidationUtil.validateParam(param); - reconcileOrderService.create(param.getDate(), param.getChannel()); + reconcileService.create(param.getDate(), param.getChannel()); return Res.ok(); } @@ -47,6 +45,13 @@ public class PayReconcileOrderController { return Res.ok(); } + @Operation(summary = "手动触发对账单比对") + @PostMapping("/compare") + public ResResult compare(Long id){ + reconcileService.compare(id); + return Res.ok(); + } + @Operation(summary = "订单分页") @GetMapping("/page") public ResResult> page(PageParam pageParam, ReconcileOrderQuery query){ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ReconcileLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ReconcileLocal.java index 0184f343..f1d73d6d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ReconcileLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ReconcileLocal.java @@ -4,7 +4,6 @@ import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcile import lombok.Data; import lombok.experimental.Accessors; -import java.time.LocalDateTime; import java.util.List; /** @@ -19,8 +18,4 @@ public class ReconcileLocal { /** 通用支付对账记录 */ private List reconcileDetails; - - /** 支付完成时间 从支付网关中获取 */ - private LocalDateTime payTime; - } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/configuration/sequence/DaxPaySequenceConfiguration.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/configuration/sequence/DaxPaySequenceConfiguration.java new file mode 100644 index 00000000..d4966a79 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/configuration/sequence/DaxPaySequenceConfiguration.java @@ -0,0 +1,34 @@ +package cn.bootx.platform.daxpay.service.configuration.sequence; + +import cn.bootx.platform.common.sequence.func.Sequence; +import cn.bootx.platform.common.sequence.range.SeqRangeManager; +import cn.bootx.platform.common.sequence.util.SequenceUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 序列生成器配置类 + * @author xxm + * @since 2024/2/28 + */ +@Configuration +@RequiredArgsConstructor +public class DaxPaySequenceConfiguration { + + /** + * 支付宝对账单序列生成器 + */ + @Bean + public Sequence alipayReconcileSequence(SeqRangeManager seqRangeManager) { + return SequenceUtil.create(1,1,1,"AlipayReconcileSequence"); + } + + /** + * 微信对账单序列生成器 + */ + @Bean + public Sequence wechatReconcileSequence(SeqRangeManager seqRangeManager) { + return SequenceUtil.create(1,1,1,"WechatReconcileSequence"); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/dao/AliPayRecordManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/dao/AliPayRecordManager.java index 2f8070d9..467a8b7c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/dao/AliPayRecordManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/dao/AliPayRecordManager.java @@ -12,6 +12,9 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; +import java.util.List; + /** * * @author xxm @@ -31,4 +34,13 @@ public class AliPayRecordManager extends BaseManager generator = QueryGenerator.generator(param); return this.page(mpPage, generator); } + + /** + * 按时间范围查询 + */ + public List findByDate(LocalDateTime startDate, LocalDateTime endDate){ + return this.lambdaQuery() + .between(AliPayRecord::getGatewayTime, startDate, endDate) + .list(); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliPayRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliPayRecord.java index f62519c8..ccddffad 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliPayRecord.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliPayRecord.java @@ -12,6 +12,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDateTime; + /** * 支付宝流水记录 * @author xxm @@ -47,6 +49,10 @@ public class AliPayRecord extends MpCreateEntity implements EntityBaseFunction generator = QueryGenerator.generator(param); return this.page(mpPage, generator); } + + /** + * 按时间范围查询 + */ + public List findByDate(LocalDateTime start, LocalDateTime end) { + return this.lambdaQuery() + .between(WeChatPayRecord::getGatewayTime, start, end) + .list(); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WeChatPayRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WeChatPayRecord.java index 9738e955..abb8248e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WeChatPayRecord.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WeChatPayRecord.java @@ -12,6 +12,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDateTime; + /** * 微信支付记录 * @author xxm @@ -47,6 +49,10 @@ public class WeChatPayRecord extends MpCreateEntity implements EntityBaseFunctio @DbColumn(comment = "网关订单号") private String gatewayOrderNo; + /** 网关完成时间 */ + @DbColumn(comment = "网关完成时间") + private LocalDateTime gatewayTime; + @Override public WeChatPayRecordDto toDto() { return WeChatConvert.CONVERT.convert(this); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayRecordService.java index 4b2d191b..34e21033 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayRecordService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayRecordService.java @@ -36,8 +36,9 @@ public class WeChatPayRecordService { .setType(WechatPayRecordTypeEnum.PAY.getCode()) .setTitle(order.getTitle()) .setOrderId(order.getId()) + .setAmount(channelOrder.getAmount()) .setGatewayOrderNo(order.getGatewayOrderNo()) - .setAmount(channelOrder.getAmount()); + .setGatewayTime(channelOrder.getPayTime()); weChatPayRecordManager.save(weChatPayRecord); } @@ -49,8 +50,9 @@ public class WeChatPayRecordService { .setType(WechatPayRecordTypeEnum.REFUND.getCode()) .setTitle(order.getTitle()) .setOrderId(order.getId()) + .setAmount(channelOrder.getAmount()) .setGatewayOrderNo(order.getGatewayOrderNo()) - .setAmount(channelOrder.getAmount()); + .setGatewayTime(channelOrder.getRefundTime()); weChatPayRecordManager.save(weChatPayRecord); } 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 73d5c318..07c634da 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 @@ -118,7 +118,7 @@ public class WechatPayReconcileService{ // 默认为支付对账记录 PayReconcileDetail payReconcileDetail = new PayReconcileDetail() .setRecordOrderId(billDetail.getRecordOrderId()) - .setPaymentId(billDetail.getMchOrderNo()) + .setOrderId(billDetail.getMchOrderNo()) .setTitle(billDetail.getSubject()) .setGatewayOrderNo(billDetail.getWeiXinOrderNo()); // 支付 @@ -138,7 +138,7 @@ public class WechatPayReconcileService{ int amount = Math.abs(((int) v)); payReconcileDetail.setType(PayReconcileTradeEnum.REFUND.getCode()) .setAmount(amount) - .setRefundId(billDetail.getMchRefundNo()); + .setOrderId(billDetail.getMchRefundNo()); } // TODO 已撤销, 暂时未处理 if (Objects.equals(billDetail.getStatus(), "REVOKED")){ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayChannelOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayChannelOrder.java index 3be2d17e..77e46122 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayChannelOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayChannelOrder.java @@ -58,6 +58,7 @@ public class PayChannelOrder extends MpCreateEntity implements EntityBaseFunctio private String status; @DbColumn(comment = "支付时间") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private LocalDateTime payTime; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrder.java index b5e5f5ee..dcbfe8b8 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/pay/entity/PayOrder.java @@ -10,6 +10,8 @@ import cn.bootx.table.modify.annotation.DbColumn; import cn.bootx.table.modify.annotation.DbTable; import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; import cn.bootx.table.modify.mysql.constants.MySqlIndexType; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -76,10 +78,12 @@ public class PayOrder extends MpBaseEntity implements EntityBaseFunction { + + /** + * 根据订单id查询 + */ + public List findAllByOrderId(Long orderId){ + return this.findAllByField(PayReconcileDetail::getRecordOrderId, orderId); + } + /** * 分页 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java index 44dc550f..b134a90e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java @@ -45,6 +45,10 @@ public class PayReconcileDetail extends MpCreateEntity implements EntityBaseFunc /** 本地订单ID */ @DbColumn(comment = "本地订单ID") + private String orderId; + + /** 支付订单ID */ + @DbColumn(comment = "本地订单ID") private String paymentId; /** 本地退款ID */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileOrder.java index 2f20326e..33aa0616 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileOrder.java @@ -55,9 +55,6 @@ public class PayReconcileOrder extends MpCreateEntity implements EntityBaseFunct @DbColumn(comment = "错误信息") private String errorMsg; - /** - * @return - */ @Override public PayReconcileOrderDto toDto() { return PayReconcileConvert.CONVERT.convert(this); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileOrderService.java index 31ef1a73..915f789c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileOrderService.java @@ -1,19 +1,14 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.service; -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; import cn.bootx.platform.common.sequence.func.Sequence; -import cn.bootx.platform.daxpay.code.PayChannelEnum; -import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileOrderManager; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; -import cn.hutool.core.date.DatePattern; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDate; import java.util.Optional; /** @@ -43,37 +38,4 @@ public class PayReconcileOrderService { return reconcileOrderManager.findById(id); } - /** - * 创建对账订单 - */ - public PayReconcileOrder create(LocalDate date,String channel) { - // 获取通道枚举 - PayChannelEnum channelEnum = PayChannelEnum.findByCode(channel); - // 判断是否为为异步通道 - if (!PayChannelEnum.ASYNC_TYPE.contains(channelEnum)){ - throw new PayFailureException("不支持对账的通道, 请检查"); - } - // 生成批次号 - String format = LocalDateTimeUtil.format(date, DatePattern.PURE_DATE_PATTERN); - String key = channelEnum.getReconcilePrefix()+format; - String seqNo = key + this.genSeqNo(key); - - PayReconcileOrder order = new PayReconcileOrder() - .setBatchNo(seqNo) - .setChannel(channel) - .setDate(date); - reconcileOrderManager.save(order); - return order; - } - - - /** - * 生成批次号 - * 规则:通道简称 + yyyyMMdd + 两位流水号 - * 例子:wx2024012001、ali2024012002 - */ - private String genSeqNo(String key){ - long next = sequence.next(key); - return String.format("%02d",next); - } } 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 bbffcde7..565236fc 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,8 +1,11 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.service; import cn.bootx.platform.common.core.exception.DataNotExistException; +import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileDetailManager; +import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileOrderManager; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileOrderService; @@ -11,7 +14,10 @@ import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.util.List; /** @@ -23,9 +29,36 @@ import java.util.List; @Service @RequiredArgsConstructor public class PayReconcileService { + private final PayReconcileOrderManager reconcileOrderManager; private final PayReconcileOrderService reconcileOrderService; private final PayReconcileDetailManager reconcileDetailManager; + /** + * 创建对账订单 + */ + @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) + public PayReconcileOrder create(LocalDate date, String channel) { + + // 获取通道枚举 + PayChannelEnum channelEnum = PayChannelEnum.findByCode(channel); + // 判断是否为为异步通道 + if (!PayChannelEnum.ASYNC_TYPE.contains(channelEnum)){ + throw new PayFailureException("不支持对账的通道, 请检查"); + } + // 构建对账策略 + AbsReconcileStrategy reconcileStrategy = PayReconcileStrategyFactory.create(channel); + + // 生成批次号 + String seqNo = reconcileStrategy.generateSequence(date); + + PayReconcileOrder order = new PayReconcileOrder() + .setBatchNo(seqNo) + .setChannel(channel) + .setDate(date); + reconcileOrderManager.save(order); + return order; + } + /** * 下载对账单并进行保存 */ @@ -38,19 +71,19 @@ public class PayReconcileService { /** * 下载对账单并进行保存 */ - public void downAndSave(PayReconcileOrder recordOrder) { + public void downAndSave(PayReconcileOrder reconcileOrder) { // 构建对账策略 - AbsReconcileStrategy absReconcileStrategy = PayReconcileStrategyFactory.create(recordOrder.getChannel()); - absReconcileStrategy.initParam(recordOrder); - absReconcileStrategy.doBeforeHandler(); + AbsReconcileStrategy reconcileStrategy = PayReconcileStrategyFactory.create(reconcileOrder.getChannel()); + reconcileStrategy.setRecordOrder(reconcileOrder); + reconcileStrategy.doBeforeHandler(); try { - absReconcileStrategy.downAndSave(); - recordOrder.setDown(true); - reconcileOrderService.update(recordOrder); + reconcileStrategy.downAndSave(); + reconcileOrder.setDown(true); + reconcileOrderService.update(reconcileOrder); } catch (Exception e) { log.error("下载对账单异常", e); - recordOrder.setErrorMsg("原因: " + e.getMessage()); - reconcileOrderService.update(recordOrder); + reconcileOrder.setErrorMsg("原因: " + e.getMessage()); + reconcileOrderService.update(reconcileOrder); throw new RuntimeException(e); } // 保存转换后的通用结构对账单 @@ -60,4 +93,47 @@ public class PayReconcileService { reconcileDetailManager.saveAll(reconcileDetails); } + /** + * 对账单比对 + */ + public void compare(Long reconcileOrderId){ + PayReconcileOrder payReconcileOrder = reconcileOrderService.findById(reconcileOrderId) + .orElseThrow(() -> new DataNotExistException("未找到对账订单")); + this.compare(payReconcileOrder); + } + + /** + * 对账单比对 + */ + public void compare(PayReconcileOrder reconcileOrder){ + // 判断是否已经下载了对账单明细 + if (!reconcileOrder.isDown()){ + throw new PayFailureException("请先下载对账单"); + } + + // 查询对账单 + List reconcileDetails = reconcileDetailManager.findAllByOrderId(reconcileOrder.getId()); + // 获取通道枚举 + if (!PayChannelEnum.ASYNC_TYPE_CODE.contains(reconcileOrder.getChannel())){ + log.error("不支持对账的通道, 请检查, 对账订单ID: {}", reconcileOrder.getId()); + throw new PayFailureException("不支持对账的通道, 请检查"); + } + // 判断是否为为异步通道 + // 构建对账策略 + AbsReconcileStrategy reconcileStrategy = PayReconcileStrategyFactory.create(reconcileOrder.getChannel()); + // 初始化参数 + reconcileStrategy.setRecordOrder(reconcileOrder); + reconcileStrategy.setReconcileDetails(reconcileDetails); + try { + // 执行比对任务 + reconcileStrategy.compare(); +// reconcileOrder.setCompare(true); +// reconcileOrderService.update(reconcileOrder); + } catch (Exception e) { + log.error("比对对账单异常", e); + reconcileOrder.setErrorMsg("原因: " + e.getMessage()); + reconcileOrderService.update(reconcileOrder); + throw new RuntimeException(e); + } + } } 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 3a7df688..82e04df4 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,17 +1,35 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.strategy; +import cn.bootx.platform.common.core.function.CollectorsFunction; +import cn.bootx.platform.common.core.util.CollUtil; import cn.bootx.platform.common.core.util.LocalDateTimeUtil; +import cn.bootx.platform.common.sequence.func.Sequence; import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.code.PayReconcileTradeEnum; +import cn.bootx.platform.daxpay.service.code.AliPayRecordTypeEnum; +import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliPayRecordManager; import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; +import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayRecord; 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.core.order.reconcile.entity.PayReconcileDetail; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import cn.hutool.core.date.DatePattern; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; /** @@ -27,8 +45,14 @@ public class AlipayReconcileStrategy extends AbsReconcileStrategy { private final AliPayReconcileService reconcileService; + private final AliPayRecordManager recordManager; + private final AliPayConfigService configService; + @Getter + @Qualifier("alipayReconcileSequence") + private final Sequence sequence; + private AliPayConfig config; @@ -42,6 +66,19 @@ public class AlipayReconcileStrategy extends AbsReconcileStrategy { return PayChannelEnum.ALI; } + /** + * 生成对账序列号 + * 规则:通道简称 + yyyyMMdd + 两位流水号 + * 例子:wx2024012001、ali2024012002 + */ + @Override + public String generateSequence(LocalDate date) { + String prefix = getChannel().getReconcilePrefix(); + String dateStr = LocalDateTimeUtil.format(date, DatePattern.PURE_DATE_PATTERN); + String key = String.format("%02d", sequence.next()); + return prefix + dateStr + key; + } + /** * 对账前处理, 主要是初始化支付SDK配置 */ @@ -59,4 +96,69 @@ public class AlipayReconcileStrategy extends AbsReconcileStrategy { String date = LocalDateTimeUtil.format(this.getRecordOrder().getDate(), DatePattern.NORM_DATE_PATTERN); reconcileService.downAndSave(date,this.getRecordOrder().getId()); } + + /** + * 比对生成对账差异单 + * 1. 远程有, 本地无 补单(追加回订单/记录差异表) + * 2. 远程无, 本地有 记录差错表 + * 3. 远程有, 本地有, 但状态不一致 记录差错表 + */ + @Override + public void compare() { + List details = this.getReconcileDetails(); + if (CollUtil.isEmpty(details)){ + return; + } + Map detailMap = details.stream() + .collect(Collectors.toMap(PayReconcileDetail::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); + + // 对哪天进行对账 + LocalDate date = this.getRecordOrder().getDate(); + + // 查询流水 + LocalDateTime localDateTime = LocalDateTimeUtil.date2DateTime(date); + LocalDateTime start = LocalDateTimeUtil.beginOfDay(localDateTime); + LocalDateTime end = LocalDateTimeUtil.endOfDay(localDateTime); + List records = recordManager.findByDate(start, end); + Map recordMap = records.stream() + .collect(Collectors.toMap(AliPayRecord::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); + + // 对账与流水比对 + for (PayReconcileDetail detail : details) { + // 判断本地有没有记录 + AliPayRecord record = recordMap.get(Long.valueOf(detail.getOrderId())); + if (Objects.isNull(record)){ + log.info("本地订单不存在: {}", detail.getOrderId()); + continue; + } + System.out.println(detail.getId()); + // 交易类型 支付/退款 + if (Objects.equals(detail.getType(), PayReconcileTradeEnum.PAY.getCode())){ + // 判断类型是否存在差异 + if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.PAY.getCode())){ + log.info("本地订单类型不正常: {}", detail.getOrderId()); + continue; + } + } else { + // 判断类型是否存在差异 + if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.REFUND.getCode())){ + log.info("本地订单类型不正常: {}", detail.getOrderId()); + continue; + } + } + // 判断是否存在差异 金额, 状态 + if (!Objects.equals(record.getAmount(), detail.getAmount())){ + log.info("本地订单金额不正常: {}", detail.getOrderId()); + continue; + } + } + // 流水与对账单比对, 找出本地有, 远程没有的记录 + for (AliPayRecord record : records) { + PayReconcileDetail detail = detailMap.get(String.valueOf(record.getOrderId())); + if (Objects.isNull(detail)){ + log.info("远程订单不存在: {}", record.getOrderId()); + continue; + } + } + } } 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 29730427..84c05e54 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,17 +1,34 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.strategy; +import cn.bootx.platform.common.core.function.CollectorsFunction; +import cn.bootx.platform.common.core.util.CollUtil; import cn.bootx.platform.common.core.util.LocalDateTimeUtil; +import cn.bootx.platform.common.sequence.func.Sequence; import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.code.PayReconcileTradeEnum; +import cn.bootx.platform.daxpay.service.code.AliPayRecordTypeEnum; +import cn.bootx.platform.daxpay.service.core.channel.wechat.dao.WeChatPayRecordManager; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConfig; +import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayRecord; 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.core.order.reconcile.entity.PayReconcileDetail; 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.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; /** @@ -29,6 +46,11 @@ public class WechatPayReconcileStrategy extends AbsReconcileStrategy { private final WeChatPayConfigService weChatPayConfigService; + private final WeChatPayRecordManager recordManager; + + @Qualifier("wechatReconcileSequence") + private final Sequence sequence; + private WeChatPayConfig config; /** @@ -41,6 +63,20 @@ public class WechatPayReconcileStrategy extends AbsReconcileStrategy { return PayChannelEnum.WECHAT; } + /** + * 生成对账序列号 + * 生成批次号 + * 规则:通道简称 + yyyyMMdd + 两位流水号 + * 例子:wx2024012001、ali2024012002 + */ + @Override + public String generateSequence(LocalDate date) { + String prefix = getChannel().getReconcilePrefix(); + String dateStr = LocalDateTimeUtil.format(date, DatePattern.PURE_DATE_PATTERN); + String key = String.format("%02d", sequence.next()); + return prefix + dateStr + key; + } + /** * 对账前处理, 主要是初始化支付SDK配置 */ @@ -57,4 +93,68 @@ public class WechatPayReconcileStrategy extends AbsReconcileStrategy { String format = LocalDateTimeUtil.format(this.getRecordOrder().getDate(), DatePattern.PURE_DATE_PATTERN); reconcileService.downAndSave(format,this.getRecordOrder().getId(), this.config); } + + /** + * 比对生成对账差异单 + * 1. 远程有, 本地无 补单(追加回订单/记录差异表) + * 2. 远程无, 本地有 记录差错表 + * 3. 远程有, 本地有, 但状态不一致 记录差错表 + */ + @Override + public void compare() { + List details = this.getReconcileDetails(); + if (CollUtil.isEmpty(details)){ + return; + } + Map detailMap = details.stream() + .collect(Collectors.toMap(PayReconcileDetail::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); + + // 对哪天进行对账 + LocalDate date = this.getRecordOrder().getDate(); + + // 查询流水 + LocalDateTime localDateTime = LocalDateTimeUtil.date2DateTime(date); + LocalDateTime start = LocalDateTimeUtil.beginOfDay(localDateTime); + LocalDateTime end = LocalDateTimeUtil.endOfDay(localDateTime); + List records = recordManager.findByDate(start, end); + Map recordMap = records.stream() + .collect(Collectors.toMap(WeChatPayRecord::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); + + // 对账与流水比对 + for (PayReconcileDetail detail : details) { + // 判断本地有没有记录 + WeChatPayRecord record = recordMap.get(Long.valueOf(detail.getOrderId())); + if (Objects.isNull(record)){ + log.info("本地订单不存在: {}", detail.getOrderId()); + continue; + } + // 交易类型 支付/退款 + if (Objects.equals(detail.getType(), PayReconcileTradeEnum.PAY.getCode())){ + // 判断类型是否存在差异 + if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.PAY.getCode())){ + log.info("本地订单类型不正常: {}", detail.getOrderId()); + continue; + } + } else { + // 判断类型是否存在差异 + if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.REFUND.getCode())){ + log.info("本地订单类型不正常: {}", detail.getOrderId()); + continue; + } + } + // 判断是否存在差异 金额, 状态 + if (!Objects.equals(record.getAmount(), detail.getAmount())){ + log.info("本地订单金额不正常: {}", detail.getOrderId()); + continue; + } + } + // 流水与对账单比对, 找出本地有, 远程没有的记录 + for (WeChatPayRecord record : records) { + PayReconcileDetail detail = detailMap.get(String.valueOf(record.getOrderId())); + if (Objects.isNull(detail)){ + log.info("远程订单不存在: {}", record.getOrderId()); + continue; + } + } + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java index c2ea358c..d3d3d841 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java @@ -98,6 +98,9 @@ public class PayRepairService { List channelOrders = repairStrategies.stream() .map(AbsPayRepairStrategy::getChannelOrder) .collect(Collectors.toList()); + // 更新通道订单 + channelOrderManager.updateAllById(channelOrders); + // 发送通知 clientNoticeService.registerPayNotice(order, null, channelOrders); this.saveRecord(order, repairType, repairResult); return repairResult; @@ -105,13 +108,15 @@ public class PayRepairService { /** * 变更未待支付 - * + * TODO 后期保存为异常订单 */ private void waitPay(PayOrder order, List repairStrategies) { - - repairStrategies.forEach(AbsPayRepairStrategy::doCloseLocalHandler); - // 修改订单支付状态为成功 - order.setStatus(PayStatusEnum.PROGRESS.getCode()); + // 待支付批量处理 + repairStrategies.forEach(AbsPayRepairStrategy::doWaitPayHandler); + // 修改订单支付状态为待支付 + order.setStatus(PayStatusEnum.PROGRESS.getCode()) + .setPayTime(null) + .setCloseTime(null); payOrderService.updateById(order); } @@ -141,7 +146,7 @@ public class PayRepairService { // 执行策略的关闭方法 absPayStrategies.forEach(AbsPayRepairStrategy::doCloseLocalHandler); order.setStatus(PayStatusEnum.CLOSE.getCode()) - // TODO 尝试是否可以使用网关返回的 + // TODO 尝试是否可以使用网关返回的时间 .setCloseTime(LocalDateTime.now()); payOrderService.updateById(order); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/AliPayRepairStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/AliPayRepairStrategy.java index 8c17db6b..dae73fba 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/AliPayRepairStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/AliPayRepairStrategy.java @@ -7,7 +7,6 @@ import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; import cn.bootx.platform.daxpay.service.core.channel.alipay.service.AliPayCloseService; import cn.bootx.platform.daxpay.service.core.channel.alipay.service.AliPayConfigService; import cn.bootx.platform.daxpay.service.core.channel.alipay.service.AliPayRecordService; -import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayChannelOrderManager; import cn.bootx.platform.daxpay.service.func.AbsPayRepairStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -34,8 +33,6 @@ public class AliPayRepairStrategy extends AbsPayRepairStrategy { private final AliPayRecordService aliRecordService; - private final PayChannelOrderManager payChannelOrderManager; - /** * 策略标识 */ @@ -63,7 +60,6 @@ public class AliPayRepairStrategy extends AbsPayRepairStrategy { .getFinishTime(); this.getChannelOrder().setStatus(PayStatusEnum.SUCCESS.getCode()) .setPayTime(payTime); - payChannelOrderManager.updateById(this.getChannelOrder()); // 支付完成, 保存记录 aliRecordService.pay(this.getOrder(), this.getChannelOrder()); } @@ -72,8 +68,8 @@ public class AliPayRepairStrategy extends AbsPayRepairStrategy { * 等待支付处理 */ @Override - public void doWaitPayHandler() { - super.doWaitPayHandler(); + public void doWaitPayHandler(){ + this.getChannelOrder().setPayTime(null).setStatus(PayStatusEnum.PROGRESS.getCode()); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/WeChatPayRepairStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/WeChatPayRepairStrategy.java index b5bc6aa1..dc190bde 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/WeChatPayRepairStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/strategy/pay/WeChatPayRepairStrategy.java @@ -7,7 +7,6 @@ import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConf import cn.bootx.platform.daxpay.service.core.channel.wechat.service.WeChatPayCloseService; import cn.bootx.platform.daxpay.service.core.channel.wechat.service.WeChatPayConfigService; import cn.bootx.platform.daxpay.service.core.channel.wechat.service.WeChatPayRecordService; -import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayChannelOrderManager; import cn.bootx.platform.daxpay.service.func.AbsPayRepairStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,8 +31,6 @@ public class WeChatPayRepairStrategy extends AbsPayRepairStrategy { private final WeChatPayConfigService weChatPayConfigService; - private final PayChannelOrderManager payChannelOrderManager; - private final WeChatPayRecordService weChatPayRecordService; private WeChatPayConfig weChatPayConfig; @@ -46,6 +43,14 @@ public class WeChatPayRepairStrategy extends AbsPayRepairStrategy { return PayChannelEnum.WECHAT; } + /** + * 等待支付处理 + */ + @Override + public void doWaitPayHandler(){ + this.getChannelOrder().setPayTime(null).setStatus(PayStatusEnum.PROGRESS.getCode()); + } + /** * 修复前处理 */ @@ -64,7 +69,6 @@ public class WeChatPayRepairStrategy extends AbsPayRepairStrategy { .getFinishTime(); this.getChannelOrder().setStatus(PayStatusEnum.SUCCESS.getCode()) .setPayTime(payTime); - payChannelOrderManager.updateById(this.getChannelOrder()); // 保存流水记录 weChatPayRecordService.pay(this.getOrder(), this.getChannelOrder()); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PaySyncService.java index f7436d18..b2abc2d0 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/sync/service/PaySyncService.java @@ -104,11 +104,10 @@ public class PaySyncService { if (Objects.equals(syncResult.getSyncStatus(), PaySyncStatusEnum.FAIL)){ // 同步失败, 返回失败响应, 同时记录失败的日志 this.saveRecord(payOrder, syncResult, false, null, syncResult.getErrorMsg()); -// return new SyncResult().setErrorMsg(syncResult.getErrorMsg()); throw new PayFailureException(syncResult.getErrorMsg()); } // 支付订单的网关订单号是否一致, 不一致进行更新 - if (Objects.nonNull(syncResult.getGatewayOrderNo()) && !Objects.equals(syncResult.getGatewayOrderNo(), payOrder.getGatewayOrderNo())){ + if (!Objects.equals(syncResult.getGatewayOrderNo(), payOrder.getGatewayOrderNo())){ payOrder.setGatewayOrderNo(syncResult.getGatewayOrderNo()); payOrderService.updateById(payOrder); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/channel/alipay/AliPayRecordDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/channel/alipay/AliPayRecordDto.java index 9b84a16d..f89f85da 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/channel/alipay/AliPayRecordDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/channel/alipay/AliPayRecordDto.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDateTime; + /** * 微信支付记录 * @author xxm @@ -41,4 +43,8 @@ public class AliPayRecordDto extends BaseDto { @Schema(description = "网关订单号") private String gatewayOrderNo; + /** 网关完成时间 */ + @Schema(description = "网关完成时间") + private LocalDateTime gatewayTime; + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/channel/wechat/WeChatPayRecordDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/channel/wechat/WeChatPayRecordDto.java index cec50114..7d106e92 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/channel/wechat/WeChatPayRecordDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/channel/wechat/WeChatPayRecordDto.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDateTime; + /** * 微信支付记录 * @author xxm @@ -41,4 +43,8 @@ public class WeChatPayRecordDto extends BaseDto { @Schema(description = "网关订单号") private String gatewayOrderNo; + /** 网关完成时间 */ + @Schema(description = "网关完成时间") + private LocalDateTime gatewayTime; + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsPayRepairStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsPayRepairStrategy.java index 2148dad2..e2f7a570 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsPayRepairStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/func/AbsPayRepairStrategy.java @@ -47,9 +47,7 @@ public abstract class AbsPayRepairStrategy implements PayStrategy{ /** * 等待支付处理 */ - public void doWaitPayHandler(){ - - } + public void doWaitPayHandler(){} /** * 关闭本地支付 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 index c3d65fe3..d74805ee 100644 --- 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 @@ -1,30 +1,38 @@ package cn.bootx.platform.daxpay.service.func; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; +import java.util.List; /** * 支付对账策略 * @author xxm * @since 2024/1/18 */ +@Setter @Getter public abstract class AbsReconcileStrategy implements PayStrategy { /** 对账订单 */ private PayReconcileOrder recordOrder; + /** 对账订单明细 */ + private List reconcileDetails; + + /** - * 对账前处理, 主要是初始化支付SDK配置 + * 生成对账序列号 */ - public void doBeforeHandler() { - } + public abstract String generateSequence(LocalDate date); /** - * 初始化参数 + * 对账前处理, 主要是初始化支付SDK配置 */ - public void initParam(PayReconcileOrder recordOrder){ - this.recordOrder = recordOrder; + public void doBeforeHandler() { } /** @@ -36,10 +44,8 @@ public abstract class AbsReconcileStrategy implements PayStrategy { * 比对生成对账差异单 * 1. 远程有, 本地无 补单(追加回订单/记录差异表) * 2. 远程无, 本地有 记录差错表 - * 3. 远程有, 本地有, 但状态不一致 + * 3. 远程有, 本地有, 但状态不一致 记录差错表 */ - public void offsetting(){ - - } + public abstract void compare(); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/order/RefundOrderQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/order/RefundOrderQuery.java index d82dc9a1..0113f423 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/order/RefundOrderQuery.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/order/RefundOrderQuery.java @@ -20,10 +20,13 @@ import lombok.experimental.Accessors; @Schema(title = "支付退款查询参数") public class RefundOrderQuery extends QueryOrder { - @Schema(description = "退款号") + @Schema(description = "退款Id") private Long id; - @Schema(description = "支付号") + @Schema(description = "退款号") + private String refundNo; + + @Schema(description = "支付ID") private Long paymentId; @Schema(description = "关联的业务号") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayReconcileTask.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayReconcileTask.java index 9740205a..bcd4f34e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayReconcileTask.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayReconcileTask.java @@ -24,7 +24,7 @@ public class PayReconcileTask implements Job { private final PayReconcileTaskService reconcileTaskService; /** - * 若参数变量名修改 QuartzJobScheduler 中也需对应修改 需要给一个set方法, 让系统设置值 + * 要同步的通道 */ @Setter private String channel; @@ -47,6 +47,6 @@ public class PayReconcileTask implements Job { } else { date = date.minusDays(1); } - reconcileTaskService.x1(date,channel); + reconcileTaskService.reconcileTask(date,channel); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/PayReconcileTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/PayReconcileTaskService.java index b896dbed..9bd94c70 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/PayReconcileTaskService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/PayReconcileTaskService.java @@ -1,7 +1,6 @@ package cn.bootx.platform.daxpay.service.task.service; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; -import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileOrderService; import cn.bootx.platform.daxpay.service.core.payment.reconcile.service.PayReconcileService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,21 +18,20 @@ import java.time.LocalDate; @RequiredArgsConstructor public class PayReconcileTaskService { private final PayReconcileService reconcileService; - private final PayReconcileOrderService reconcileOrderService; /** * 执行任务 */ - public void x1(LocalDate date, String channel){ + public void reconcileTask(LocalDate date, String channel){ // 1. 查询需要定时对账的通道, 创建出来对账订单 - PayReconcileOrder reconcileOrder = reconcileOrderService.create(date, channel); + PayReconcileOrder reconcileOrder = reconcileService.create(date, channel); // 2. 执行对账任务, 下载对账单并解析, 分别存储为原始数据和通用对账数据 reconcileService.downAndSave(reconcileOrder); // 3. 执行账单比对, 生成差异单 - + reconcileService.compare(reconcileOrder); } } diff --git a/lombok.config b/lombok.config index 547f3950..df1e5e5e 100644 --- a/lombok.config +++ b/lombok.config @@ -1,4 +1,5 @@ # 将字段上的注解拷贝到对应构造参数上, 如果要新增别的注解, 需要在下方重新进行定义, lombok.copyableAnnotations += org.springframework.context.annotation.Lazy +lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier # 默认开启实体类的链式API 会导致一些反射相关类库出问题, 如 easyExcel #lombok.accessors.chain = true diff --git a/pom.xml b/pom.xml index 6cac1e85..33425cb6 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.8 - 1.3.6.1 + 1.3.6.2 2.0.1 1.7.30 -- Gitee From a886c17ea6cf585e4499399909446adb2eda53d3 Mon Sep 17 00:00:00 2001 From: bootx Date: Thu, 29 Feb 2024 00:00:14 +0800 Subject: [PATCH 03/10] =?UTF-8?q?feat=20=E5=AF=B9=E8=B4=A6=E5=B7=AE?= =?UTF-8?q?=E5=BC=82=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/PayReconcileDiffRecordManager.java | 18 ++++++ .../dao/PayReconcileDiffRecordMapper.java | 14 +++++ .../reconcile/entity/PayReconcileDetail.java | 2 +- .../entity/PayReconcileDiffRecord.java | 60 +++++++++++++++++++ .../service/ClientNoticeAssistService.java | 4 +- .../notice/service/ClientNoticeService.java | 2 +- .../notice/entity/ClientNoticeRecord.java | 2 +- .../task/notice/entity/ClientNoticeTask.java | 12 +++- 8 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordManager.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordMapper.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordManager.java new file mode 100644 index 00000000..4277e7c1 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordManager.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.daxpay.service.core.order.reconcile.dao; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +/** + * + * @author xxm + * @since 2024/2/28 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class PayReconcileDiffRecordManager extends BaseManager { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordMapper.java new file mode 100644 index 00000000..1fec857d --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordMapper.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay.service.core.order.reconcile.dao; + +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 对账差异单 + * @author xxm + * @since 2024/2/28 + */ +@Mapper +public interface PayReconcileDiffRecordMapper extends BaseMapper { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java index b134a90e..c9291302 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java @@ -48,7 +48,7 @@ public class PayReconcileDetail extends MpCreateEntity implements EntityBaseFunc private String orderId; /** 支付订单ID */ - @DbColumn(comment = "本地订单ID") + @DbColumn(comment = "支付订单ID") private String paymentId; /** 本地退款ID */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java new file mode 100644 index 00000000..1edbcee9 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java @@ -0,0 +1,60 @@ +package cn.bootx.platform.daxpay.service.core.order.reconcile.entity; + +import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.table.modify.annotation.DbColumn; +import cn.bootx.table.modify.annotation.DbTable; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 对账差异单 + * @author xxm + * @since 2024/2/28 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@DbTable(comment = "对账差异单") +@TableName("pay_reconcile_diff_record") +public class PayReconcileDiffRecord extends MpBaseEntity { + + /** 对账单ID */ + @DbColumn(comment = "对账单ID") + private Long recordId; + + /** 对账单明细ID */ + @DbColumn(comment = "对账单明细ID") + private Long detailId; + + /** 本地订单id */ + @DbColumn(comment = "本地订单id") + private Long orderId; + + /** 订单标题 */ + @DbColumn(comment = "订单标题") + private String title; + + /** 订单类型 */ + @DbColumn(comment = "订单类型") + private String orderType; + + /** 差异类型 */ + @DbColumn(comment = "差异类型") + private String diffType; + + /** 网关订单号 */ + @DbColumn(comment = "网关订单号") + private String gatewayOrderNo; + + /** 交易金额 */ + @DbColumn(comment = "交易金额") + private Integer amount; + + /** 订单时间 */ + @DbColumn(comment = "订单时间") + private LocalDateTime orderTime; +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeAssistService.java index 874d6156..6d75380c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeAssistService.java @@ -73,7 +73,7 @@ public class ClientNoticeAssistService { .setUrl(orderExtra.getNotifyUrl()) // 时间序列化进行了重写 .setContent(JacksonUtil.toJson(payNoticeResult)) - .setType(ClientNoticeTypeEnum.PAY.getType()) + .setNoticeType(ClientNoticeTypeEnum.PAY.getType()) .setSendCount(0) .setOrderId(order.getId()); } @@ -113,7 +113,7 @@ public class ClientNoticeAssistService { .setUrl(orderExtra.getNotifyUrl()) // 时间序列化进行了重写 .setContent(JacksonUtil.toJson(payNoticeResult)) - .setType(ClientNoticeTypeEnum.REFUND.getType()) + .setNoticeType(ClientNoticeTypeEnum.REFUND.getType()) .setSendCount(0) .setOrderId(order.getId()); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeService.java index a9dd68f5..9ccf5084 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/notice/service/ClientNoticeService.java @@ -219,7 +219,7 @@ public class ClientNoticeService { // 创建记录 ClientNoticeRecord record = new ClientNoticeRecord() .setTaskId(task.getId()) - .setType(ClientNoticeSendTypeEnum.AUTO.getType()) + .setSendType(ClientNoticeSendTypeEnum.AUTO.getType()) .setReqCount(task.getSendCount()+1); String body = null; try { diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/task/notice/entity/ClientNoticeRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/task/notice/entity/ClientNoticeRecord.java index 1b1a4616..2ca3a282 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/task/notice/entity/ClientNoticeRecord.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/task/notice/entity/ClientNoticeRecord.java @@ -41,7 +41,7 @@ public class ClientNoticeRecord extends MpCreateEntity implements EntityBaseFunc * @see ClientNoticeSendTypeEnum */ @DbColumn(comment = "发送类型") - private String type; + private String sendType; /** 错误信息 */ @DbColumn(comment = "错误信息") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/task/notice/entity/ClientNoticeTask.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/task/notice/entity/ClientNoticeTask.java index e471beee..936d7f68 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/task/notice/entity/ClientNoticeTask.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/task/notice/entity/ClientNoticeTask.java @@ -2,6 +2,8 @@ package cn.bootx.platform.daxpay.service.core.task.notice.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.daxpay.code.PayStatusEnum; +import cn.bootx.platform.daxpay.code.RefundStatusEnum; import cn.bootx.platform.daxpay.service.code.ClientNoticeTypeEnum; import cn.bootx.platform.daxpay.service.core.task.notice.convert.ClientNoticeConvert; import cn.bootx.platform.daxpay.service.dto.record.notice.ClientNoticeTaskDto; @@ -37,7 +39,15 @@ public class ClientNoticeTask extends MpBaseEntity implements EntityBaseFunction * @see ClientNoticeTypeEnum */ @DbColumn(comment = "消息类型") - private String type; + private String noticeType; + + /** + * 订单类型 + * @see PayStatusEnum + * @see RefundStatusEnum + */ + @DbColumn(comment = "订单类型") + private String orderStatus; /** 消息内容 */ @DbColumn(comment = "消息内容") -- Gitee From 264e113c0e0d3cf05a0469c500aafe103aaa9c8e Mon Sep 17 00:00:00 2001 From: bootx Date: Thu, 29 Feb 2024 23:14:42 +0800 Subject: [PATCH 04/10] =?UTF-8?q?feat=20=E5=AF=B9=E8=B4=A6=E5=B7=AE?= =?UTF-8?q?=E5=BC=82=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PayReconcileDiffRecordService.java | 20 +++++++++++++++++++ .../service/PayReconcileService.java | 11 +++++++--- .../strategy/AlipayReconcileStrategy.java | 11 ++++++++-- .../strategy/WechatPayReconcileStrategy.java | 5 ++++- .../service/func/AbsReconcileStrategy.java | 5 ++++- 5 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileDiffRecordService.java diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileDiffRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileDiffRecordService.java new file mode 100644 index 00000000..5cf6131c --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileDiffRecordService.java @@ -0,0 +1,20 @@ +package cn.bootx.platform.daxpay.service.core.order.reconcile.service; + +import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileDiffRecordManager; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * + * @author xxm + * @since 2024/2/29 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PayReconcileDiffRecordService { + private final PayReconcileDiffRecordManager recordManager; + + +} 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 565236fc..0ca137e9 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 @@ -7,7 +7,9 @@ import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileDetailManager; import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileOrderManager; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; +import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileDiffRecordService; import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileOrderService; import cn.bootx.platform.daxpay.service.core.payment.reconcile.factory.PayReconcileStrategyFactory; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; @@ -29,8 +31,11 @@ import java.util.List; @Service @RequiredArgsConstructor public class PayReconcileService { - private final PayReconcileOrderManager reconcileOrderManager; private final PayReconcileOrderService reconcileOrderService; + + private final PayReconcileDiffRecordService reconcileDiffRecordService; + + private final PayReconcileOrderManager reconcileOrderManager; private final PayReconcileDetailManager reconcileDetailManager; /** @@ -125,8 +130,8 @@ public class PayReconcileService { reconcileStrategy.setRecordOrder(reconcileOrder); reconcileStrategy.setReconcileDetails(reconcileDetails); try { - // 执行比对任务 - reconcileStrategy.compare(); + // 执行比对任务, 获取对账差异记录 + List diffRecords = reconcileStrategy.generateDiffRecord(); // reconcileOrder.setCompare(true); // reconcileOrderService.update(reconcileOrder); } catch (Exception e) { 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 82e04df4..b7b22c64 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 @@ -13,6 +13,7 @@ import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayRecord; 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.core.order.reconcile.entity.PayReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import cn.hutool.core.date.DatePattern; import lombok.Getter; @@ -24,6 +25,7 @@ import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -104,11 +106,15 @@ public class AlipayReconcileStrategy extends AbsReconcileStrategy { * 3. 远程有, 本地有, 但状态不一致 记录差错表 */ @Override - public void compare() { + public List generateDiffRecord() { List details = this.getReconcileDetails(); if (CollUtil.isEmpty(details)){ - return; + return new ArrayList<>(0); } + + // 差异单列表 + List diffRecords = new ArrayList<>(); + Map detailMap = details.stream() .collect(Collectors.toMap(PayReconcileDetail::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); @@ -160,5 +166,6 @@ public class AlipayReconcileStrategy extends AbsReconcileStrategy { continue; } } + return diffRecords; } } 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 84c05e54..7b107fd0 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 @@ -13,6 +13,7 @@ import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayReco 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.core.order.reconcile.entity.PayReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import cn.hutool.core.date.DatePattern; import lombok.RequiredArgsConstructor; @@ -99,9 +100,11 @@ public class WechatPayReconcileStrategy extends AbsReconcileStrategy { * 1. 远程有, 本地无 补单(追加回订单/记录差异表) * 2. 远程无, 本地有 记录差错表 * 3. 远程有, 本地有, 但状态不一致 记录差错表 + * + * @return */ @Override - public void compare() { + public List generateDiffRecord() { List details = this.getReconcileDetails(); if (CollUtil.isEmpty(details)){ return; 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 index d74805ee..793f27fd 100644 --- 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 @@ -1,6 +1,7 @@ package cn.bootx.platform.daxpay.service.func; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; import lombok.Getter; import lombok.Setter; @@ -45,7 +46,9 @@ public abstract class AbsReconcileStrategy implements PayStrategy { * 1. 远程有, 本地无 补单(追加回订单/记录差异表) * 2. 远程无, 本地有 记录差错表 * 3. 远程有, 本地有, 但状态不一致 记录差错表 + * + * @return */ - public abstract void compare(); + public abstract List generateDiffRecord(); } -- Gitee From ee97b517a4e8afe62f31a469e029947a55e9f6d8 Mon Sep 17 00:00:00 2001 From: bootx Date: Fri, 1 Mar 2024 23:46:02 +0800 Subject: [PATCH 05/10] =?UTF-8?q?feat=20=E5=AF=B9=E8=B4=A6=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...TradeEnum.java => ReconcileTradeEnum.java} | 4 +- .../service/code/ReconcileDiffTypeEnum.java | 24 +++++ .../channel/alipay/convert/AlipayConvert.java | 5 +- .../alipay/entity/AliReconcileBillDetail.java | 2 +- .../service/AliPayReconcileService.java | 14 ++- .../channel/wechat/convert/WeChatConvert.java | 3 + .../entity/WxReconcileFundFlowDetail.java | 12 +-- .../service/WechatPayReconcileService.java | 9 +- .../reconcile/entity/PayReconcileDetail.java | 10 +- .../entity/PayReconcileDiffRecord.java | 13 ++- .../domain/GeneralReconcileRecord.java | 37 +++++++ .../reconcile/domain/ReconcileDiff.java | 9 ++ .../service/PayReconcileService.java | 100 +++++++++++++++++- .../strategy/AlipayReconcileStrategy.java | 76 ++----------- .../strategy/WechatPayReconcileStrategy.java | 71 ++----------- .../service/func/AbsReconcileStrategy.java | 11 +- .../param/reconcile/ReconcileDetailQuery.java | 4 +- 17 files changed, 238 insertions(+), 166 deletions(-) rename daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/{PayReconcileTradeEnum.java => ReconcileTradeEnum.java} (83%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/ReconcileDiffTypeEnum.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/GeneralReconcileRecord.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/ReconcileDiff.java diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PayReconcileTradeEnum.java b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/ReconcileTradeEnum.java similarity index 83% rename from daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PayReconcileTradeEnum.java rename to daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/ReconcileTradeEnum.java index 571ed24e..033e7351 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PayReconcileTradeEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/ReconcileTradeEnum.java @@ -4,13 +4,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 支付对账交易类型 + * 对账交易类型 * @author xxm * @since 2024/1/23 */ @Getter @AllArgsConstructor -public enum PayReconcileTradeEnum { +public enum ReconcileTradeEnum { PAY("pay","支付"), REFUND("refund","退款"), diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/ReconcileDiffTypeEnum.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/ReconcileDiffTypeEnum.java new file mode 100644 index 00000000..b9af5a4a --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/code/ReconcileDiffTypeEnum.java @@ -0,0 +1,24 @@ +package cn.bootx.platform.daxpay.service.code; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 对账差异类型 + * @author xxm + * @since 2024/3/1 + */ +@Getter +@AllArgsConstructor +public enum ReconcileDiffTypeEnum { + + /** 本地订单不存在 */ + LOCAL_NOT_EXISTS("local_not_exists","本地订单不存在"), + /** 远程订单不存在 */ + REMOTE_NOT_EXISTS("remote_not_exists","远程订单不存在"), + /** 订单信息不一致 */ + NOT_MATCH("not_match","订单信息不一致"); + + final String code; + final String name; +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/convert/AlipayConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/convert/AlipayConvert.java index 36e070ea..13bb8b6c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/convert/AlipayConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/convert/AlipayConvert.java @@ -2,6 +2,7 @@ package cn.bootx.platform.daxpay.service.core.channel.alipay.convert; import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayRecord; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; import cn.bootx.platform.daxpay.service.dto.channel.alipay.AliPayConfigDto; import cn.bootx.platform.daxpay.service.dto.channel.alipay.AliPayRecordDto; import cn.bootx.platform.daxpay.service.param.channel.alipay.AliPayConfigParam; @@ -19,10 +20,10 @@ public interface AlipayConvert { AlipayConvert CONVERT = Mappers.getMapper(AlipayConvert.class); - AliPayConfig convert(AliPayConfigDto in); - AliPayRecordDto convert(AliPayRecord in); + GeneralReconcileRecord convertReconcileRecord(AliPayRecord in); + AliPayConfig convert(AliPayConfigParam in); AliPayConfigDto convert(AliPayConfig in); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillDetail.java index dfc224a7..453af07f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliReconcileBillDetail.java @@ -34,7 +34,7 @@ public class AliReconcileBillDetail extends MpIdEntity { @DbColumn(comment = "商品名称") private String subject; @Alias("创建时间") - @DbColumn(comment = "完成时间") + @DbColumn(comment = "创建时间") private String createTime; @Alias("完成时间") @DbColumn(comment = "完成时间") 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 index 2a8e6185..8b74a290 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 @@ -1,9 +1,10 @@ package cn.bootx.platform.daxpay.service.core.channel.alipay.service; -import cn.bootx.platform.daxpay.code.PayReconcileTradeEnum; +import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.code.AliPayCode; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; +import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliPayRecordManager; import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliReconcileBillDetailManager; import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliReconcileBillTotalManager; import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; @@ -50,6 +51,8 @@ public class AliPayReconcileService { private final AliReconcileBillTotalManager reconcileBillTotalManager; + private final AliPayRecordManager recordManager; + /** * 下载对账单, 并进行解析进行保存 * @@ -139,14 +142,14 @@ public class AliPayReconcileService { PayReconcileDetail payReconcileDetail = new PayReconcileDetail() .setRecordOrderId(billDetail.getRecordOrderId()) .setOrderId(billDetail.getOutTradeNo()) - .setType(PayReconcileTradeEnum.PAY.getCode()) + .setType(ReconcileTradeEnum.PAY.getCode()) .setAmount(amount) .setTitle(billDetail.getSubject()) .setGatewayOrderNo(billDetail.getTradeNo()); // 退款覆盖更新对应的字段 if (Objects.equals(billDetail.getTradeType(), "退款")){ payReconcileDetail.setOrderId(billDetail.getBatchNo()) - .setType(PayReconcileTradeEnum.REFUND.getCode()); + .setType(ReconcileTradeEnum.REFUND.getCode()); } return payReconcileDetail; @@ -156,7 +159,7 @@ public class AliPayReconcileService { /** * 解析明细 */ - public List parseDetail(List list){ + private List parseDetail(List list){ // 截取需要进行解析的文本内容 String billDetail = list.stream() .collect(Collectors.joining(System.lineSeparator())); @@ -171,7 +174,7 @@ public class AliPayReconcileService { /** * 解析汇总 */ - public List parseTotal(List list){ + private List parseTotal(List list){ // 去除前 4 行和后 2 行 然后合并是个一个字符串 String billTotal = list.stream() .collect(Collectors.joining(System.lineSeparator())); @@ -183,4 +186,5 @@ public class AliPayReconcileService { CsvReader reader = CsvUtil.getReader(); return reader.read(billTotal, AliReconcileBillTotal.class); } + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/convert/WeChatConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/convert/WeChatConvert.java index 47b335be..e57a6387 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/convert/WeChatConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/convert/WeChatConvert.java @@ -2,6 +2,7 @@ package cn.bootx.platform.daxpay.service.core.channel.wechat.convert; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConfig; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayRecord; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; import cn.bootx.platform.daxpay.service.dto.channel.wechat.WeChatPayConfigDto; import cn.bootx.platform.daxpay.service.dto.channel.wechat.WeChatPayRecordDto; import cn.bootx.platform.daxpay.service.param.channel.wechat.WeChatPayConfigParam; @@ -23,6 +24,8 @@ public interface WeChatConvert { WeChatPayRecordDto convert(WeChatPayRecord in); + GeneralReconcileRecord convertReconcileRecord(WeChatPayRecord in); + WeChatPayConfigDto convert(WeChatPayConfig in); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowDetail.java index ee70be53..13fc9069 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WxReconcileFundFlowDetail.java @@ -30,13 +30,13 @@ public class WxReconcileFundFlowDetail extends MpCreateEntity { private String flowId; @Alias("业务名称") @DbColumn(comment = "业务名称") - private String packet1; + private String name; @Alias("业务类型") @DbColumn(comment = "业务类型") - private String packet2; + private String businessType; @Alias("收支类型") @DbColumn(comment = "收支类型") - private String packet3; + private String incomeType; @Alias("收支金额(元)") @DbColumn(comment = "收支金额(元)") private String amount; @@ -45,11 +45,11 @@ public class WxReconcileFundFlowDetail extends MpCreateEntity { private String balance; @Alias("资金变更提交申请人") @DbColumn(comment = "资金变更提交申请人") - private String packet4; + private String applyUser; @Alias("备注") @DbColumn(comment = "备注") - private String packet5; + private String remark; @Alias("业务凭证号") @DbColumn(comment = "业务凭证号") - private String packet6; + private String voucherNo; } 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 07c634da..7aa36a27 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 @@ -1,9 +1,10 @@ package cn.bootx.platform.daxpay.service.core.channel.wechat.service; -import cn.bootx.platform.daxpay.code.PayReconcileTradeEnum; +import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.code.WeChatPayCode; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; +import cn.bootx.platform.daxpay.service.core.channel.wechat.dao.WeChatPayRecordManager; 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; @@ -45,6 +46,8 @@ public class WechatPayReconcileService{ private final WxReconcileBillTotalManger reconcileBillTotalManger; private final WxReconcileBillDetailManager reconcileBillDetailManager; + private final WeChatPayRecordManager recordManager; + /** * 下载对账单并保存 * @param date 对账日期 yyyyMMdd 格式 @@ -127,7 +130,7 @@ public class WechatPayReconcileService{ String orderAmount = billDetail.getOrderAmount(); double v = Double.parseDouble(orderAmount) * 100; int amount = Math.abs(((int) v)); - payReconcileDetail.setType(PayReconcileTradeEnum.PAY.getCode()) + payReconcileDetail.setType(ReconcileTradeEnum.PAY.getCode()) .setAmount(amount); } // 退款 @@ -136,7 +139,7 @@ public class WechatPayReconcileService{ String refundAmount = billDetail.getApplyRefundAmount(); double v = Double.parseDouble(refundAmount) * 100; int amount = Math.abs(((int) v)); - payReconcileDetail.setType(PayReconcileTradeEnum.REFUND.getCode()) + payReconcileDetail.setType(ReconcileTradeEnum.REFUND.getCode()) .setAmount(amount) .setOrderId(billDetail.getMchRefundNo()); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java index c9291302..b0d32226 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java @@ -2,7 +2,7 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; -import cn.bootx.platform.daxpay.code.PayReconcileTradeEnum; +import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; import cn.bootx.platform.daxpay.service.core.order.reconcile.conver.PayReconcileConvert; import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileDetailDto; import cn.bootx.table.modify.annotation.DbColumn; @@ -12,6 +12,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDateTime; + /** * 通用支付对账记录 * @author xxm @@ -38,7 +40,7 @@ public class PayReconcileDetail extends MpCreateEntity implements EntityBaseFunc /** * 交易类型 - * @see PayReconcileTradeEnum + * @see ReconcileTradeEnum */ @DbColumn(comment = "交易类型") private String type; @@ -59,6 +61,10 @@ public class PayReconcileDetail extends MpCreateEntity implements EntityBaseFunc @DbColumn(comment = "网关订单号") private String gatewayOrderNo; + /** 订单时间 */ + @DbColumn(comment = "订单时间") + private LocalDateTime orderTime; + @Override public PayReconcileDetailDto toDto() { diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java index 1edbcee9..ef1216b0 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java @@ -1,6 +1,7 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.entity; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; import cn.bootx.table.modify.annotation.DbColumn; import cn.bootx.table.modify.annotation.DbTable; import com.baomidou.mybatisplus.annotation.TableName; @@ -38,11 +39,17 @@ public class PayReconcileDiffRecord extends MpBaseEntity { @DbColumn(comment = "订单标题") private String title; - /** 订单类型 */ - @DbColumn(comment = "订单类型") + /** + * 对账订单类型 + * @see ReconcileTradeEnum + */ + @DbColumn(comment = "对账订单类型") private String orderType; - /** 差异类型 */ + /** + * 差异类型 + * + */ @DbColumn(comment = "差异类型") private String diffType; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/GeneralReconcileRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/GeneralReconcileRecord.java new file mode 100644 index 00000000..f23ec191 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/GeneralReconcileRecord.java @@ -0,0 +1,37 @@ +package cn.bootx.platform.daxpay.service.core.payment.reconcile.domain; + +import cn.bootx.platform.daxpay.service.code.AliPayRecordTypeEnum; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 通用对账记录对象,用于与网关进行对账 + * @author xxm + * @since 2024/3/1 + */ +@Data +public class GeneralReconcileRecord { + /** 标题 */ + private String title; + + /** 金额 */ + private Integer amount; + + /** + * 业务类型 + * @see AliPayRecordTypeEnum + */ + private String type; + + /** 本地订单号 */ + private Long orderId; + + /** 网关订单号 */ + private String gatewayOrderNo; + + /** 网关完成时间 */ + private LocalDateTime gatewayTime; + + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/ReconcileDiff.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/ReconcileDiff.java new file mode 100644 index 00000000..2d85a6dc --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/ReconcileDiff.java @@ -0,0 +1,9 @@ +package cn.bootx.platform.daxpay.service.core.payment.reconcile.domain; + +/** + * 对账差异内容 + * @author xxm + * @since 2024/3/1 + */ +public class ReconcileDiff { +} 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 0ca137e9..c9401f6e 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,8 +1,13 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.service; import cn.bootx.platform.common.core.exception.DataNotExistException; +import cn.bootx.platform.common.core.function.CollectorsFunction; +import cn.bootx.platform.common.core.util.CollUtil; import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; +import cn.bootx.platform.daxpay.service.code.AliPayRecordTypeEnum; +import cn.bootx.platform.daxpay.service.code.ReconcileDiffTypeEnum; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileDetailManager; import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileOrderManager; @@ -11,6 +16,7 @@ import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcile import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileDiffRecordService; import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileOrderService; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; import cn.bootx.platform.daxpay.service.core.payment.reconcile.factory.PayReconcileStrategyFactory; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import lombok.RequiredArgsConstructor; @@ -20,7 +26,12 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +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; /** * 支付对账单下载服务 @@ -131,7 +142,8 @@ public class PayReconcileService { reconcileStrategy.setReconcileDetails(reconcileDetails); try { // 执行比对任务, 获取对账差异记录 - List diffRecords = reconcileStrategy.generateDiffRecord(); + List generalReconcileRecord = reconcileStrategy.getGeneralReconcileRecord(); + List diffRecords = this.generateDiffRecord(generalReconcileRecord,reconcileDetails); // reconcileOrder.setCompare(true); // reconcileOrderService.update(reconcileOrder); } catch (Exception e) { @@ -141,4 +153,90 @@ public class PayReconcileService { throw new RuntimeException(e); } } + + /** + * 比对生成对账差异单 + * 1. 远程有, 本地无 补单(追加回订单/记录差异表) + * 2. 远程无, 本地有 记录差错表 + * 3. 远程有, 本地有, 但状态不一致 记录差错表 + * + */ + private List generateDiffRecord(List records, List details){ + if (CollUtil.isEmpty(details)){ + return new ArrayList<>(); + } + Map detailMap = details.stream() + .collect(Collectors.toMap(PayReconcileDetail::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); + + List diffRecords = new ArrayList<>(); + + Map recordMap = records.stream() + .collect(Collectors.toMap(GeneralReconcileRecord::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); + + // 对账与流水比对 + for (PayReconcileDetail detail : details) { + // 判断本地流水有没有记录, 流水没有记录查询本地订单 + GeneralReconcileRecord record = recordMap.get(Long.valueOf(detail.getOrderId())); + if (Objects.isNull(record)){ + log.info("本地订单不存在: {}", detail.getOrderId()); + PayReconcileDiffRecord diffRecord = new PayReconcileDiffRecord() + .setDiffType(ReconcileDiffTypeEnum.LOCAL_NOT_EXISTS.getCode()) + .setOrderId(Long.valueOf(detail.getOrderId())) + .setDetailId(detail.getId()) + .setRecordId(detail.getRecordOrderId()) + .setTitle(detail.getTitle()) + .setDiffType(detail.getType()) + .setGatewayOrderNo(detail.getGatewayOrderNo()) + .setAmount(detail.getAmount()) + .setOrderTime(detail.getOrderTime()); + diffRecords.add(diffRecord); + continue; + } + // 交易类型 支付/退款 + if (Objects.equals(detail.getType(), ReconcileTradeEnum.PAY.getCode())){ + // 判断类型是否存在差异 + if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.PAY.getCode())){ + PayReconcileDiffRecord diffRecord = new PayReconcileDiffRecord() + .setDiffType(ReconcileDiffTypeEnum.NOT_MATCH.getCode()) + .setOrderId(Long.valueOf(detail.getOrderId())) + .setDetailId(detail.getId()) + .setRecordId(detail.getRecordOrderId()) + .setTitle(detail.getTitle()) + .setDiffType(detail.getType()) + .setGatewayOrderNo(detail.getGatewayOrderNo()) + .setAmount(detail.getAmount()) + .setOrderTime(detail.getOrderTime()); + diffRecords.add(diffRecord); + continue; + } + } else { + // 判断类型是否存在差异 + if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.REFUND.getCode())) { + log.info("本地订单类型不正常: {}", detail.getOrderId()); + continue; + } + } + // 判断是否存在差异 金额, 状态 + if (!Objects.equals(record.getAmount(), detail.getAmount())){ + log.info("本地订单金额不正常: {}", detail.getOrderId()); + continue; + } + } + // 流水与对账单比对, 找出本地有, 远程没有的记录 + for (GeneralReconcileRecord record : records) { + PayReconcileDetail detail = detailMap.get(String.valueOf(record.getOrderId())); + if (Objects.isNull(detail)){ + log.info("远程订单不存在: {}", record.getOrderId()); + continue; + } + } + return diffRecords; + } + + /** + * 判断订单之间是否存在差异 + */ + public void reconcileDiff(GeneralReconcileRecord record, PayReconcileDetail detail){ + + } } 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 b7b22c64..b2bfb315 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,19 +1,16 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.strategy; -import cn.bootx.platform.common.core.function.CollectorsFunction; -import cn.bootx.platform.common.core.util.CollUtil; import cn.bootx.platform.common.core.util.LocalDateTimeUtil; import cn.bootx.platform.common.sequence.func.Sequence; import cn.bootx.platform.daxpay.code.PayChannelEnum; -import cn.bootx.platform.daxpay.code.PayReconcileTradeEnum; -import cn.bootx.platform.daxpay.service.code.AliPayRecordTypeEnum; +import cn.bootx.platform.daxpay.service.core.channel.alipay.convert.AlipayConvert; import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliPayRecordManager; import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayRecord; 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.core.order.reconcile.entity.PayReconcileDetail; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import cn.hutool.core.date.DatePattern; import lombok.Getter; @@ -25,11 +22,7 @@ import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; -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; import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; @@ -100,72 +93,15 @@ public class AlipayReconcileStrategy extends AbsReconcileStrategy { } /** - * 比对生成对账差异单 - * 1. 远程有, 本地无 补单(追加回订单/记录差异表) - * 2. 远程无, 本地有 记录差错表 - * 3. 远程有, 本地有, 但状态不一致 记录差错表 + * 获取通用对账对象, 将流水记录转换为对账对象 */ @Override - public List generateDiffRecord() { - List details = this.getReconcileDetails(); - if (CollUtil.isEmpty(details)){ - return new ArrayList<>(0); - } - - // 差异单列表 - List diffRecords = new ArrayList<>(); - - Map detailMap = details.stream() - .collect(Collectors.toMap(PayReconcileDetail::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); - - // 对哪天进行对账 - LocalDate date = this.getRecordOrder().getDate(); - + public List getGeneralReconcileRecord() { // 查询流水 - LocalDateTime localDateTime = LocalDateTimeUtil.date2DateTime(date); + LocalDateTime localDateTime = LocalDateTimeUtil.date2DateTime(this.getRecordOrder().getDate()); LocalDateTime start = LocalDateTimeUtil.beginOfDay(localDateTime); LocalDateTime end = LocalDateTimeUtil.endOfDay(localDateTime); List records = recordManager.findByDate(start, end); - Map recordMap = records.stream() - .collect(Collectors.toMap(AliPayRecord::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); - - // 对账与流水比对 - for (PayReconcileDetail detail : details) { - // 判断本地有没有记录 - AliPayRecord record = recordMap.get(Long.valueOf(detail.getOrderId())); - if (Objects.isNull(record)){ - log.info("本地订单不存在: {}", detail.getOrderId()); - continue; - } - System.out.println(detail.getId()); - // 交易类型 支付/退款 - if (Objects.equals(detail.getType(), PayReconcileTradeEnum.PAY.getCode())){ - // 判断类型是否存在差异 - if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.PAY.getCode())){ - log.info("本地订单类型不正常: {}", detail.getOrderId()); - continue; - } - } else { - // 判断类型是否存在差异 - if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.REFUND.getCode())){ - log.info("本地订单类型不正常: {}", detail.getOrderId()); - continue; - } - } - // 判断是否存在差异 金额, 状态 - if (!Objects.equals(record.getAmount(), detail.getAmount())){ - log.info("本地订单金额不正常: {}", detail.getOrderId()); - continue; - } - } - // 流水与对账单比对, 找出本地有, 远程没有的记录 - for (AliPayRecord record : records) { - PayReconcileDetail detail = detailMap.get(String.valueOf(record.getOrderId())); - if (Objects.isNull(detail)){ - log.info("远程订单不存在: {}", record.getOrderId()); - continue; - } - } - return diffRecords; + return records.stream().map(AlipayConvert.CONVERT::convertReconcileRecord).collect(Collectors.toList()); } } 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 7b107fd0..b973208a 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,19 +1,16 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.strategy; -import cn.bootx.platform.common.core.function.CollectorsFunction; -import cn.bootx.platform.common.core.util.CollUtil; import cn.bootx.platform.common.core.util.LocalDateTimeUtil; import cn.bootx.platform.common.sequence.func.Sequence; import cn.bootx.platform.daxpay.code.PayChannelEnum; -import cn.bootx.platform.daxpay.code.PayReconcileTradeEnum; -import cn.bootx.platform.daxpay.service.code.AliPayRecordTypeEnum; +import cn.bootx.platform.daxpay.service.core.channel.wechat.convert.WeChatConvert; import cn.bootx.platform.daxpay.service.core.channel.wechat.dao.WeChatPayRecordManager; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConfig; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayRecord; 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.core.order.reconcile.entity.PayReconcileDetail; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import cn.hutool.core.date.DatePattern; import lombok.RequiredArgsConstructor; @@ -25,9 +22,6 @@ import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; import java.util.stream.Collectors; import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; @@ -100,64 +94,19 @@ public class WechatPayReconcileStrategy extends AbsReconcileStrategy { * 1. 远程有, 本地无 补单(追加回订单/记录差异表) * 2. 远程无, 本地有 记录差错表 * 3. 远程有, 本地有, 但状态不一致 记录差错表 - * - * @return */ - @Override - public List generateDiffRecord() { - List details = this.getReconcileDetails(); - if (CollUtil.isEmpty(details)){ - return; - } - Map detailMap = details.stream() - .collect(Collectors.toMap(PayReconcileDetail::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); - - // 对哪天进行对账 - LocalDate date = this.getRecordOrder().getDate(); + /** + * 获取通用对账对象, 将流水记录转换为对账对象 + */ + @Override + public List getGeneralReconcileRecord() { // 查询流水 - LocalDateTime localDateTime = LocalDateTimeUtil.date2DateTime(date); + LocalDateTime localDateTime = LocalDateTimeUtil.date2DateTime(this.getRecordOrder().getDate()); LocalDateTime start = LocalDateTimeUtil.beginOfDay(localDateTime); LocalDateTime end = LocalDateTimeUtil.endOfDay(localDateTime); List records = recordManager.findByDate(start, end); - Map recordMap = records.stream() - .collect(Collectors.toMap(WeChatPayRecord::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); - - // 对账与流水比对 - for (PayReconcileDetail detail : details) { - // 判断本地有没有记录 - WeChatPayRecord record = recordMap.get(Long.valueOf(detail.getOrderId())); - if (Objects.isNull(record)){ - log.info("本地订单不存在: {}", detail.getOrderId()); - continue; - } - // 交易类型 支付/退款 - if (Objects.equals(detail.getType(), PayReconcileTradeEnum.PAY.getCode())){ - // 判断类型是否存在差异 - if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.PAY.getCode())){ - log.info("本地订单类型不正常: {}", detail.getOrderId()); - continue; - } - } else { - // 判断类型是否存在差异 - if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.REFUND.getCode())){ - log.info("本地订单类型不正常: {}", detail.getOrderId()); - continue; - } - } - // 判断是否存在差异 金额, 状态 - if (!Objects.equals(record.getAmount(), detail.getAmount())){ - log.info("本地订单金额不正常: {}", detail.getOrderId()); - continue; - } - } - // 流水与对账单比对, 找出本地有, 远程没有的记录 - for (WeChatPayRecord record : records) { - PayReconcileDetail detail = detailMap.get(String.valueOf(record.getOrderId())); - if (Objects.isNull(detail)){ - log.info("远程订单不存在: {}", record.getOrderId()); - continue; - } - } + return records.stream().map(WeChatConvert.CONVERT::convertReconcileRecord).collect(Collectors.toList()); } + } 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 index 793f27fd..e9860f90 100644 --- 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 @@ -1,8 +1,8 @@ package cn.bootx.platform.daxpay.service.func; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; import lombok.Getter; import lombok.Setter; @@ -42,13 +42,8 @@ public abstract class AbsReconcileStrategy implements PayStrategy { public abstract void downAndSave(); /** - * 比对生成对账差异单 - * 1. 远程有, 本地无 补单(追加回订单/记录差异表) - * 2. 远程无, 本地有 记录差错表 - * 3. 远程有, 本地有, 但状态不一致 记录差错表 - * - * @return + * 获取通用对账对象, 将流水记录转换为对账对象 */ - public abstract List generateDiffRecord(); + public abstract List getGeneralReconcileRecord(); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDetailQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDetailQuery.java index 0f8c4473..d0cc44e1 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDetailQuery.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDetailQuery.java @@ -1,7 +1,7 @@ package cn.bootx.platform.daxpay.service.param.reconcile; import cn.bootx.platform.common.core.annotation.QueryParam; -import cn.bootx.platform.daxpay.code.PayReconcileTradeEnum; +import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; @@ -22,7 +22,7 @@ public class ReconcileDetailQuery { /** * 交易类型 - * @see PayReconcileTradeEnum + * @see ReconcileTradeEnum */ @Schema(description = "交易类型") private String type; -- Gitee From 738a1753de505b8ed9755c65cd47d378aab89ac8 Mon Sep 17 00:00:00 2001 From: bootx Date: Sun, 3 Mar 2024 23:20:24 +0800 Subject: [PATCH 06/10] =?UTF-8?q?feat=20=E5=AF=B9=E8=B4=A6=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../daxpay/demo/service/AggregateService.java | 1 - ...ler.java => ReconcileOrderController.java} | 42 ++-- .../common/context/ReconcileLocal.java | 4 +- .../service/AliPayReconcileService.java | 12 +- .../service/WechatPayReconcileService.java | 14 +- .../reconcile/conver/PayReconcileConvert.java | 22 --- .../reconcile/conver/ReconcileConvert.java | 26 +++ .../dao/PayReconcileDiffRecordManager.java | 18 -- ...nager.java => ReconcileDetailManager.java} | 14 +- ...Mapper.java => ReconcileDetailMapper.java} | 4 +- .../dao/ReconcileDiffRecordManager.java | 33 ++++ ...er.java => ReconcileDiffRecordMapper.java} | 4 +- ...anager.java => ReconcileOrderManager.java} | 10 +- ...rMapper.java => ReconcileOrderMapper.java} | 4 +- ...oncileDetail.java => ReconcileDetail.java} | 10 +- ...ffRecord.java => ReconcileDiffRecord.java} | 22 ++- ...econcileOrder.java => ReconcileOrder.java} | 10 +- .../PayReconcileDiffRecordService.java | 20 -- .../service/ReconcileDiffService.java | 49 +++++ ...ervice.java => ReconcileOrderService.java} | 12 +- ...ervice.java => ReconcileQueryService.java} | 30 +-- .../reconcile/domain/ReconcileDiff.java | 14 ++ ...ory.java => ReconcileStrategyFactory.java} | 2 +- ...cileService.java => ReconcileService.java} | 179 ++++++++++-------- .../strategy/AlipayReconcileStrategy.java | 1 - .../strategy/WechatPayReconcileStrategy.java | 1 - ...DetailDto.java => ReconcileDetailDto.java} | 2 +- .../reconcile/ReconcileDiffRecordDto.java | 19 ++ ...leOrderDto.java => ReconcileOrderDto.java} | 2 +- .../service/func/AbsReconcileStrategy.java | 8 +- .../param/reconcile/ReconcileDiffQuery.java | 19 ++ ...yReconcileTask.java => ReconcileTask.java} | 6 +- ...Service.java => ReconcileTaskService.java} | 10 +- 33 files changed, 388 insertions(+), 236 deletions(-) rename daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/{PayReconcileOrderController.java => ReconcileOrderController.java} (59%) delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/conver/PayReconcileConvert.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/conver/ReconcileConvert.java delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordManager.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/{PayReconcileDetailManager.java => ReconcileDetailManager.java} (63%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/{PayReconcileDetailMapper.java => ReconcileDetailMapper.java} (73%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDiffRecordManager.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/{PayReconcileDiffRecordMapper.java => ReconcileDiffRecordMapper.java} (72%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/{PayReconcileOrderManager.java => ReconcileOrderManager.java} (69%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/{PayReconcileOrderMapper.java => ReconcileOrderMapper.java} (73%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/{PayReconcileDetail.java => ReconcileDetail.java} (84%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/{PayReconcileDiffRecord.java => ReconcileDiffRecord.java} (64%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/{PayReconcileOrder.java => ReconcileOrder.java} (83%) delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileDiffRecordService.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileDiffService.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/{PayReconcileOrderService.java => ReconcileOrderService.java} (79%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/{PayReconcileQueryService.java => ReconcileQueryService.java} (62%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/factory/{PayReconcileStrategyFactory.java => ReconcileStrategyFactory.java} (96%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/{PayReconcileService.java => ReconcileService.java} (50%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/{PayReconcileDetailDto.java => ReconcileDetailDto.java} (95%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDiffRecordDto.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/{PayReconcileOrderDto.java => ReconcileOrderDto.java} (94%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDiffQuery.java rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/{PayReconcileTask.java => ReconcileTask.java} (85%) rename daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/{PayReconcileTaskService.java => ReconcileTaskService.java} (79%) diff --git a/daxpay-single-demo/src/main/java/cn/bootx/platform/daxpay/demo/service/AggregateService.java b/daxpay-single-demo/src/main/java/cn/bootx/platform/daxpay/demo/service/AggregateService.java index 18c96fb8..ed0c3c96 100644 --- a/daxpay-single-demo/src/main/java/cn/bootx/platform/daxpay/demo/service/AggregateService.java +++ b/daxpay-single-demo/src/main/java/cn/bootx/platform/daxpay/demo/service/AggregateService.java @@ -261,7 +261,6 @@ public class AggregateService { } } - /** * 获取微信OpenId */ diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayReconcileOrderController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/ReconcileOrderController.java similarity index 59% rename from daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayReconcileOrderController.java rename to daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/ReconcileOrderController.java index a581a859..dc1a04a7 100644 --- a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/PayReconcileOrderController.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/ReconcileOrderController.java @@ -5,11 +5,14 @@ import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.core.util.ValidationUtil; -import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileQueryService; -import cn.bootx.platform.daxpay.service.core.payment.reconcile.service.PayReconcileService; -import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileDetailDto; -import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileOrderDto; +import cn.bootx.platform.daxpay.service.core.order.reconcile.service.ReconcileDiffService; +import cn.bootx.platform.daxpay.service.core.order.reconcile.service.ReconcileQueryService; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.service.ReconcileService; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDetailDto; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDiffRecordDto; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileOrderDto; import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileDetailQuery; +import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileDiffQuery; import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileOrderCreate; import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileOrderQuery; import io.swagger.v3.oas.annotations.Operation; @@ -26,9 +29,10 @@ import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/order/reconcile") @RequiredArgsConstructor -public class PayReconcileOrderController { - private final PayReconcileService reconcileService; - private final PayReconcileQueryService reconcileQueryService; +public class ReconcileOrderController { + private final ReconcileService reconcileService; + private final ReconcileQueryService reconcileQueryService; + private final ReconcileDiffService reconcileDiffService; @Operation(summary = "手动创建支付对账订单") @PostMapping("/create") @@ -54,25 +58,37 @@ public class PayReconcileOrderController { @Operation(summary = "订单分页") @GetMapping("/page") - public ResResult> page(PageParam pageParam, ReconcileOrderQuery query){ + public ResResult> page(PageParam pageParam, ReconcileOrderQuery query){ return Res.ok(reconcileQueryService.page(pageParam, query)); } @Operation(summary = "订单详情") @GetMapping("/findById") - public ResResult findById(Long id){ + public ResResult findById(Long id){ return Res.ok(reconcileQueryService.findById(id)); } @Operation(summary = "对账明细分页") - @GetMapping("/pageDetail") - public ResResult> pageDetail(PageParam pageParam, ReconcileDetailQuery query){ + @GetMapping("/detail/page") + public ResResult> pageDetail(PageParam pageParam, ReconcileDetailQuery query){ return Res.ok(reconcileQueryService.pageDetail(pageParam, query)); } @Operation(summary = "对账明细详情") - @GetMapping("/findDetailById") - public ResResult findDetailById(Long id){ + @GetMapping("/detail/findById") + public ResResult findDetailById(Long id){ return Res.ok(reconcileQueryService.findDetailById(id)); } + + @Operation(summary = "对账差异分页") + @GetMapping("/diff/page") + public ResResult> pageDiff(PageParam pageParam, ReconcileDiffQuery query){ + return Res.ok(reconcileDiffService.page(pageParam, query)); + } + + @Operation(summary = "对账差异详情") + @GetMapping("/diff/findById") + public ResResult findDiffById(Long id){ + return Res.ok(reconcileDiffService.findById(id)); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ReconcileLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ReconcileLocal.java index f1d73d6d..31afc8a5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ReconcileLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/ReconcileLocal.java @@ -1,6 +1,6 @@ package cn.bootx.platform.daxpay.service.common.context; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail; import lombok.Data; import lombok.experimental.Accessors; @@ -16,6 +16,6 @@ import java.util.List; public class ReconcileLocal { /** 通用支付对账记录 */ - private List reconcileDetails; + private List reconcileDetails; } 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 index 8b74a290..14cb144a 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 @@ -10,7 +10,7 @@ import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliReconcileBill import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; 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.order.reconcile.entity.PayReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail; import cn.hutool.core.io.IoUtil; import cn.hutool.core.text.csv.CsvReader; import cn.hutool.core.text.csv.CsvUtil; @@ -122,7 +122,7 @@ public class AliPayReconcileService { * 转换为通用对账记录对象 */ private void convertAndSave(List billDetails){ - List collect = billDetails.stream() + List collect = billDetails.stream() .map(this::convert) .collect(Collectors.toList()); // 写入到上下文中 @@ -132,14 +132,14 @@ public class AliPayReconcileService { /** * 转换为通用对账记录对象 */ - private PayReconcileDetail convert(AliReconcileBillDetail billDetail){ + private ReconcileDetail convert(AliReconcileBillDetail billDetail){ // 金额 String orderAmount = billDetail.getOrderAmount(); double v = Double.parseDouble(orderAmount) * 100; int amount = Math.abs(((int) v)); // 默认为支付对账记录 - PayReconcileDetail payReconcileDetail = new PayReconcileDetail() + ReconcileDetail reconcileDetail = new ReconcileDetail() .setRecordOrderId(billDetail.getRecordOrderId()) .setOrderId(billDetail.getOutTradeNo()) .setType(ReconcileTradeEnum.PAY.getCode()) @@ -148,11 +148,11 @@ public class AliPayReconcileService { .setGatewayOrderNo(billDetail.getTradeNo()); // 退款覆盖更新对应的字段 if (Objects.equals(billDetail.getTradeType(), "退款")){ - payReconcileDetail.setOrderId(billDetail.getBatchNo()) + reconcileDetail.setOrderId(billDetail.getBatchNo()) .setType(ReconcileTradeEnum.REFUND.getCode()); } - return payReconcileDetail; + return reconcileDetail; } 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 7aa36a27..2bf27592 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 @@ -11,7 +11,7 @@ import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConf 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.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail; import cn.hutool.core.codec.Base64; import cn.hutool.core.text.csv.CsvReader; import cn.hutool.core.text.csv.CsvUtil; @@ -107,7 +107,7 @@ public class WechatPayReconcileService{ * 转换为通用对账记录对象 */ public void convertAndSave(List billDetails){ - List collect = billDetails.stream() + List collect = billDetails.stream() .map(this::convert) .collect(Collectors.toList()); // 写入到上下文中 @@ -117,9 +117,9 @@ public class WechatPayReconcileService{ /** * 转换为通用对账记录对象 */ - public PayReconcileDetail convert(WxReconcileBillDetail billDetail){ + public ReconcileDetail convert(WxReconcileBillDetail billDetail){ // 默认为支付对账记录 - PayReconcileDetail payReconcileDetail = new PayReconcileDetail() + ReconcileDetail reconcileDetail = new ReconcileDetail() .setRecordOrderId(billDetail.getRecordOrderId()) .setOrderId(billDetail.getMchOrderNo()) .setTitle(billDetail.getSubject()) @@ -130,7 +130,7 @@ public class WechatPayReconcileService{ String orderAmount = billDetail.getOrderAmount(); double v = Double.parseDouble(orderAmount) * 100; int amount = Math.abs(((int) v)); - payReconcileDetail.setType(ReconcileTradeEnum.PAY.getCode()) + reconcileDetail.setType(ReconcileTradeEnum.PAY.getCode()) .setAmount(amount); } // 退款 @@ -139,7 +139,7 @@ public class WechatPayReconcileService{ String refundAmount = billDetail.getApplyRefundAmount(); double v = Double.parseDouble(refundAmount) * 100; int amount = Math.abs(((int) v)); - payReconcileDetail.setType(ReconcileTradeEnum.REFUND.getCode()) + reconcileDetail.setType(ReconcileTradeEnum.REFUND.getCode()) .setAmount(amount) .setOrderId(billDetail.getMchRefundNo()); } @@ -147,7 +147,7 @@ public class WechatPayReconcileService{ if (Objects.equals(billDetail.getStatus(), "REVOKED")){ log.warn("对账出现已撤销记录, 后续进行处理"); } - return payReconcileDetail; + return reconcileDetail; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/conver/PayReconcileConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/conver/PayReconcileConvert.java deleted file mode 100644 index 2eee966e..00000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/conver/PayReconcileConvert.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.bootx.platform.daxpay.service.core.order.reconcile.conver; - -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; -import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileDetailDto; -import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileOrderDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2024/1/22 - */ -@Mapper -public interface PayReconcileConvert { - PayReconcileConvert CONVERT = Mappers.getMapper(PayReconcileConvert.class); - - PayReconcileDetailDto convert(PayReconcileDetail in); - - PayReconcileOrderDto convert(PayReconcileOrder in); -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/conver/ReconcileConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/conver/ReconcileConvert.java new file mode 100644 index 00000000..bfe5a0ef --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/conver/ReconcileConvert.java @@ -0,0 +1,26 @@ +package cn.bootx.platform.daxpay.service.core.order.reconcile.conver; + +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDiffRecord; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrder; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDetailDto; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDiffRecordDto; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileOrderDto; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2024/1/22 + */ +@Mapper +public interface ReconcileConvert { + ReconcileConvert CONVERT = Mappers.getMapper(ReconcileConvert.class); + + ReconcileDetailDto convert(ReconcileDetail in); + + ReconcileDiffRecordDto convert(ReconcileDiffRecord in); + + ReconcileOrderDto convert(ReconcileOrder in); +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordManager.java deleted file mode 100644 index 4277e7c1..00000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordManager.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.service.core.order.reconcile.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -/** - * - * @author xxm - * @since 2024/2/28 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class PayReconcileDiffRecordManager extends BaseManager { -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDetailManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDetailManager.java similarity index 63% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDetailManager.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDetailManager.java index 243bec26..d440c860 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDetailManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDetailManager.java @@ -4,7 +4,7 @@ import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.common.query.generator.QueryGenerator; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail; import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileDetailQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -22,22 +22,22 @@ import java.util.List; @Slf4j @Repository @RequiredArgsConstructor -public class PayReconcileDetailManager extends BaseManager { +public class ReconcileDetailManager extends BaseManager { /** * 根据订单id查询 */ - public List findAllByOrderId(Long orderId){ - return this.findAllByField(PayReconcileDetail::getRecordOrderId, orderId); + public List findAllByOrderId(Long orderId){ + return this.findAllByField(ReconcileDetail::getRecordOrderId, orderId); } /** * 分页 */ - public Page page(PageParam pageParam, ReconcileDetailQuery query){ - Page mpPage = MpUtil.getMpPage(pageParam, PayReconcileDetail.class); - QueryWrapper generator = QueryGenerator.generator(query); + public Page page(PageParam pageParam, ReconcileDetailQuery query){ + Page mpPage = MpUtil.getMpPage(pageParam, ReconcileDetail.class); + QueryWrapper generator = QueryGenerator.generator(query); return this.page(mpPage,generator); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDetailMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDetailMapper.java similarity index 73% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDetailMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDetailMapper.java index fa86df1d..5b4860ce 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDetailMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDetailMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.dao; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -10,5 +10,5 @@ import org.apache.ibatis.annotations.Mapper; * @since 2024/1/20 */ @Mapper -public interface PayReconcileDetailMapper extends BaseMapper { +public interface ReconcileDetailMapper extends BaseMapper { } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDiffRecordManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDiffRecordManager.java new file mode 100644 index 00000000..972e6f11 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDiffRecordManager.java @@ -0,0 +1,33 @@ +package cn.bootx.platform.daxpay.service.core.order.reconcile.dao; + +import cn.bootx.platform.common.core.rest.param.PageParam; +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.common.query.generator.QueryGenerator; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDiffRecord; +import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileDiffQuery; +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/2/28 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class ReconcileDiffRecordManager extends BaseManager { + + /** + * 分页 + */ + public Page page(PageParam pageParam, ReconcileDiffQuery query){ + Page mpPage = MpUtil.getMpPage(pageParam, ReconcileDiffRecord.class); + QueryWrapper generator = QueryGenerator.generator(query); + return this.page(mpPage,generator); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDiffRecordMapper.java similarity index 72% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDiffRecordMapper.java index 1fec857d..6a86148d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileDiffRecordMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileDiffRecordMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.dao; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDiffRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -10,5 +10,5 @@ import org.apache.ibatis.annotations.Mapper; * @since 2024/2/28 */ @Mapper -public interface PayReconcileDiffRecordMapper extends BaseMapper { +public interface ReconcileDiffRecordMapper extends BaseMapper { } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileOrderManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileOrderManager.java similarity index 69% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileOrderManager.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileOrderManager.java index 958a74b8..0e8acfc5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileOrderManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileOrderManager.java @@ -4,7 +4,7 @@ import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.common.query.generator.QueryGenerator; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrder; import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileOrderQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -20,14 +20,14 @@ import org.springframework.stereotype.Repository; @Slf4j @Repository @RequiredArgsConstructor -public class PayReconcileOrderManager extends BaseManager { +public class ReconcileOrderManager extends BaseManager { /** * 分页 */ - public Page page(PageParam pageParam, ReconcileOrderQuery query){ - Page mpPage = MpUtil.getMpPage(pageParam, PayReconcileOrder.class); - QueryWrapper generator = QueryGenerator.generator(query); + public Page page(PageParam pageParam, ReconcileOrderQuery query){ + Page mpPage = MpUtil.getMpPage(pageParam, ReconcileOrder.class); + QueryWrapper generator = QueryGenerator.generator(query); return this.page(mpPage,generator); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileOrderMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileOrderMapper.java similarity index 73% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileOrderMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileOrderMapper.java index 041e4506..51222b3c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/PayReconcileOrderMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/dao/ReconcileOrderMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.dao; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -10,5 +10,5 @@ import org.apache.ibatis.annotations.Mapper; * @since 2024/1/18 */ @Mapper -public interface PayReconcileOrderMapper extends BaseMapper { +public interface ReconcileOrderMapper extends BaseMapper { } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDetail.java similarity index 84% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDetail.java index b0d32226..bf30cb57 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDetail.java @@ -3,8 +3,8 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; -import cn.bootx.platform.daxpay.service.core.order.reconcile.conver.PayReconcileConvert; -import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileDetailDto; +import cn.bootx.platform.daxpay.service.core.order.reconcile.conver.ReconcileConvert; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDetailDto; import cn.bootx.table.modify.annotation.DbColumn; import cn.bootx.table.modify.annotation.DbTable; import com.baomidou.mybatisplus.annotation.TableName; @@ -24,7 +24,7 @@ import java.time.LocalDateTime; @Accessors(chain = true) @DbTable(comment = "支付对账记录") @TableName("pay_reconcile_detail") -public class PayReconcileDetail extends MpCreateEntity implements EntityBaseFunction { +public class ReconcileDetail extends MpCreateEntity implements EntityBaseFunction { /** 关联对账订单ID */ @DbColumn(comment = "关联对账订单ID") @@ -67,7 +67,7 @@ public class PayReconcileDetail extends MpCreateEntity implements EntityBaseFunc @Override - public PayReconcileDetailDto toDto() { - return PayReconcileConvert.CONVERT.convert(this); + public ReconcileDetailDto toDto() { + return ReconcileConvert.CONVERT.convert(this); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDiffRecord.java similarity index 64% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDiffRecord.java index ef1216b0..c47a8d9f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileDiffRecord.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDiffRecord.java @@ -1,7 +1,12 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.entity; +import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; +import cn.bootx.platform.daxpay.service.code.ReconcileDiffTypeEnum; +import cn.bootx.platform.daxpay.service.core.order.reconcile.conver.ReconcileConvert; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDiffRecordDto; import cn.bootx.table.modify.annotation.DbColumn; import cn.bootx.table.modify.annotation.DbTable; import com.baomidou.mybatisplus.annotation.TableName; @@ -21,7 +26,7 @@ import java.time.LocalDateTime; @Accessors(chain = true) @DbTable(comment = "对账差异单") @TableName("pay_reconcile_diff_record") -public class PayReconcileDiffRecord extends MpBaseEntity { +public class ReconcileDiffRecord extends MpBaseEntity implements EntityBaseFunction { /** 对账单ID */ @DbColumn(comment = "对账单ID") @@ -48,11 +53,19 @@ public class PayReconcileDiffRecord extends MpBaseEntity { /** * 差异类型 - * + * @see ReconcileDiffTypeEnum */ @DbColumn(comment = "差异类型") private String diffType; + /** + * 差异内容, 存储json字符串, 格式为 + * {属性: '标题', 本地字段值:'标题1', 网关字段值: '标题2'} + * @see ReconcileDiff + */ + @DbColumn(comment = "差异内容") + private String diffContent; + /** 网关订单号 */ @DbColumn(comment = "网关订单号") private String gatewayOrderNo; @@ -64,4 +77,9 @@ public class PayReconcileDiffRecord extends MpBaseEntity { /** 订单时间 */ @DbColumn(comment = "订单时间") private LocalDateTime orderTime; + + @Override + public ReconcileDiffRecordDto toDto() { + return ReconcileConvert.CONVERT.convert(this); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileOrder.java similarity index 83% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileOrder.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileOrder.java index 33aa0616..8de3a057 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/PayReconcileOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileOrder.java @@ -2,8 +2,8 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; -import cn.bootx.platform.daxpay.service.core.order.reconcile.conver.PayReconcileConvert; -import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileOrderDto; +import cn.bootx.platform.daxpay.service.core.order.reconcile.conver.ReconcileConvert; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileOrderDto; import cn.bootx.table.modify.annotation.DbColumn; import cn.bootx.table.modify.annotation.DbTable; import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; @@ -24,7 +24,7 @@ import java.time.LocalDate; @Accessors(chain = true) @DbTable(comment = "支付对账单订单") @TableName("pay_reconcile_order") -public class PayReconcileOrder extends MpCreateEntity implements EntityBaseFunction { +public class ReconcileOrder extends MpCreateEntity implements EntityBaseFunction { /** * 批次号 @@ -56,7 +56,7 @@ public class PayReconcileOrder extends MpCreateEntity implements EntityBaseFunct private String errorMsg; @Override - public PayReconcileOrderDto toDto() { - return PayReconcileConvert.CONVERT.convert(this); + public ReconcileOrderDto toDto() { + return ReconcileConvert.CONVERT.convert(this); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileDiffRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileDiffRecordService.java deleted file mode 100644 index 5cf6131c..00000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileDiffRecordService.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.bootx.platform.daxpay.service.core.order.reconcile.service; - -import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileDiffRecordManager; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * - * @author xxm - * @since 2024/2/29 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayReconcileDiffRecordService { - private final PayReconcileDiffRecordManager recordManager; - - -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileDiffService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileDiffService.java new file mode 100644 index 00000000..ff1a96f9 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileDiffService.java @@ -0,0 +1,49 @@ +package cn.bootx.platform.daxpay.service.core.order.reconcile.service; + +import cn.bootx.platform.common.core.exception.DataNotExistException; +import cn.bootx.platform.common.core.rest.PageResult; +import cn.bootx.platform.common.core.rest.param.PageParam; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileDiffRecordManager; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDiffRecord; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDiffRecordDto; +import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileDiffQuery; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 对账差异单服务 + * @author xxm + * @since 2024/2/29 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ReconcileDiffService { + private final ReconcileDiffRecordManager recordManager; + + + /** + * 批量保存 + */ + public void saveAll(List diffRecords) { + recordManager.saveAll(diffRecords); + } + + /** + * 分页查询 + */ + public PageResult page(PageParam pageParam, ReconcileDiffQuery query) { + return MpUtil.convert2DtoPageResult(recordManager.page(pageParam, query)); + } + + /** + * 详情查询 + */ + public ReconcileDiffRecordDto findById(Long id) { + return recordManager.findById(id).map(ReconcileDiffRecord::toDto).orElseThrow(() -> new DataNotExistException("不存在的对账差异单")); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileOrderService.java similarity index 79% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileOrderService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileOrderService.java index 915f789c..c4b02d31 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileOrderService.java @@ -1,8 +1,8 @@ package cn.bootx.platform.daxpay.service.core.order.reconcile.service; import cn.bootx.platform.common.sequence.func.Sequence; -import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileOrderManager; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; +import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileOrderManager; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -19,22 +19,22 @@ import java.util.Optional; @Slf4j @Service @RequiredArgsConstructor -public class PayReconcileOrderService { - private final PayReconcileOrderManager reconcileOrderManager; +public class ReconcileOrderService { + private final ReconcileOrderManager reconcileOrderManager; private final Sequence sequence; /** * 更新, 开启一个新事务进行更新 */ @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) - public void update(PayReconcileOrder order){ + public void update(ReconcileOrder order){ reconcileOrderManager.updateById(order); } /** * 根据Id查询 */ - public Optional findById(Long id){ + public Optional findById(Long id){ return reconcileOrderManager.findById(id); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileQueryService.java similarity index 62% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileQueryService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileQueryService.java index e74f51f3..d435dcce 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/PayReconcileQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/service/ReconcileQueryService.java @@ -4,12 +4,12 @@ import cn.bootx.platform.common.core.exception.DataNotExistException; import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileDetailManager; -import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileOrderManager; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; -import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileDetailDto; -import cn.bootx.platform.daxpay.service.dto.order.reconcile.PayReconcileOrderDto; +import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileDetailManager; +import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileOrderManager; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrder; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDetailDto; +import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileOrderDto; import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileDetailQuery; import cn.bootx.platform.daxpay.service.param.reconcile.ReconcileOrderQuery; import lombok.RequiredArgsConstructor; @@ -24,37 +24,37 @@ import org.springframework.stereotype.Service; @Slf4j @Service @RequiredArgsConstructor -public class PayReconcileQueryService { - private final PayReconcileOrderManager orderManager; - private final PayReconcileDetailManager detailManager; +public class ReconcileQueryService { + private final ReconcileOrderManager orderManager; + private final ReconcileDetailManager detailManager; /** * 分页 */ - public PageResult page(PageParam pageParam, ReconcileOrderQuery query){ + public PageResult page(PageParam pageParam, ReconcileOrderQuery query){ return MpUtil.convert2DtoPageResult(orderManager.page(pageParam, query)); } /** * 对账订单 */ - public PayReconcileOrderDto findById(Long id){ - return orderManager.findById(id).map(PayReconcileOrder::toDto) + public ReconcileOrderDto findById(Long id){ + return orderManager.findById(id).map(ReconcileOrder::toDto) .orElseThrow(()->new DataNotExistException("对账订单不存在")); } /** * 明细分页 */ - public PageResult pageDetail(PageParam pageParam, ReconcileDetailQuery query){ + public PageResult pageDetail(PageParam pageParam, ReconcileDetailQuery query){ return MpUtil.convert2DtoPageResult(detailManager.page(pageParam, query)); } /** * 明细详情 */ - public PayReconcileDetailDto findDetailById(Long id){ - return detailManager.findById(id).map(PayReconcileDetail::toDto) + public ReconcileDetailDto findDetailById(Long id){ + return detailManager.findById(id).map(ReconcileDetail::toDto) .orElseThrow(()->new DataNotExistException("对账详情不存在")); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/ReconcileDiff.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/ReconcileDiff.java index 2d85a6dc..1dbeda55 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/ReconcileDiff.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/domain/ReconcileDiff.java @@ -1,9 +1,23 @@ package cn.bootx.platform.daxpay.service.core.payment.reconcile.domain; +import lombok.Data; +import lombok.experimental.Accessors; + /** * 对账差异内容 * @author xxm * @since 2024/3/1 */ +@Data +@Accessors(chain = true) public class ReconcileDiff { + + /** 字段名 */ + private String fieldName; + + /** 本地订单字段值 */ + private String localValue; + + /** 网关订单字段值 */ + private String gatewayValue; } 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/ReconcileStrategyFactory.java similarity index 96% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/factory/PayReconcileStrategyFactory.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/factory/ReconcileStrategyFactory.java index d4e839c4..c9479b42 100644 --- 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/ReconcileStrategyFactory.java @@ -17,7 +17,7 @@ import java.util.Objects; * @since 2024/1/18 */ @UtilityClass -public class PayReconcileStrategyFactory { +public class ReconcileStrategyFactory { /** * 根据传入的支付类型批量创建策略 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/ReconcileService.java similarity index 50% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/PayReconcileService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/ReconcileService.java index c9401f6e..0ad52f3b 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/ReconcileService.java @@ -9,15 +9,16 @@ import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.code.AliPayRecordTypeEnum; import cn.bootx.platform.daxpay.service.code.ReconcileDiffTypeEnum; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; -import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileDetailManager; -import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.PayReconcileOrderManager; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDiffRecord; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; -import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileDiffRecordService; -import cn.bootx.platform.daxpay.service.core.order.reconcile.service.PayReconcileOrderService; +import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileDetailManager; +import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileOrderManager; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDiffRecord; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrder; +import cn.bootx.platform.daxpay.service.core.order.reconcile.service.ReconcileDiffService; +import cn.bootx.platform.daxpay.service.core.order.reconcile.service.ReconcileOrderService; import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; -import cn.bootx.platform.daxpay.service.core.payment.reconcile.factory.PayReconcileStrategyFactory; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.factory.ReconcileStrategyFactory; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -34,26 +35,26 @@ import java.util.function.Function; import java.util.stream.Collectors; /** - * 支付对账单下载服务 + * 对账服务 * @author xxm * @since 2024/1/17 */ @Slf4j @Service @RequiredArgsConstructor -public class PayReconcileService { - private final PayReconcileOrderService reconcileOrderService; +public class ReconcileService { + private final ReconcileOrderService reconcileOrderService; - private final PayReconcileDiffRecordService reconcileDiffRecordService; + private final ReconcileDiffService reconcileDiffService; - private final PayReconcileOrderManager reconcileOrderManager; - private final PayReconcileDetailManager reconcileDetailManager; + private final ReconcileOrderManager reconcileOrderManager; + private final ReconcileDetailManager reconcileDetailManager; /** * 创建对账订单 */ @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) - public PayReconcileOrder create(LocalDate date, String channel) { + public ReconcileOrder create(LocalDate date, String channel) { // 获取通道枚举 PayChannelEnum channelEnum = PayChannelEnum.findByCode(channel); @@ -62,12 +63,12 @@ public class PayReconcileService { throw new PayFailureException("不支持对账的通道, 请检查"); } // 构建对账策略 - AbsReconcileStrategy reconcileStrategy = PayReconcileStrategyFactory.create(channel); + AbsReconcileStrategy reconcileStrategy = ReconcileStrategyFactory.create(channel); // 生成批次号 String seqNo = reconcileStrategy.generateSequence(date); - PayReconcileOrder order = new PayReconcileOrder() + ReconcileOrder order = new ReconcileOrder() .setBatchNo(seqNo) .setChannel(channel) .setDate(date); @@ -79,17 +80,17 @@ public class PayReconcileService { * 下载对账单并进行保存 */ public void downAndSave(Long reconcileOrderId) { - PayReconcileOrder payReconcileOrder = reconcileOrderService.findById(reconcileOrderId) + ReconcileOrder reconcileOrder = reconcileOrderService.findById(reconcileOrderId) .orElseThrow(() -> new DataNotExistException("未找到对账订单")); - this.downAndSave(payReconcileOrder); + this.downAndSave(reconcileOrder); } /** * 下载对账单并进行保存 */ - public void downAndSave(PayReconcileOrder reconcileOrder) { + public void downAndSave(ReconcileOrder reconcileOrder) { // 构建对账策略 - AbsReconcileStrategy reconcileStrategy = PayReconcileStrategyFactory.create(reconcileOrder.getChannel()); + AbsReconcileStrategy reconcileStrategy = ReconcileStrategyFactory.create(reconcileOrder.getChannel()); reconcileStrategy.setRecordOrder(reconcileOrder); reconcileStrategy.doBeforeHandler(); try { @@ -103,7 +104,7 @@ public class PayReconcileService { throw new RuntimeException(e); } // 保存转换后的通用结构对账单 - List reconcileDetails = PaymentContextLocal.get() + List reconcileDetails = PaymentContextLocal.get() .getReconcileInfo() .getReconcileDetails(); reconcileDetailManager.saveAll(reconcileDetails); @@ -113,22 +114,22 @@ public class PayReconcileService { * 对账单比对 */ public void compare(Long reconcileOrderId){ - PayReconcileOrder payReconcileOrder = reconcileOrderService.findById(reconcileOrderId) + ReconcileOrder reconcileOrder = reconcileOrderService.findById(reconcileOrderId) .orElseThrow(() -> new DataNotExistException("未找到对账订单")); - this.compare(payReconcileOrder); + this.compare(reconcileOrder); } /** * 对账单比对 */ - public void compare(PayReconcileOrder reconcileOrder){ + public void compare(ReconcileOrder reconcileOrder){ // 判断是否已经下载了对账单明细 if (!reconcileOrder.isDown()){ throw new PayFailureException("请先下载对账单"); } // 查询对账单 - List reconcileDetails = reconcileDetailManager.findAllByOrderId(reconcileOrder.getId()); + List reconcileDetails = reconcileDetailManager.findAllByOrderId(reconcileOrder.getId()); // 获取通道枚举 if (!PayChannelEnum.ASYNC_TYPE_CODE.contains(reconcileOrder.getChannel())){ log.error("不支持对账的通道, 请检查, 对账订单ID: {}", reconcileOrder.getId()); @@ -136,16 +137,17 @@ public class PayReconcileService { } // 判断是否为为异步通道 // 构建对账策略 - AbsReconcileStrategy reconcileStrategy = PayReconcileStrategyFactory.create(reconcileOrder.getChannel()); + AbsReconcileStrategy reconcileStrategy = ReconcileStrategyFactory.create(reconcileOrder.getChannel()); // 初始化参数 reconcileStrategy.setRecordOrder(reconcileOrder); reconcileStrategy.setReconcileDetails(reconcileDetails); try { - // 执行比对任务, 获取对账差异记录 + // 执行比对任务, 获取对账差异记录并保存 List generalReconcileRecord = reconcileStrategy.getGeneralReconcileRecord(); - List diffRecords = this.generateDiffRecord(generalReconcileRecord,reconcileDetails); -// reconcileOrder.setCompare(true); -// reconcileOrderService.update(reconcileOrder); + List diffRecords = this.generateDiffRecord(reconcileOrder,generalReconcileRecord,reconcileDetails); + reconcileOrder.setCompare(true); + reconcileOrderService.update(reconcileOrder); + reconcileDiffService.saveAll(diffRecords); } catch (Exception e) { log.error("比对对账单异常", e); reconcileOrder.setErrorMsg("原因: " + e.getMessage()); @@ -156,77 +158,74 @@ public class PayReconcileService { /** * 比对生成对账差异单 - * 1. 远程有, 本地无 补单(追加回订单/记录差异表) - * 2. 远程无, 本地有 记录差错表 - * 3. 远程有, 本地有, 但状态不一致 记录差错表 + * 1. 远程有, 本地无 + * 2. 远程无, 本地有 + * 3. 远程有, 本地有, 但状态不一致 * */ - private List generateDiffRecord(List records, List details){ - if (CollUtil.isEmpty(details)){ + private List generateDiffRecord(ReconcileOrder reconcileOrder, List gatewayRecords, List localDetails){ + if (CollUtil.isEmpty(localDetails)){ return new ArrayList<>(); } - Map detailMap = details.stream() - .collect(Collectors.toMap(PayReconcileDetail::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); - - List diffRecords = new ArrayList<>(); + Map detailMap = localDetails.stream() + .collect(Collectors.toMap(ReconcileDetail::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); - Map recordMap = records.stream() + // 差异内容 + List diffRecords = new ArrayList<>(); + Map recordMap = gatewayRecords.stream() .collect(Collectors.toMap(GeneralReconcileRecord::getOrderId, Function.identity(), CollectorsFunction::retainLatest)); - // 对账与流水比对 - for (PayReconcileDetail detail : details) { + for (ReconcileDetail detail : localDetails) { // 判断本地流水有没有记录, 流水没有记录查询本地订单 GeneralReconcileRecord record = recordMap.get(Long.valueOf(detail.getOrderId())); if (Objects.isNull(record)){ log.info("本地订单不存在: {}", detail.getOrderId()); - PayReconcileDiffRecord diffRecord = new PayReconcileDiffRecord() + ReconcileDiffRecord diffRecord = new ReconcileDiffRecord() .setDiffType(ReconcileDiffTypeEnum.LOCAL_NOT_EXISTS.getCode()) .setOrderId(Long.valueOf(detail.getOrderId())) .setDetailId(detail.getId()) - .setRecordId(detail.getRecordOrderId()) + .setRecordId(reconcileOrder.getId()) .setTitle(detail.getTitle()) - .setDiffType(detail.getType()) + .setOrderType(detail.getType()) .setGatewayOrderNo(detail.getGatewayOrderNo()) .setAmount(detail.getAmount()) .setOrderTime(detail.getOrderTime()); diffRecords.add(diffRecord); continue; } - // 交易类型 支付/退款 - if (Objects.equals(detail.getType(), ReconcileTradeEnum.PAY.getCode())){ - // 判断类型是否存在差异 - if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.PAY.getCode())){ - PayReconcileDiffRecord diffRecord = new PayReconcileDiffRecord() - .setDiffType(ReconcileDiffTypeEnum.NOT_MATCH.getCode()) - .setOrderId(Long.valueOf(detail.getOrderId())) - .setDetailId(detail.getId()) - .setRecordId(detail.getRecordOrderId()) - .setTitle(detail.getTitle()) - .setDiffType(detail.getType()) - .setGatewayOrderNo(detail.getGatewayOrderNo()) - .setAmount(detail.getAmount()) - .setOrderTime(detail.getOrderTime()); - diffRecords.add(diffRecord); - continue; - } - } else { - // 判断类型是否存在差异 - if (!Objects.equals(record.getType(), AliPayRecordTypeEnum.REFUND.getCode())) { - log.info("本地订单类型不正常: {}", detail.getOrderId()); - continue; - } - } - // 判断是否存在差异 金额, 状态 - if (!Objects.equals(record.getAmount(), detail.getAmount())){ - log.info("本地订单金额不正常: {}", detail.getOrderId()); - continue; + // 如果远程和本地都存在, 比对差异 + List reconcileDiffs = this.reconcileDiff(detail, record); + if (CollUtil.isNotEmpty(reconcileDiffs)) { + ReconcileDiffRecord diffRecord = new ReconcileDiffRecord() + .setDiffType(ReconcileDiffTypeEnum.NOT_MATCH.getCode()) + .setOrderId(Long.valueOf(detail.getOrderId())) + .setDetailId(detail.getId()) + .setRecordId(reconcileOrder.getId()) + .setTitle(detail.getTitle()) + .setOrderType(detail.getType()) + .setGatewayOrderNo(detail.getGatewayOrderNo()) + .setAmount(detail.getAmount()) + .setOrderTime(detail.getOrderTime()); + diffRecords.add(diffRecord); } } // 流水与对账单比对, 找出本地有, 远程没有的记录 - for (GeneralReconcileRecord record : records) { - PayReconcileDetail detail = detailMap.get(String.valueOf(record.getOrderId())); + for (GeneralReconcileRecord gateway : gatewayRecords) { + ReconcileDetail detail = detailMap.get(String.valueOf(gateway.getOrderId())); if (Objects.isNull(detail)){ - log.info("远程订单不存在: {}", record.getOrderId()); + ReconcileDiffRecord diffRecord = new ReconcileDiffRecord() + .setDiffType(ReconcileDiffTypeEnum.LOCAL_NOT_EXISTS.getCode()) + .setOrderId(gateway.getOrderId()) + .setRecordId(reconcileOrder.getId()) + .setDetailId(null) + .setTitle(gateway.getTitle()) + .setDiffType(gateway.getType()) + .setOrderType(gateway.getType()) + .setGatewayOrderNo(gateway.getGatewayOrderNo()) + .setAmount(gateway.getAmount()) + .setOrderTime(gateway.getGatewayTime()); + diffRecords.add(diffRecord); + log.info("远程订单不存在: {}", gateway.getOrderId()); continue; } } @@ -234,9 +233,31 @@ public class PayReconcileService { } /** - * 判断订单之间是否存在差异 + * 判断订单之间存在哪些差异 */ - public void reconcileDiff(GeneralReconcileRecord record, PayReconcileDetail detail){ + public List reconcileDiff(ReconcileDetail detail, GeneralReconcileRecord record){ + List diffs = new ArrayList<>(); + // 判断类型是否相同 + if (!(Objects.equals(detail.getType(), ReconcileTradeEnum.PAY.getCode()) + && Objects.equals(record.getType(), AliPayRecordTypeEnum.PAY.getCode()))){ + log.warn("订单类型不一致: {},{}", detail.getType(), record.getType()); + diffs.add(new ReconcileDiff().setFieldName("订单类型").setLocalValue(detail.getType()).setGatewayValue(record.getType())); + } + + // 判断名称是否一致 + if (!Objects.equals(detail.getTitle(), record.getTitle())){ + log.warn("订单名称不一致: {},{}", detail.getTitle(), record.getTitle()); + diffs.add(new ReconcileDiff().setFieldName("订单名称").setLocalValue(detail.getTitle()).setGatewayValue(record.getTitle())); + } + + // 判断金额是否一致 + if (!Objects.equals(detail.getAmount(), record.getAmount())){ + log.warn("订单金额不一致: {},{}", detail.getAmount(), record.getAmount()); + diffs.add(new ReconcileDiff().setFieldName("订单金额") + .setLocalValue(String.valueOf(detail.getAmount())) + .setGatewayValue(String.valueOf(record.getAmount()))); + } + return diffs; } } 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 b2bfb315..59755524 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 @@ -9,7 +9,6 @@ import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayRecord; 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.core.order.reconcile.entity.PayReconcileDiffRecord; import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import cn.hutool.core.date.DatePattern; 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 b973208a..85bf0415 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 @@ -9,7 +9,6 @@ import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConf import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayRecord; 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.core.order.reconcile.entity.PayReconcileDiffRecord; import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; import cn.bootx.platform.daxpay.service.func.AbsReconcileStrategy; import cn.hutool.core.date.DatePattern; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/PayReconcileDetailDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDetailDto.java similarity index 95% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/PayReconcileDetailDto.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDetailDto.java index 4a577e13..dbdff4cd 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/PayReconcileDetailDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDetailDto.java @@ -15,7 +15,7 @@ import lombok.experimental.Accessors; @Data @Accessors(chain = true) @Schema(title = "对账订单详情") -public class PayReconcileDetailDto extends BaseDto { +public class ReconcileDetailDto extends BaseDto { /** 关联对账订单ID */ @Schema(description = "关联对账订单ID") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDiffRecordDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDiffRecordDto.java new file mode 100644 index 00000000..773354c5 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDiffRecordDto.java @@ -0,0 +1,19 @@ +package cn.bootx.platform.daxpay.service.dto.order.reconcile; + +import cn.bootx.platform.common.core.rest.dto.BaseDto; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 对账差异单 + * @author xxm + * @since 2024/3/3 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "对账差异单") +public class ReconcileDiffRecordDto extends BaseDto { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/PayReconcileOrderDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileOrderDto.java similarity index 94% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/PayReconcileOrderDto.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileOrderDto.java index d4b298f5..9b4f0427 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/PayReconcileOrderDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileOrderDto.java @@ -17,7 +17,7 @@ import java.time.LocalDate; @Data @Accessors(chain = true) @Schema(title = "对账订单") -public class PayReconcileOrderDto extends BaseDto { +public class ReconcileOrderDto extends BaseDto { @Schema(description = "日期") private LocalDate date; 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 index e9860f90..9c0e6c31 100644 --- 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 @@ -1,7 +1,7 @@ package cn.bootx.platform.daxpay.service.func; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileDetail; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDetail; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrder; import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralReconcileRecord; import lombok.Getter; import lombok.Setter; @@ -19,10 +19,10 @@ import java.util.List; public abstract class AbsReconcileStrategy implements PayStrategy { /** 对账订单 */ - private PayReconcileOrder recordOrder; + private ReconcileOrder recordOrder; /** 对账订单明细 */ - private List reconcileDetails; + private List reconcileDetails; /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDiffQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDiffQuery.java new file mode 100644 index 00000000..eb75aadb --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDiffQuery.java @@ -0,0 +1,19 @@ +package cn.bootx.platform.daxpay.service.param.reconcile; + +import cn.bootx.platform.common.core.rest.param.QueryOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 对账差异查询参数 + * @author xxm + * @since 2024/3/3 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "对账差异查询参数") +public class ReconcileDiffQuery extends QueryOrder { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayReconcileTask.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ReconcileTask.java similarity index 85% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayReconcileTask.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ReconcileTask.java index bcd4f34e..bf47846b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/PayReconcileTask.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ReconcileTask.java @@ -1,6 +1,6 @@ package cn.bootx.platform.daxpay.service.task; -import cn.bootx.platform.daxpay.service.task.service.PayReconcileTaskService; +import cn.bootx.platform.daxpay.service.task.service.ReconcileTaskService; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -20,8 +20,8 @@ import java.util.Objects; @DisallowConcurrentExecution @PersistJobDataAfterExecution @RequiredArgsConstructor -public class PayReconcileTask implements Job { - private final PayReconcileTaskService reconcileTaskService; +public class ReconcileTask implements Job { + private final ReconcileTaskService reconcileTaskService; /** * 要同步的通道 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/PayReconcileTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/ReconcileTaskService.java similarity index 79% rename from daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/PayReconcileTaskService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/ReconcileTaskService.java index 9bd94c70..017a2448 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/PayReconcileTaskService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/service/ReconcileTaskService.java @@ -1,7 +1,7 @@ package cn.bootx.platform.daxpay.service.task.service; -import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.PayReconcileOrder; -import cn.bootx.platform.daxpay.service.core.payment.reconcile.service.PayReconcileService; +import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrder; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.service.ReconcileService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -16,8 +16,8 @@ import java.time.LocalDate; @Slf4j @Service @RequiredArgsConstructor -public class PayReconcileTaskService { - private final PayReconcileService reconcileService; +public class ReconcileTaskService { + private final ReconcileService reconcileService; /** * 执行任务 @@ -25,7 +25,7 @@ public class PayReconcileTaskService { public void reconcileTask(LocalDate date, String channel){ // 1. 查询需要定时对账的通道, 创建出来对账订单 - PayReconcileOrder reconcileOrder = reconcileService.create(date, channel); + ReconcileOrder reconcileOrder = reconcileService.create(date, channel); // 2. 执行对账任务, 下载对账单并解析, 分别存储为原始数据和通用对账数据 reconcileService.downAndSave(reconcileOrder); -- Gitee From 70be3348235acb73db83cfcbeadcb6b5769525c0 Mon Sep 17 00:00:00 2001 From: bootx Date: Sun, 3 Mar 2024 23:28:32 +0800 Subject: [PATCH 07/10] =?UTF-8?q?doc=20=E6=9B=B4=E6=96=B0=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8023b84f..b5b555f0 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ QQ扫码加入QQ交流群 微信扫码加入微信交流群

-微信图片_20240226144703 +微信图片_20240226144703

-- Gitee From 6f56784e2eb91c19c168f799f1a05560e803ccfa Mon Sep 17 00:00:00 2001 From: bootx Date: Mon, 4 Mar 2024 23:03:39 +0800 Subject: [PATCH 08/10] =?UTF-8?q?feat=20=E5=AF=B9=E8=B4=A6=E5=B7=AE?= =?UTF-8?q?=E5=BC=82=E5=8D=95=E5=92=8C=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../typehandler/ReconcileDiffTypeHandler.java | 22 +++++++ .../RefundableInfoTypeHandler.java | 23 -------- .../reconcile/entity/ReconcileDetail.java | 8 --- .../reconcile/entity/ReconcileDiffRecord.java | 15 +++-- .../reconcile/service/ReconcileService.java | 11 +++- .../order/reconcile/ReconcileDetailDto.java | 6 +- .../reconcile/ReconcileDiffRecordDto.java | 57 +++++++++++++++++++ .../param/reconcile/ReconcileDiffQuery.java | 48 ++++++++++++++++ .../daxpay/service/task/ReconcileTask.java | 42 ++++++++++---- 9 files changed, 178 insertions(+), 54 deletions(-) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/typehandler/ReconcileDiffTypeHandler.java delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/typehandler/RefundableInfoTypeHandler.java diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/typehandler/ReconcileDiffTypeHandler.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/typehandler/ReconcileDiffTypeHandler.java new file mode 100644 index 00000000..ab9ed23d --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/typehandler/ReconcileDiffTypeHandler.java @@ -0,0 +1,22 @@ +package cn.bootx.platform.daxpay.service.common.typehandler; + +import cn.bootx.platform.common.mybatisplus.handler.JacksonTypeReferenceHandler; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff; +import com.fasterxml.jackson.core.type.TypeReference; + +import java.util.List; + +/** + * 对账差异内容类型处理器 + * @author xxm + * @since 2024/3/4 + */ +public class ReconcileDiffTypeHandler extends JacksonTypeReferenceHandler> { + /** + * 返回要反序列化的类型对象 + */ + @Override + public TypeReference> getTypeReference() { + return new TypeReference>() {}; + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/typehandler/RefundableInfoTypeHandler.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/typehandler/RefundableInfoTypeHandler.java deleted file mode 100644 index b0bc044b..00000000 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/typehandler/RefundableInfoTypeHandler.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.bootx.platform.daxpay.service.common.typehandler; - -import cn.bootx.platform.common.mybatisplus.handler.JacksonTypeReferenceHandler; -import cn.bootx.platform.daxpay.entity.RefundableInfo; -import com.fasterxml.jackson.core.type.TypeReference; - -import java.util.List; - -/** - * 支付订单可退款信息对应的MP字段处理器 - * @author xxm - * @since 2024/1/3 - */ -public class RefundableInfoTypeHandler extends JacksonTypeReferenceHandler> { - - /** - * 返回要反序列化的类型对象 - */ - @Override - public TypeReference> getTypeReference() { - return new TypeReference>() {}; - } -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDetail.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDetail.java index bf30cb57..b1e33d42 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDetail.java @@ -49,14 +49,6 @@ public class ReconcileDetail extends MpCreateEntity implements EntityBaseFunctio @DbColumn(comment = "本地订单ID") private String orderId; - /** 支付订单ID */ - @DbColumn(comment = "支付订单ID") - private String paymentId; - - /** 本地退款ID */ - @DbColumn(comment = "本地退款ID") - private String refundId; - /** 网关订单号 - 支付宝/微信的订单号 */ @DbColumn(comment = "网关订单号") private String gatewayOrderNo; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDiffRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDiffRecord.java index c47a8d9f..b6d10630 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDiffRecord.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/order/reconcile/entity/ReconcileDiffRecord.java @@ -4,17 +4,22 @@ import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; import cn.bootx.platform.daxpay.service.code.ReconcileDiffTypeEnum; +import cn.bootx.platform.daxpay.service.common.typehandler.ReconcileDiffTypeHandler; import cn.bootx.platform.daxpay.service.core.order.reconcile.conver.ReconcileConvert; import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff; import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDiffRecordDto; import cn.bootx.table.modify.annotation.DbColumn; import cn.bootx.table.modify.annotation.DbTable; +import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; +import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.time.LocalDateTime; +import java.util.List; /** * 对账差异单 @@ -25,7 +30,7 @@ import java.time.LocalDateTime; @Data @Accessors(chain = true) @DbTable(comment = "对账差异单") -@TableName("pay_reconcile_diff_record") +@TableName(value = "pay_reconcile_diff_record",autoResultMap = true) public class ReconcileDiffRecord extends MpBaseEntity implements EntityBaseFunction { /** 对账单ID */ @@ -45,10 +50,10 @@ public class ReconcileDiffRecord extends MpBaseEntity implements EntityBaseFunct private String title; /** - * 对账订单类型 + * 订单类型 * @see ReconcileTradeEnum */ - @DbColumn(comment = "对账订单类型") + @DbColumn(comment = "订单类型") private String orderType; /** @@ -64,7 +69,9 @@ public class ReconcileDiffRecord extends MpBaseEntity implements EntityBaseFunct * @see ReconcileDiff */ @DbColumn(comment = "差异内容") - private String diffContent; + @TableField(typeHandler = ReconcileDiffTypeHandler.class) + @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) + private List diffs; /** 网关订单号 */ @DbColumn(comment = "网关订单号") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/ReconcileService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/ReconcileService.java index 0ad52f3b..83e76da2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/ReconcileService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/reconcile/service/ReconcileService.java @@ -205,6 +205,7 @@ public class ReconcileService { .setOrderType(detail.getType()) .setGatewayOrderNo(detail.getGatewayOrderNo()) .setAmount(detail.getAmount()) + .setDiffs(reconcileDiffs) .setOrderTime(detail.getOrderTime()); diffRecords.add(diffRecord); } @@ -219,7 +220,6 @@ public class ReconcileService { .setRecordId(reconcileOrder.getId()) .setDetailId(null) .setTitle(gateway.getTitle()) - .setDiffType(gateway.getType()) .setOrderType(gateway.getType()) .setGatewayOrderNo(gateway.getGatewayOrderNo()) .setAmount(gateway.getAmount()) @@ -239,8 +239,13 @@ public class ReconcileService { List diffs = new ArrayList<>(); // 判断类型是否相同 - if (!(Objects.equals(detail.getType(), ReconcileTradeEnum.PAY.getCode()) - && Objects.equals(record.getType(), AliPayRecordTypeEnum.PAY.getCode()))){ + if (Objects.equals(detail.getType(), ReconcileTradeEnum.PAY.getCode()) + && !Objects.equals(record.getType(), AliPayRecordTypeEnum.PAY.getCode())){ + log.warn("订单类型不一致: {},{}", detail.getType(), record.getType()); + diffs.add(new ReconcileDiff().setFieldName("订单类型").setLocalValue(detail.getType()).setGatewayValue(record.getType())); + } + if (Objects.equals(detail.getType(), ReconcileTradeEnum.REFUND.getCode()) + && !Objects.equals(record.getType(), AliPayRecordTypeEnum.REFUND.getCode())){ log.warn("订单类型不一致: {},{}", detail.getType(), record.getType()); diffs.add(new ReconcileDiff().setFieldName("订单类型").setLocalValue(detail.getType()).setGatewayValue(record.getType())); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDetailDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDetailDto.java index dbdff4cd..9cd9f557 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDetailDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDetailDto.java @@ -35,11 +35,7 @@ public class ReconcileDetailDto extends BaseDto { /** 本地订单ID */ @Schema(description = "本地订单ID") - private String paymentId; - - /** 本地退款ID */ - @Schema(description = "本地退款ID") - private String refundId; + private String orderId; /** 网关订单号 - 支付宝/微信的订单号 */ @Schema(description = "网关订单号") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDiffRecordDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDiffRecordDto.java index 773354c5..e91f3714 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDiffRecordDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/order/reconcile/ReconcileDiffRecordDto.java @@ -1,11 +1,17 @@ package cn.bootx.platform.daxpay.service.dto.order.reconcile; import cn.bootx.platform.common.core.rest.dto.BaseDto; +import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; +import cn.bootx.platform.daxpay.service.code.ReconcileDiffTypeEnum; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDateTime; +import java.util.List; + /** * 对账差异单 * @author xxm @@ -16,4 +22,55 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @Schema(title = "对账差异单") public class ReconcileDiffRecordDto extends BaseDto { + + /** 对账单ID */ + @Schema(description = "对账单ID") + private Long recordId; + + /** 对账单明细ID */ + @Schema(description = "对账单明细ID") + private Long detailId; + + /** 本地订单id */ + @Schema(description = "本地订单id") + private Long orderId; + + /** 订单标题 */ + @Schema(description = "订单标题") + private String title; + + /** + * 对账订单类型 + * @see ReconcileTradeEnum + */ + @Schema(description = "对账订单类型") + private String orderType; + + /** + * 差异类型 + * @see ReconcileDiffTypeEnum + */ + @Schema(description = "差异类型") + private String diffType; + + /** + * 差异内容, 存储json字符串, 格式为 + * {属性: '标题', 本地字段值:'标题1', 网关字段值: '标题2'} + * @see ReconcileDiff + */ + @Schema(description = "差异内容") + private List diffs; + + + /** 网关订单号 */ + @Schema(description = "网关订单号") + private String gatewayOrderNo; + + /** 交易金额 */ + @Schema(description = "交易金额") + private Integer amount; + + /** 订单时间 */ + @Schema(description = "订单时间") + private LocalDateTime orderTime; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDiffQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDiffQuery.java index eb75aadb..2cd7468e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDiffQuery.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/reconcile/ReconcileDiffQuery.java @@ -1,11 +1,17 @@ package cn.bootx.platform.daxpay.service.param.reconcile; import cn.bootx.platform.common.core.rest.param.QueryOrder; +import cn.bootx.platform.daxpay.code.ReconcileTradeEnum; +import cn.bootx.platform.daxpay.service.code.ReconcileDiffTypeEnum; +import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDateTime; +import java.util.List; + /** * 对账差异查询参数 * @author xxm @@ -16,4 +22,46 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @Schema(title = "对账差异查询参数") public class ReconcileDiffQuery extends QueryOrder { + + /** 对账单ID */ + @Schema(description = "对账单ID") + private Long recordId; + + /** 对账单明细ID */ + @Schema(description = "对账单明细ID") + private Long detailId; + + /** 本地订单id */ + @Schema(description = "本地订单id") + private Long orderId; + + /** 订单标题 */ + @Schema(description = "订单标题") + private String title; + + /** + * 对账订单类型 + * @see ReconcileTradeEnum + */ + @Schema(description = "对账订单类型") + private String orderType; + + /** + * 差异类型 + * @see ReconcileDiffTypeEnum + */ + @Schema(description = "差异类型") + private String diffType; + + /** 差异内容 */ + @Schema(description = "差异内容") + private List diffs; + + /** 网关订单号 */ + @Schema(description = "网关订单号") + private String gatewayOrderNo; + + /** 订单时间 */ + @Schema(description = "订单时间") + private LocalDateTime orderTime; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ReconcileTask.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ReconcileTask.java index bf47846b..0bd7c3df 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ReconcileTask.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/task/ReconcileTask.java @@ -1,6 +1,9 @@ package cn.bootx.platform.daxpay.service.task; import cn.bootx.platform.daxpay.service.task.service.ReconcileTaskService; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -24,29 +27,46 @@ public class ReconcileTask implements Job { private final ReconcileTaskService reconcileTaskService; /** - * 要同步的通道 + * 任务参数, 格式 + * {"channel":"ali_pay","n":1} */ @Setter - private String channel; - - /** - * 同步账单规则是 T+N 天, 例如T+1就是同步昨天的账单, T+2就是同步前天的账单 - */ - @Setter - private Integer n; + private String parameter; /** * 任务实现 */ @Override public void execute(JobExecutionContext context) throws JobExecutionException { + if (StrUtil.isBlank(parameter)){ + log.warn("传输参数为空"); + return; + } + Parameter bean = JSONUtil.toBean(parameter, Parameter.class); // 日期, 如果未配置T+N规则, 默认为T+1 LocalDate date = LocalDate.now(); - if (Objects.nonNull(n)){ - date = date.minusDays(n); + if (Objects.nonNull(bean.n)){ + date = date.minusDays(bean.n); } else { date = date.minusDays(1); } - reconcileTaskService.reconcileTask(date,channel); + reconcileTaskService.reconcileTask(date,bean.channel); + } + + /** + * 接收参数 + */ + @Getter + @Setter + public static class Parameter { + /** + * 要同步的通道 + */ + private String channel; + + /** + * 同步账单规则是 T+N 天, 例如T+1就是同步昨天的账单, T+2就是同步前天的账单 + */ + private Integer n; } } -- Gitee From 6a1e3f8d6b0c2d81d677300c6f4c2649b5a60552 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Tue, 5 Mar 2024 16:50:04 +0800 Subject: [PATCH 09/10] =?UTF-8?q?build=20=E6=95=B0=E6=8D=AE=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config/sql/2.0.2/2.0.2.update.data.sql | 69 +++++++++++++++++++ _config/sql/2.0.2/2.0.2.update.table.sql | 54 +++++++++++++++ _doc/Task.md | 13 ++-- .../order/ReconcileOrderController.java | 4 +- 4 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 _config/sql/2.0.2/2.0.2.update.data.sql create mode 100644 _config/sql/2.0.2/2.0.2.update.table.sql diff --git a/_config/sql/2.0.2/2.0.2.update.data.sql b/_config/sql/2.0.2/2.0.2.update.data.sql new file mode 100644 index 00000000..f2548343 --- /dev/null +++ b/_config/sql/2.0.2/2.0.2.update.data.sql @@ -0,0 +1,69 @@ +SET FOREIGN_KEY_CHECKS = 0; + +INSERT INTO `base_dict`(`id`, `code`, `name`, `enable`, `group_tag`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `deleted`, `version`) VALUES (1763588034467713024, 'ReconcileDiffType', '对账差异类型', b'1', '支付', '', 1399985191002447872, '2024-03-01 23:32:08', 1399985191002447872, '2024-03-01 23:32:08', 0, 0); + +UPDATE `base_dict` SET `code` = 'ReconcileTrade', `name` = '支付对账交易类型', `enable` = b'1', `group_tag` = '支付', `remark` = '', `creator` = 1399985191002447872, `create_time` = '2024-01-23 09:59:00', `last_modifier` = 1399985191002447872, `last_modified_time` = '2024-03-01 23:31:32', `deleted` = 0, `version` = 1 WHERE `id` = 1749612665392541696; + +INSERT INTO `base_dict_item`(`id`, `dict_id`, `dict_code`, `code`, `name`, `enable`, `sort_no`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `deleted`, `version`) VALUES (1763588081838182400, 1763588034467713024, 'ReconcileDiffType', 'local_not_exists', '本地订单不存在', b'1', 0.00, '', 1399985191002447872, '2024-03-01 23:32:19', 1399985191002447872, '2024-03-01 23:32:19', 0, 0); + +INSERT INTO `base_dict_item`(`id`, `dict_id`, `dict_code`, `code`, `name`, `enable`, `sort_no`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `deleted`, `version`) VALUES (1763588123143688192, 1763588034467713024, 'ReconcileDiffType', 'remote_not_exists', '远程订单不存在', b'1', 1.00, '', 1399985191002447872, '2024-03-01 23:32:29', 1399985191002447872, '2024-03-01 23:32:29', 0, 0); + +INSERT INTO `base_dict_item`(`id`, `dict_id`, `dict_code`, `code`, `name`, `enable`, `sort_no`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `deleted`, `version`) VALUES (1763588174695878656, 1763588034467713024, 'ReconcileDiffType', 'not_match', '订单信息不一致', b'1', 2.00, '', 1399985191002447872, '2024-03-01 23:32:41', 1399985191002447872, '2024-03-01 23:32:48', 0, 1); + +UPDATE `base_dict_item` SET `dict_id` = 1749612665392541696, `dict_code` = 'ReconcileTrade', `code` = 'pay', `name` = '支付', `enable` = b'1', `sort_no` = 1.00, `remark` = '', `creator` = 1399985191002447872, `create_time` = '2024-01-23 09:59:11', `last_modifier` = 1399985191002447872, `last_modified_time` = '2024-01-23 09:59:11', `deleted` = 0, `version` = 0 WHERE `id` = 1749612708363186176; + +UPDATE `base_dict_item` SET `dict_id` = 1749612665392541696, `dict_code` = 'ReconcileTrade', `code` = 'refund', `name` = '退款', `enable` = b'1', `sort_no` = 2.00, `remark` = '', `creator` = 1399985191002447872, `create_time` = '2024-01-23 09:59:23', `last_modifier` = 1399985191002447872, `last_modified_time` = '2024-01-23 09:59:23', `deleted` = 0, `version` = 0 WHERE `id` = 1749612758531256320; + +UPDATE `base_dict_item` SET `dict_id` = 1749612665392541696, `dict_code` = 'ReconcileTrade', `code` = 'revoked', `name` = '撤销', `enable` = b'1', `sort_no` = 3.00, `remark` = '', `creator` = 1399985191002447872, `create_time` = '2024-01-23 09:59:32', `last_modifier` = 1399985191002447872, `last_modified_time` = '2024-01-23 09:59:32', `deleted` = 0, `version` = 0 WHERE `id` = 1749612797680889856; + +INSERT INTO `iam_perm_menu`(`id`, `client_code`, `parent_id`, `title`, `name`, `perm_code`, `effect`, `icon`, `hidden`, `hide_children_in_menu`, `component`, `component_name`, `path`, `redirect`, `sort_no`, `menu_type`, `leaf`, `keep_alive`, `target_outside`, `hidden_header_content`, `admin`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `version`, `deleted`) VALUES (1764638353289027584, 'dax-pay', 1749262518385082368, '对账单', 'ReconcileOrderList', NULL, b'0', '', b'0', b'0', 'payment/order/reconcile/order/ReconcileOrderList.vue', NULL, '/pay/order/reconcile/list', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2024-03-04 21:05:43', 1399985191002447872, '2024-03-04 21:07:14', 1, 0); + +INSERT INTO `iam_perm_menu`(`id`, `client_code`, `parent_id`, `title`, `name`, `perm_code`, `effect`, `icon`, `hidden`, `hide_children_in_menu`, `component`, `component_name`, `path`, `redirect`, `sort_no`, `menu_type`, `leaf`, `keep_alive`, `target_outside`, `hidden_header_content`, `admin`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `version`, `deleted`) VALUES (1764638678821543936, 'dax-pay', 1749262518385082368, '差异单', 'ReconcileDiffList', NULL, b'0', '', b'1', b'0', 'payment/order/reconcile/diff/ReconcileDiffList.vue', NULL, '/pay/order/reconcile/diff', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2024-03-04 21:07:01', 1399985191002447872, '2024-03-05 12:49:19', 2, 0); + +UPDATE `iam_perm_menu` SET `client_code` = 'dax-pay', `parent_id` = 1744642856348520448, `title` = '对账订单', `name` = 'ReconcileOrder', `perm_code` = NULL, `effect` = b'0', `icon` = '', `hidden` = b'0', `hide_children_in_menu` = b'0', `component` = 'Layout', `component_name` = NULL, `path` = '/pay/order/reconcile', `redirect` = '', `sort_no` = 0, `menu_type` = 1, `leaf` = NULL, `keep_alive` = b'1', `target_outside` = b'0', `hidden_header_content` = b'0', `admin` = b'0', `remark` = NULL, `creator` = 1399985191002447872, `create_time` = '2024-01-22 10:47:39', `last_modifier` = 1399985191002447872, `last_modified_time` = '2024-03-04 21:06:18', `version` = 1, `deleted` = 0 WHERE `id` = 1749262518385082368; + +DELETE FROM `iam_perm_path` WHERE `id` = 1757297527147974657; + +DELETE FROM `iam_perm_path` WHERE `id` = 1757297527147974712; + +DELETE FROM `iam_perm_path` WHERE `id` = 1757297527152169074; + +DELETE FROM `iam_perm_path` WHERE `id` = 1757297527152169137; + +INSERT INTO `iam_perm_path`(`id`, `code`, `name`, `request_type`, `path`, `group_name`, `enable`, `generate`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `deleted`, `version`) VALUES (1764663810424303616, 'ReconcileOrderController#pageDiff', '对账差异分页', 'GET', '/order/reconcile/diff/page', '对账控制器', b'1', b'1', '对账控制器 对账差异分页', 1399985191002447872, '2024-03-04 22:46:52.930000', 1399985191002447872, '2024-03-04 22:46:52.930000', b'0', 0); + +INSERT INTO `iam_perm_path`(`id`, `code`, `name`, `request_type`, `path`, `group_name`, `enable`, `generate`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `deleted`, `version`) VALUES (1764663810424303617, 'ReconcileOrderController#findDiffById', '对账差异详情', 'GET', '/order/reconcile/diff/findById', '对账控制器', b'1', b'1', '对账控制器 对账差异详情', 1399985191002447872, '2024-03-04 22:46:52.930000', 1399985191002447872, '2024-03-04 22:46:52.930000', b'0', 0); + +INSERT INTO `iam_perm_path`(`id`, `code`, `name`, `request_type`, `path`, `group_name`, `enable`, `generate`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `deleted`, `version`) VALUES (1764663810424303618, 'ReconcileOrderController#findDetailById', '对账明细详情', 'GET', '/order/reconcile/detail/findById', '对账控制器', b'1', b'1', '对账控制器 对账明细详情', 1399985191002447872, '2024-03-04 22:46:52.930000', 1399985191002447872, '2024-03-04 22:46:52.930000', b'0', 0); + +INSERT INTO `iam_perm_path`(`id`, `code`, `name`, `request_type`, `path`, `group_name`, `enable`, `generate`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `deleted`, `version`) VALUES (1764663810424303619, 'ReconcileOrderController#compare', '手动触发对账单比对', 'POST', '/order/reconcile/compare', '对账控制器', b'1', b'1', '对账控制器 手动触发对账单比对', 1399985191002447872, '2024-03-04 22:46:52.930000', 1399985191002447872, '2024-03-04 22:46:52.930000', b'0', 0); + +INSERT INTO `iam_perm_path`(`id`, `code`, `name`, `request_type`, `path`, `group_name`, `enable`, `generate`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `deleted`, `version`) VALUES (1764663810424303620, 'ReconcileOrderController#pageDetail', '对账明细分页', 'GET', '/order/reconcile/detail/page', '对账控制器', b'1', b'1', '对账控制器 对账明细分页', 1399985191002447872, '2024-03-04 22:46:52.930000', 1399985191002447872, '2024-03-04 22:46:52.930000', b'0', 0); + +UPDATE `iam_perm_path` SET `code` = 'PayReconcileOrderController#findById', `name` = '订单详情', `request_type` = 'GET', `path` = '/order/reconcile/findById', `group_name` = '对账控制器', `enable` = b'1', `generate` = b'1', `remark` = '对账控制器 订单详情', `creator` = 1399985191002447872, `create_time` = '2024-02-13 14:55:54.139000', `last_modifier` = 1399985191002447872, `last_modified_time` = '2024-02-13 14:55:54.139000', `deleted` = b'0', `version` = 0 WHERE `id` = 1757297527152169016; + +UPDATE `iam_perm_path` SET `code` = 'PayReconcileOrderController#downAndSave', `name` = '手动触发对账文件下载', `request_type` = 'POST', `path` = '/order/reconcile/downAndSave', `group_name` = '对账控制器', `enable` = b'1', `generate` = b'1', `remark` = '对账控制器 手动触发对账文件下载', `creator` = 1399985191002447872, `create_time` = '2024-02-13 14:55:54.139000', `last_modifier` = 1399985191002447872, `last_modified_time` = '2024-02-13 14:55:54.139000', `deleted` = b'0', `version` = 0 WHERE `id` = 1757297527152169041; + +UPDATE `iam_perm_path` SET `code` = 'PayReconcileOrderController#create', `name` = '手动创建对账订单', `request_type` = 'POST', `path` = '/order/reconcile/create', `group_name` = '对账控制器', `enable` = b'1', `generate` = b'1', `remark` = '对账控制器 手动创建支付订单', `creator` = 1399985191002447872, `create_time` = '2024-02-13 14:55:54.139000', `last_modifier` = 1399985191002447872, `last_modified_time` = '2024-02-13 14:55:54.139000', `deleted` = b'0', `version` = 0 WHERE `id` = 1757297527152169054; + +UPDATE `iam_perm_path` SET `code` = 'PayReconcileOrderController#page', `name` = '订单分页', `request_type` = 'GET', `path` = '/order/reconcile/page', `group_name` = '对账控制器', `enable` = b'1', `generate` = b'1', `remark` = '对账控制器 订单分页', `creator` = 1399985191002447872, `create_time` = '2024-02-13 14:55:54.139000', `last_modifier` = 1399985191002447872, `last_modified_time` = '2024-02-13 14:55:54.139000', `deleted` = b'0', `version` = 0 WHERE `id` = 1757297527152169098; + +DELETE FROM `iam_role_path` WHERE `id` = 1757299898544541715; + +DELETE FROM `iam_role_path` WHERE `id` = 1757299898544541716; + +INSERT INTO `iam_role_path`(`id`, `role_id`, `permission_id`) VALUES (1764931648924622848, 1757297023118462976, 1764663810424303620); + +INSERT INTO `iam_role_path`(`id`, `role_id`, `permission_id`) VALUES (1764931648924622849, 1757297023118462976, 1764663810424303619); + +INSERT INTO `iam_role_path`(`id`, `role_id`, `permission_id`) VALUES (1764931648924622850, 1757297023118462976, 1764663810424303618); + +INSERT INTO `iam_role_path`(`id`, `role_id`, `permission_id`) VALUES (1764931648924622851, 1757297023118462976, 1764663810424303617); + +INSERT INTO `iam_role_path`(`id`, `role_id`, `permission_id`) VALUES (1764931648924622852, 1757297023118462976, 1764663810424303616); + +INSERT INTO `starter_quartz_job`(`id`, `name`, `job_class_name`, `cron`, `parameter`, `state`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `version`, `deleted`) VALUES (1764664552203743232, '支付宝定时对账', 'cn.bootx.platform.daxpay.service.task.ReconcileTask', '* * 11 * * ? *', '{\"channel\":\"ali_pay\",\"n\":1}', 0, '', 1399985191002447872, '2024-03-04 22:49:50', 1399985191002447872, '2024-03-04 22:49:50', 0, 0); + +INSERT INTO `starter_quartz_job`(`id`, `name`, `job_class_name`, `cron`, `parameter`, `state`, `remark`, `creator`, `create_time`, `last_modifier`, `last_modified_time`, `version`, `deleted`) VALUES (1764667388106887168, '微信支付定时对账', 'cn.bootx.platform.daxpay.service.task.ReconcileTask', '* * 11 * * ? *', '{\"channel\":\"wechat_pay\",\"n\":1}', 0, '', 1399985191002447872, '2024-03-04 23:01:06', 1399985191002447872, '2024-03-04 23:01:06', 0, 0); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/_config/sql/2.0.2/2.0.2.update.table.sql b/_config/sql/2.0.2/2.0.2.update.table.sql new file mode 100644 index 00000000..c97ef867 --- /dev/null +++ b/_config/sql/2.0.2/2.0.2.update.table.sql @@ -0,0 +1,54 @@ +SET FOREIGN_KEY_CHECKS=0; + +ALTER TABLE `pay_alipay_reconcile_bill_detail` MODIFY COLUMN `create_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建时间' AFTER `subject`; + +ALTER TABLE `pay_alipay_record` ADD COLUMN `gateway_time` datetime(0) NULL DEFAULT NULL COMMENT '网关完成时间' AFTER `create_time`; + +ALTER TABLE `pay_client_notice_record` ADD COLUMN `send_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发送类型' AFTER `create_time`; + +ALTER TABLE `pay_client_notice_record` DROP COLUMN `type`; + +ALTER TABLE `pay_client_notice_task` ADD COLUMN `notice_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息类型' AFTER `deleted`; + +ALTER TABLE `pay_client_notice_task` ADD COLUMN `order_status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '订单类型' AFTER `notice_type`; + +ALTER TABLE `pay_client_notice_task` DROP COLUMN `type`; + +ALTER TABLE `pay_order` MODIFY COLUMN `close_time` datetime(0) NULL DEFAULT NULL COMMENT '关闭时间' AFTER `pay_time`; + +ALTER TABLE `pay_platform_config` MODIFY COLUMN `order_timeout` int(11) NULL DEFAULT NULL COMMENT '订单默认超时时间(分钟)' AFTER `return_url`; + +ALTER TABLE `pay_reconcile_detail` ADD COLUMN `order_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '本地订单ID' AFTER `type`; + +ALTER TABLE `pay_reconcile_detail` ADD COLUMN `order_time` datetime(0) NULL DEFAULT NULL COMMENT '订单时间' AFTER `gateway_order_no`; + +ALTER TABLE `pay_reconcile_detail` DROP COLUMN `payment_id`; + +ALTER TABLE `pay_reconcile_detail` DROP COLUMN `refund_id`; + +CREATE TABLE `pay_reconcile_diff_record` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `record_id` bigint(20) NULL DEFAULT NULL COMMENT '对账单ID', + `detail_id` bigint(20) NULL DEFAULT NULL COMMENT '对账单明细ID', + `order_id` bigint(20) NULL DEFAULT NULL COMMENT '本地订单id', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '订单标题', + `order_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '订单类型', + `diff_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '差异类型', + `diffs` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '差异内容', + `gateway_order_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '网关订单号', + `amount` int(11) NULL DEFAULT NULL COMMENT '交易金额', + `order_time` datetime(0) NULL DEFAULT NULL COMMENT '订单时间', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '对账差异单' ROW_FORMAT = Dynamic; + +ALTER TABLE `pay_wechat_pay_config` MODIFY COLUMN `api_version` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接口版本' AFTER `return_url`; + +ALTER TABLE `pay_wechat_pay_record` ADD COLUMN `gateway_time` datetime(0) NULL DEFAULT NULL COMMENT '网关完成时间' AFTER `create_time`; + +SET FOREIGN_KEY_CHECKS=1; diff --git a/_doc/Task.md b/_doc/Task.md index 730156cf..b42cbb6a 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,16 +1,17 @@ - 2.0.2: -- [ ] 对账功能补全账单比对功能 -- [ ] 数据库表进行规则, 字段设置长度, 增加索引 -- [ ] 退款操作支持重试 -- [x] 支付对账的序列化生成器有问题,待platform更新 +- [x] 对账功能补全账单比对功能 +- [x] 支付对账的序列化生成器有问题, 可以生成重复的序号 -2.0.x 版本内容 +2.0.3: - [ ] 云闪付接入 + +2.0.x 版本内容 - [ ] 增加各类日志记录,例如钱包的各项操作 - [ ] 支付流程也改为先落库后支付情况, 避免极端情况导致掉单 - [ ] 支付流程涉及异步支付时, 更换支付方式需要控制预防客户重复付款 - [ ] 增加撤销功能,用于处理线下支付订单的情况 +- [ ] 数据库表进行规则, 字段设置长度, 增加索引 +- [ ] 退款操作支持重试 **任务池** - [x] 支付SDK编写 diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/ReconcileOrderController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/ReconcileOrderController.java index dc1a04a7..17dc5417 100644 --- a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/ReconcileOrderController.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/order/ReconcileOrderController.java @@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.*; * @author xxm * @since 2024/1/18 */ -@Tag(name = "支付对账控制器") +@Tag(name = "对账控制器") @RestController @RequestMapping("/order/reconcile") @RequiredArgsConstructor @@ -34,7 +34,7 @@ public class ReconcileOrderController { private final ReconcileQueryService reconcileQueryService; private final ReconcileDiffService reconcileDiffService; - @Operation(summary = "手动创建支付对账订单") + @Operation(summary = "手动创建对账订单") @PostMapping("/create") public ResResult create(@RequestBody ReconcileOrderCreate param){ ValidationUtil.validateParam(param); -- Gitee From 41d67a9febd0a1cc5e6599e86dfe73767c6e961c Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Fri, 15 Mar 2024 08:59:28 +0800 Subject: [PATCH 10/10] =?UTF-8?q?doc=20=E4=BB=BB=E5=8A=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 6 +++++- _doc/Task.md | 17 ----------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 801cedfc..c2df4fdf 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,6 +1,10 @@ # CHANGELOG ## [v2.0.3] -- 支持支付、退款、同步、回调处理 +- 增加云闪付通道,支持支付、退款、同步、回调处理 +- 增加定时同步退款中的退款订单任务 +- 增加通知任务订单的状态类型,例如订单关闭、成功、失败等 +- 增加退款操作支持重试 +- 增加手动触发通知任务消息的发送功能 ## [v2.0.2] - 增加微信支付对账功能 - 增加支付宝支付对账功能 diff --git a/_doc/Task.md b/_doc/Task.md index b5c1cee4..3f322585 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,14 +1,3 @@ -2.0.3: -- [x] 云闪付接入 - - [x] 支付 - - [x] 退款 - - [x] 同步 - - [x] 回调 -- [x] 手动触发通知消息发送 -- [x] 退款操作支持重试 -- [x] 通知任务增加订单的状态类型,例如订单关闭、成功、失败等 -- [x] 优化发起请求时IP的获取逻辑, 请求参数传输的ip -> 客户端ID -> 服务器ID, -- [x] 增加定时同步退款中的退款订单· 2.0.4: - [ ] 支付流程也改为先落库后支付情况, 避免极端情况导致掉单 @@ -25,20 +14,14 @@ - [ ] 数据库表进行规则, 字段设置长度, 增加索引 **任务池** -- [x] 支付SDK编写 -- [x] 接入支付网关的演示项目 -- [x] 增加聚合支付功能支持 - [x] 增加手机用户收银台功能 - [ ] 订单超时支持数据表级别触发 - [ ] 支持转账操作, 通过支付通道专有参数进行实现, 转账时只能单个通道进行操作 - [ ] 支付成功回调后, 如果订单已超时, 则进入待退款订单中,提示进行退款,或者自动退款 -- [x] 增加回调机制(通知客户端) -- [ ] 增加消息通知机制(通知客户端) - [ ] 新增支付单预警功能, 处理支付单与网关状态不一致且无法自动修复的情况 - [ ] 微信消息通知相关配置 - [ ] 钉钉消息通知配置 - [ ] 支付宝接口升级为V3接口 -- [ ] 微信支付接口更新为V3接口 - [ ] 增加验签调试等功能的页面 - [ ] 请求IP参数增加正则校验 - [ ] 增加账户金额表, 记录每天每个通道的账户金额, 并且提供查询接口 -- Gitee