diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java index 203fd4bc5..6d1980844 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java @@ -72,32 +72,30 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { WxPayOrderMapper wxPayOrderMapper; private int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) { - //锁住人数 - long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; - String timeStr = String.valueOf(time); - boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); - if (!grouppeopleLock) { - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。"); - } - //此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算. 提高拼团的成功率 - int ordercount = wxOrderService.countGroupOrder(order.getOrderGroupId(),true); - Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount-1; - //Integer remainPeople = wxOrderGroup.getRemainPeople()-1; - wxOrderGroup.setStatus(remainPeople <= 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus()); - wxOrderGroup.setUpdateDate(new Date()); - wxOrderGroup.setRemainPeople(remainPeople); - logger.info("非首次拼团,更新拼团信息, 剩余人数-1"); - int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); - if (row != 1) { - //错误,更新状态,定时任务会发起退款,回滚库存 - order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - wxOrderMapper.updateById(order); - redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); - }else { - redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); - } - return remainPeople; + //TODO 并发处理 锁住人数 + //此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算. 提高拼团的成功率 + if (null != order.getOrderGroupId() && (!order.getOrderGroupId().equals(0L))) { + synchronized(order.getOrderGroupId()) { + int ordercount = wxOrderService.countGroupOrder(order.getOrderGroupId(),true); + Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount-1; + //Integer remainPeople = wxOrderGroup.getRemainPeople()-1; + wxOrderGroup.setStatus(remainPeople <= 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus()); + wxOrderGroup.setUpdateDate(new Date()); + wxOrderGroup.setRemainPeople(remainPeople); + logger.info("非首次拼团,更新拼团信息, 剩余人数-1"); + int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); + if (row != 1) { + //错误,更新状态,定时任务会发起退款,回滚库存 + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + wxOrderMapper.updateById(order); + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); + } + return remainPeople; + } + }else { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"参团错误,非参团订单."); + } + } @Override @@ -317,8 +315,7 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { orderList = orderList.parallelStream().filter(o -> { return o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()) || o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()) || - o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()) || - o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_CANCEL.getCode()); + o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()); }).sorted(Comparator.comparing(order -> order.getId())).collect(Collectors.toList()); if (!orderList.isEmpty()) { List userList = new ArrayList<>(); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 8ae10aa74..ade99bd09 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -230,6 +230,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { WxOrder orderParams = new WxOrder(); orderParams.setOrderGroupId(order.getOrderGroupId()); orderParams.setCUserId(user.getId()); + List orderstatuslist = new ArrayList(); + orderstatuslist.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); + orderstatuslist.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + orderParams.setStatusS(orderstatuslist); List olist = wxOrderMapper.findList(orderParams); if (olist == null || olist.size() <=0 ) { throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"未查询到参团订单[user:"+user.getId()+",groupId:"+order.getOrderGroupId()+"]");