From 31fe74d8fa7a190d78dccace20ec6af42f8d760e Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Mon, 28 Sep 2020 11:31:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=8B=BC=E5=9B=A2=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=90=8E=E5=8F=96=E6=B6=88=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/WxOrderGroupServiceImpl.java | 16 ++++++++++++++-- .../main/java/com/iformall/utils/RedisLock.java | 10 ++++++++++ 2 files changed, 24 insertions(+), 2 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 a2ef094a7..e37c2d5f2 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java @@ -79,7 +79,7 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { 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; @@ -142,6 +142,8 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { logger.error("更新订单信息失败", e); throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD); } + //此时会出现临界情况,remainPeople是已支付的数量 + //此时如果最后的位置,同时多个人点了,去支付,最先支付的会把后面的取消掉。 if (remainPeople == 0) { actionAfterOrderGroupSuccess(order, orderGroupId); } @@ -191,6 +193,13 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { * @param orderGroupId */ private void actionAfterOrderGroupSuccess(WxOrder order, Long orderGroupId) { + //拼团完成,只能执行一次。 + boolean isFirstSet = redisLock.setOrderGroupComplateLock(orderGroupId); + //如果没有设置成功,则不是第一次处理,后续的忽略,防止并发 + if (!isFirstSet) { + return; + } + // 拼团完成 // 得到所有拼团的order WxOrder wxOrder = new WxOrder(); @@ -224,7 +233,10 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { //去库存 wxOrderService.updateOrderStatus(temp); //拼团取消 - temp.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_BREAK.getCode()); + //temp.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_BREAK.getCode()); + + //拼团失败。定时会处理退款 + temp.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); wxOrderMapper.updateById(temp); } } diff --git a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java index 05b199b7a..48395bc2d 100644 --- a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java +++ b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java @@ -145,4 +145,14 @@ public class RedisLock { } return false; } + + public boolean setOrderGroupComplateLock(long orderGroupId) { + String longstr = stringRedisTemplate.opsForValue().get("orderGroup:complete:"+String.valueOf(orderGroupId)); + if (Long.parseLong(longstr) >= 1L) { + return false; + } + Long rs = stringRedisTemplate.opsForValue().increment("orderGroup:complete:"+String.valueOf(orderGroupId), 1); + return rs <= 1L; + } + }