home vor 2 Jahren
Ursprung
Commit
d89ec32f35

+ 12 - 0
hx-common/common-tool/src/main/java/com/fjhx/utils/Assert.java

@@ -114,6 +114,18 @@ public class Assert {
         }
     }
 
+    /**
+     * 断言大于等于0
+     *
+     * @param bigDecimal 参数
+     * @param errStr     异常提示
+     */
+    public static void geZero(BigDecimal bigDecimal, String errStr) {
+        if (bigDecimal == null || BigDecimal.ZERO.compareTo(bigDecimal) >= 0) {
+            throw new ServiceException(errStr);
+        }
+    }
+
 
     /**
      * 断言大于0

+ 77 - 47
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockServiceImpl.java

@@ -15,8 +15,8 @@ import com.fjhx.mapper.stock.StockMapper;
 import com.fjhx.params.stock.StockChangeVo;
 import com.fjhx.params.stock.StockVo;
 import com.fjhx.service.stock.StockService;
+import com.fjhx.utils.Assert;
 import com.fjhx.utils.WrapperUtil;
-import org.springblade.core.log.exception.ServiceException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -67,66 +67,89 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void changeQuantity(StockChangeVo stockChangeVo) {
+        Assert.notEmpty(stockChangeVo.getChangeDetailsList(), "变更数量数量列表为空");
+        // 合并变更数量
+        Map<String, Stock> map = mergeChangeQuantity(stockChangeVo);
+        // 变更数量
+        ChangeQuantity(map, stockChangeVo.getTypeEnum());
+        // 添加流水记录
+        addJournal(stockChangeVo);
+    }
 
-        Enum<?> typeEnum = stockChangeVo.getTypeEnum();
-        List<? extends StockChangeVo.ChangeDetails> changeDetailsList = stockChangeVo.getChangeDetailsList();
+    /**
+     * 合并变更数量(如果同一种物品在出入库一个仓库,则合并数量)
+     */
+    private Map<String, Stock> mergeChangeQuantity(StockChangeVo stockChangeVo) {
 
-        HashMap<String, Stock> map = new HashMap<>();
+        List<? extends StockChangeVo.ChangeDetails> changeDetailsList = stockChangeVo.getChangeDetailsList();
+        Enum<?> typeEnum = stockChangeVo.getTypeEnum();
 
+        Map<String, Stock> map = new HashMap<>();
         for (StockChangeVo.ChangeDetails changeDetails : changeDetailsList) {
-
             // 变更数量
             BigDecimal changeQuantity = changeDetails.getChangeQuantity();
             // 变更数量小于等于0,则跳过
             if (changeQuantity.compareTo(BigDecimal.ZERO) <= 0) {
-                return;
+                continue;
             }
             // 仓库id
             Long warehouseId = ObjectUtil.defaultIfNull(changeDetails.getWarehouseId(), stockChangeVo.getDefaultWarehouseId());
             // 物品id
             Long goodsId = changeDetails.getGoodsId();
-
-            String key = goodsId + "" + warehouseId;
-
+            // 生成mapKey
+            String key = goodsId.toString() + warehouseId.toString();
             Stock stock = map.get(key);
+
             if (null == stock) {
                 stock = new Stock();
                 stock.setWarehouseId(warehouseId);
                 stock.setGoodsId(goodsId);
-                stock.setQuantity(BigDecimal.ZERO);
-                stock.setFrozenQuantity(changeQuantity);
+                if (typeEnum instanceof InTypeEnum) {
+                    stock.setFrozenQuantity(changeQuantity);
+                } else {
+                    stock.setQuantity(changeQuantity);
+                }
                 map.put(key, stock);
             } else {
-                stock.setFrozenQuantity(stock.getFrozenQuantity().add(changeQuantity));
+                if (typeEnum instanceof InTypeEnum) {
+                    stock.setFrozenQuantity(stock.getFrozenQuantity().add(changeQuantity));
+                } else {
+                    stock.setQuantity(stock.getQuantity().add(changeQuantity));
+                }
             }
         }
+        return map;
+    }
+
+    /**
+     * 变更库存数量
+     */
+    private synchronized void ChangeQuantity(Map<String, Stock> map, Enum<?> typeEnum) {
         Set<String> keySet = map.keySet();
-        if (keySet.size() == 0) {
-            return;
-        }
 
-        synchronized (this) {
-            List<Stock> list = list(Wrappers.<Stock>query().in("CONCAT(goods_id, warehouse_id)", keySet));
-            if (list.size() == 0) {
-                return;
-            }
-            for (Stock stock : list) {
-                String key = stock.getGoodsId() + "" + stock.getWarehouseId();
-                Stock itemStock = map.get(key);
-                itemStock.setId(stock.getId());
-                if (stockChangeVo.getTypeEnum() instanceof InTypeEnum) {
-                    itemStock.setFrozenQuantity(itemStock.getFrozenQuantity().add(stock.getFrozenQuantity()));
-                } else {
-                    BigDecimal quantity = itemStock.getQuantity().subtract(stock.getQuantity());
-                    if (quantity.compareTo(BigDecimal.ZERO) < 0) {
-                        throw new ServiceException("产品库存不足,出库失败");
-                    }
-                    itemStock.setQuantity(quantity);
-                }
+        List<Stock> list = list(Wrappers.<Stock>query().in("CONCAT(goods_id, warehouse_id)", keySet));
+        for (Stock stock : list) {
+            String key = stock.getGoodsId().toString() + stock.getWarehouseId().toString();
+            Stock changeStock = map.get(key);
+
+            changeStock.setId(stock.getId());
+            if (typeEnum instanceof InTypeEnum) {
+                changeStock.setFrozenQuantity(stock.getFrozenQuantity().add(changeStock.getFrozenQuantity()));
+            } else {
+                BigDecimal quantity = stock.getQuantity().subtract(changeStock.getQuantity());
+                Assert.geZero(quantity, "产品库存不足,出库失败");
+                changeStock.setQuantity(quantity);
             }
-            saveOrUpdateBatch(new ArrayList<>(map.values()));
         }
+        saveOrUpdateBatch(new ArrayList<>(map.values()));
+    }
 
+    /**
+     * 添加流水记录
+     */
+    private void addJournal(StockChangeVo stockChangeVo) {
+        List<? extends StockChangeVo.ChangeDetails> changeDetailsList = stockChangeVo.getChangeDetailsList();
+        Enum<?> typeEnum = stockChangeVo.getTypeEnum();
 
         // 添加入库明细
         List<StockJournal> stockJournalList = new ArrayList<>();
@@ -135,30 +158,37 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
 
             // 变更数量
             BigDecimal changeQuantity = changeDetails.getChangeQuantity();
-
             // 变更数量小于等于0,则跳过
             if (changeQuantity.compareTo(BigDecimal.ZERO) <= 0) {
-                return;
+                continue;
             }
 
-            StockJournal stockJournal = new StockJournal();
-
-            Integer type = typeEnum instanceof InTypeEnum ? StockJournalTypeConstant.IN : StockJournalTypeConstant.OUT;
+            // 业务id
+            Long businessId = ObjectUtil.defaultIfNull(changeDetails.getBusinessId(), stockChangeVo.getDefaultBusinessId());
+            // 产品id
+            Long goodsId = changeDetails.getGoodsId();
+            // 仓库id
+            Long warehouseId = ObjectUtil.defaultIfNull(changeDetails.getWarehouseId(), stockChangeVo.getDefaultWarehouseId());
+            // 备注
+            String remarks = ObjectUtil.defaultIfNull(changeDetails.getRemarks(), stockChangeVo.getDefaultRemarks());
 
-            stockJournal.setType(type);
-            stockJournal.setDetailsType(typeEnum instanceof InTypeEnum ?
-                    ((InTypeEnum) typeEnum).getKey() : ((OutTypeEnum) typeEnum).getKey());
-            stockJournal.setBusinessId(ObjectUtil.defaultIfNull(changeDetails.getBusinessId(), stockChangeVo.getDefaultBusinessId()));
-            stockJournal.setGoodsId(changeDetails.getGoodsId());
-            stockJournal.setWarehouseId(changeDetails.getWarehouseId());
-            stockJournal.setChangeQuantity(changeQuantity);
+            StockJournal stockJournal = new StockJournal();
 
             if (typeEnum instanceof InTypeEnum) {
+                stockJournal.setType(StockJournalTypeConstant.IN);
+                stockJournal.setDetailsType(((InTypeEnum) typeEnum).getKey());
                 stockJournal.setActualQuantity(BigDecimal.ZERO);
                 stockJournal.setIsInStock(StatusConstant.NO);
+            } else {
+                stockJournal.setType(StockJournalTypeConstant.OUT);
+                stockJournal.setDetailsType(((OutTypeEnum) typeEnum).getKey());
             }
 
-            stockJournal.setRemarks(ObjectUtil.defaultIfNull(changeDetails.getRemarks(), stockChangeVo.getDefaultRemarks()));
+            stockJournal.setBusinessId(businessId);
+            stockJournal.setGoodsId(goodsId);
+            stockJournal.setWarehouseId(warehouseId);
+            stockJournal.setChangeQuantity(changeQuantity);
+            stockJournal.setRemarks(remarks);
             stockJournalList.add(stockJournal);
         }