ref 对账差异明细

This commit is contained in:
DaxPay
2024-05-05 20:55:36 +08:00
parent 0fa7b41a20
commit b8875333f3
12 changed files with 113 additions and 316 deletions

View File

@@ -1,7 +1,7 @@
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 cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiffDetail;
import com.fasterxml.jackson.core.type.TypeReference;
import java.util.List;
@@ -11,12 +11,12 @@ import java.util.List;
* @author xxm
* @since 2024/3/4
*/
public class ReconcileDiffTypeHandler extends JacksonTypeReferenceHandler<List<ReconcileDiff>> {
public class ReconcileDiffTypeHandler extends JacksonTypeReferenceHandler<List<ReconcileDiffDetail>> {
/**
* 返回要反序列化的类型对象
*/
@Override
public TypeReference<List<ReconcileDiff>> getTypeReference() {
return new TypeReference<List<ReconcileDiff>>() {};
public TypeReference<List<ReconcileDiffDetail>> getTypeReference() {
return new TypeReference<List<ReconcileDiffDetail>>() {};
}
}

View File

@@ -2,10 +2,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.PayChannelEnum;
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.ReconcileDiffDetail;
import cn.bootx.platform.daxpay.service.dto.order.reconcile.ReconcileDiffDto;
import cn.bootx.table.modify.annotation.DbColumn;
import cn.bootx.table.modify.annotation.DbTable;
@@ -17,6 +19,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@@ -46,7 +49,7 @@ public class ReconcileDiff extends MpBaseEntity implements EntityBaseFunction<Re
/** 对账日期 */
@DbColumn(comment = "对账日期")
private LocalDateTime reconcileDate;
private LocalDate reconcileDate;
/** 本地交易号 */
@DbColumn(comment = "本地交易号")
@@ -54,7 +57,7 @@ public class ReconcileDiff extends MpBaseEntity implements EntityBaseFunction<Re
/** 外部交易号 */
@DbColumn(comment = "外部交易号")
private String outOrderNo;
private String outTradeNo;
/** 交易时间 */
@DbColumn(comment = "交易时间")
@@ -64,6 +67,13 @@ public class ReconcileDiff extends MpBaseEntity implements EntityBaseFunction<Re
@DbColumn(comment = "订单标题")
private String title;
/**
* 通道
* @see PayChannelEnum
*/
@DbColumn(comment = "通道")
private String channel;
/** 本地交易金额 */
@DbColumn(comment = "本地交易金额")
private Integer amount;
@@ -90,12 +100,12 @@ public class ReconcileDiff extends MpBaseEntity implements EntityBaseFunction<Re
/**
* 差异内容, 存储json字符串, 格式为
* {属性: '标题', 本地字段值:'标题1', 网关字段值: '标题2'}
* @see cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff
* @see ReconcileDiffDetail
*/
@DbColumn(comment = "差异内容")
@TableField(typeHandler = ReconcileDiffTypeHandler.class)
@DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT)
private List<cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff> diffs;
private List<ReconcileDiffDetail> diffs;
@Override
public ReconcileDiffDto toDto() {

View File

@@ -10,7 +10,7 @@ import lombok.experimental.Accessors;
*/
@Data
@Accessors(chain = true)
public class ReconcileDiff {
public class ReconcileDiffDetail {
/** 字段名 */
private String fieldName;

View File

@@ -16,6 +16,7 @@ import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrd
import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundOrderManager;
import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder;
import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.GeneralTradeInfo;
import cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiffDetail;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -91,9 +92,6 @@ public class ReconcileAssistService {
public List<ReconcileDiff> generateDiffRecord(ReconcileOrder reconcileOrder,
List<GeneralTradeInfo> localTrades,
List<ReconcileTradeDetail> outDetails){
if (CollUtil.isEmpty(outDetails) || CollUtil.isEmpty(localTrades)){
return new ArrayList<>();
}
// 差异内容
List<ReconcileDiff> diffRecords = new ArrayList<>();
@@ -114,28 +112,34 @@ public class ReconcileAssistService {
.setTradeNo(outDetail.getTradeNo())
.setDetailId(outDetail.getId())
.setReconcileId(reconcileOrder.getId())
.setReconcileNo(reconcileOrder.getReconcileNo())
.setReconcileDate(reconcileOrder.getDate())
.setTitle(outDetail.getTitle())
.setOrderType(outDetail.getType())
.setOutOrderNo(outDetail.getOutTradeNo())
.setTradeType(outDetail.getType())
.setOutTradeNo(outDetail.getOutTradeNo())
.setOutAmount(outDetail.getAmount())
.setChannel(reconcileOrder.getChannel())
.setTradeTime(outDetail.getTradeTime());
diffRecords.add(diffRecord);
continue;
}
// 如果远程和本地都存在, 比对差异
List<cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff> reconcileDiffs = this.reconcileDiff(outDetail, localTrade);
if (CollUtil.isNotEmpty(reconcileDiffs)) {
List<ReconcileDiffDetail> reconcileDiffDetails = this.reconcileDiff(outDetail, localTrade);
if (CollUtil.isNotEmpty(reconcileDiffDetails)) {
ReconcileDiff diffRecord = new ReconcileDiff()
.setReconcileId(reconcileOrder.getId())
.setReconcileNo(reconcileOrder.getReconcileNo())
.setReconcileDate(reconcileOrder.getDate())
.setDetailId(outDetail.getId())
.setDiffType(ReconcileDiffTypeEnum.NOT_MATCH.getCode())
.setTradeNo(outDetail.getTradeNo())
.setTitle(outDetail.getTitle())
.setOrderType(outDetail.getType())
.setOutOrderNo(outDetail.getOutTradeNo())
.setTradeType(outDetail.getType())
.setOutTradeNo(outDetail.getOutTradeNo())
.setOutAmount(outDetail.getAmount())
.setAmount(localTrade.getAmount())
.setDiffs(reconcileDiffs)
.setChannel(reconcileOrder.getChannel())
.setDiffs(reconcileDiffDetails)
.setTradeTime(outDetail.getTradeTime());
diffRecords.add(diffRecord);
}
@@ -148,11 +152,13 @@ public class ReconcileAssistService {
.setDiffType(ReconcileDiffTypeEnum.LOCAL_NOT_EXISTS.getCode())
.setTradeNo(localTrade.getTradeNo())
.setReconcileId(reconcileOrder.getId())
.setDetailId(null)
.setReconcileNo(reconcileOrder.getReconcileNo())
.setReconcileDate(reconcileOrder.getDate())
.setTitle(localTrade.getTitle())
.setOrderType(localTrade.getType())
.setOutOrderNo(localTrade.getOutTradeNo())
.setTradeType(localTrade.getType())
.setOutTradeNo(localTrade.getOutTradeNo())
.setAmount(localTrade.getAmount())
.setChannel(reconcileOrder.getChannel())
.setTradeTime(localTrade.getFinishTime());
diffRecords.add(diffRecord);
log.info("远程订单不存在: {}", localTrade.getTradeNo());
@@ -167,35 +173,34 @@ public class ReconcileAssistService {
* @param outDetail 下载的对账订单
* @param localTrade 本地交易订单
*/
private List<cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff> reconcileDiff(ReconcileTradeDetail outDetail, GeneralTradeInfo localTrade){
List<cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff> diffs = new ArrayList<>();
private List<ReconcileDiffDetail> reconcileDiff(ReconcileTradeDetail outDetail, GeneralTradeInfo localTrade){
List<ReconcileDiffDetail> diffs = new ArrayList<>();
// 判断类型是否相同
if (Objects.equals(outDetail.getType(), ReconcileTradeEnum.PAY.getCode())
&& !Objects.equals(localTrade.getType(), PaymentTypeEnum.PAY.getCode())){
log.warn("订单类型不一致: {},{}", outDetail.getType(), localTrade.getType());
diffs.add(new cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff().setFieldName("订单类型").setLocalValue(outDetail.getType()).setOutValue(localTrade.getType()));
diffs.add(new ReconcileDiffDetail().setFieldName("订单类型").setLocalValue(outDetail.getType()).setOutValue(localTrade.getType()));
}
if (Objects.equals(outDetail.getType(), ReconcileTradeEnum.REFUND.getCode())
&& !Objects.equals(localTrade.getType(), PaymentTypeEnum.REFUND.getCode())){
log.warn("订单类型不一致: {},{}", outDetail.getType(), localTrade.getType());
diffs.add(new cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff().setFieldName("订单类型").setLocalValue(outDetail.getType()).setOutValue(localTrade.getType()));
diffs.add(new ReconcileDiffDetail().setFieldName("订单类型").setLocalValue(outDetail.getType()).setOutValue(localTrade.getType()));
}
// 判断名称是否一致
if (!Objects.equals(outDetail.getTitle(), localTrade.getTitle())){
log.warn("订单名称不一致: {},{}", outDetail.getTitle(), localTrade.getTitle());
diffs.add(new cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff().setFieldName("订单名称").setLocalValue(outDetail.getTitle()).setOutValue(localTrade.getTitle()));
diffs.add(new ReconcileDiffDetail().setFieldName("订单名称").setLocalValue(outDetail.getTitle()).setOutValue(localTrade.getTitle()));
}
// 判断金额是否一致
if (!Objects.equals(outDetail.getAmount(), localTrade.getAmount())){
log.warn("订单金额不一致: {},{}", outDetail.getAmount(), localTrade.getAmount());
diffs.add(new cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiff().setFieldName("订单金额")
diffs.add(new ReconcileDiffDetail().setFieldName("订单金额")
.setLocalValue(String.valueOf(outDetail.getAmount()))
.setOutValue(String.valueOf(localTrade.getAmount())));
}
return diffs;
}
}

View File

@@ -7,12 +7,12 @@ import cn.bootx.platform.daxpay.service.code.ReconcileFileTypeEnum;
import cn.bootx.platform.daxpay.service.code.ReconcileResultEnum;
import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal;
import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileFileManager;
import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileTradeDetailManager;
import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileOrderManager;
import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileFile;
import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileTradeDetail;
import cn.bootx.platform.daxpay.service.core.order.reconcile.dao.ReconcileTradeDetailManager;
import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileDiff;
import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileFile;
import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileOrder;
import cn.bootx.platform.daxpay.service.core.order.reconcile.entity.ReconcileTradeDetail;
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.GeneralTradeInfo;
@@ -223,19 +223,24 @@ public class ReconcileService {
/**
* 下载基于原始交易对账单数据转换的对账单文件, 例如csv, json方式
*/
public void downOriginal2Csv(Long id){
@SneakyThrows
public ResponseEntity<byte[]> downOriginal2Csv(Long id){
ReconcileOrder reconcileOrder = reconcileOrderService.findById(id)
.orElseThrow(() -> new DataNotExistException("未找到对账订单"));
// 查询对账-第三方交易明细
List<ReconcileTradeDetail> reconcileTradeDetails = reconcileTradeDetailManager.findAllByReconcileId(reconcileOrder.getId());
// 转换为csv文件
return null;
}
/**
* 下载对账单(本系统中的订单)
*/
public void downLocal(Long id){
@SneakyThrows
public ResponseEntity<byte[]> downLocal(Long id){
return null;
}
}

View File

@@ -1,15 +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.PayChannelEnum;
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 cn.bootx.platform.daxpay.service.core.payment.reconcile.domain.ReconcileDiffDetail;
import cn.bootx.table.modify.annotation.DbColumn;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@@ -38,7 +40,7 @@ public class ReconcileDiffDto extends BaseDto {
/** 对账日期 */
@Schema(description = "对账日期")
private LocalDateTime reconcileDate;
private LocalDate reconcileDate;
/** 本地交易号 */
@Schema(description = "本地交易号")
@@ -46,7 +48,7 @@ public class ReconcileDiffDto extends BaseDto {
/** 外部交易号 */
@Schema(description = "外部交易号")
private String outOrderNo;
private String outTradeNo;
/** 交易时间 */
@Schema(description = "交易时间")
@@ -56,6 +58,13 @@ public class ReconcileDiffDto extends BaseDto {
@Schema(description = "订单标题")
private String title;
/**
* 通道
* @see PayChannelEnum
*/
@Schema(description = "通道")
private String channel;
/** 交易金额 */
@Schema(description = "交易金额")
private Integer amount;
@@ -81,8 +90,8 @@ public class ReconcileDiffDto extends BaseDto {
/**
* 差异内容, 存储json字符串, 格式为
* {属性: '标题', 本地字段值:'标题1', 网关字段值: '标题2'}
* @see ReconcileDiff
* @see ReconcileDiffDetail
*/
@Schema(description = "差异内容")
private List<ReconcileDiff> diffs;
private List<ReconcileDiffDetail> diffs;
}

View File

@@ -1,8 +1,10 @@
package cn.bootx.platform.daxpay.service.param.reconcile;
import cn.bootx.platform.common.core.rest.param.QueryOrder;
import cn.bootx.platform.daxpay.code.PayChannelEnum;
import cn.bootx.platform.daxpay.code.ReconcileTradeEnum;
import cn.bootx.platform.daxpay.service.code.ReconcileDiffTypeEnum;
import cn.bootx.table.modify.annotation.DbColumn;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -19,13 +21,9 @@ import lombok.experimental.Accessors;
@Schema(title = "对账差异查询参数")
public class ReconcileDiffQuery extends QueryOrder {
/** 对账单ID */
@Schema(description = "对账单ID")
private Long reconcileId;
/** 对账单明细ID */
@Schema(description = "对账单明细ID")
private Long detailId;
/** 对账 */
@DbColumn(comment = "对账")
private String reconcileNo;
/** 本地交易号 */
@Schema(description = "本地交易号")
@@ -33,18 +31,25 @@ public class ReconcileDiffQuery extends QueryOrder {
/** 外部交易号 */
@Schema(description = "外部交易号")
private String outOrderNo;
private String outTradeNo;
/** 订单标题 */
@Schema(description = "订单标题")
private String title;
/**
* 通道
* @see PayChannelEnum
*/
@Schema(description = "通道")
private String channel;
/**
* 对账订单类型
* @see ReconcileTradeEnum
*/
@Schema(description = "对账订单类型")
private String orderType;
private String tradeType;
/**
* 差异类型