Browse Source

fix: 修改虚拟库存总库存问题

luofeiyun 1 tuần trước cách đây
mục cha
commit
859bd96c79

+ 123 - 46
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java

@@ -406,6 +406,7 @@ public class VoyageApiImpl implements VoyageApi {
             }
             //判断航次房型楼层库存是否充足
             // 判断库存是否充足
+
             stockDetailList.forEach(item -> {
                 BigDecimal detailShareNum = item.getShareNum();
                 BigDecimal useNum = roomModelFloorNumMap.get(item.getRoomModelId() + "_" + item.getFloor());
@@ -418,6 +419,12 @@ public class VoyageApiImpl implements VoyageApi {
                 }
             });
             // 库存充足,扣库存详情
+            //超卖库存
+            List<BigDecimal> overSoldNum = new ArrayList<>();
+            //使用的实际库存
+            List<BigDecimal> useRealNum = new ArrayList<>();
+            //使用的虚拟库存
+            List<BigDecimal> useVirtualNum = new ArrayList<>();
             stockDetailList.forEach(item -> {
                 BigDecimal useNum = roomModelFloorNumMap.get(item.getRoomModelId() + "_" + item.getFloor());
                 if (useNum == null) {
@@ -442,10 +449,16 @@ public class VoyageApiImpl implements VoyageApi {
                 item.setShareNum(item.getShareNum().subtract(useNum));
                 // 减实际房间数,此处确定,先扣实际库存,实际库存不足再扣细虚拟库存
                 if (item.getRealTotalNum().compareTo(useNum) >= 0) {
+                    useVirtualNum.add(useNum);
                     voyageStockDetailLogDO.setVirtualNum(BigDecimal.ZERO);
                     voyageStockDetailLogDO.setRealNum(useNum);
                     item.setRealTotalNum(item.getRealTotalNum().subtract(useNum));
                 } else {
+                    useRealNum.add(item.getRealTotalNum().add(BigDecimal.ZERO));
+                    useVirtualNum.add(useNum.subtract(item.getRealTotalNum()));
+                    overSoldNum.add(useNum.subtract(item.getRealTotalNum()));
+                    // 加超卖房间数
+                    item.setOversoldNum(item.getOversoldNum().add(useNum.subtract(item.getRealTotalNum())));
                     voyageStockDetailLogDO.setVirtualNum(useNum.subtract(item.getRealTotalNum()));
                     voyageStockDetailLogDO.setRealNum(useNum);
                     // 扣实际房间数
@@ -469,17 +482,28 @@ public class VoyageApiImpl implements VoyageApi {
             // 减可售房间数
             stockDO.setCanSellNum(stockDO.getCanSellNum().subtract(totalUseNum));
             // 减实际房间数,此处确定,先扣实际库存,实际库存不足再扣虚拟库存
-            if (stockDO.getRealTotalNum().compareTo(totalUseNum) >= 0) {
-                stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum));
-                voyageStockLogDO.setVirtualNum(BigDecimal.ZERO);
-                voyageStockLogDO.setRealNum(totalUseNum);
-            } else {
-                voyageStockLogDO.setRealNum(stockDO.getRealTotalNum());
-                voyageStockLogDO.setVirtualNum(totalUseNum.subtract(voyageStockLogDO.getRealNum()));
-                // 扣虚拟房间数
-                stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum.subtract(stockDO.getRealTotalNum())));
-                stockDO.setRealTotalNum(BigDecimal.ZERO);
-            }
+//            if (stockDO.getRealTotalNum().compareTo(totalUseNum) >= 0) {
+//                stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum));
+//                voyageStockLogDO.setVirtualNum(BigDecimal.ZERO);
+//                voyageStockLogDO.setRealNum(totalUseNum);
+//            } else {
+//                voyageStockLogDO.setRealNum(stockDO.getRealTotalNum());
+//                voyageStockLogDO.setVirtualNum(totalUseNum.subtract(voyageStockLogDO.getRealNum()));
+//                // 扣虚拟房间数
+//                stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum.subtract(stockDO.getRealTotalNum())));
+//                stockDO.setRealTotalNum(BigDecimal.ZERO);
+//            }
+            //减虚拟库存
+            BigDecimal totalUseVirtualNum = useVirtualNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseVirtualNum));
+            voyageStockLogDO.setVirtualNum(totalUseVirtualNum);
+            // 减实际库存
+            BigDecimal totalUseRealNum = useRealNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseRealNum));
+            voyageStockLogDO.setRealNum(totalUseRealNum);
+            //加超卖房间数
+            BigDecimal totalOverSoldNum = overSoldNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setOversoldNum(stockDO.getOversoldNum().add(totalOverSoldNum));
             // 加预定房间数
             stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum));
             // 扣共享库存
