diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java index 799619fa3..af0026ce3 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java @@ -131,6 +131,7 @@ public class WxOrderController extends BaseController { if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); } + WxOrder order = wxOrderService.saveOrderForCoupon(user, coupon, orderSaveDto, isPress); return new ResultData(order); } catch (MallinkException e) { diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 0a781820a..9a62b915a 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -228,6 +228,6 @@ public interface WxOrderService { Long saveOuterOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId); - int countGroupOrder(Long groupId); + int countGroupOrder(Long groupId,boolean ignoreUnPay); } 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 eeeffe592..5a1d269ab 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java @@ -84,27 +84,31 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { //错误,更新状态,定时任务会发起退款 order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); wxOrderMapper.updateById(order); - wxOrderGroup.setStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); - wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团人数已满,将稍后退款。"); } + //锁住人数 + boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+orderGroupId, String.valueOf(orderGroupId)); + if (!grouppeopleLock) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。"); + } //此处拼团数量应从订单总数查询 - int ordercount = wxOrderService.countGroupOrder(orderGroupId); + int ordercount = wxOrderService.countGroupOrder(orderGroupId,true); Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount; //Integer remainPeople = wxOrderGroup.getRemainPeople()-1; - wxOrderGroup.setStatus(remainPeople == 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus()); + 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) { //这个时候应该要发起异步退款。 - wxOrderGroup.setStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); - order.setOrderStatus(wxOrderGroup.getStatus()); + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); wxOrderMapper.updateById(order); - wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); + redisLock.unlock("grouppeopleLock_"+orderGroupId, String.valueOf(orderGroupId)); throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); + }else { + redisLock.unlock("grouppeopleLock_"+orderGroupId, String.valueOf(orderGroupId)); } // 更新订单信息 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 07cc1be07..cf4019517 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -2126,7 +2126,7 @@ public class WxOrderServiceImpl implements WxOrderService { // 2. 拼团检查 if (isOrderGroup(orderGroupId)) { - checkOrderGroup(user, orderGroupId); + checkOrderGroup(user, orderGroupId,coupon); } String couponIdStr = String.valueOf(coupon.getId()); // 3. 减库存操作 @@ -2257,16 +2257,27 @@ public class WxOrderServiceImpl implements WxOrderService { return orderNumber; } - private void checkOrderGroup(WxCUser user, Long orderGroupId) { + private void checkOrderGroup(WxCUser user, Long orderGroupId,WxCoupon coupon) { WxOrderGroup group = wxOrderGroupMapper.selectById(orderGroupId); if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) { logger.error("下订单拼团人数已满>>>" + orderGroupId); throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED); } + + if (group.getRemainPeople()<=0) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数已满"); + } + + //判断拼团人数是否已经超出限制 + int groupCount = countGroupOrder(orderGroupId,false); + if (groupCount>=coupon.getPressLimitNum()) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数超出优惠券人数限制!"); + } + WxOrder order = new WxOrder(); order.setOrderGroupId(group.getId()); order.setCUserId(user.getId()); - order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + //order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); long count = wxOrderMapper.selectCount(new QueryWrapper(order)); if (count > 0) { logger.error("重复的拼团>>>" + orderGroupId); @@ -2279,14 +2290,16 @@ public class WxOrderServiceImpl implements WxOrderService { } @Override - public int countGroupOrder(Long groupId) { + public int countGroupOrder(Long groupId,boolean ignoreUnPay) { WxOrder query = new WxOrder(); query.setOrderGroupId(groupId); List statusS = new ArrayList(); statusS.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); - //statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + if (!ignoreUnPay) { + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + } query.setStatusS(statusS); return wxOrderMapper.countList(query); } 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 30e94abf0..a403c3743 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -180,7 +180,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Override public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay) { - //int wxpaystatus = WxPayOrderServiceHelper.wxOrderPayStatus(oldRecord, order, appInfo, payAccount); Map retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, order, appInfo, payAccount); int wxpaystatus = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, oldRecord.getPayOrderNo()); if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { @@ -235,7 +234,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { WxOrder orderParams = new WxOrder(); orderParams.setOrderGroupId(order.getOrderGroupId()); orderParams.setCUserId(user.getId()); - orderParams.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); + //orderParams.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); int count = wxOrderMapper.selectCount(new QueryWrapper(orderParams)); if (count > 0) { logger.error("重复的拼团>>>" + order);