|
@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
import com.yonge.cooleshow.mall.common.api.CommonPage;
|
|
|
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
|
|
|
import com.yonge.cooleshow.mall.common.exception.Asserts;
|
|
|
import com.yonge.cooleshow.mall.common.service.RedisService;
|
|
|
import com.yonge.cooleshow.mbg.mapper.*;
|
|
@@ -24,13 +25,12 @@ import com.yonge.toolset.payment.base.enums.OpenEnum;
|
|
|
import com.yonge.toolset.payment.base.enums.PayChannelEnum;
|
|
|
import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
|
|
|
import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
|
|
|
-import com.yonge.toolset.payment.base.model.DeviceInfo;
|
|
|
-import com.yonge.toolset.payment.base.model.DivMember;
|
|
|
-import com.yonge.toolset.payment.base.model.OrderDetil;
|
|
|
-import com.yonge.toolset.payment.base.model.Payment;
|
|
|
+import com.yonge.toolset.payment.base.model.*;
|
|
|
import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
|
|
|
import com.yonge.toolset.payment.core.props.PaymentProperties;
|
|
|
import com.yonge.toolset.payment.core.service.PaymentClient;
|
|
|
+import com.yonge.toolset.payment.util.DistributedLock;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -42,6 +42,7 @@ import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -96,6 +97,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
@Autowired
|
|
|
private PmsProductMapper pmsProductMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private UserOrderRefundMapper userOrderRefundMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedissonClient redissonClient;
|
|
|
|
|
|
@Autowired
|
|
|
private PortalProductDao productDao;
|
|
@@ -347,11 +353,16 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
}
|
|
|
for (OmsOrderDetail timeOutOrder : timeOutOrders) {
|
|
|
|
|
|
- if (timeOutOrder.getStatus() == 0) {
|
|
|
- payingOrderHandle(timeOutOrder);
|
|
|
- } else if (timeOutOrder.getStatus() == 6) {
|
|
|
- cancelOrder(timeOutOrder.getId(), "超时取消", null);
|
|
|
- }
|
|
|
+ DistributedLock.of(redissonClient)
|
|
|
+ .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(timeOutOrder.getOrderSn())
|
|
|
+ , () -> {
|
|
|
+ if (timeOutOrder.getStatus() == 0) {
|
|
|
+ payingOrderHandle(timeOutOrder);
|
|
|
+ } else if (timeOutOrder.getStatus() == 6) {
|
|
|
+ cancelOrder(timeOutOrder.getId(), "超时取消", null);
|
|
|
+ }
|
|
|
+ }, 60L, TimeUnit.SECONDS);
|
|
|
+
|
|
|
}
|
|
|
return timeOutOrders.size();
|
|
|
}
|
|
@@ -687,9 +698,47 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
orderSuccess(detail, data, data.getId());
|
|
|
} else {
|
|
|
LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
|
|
|
+ LOG.warn("支付金额原路退回 {}", detail.getOrderSn());
|
|
|
+ orderRefund(userOrderPayment,data,detail);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 支付成功,业务退款
|
|
|
+ */
|
|
|
+ private void orderRefund(UserOrderPayment userOrderPayment,PaymentCallBack data,OmsOrder order) {
|
|
|
+ UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayOrderNo(userOrderPayment.getOrderNo());
|
|
|
+ if (userOrderRefund.getStatus().equals("succeeded")) {
|
|
|
+ LOG.warn("支付金额已退回退回");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ String orderSn = generateOrderSn(order);
|
|
|
+
|
|
|
+ RefundBill refundReq = new RefundBill(OpenEnum.valueOf(userOrderPayment.getOpenType()), PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
|
|
|
+ refundReq.setRefundNo(orderSn);
|
|
|
+ refundReq.setRefundAmt(new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
|
|
|
+
|
|
|
+ refundReq.setReason("支付超时,全额退回");
|
|
|
+ refundReq.setPaymentNo(userOrderPayment.getAdapayNo());
|
|
|
+ refundReq.setTradeNo(userOrderPayment.getTransNo());
|
|
|
+ refundReq.setOrderAmt(userOrderPayment.getPayAmt());
|
|
|
+ BaseResult<RefundBill> refundBillBaseResult = paymentClient.refundPayment(refundReq);
|
|
|
+ userOrderRefund = new UserOrderRefund();
|
|
|
+ userOrderRefund.setOrderNo(orderSn);
|
|
|
+ userOrderRefund.setPayTransNo(userOrderPayment.getTransNo());
|
|
|
+ userOrderRefund.setRefundAmt(userOrderPayment.getPayAmt());
|
|
|
+ userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
|
|
|
+ if (refundBillBaseResult.getStatus()) {
|
|
|
+ RefundBill refundBill = refundBillBaseResult.getData();
|
|
|
+ userOrderRefund.setRefundAmt(refundBill.getRefundAmt());
|
|
|
+ userOrderRefund.setStatus(TradeStatusEnum.pending.getCode());
|
|
|
+ } else {
|
|
|
+ userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
|
|
|
+ userOrderRefund.setPayFailMsg("退款失败:" + refundBillBaseResult.getMsg());
|
|
|
+ }
|
|
|
+ userOrderRefundMapper.insert(userOrderRefund);
|
|
|
+ }
|
|
|
/***
|
|
|
* 处理回调-支付失败
|
|
|
* @author liweifan
|