@@ -525,6 +549,12 @@ public class VoyageApiImpl implements VoyageApi {
             voyageStockDistributeNewMapper.updateBatch(list);
 
             // 库存充足,扣库存详情
+            //超卖库存
+            List<BigDecimal> overSoldNum = new ArrayList<>();
+            //使用的实际库存
+            List<BigDecimal> useRealNum = new ArrayList<>();
+            //使用的虚拟库存
+            List<BigDecimal> useVirtualNum = new ArrayList<>();
             stockDetailList.forEach(item -> {
                 BigDecimal useNum = roomModelFloorNumMap.get(item.getRoomModelId() + "_" + item.getFloor());
                 if (useNum == null) {
@@ -548,15 +578,20 @@ public class VoyageApiImpl implements VoyageApi {
                 item.setCanSellNum(item.getCanSellNum().subtract(useNum));
                 // 减实际房间数,此处确定,先扣实际库存,实际库存不足再扣虚拟库存
                 if (item.getRealTotalNum().compareTo(useNum) >= 0) {
+                    useRealNum.add(useNum);
                     voyageStockDetailLogDO.setRealNum(useNum);
                     voyageStockDetailLogDO.setVirtualNum(BigDecimal.ZERO);
                     item.setRealTotalNum(item.getRealTotalNum().subtract(useNum));
                 } else {
+                    useVirtualNum.add(totalUseNum.subtract(item.getRealTotalNum()));
+                    useRealNum.add(item.getRealTotalNum().add(BigDecimal.ZERO));
+                    overSoldNum.add(totalUseNum.subtract(item.getRealTotalNum()));
                     voyageStockDetailLogDO.setRealNum(item.getRealTotalNum());
                     voyageStockDetailLogDO.setVirtualNum(totalUseNum.subtract(item.getRealTotalNum()));
-                    item.setRealTotalNum(BigDecimal.ZERO);
                     // 扣虚拟房间数
                     item.setVirtualNum(item.getVirtualNum().subtract(useNum.subtract(item.getRealTotalNum())));
+                    item.setRealTotalNum(BigDecimal.ZERO);
+
                 }
                 // 加预定房间数
                 if (item.getBookNum() != null) {
@@ -576,17 +611,28 @@ public class VoyageApiImpl implements VoyageApi {
             // 减剩余房间数
 //            stockDO.setSurplusNum(stockDO.getSurplusNum().subtract(totalUseNum));
             // 减实际房间数,此处确定,先扣实际库存,实际库存不足再扣虚拟库存
-            if (stockDO.getRealTotalNum().compareTo(totalUseNum) >= 0) {
-                stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum));
-                voyageStockLogDO.setRealNum(totalUseNum);
-                voyageStockLogDO.setVirtualNum(BigDecimal.ZERO);
-            } else {
-                voyageStockLogDO.setRealNum(stockDO.getRealTotalNum());
-                voyageStockLogDO.setVirtualNum(totalUseNum.subtract(voyageStockLogDO.getRealNum()));
-                stockDO.setRealTotalNum(BigDecimal.ZERO);
-                // 扣虚拟房间数
-                stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum.subtract(stockDO.getRealTotalNum())));
-            }
+//            if (stockDO.getRealTotalNum().compareTo(totalUseNum) >= 0) {
+//                stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum));
+//                voyageStockLogDO.setRealNum(totalUseNum);
+//                voyageStockLogDO.setVirtualNum(BigDecimal.ZERO);
+//            } else {
+//                voyageStockLogDO.setRealNum(stockDO.getRealTotalNum());
+//                voyageStockLogDO.setVirtualNum(totalUseNum.subtract(voyageStockLogDO.getRealNum()));
+//                stockDO.setRealTotalNum(BigDecimal.ZERO);
+//                // 扣虚拟房间数
+//                stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum.subtract(stockDO.getRealTotalNum())));
+//            }
+            //减实际库存
+            BigDecimal totalUseRealNum = useRealNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseRealNum));
+            voyageStockLogDO.setRealNum(totalUseRealNum);
+            //减虚拟库存
+            BigDecimal totalUseVirtualNum = useVirtualNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseVirtualNum));
+            voyageStockLogDO.setVirtualNum(totalUseVirtualNum);
+            //加超卖数量
+            BigDecimal totalOverSoldNum = overSoldNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setOversoldNum(stockDO.getOversoldNum().add(totalOverSoldNum));
             // 加预定房间数
             stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum));
             // 扣共享库存,此处为分销商库存,不扣共享库存
