Przeglądaj źródła

//lock order

release_toaliyun_real
xhxu 3 lat temu
rodzic
commit
4e56fa6d5e
1 zmienionych plików z 38 dodań i 26 usunięć
  1. +38
    -26
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java

+ 38
- 26
mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java Wyświetl plik

@@ -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;
}


Ładowanie…
Anuluj
Zapisz