From fd10cf09e98c87bd2d39fc011efd34b6c5859f18 Mon Sep 17 00:00:00 2001 From: bootx Date: Mon, 4 Mar 2024 23:03:39 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E5=AF=B9=E8=B4=A6=E5=B7=AE=E5=BC=82?= =?UTF-8?q?=E5=8D=95=E5=92=8C=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=BC=80?= =?UTF-8?q?=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 000000000..ab9ed23df --- /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 b0bc044ba..000000000 --- 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 bf30cb573..b1e33d422 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 c47a8d9f1..b6d106304 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 0ad52f3b7..83e76da27 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 dbdff4cdf..9cd9f5578 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 773354c54..e91f37145 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 eb75aadb7..2cd7468e4 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 bf47846b0..0bd7c3df9 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; } }