From 4e56fa6d5e3329a1577e0786fa713803880bad13 Mon Sep 17 00:00:00 2001 From: xhxu Date: Fri, 14 Apr 2023 19:38:56 +0800 Subject: [PATCH] //lock order --- .../service/impl/WxOrderServiceImpl.java | 64 +++++++++++-------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index af168ec2a..151d9e513 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -2394,43 +2394,55 @@ public class WxOrderServiceImpl implements WxOrderService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public int updateOrderStatus(WxOrder updateOrder, EnumOrderStatus enumOrderStatus) { - Date currentDate = new Date(); - WxOrder oldOrder = wxOrderMapper.selectById(updateOrder.getId(),updateOrder.getTenantId()); - if ((!oldOrder.getOrderStatus().equals(enumOrderStatus.getCode())) && (!oldOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_OVERTIME_PAID_REFUND.getCode()))) { - // 状态已更新,库存不退回, 保证不会多退 - switch (enumOrderStatus) { - case ORDER_STATUS_OVERTIME_CANCEL: // 支付取消,库存退回 - case ORDER_STATUS_REFUND_SUCCESS: // 退款成功,库存退回 - case ORDER_STATUS_COOPERATING_OVERTIME: // 拼团超时,退库存 - case ORDER_STATUS_COOPERATING_CANCEL: // 拼团取消,退库存 - case ORDER_STATUS_COOPERATING_COMPLETE: // 拼团完成,退库存 - { - try { - stockBack(updateOrder); - } catch (Exception e) { - logger.error("库存+1失败, e:" + e.getMessage(),e); - throw new MallinkException(ErrorCode.REMAIN_BACK_FAIL); + + String orderIdStr = updateOrder.getId() + "_" + enumOrderStatus.getCode(); + //加锁 + long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; + String timeStr = String.valueOf(time); + + if (!redisLock.lock(orderIdStr, timeStr)) { + logger.error("此订单被锁定, order: " + orderIdStr); + throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); + } + + try{ + WxOrder oldOrder = wxOrderMapper.selectById(updateOrder.getId(),updateOrder.getTenantId()); + if ((!oldOrder.getOrderStatus().equals(enumOrderStatus.getCode())) + && (!oldOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_OVERTIME_PAID_REFUND.getCode()))) { + // 状态已更新,库存不退回, 保证不会多退 + switch (enumOrderStatus) { + case ORDER_STATUS_OVERTIME_CANCEL: // 支付取消,库存退回 + case ORDER_STATUS_REFUND_SUCCESS: // 退款成功,库存退回 + case ORDER_STATUS_COOPERATING_OVERTIME: // 拼团超时,退库存 + case ORDER_STATUS_COOPERATING_CANCEL: // 拼团取消,退库存 + case ORDER_STATUS_COOPERATING_COMPLETE: // 拼团完成,退库存 + { + try { + stockBack(updateOrder); + } catch (Exception e) { + logger.error("库存+1失败, e:" + e.getMessage(),e); + throw new MallinkException(ErrorCode.REMAIN_BACK_FAIL); + } + break; } - break; } } + }finally { + redisLock.unlock(orderIdStr, timeStr); } - WxOrder refOrder = new WxOrder(); - refOrder.setId(updateOrder.getId()); - refOrder.setOrderStatus(enumOrderStatus.getCode()); - refOrder.setUpdateDate(currentDate); - refOrder.updateTenantInfo(updateOrder); + int ret = 0; try { + WxOrder refOrder = new WxOrder(); + refOrder.setId(updateOrder.getId()); + refOrder.setOrderStatus(enumOrderStatus.getCode()); + refOrder.setUpdateDate(new Date()); + refOrder.updateTenantInfo(updateOrder); ret = wxOrderMapper.updateById(refOrder); } catch (Exception e) { logger.error("订单状态更新失败, e:" + e.getMessage(),e); throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); } -// if(ret == 1){ -// //订单同步 -// sendInsideOrderPushMsg(oldOrder,oldOrder.getComposeOrderId()); -// } return ret; }