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

拼团并发

release_toaliyun_real
xiaohanzi 5 лет назад
Родитель
Сommit
473139c1a8
2 измененных файлов: 29 добавлений и 28 удалений
  1. +25
    -28
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java
  2. +4
    -0
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java

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

@@ -72,32 +72,30 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService {
WxPayOrderMapper wxPayOrderMapper;

private int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) {
//锁住人数
long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT;
String timeStr = String.valueOf(time);
boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+order.getOrderGroupId(), timeStr);
if (!grouppeopleLock) {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。");
}
//此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算. 提高拼团的成功率
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("grouppeopleLock_"+order.getOrderGroupId(), timeStr);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款.");
}else {
redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr);
}
return remainPeople;
//TODO 并发处理 锁住人数
//此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算. 提高拼团的成功率
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;
}
}else {
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"参团错误,非参团订单.");
}
}
@Override
@@ -317,8 +315,7 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService {
orderList = orderList.parallelStream().filter(o -> {
return o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()) ||
o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()) ||
o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()) ||
o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_CANCEL.getCode());
o.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode());
}).sorted(Comparator.comparing(order -> order.getId())).collect(Collectors.toList());
if (!orderList.isEmpty()) {
List<WxCUserBasicInfo> userList = new ArrayList<>();


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

@@ -230,6 +230,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
WxOrder orderParams = new WxOrder();
orderParams.setOrderGroupId(order.getOrderGroupId());
orderParams.setCUserId(user.getId());
List<Integer> orderstatuslist = new ArrayList<Integer>();
orderstatuslist.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode());
orderstatuslist.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode());
orderParams.setStatusS(orderstatuslist);
List<WxOrder> olist = wxOrderMapper.findList(orderParams);
if (olist == null || olist.size() <=0 ) {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"未查询到参团订单[user:"+user.getId()+",groupId:"+order.getOrderGroupId()+"]");


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