Bläddra i källkod

fix: 航次库存详情添加共享库存字段,修改扣库存问题

luofeiyun 3 veckor sedan
förälder
incheckning
1b4d39fc7e

+ 13 - 5
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java

@@ -307,7 +307,7 @@ public class VoyageApiImpl implements VoyageApi {
                         Collectors.mapping(OrderRoomUseDTO::getNum, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)) // 直接使用BigDecimal的reduce操作进行求和
                 ));
         //分销商未分配库存,扣共享库存
-        if (distributeNewResps.isEmpty()) {
+        if (CollectionUtils.isAnyEmpty(distributeNewResps)) {
             //1共享库存
             voyageStockLogDO.setStockType(1);
             //判断共享库存是否充足
@@ -569,6 +569,7 @@ public class VoyageApiImpl implements VoyageApi {
         Long distributorId = voyageStockLogDO.getDistributorId();
         //找到初定时扣库存详情的记录
         List<VoyageStockDetailLogDO> detailLogList = voyageStockDetailLogMapper.selectListByOrder(orderId, TradeOrderStatusEnum.YD.getStatus());
+        Integer stockType = detailLogList.get(0).getStockType();
         if (detailLogList != null && !detailLogList.isEmpty()) {
             //退还航次库存详情
             List<VoyageStockDetailDO> stockDetailList = voyageStockDetailMapper.selectListByVoyageId(voyageId);
@@ -583,10 +584,13 @@ public class VoyageApiImpl implements VoyageApi {
                 item.setCanSellNum(item.getCanSellNum().add(totalNumMap.get(key)));
                 item.setRealTotalNum(item.getRealTotalNum().add(realNumMap.get(key)));
                 item.setVirtualNum(item.getVirtualNum().add(virtualNumMap.get(key)));
+                if(stockType == 1) {//共享库存要还回库存详情
+                    item.setShareNum(item.getShareNum().add(totalNumMap.get(key)));
+                }
             });
             voyageStockDetailMapper.updateBatch(stockDetailList);
 
-            Integer stockType = detailLogList.get(0).getStockType();
+
             //2:还分销商库存
             if (stockType == 2) {
                 //判断分销商库存是否存在
@@ -680,7 +684,7 @@ public class VoyageApiImpl implements VoyageApi {
                         Collectors.mapping(OrderRoomUseDTO::getNum, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
                 ));
         //分销商未分配库存,扣共享库存
-        if (distributeNewRespList.isEmpty()) {
+        if (CollectionUtils.isAnyEmpty(distributeNewRespList)) {
             //1共享库存
             voyageStockLogDO.setStockType(1);
             //判断共享库存是否充足
@@ -690,12 +694,14 @@ public class VoyageApiImpl implements VoyageApi {
             //判断航次房型楼层库存是否充足
             // 判断库存是否充足
             stockDetailList.forEach(item -> {
-                BigDecimal canSellNum = item.getCanSellNum();
+                //这个地方使用共享库存,不使用可销售数
+//                BigDecimal canSellNum = item.getCanSellNum();
+                BigDecimal detailShareNum = item.getShareNum();
                 BigDecimal useNum = roomModelFloorNumMap.get(item.getRoomModelId() + "_" + item.getFloor());
                 if (useNum == null) {
                     useNum = BigDecimal.ZERO;
                 }
-                if (canSellNum.compareTo(useNum) < 0) {
+                if (detailShareNum.compareTo(useNum) < 0) {
                     log.error(String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor()));
                     throw exception0(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getCode(), String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor()));
                 }
@@ -722,6 +728,8 @@ public class VoyageApiImpl implements VoyageApi {
 
                 // 减可售房间数
                 item.setCanSellNum(item.getCanSellNum().subtract(useNum));
+                // 减共享房间数
+                item.setShareNum(item.getShareNum().subtract(useNum));
                 // 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存
                 if (item.getVirtualNum().compareTo(useNum) >= 0) {
                     voyageStockDetailLogDO.setVirtualNum(useNum);

+ 5 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/dataobject/voyagestockdetail/VoyageStockDetailDO.java

@@ -88,4 +88,9 @@ public class VoyageStockDetailDO extends TenantBaseDO {
      */
     private BigDecimal realTotalNum;
 
+    /**
+     * 共享库存数
+     */
+    private BigDecimal shareNum;
+
 }

+ 6 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/dataobject/voyagestockdistribute/VoyageStockDistributeNewDO.java

@@ -66,6 +66,12 @@ public class VoyageStockDistributeNewDO extends TenantBaseDO {
      */
     private BigDecimal num;
 
+    /**
+     * 分配的库存总数 = num + bookNum
+     */
+    @TableField(exist = false)
+    private BigDecimal totalNum;
+
     /**
      * 预订房间数
      */

+ 3 - 1
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestockdetail/VoyageStockDetailService.java

@@ -6,6 +6,7 @@ import com.yc.ship.module.product.controller.admin.voyagestockdetail.vo.VoyageSt
 import com.yc.ship.module.product.controller.admin.voyagestockdetail.vo.VoyageStockDetailRespNewVO;
 import com.yc.ship.module.product.controller.admin.voyagestockdetail.vo.VoyageStockDetailSaveReqVO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDetailDO;
+import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeNewDO;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -55,8 +56,9 @@ public interface VoyageStockDetailService {
      *
      * @param voyageId 航次ID
      * @param distributeNum 已分配给分销商的库存
+     * @param stockDistributeNewDOS 分销商库存详情
      */
-    void handleShareNum(Long voyageId,  BigDecimal distributeNum);
+    void handleShareNum(Long voyageId, BigDecimal distributeNum, List<VoyageStockDistributeNewDO> stockDistributeNewDOS);
 
     /**
      * 批量初始化库存时设置库存的初始值

+ 20 - 2
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestockdetail/VoyageStockDetailServiceImpl.java

@@ -1,12 +1,15 @@
 package com.yc.ship.module.product.service.voyagestockdetail;
 
 import cn.hutool.core.util.IdUtil;
+import com.yc.ship.framework.common.util.collection.CollectionUtils;
 import com.yc.ship.module.product.controller.admin.voyagestockdetail.vo.VoyageStockDetailBatchSaveReqVO;
 import com.yc.ship.module.product.controller.admin.voyagestockdetail.vo.VoyageStockDetailRespNewVO;
 import com.yc.ship.module.product.controller.admin.voyagestockdetail.vo.VoyageStockDetailSaveReqVO;
 import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDetailDO;
+import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDetailLogDO;
+import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeNewDO;
 import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestockdistribute.VoyageStockDistributeNewMapper;
 import com.yc.ship.module.product.enums.ProductStockStaticsName;
@@ -32,6 +35,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -78,7 +82,7 @@ public class VoyageStockDetailServiceImpl implements VoyageStockDetailService {
                     VoyageStockDO stockDO = BeanUtils.toBean(item, VoyageStockDO.class);
                     voyageStockMapper.updateById(stockDO);
                     BigDecimal distributeNum = voyageStockDistributeNewMapper.selectTotalDistributeNum(voyageId);
-                    handleShareNum(voyageId, distributeNum);
+                    handleShareNum(voyageId, distributeNum, null);
                 }else {
                     insertList.add(item);
                 }
@@ -95,15 +99,29 @@ public class VoyageStockDetailServiceImpl implements VoyageStockDetailService {
      * 处理共享库存
      * @param voyageId
      * @param distributeNum 已分配给分销商
+     * stockDistributeNewDOS 分销商库存详情
      */
     @Override
-    public void handleShareNum(Long voyageId,  BigDecimal distributeNum) {
+    public void handleShareNum(Long voyageId,  BigDecimal distributeNum, List<VoyageStockDistributeNewDO> stockDistributeNewDOS) {
         VoyageStockDO stockDO = voyageStockMapper.selectById(voyageId);
         if(distributeNum == null) {
             distributeNum = BigDecimal.ZERO;
         }
         stockDO.setShareNum(stockDO.getCanSellNum().subtract(distributeNum));
         voyageStockMapper.updateById(stockDO);
+        if(stockDistributeNewDOS != null && !stockDistributeNewDOS.isEmpty()) {
+            Map<String, BigDecimal> numMap = CollectionUtils.convertMap(stockDistributeNewDOS, item -> item.getRoomModelId() + "_" + item.getFloor(), item -> item.getNum());
+            Map<String, BigDecimal> totalNumMap = CollectionUtils.convertMap(stockDistributeNewDOS, item -> item.getRoomModelId() + "_" + item.getFloor(), item -> item.getTotalNum());
+            List<VoyageStockDetailDO> list = voyageStockDetailMapper.selectListByVoyageId(voyageId);
+            list.stream().forEach(item -> {
+                BigDecimal num = numMap.get(item.getRoomModelId() + "_" + item.getFloor());
+                BigDecimal totalNum = totalNumMap.get(item.getRoomModelId() + "_" + item.getFloor());
+                if(num != null) {
+                    item.setShareNum(item.getShareNum().subtract(totalNum).add(num));
+                }
+            });
+            voyageStockDetailMapper.updateBatch(list);
+        }
     }
 
     @Override

+ 8 - 1
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestockdistribute/VoyageStockDistributeNewServiceImpl.java

@@ -96,14 +96,17 @@ public class VoyageStockDistributeNewServiceImpl implements VoyageStockDistribut
             voyageStockDistributeRoomService.createVoyageStockDistributeRoomBatch(roomList);
             //修改或插入库存表
             List<VoyageStockDistributeNewDO> list = voyageStockDistributeNewMapper.selectListByVoyageId(voyageId, type);
+            List<VoyageStockDistributeNewDO> totalList = new ArrayList<>();
             if(CollectionUtils.isAnyEmpty(list)) { // 为空则新增
                 list = BeanUtils.toBean(createReqVO, VoyageStockDistributeNewDO.class);
                 list.stream().forEach(item -> {
                     item.setBookNum(zero);
+                    item.setTotalNum(item.getNum());
                 });
                 if(!CollectionUtils.isAnyEmpty(list)) {
                     voyageStockDistributeNewMapper.insertBatch(list);
                 }
+                totalList.addAll(list);
             }else {
                 Map<String, BigDecimal> map = CollectionUtils.convertMap(createReqVO, item -> item.getObjectId() + "_" + item.getRoomModelId() + "_" + item.getFloor(), item -> item.getNum());
                 Map<String, VoyageStockDistributeNewSaveReqVO> mapVO = CollectionUtils.convertMap(createReqVO, item -> item.getObjectId() + "_" + item.getRoomModelId() + "_" + item.getFloor());
@@ -116,21 +119,25 @@ public class VoyageStockDistributeNewServiceImpl implements VoyageStockDistribut
                         VoyageStockDistributeNewDO voyageStockDistributeNewDO = existMap.get(key);
                         voyageStockDistributeNewDO.setNum(map.get(key));
                         voyageStockDistributeNewDO.setRoomModelNum(mapVO.get(key).getRoomModelNum());
+                        voyageStockDistributeNewDO.setTotalNum(voyageStockDistributeNewDO.getNum().add(voyageStockDistributeNewDO.getBookNum()));
                         updateList.add(voyageStockDistributeNewDO);
                     }else { //不存在,做插入
                         VoyageStockDistributeNewDO voyageStockDistributeNewDO = BeanUtils.toBean(mapVO.get(key), VoyageStockDistributeNewDO.class);
+                        voyageStockDistributeNewDO.setTotalNum(voyageStockDistributeNewDO.getNum());
                         insertList.add(voyageStockDistributeNewDO);
                     }
                 });
                 if(!CollectionUtils.isAnyEmpty(updateList)) {
+                    totalList.addAll(updateList);
                     voyageStockDistributeNewMapper.updateBatch(updateList);
                 }
                 if(!CollectionUtils.isAnyEmpty(insertList)) {
+                    totalList.addAll(insertList);
                     voyageStockDistributeNewMapper.insertBatch(insertList);
                 }
             }
             BigDecimal distributeNum = getDistributeNum(voyageId);
-            voyageStockDetailService.handleShareNum(voyageId, distributeNum);
+            voyageStockDetailService.handleShareNum(voyageId, distributeNum, totalList);
         }finally {
             if(lock.isHeldByCurrentThread() && lock.isLocked()){
                 lock.unlock();

+ 1 - 1
ship-module-resource/ship-module-resource-biz/src/main/java/com/yc/ship/module/resource/dal/mysql/room/ResourceRoomMapper.java

@@ -56,7 +56,7 @@ public interface ResourceRoomMapper extends BaseMapperX<ResourceRoomDO> {
         return list.stream().map(ResourceRoomDO::getRoomNum).map(String::valueOf).collect(Collectors.toList());
     }
 
-    @Select("select t1.room_model_id as roomModelId, t1.floors as floor, count(t1.id) as num, t2.name as room_model_name from resource_room t1 left JOIN resource_room_model t2 on t1.room_model_id = t2.id where t1.ship_id = #{shipId} and t2.can_sale = 1 group by t1.room_model_id, t1.floors")
+    @Select("select t1.room_model_id as roomModelId, t1.floors as floor, count(t1.id) as num, t2.name as room_model_name from resource_room t1 left JOIN resource_room_model t2 on t1.room_model_id = t2.id where t1.ship_id = #{shipId} and t2.can_sale = 1 and t1.deleted = 0 and t2.deleted = 0 group by t1.room_model_id, t1.floors")
     List<RoomModelFloorNumDTO> selectRoomModelFloorToNum(Long shipId);
 
     List<ResourceRoomDO> selectRoomListByRoomModelIdAndFloor(@Param("shipId") Long shipId, @Param("roomModelIdFloorList") List<String> roomModelIdFloorList);

+ 1 - 1
ship-module-resource/ship-module-resource-biz/src/main/java/com/yc/ship/module/resource/dal/mysql/route/ResourceRouteMapper.java

@@ -44,6 +44,6 @@ public interface ResourceRouteMapper extends BaseMapperX<ResourceRouteDO> {
                 .eq(ResourceRouteDO::getStatus, CommonStatusEnum.ENABLE.getStatus()));
     }
 
-    @Select("select min(price) min_price, max(price) max_price from product_price_room_model where object_id in (select id from product_price_voyage where route_id = #{routeId} and ship_id = #{shipId})")
+    @Select("select min(price) min_price, max(price) max_price from product_price_room_model where deleted = 0 and object_id in (select id from product_price_voyage where route_id = #{routeId} and ship_id = #{shipId})")
     AppResourceRoutePriceVO selectMinAndMaxPrice(@Param("routeId") Long routeId, @Param("shipId") Long shipId);
 }