mirror of
https://gitee.com/dromara/dax-pay.git
synced 2025-09-08 05:27:59 +00:00
feat 同步支付通道记录功能和支付相关功能调整
This commit is contained in:
@@ -10,7 +10,7 @@ import lombok.Getter;
|
|||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum CashrRecordTypeEnum {
|
public enum CashRecordTypeEnum {
|
||||||
|
|
||||||
/** 支付 */
|
/** 支付 */
|
||||||
PAY("pay", "支付"),
|
PAY("pay", "支付"),
|
||||||
@@ -19,10 +19,7 @@ public enum CashrRecordTypeEnum {
|
|||||||
REFUND("refund", "退款"),
|
REFUND("refund", "退款"),
|
||||||
|
|
||||||
/** 支付关闭 */
|
/** 支付关闭 */
|
||||||
CLOSE_PAY("close_pay", "支付关闭"),
|
CLOSE_PAY("close_pay", "支付关闭");
|
||||||
|
|
||||||
/** 退款关闭 */
|
|
||||||
CLOSE_REFUND("close_refund", "退款关闭");
|
|
||||||
|
|
||||||
private final String code;
|
private final String code;
|
||||||
private final String name;
|
private final String name;
|
@@ -22,10 +22,7 @@ public enum VoucherRecordTypeEnum {
|
|||||||
REFUND("refund", "退款"),
|
REFUND("refund", "退款"),
|
||||||
|
|
||||||
/** 支付关闭 */
|
/** 支付关闭 */
|
||||||
CLOSE_PAY("close_pay", "支付关闭"),
|
CLOSE_PAY("close_pay", "支付关闭");
|
||||||
|
|
||||||
/** 退款关闭 */
|
|
||||||
CLOSE_REFUND("close_refund", "退款关闭");
|
|
||||||
|
|
||||||
private final String code;
|
private final String code;
|
||||||
private final String name;
|
private final String name;
|
||||||
|
@@ -15,6 +15,12 @@ public enum WalletRecordTypeEnum {
|
|||||||
/** 创建 */
|
/** 创建 */
|
||||||
CREATE("create", "创建"),
|
CREATE("create", "创建"),
|
||||||
|
|
||||||
|
/** 余额充值 */
|
||||||
|
RECHARGE("recharge", "充值"),
|
||||||
|
|
||||||
|
/** 余额扣减 */
|
||||||
|
DEDUCT("deduct", "扣减"),
|
||||||
|
|
||||||
/** 支付 */
|
/** 支付 */
|
||||||
PAY("pay", "支付"),
|
PAY("pay", "支付"),
|
||||||
|
|
||||||
@@ -22,10 +28,7 @@ public enum WalletRecordTypeEnum {
|
|||||||
REFUND("refund", "退款"),
|
REFUND("refund", "退款"),
|
||||||
|
|
||||||
/** 支付关闭 */
|
/** 支付关闭 */
|
||||||
CLOSE_PAY("close_pay", "支付关闭"),
|
CLOSE_PAY("close_pay", "支付关闭");
|
||||||
|
|
||||||
/** 退款关闭 */
|
|
||||||
CLOSE_REFUND("close_refund", "退款关闭");
|
|
||||||
|
|
||||||
private final String code;
|
private final String code;
|
||||||
private final String name;
|
private final String name;
|
||||||
|
@@ -2,7 +2,7 @@ package cn.bootx.platform.daxpay.service.core.channel.cash.entity;
|
|||||||
|
|
||||||
import cn.bootx.platform.common.core.function.EntityBaseFunction;
|
import cn.bootx.platform.common.core.function.EntityBaseFunction;
|
||||||
import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity;
|
import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity;
|
||||||
import cn.bootx.platform.daxpay.service.code.VoucherRecordTypeEnum;
|
import cn.bootx.platform.daxpay.service.code.CashRecordTypeEnum;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.cash.convert.CashPayConfigConvert;
|
import cn.bootx.platform.daxpay.service.core.channel.cash.convert.CashPayConfigConvert;
|
||||||
import cn.bootx.platform.daxpay.service.dto.channel.cash.CashRecordDto;
|
import cn.bootx.platform.daxpay.service.dto.channel.cash.CashRecordDto;
|
||||||
import cn.bootx.table.modify.annotation.DbColumn;
|
import cn.bootx.table.modify.annotation.DbColumn;
|
||||||
@@ -24,7 +24,7 @@ public class CashRecord extends MpCreateEntity implements EntityBaseFunction<Cas
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 业务类型
|
* 业务类型
|
||||||
* @see VoucherRecordTypeEnum
|
* @see CashRecordTypeEnum
|
||||||
*/
|
*/
|
||||||
@DbColumn(comment = "业务类型")
|
@DbColumn(comment = "业务类型")
|
||||||
private String type;
|
private String type;
|
||||||
|
@@ -3,8 +3,11 @@ package cn.bootx.platform.daxpay.service.core.channel.cash.service;
|
|||||||
import cn.bootx.platform.common.core.rest.PageResult;
|
import cn.bootx.platform.common.core.rest.PageResult;
|
||||||
import cn.bootx.platform.common.core.rest.param.PageParam;
|
import cn.bootx.platform.common.core.rest.param.PageParam;
|
||||||
import cn.bootx.platform.common.mybatisplus.util.MpUtil;
|
import cn.bootx.platform.common.mybatisplus.util.MpUtil;
|
||||||
|
import cn.bootx.platform.daxpay.service.code.CashRecordTypeEnum;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.cash.dao.CashRecordManager;
|
import cn.bootx.platform.daxpay.service.core.channel.cash.dao.CashRecordManager;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.cash.entity.CashRecord;
|
import cn.bootx.platform.daxpay.service.core.channel.cash.entity.CashRecord;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder;
|
||||||
import cn.bootx.platform.daxpay.service.dto.channel.cash.CashRecordDto;
|
import cn.bootx.platform.daxpay.service.dto.channel.cash.CashRecordDto;
|
||||||
import cn.bootx.platform.daxpay.service.param.channel.cash.CashRecordQuery;
|
import cn.bootx.platform.daxpay.service.param.channel.cash.CashRecordQuery;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -21,19 +24,53 @@ import org.springframework.stereotype.Service;
|
|||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class CashRecordService {
|
public class CashRecordService {
|
||||||
private final CashRecordManager manager;
|
private final CashRecordManager cashRecordManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支付保存
|
||||||
|
*/
|
||||||
|
public void pay(PayChannelOrder channelOrder){
|
||||||
|
CashRecord record = new CashRecord()
|
||||||
|
.setType(CashRecordTypeEnum.PAY.getCode())
|
||||||
|
.setAmount(channelOrder.getAmount())
|
||||||
|
.setOrderId(String.valueOf(channelOrder.getPaymentId()));
|
||||||
|
cashRecordManager.save(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款保存
|
||||||
|
*/
|
||||||
|
public void refund(PayRefundChannelOrder channelOrder){
|
||||||
|
CashRecord record = new CashRecord()
|
||||||
|
.setType(CashRecordTypeEnum.REFUND.getCode())
|
||||||
|
.setAmount(channelOrder.getAmount())
|
||||||
|
.setOrderId(String.valueOf(channelOrder.getRefundId()));
|
||||||
|
cashRecordManager.save(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支付关闭
|
||||||
|
*/
|
||||||
|
public void payClose(PayChannelOrder channelOrder){
|
||||||
|
CashRecord record = new CashRecord()
|
||||||
|
.setType(CashRecordTypeEnum.CLOSE_PAY.getCode())
|
||||||
|
.setAmount(channelOrder.getAmount())
|
||||||
|
.setOrderId(String.valueOf(channelOrder.getPaymentId()));
|
||||||
|
cashRecordManager.save(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询
|
* 分页查询
|
||||||
*/
|
*/
|
||||||
public PageResult<CashRecordDto> page(PageParam pageParam, CashRecordQuery param) {
|
public PageResult<CashRecordDto> page(PageParam pageParam, CashRecordQuery param) {
|
||||||
return MpUtil.convert2DtoPageResult(manager.page(pageParam, param));
|
return MpUtil.convert2DtoPageResult(cashRecordManager.page(pageParam, param));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询详情
|
* 查询详情
|
||||||
*/
|
*/
|
||||||
public CashRecordDto findById(Long id){
|
public CashRecordDto findById(Long id){
|
||||||
return manager.findById(id).map(CashRecord::toDto).orElseGet(CashRecordDto::new);
|
return cashRecordManager.findById(id).map(CashRecord::toDto).orElseGet(CashRecordDto::new);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,6 @@ import cn.bootx.platform.daxpay.param.channel.VoucherPayParam;
|
|||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.dao.VoucherManager;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.dao.VoucherManager;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
||||||
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
|
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
|
||||||
import cn.hutool.core.util.StrUtil;
|
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -27,20 +26,6 @@ public class VoucherPayService {
|
|||||||
|
|
||||||
private final VoucherQueryService voucherQueryService;
|
private final VoucherQueryService voucherQueryService;
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取并检查储值卡
|
|
||||||
*/
|
|
||||||
public Voucher getAndCheckVoucher(VoucherPayParam voucherPayParam) {
|
|
||||||
String cardNo = voucherPayParam.getCardNo();
|
|
||||||
Voucher voucher = voucherManager.findByCardNo(cardNo).orElseThrow(()->new PayFailureException("储值卡不存在"));
|
|
||||||
|
|
||||||
// 卡信息校验
|
|
||||||
String timeCheck = voucherQueryService.check(voucher);
|
|
||||||
if (StrUtil.isNotBlank(timeCheck)) {
|
|
||||||
throw new PayFailureException(timeCheck);
|
|
||||||
}
|
|
||||||
return voucher;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付
|
* 支付
|
||||||
@@ -70,11 +55,7 @@ public class VoucherPayService {
|
|||||||
* 退款
|
* 退款
|
||||||
*/
|
*/
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void refund(PayChannelOrder channelOrder, int amount) {
|
public void refund(int amount, Voucher voucher) {
|
||||||
String channelExtra = channelOrder.getChannelExtra();
|
|
||||||
VoucherPayParam voucherPayParam = JSONUtil.toBean(channelExtra, VoucherPayParam.class);
|
|
||||||
Voucher voucher = voucherManager.findByCardNo(voucherPayParam.getCardNo())
|
|
||||||
.orElseThrow(() -> new PayFailureException("储值卡不存在"));
|
|
||||||
voucher.setBalance(voucher.getBalance()+amount);
|
voucher.setBalance(voucher.getBalance()+amount);
|
||||||
voucherManager.updateById(voucher);
|
voucherManager.updateById(voucher);
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ import cn.bootx.platform.common.core.rest.param.PageParam;
|
|||||||
import cn.bootx.platform.common.core.util.LocalDateTimeUtil;
|
import cn.bootx.platform.common.core.util.LocalDateTimeUtil;
|
||||||
import cn.bootx.platform.common.mybatisplus.util.MpUtil;
|
import cn.bootx.platform.common.mybatisplus.util.MpUtil;
|
||||||
import cn.bootx.platform.daxpay.exception.pay.PayFailureException;
|
import cn.bootx.platform.daxpay.exception.pay.PayFailureException;
|
||||||
|
import cn.bootx.platform.daxpay.param.channel.VoucherPayParam;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.dao.VoucherManager;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.dao.VoucherManager;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
||||||
import cn.bootx.platform.daxpay.service.dto.channel.voucher.VoucherDto;
|
import cn.bootx.platform.daxpay.service.dto.channel.voucher.VoucherDto;
|
||||||
@@ -53,6 +54,30 @@ public class VoucherQueryService {
|
|||||||
.orElseThrow(() -> new DataNotExistException("储值卡不存在"));
|
.orElseThrow(() -> new DataNotExistException("储值卡不存在"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据卡号查询
|
||||||
|
*/
|
||||||
|
public Voucher getVoucherByCardNo(String cardNo) {
|
||||||
|
return voucherManager.findByCardNo(cardNo)
|
||||||
|
.orElseThrow(() -> new DataNotExistException("储值卡不存在"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取并检查储值卡
|
||||||
|
*/
|
||||||
|
public Voucher getAndCheckVoucher(VoucherPayParam voucherPayParam) {
|
||||||
|
String cardNo = voucherPayParam.getCardNo();
|
||||||
|
Voucher voucher = voucherManager.findByCardNo(cardNo).orElseThrow(()->new PayFailureException("储值卡不存在"));
|
||||||
|
|
||||||
|
// 卡信息校验
|
||||||
|
String timeCheck = this.check(voucher);
|
||||||
|
if (StrUtil.isNotBlank(timeCheck)) {
|
||||||
|
throw new PayFailureException(timeCheck);
|
||||||
|
}
|
||||||
|
return voucher;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断卡号是否存在
|
* 判断卡号是否存在
|
||||||
*/
|
*/
|
||||||
|
@@ -3,8 +3,12 @@ package cn.bootx.platform.daxpay.service.core.channel.voucher.service;
|
|||||||
import cn.bootx.platform.common.core.rest.PageResult;
|
import cn.bootx.platform.common.core.rest.PageResult;
|
||||||
import cn.bootx.platform.common.core.rest.param.PageParam;
|
import cn.bootx.platform.common.core.rest.param.PageParam;
|
||||||
import cn.bootx.platform.common.mybatisplus.util.MpUtil;
|
import cn.bootx.platform.common.mybatisplus.util.MpUtil;
|
||||||
|
import cn.bootx.platform.daxpay.service.code.VoucherRecordTypeEnum;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.dao.VoucherRecordManager;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.dao.VoucherRecordManager;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.VoucherRecord;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.VoucherRecord;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder;
|
||||||
import cn.bootx.platform.daxpay.service.dto.channel.voucher.VoucherRecordDto;
|
import cn.bootx.platform.daxpay.service.dto.channel.voucher.VoucherRecordDto;
|
||||||
import cn.bootx.platform.daxpay.service.param.channel.voucher.VoucherRecordQuery;
|
import cn.bootx.platform.daxpay.service.param.channel.voucher.VoucherRecordQuery;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -22,6 +26,61 @@ import org.springframework.stereotype.Service;
|
|||||||
public class VoucherRecordService {
|
public class VoucherRecordService {
|
||||||
private final VoucherRecordManager manager;
|
private final VoucherRecordManager manager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入保存
|
||||||
|
*/
|
||||||
|
public void importVoucher(Voucher voucher){
|
||||||
|
VoucherRecord voucherRecord = new VoucherRecord()
|
||||||
|
.setType(VoucherRecordTypeEnum.IMPORT.getCode())
|
||||||
|
.setAmount(voucher.getBalance())
|
||||||
|
.setNewAmount(voucher.getBalance())
|
||||||
|
.setOldAmount(0)
|
||||||
|
.setVoucherId(voucher.getId());
|
||||||
|
manager.save(voucherRecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支付保存
|
||||||
|
*/
|
||||||
|
public void pay(PayChannelOrder channelOrder, Voucher voucher){
|
||||||
|
VoucherRecord voucherRecord = new VoucherRecord()
|
||||||
|
.setType(VoucherRecordTypeEnum.PAY.getCode())
|
||||||
|
.setAmount(channelOrder.getAmount())
|
||||||
|
.setNewAmount(voucher.getBalance())
|
||||||
|
.setOldAmount(voucher.getBalance() - channelOrder.getAmount())
|
||||||
|
.setOrderId(String.valueOf(channelOrder.getPaymentId()))
|
||||||
|
.setVoucherId(voucher.getId());
|
||||||
|
manager.save(voucherRecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款保存
|
||||||
|
*/
|
||||||
|
public void refund(PayRefundChannelOrder channelOrder, Voucher voucher){
|
||||||
|
VoucherRecord voucherRecord = new VoucherRecord()
|
||||||
|
.setType(VoucherRecordTypeEnum.REFUND.getCode())
|
||||||
|
.setAmount(channelOrder.getAmount())
|
||||||
|
.setNewAmount(voucher.getBalance())
|
||||||
|
.setOldAmount(voucher.getBalance() + channelOrder.getAmount())
|
||||||
|
.setOrderId(String.valueOf(channelOrder.getRefundId()))
|
||||||
|
.setVoucherId(voucher.getId());
|
||||||
|
manager.save(voucherRecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支付关闭
|
||||||
|
*/
|
||||||
|
public void payClose(PayChannelOrder channelOrder, Voucher voucher){
|
||||||
|
VoucherRecord voucherRecord = new VoucherRecord()
|
||||||
|
.setType(VoucherRecordTypeEnum.CLOSE_PAY.getCode())
|
||||||
|
.setAmount(channelOrder.getAmount())
|
||||||
|
.setNewAmount(voucher.getBalance())
|
||||||
|
.setOldAmount(voucher.getBalance() - channelOrder.getAmount())
|
||||||
|
.setOrderId(String.valueOf(channelOrder.getPaymentId()))
|
||||||
|
.setVoucherId(voucher.getId());
|
||||||
|
manager.save(voucherRecord);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询
|
* 分页查询
|
||||||
|
@@ -28,6 +28,8 @@ public class VoucherService {
|
|||||||
|
|
||||||
private final VoucherManager voucherManager;
|
private final VoucherManager voucherManager;
|
||||||
|
|
||||||
|
private final VoucherRecordService recordService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导入
|
* 导入
|
||||||
*/
|
*/
|
||||||
@@ -39,6 +41,7 @@ public class VoucherService {
|
|||||||
throw new BizException("储值卡已存在");
|
throw new BizException("储值卡已存在");
|
||||||
}
|
}
|
||||||
voucherManager.save(voucher);
|
voucherManager.save(voucher);
|
||||||
|
recordService.importVoucher(voucher);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1,18 +1,13 @@
|
|||||||
package cn.bootx.platform.daxpay.service.core.channel.wallet.service;
|
package cn.bootx.platform.daxpay.service.core.channel.wallet.service;
|
||||||
|
|
||||||
import cn.bootx.platform.common.core.exception.DataNotExistException;
|
|
||||||
import cn.bootx.platform.daxpay.param.channel.WalletPayParam;
|
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.wallet.dao.WalletManager;
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.dao.WalletManager;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.Wallet;
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.Wallet;
|
||||||
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
|
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
|
||||||
import cn.hutool.json.JSONUtil;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 钱包支付操作
|
* 钱包支付操作
|
||||||
*
|
*
|
||||||
@@ -49,23 +44,9 @@ public class WalletPayService {
|
|||||||
* 退款
|
* 退款
|
||||||
*/
|
*/
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void refund(PayChannelOrder channelOrder, int amount) {
|
public void refund(Wallet wallet, int amount) {
|
||||||
// 从通道扩展参数中取出钱包参数
|
|
||||||
String channelExtra = channelOrder.getChannelExtra();
|
|
||||||
WalletPayParam walletPayParam = JSONUtil.toBean(channelExtra, WalletPayParam.class);
|
|
||||||
|
|
||||||
// 获取钱包
|
|
||||||
Wallet wallet = null;
|
|
||||||
if (Objects.nonNull(walletPayParam.getWalletId())){
|
|
||||||
wallet = walletManager.findById(walletPayParam.getWalletId()).orElseThrow(DataNotExistException::new);
|
|
||||||
}
|
|
||||||
if (Objects.nonNull(walletPayParam.getUserId())){
|
|
||||||
wallet = walletManager.findByUser(walletPayParam.getUserId()).orElseThrow(DataNotExistException::new);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将金额退款到钱包中
|
// 将金额退款到钱包中
|
||||||
wallet.setBalance(wallet.getBalance() + amount);
|
wallet.setBalance(wallet.getBalance() + amount);
|
||||||
walletManager.updateById(wallet);
|
walletManager.updateById(wallet);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -4,6 +4,7 @@ import cn.bootx.platform.common.core.exception.DataNotExistException;
|
|||||||
import cn.bootx.platform.common.core.rest.PageResult;
|
import cn.bootx.platform.common.core.rest.PageResult;
|
||||||
import cn.bootx.platform.common.core.rest.param.PageParam;
|
import cn.bootx.platform.common.core.rest.param.PageParam;
|
||||||
import cn.bootx.platform.common.mybatisplus.util.MpUtil;
|
import cn.bootx.platform.common.mybatisplus.util.MpUtil;
|
||||||
|
import cn.bootx.platform.daxpay.service.code.WalletRecordTypeEnum;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.wallet.dao.WalletRecordManager;
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.dao.WalletRecordManager;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.Wallet;
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.Wallet;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.WalletRecord;
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.WalletRecord;
|
||||||
@@ -25,13 +26,13 @@ import org.springframework.stereotype.Service;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class WalletRecordService {
|
public class WalletRecordService {
|
||||||
private final WalletRecordManager walletRecordManager;
|
private final WalletRecordManager walletRecordManager;
|
||||||
private final WalletQueryService walletQueryService;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建保存
|
* 创建保存
|
||||||
*/
|
*/
|
||||||
public void create(Wallet wallet){
|
public void create(Wallet wallet){
|
||||||
WalletRecord walletRecord = new WalletRecord()
|
WalletRecord walletRecord = new WalletRecord()
|
||||||
|
.setType(WalletRecordTypeEnum.CREATE.getCode())
|
||||||
.setAmount(wallet.getBalance())
|
.setAmount(wallet.getBalance())
|
||||||
.setNewAmount(wallet.getBalance())
|
.setNewAmount(wallet.getBalance())
|
||||||
.setOldAmount(0)
|
.setOldAmount(0)
|
||||||
@@ -39,11 +40,38 @@ public class WalletRecordService {
|
|||||||
walletRecordManager.save(walletRecord);
|
walletRecordManager.save(walletRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 充值保存
|
||||||
|
*/
|
||||||
|
public void recharge(Wallet wallet, int amount){
|
||||||
|
WalletRecord walletRecord = new WalletRecord()
|
||||||
|
.setType(WalletRecordTypeEnum.RECHARGE.getCode())
|
||||||
|
.setAmount(wallet.getBalance())
|
||||||
|
.setNewAmount(wallet.getBalance())
|
||||||
|
.setOldAmount(wallet.getBalance() + amount)
|
||||||
|
.setWalletId(wallet.getId());
|
||||||
|
walletRecordManager.save(walletRecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扣减保存
|
||||||
|
*/
|
||||||
|
public void deduct(Wallet wallet, int amount){
|
||||||
|
WalletRecord walletRecord = new WalletRecord()
|
||||||
|
.setType(WalletRecordTypeEnum.DEDUCT.getCode())
|
||||||
|
.setWalletId(wallet.getId())
|
||||||
|
.setAmount(wallet.getBalance())
|
||||||
|
.setNewAmount(wallet.getBalance())
|
||||||
|
.setOldAmount(wallet.getBalance() + amount);
|
||||||
|
walletRecordManager.save(walletRecord);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付保存
|
* 支付保存
|
||||||
*/
|
*/
|
||||||
public void pay(PayChannelOrder channelOrder, Wallet wallet){
|
public void pay(PayChannelOrder channelOrder, Wallet wallet){
|
||||||
WalletRecord walletRecord = new WalletRecord()
|
WalletRecord walletRecord = new WalletRecord()
|
||||||
|
.setType(WalletRecordTypeEnum.PAY.getCode())
|
||||||
.setAmount(channelOrder.getAmount())
|
.setAmount(channelOrder.getAmount())
|
||||||
.setNewAmount(wallet.getBalance())
|
.setNewAmount(wallet.getBalance())
|
||||||
.setOldAmount(wallet.getBalance() - channelOrder.getAmount())
|
.setOldAmount(wallet.getBalance() - channelOrder.getAmount())
|
||||||
@@ -57,6 +85,7 @@ public class WalletRecordService {
|
|||||||
*/
|
*/
|
||||||
public void refund(PayRefundChannelOrder channelOrder, Wallet wallet){
|
public void refund(PayRefundChannelOrder channelOrder, Wallet wallet){
|
||||||
WalletRecord walletRecord = new WalletRecord()
|
WalletRecord walletRecord = new WalletRecord()
|
||||||
|
.setType(WalletRecordTypeEnum.REFUND.getCode())
|
||||||
.setAmount(channelOrder.getAmount())
|
.setAmount(channelOrder.getAmount())
|
||||||
.setNewAmount(wallet.getBalance())
|
.setNewAmount(wallet.getBalance())
|
||||||
.setOldAmount(wallet.getBalance() + channelOrder.getAmount())
|
.setOldAmount(wallet.getBalance() + channelOrder.getAmount())
|
||||||
@@ -70,6 +99,7 @@ public class WalletRecordService {
|
|||||||
*/
|
*/
|
||||||
public void payClose(PayChannelOrder channelOrder, Wallet wallet){
|
public void payClose(PayChannelOrder channelOrder, Wallet wallet){
|
||||||
WalletRecord walletRecord = new WalletRecord()
|
WalletRecord walletRecord = new WalletRecord()
|
||||||
|
.setType(WalletRecordTypeEnum.CLOSE_PAY.getCode())
|
||||||
.setAmount(channelOrder.getAmount())
|
.setAmount(channelOrder.getAmount())
|
||||||
.setNewAmount(wallet.getBalance())
|
.setNewAmount(wallet.getBalance())
|
||||||
.setOldAmount(wallet.getBalance() - channelOrder.getAmount())
|
.setOldAmount(wallet.getBalance() - channelOrder.getAmount())
|
||||||
@@ -78,19 +108,6 @@ public class WalletRecordService {
|
|||||||
walletRecordManager.save(walletRecord);
|
walletRecordManager.save(walletRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 退款关闭
|
|
||||||
*/
|
|
||||||
public void refundClose(PayRefundChannelOrder channelOrder, Wallet wallet){
|
|
||||||
WalletRecord walletRecord = new WalletRecord()
|
|
||||||
.setAmount(channelOrder.getAmount())
|
|
||||||
.setNewAmount(wallet.getBalance())
|
|
||||||
.setOldAmount(wallet.getBalance() - channelOrder.getAmount())
|
|
||||||
.setOrderId(String.valueOf(channelOrder.getRefundId()))
|
|
||||||
.setWalletId(wallet.getId());
|
|
||||||
walletRecordManager.save(walletRecord);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页
|
* 分页
|
||||||
*/
|
*/
|
||||||
|
@@ -25,6 +25,7 @@ import java.util.Objects;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class WalletService {
|
public class WalletService {
|
||||||
private final WalletManager walletManager;
|
private final WalletManager walletManager;
|
||||||
|
private final WalletRecordService walletRecordService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建钱包操作,默认为启用状态, 不传输余额则默认为0
|
* 创建钱包操作,默认为启用状态, 不传输余额则默认为0
|
||||||
@@ -79,6 +80,7 @@ public class WalletService {
|
|||||||
}
|
}
|
||||||
wallet.setBalance(wallet.getBalance() + param.getAmount());
|
wallet.setBalance(wallet.getBalance() + param.getAmount());
|
||||||
walletManager.updateById(wallet);
|
walletManager.updateById(wallet);
|
||||||
|
walletRecordService.recharge(wallet, param.getAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -98,5 +100,6 @@ public class WalletService {
|
|||||||
}
|
}
|
||||||
wallet.setBalance(wallet.getBalance() - param.getAmount());
|
wallet.setBalance(wallet.getBalance() - param.getAmount());
|
||||||
walletManager.updateById(wallet);
|
walletManager.updateById(wallet);
|
||||||
|
walletRecordService.deduct(wallet, param.getAmount());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,13 @@
|
|||||||
package cn.bootx.platform.daxpay.service.core.payment.close.strategy;
|
package cn.bootx.platform.daxpay.service.core.payment.close.strategy;
|
||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
|
import cn.bootx.platform.daxpay.param.channel.VoucherPayParam;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherPayService;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherPayService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherQueryService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsPayCloseStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsPayCloseStrategy;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
@@ -23,17 +28,33 @@ public class VoucherPayCloseStrategy extends AbsPayCloseStrategy {
|
|||||||
|
|
||||||
private final VoucherPayService voucherPayService;
|
private final VoucherPayService voucherPayService;
|
||||||
|
|
||||||
|
private final VoucherRecordService voucherRecordService;
|
||||||
|
|
||||||
|
private final VoucherQueryService voucherQueryService;
|
||||||
|
|
||||||
|
private Voucher voucher;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PayChannelEnum getChannel() {
|
public PayChannelEnum getChannel() {
|
||||||
return PayChannelEnum.VOUCHER;
|
return PayChannelEnum.VOUCHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭前的处理方式
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doBeforeCloseHandler() {
|
||||||
|
String channelExtra = this.getChannelOrder().getChannelExtra();
|
||||||
|
VoucherPayParam params = JSONUtil.toBean(channelExtra, VoucherPayParam.class);
|
||||||
|
this.voucher = voucherQueryService.getVoucherByCardNo(params.getCardNo());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 关闭操作
|
* 关闭操作
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doCloseHandler() {
|
public void doCloseHandler() {
|
||||||
voucherPayService.close(this.getChannelOrder());
|
voucherPayService.close(this.getChannelOrder());
|
||||||
|
voucherRecordService.payClose(this.getChannelOrder(),this.voucher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@ package cn.bootx.platform.daxpay.service.core.payment.pay.strategy;
|
|||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
import cn.bootx.platform.daxpay.exception.pay.PayAmountAbnormalException;
|
import cn.bootx.platform.daxpay.exception.pay.PayAmountAbnormalException;
|
||||||
import cn.bootx.platform.daxpay.param.pay.PayChannelParam;
|
import cn.bootx.platform.daxpay.param.pay.PayChannelParam;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.cash.service.CashRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsPayStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsPayStrategy;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -23,6 +24,8 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class CashPayStrategy extends AbsPayStrategy {
|
public class CashPayStrategy extends AbsPayStrategy {
|
||||||
|
|
||||||
|
private final CashRecordService cashRecordService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 现金支付
|
* 现金支付
|
||||||
*/
|
*/
|
||||||
@@ -48,7 +51,7 @@ public class CashPayStrategy extends AbsPayStrategy {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doPayHandler() {
|
public void doPayHandler() {
|
||||||
// 不需要做处理,
|
cashRecordService.pay(this.getChannelOrder());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -5,6 +5,8 @@ import cn.bootx.platform.daxpay.exception.pay.PayFailureException;
|
|||||||
import cn.bootx.platform.daxpay.param.channel.VoucherPayParam;
|
import cn.bootx.platform.daxpay.param.channel.VoucherPayParam;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherPayService;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherPayService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherQueryService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsPayStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsPayStrategy;
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
@@ -32,6 +34,10 @@ public class VoucherPayStrategy extends AbsPayStrategy {
|
|||||||
|
|
||||||
private final VoucherPayService voucherPayService;
|
private final VoucherPayService voucherPayService;
|
||||||
|
|
||||||
|
private final VoucherQueryService voucherQueryService;
|
||||||
|
|
||||||
|
private final VoucherRecordService voucherRecordService;
|
||||||
|
|
||||||
private Voucher voucher;
|
private Voucher voucher;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -57,7 +63,7 @@ public class VoucherPayStrategy extends AbsPayStrategy {
|
|||||||
catch (JSONException e) {
|
catch (JSONException e) {
|
||||||
throw new PayFailureException("储值卡支付参数错误");
|
throw new PayFailureException("储值卡支付参数错误");
|
||||||
}
|
}
|
||||||
this.voucher = voucherPayService.getAndCheckVoucher(voucherPayParam);
|
this.voucher = voucherQueryService.getAndCheckVoucher(voucherPayParam);
|
||||||
// 金额是否满足
|
// 金额是否满足
|
||||||
if (this.getPayChannelParam().getAmount() > this.voucher.getBalance()) {
|
if (this.getPayChannelParam().getAmount() > this.voucher.getBalance()) {
|
||||||
throw new PayFailureException("储值卡余额不足");
|
throw new PayFailureException("储值卡余额不足");
|
||||||
@@ -70,6 +76,7 @@ public class VoucherPayStrategy extends AbsPayStrategy {
|
|||||||
@Override
|
@Override
|
||||||
public void doPayHandler() {
|
public void doPayHandler() {
|
||||||
voucherPayService.pay(this.getPayChannelParam().getAmount(), this.voucher);
|
voucherPayService.pay(this.getPayChannelParam().getAmount(), this.voucher);
|
||||||
|
voucherRecordService.pay(this.getChannelOrder(), this.voucher);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,9 @@
|
|||||||
package cn.bootx.platform.daxpay.service.core.payment.refund.strategy;
|
package cn.bootx.platform.daxpay.service.core.payment.refund.strategy;
|
||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
|
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.code.RefundStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.cash.service.CashRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsRefundStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsRefundStrategy;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
@@ -17,6 +20,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
|
|||||||
@Component
|
@Component
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class CashPayRefundStrategy extends AbsRefundStrategy {
|
public class CashPayRefundStrategy extends AbsRefundStrategy {
|
||||||
|
private final CashRecordService cashRecordService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 策略标识
|
* 策略标识
|
||||||
@@ -26,11 +30,30 @@ public class CashPayRefundStrategy extends AbsRefundStrategy {
|
|||||||
return PayChannelEnum.CASH;
|
return PayChannelEnum.CASH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退款, 不需要进行操作
|
* 退款操作
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doRefundHandler() {
|
public void doRefundHandler() {
|
||||||
|
// 不包含异步支付
|
||||||
|
if (!this.getPayOrder().isAsyncPay()){
|
||||||
|
cashRecordService.refund(this.getRefundChannelOrder());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款发起成功操作
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doSuccessHandler() {
|
||||||
|
// 包含异步支付, 变更状态到退款中
|
||||||
|
if (this.getPayOrder().isAsyncPay()) {
|
||||||
|
this.getPayChannelOrder().setStatus(PayStatusEnum.REFUNDING.getCode());
|
||||||
|
this.getRefundChannelOrder().setStatus(RefundStatusEnum.PROGRESS.getCode());
|
||||||
|
} else{
|
||||||
|
// 同步支付, 直接标识状态为退款完成
|
||||||
|
super.doSuccessHandler();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,15 @@
|
|||||||
package cn.bootx.platform.daxpay.service.core.payment.refund.strategy;
|
package cn.bootx.platform.daxpay.service.core.payment.refund.strategy;
|
||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
|
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.code.RefundStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.param.channel.VoucherPayParam;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherPayService;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherPayService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherQueryService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsRefundStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsRefundStrategy;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -20,6 +27,12 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
|
|||||||
public class VoucherPayRefundStrategy extends AbsRefundStrategy {
|
public class VoucherPayRefundStrategy extends AbsRefundStrategy {
|
||||||
private final VoucherPayService voucherPayService;
|
private final VoucherPayService voucherPayService;
|
||||||
|
|
||||||
|
private final VoucherQueryService voucherQueryService;
|
||||||
|
|
||||||
|
private final VoucherRecordService voucherRecordService;
|
||||||
|
|
||||||
|
private Voucher voucher;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 策略标识
|
* 策略标识
|
||||||
*
|
*
|
||||||
@@ -30,12 +43,46 @@ public class VoucherPayRefundStrategy extends AbsRefundStrategy {
|
|||||||
return PayChannelEnum.VOUCHER;
|
return PayChannelEnum.VOUCHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款前对处理
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doBeforeRefundHandler() {
|
||||||
|
// 从通道扩展参数中取出钱包参数
|
||||||
|
if (!this.getPayOrder().isAsyncPay()) {
|
||||||
|
String channelExtra = this.getPayChannelOrder().getChannelExtra();
|
||||||
|
VoucherPayParam voucherPayParam = JSONUtil.toBean(channelExtra, VoucherPayParam.class);
|
||||||
|
this.voucher = voucherQueryService.getVoucherByCardNo(voucherPayParam.getCardNo());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退款
|
* 退款
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doRefundHandler() {
|
public void doRefundHandler() {
|
||||||
voucherPayService.refund(this.getPayChannelOrder(), this.getRefundChannelParam().getAmount());
|
// 不包含异步支付
|
||||||
|
if (!this.getPayOrder().isAsyncPay()){
|
||||||
|
voucherPayService.refund(this.getRefundChannelParam().getAmount(), this.voucher);
|
||||||
|
voucherRecordService.refund(this.getRefundChannelOrder(), this.voucher);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款发起成功操作, 异步支付通道需要进行重写
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doSuccessHandler() {
|
||||||
|
// 包含异步支付, 变更状态到退款中
|
||||||
|
if (this.getPayOrder().isAsyncPay()) {
|
||||||
|
this.getPayChannelOrder().setStatus(PayStatusEnum.REFUNDING.getCode());
|
||||||
|
this.getRefundChannelOrder().setStatus(RefundStatusEnum.PROGRESS.getCode());
|
||||||
|
} else{
|
||||||
|
// 同步支付, 直接标识状态为退款完成
|
||||||
|
super.doSuccessHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,15 @@
|
|||||||
package cn.bootx.platform.daxpay.service.core.payment.refund.strategy;
|
package cn.bootx.platform.daxpay.service.core.payment.refund.strategy;
|
||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
|
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.code.RefundStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.param.channel.WalletPayParam;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.Wallet;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletPayService;
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletPayService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletQueryService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsRefundStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsRefundStrategy;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -18,7 +25,15 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
|
|||||||
@Component
|
@Component
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class WalletPayRefundStrategy extends AbsRefundStrategy {
|
public class WalletPayRefundStrategy extends AbsRefundStrategy {
|
||||||
|
|
||||||
private final WalletPayService walletPayService;
|
private final WalletPayService walletPayService;
|
||||||
|
|
||||||
|
private final WalletRecordService walletRecordService;
|
||||||
|
|
||||||
|
private final WalletQueryService walletQueryService;
|
||||||
|
|
||||||
|
private Wallet wallet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 策略标识
|
* 策略标识
|
||||||
*
|
*
|
||||||
@@ -30,10 +45,42 @@ public class WalletPayRefundStrategy extends AbsRefundStrategy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退款
|
* 退款前对处理
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doBeforeRefundHandler() {
|
||||||
|
// 从通道扩展参数中取出钱包参数
|
||||||
|
if (!this.getPayOrder().isAsyncPay()) {
|
||||||
|
String channelExtra = this.getPayChannelOrder().getChannelExtra();
|
||||||
|
WalletPayParam walletPayParam = JSONUtil.toBean(channelExtra, WalletPayParam.class);
|
||||||
|
this.wallet = walletQueryService.getWallet(walletPayParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款操作
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doRefundHandler() {
|
public void doRefundHandler() {
|
||||||
walletPayService.refund(this.getPayChannelOrder(), this.getRefundChannelParam().getAmount());
|
// 不包含异步支付
|
||||||
|
if (!this.getPayOrder().isAsyncPay()){
|
||||||
|
walletPayService.refund(this.wallet, this.getRefundChannelParam().getAmount());
|
||||||
|
walletRecordService.refund(this.getRefundChannelOrder(), this.wallet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款发起成功操作, 异步支付通道需要进行重写
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doSuccessHandler() {
|
||||||
|
// 包含异步支付, 变更状态到退款中
|
||||||
|
if (this.getPayOrder().isAsyncPay()) {
|
||||||
|
this.getPayChannelOrder().setStatus(PayStatusEnum.REFUNDING.getCode());
|
||||||
|
this.getRefundChannelOrder().setStatus(RefundStatusEnum.PROGRESS.getCode());
|
||||||
|
} else{
|
||||||
|
// 同步支付, 直接标识状态为退款完成
|
||||||
|
super.doSuccessHandler();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -97,7 +97,6 @@ public class RefundRepairService {
|
|||||||
// 退款修复记录
|
// 退款修复记录
|
||||||
PayRepairRecord refundRepairRecord = this.refundRepairRecord(refundOrder, repairType, repairResult);
|
PayRepairRecord refundRepairRecord = this.refundRepairRecord(refundOrder, repairType, repairResult);
|
||||||
recordService.saveAllRecord(Arrays.asList(payRepairRecord, refundRepairRecord));
|
recordService.saveAllRecord(Arrays.asList(payRepairRecord, refundRepairRecord));
|
||||||
|
|
||||||
return repairResult;
|
return repairResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@ package cn.bootx.platform.daxpay.service.core.payment.repair.strategy.pay;
|
|||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.cash.service.CashRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsPayRepairStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsPayRepairStrategy;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -21,7 +22,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class CashPayRepairStrategy extends AbsPayRepairStrategy {
|
public class CashPayRepairStrategy extends AbsPayRepairStrategy {
|
||||||
|
|
||||||
|
private final CashRecordService cashRecordService;
|
||||||
/**
|
/**
|
||||||
* 策略标识
|
* 策略标识
|
||||||
*/
|
*/
|
||||||
@@ -31,10 +32,11 @@ public class CashPayRepairStrategy extends AbsPayRepairStrategy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 取消支付
|
* 关闭支付
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doCloseLocalHandler() {
|
public void doCloseLocalHandler() {
|
||||||
this.getChannelOrder().setStatus(PayStatusEnum.CLOSE.getCode());
|
this.getChannelOrder().setStatus(PayStatusEnum.CLOSE.getCode());
|
||||||
|
cashRecordService.payClose(this.getChannelOrder());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,8 +2,13 @@ package cn.bootx.platform.daxpay.service.core.payment.repair.strategy.pay;
|
|||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.param.channel.VoucherPayParam;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherPayService;
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherPayService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherQueryService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsPayRepairStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsPayRepairStrategy;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
@@ -23,6 +28,12 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
|
|||||||
public class VoucherPayRepairStrategy extends AbsPayRepairStrategy {
|
public class VoucherPayRepairStrategy extends AbsPayRepairStrategy {
|
||||||
private final VoucherPayService voucherPayService;
|
private final VoucherPayService voucherPayService;
|
||||||
|
|
||||||
|
private final VoucherRecordService voucherRecordService;
|
||||||
|
|
||||||
|
private final VoucherQueryService voucherQueryService;
|
||||||
|
|
||||||
|
private Voucher voucher;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 策略标识
|
* 策略标识
|
||||||
@@ -32,12 +43,24 @@ public class VoucherPayRepairStrategy extends AbsPayRepairStrategy {
|
|||||||
return PayChannelEnum.VOUCHER;
|
return PayChannelEnum.VOUCHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 取消支付
|
* 关闭前的处理方式
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doBeforeHandler() {
|
||||||
|
String channelExtra = this.getChannelOrder().getChannelExtra();
|
||||||
|
VoucherPayParam params = JSONUtil.toBean(channelExtra, VoucherPayParam.class);
|
||||||
|
this.voucher = voucherQueryService.getVoucherByCardNo(params.getCardNo());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭本地支付订单
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doCloseLocalHandler() {
|
public void doCloseLocalHandler() {
|
||||||
voucherPayService.close(this.getChannelOrder());
|
voucherPayService.close(this.getChannelOrder());
|
||||||
|
voucherRecordService.payClose(this.getChannelOrder(), this.voucher);
|
||||||
this.getChannelOrder().setStatus(PayStatusEnum.CLOSE.getCode());
|
this.getChannelOrder().setStatus(PayStatusEnum.CLOSE.getCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,8 +2,13 @@ package cn.bootx.platform.daxpay.service.core.payment.repair.strategy.pay;
|
|||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.param.channel.WalletPayParam;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.Wallet;
|
||||||
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletPayService;
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletPayService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletQueryService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsPayRepairStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsPayRepairStrategy;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
@@ -24,6 +29,12 @@ public class WalletPayRepairStrategy extends AbsPayRepairStrategy {
|
|||||||
|
|
||||||
private final WalletPayService walletPayService;
|
private final WalletPayService walletPayService;
|
||||||
|
|
||||||
|
private final WalletQueryService walletQueryService;
|
||||||
|
|
||||||
|
private final WalletRecordService walletRecordService;
|
||||||
|
|
||||||
|
private Wallet wallet;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 策略标识
|
* 策略标识
|
||||||
@@ -34,11 +45,23 @@ public class WalletPayRepairStrategy extends AbsPayRepairStrategy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 取消支付
|
* 修复前处理
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doBeforeHandler() {
|
||||||
|
// 从通道扩展参数中取出钱包参数
|
||||||
|
String channelExtra = this.getChannelOrder().getChannelExtra();
|
||||||
|
WalletPayParam walletPayParam = JSONUtil.toBean(channelExtra, WalletPayParam.class);
|
||||||
|
this.wallet = walletQueryService.getWallet(walletPayParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭支付, 将订单的金额退还到钱包中
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doCloseLocalHandler() {
|
public void doCloseLocalHandler() {
|
||||||
walletPayService.close(this.getChannelOrder());
|
walletPayService.close(this.getChannelOrder(),this.wallet);
|
||||||
|
walletRecordService.payClose(this.getChannelOrder(),this.wallet);
|
||||||
this.getChannelOrder().setStatus(PayStatusEnum.CLOSE.getCode());
|
this.getChannelOrder().setStatus(PayStatusEnum.CLOSE.getCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package cn.bootx.platform.daxpay.service.core.payment.repair.strategy.refund;
|
package cn.bootx.platform.daxpay.service.core.payment.repair.strategy.refund;
|
||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.cash.service.CashRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsRefundRepairStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsRefundRepairStrategy;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -10,7 +11,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
|
import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* 现金退款修复策略
|
||||||
* @author xxm
|
* @author xxm
|
||||||
* @since 2024/1/30
|
* @since 2024/1/30
|
||||||
*/
|
*/
|
||||||
@@ -19,6 +20,8 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
|
|||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class CashRefundRepairStrategy extends AbsRefundRepairStrategy {
|
public class CashRefundRepairStrategy extends AbsRefundRepairStrategy {
|
||||||
|
private final CashRecordService cashRecordService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 策略标识
|
* 策略标识
|
||||||
*/
|
*/
|
||||||
@@ -26,4 +29,12 @@ public class CashRefundRepairStrategy extends AbsRefundRepairStrategy {
|
|||||||
public PayChannelEnum getChannel() {
|
public PayChannelEnum getChannel() {
|
||||||
return PayChannelEnum.CASH;
|
return PayChannelEnum.CASH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款成功修复
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doSuccessHandler() {
|
||||||
|
cashRecordService.refund(this.getRefundChannelOrder());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,13 @@
|
|||||||
package cn.bootx.platform.daxpay.service.core.payment.repair.strategy.refund;
|
package cn.bootx.platform.daxpay.service.core.payment.repair.strategy.refund;
|
||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
|
import cn.bootx.platform.daxpay.param.channel.VoucherPayParam;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.entity.Voucher;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherPayService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherQueryService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.voucher.service.VoucherRecordService;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsRefundRepairStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsRefundRepairStrategy;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
@@ -19,6 +25,14 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
|
|||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class VoucherRefundRepairStrategy extends AbsRefundRepairStrategy {
|
public class VoucherRefundRepairStrategy extends AbsRefundRepairStrategy {
|
||||||
|
private final VoucherQueryService voucherQueryService;
|
||||||
|
|
||||||
|
private final VoucherRecordService voucherRecordService;
|
||||||
|
|
||||||
|
private final VoucherPayService voucherPayService;
|
||||||
|
|
||||||
|
private Voucher voucher;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 策略标识
|
* 策略标识
|
||||||
*/
|
*/
|
||||||
@@ -26,4 +40,23 @@ public class VoucherRefundRepairStrategy extends AbsRefundRepairStrategy {
|
|||||||
public PayChannelEnum getChannel() {
|
public PayChannelEnum getChannel() {
|
||||||
return PayChannelEnum.VOUCHER;
|
return PayChannelEnum.VOUCHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修复前处理
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doBeforeHandler() {
|
||||||
|
String channelExtra = this.getPayChannelOrder().getChannelExtra();
|
||||||
|
VoucherPayParam params = JSONUtil.toBean(channelExtra, VoucherPayParam.class);
|
||||||
|
this.voucher = voucherQueryService.getVoucherByCardNo(params.getCardNo());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款成功修复
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doSuccessHandler() {
|
||||||
|
voucherPayService.refund(this.getPayChannelOrder().getAmount(), this.voucher);
|
||||||
|
voucherRecordService.refund(this.getRefundChannelOrder(), this.voucher);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,16 +1,28 @@
|
|||||||
package cn.bootx.platform.daxpay.service.core.payment.repair.strategy.refund;
|
package cn.bootx.platform.daxpay.service.core.payment.repair.strategy.refund;
|
||||||
|
|
||||||
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
import cn.bootx.platform.daxpay.code.PayChannelEnum;
|
||||||
|
import cn.bootx.platform.daxpay.code.PayStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.code.RefundStatusEnum;
|
||||||
|
import cn.bootx.platform.daxpay.param.channel.WalletPayParam;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.entity.Wallet;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletPayService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletQueryService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.channel.wallet.service.WalletRecordService;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
|
||||||
|
import cn.bootx.platform.daxpay.service.core.order.refund.entity.PayRefundChannelOrder;
|
||||||
import cn.bootx.platform.daxpay.service.func.AbsRefundRepairStrategy;
|
import cn.bootx.platform.daxpay.service.func.AbsRefundRepairStrategy;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
|
import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* 钱包退款订单修复策略
|
||||||
* @author xxm
|
* @author xxm
|
||||||
* @since 2024/1/30
|
* @since 2024/1/30
|
||||||
*/
|
*/
|
||||||
@@ -19,6 +31,15 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
|
|||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class WalletRefundRepairStrategy extends AbsRefundRepairStrategy {
|
public class WalletRefundRepairStrategy extends AbsRefundRepairStrategy {
|
||||||
|
|
||||||
|
private final WalletPayService walletPayService;
|
||||||
|
|
||||||
|
private final WalletRecordService walletRecordService;
|
||||||
|
|
||||||
|
private final WalletQueryService walletQueryService;
|
||||||
|
|
||||||
|
private Wallet wallet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 策略标识
|
* 策略标识
|
||||||
*/
|
*/
|
||||||
@@ -26,4 +47,36 @@ public class WalletRefundRepairStrategy extends AbsRefundRepairStrategy {
|
|||||||
public PayChannelEnum getChannel() {
|
public PayChannelEnum getChannel() {
|
||||||
return PayChannelEnum.WALLET;
|
return PayChannelEnum.WALLET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修复前处理
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doBeforeHandler() {
|
||||||
|
// 从通道扩展参数中取出钱包参数
|
||||||
|
String channelExtra = this.getPayChannelOrder().getChannelExtra();
|
||||||
|
WalletPayParam walletPayParam = JSONUtil.toBean(channelExtra, WalletPayParam.class);
|
||||||
|
this.wallet = walletQueryService.getWallet(walletPayParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款成功修复, 只有异步支付的退款才会执行到这
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doSuccessHandler() {
|
||||||
|
PayChannelOrder payChannelOrder = this.getPayChannelOrder();
|
||||||
|
PayRefundChannelOrder refundChannelOrder = this.getRefundChannelOrder();
|
||||||
|
// 判断是全部退款还是部分退款
|
||||||
|
if (Objects.equals(payChannelOrder.getRefundableBalance(), 0)){
|
||||||
|
//全部退款
|
||||||
|
payChannelOrder.setStatus(PayStatusEnum.REFUNDED.getCode());
|
||||||
|
} else {
|
||||||
|
// 部分退款
|
||||||
|
payChannelOrder.setStatus(PayStatusEnum.PARTIAL_REFUND.getCode());
|
||||||
|
}
|
||||||
|
refundChannelOrder.setStatus(RefundStatusEnum.SUCCESS.getCode());
|
||||||
|
// 退款真正执行和保存
|
||||||
|
walletPayService.refund(this.wallet, this.getRefundChannelOrder().getAmount());
|
||||||
|
walletRecordService.refund(this.getRefundChannelOrder(), this.wallet);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,6 @@ import java.time.LocalDateTime;
|
|||||||
@Setter
|
@Setter
|
||||||
public abstract class AbsPayStrategy implements PayStrategy{
|
public abstract class AbsPayStrategy implements PayStrategy{
|
||||||
|
|
||||||
|
|
||||||
/** 支付订单 */
|
/** 支付订单 */
|
||||||
private PayOrder order = null;
|
private PayOrder order = null;
|
||||||
|
|
||||||
|
@@ -11,7 +11,7 @@ import lombok.Getter;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付退款修复策略
|
* 支付退款修复策略, 只要异步支付订单的退款才会有修复选项
|
||||||
* @author xxm
|
* @author xxm
|
||||||
* @since 2024/1/25
|
* @since 2024/1/25
|
||||||
*/
|
*/
|
||||||
@@ -22,6 +22,12 @@ public abstract class AbsRefundRepairStrategy implements PayStrategy{
|
|||||||
private PayOrder payOrder;
|
private PayOrder payOrder;
|
||||||
private PayChannelOrder payChannelOrder;
|
private PayChannelOrder payChannelOrder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修复前处理
|
||||||
|
*/
|
||||||
|
public void doBeforeHandler() {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 初始化参数
|
* 初始化参数
|
||||||
*/
|
*/
|
||||||
@@ -35,7 +41,6 @@ public abstract class AbsRefundRepairStrategy implements PayStrategy{
|
|||||||
this.payChannelOrder = payChannelOrder;
|
this.payChannelOrder = payChannelOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退款成功修复
|
* 退款成功修复
|
||||||
*/
|
*/
|
||||||
@@ -43,15 +48,15 @@ public abstract class AbsRefundRepairStrategy implements PayStrategy{
|
|||||||
PayChannelOrder payChannelOrder = this.getPayChannelOrder();
|
PayChannelOrder payChannelOrder = this.getPayChannelOrder();
|
||||||
PayRefundChannelOrder refundChannelOrder = this.getRefundChannelOrder();
|
PayRefundChannelOrder refundChannelOrder = this.getRefundChannelOrder();
|
||||||
|
|
||||||
// 判断是全部退款还是部分退款
|
// 判断是全部退款还是部分退款, 更新订单状态
|
||||||
if (Objects.equals(payChannelOrder.getRefundableBalance(), 0)){
|
if (Objects.equals(payChannelOrder.getRefundableBalance(), 0)){
|
||||||
//全部退款
|
//全部退款
|
||||||
payChannelOrder.setStatus(PayStatusEnum.REFUNDED.getCode());
|
payChannelOrder.setStatus(PayStatusEnum.REFUNDED.getCode());
|
||||||
} else {
|
} else {
|
||||||
// 部分退款
|
// 部分退款
|
||||||
payChannelOrder.setStatus(PayStatusEnum.PARTIAL_REFUND.getCode());
|
payChannelOrder.setStatus(PayStatusEnum.PARTIAL_REFUND.getCode());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// 退款订单状态
|
||||||
refundChannelOrder.setStatus(RefundStatusEnum.SUCCESS.getCode());
|
refundChannelOrder.setStatus(RefundStatusEnum.SUCCESS.getCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,18 +68,16 @@ public abstract class AbsRefundRepairStrategy implements PayStrategy{
|
|||||||
PayRefundChannelOrder refundChannelOrder = this.getRefundChannelOrder();
|
PayRefundChannelOrder refundChannelOrder = this.getRefundChannelOrder();
|
||||||
int refundableBalance = payChannelOrder.getRefundableBalance() + payChannelOrder.getAmount();
|
int refundableBalance = payChannelOrder.getRefundableBalance() + payChannelOrder.getAmount();
|
||||||
payChannelOrder.setRefundableBalance(refundableBalance);
|
payChannelOrder.setRefundableBalance(refundableBalance);
|
||||||
// 判断是支付完成还是部分退款
|
// 判断是支付完成还是部分退款, 修改支付订单状态
|
||||||
if (Objects.equals(payChannelOrder.getRefundableBalance(), payChannelOrder.getAmount())){
|
if (Objects.equals(payChannelOrder.getRefundableBalance(), payChannelOrder.getAmount())){
|
||||||
// 全部退款
|
// 全部退款
|
||||||
payChannelOrder.setStatus(PayStatusEnum.SUCCESS.getCode());
|
payChannelOrder.setStatus(PayStatusEnum.SUCCESS.getCode());
|
||||||
} else {
|
} else {
|
||||||
// 部分退款
|
// 部分退款
|
||||||
payChannelOrder.setStatus(PayStatusEnum.PARTIAL_REFUND.getCode());
|
payChannelOrder.setStatus(PayStatusEnum.PARTIAL_REFUND.getCode());
|
||||||
|
|
||||||
}
|
}
|
||||||
// 如果失败, 可退余额设置为null
|
// 如果失败, 可退余额设置为null
|
||||||
refundChannelOrder.setRefundableAmount(null);
|
refundChannelOrder.setRefundableAmount(null).setStatus(RefundStatusEnum.CLOSE.getCode());
|
||||||
refundChannelOrder.setStatus(RefundStatusEnum.CLOSE.getCode());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -72,19 +72,21 @@ public abstract class AbsRefundStrategy implements PayStrategy{
|
|||||||
public abstract void doRefundHandler();
|
public abstract void doRefundHandler();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退款发起成功操作, 异步支付通道需要进行重写
|
* 退款发起成功操作
|
||||||
*/
|
*/
|
||||||
public void doSuccessHandler() {
|
public void doSuccessHandler() {
|
||||||
// 更新退款订单数据状态和完成时间
|
// 更新退款订单数据状态和完成时间
|
||||||
this.refundChannelOrder
|
this.getRefundChannelOrder()
|
||||||
.setStatus(RefundStatusEnum.SUCCESS.getCode()).
|
.setStatus(RefundStatusEnum.SUCCESS.getCode())
|
||||||
setRefundTime(LocalDateTime.now());
|
.setRefundTime(LocalDateTime.now());
|
||||||
|
|
||||||
// 支付通道订单可退余额
|
// 支付通道订单可退余额
|
||||||
int refundableBalance = this.getPayChannelOrder().getRefundableBalance() - this.refundChannelOrder.getAmount();
|
int refundableBalance = this.getPayChannelOrder()
|
||||||
|
.getRefundableBalance() - this.getRefundChannelOrder().getAmount();
|
||||||
// 如果可退金额为0说明已经全部退款
|
// 如果可退金额为0说明已经全部退款
|
||||||
PayStatusEnum status = refundableBalance == 0 ? PayStatusEnum.REFUNDED : PayStatusEnum.PARTIAL_REFUND;
|
PayStatusEnum status = refundableBalance == 0 ? PayStatusEnum.REFUNDED : PayStatusEnum.PARTIAL_REFUND;
|
||||||
this.payChannelOrder.setRefundableBalance(refundableBalance)
|
this.getPayChannelOrder()
|
||||||
|
.setRefundableBalance(refundableBalance)
|
||||||
.setStatus(status.getCode());
|
.setStatus(status.getCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user