mirror of
https://gitee.com/dromara/dax-pay.git
synced 2025-09-09 22:09:05 +00:00
ref 对账差异明细
This commit is contained in:
@@ -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>>() {};
|
||||
}
|
||||
}
|
||||
|
@@ -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() {
|
||||
|
@@ -10,7 +10,7 @@ import lombok.experimental.Accessors;
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ReconcileDiff {
|
||||
public class ReconcileDiffDetail {
|
||||
|
||||
/** 字段名 */
|
||||
private String fieldName;
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
/**
|
||||
* 差异类型
|
||||
|
Reference in New Issue
Block a user