|
|
|
@@ -19,10 +19,14 @@ import com.iformall.exception.MallinkException; |
|
|
|
import com.iformall.mapper.*; |
|
|
|
import com.iformall.service.*; |
|
|
|
import com.iformall.service.tt.TtOrderService; |
|
|
|
import com.iformall.utils.RedisLock; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.slf4j.Logger; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Propagation; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
@@ -34,6 +38,11 @@ public class TtOrderServiceImpl implements TtOrderService { |
|
|
|
|
|
|
|
private final Integer time_out = 30*60; |
|
|
|
|
|
|
|
private final String TT_ORDER_KEY = "ORDER:TT:"; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
RedisLock redisLock; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private TtOrderMapper ttOrderMapper; |
|
|
|
|
|
|
|
@@ -130,7 +139,6 @@ public class TtOrderServiceImpl implements TtOrderService { |
|
|
|
order.setCreateDate(now); |
|
|
|
order.setUpdateDate(now); |
|
|
|
ttOrderMapper.insert(order); |
|
|
|
ttcouponMapper.addSellCount(coupon.getId()); |
|
|
|
return new ResultData(order); |
|
|
|
} catch (MallinkException e) { |
|
|
|
logger.error(e.getMessage()); |
|
|
|
@@ -288,52 +296,71 @@ public class TtOrderServiceImpl implements TtOrderService { |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) |
|
|
|
public ResultData updateOrderStatus(Long orderId, WxAppinfo appInfo, WxPayAccount payAccount) { |
|
|
|
TtOrder order = ttOrderMapper.selectById(orderId); |
|
|
|
if (null == order) { |
|
|
|
logger.error("pay order, order not allow, orderId: " + orderId); |
|
|
|
return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); |
|
|
|
} |
|
|
|
if(appInfo == null || payAccount == null) { |
|
|
|
return new ResultData(ErrorCode.APP_ID_NOT_FOUND); |
|
|
|
} |
|
|
|
if(order.getOrderStatus() == EnumTtOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()){ |
|
|
|
logger.info("订单支付中: " + order.toString()); |
|
|
|
OrderQueryResult orderQueryResult = DouYinPayHelper.orderQuery(appInfo.getAppId(), payAccount.getApiKey(), order.getId().toString(), null); |
|
|
|
if(orderQueryResult == null){ |
|
|
|
return new ResultData(ErrorCode.PAY_ORDER_ERROR,"查询单号不存在"); |
|
|
|
String lockKey = StringUtils.join(TT_ORDER_KEY,orderId, ":", "lock"); |
|
|
|
long time = System.currentTimeMillis() + 5000; |
|
|
|
String timeStr = String.valueOf(time); |
|
|
|
if (redisLock.lock2(lockKey, timeStr)) { |
|
|
|
|
|
|
|
TtOrder order = ttOrderMapper.selectById(orderId); |
|
|
|
if (null == order) { |
|
|
|
logger.error("pay order, order not allow, orderId: " + orderId); |
|
|
|
return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); |
|
|
|
} |
|
|
|
if(appInfo == null || payAccount == null) { |
|
|
|
return new ResultData(ErrorCode.APP_ID_NOT_FOUND); |
|
|
|
} |
|
|
|
String trade_state = orderQueryResult.getOrderStatus(); |
|
|
|
if ("PROCESSING".equals(trade_state)) {//处理中 |
|
|
|
return new ResultData(ErrorCode.PAY_ORDER_PAYING); |
|
|
|
}else if ("SUCCESS".equals(trade_state)) {//成功 |
|
|
|
TtOrder orderSuc = new TtOrder(); |
|
|
|
orderSuc.setId(order.getId()); |
|
|
|
orderSuc.setOrderStatus(EnumTtOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); |
|
|
|
orderSuc.setWay(orderQueryResult.getWay()); |
|
|
|
orderSuc.setPaymentTime(orderQueryResult.getPayTime()); |
|
|
|
orderSuc.setUpdateDate(new Date()); |
|
|
|
ttOrderMapper.updateById(orderSuc); |
|
|
|
if(order.getOrderStatus() == EnumTtOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()){ |
|
|
|
logger.info("订单支付中: " + order.toString()); |
|
|
|
OrderQueryResult orderQueryResult = DouYinPayHelper.orderQuery(appInfo.getAppId(), payAccount.getApiKey(), order.getId().toString(), null); |
|
|
|
if(orderQueryResult == null){ |
|
|
|
return new ResultData(ErrorCode.PAY_ORDER_ERROR,"查询单号不存在"); |
|
|
|
} |
|
|
|
String trade_state = orderQueryResult.getOrderStatus(); |
|
|
|
if ("PROCESSING".equals(trade_state)) {//处理中 |
|
|
|
return new ResultData(ErrorCode.PAY_ORDER_PAYING); |
|
|
|
}else if ("SUCCESS".equals(trade_state)) {//成功 |
|
|
|
TtOrder orderSuc = new TtOrder(); |
|
|
|
orderSuc.setId(order.getId()); |
|
|
|
orderSuc.setOrderStatus(EnumTtOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); |
|
|
|
orderSuc.setWay(orderQueryResult.getWay()); |
|
|
|
orderSuc.setPaymentTime(orderQueryResult.getPayTime()); |
|
|
|
orderSuc.setUpdateDate(new Date()); |
|
|
|
ttOrderMapper.updateById(orderSuc); |
|
|
|
// return new ResultData(ErrorCode.PAY_ORDER_EXIST,"该订单已经支付,请勿重复支付!"); |
|
|
|
return new ResultData(); |
|
|
|
}else if ("FAIL".equals(trade_state)) {//失败 |
|
|
|
return new ResultData(); |
|
|
|
}else if ("FAIL".equals(trade_state)) {//失败 |
|
|
|
// TtOrder orderSuc = new TtOrder(); |
|
|
|
// orderSuc.setId(order.getId()); |
|
|
|
// orderSuc.setOrderStatus(EnumTtOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); |
|
|
|
// orderSuc.setUpdateDate(new Date()); |
|
|
|
// ttOrderMapper.updateById(orderSuc); |
|
|
|
return new ResultData(ErrorCode.PAY_ORDER_ERROR,"支付失败"); |
|
|
|
}else if ("TIMEOUT".equals(trade_state)) {//超时 |
|
|
|
return new ResultData(ErrorCode.PAY_ORDER_ERROR,"支付失败"); |
|
|
|
}else if ("TIMEOUT".equals(trade_state)) {//超时 |
|
|
|
// TtOrder orderSuc = new TtOrder(); |
|
|
|
// orderSuc.setId(order.getId()); |
|
|
|
// orderSuc.setOrderStatus(EnumTtOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); |
|
|
|
// orderSuc.setUpdateDate(new Date()); |
|
|
|
// ttOrderMapper.updateById(orderSuc); |
|
|
|
// return new ResultData(ErrorCode.PAY_ORDER_CLOSED); |
|
|
|
return new ResultData(ErrorCode.PAY_ORDER_ERROR,"支付超时"); |
|
|
|
return new ResultData(ErrorCode.PAY_ORDER_ERROR,"支付超时"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
redisLock.unlock(lockKey, timeStr); |
|
|
|
}else { |
|
|
|
logger.debug("CacheAspect 读库等待中, key:{}: " + lockKey); |
|
|
|
try { |
|
|
|
Thread.sleep(5000); |
|
|
|
} catch (InterruptedException e) { |
|
|
|
e.printStackTrace(); |
|
|
|
}finally { |
|
|
|
redisLock.unlock(lockKey, timeStr); |
|
|
|
} |
|
|
|
} |
|
|
|
return new ResultData(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
|