@@ -816,6 +862,10 @@ public class VoyageApiImpl implements VoyageApi {
             }
             //判断航次房型楼层库存是否充足
             // 判断库存是否充足
+            //使用的实际库存
+            List<BigDecimal> useRealNum = new ArrayList<>();
+            //使用的虚拟库存
+            List<BigDecimal> useVirtualNum = new ArrayList<>();
             stockDetailList.forEach(item -> {
                 //这个地方使用共享库存,不使用可销售数
 //                BigDecimal canSellNum = item.getCanSellNum();
@@ -857,15 +907,19 @@ public class VoyageApiImpl implements VoyageApi {
                 item.setShareNum(item.getShareNum().subtract(useNum));
                 // 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存
                 if (item.getVirtualNum().compareTo(useNum) >= 0) {
+                    useVirtualNum.add(useNum);
                     voyageStockDetailLogDO.setVirtualNum(useNum);
                     voyageStockDetailLogDO.setRealNum(BigDecimal.ZERO);
                     item.setVirtualNum(item.getVirtualNum().subtract(useNum));
                 } else {
+                    useRealNum.add(useNum.subtract(item.getVirtualNum()));
+                    useVirtualNum.add(item.getVirtualNum().add(BigDecimal.ZERO));
                     voyageStockDetailLogDO.setVirtualNum(item.getVirtualNum());
                     voyageStockDetailLogDO.setRealNum(useNum.subtract(item.getVirtualNum()));
                     // 扣实际房间数
                     item.setRealTotalNum(item.getRealTotalNum().subtract(useNum.subtract(item.getVirtualNum())));
                     item.setVirtualNum(BigDecimal.ZERO);
+
                 }
                 // 加预定房间数
                 if (item.getBookNum() != null) {
@@ -883,17 +937,25 @@ public class VoyageApiImpl implements VoyageApi {
             // 减可售房间数
             stockDO.setCanSellNum(stockDO.getCanSellNum().subtract(totalUseNum));
             // 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存
-            if (stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) {
-                stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum));
-                voyageStockLogDO.setVirtualNum(totalUseNum);
-                voyageStockLogDO.setRealNum(BigDecimal.ZERO);
-            } else {
-                voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum());
-                voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum()));
-                // 扣实际房间数
-                stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum())));
-                stockDO.setVirtualNum(BigDecimal.ZERO);
-            }
+            //减实际库存
+            BigDecimal totalUseRealNum = useRealNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseRealNum));
+            voyageStockLogDO.setRealNum(totalUseRealNum);
+            // 减虚拟库存
+            BigDecimal totalUseVirtualNum = useVirtualNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseVirtualNum));
+            voyageStockLogDO.setVirtualNum(totalUseVirtualNum);
+//            if (stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) {
+//                stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum));
+//                voyageStockLogDO.setVirtualNum(totalUseNum);
+//                voyageStockLogDO.setRealNum(BigDecimal.ZERO);
+//            } else {
+//                voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum());
+//                voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum()));
+//                // 扣实际房间数
+//                stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum())));
+//                stockDO.setVirtualNum(BigDecimal.ZERO);
+//            }
             // 加预定房间数
             stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum));
             // 扣共享库存
