| @@ -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) { | |||
| @@ -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); | |||
| } | |||
| @@ -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)); | |||
| } | |||
| // 更新订单信息 | |||
| @@ -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<Integer> statusS = new ArrayList<Integer>(); | |||
| 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); | |||
| } | |||
| @@ -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<String, String> 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); | |||