|
@@ -16,6 +16,8 @@ import com.hwrj.cloud.portal.service.*;
|
|
|
import com.hwrj.cloud.portal.util.MemberUtil;
|
|
|
import com.hwrj.cloud.security.service.RedisService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.redisson.api.RLock;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
@@ -356,8 +358,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
//发送延迟消息
|
|
|
cancelOrderSender.sendMessage(orderId, delayTimes);
|
|
|
}
|
|
|
+
|
|
|
@Autowired
|
|
|
- private OmsOrderOperateHistoryMapper omsOrderOperateHistoryMapper;
|
|
|
+ private OmsOrderOperateHistoryMapper omsOrderOperateHistoryMapper;
|
|
|
+
|
|
|
@Override
|
|
|
public void confirmReceiveOrder(Long orderId) {
|
|
|
// redis 用户信息
|
|
@@ -373,7 +377,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
order.setConfirmStatus(1);
|
|
|
order.setReceiveTime(new Date());
|
|
|
orderMapper.updateByPrimaryKey(order);
|
|
|
- OmsOrderOperateHistory record=new OmsOrderOperateHistory();
|
|
|
+ OmsOrderOperateHistory record = new OmsOrderOperateHistory();
|
|
|
record.setCreateTime(new Date());
|
|
|
record.setOrderId(orderId);
|
|
|
record.setOperateMan(member.getNickname());
|
|
@@ -457,16 +461,35 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
@Autowired
|
|
|
private PmsProductMapper pmsProductMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private RedissonClient redissonClient;
|
|
|
+ //商品秒杀核心业务逻辑的处理-redisson的分布式锁
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public Map<String, Object> save(OrderFrom orderFrom) {
|
|
|
- PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(orderFrom.getProductId());
|
|
|
- //新增购物车
|
|
|
- OmsCartItem cartItem = new OmsCartItem();
|
|
|
- //构建订单数据
|
|
|
- OrderParam orderParam = getOrderParam(orderFrom, pmsProduct, cartItem);
|
|
|
- //下单
|
|
|
- return saveOrder(orderParam, orderFrom);
|
|
|
+ Long productId = orderFrom.getProductId();
|
|
|
+ String key = "dec_store_lock_" + productId;
|
|
|
+ RLock lock = redissonClient.getLock(key);
|
|
|
+ boolean locked = lock.isLocked();
|
|
|
+ try {
|
|
|
+ //加锁 操作很类似Java的ReentrantLock机制
|
|
|
+ lock.lock();
|
|
|
+ PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(orderFrom.getProductId());
|
|
|
+ //新增购物车
|
|
|
+ OmsCartItem cartItem = new OmsCartItem();
|
|
|
+ //构建订单数据
|
|
|
+ OrderParam orderParam = getOrderParam(orderFrom, pmsProduct, cartItem);
|
|
|
+ //下单
|
|
|
+ return saveOrder(orderParam, orderFrom);
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.out.println(e.getMessage());
|
|
|
+ Asserts.fail("卖完了!");
|
|
|
+ } finally {
|
|
|
+ //解锁
|
|
|
+ lock.unlock();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
private OrderParam getOrderParam(OrderFrom orderFrom, PmsProduct pmsProduct, OmsCartItem cartItem) {
|
|
@@ -1007,15 +1030,14 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
|
|
*/
|
|
|
private void lockStockByOne(List<CartPromotionItem> cartPromotionItemList, OrderFrom orderFrom) {
|
|
|
for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
|
|
|
- PmsProduct record = new PmsProduct();
|
|
|
PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(cartPromotionItem.getProductId());
|
|
|
Integer stock = pmsProduct.getStock();
|
|
|
Integer bayNum = orderFrom.getBayNum();
|
|
|
if (stock.intValue() < bayNum.intValue()) {
|
|
|
- Asserts.fail("库存不足,无法下单");
|
|
|
+ Asserts.fail("库存不足,无法下单!");
|
|
|
}
|
|
|
pmsProduct.setStock(stock - bayNum);
|
|
|
- pmsProductMapper.updateByPrimaryKey(record);
|
|
|
+ pmsProductMapper.updateByPrimaryKey(pmsProduct);
|
|
|
}
|
|
|
}
|
|
|
|