@@ -938,6 +1000,10 @@ public class VoyageApiImpl implements VoyageApi {
             voyageStockDistributeNewMapper.updateBatch(list);
 
             // 库存充足,扣库存详情
+            //使用的实际库存
+            List<BigDecimal> useRealNum = new ArrayList<>();
+            //使用的虚拟库存
+            List<BigDecimal> useVirtualNum = new ArrayList<>();
             stockDetailList.forEach(item -> {
                 BigDecimal useNum = roomModelFloorNumMap.get(item.getRoomModelId() + "_" + item.getFloor());
                 if (useNum == null) {
@@ -962,15 +1028,18 @@ public class VoyageApiImpl implements VoyageApi {
                 item.setCanSellNum(item.getCanSellNum().subtract(useNum));
                 // 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存
                 if (item.getVirtualNum().compareTo(useNum) >= 0) {
+                    useVirtualNum.add(useNum);
                     voyageStockDetailLogDO.setVirtualNum(useNum);
                     voyageStockDetailLogDO.setRealNum(BigDecimal.ZERO);
                     item.setVirtualNum(item.getVirtualNum().subtract(useNum));
                 } else {
+                    useRealNum.add(useNum.subtract(item.getVirtualNum()));
+                    useVirtualNum.add(item.getVirtualNum().add(BigDecimal.ZERO));
                     voyageStockDetailLogDO.setVirtualNum(item.getVirtualNum());
                     voyageStockDetailLogDO.setRealNum(totalUseNum.subtract(item.getVirtualNum()));
-                    item.setVirtualNum(BigDecimal.ZERO);
                     // 扣实际房间数
                     item.setRealTotalNum(item.getRealTotalNum().subtract(useNum.subtract(item.getVirtualNum())));
+                    item.setVirtualNum(BigDecimal.ZERO);
                 }
                 // 加预定房间数
                 if (item.getBookNum() != null) {
@@ -990,17 +1059,25 @@ public class VoyageApiImpl implements VoyageApi {
             // 减剩余房间数
 //            stockDO.setSurplusNum(stockDO.getSurplusNum().subtract(totalUseNum));
             // 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存
-            if (stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) {
-                stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum));
-                voyageStockLogDO.setVirtualNum(totalUseNum);
-                voyageStockLogDO.setRealNum(BigDecimal.ZERO);
-            } else {
-                voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum());
-                voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum()));
-                stockDO.setVirtualNum(BigDecimal.ZERO);
-                // 扣实际房间数
-                stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum())));
-            }
+            //减实际库存
+            BigDecimal totalUseRealNum = useRealNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseRealNum));
+            voyageStockLogDO.setRealNum(totalUseRealNum);
+            // 减虚拟库存
+            BigDecimal totalUseVirtualNum = useVirtualNum.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+            stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseVirtualNum));
+            voyageStockLogDO.setVirtualNum(totalUseVirtualNum);
+//            if (stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) {
+//                stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum));
+//                voyageStockLogDO.setVirtualNum(totalUseNum);
+//                voyageStockLogDO.setRealNum(BigDecimal.ZERO);
+//            } else {
+//                voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum());
+//                voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum()));
+//                stockDO.setVirtualNum(BigDecimal.ZERO);
+//                // 扣实际房间数
+//                stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum())));
+//            }
             // 加预定房间数
             stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum));
             // 扣共享库存,此处为分销商库存,不扣共享库存