From 473139c1a893e96935e85339e243e98218c81c25 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Sat, 10 Oct 2020 11:35:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=BC=E5=9B=A2=E5=B9=B6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/WxOrderGroupServiceImpl.java | 53 +++++++++---------- .../service/impl/WxPayOrderServiceImpl.java | 4 ++ 2 files changed, 29 insertions(+), 28 deletions(-) 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()+"]");