Просмотр исходного кода

拼团bug

release_toaliyun_real
xiaohanzi 5 лет назад
Родитель
Сommit
e3cfe8b88c
1 измененных файлов: 30 добавлений и 20 удалений
  1. +30
    -20
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java

+ 30
- 20
mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java Просмотреть файл

@@ -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(),"参团错误,非参团订单.");
}


Загрузка…
Отмена
Сохранить