This commit is contained in:
2023-08-23 16:26:02 +08:00
parent 930486c5ff
commit c5a8b808c6
5 changed files with 63 additions and 26 deletions

View File

@@ -12,11 +12,13 @@ import com.google.common.collect.Sets;
import com.huifu.adapay.core.AdapayCore;
import com.huifu.adapay.core.util.AdapaySign;
import com.jsowell.adapay.response.PaymentReverseResponse;
import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.domain.vo.AuthorizedDeptVO;
import com.jsowell.common.core.domain.ykc.RealTimeMonitorData;
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.common.core.page.PageResponse;
import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.AcquirerEnum;
import com.jsowell.common.enums.InvoiceRecordEnum;
import com.jsowell.common.enums.MemberWalletEnum;
@@ -115,6 +117,9 @@ public class OrderService {
@Resource
private OrderPileOccupyService orderPileOccupyService;
@Resource
private RedisCache redisCache;
/**
* 生成订单
* @param dto
@@ -1126,15 +1131,20 @@ public class OrderService {
log.info("支付撤销成功 data:{}", JSON.toJSONString(data));
JSONObject jsonObject = JSON.parseObject(data);
JSONObject reason = jsonObject.getJSONObject("reason");
// if (ScenarioEnum.BALANCE.getValue().equals(reason.getString("scenarioType"))) {
// // 这笔支付订单原来是充值余额的,退款成功了,需要扣掉会员的本金金额
// UpdateMemberBalanceDTO dto = new UpdateMemberBalanceDTO();
// dto.setMemberId(reason.getString("memberId"));
// dto.setUpdatePrincipalBalance(new BigDecimal(jsonObject.getString("reverse_amt"))); // 更新会员本金金额,单位元
// dto.setType(MemberWalletEnum.TYPE_OUT.getValue());
// dto.setSubType(MemberWalletEnum.SUBTYPE_USER_REFUND.getValue());
// memberBasicInfoService.updateMemberBalance(dto);
// }
if (ScenarioEnum.BALANCE.getValue().equals(reason.getString("scenarioType"))) {
// 这笔支付订单原来是充值余额的,退款成功了,需要扣掉会员的本金金额
UpdateMemberBalanceDTO dto = new UpdateMemberBalanceDTO();
String memberId = reason.getString("memberId");
dto.setMemberId(memberId);
dto.setUpdatePrincipalBalance(new BigDecimal(jsonObject.getString("reverse_amt"))); // 更新会员本金金额,单位元
dto.setType(MemberWalletEnum.TYPE_OUT.getValue());
dto.setSubType(MemberWalletEnum.SUBTYPE_USER_REFUND.getValue());
memberBasicInfoService.updateMemberBalance(dto);
// 收到回调,删除缓存
String redisKey = CacheConstants.MEMBER_BALANCE_REFUNDS_ARE_IN_PROGRESS + memberId;
redisCache.deleteObject(redisKey);
}
}
@@ -1143,6 +1153,15 @@ public class OrderService {
*/
private void paymentReverseFailed(String data) {
log.info("支付撤销失败 data:{}", JSON.toJSONString(data));
JSONObject jsonObject = JSON.parseObject(data);
JSONObject reason = jsonObject.getJSONObject("reason");
if (ScenarioEnum.BALANCE.getValue().equals(reason.getString("scenarioType"))) {
String memberId = reason.getString("memberId");
// 收到回调,删除缓存
String redisKey = CacheConstants.MEMBER_BALANCE_REFUNDS_ARE_IN_PROGRESS + memberId;
redisCache.deleteObject(redisKey);
}
}
public Map<String, Object> payOccupyPileOrder(PayOrderDTO dto) {

View File

@@ -13,6 +13,8 @@ public class CacheConstants {
public static final int cache_expire_time_10m = cache_expire_time_1m * 10;
public static final int cache_expire_time_30m = cache_expire_time_1m * 30;
public static final int cache_expire_time_1h = cache_expire_time_1m * 60;
public static final int cache_expire_time_12h = cache_expire_time_1h * 12;
@@ -23,6 +25,9 @@ public class CacheConstants {
public static final String PUSH_STATION_CONNECTOR = "push_station_connector";
// 会员余额退款正在进行中
public static final String MEMBER_BALANCE_REFUNDS_ARE_IN_PROGRESS = "Member_Balance_Refunds_Are_In_Progress:";
public static final String PLATFORM_TESTER = "platform_tester:";
public static final String GET_PILE_MODEL_INFO_BY_MODEL_ID = "get_pile_model_info_by_model_id:";

View File

@@ -113,6 +113,8 @@ public enum ReturnCodeEnum {
CODE_ADAPAY_CONFIG_IS_NULL_ERROR("00100052", "获取支付配置信息异常"),
CODE_ORDER_HAS_BEEN_REFUNDED("00100053", "订单已退款请等待收单机构原路返回交易将在1-3个工作日完成感谢您的理解"),
CODE_BALANCE_REFUNDS_ARE_IN_PROGRESS_ERROR("00100054", "会员余额退款正在进行中,请稍后再试"),
/* 个人桩 start */

View File

@@ -27,4 +27,12 @@ public class AdapayBaseResponse {
public boolean isNotSuccess() {
return !isSuccess();
}
public boolean isFailed() {
return StringUtils.equals(status, AdapayStatusEnum.FAILED.getValue());
}
public boolean isNotFailed() {
return !isFailed();
}
}

View File

@@ -2349,7 +2349,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
PaymentReverseResponse response = adapayService.createPaymentReverseRequest(
paymentId, refundAmount, dto.getWechatAppId(), dto.getMemberId(), ScenarioEnum.ORDER.getValue(),
dto.getOrderCode());
if (response != null) {
if (response != null && response.isFailed()) {
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
BigDecimal reverseAmt = new BigDecimal(response.getReverse_amt());
// 更新此笔交易单的消费金额 = 支付金额 - 撤销金额
@@ -2370,6 +2370,12 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
@Override
public void refundBalanceWithAdapay(ApplyRefundDTO dto) {
String redisKey = CacheConstants.MEMBER_BALANCE_REFUNDS_ARE_IN_PROGRESS + dto.getMemberId();
String redisResult = redisCache.getCacheObject(redisKey);
if (StringUtils.isNotBlank(redisResult)) {
throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_REFUNDS_ARE_IN_PROGRESS_ERROR);
}
// 查会员余额
MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId());
if (memberVO == null) {
@@ -2383,14 +2389,6 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
throw new BusinessException(ReturnCodeEnum.CODE_REFUND_MEMBER_BALANCE_ERROR);
}
// 扣余额
UpdateMemberBalanceDTO updateMemberBalanceDTO = new UpdateMemberBalanceDTO();
updateMemberBalanceDTO.setMemberId(dto.getMemberId());
updateMemberBalanceDTO.setUpdatePrincipalBalance(refundAmount); // 更新会员本金金额,单位元
updateMemberBalanceDTO.setType(MemberWalletEnum.TYPE_OUT.getValue());
updateMemberBalanceDTO.setSubType(MemberWalletEnum.SUBTYPE_USER_REFUND.getValue());
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
// 查询用户充值余额订单 过滤掉已经退款的充值订单
List<BalanceDeductionAmountVO> list = calculateTheBalanceDeductionAmount(dto.getMemberId(), refundAmount);
for (BalanceDeductionAmountVO vo : list) {
@@ -2398,16 +2396,21 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
BigDecimal deductionAmount = vo.getDeductionAmount();
// 调汇付的交易撤销接口
adapayService.createPaymentReverseRequest(paymentId, deductionAmount, dto.getWechatAppId(),
PaymentReverseResponse paymentReverseRequest = adapayService.createPaymentReverseRequest(paymentId, deductionAmount, dto.getWechatAppId(),
dto.getMemberId(), ScenarioEnum.BALANCE.getValue(), null);
// 更新这笔交易的剩余金额
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
// 更新此笔交易单的退款金额 = 历史退款金额 + 退款金额
record.setRefundAmt(record.getRefundAmt().add(deductionAmount));
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
memberAdapayRecordService.updateByPrimaryKeySelective(record);
if (paymentReverseRequest != null && paymentReverseRequest.isNotFailed()) {
// 更新这笔交易的剩余金额
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
// 更新此笔交易单的退款金额 = 历史退款金额 + 退款金额
record.setRefundAmt(record.getRefundAmt().add(deductionAmount));
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
memberAdapayRecordService.updateByPrimaryKeySelective(record);
// 放缓存
redisCache.setCacheObject(redisKey, paymentReverseRequest, CacheConstants.cache_expire_time_30m);
}
}
}