| @@ -71,27 +71,37 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { | |||||
| @Autowired | @Autowired | ||||
| WxPayOrderMapper wxPayOrderMapper; | WxPayOrderMapper wxPayOrderMapper; | ||||
| private int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) { | |||||
| //TODO 并发处理 锁住人数 | |||||
| //此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算. 提高拼团的成功率 | |||||
| public int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) { | |||||
| if (null != order.getOrderGroupId() && (!order.getOrderGroupId().equals(0L))) { | 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; | |||||
| } | |||||
| //TODO 并发处理 锁住人数 | |||||
| long time = System.currentTimeMillis() + RedisLock.TIMEOUT; | |||||
| String timeStr = String.valueOf(time); | |||||
| boolean stocksetlock = redisLock.lock("ordergroupLock:lock_"+order.getOrderGroupId(), timeStr); | |||||
| while (!stocksetlock) { | |||||
| stocksetlock = redisLock.lock("ordergroupLock:lock_"+order.getOrderGroupId(), timeStr); | |||||
| } | |||||
| if (stocksetlock) { | |||||
| //此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算. 提高拼团的成功率 | |||||
| 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("ordergroupLock:lock_"+order.getOrderGroupId(), timeStr); | |||||
| throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); | |||||
| } | |||||
| redisLock.unlock("ordergroupLock:lock_"+order.getOrderGroupId(), timeStr); | |||||
| return remainPeople; | |||||
| }else { | |||||
| throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"参团错误,ordergroupLock:lock未获取到."); | |||||
| } | |||||
| }else { | }else { | ||||
| throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"参团错误,非参团订单."); | throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"参团错误,非参团订单."); | ||||
| } | } | ||||