|
@@ -2,8 +2,10 @@ package com.yonge.cooleshow.biz.dal.service.impl;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.*;
|
|
|
+import com.yonge.toolset.payment.base.model.callback.ExecutePaymentCallBack;
|
|
|
import com.yonge.toolset.payment.util.DistributedLock;
|
|
|
import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
|
|
|
import com.yonge.cooleshow.common.constant.SysConfigConstant;
|
|
@@ -120,7 +122,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
|
|
|
//视频课购买
|
|
|
orderSuccess.put(GoodTypeEnum.VIDEO, recordService::buyVideoCourseSuccess);
|
|
|
|
|
|
-
|
|
|
//曲目购买
|
|
|
orderSuccess.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetSuccess);
|
|
|
|
|
@@ -192,11 +193,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
|
|
|
&& !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
|
|
|
return HttpResponseResult.failed("订单已关闭");
|
|
|
}
|
|
|
- Boolean close = orderPaymentService.closePaymentAndReqOpen(payReq.getOrderNo(), "用户取消订单");
|
|
|
- if (close) {
|
|
|
- //关闭订单
|
|
|
- doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
|
|
|
- }
|
|
|
+ //关闭或完成订单
|
|
|
+ closeOrSuccessOrder(payReq.getOrderNo());
|
|
|
return HttpResponseResult.succeed(true);
|
|
|
}
|
|
|
|
|
@@ -259,6 +257,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
|
|
|
Long orderNo = idGeneratorService.generatorId("orderNo");
|
|
|
orderReq.setOrderNo(Long.toString(orderNo));
|
|
|
//验证参数,必须验证参数
|
|
|
+ BigDecimal actualPrice = BigDecimal.ZERO;
|
|
|
for (OrderReq.OrderReqInfo info : orderReq.getOrderInfos()) {
|
|
|
Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>> createFunction = orderCreate.get(info.getGoodType());
|
|
|
if (Objects.isNull(createFunction)) {
|
|
@@ -280,10 +279,18 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
|
|
|
BigDecimal couponAmount = BigDecimal.ZERO;
|
|
|
createRes.setActualPrice(createRes.getExpectPrice().subtract(couponAmount).setScale(2, RoundingMode.HALF_UP));
|
|
|
createRes.setCouponAmount(couponAmount);
|
|
|
+ //累计实际支付金额
|
|
|
+ actualPrice = actualPrice.add(createRes.getActualPrice());
|
|
|
|
|
|
info.setCreateRes(createRes);
|
|
|
}
|
|
|
|
|
|
+ //验证金额
|
|
|
+ if (actualPrice.setScale(2, RoundingMode.HALF_UP)
|
|
|
+ .compareTo(orderReq.getActualPrice().setScale(2, RoundingMode.HALF_UP)) != 0) {
|
|
|
+ return HttpResponseResult.failed("订单金额校验不通过");
|
|
|
+ }
|
|
|
+
|
|
|
//验证成功后,订单入库
|
|
|
UserOrderVo orderVo = insertOrder(orderReq);
|
|
|
|
|
@@ -322,12 +329,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
|
|
|
try {
|
|
|
return doOrderPay(payReq, detail);
|
|
|
} catch (BizException e) {
|
|
|
- //入订单付款表,同时修改订单状态
|
|
|
- doOrderCancel(detail, OrderStatusEnum.FAIL, e.getMessage());
|
|
|
return HttpResponseResult.failed(e.getMessage());
|
|
|
} catch (Exception e) {
|
|
|
- //入订单付款表,同时修改订单状态
|
|
|
- doOrderCancel(detail, OrderStatusEnum.FAIL, e.getMessage());
|
|
|
return HttpResponseResult.failed("付款失败");
|
|
|
}
|
|
|
}
|
|
@@ -370,6 +373,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
void pollingCancelOrder(String orderNo) {
|
|
|
+ closeOrSuccessOrder(orderNo);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void closeOrSuccessOrder(String orderNo) {
|
|
|
UserOrderVo detail = detail(orderNo, null);
|
|
|
if (null == detail) {
|
|
|
return;
|
|
@@ -388,11 +395,29 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
|
|
|
param.setId(detail.getTransNo());
|
|
|
param.setPaymentNo(detail.getPaymentNo());
|
|
|
BaseResult<Payment> res = paymentClient.queryPayment(param);
|
|
|
+ Payment queryPaymentData = res.getData();
|
|
|
+
|
|
|
//支付成功
|
|
|
- if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus())
|
|
|
+ if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(queryPaymentData.getStatus())
|
|
|
&& (OrderStatusEnum.WAIT_PAY.equals(detail.getStatus()) || OrderStatusEnum.PAYING.equals(detail.getStatus()))) {
|
|
|
//订单已经完成,则完成订单
|
|
|
orderSuccess(detail);
|
|
|
+ //付款单改为已完成状态
|
|
|
+ userOrderPayment.setTransNo(queryPaymentData.getId());
|
|
|
+ userOrderPayment.setStatus(TradeStatusEnum.succeeded);
|
|
|
+ userOrderPayment.setUpdateTime(new Date());
|
|
|
+ userOrderPayment.setArrivalTime(new Date());
|
|
|
+ userOrderPayment.setBackPayAmt(
|
|
|
+ new BigDecimal(queryPaymentData.getPayAmt()));
|
|
|
+
|
|
|
+ ExecutePaymentCallBack executePaymentCallBack = queryPaymentData.getExecutePaymentCallBack();
|
|
|
+ if (null != executePaymentCallBack) {
|
|
|
+ userOrderPayment.setArrivalTime(executePaymentCallBack.getTradeTime());
|
|
|
+ userOrderPayment.setBackPayAmt(
|
|
|
+ new BigDecimal(executePaymentCallBack.getPayAmt()));
|
|
|
+ userOrderPayment.setFeeAmt(new BigDecimal(executePaymentCallBack.getFeeAmt()));
|
|
|
+ }
|
|
|
+ orderPaymentService.updateById(userOrderPayment);
|
|
|
} else {
|
|
|
//关闭订单付款单
|
|
|
Boolean close = orderPaymentService.closePaymentAndReqOpen(orderNo, "订单超时");
|
|
@@ -401,21 +426,79 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
|
|
|
doOrderCancel(detail, OrderStatusEnum.CLOSE, "订单超时");
|
|
|
}
|
|
|
}
|
|
|
+ } else if (TradeStatusEnum.succeeded.equals(userOrderPayment.getStatus())) {
|
|
|
+ //订单已经完成,则完成订单
|
|
|
+ orderSuccess(detail);
|
|
|
+ } else if (TradeStatusEnum.failed.equals(userOrderPayment.getStatus())) {
|
|
|
+ //入订单付款表,同时修改订单状态
|
|
|
+ doOrderCancel(detail, OrderStatusEnum.FAIL, userOrderPayment.getPayFailMsg());
|
|
|
+ } else if (TradeStatusEnum.close.equals(userOrderPayment.getStatus())) {
|
|
|
+ //关闭订单
|
|
|
+ doOrderCancel(detail, OrderStatusEnum.CLOSE, "订单超时");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断订单是否完成,若订单已完成则完成订单
|
|
|
+ *
|
|
|
+ * @param orderNo
|
|
|
+ * @return 可以继续支付 true
|
|
|
+ */
|
|
|
+ private Boolean checkAndSuccessOrder(String orderNo) {
|
|
|
+ UserOrderVo detail = detail(orderNo, null);
|
|
|
+ if (null == detail) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
|
|
|
+ && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ UserOrderPayment userOrderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
|
|
|
+ if (null == userOrderPayment) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ Payment param = new Payment(detail.getOpenType(),
|
|
|
+ PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), detail.getPayChannel());
|
|
|
+ param.setId(detail.getTransNo());
|
|
|
+ param.setPaymentNo(detail.getPaymentNo());
|
|
|
+ BaseResult<Payment> res = paymentClient.queryPayment(param);
|
|
|
+ Payment queryPaymentData = res.getData();
|
|
|
+
|
|
|
+ //支付成功
|
|
|
+ if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(queryPaymentData.getStatus())
|
|
|
+ && (OrderStatusEnum.WAIT_PAY.equals(detail.getStatus()) || OrderStatusEnum.PAYING.equals(detail.getStatus()))) {
|
|
|
+ //订单已经完成,则完成订单
|
|
|
+ orderSuccess(detail, null);
|
|
|
+ //付款单改为已完成状态
|
|
|
+ userOrderPayment.setTransNo(queryPaymentData.getId());
|
|
|
+ userOrderPayment.setStatus(TradeStatusEnum.succeeded);
|
|
|
+ userOrderPayment.setUpdateTime(new Date());
|
|
|
+ userOrderPayment.setArrivalTime(new Date());
|
|
|
+ userOrderPayment.setBackPayAmt(
|
|
|
+ new BigDecimal(queryPaymentData.getPayAmt()));
|
|
|
+
|
|
|
+ ExecutePaymentCallBack executePaymentCallBack = queryPaymentData.getExecutePaymentCallBack();
|
|
|
+ if (null != executePaymentCallBack) {
|
|
|
+ userOrderPayment.setArrivalTime(executePaymentCallBack.getTradeTime());
|
|
|
+ userOrderPayment.setBackPayAmt(
|
|
|
+ new BigDecimal(executePaymentCallBack.getPayAmt()));
|
|
|
+ userOrderPayment.setFeeAmt(new BigDecimal(executePaymentCallBack.getFeeAmt()));
|
|
|
+ }
|
|
|
+ orderPaymentService.updateById(userOrderPayment);
|
|
|
+ return false;
|
|
|
}
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
private HttpResponseResult<OrderPayRes> doOrderPay(OrderPayReq payReq, UserOrderVo detail) throws Exception {
|
|
|
- /*UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo(), payReq.getPayChannel(), TradeStatusEnum.pending);
|
|
|
- //当前渠道已经有创建支付请求
|
|
|
- if (null != orderPayment && !StringUtil.isEmpty(orderPayment.getPayInfo())) {
|
|
|
- OrderPayRes orderPayRes = new OrderPayRes();
|
|
|
- orderPayRes.setPay_amt(orderPayment.getPayAmt().toString());
|
|
|
- orderPayRes.setPay_info(orderPayment.getPayInfo());
|
|
|
- orderPayRes.setPayChannel(orderPayment.getPayChannel());
|
|
|
- orderPayRes.setPaymentNo(orderPayment.getPaymentNo());
|
|
|
- return HttpResponseResult.succeed(orderPayRes);
|
|
|
- }*/
|
|
|
- return orderPaymentService.createOrderPayment(payReq, detail);
|
|
|
+ Boolean aBoolean = checkAndSuccessOrder(payReq.getOrderNo());
|
|
|
+ if (aBoolean) {
|
|
|
+ return orderPaymentService.createOrderPayment(payReq, detail);
|
|
|
+ } else {
|
|
|
+ return HttpResponseResult.failed("订单状态异常");
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/***
|
|
@@ -679,13 +762,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
|
|
|
//清除商家统计缓存
|
|
|
Long merchId = orderDetailVo.getMerchId();
|
|
|
if (merchId != null && merchId != 0) {
|
|
|
- //redissonClient.getBucket(CacheNameEnum.TEACHER_SUBJECT_ITEM.getRedisKey(merchId)).delete();
|
|
|
redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(merchId)).delete();
|
|
|
}
|
|
|
}
|
|
|
//清除买家统计缓存
|
|
|
if (ClientEnum.STUDENT.getCode().equals(detail.getPaymentClient())) {
|
|
|
- //redissonClient.getBucket(CacheNameEnum.STUDENT_SUBJECT_ITEM.getRedisKey(detail.getUserId())).delete();
|
|
|
redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(detail.getUserId())).delete();
|
|
|
} else if (ClientEnum.TEACHER.getCode().equals(detail.getPaymentClient())) {
|
|
|
redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(detail.getUserId())).delete();
|