From c5a8b808c6c0ada7a82520c57bba76778a46f633 Mon Sep 17 00:00:00 2001 From: "autumn.g@foxmail.com" Date: Wed, 23 Aug 2023 16:26:02 +0800 Subject: [PATCH] update --- .../com/jsowell/service/OrderService.java | 37 ++++++++++++++----- .../common/constant/CacheConstants.java | 5 +++ .../common/enums/ykc/ReturnCodeEnum.java | 2 + .../adapay/response/AdapayBaseResponse.java | 8 ++++ .../impl/OrderBasicInfoServiceImpl.java | 37 ++++++++++--------- 5 files changed, 63 insertions(+), 26 deletions(-) diff --git a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java index ddd98e0bb..72192254a 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java @@ -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 payOccupyPileOrder(PayOrderDTO dto) { diff --git a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java index 3daa74823..9ad785573 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java +++ b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java @@ -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:"; diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java index 891803c2f..1a7c7f040 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java @@ -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 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/response/AdapayBaseResponse.java b/jsowell-pile/src/main/java/com/jsowell/adapay/response/AdapayBaseResponse.java index b44fbe38c..a1dfafe81 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/response/AdapayBaseResponse.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/response/AdapayBaseResponse.java @@ -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(); + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index ae70fa820..05bd4900f 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -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 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); + } } }