|
|
|
@@ -71,27 +71,37 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { |
|
|
|
@Autowired |
|
|
|
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))) { |
|
|
|
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 { |
|
|
|
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"参团错误,非参团订单."); |
|
|
|
} |
|
|
|
|