|  | @@ -16,6 +16,8 @@ import com.hwrj.cloud.portal.service.*;
 | 
											
												
													
														|  |  import com.hwrj.cloud.portal.util.MemberUtil;
 |  |  import com.hwrj.cloud.portal.util.MemberUtil;
 | 
											
												
													
														|  |  import com.hwrj.cloud.security.service.RedisService;
 |  |  import com.hwrj.cloud.security.service.RedisService;
 | 
											
												
													
														|  |  import lombok.extern.slf4j.Slf4j;
 |  |  import lombok.extern.slf4j.Slf4j;
 | 
											
												
													
														|  | 
 |  | +import org.redisson.api.RLock;
 | 
											
												
													
														|  | 
 |  | +import org.redisson.api.RedissonClient;
 | 
											
												
													
														|  |  import org.springframework.beans.BeanUtils;
 |  |  import org.springframework.beans.BeanUtils;
 | 
											
												
													
														|  |  import org.springframework.beans.factory.annotation.Autowired;
 |  |  import org.springframework.beans.factory.annotation.Autowired;
 | 
											
												
													
														|  |  import org.springframework.beans.factory.annotation.Value;
 |  |  import org.springframework.beans.factory.annotation.Value;
 | 
											
										
											
												
													
														|  | @@ -356,8 +358,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 | 
											
												
													
														|  |          //发送延迟消息
 |  |          //发送延迟消息
 | 
											
												
													
														|  |          cancelOrderSender.sendMessage(orderId, delayTimes);
 |  |          cancelOrderSender.sendMessage(orderId, delayTimes);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      @Autowired
 |  |      @Autowired
 | 
											
												
													
														|  | -    private  OmsOrderOperateHistoryMapper omsOrderOperateHistoryMapper;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    private OmsOrderOperateHistoryMapper omsOrderOperateHistoryMapper;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      @Override
 |  |      @Override
 | 
											
												
													
														|  |      public void confirmReceiveOrder(Long orderId) {
 |  |      public void confirmReceiveOrder(Long orderId) {
 | 
											
												
													
														|  |          // redis 用户信息
 |  |          // redis 用户信息
 | 
											
										
											
												
													
														|  | @@ -373,7 +377,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 | 
											
												
													
														|  |          order.setConfirmStatus(1);
 |  |          order.setConfirmStatus(1);
 | 
											
												
													
														|  |          order.setReceiveTime(new Date());
 |  |          order.setReceiveTime(new Date());
 | 
											
												
													
														|  |          orderMapper.updateByPrimaryKey(order);
 |  |          orderMapper.updateByPrimaryKey(order);
 | 
											
												
													
														|  | -        OmsOrderOperateHistory record=new OmsOrderOperateHistory();
 |  | 
 | 
											
												
													
														|  | 
 |  | +        OmsOrderOperateHistory record = new OmsOrderOperateHistory();
 | 
											
												
													
														|  |          record.setCreateTime(new Date());
 |  |          record.setCreateTime(new Date());
 | 
											
												
													
														|  |          record.setOrderId(orderId);
 |  |          record.setOrderId(orderId);
 | 
											
												
													
														|  |          record.setOperateMan(member.getNickname());
 |  |          record.setOperateMan(member.getNickname());
 | 
											
										
											
												
													
														|  | @@ -457,16 +461,35 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 | 
											
												
													
														|  |      @Autowired
 |  |      @Autowired
 | 
											
												
													
														|  |      private PmsProductMapper pmsProductMapper;
 |  |      private PmsProductMapper pmsProductMapper;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    @Autowired
 | 
											
												
													
														|  | 
 |  | +    private RedissonClient redissonClient;
 | 
											
												
													
														|  | 
 |  | +    //商品秒杀核心业务逻辑的处理-redisson的分布式锁
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      @Override
 |  |      @Override
 | 
											
												
													
														|  |      @Transactional
 |  |      @Transactional
 | 
											
												
													
														|  |      public Map<String, Object> save(OrderFrom orderFrom) {
 |  |      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) {
 |  |      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) {
 |  |      private void lockStockByOne(List<CartPromotionItem> cartPromotionItemList, OrderFrom orderFrom) {
 | 
											
												
													
														|  |          for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
 |  |          for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
 | 
											
												
													
														|  | -            PmsProduct record = new PmsProduct();
 |  | 
 | 
											
												
													
														|  |              PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(cartPromotionItem.getProductId());
 |  |              PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(cartPromotionItem.getProductId());
 | 
											
												
													
														|  |              Integer stock = pmsProduct.getStock();
 |  |              Integer stock = pmsProduct.getStock();
 | 
											
												
													
														|  |              Integer bayNum = orderFrom.getBayNum();
 |  |              Integer bayNum = orderFrom.getBayNum();
 | 
											
												
													
														|  |              if (stock.intValue() < bayNum.intValue()) {
 |  |              if (stock.intValue() < bayNum.intValue()) {
 | 
											
												
													
														|  | -                Asserts.fail("库存不足,无法下单");
 |  | 
 | 
											
												
													
														|  | 
 |  | +                Asserts.fail("库存不足,无法下单!");
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |              pmsProduct.setStock(stock - bayNum);
 |  |              pmsProduct.setStock(stock - bayNum);
 | 
											
												
													
														|  | -            pmsProductMapper.updateByPrimaryKey(record);
 |  | 
 | 
											
												
													
														|  | 
 |  | +            pmsProductMapper.updateByPrimaryKey(pmsProduct);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 |