Эх сурвалжийг харах

现金购买库存问题优化

cup 2 жил өмнө
parent
commit
97d62f5359

+ 73 - 3
mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java

@@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.admin.domain.param.UserDeliverOrderShipParam;
 import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.admin.service.IGoodsSkuService;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.DateUtils;
@@ -29,6 +31,8 @@ import com.qs.mp.user.service.IUserPrizeStorageService;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -64,9 +68,49 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
   @Autowired
   private IGoodsService goodsService;
 
+  @Autowired
+  private IGoodsSkuService goodsSkuService;
+
   @Override
   @Transactional
   public String submitOrder(Long userId, String memo, DeliverOrderSettleVO orderSettleVO) {
+
+      if (DeliverOrderResourceEnum.PAYMENT.getValue().equals(orderSettleVO.getResource())) {
+          // 现金购买需要校验和锁库存
+          for (UserPrizeStorage userPrizeStorage : orderSettleVO.getPrizeList()) {
+              if (Objects.nonNull(userPrizeStorage.getSkuId()) && userPrizeStorage.getSkuId() != 0) {
+                  GoodsSku goodsSku = goodsSkuService.getById(userPrizeStorage.getSkuId());
+                  if (goodsSku.getSoldQty() + userPrizeStorage.getGoodsNum() > goodsSku.getQuantity()) {
+                      throw new ServiceException(userPrizeStorage.getTitle() + "库存不足,请重新下单");
+                  }
+
+                  // 更新库存
+                  boolean updateSku = goodsSkuService.update(new LambdaUpdateWrapper<GoodsSku>()
+                          .set(GoodsSku::getQuantity, goodsSku.getQuantity() - userPrizeStorage.getGoodsNum())
+                          .set(GoodsSku::getSoldQty, goodsSku.getSoldQty() + userPrizeStorage.getGoodsNum())
+                          .eq(GoodsSku::getSkuId, goodsSku.getSkuId())
+                          .eq(GoodsSku::getQuantity, goodsSku.getQuantity())
+                          .eq(GoodsSku::getSoldQty, goodsSku.getSoldQty()));
+                  Assert.isTrue(updateSku, "现金购买商品更新SKU库存失败。goodsId:" + goodsSku.getGoodsId() + ",skuId:" + goodsSku.getSkuId());
+
+              } else {
+                  Goods goods = goodsService.getById(userPrizeStorage.getGoodsId());
+                  if (goods.getExchangedQty() + userPrizeStorage.getGoodsNum() > goods.getQuantity()) {
+                      throw new ServiceException(userPrizeStorage.getTitle() + "库存不足,请重新下单");
+                  }
+                  // 更新库存
+                  boolean updateGoods = goodsService.update(new LambdaUpdateWrapper<Goods>()
+                          .set(goods.getQuantity() - userPrizeStorage.getGoodsNum() == 0, Goods::getStatus, GoodsStatusEnum.PUT_OFF)
+                          .set(Goods::getQuantity, goods.getQuantity() - userPrizeStorage.getGoodsNum())
+                          .set(Goods::getExchangedQty, goods.getExchangedQty() + userPrizeStorage.getGoodsNum())
+                          .eq(Goods::getGoodsId, goods.getGoodsId()).eq(Goods::getQuantity, goods.getQuantity()).eq(Goods::getExchangedQty, goods.getExchangedQty()));
+                  Assert.isTrue(updateGoods, "现金购买商品更新GOODS库存失败。goodsId:" + goods.getGoodsId() );
+
+              }
+          }
+      }
+
+
     UserDeliverOrder userDeliverOrder = new UserDeliverOrder();
     userDeliverOrder.setOrderId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
     userDeliverOrder.setUserId(userId);
@@ -129,10 +173,36 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
           orderId, userDeliverOrder.getStatus());
       return false;
     }
-    if (!DeliverOrderResourceEnum.PAYMENT.equals(userDeliverOrder.getResource())) {
+    List<UserDeliverOrderItem> orderItemList = userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+            .eq(UserDeliverOrderItem::getOrderId, userDeliverOrder.getOrderId()));
+    if (DeliverOrderResourceEnum.PAYMENT.equals(userDeliverOrder.getResource())) {
+        // 恢复商品库存状态
+        for (UserDeliverOrderItem orderItem : orderItemList) {
+            if (Objects.nonNull(orderItem.getSkuId()) && orderItem.getSkuId() != 0) {
+                GoodsSku goodsSku = goodsSkuService.getById(orderItem.getSkuId());
+                boolean updateSku = goodsSkuService.update(new LambdaUpdateWrapper<GoodsSku>()
+                        .set(GoodsSku::getQuantity, goodsSku.getQuantity() + orderItem.getGoodsNum())
+                        .set(GoodsSku::getSoldQty, goodsSku.getSoldQty() - orderItem.getGoodsNum())
+                        .eq(GoodsSku::getSkuId, goodsSku.getSkuId())
+                        .eq(GoodsSku::getQuantity, goodsSku.getGoodsId())
+                        .eq(GoodsSku::getProperties, orderItem.getProperties()));
+
+                Assert.isTrue(updateSku, "现金购买商品取消订单更新SKU库存失败。goodsId:" + goodsSku.getGoodsId() + ",skuId:" + goodsSku.getSkuId());
+            } else {
+                Goods goods = goodsService.getById(orderItem.getGoodsId());
+                // 更新库存
+                boolean updateGoods = goodsService.update(new LambdaUpdateWrapper<Goods>()
+                        .set(Goods::getStatus, GoodsStatusEnum.PUT_ON)
+                        .set(Goods::getQuantity, goods.getQuantity() + orderItem.getGoodsNum())
+                        .set(Goods::getExchangedQty, goods.getExchangedQty() - orderItem.getGoodsNum())
+                        .eq(Goods::getGoodsId, goods.getGoodsId())
+                        .eq(Goods::getQuantity, goods.getQuantity())
+                        .eq(Goods::getExchangedQty, goods.getExchangedQty()));
+                Assert.isTrue(updateGoods, "现金购买商品取消订单更新GOODS库存失败。goodsId:" + goods.getGoodsId() );
+            }
+        }
+    }else {
         // 恢复奖品库状态
-        List<UserDeliverOrderItem> orderItemList = userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
-                .eq(UserDeliverOrderItem::getOrderId, userDeliverOrder.getOrderId()));
         for (UserDeliverOrderItem orderItem : orderItemList) {
             boolean rtn = userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
                     .set(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED)