feat 对账差异单和定时任务开发

This commit is contained in:
bootx
2024-03-04 23:03:39 +08:00
parent a84336552a
commit fd10cf09e9
9 changed files with 178 additions and 54 deletions

View File

@@ -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<List<ReconcileDiff>> {
/**
* 返回要反序列化的类型对象
*/
@Override
public TypeReference<List<ReconcileDiff>> getTypeReference() {
return new TypeReference<List<ReconcileDiff>>() {};
}
}

View File

@@ -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<List<RefundableInfo>> {
/**
* 返回要反序列化的类型对象
*/
@Override
public TypeReference<List<RefundableInfo>> getTypeReference() {
return new TypeReference<List<RefundableInfo>>() {};
}
}

View File

@@ -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;

View File

@@ -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<ReconcileDiffRecordDto> {
/** 对账单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<ReconcileDiff> diffs;
/** 网关订单号 */
@DbColumn(comment = "网关订单号")

View File

@@ -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<ReconcileDiff> 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()));
}

View File

@@ -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 = "网关订单号")

View File

@@ -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<ReconcileDiff> diffs;
/** 网关订单号 */
@Schema(description = "网关订单号")
private String gatewayOrderNo;
/** 交易金额 */
@Schema(description = "交易金额")
private Integer amount;
/** 订单时间 */
@Schema(description = "订单时间")
private LocalDateTime orderTime;
}

View File

@@ -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<ReconcileDiff> diffs;
/** 网关订单号 */
@Schema(description = "网关订单号")
private String gatewayOrderNo;
/** 订单时间 */
@Schema(description = "订单时间")
private LocalDateTime orderTime;
}

View File

@@ -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;
}
}