ソースを参照

修改库存管理

caotao 2 週間 前
コミット
825443deeb

+ 43 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyagestockdetail/VoyageStockDetailController.java

@@ -168,6 +168,49 @@ public class VoyageStockDetailController {
         return success(BeanUtils.toBean(list, VoyageStockDetailRespNewVO.class));
     }
 
+
+    @GetMapping("/getDetailByVoyageIdNew")
+    @Operation(summary = "获得航次库存")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    public CommonResult<List<VoyageStockDetailNewRespVO>> getVoyageStockDetailByVoyageIdNew(@RequestParam("voyageId") Long voyageId,@RequestParam("shipId") Long shipId) {
+        List<VoyageStockDetailNewRespVO> list = voyageStockDetailService.getVoyageStockDetailByVoyageIdNew(voyageId,shipId);
+        VoyageStockDetailDO insideCabin = voyageStockDetailService.getVoyageStockTotalRow(voyageId);
+        VoyageStockDetailNewRespVO detailNewRespVO = BeanUtils.toBean(insideCabin, VoyageStockDetailNewRespVO.class);
+        detailNewRespVO.setRoomNum(insideCabin.getRealTotalNum());
+
+        //计算合计数
+        VoyageStockDetailNewRespVO sumDetailNewResp = new VoyageStockDetailNewRespVO();
+        sumDetailNewResp.setRoomModelName("合计");
+        sumDetailNewResp.setVoyageId(voyageId);
+        sumDetailNewResp.setFloor(0);
+        sumDetailNewResp.setShelfNum(BigDecimal.ZERO);
+        // 过滤掉"合计"记录,计算其他所有记录的数值字段总和
+        List<VoyageStockDetailNewRespVO> filterList = list.stream()
+                .filter(detail -> !"合计".equals(detail.getRoomModelName()))
+                .collect(Collectors.toList());
+
+        sumDetailNewResp.setRoomNum(filterList.stream().map(VoyageStockDetailNewRespVO::getRoomNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setNotShelfNum(filterList.stream().map(VoyageStockDetailNewRespVO::getNotShelfNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setShelfedNum(filterList.stream().map(VoyageStockDetailNewRespVO::getShelfedNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setBookNum(filterList.stream().map(VoyageStockDetailNewRespVO::getBookNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setCanSellNum(filterList.stream().map(VoyageStockDetailNewRespVO::getCanSellNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setOversoldNum(filterList.stream().map(VoyageStockDetailNewRespVO::getOversoldNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setSurplusNum(filterList.stream().map(VoyageStockDetailNewRespVO::getSurplusNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setVirtualNum(filterList.stream().map(VoyageStockDetailNewRespVO::getVirtualNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setRealTotalNum(filterList.stream().map(VoyageStockDetailNewRespVO::getRealTotalNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setShareNum(filterList.stream().map(VoyageStockDetailNewRespVO::getShareNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setLeaveNum(filterList.stream().map(VoyageStockDetailNewRespVO::getLeaveNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setLockNum(filterList.stream().map(VoyageStockDetailNewRespVO::getLockNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setOtherNum(filterList.stream().map(VoyageStockDetailNewRespVO::getOtherNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        sumDetailNewResp.setAssignRoomNum(filterList.stream().map(VoyageStockDetailNewRespVO::getAssignRoomNum).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        list.add(detailNewRespVO);
+        list.add(sumDetailNewResp);
+        list.stream().forEach(detail -> {
+            detail.setShelfNum(BigDecimal.ZERO);
+        });
+        return success(list);
+    }
+
     @GetMapping("/getInitByShip")
     @Operation(summary = "获得初始化航次库存")
     @Parameter(name = "shipId", description = "船ID", required = true, example = "1024")

+ 99 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyagestockdetail/vo/VoyageStockDetailNewRespVO.java

@@ -0,0 +1,99 @@
+package com.yc.ship.module.product.controller.admin.voyagestockdetail.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 航次库存 Response VO")
+@Data
+public class VoyageStockDetailNewRespVO {
+    /**
+     * ID
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+    /**
+     * 房型ID
+     */
+    private Long roomModelId;
+    /**
+     * 房型名称
+     */
+    private String roomModelName;
+    /**
+     * 航次ID
+     */
+    private Long voyageId;
+    /**
+     * 楼层
+     */
+    private Integer floor;
+    /**
+     * 游轮固定房间数
+     */
+    private BigDecimal roomNum;
+    /**
+     * 本次上架房间数
+     */
+    private BigDecimal shelfNum;
+    /**
+     * 待上架房间数
+     */
+    private BigDecimal notShelfNum;
+    /**
+     * 已上架房间数
+     */
+    private BigDecimal shelfedNum;
+    /**
+     * 预定房间数
+     */
+    private BigDecimal bookNum;
+    /**
+     * 可售房间数
+     */
+    private BigDecimal canSellNum;
+    /**
+     * 超卖房间数
+     */
+    private BigDecimal oversoldNum;
+    /**
+     * 剩余房间数
+     */
+    private BigDecimal surplusNum;
+    /**
+     * 虚拟房间数
+     */
+    private BigDecimal virtualNum;
+
+    /**
+     * 实际房间总数
+     */
+    private BigDecimal realTotalNum;
+
+    /**
+     * 共享库存数
+     */
+    private BigDecimal shareNum;
+
+    /**
+     * 留位数量
+     */
+    private BigDecimal leaveNum;
+
+    /**
+     * 锁位数量
+     */
+    private BigDecimal lockNum;
+
+    /**
+     * 其他数量
+     */
+    private BigDecimal otherNum;
+    /**
+     * 其他数量
+     */
+    private BigDecimal assignRoomNum;
+}

+ 24 - 1
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestockdetail/VoyageStockDetailMapper.java

@@ -10,6 +10,7 @@ import org.apache.ibatis.annotations.Select;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 航次库存 Mapper
@@ -64,5 +65,27 @@ public interface VoyageStockDetailMapper extends BaseMapperX<VoyageStockDetailDO
     @TenantIgnore
     Double selectAllocatedRoomCountByVoyageId(@Param("voyageId") Long voyageId);
 
-
+    /**
+     * 查询留位数、锁定数、其他数
+     *
+     * @param voyageId 航次ID
+     * @return 已锁定房间数
+     */
+    @Select("SELECT" +
+            "    torm.room_model_id AS roomModelId," +
+            "    rrm.name AS roomModelName," +
+            "    torm.floor AS floor," +
+            "    COALESCE(SUM(CASE WHEN td.order_status = 14 THEN torm.use_room_num ELSE 0 END), 0) AS leaveNum," +
+            "    COALESCE(SUM(CASE WHEN td.order_status IN (1, 6) THEN torm.use_room_num ELSE 0 END), 0) AS lockNum," +
+            "    COALESCE(SUM(CASE WHEN td.order_status > 0 AND td.order_status NOT IN (1, 6, 14) THEN torm.use_room_num ELSE 0 END), 0) AS otherNum " +
+            "FROM trade_order td " +
+            "         LEFT JOIN trade_order_room_model torm ON torm.deleted = 0 AND td.id = torm.order_id " +
+            "         LEFT JOIN resource_room_model rrm ON torm.room_model_id = rrm.id AND rrm.deleted = '0' " +
+            "WHERE td.deleted = 0 " +
+            "  AND torm.room_index_id is not null " +
+            "  AND td.voyage_id = #{voyageId} " +
+            "GROUP BY torm.room_model_id, rrm.name, torm.floor " +
+            "ORDER BY torm.room_model_id, torm.floor")
+    @TenantIgnore
+    List<Map<String, Object>> selectLockedAndOtherNum(@Param("voyageId")Long voyageId);
 }

+ 23 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestockdistribute/VoyageStockDistributeNewMapper.java

@@ -4,15 +4,18 @@ package com.yc.ship.module.product.dal.mysql.voyagestockdistribute;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewDetailReqVO;
 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewPageReqVO;
 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewPageRespVO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeNewDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 航次库存分配 Mapper
@@ -52,4 +55,24 @@ public interface VoyageStockDistributeNewMapper extends BaseMapperX<VoyageStockD
     }
 
     List<VoyageStockDistributeNewPageRespVO> selectGroupList(@Param("voyageIds") List<Long> voyageIds, @Param("params") VoyageStockDistributeNewPageReqVO reqVO);
+
+    /**
+     * 查询已分配房间数
+     * @param voyageId
+     * @return
+     */
+    @Select("SELECT" +
+            "    SUM(p.book_num + p.num) AS totalNum," +
+            "    p.room_model_id as roomModelId," +
+            "    p.floor as floor " +
+            "FROM " +
+            "    product_voyage_stock_distribute_new p " +
+            "WHERE" +
+            "    p.voyage_id = #{voyageId} " +
+            "  AND p.deleted = '0' " +
+            "GROUP BY" +
+            "    p.room_model_id," +
+            "    p.floor;")
+    @TenantIgnore
+    List<Map<String, Object>> selectAssignRoomNum(@Param("voyageId")Long voyageId);
 }

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

@@ -3,6 +3,7 @@ package com.yc.ship.module.product.service.voyagestockdetail;
 import javax.validation.*;
 
 import com.yc.ship.module.product.controller.admin.voyagestockdetail.vo.VoyageStockDetailBatchSaveReqVO;
+import com.yc.ship.module.product.controller.admin.voyagestockdetail.vo.VoyageStockDetailNewRespVO;
 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;
@@ -80,4 +81,6 @@ public interface VoyageStockDetailService {
      * @return
      */
     Boolean batchCreateVoyageStock(VoyageStockDetailBatchSaveReqVO createReqVO);
+
+    List<VoyageStockDetailNewRespVO> getVoyageStockDetailByVoyageIdNew(Long voyageId,Long shipId);
 }

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

@@ -3,6 +3,7 @@ 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.VoyageStockDetailNewRespVO;
 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;
@@ -16,6 +17,7 @@ import com.yc.ship.module.product.enums.ProductStockStaticsName;
 import com.yc.ship.module.product.framework.lock.ProductRedisKeyConstants;
 import com.yc.ship.module.resource.api.ship.ShipApi;
 import com.yc.ship.module.resource.api.ship.dto.RoomModelFloorNumDTO;
+import com.yc.ship.module.resource.dal.mysql.room.ResourceRoomMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
@@ -53,6 +55,8 @@ public class VoyageStockDetailServiceImpl implements VoyageStockDetailService {
     @Resource
     private VoyageStockDistributeNewMapper voyageStockDistributeNewMapper;
     @Resource
+    private ResourceRoomMapper resourceRoomMapper;
+    @Resource
     private RedissonClient redissonClient;
 
     @Resource
@@ -180,6 +184,75 @@ public class VoyageStockDetailServiceImpl implements VoyageStockDetailService {
         return true;
     }
 
+    @Override
+    public List<VoyageStockDetailNewRespVO> getVoyageStockDetailByVoyageIdNew(Long voyageId,Long shipId) {
+        List<VoyageStockDetailDO> detailList = voyageStockDetailMapper.selectListByVoyageId(voyageId);
+        List<VoyageStockDetailNewRespVO> bean = BeanUtils.toBean(detailList, VoyageStockDetailNewRespVO.class);
+        //游轮固定房间数
+        List<RoomModelFloorNumDTO> roomNumList = resourceRoomMapper.selectRoomModelFloorToNum(shipId);
+        //获取留位数,锁定数,其他数
+        List<Map<String,Object>> listMap = voyageStockDetailMapper.selectLockedAndOtherNum(voyageId);
+        //获取指定房间数
+        List<Map<String,Object>> assignRoomMap = voyageStockDistributeNewMapper.selectAssignRoomNum(voyageId);
+        Map<String, Map<String, Object>> assignRoomNumMap = assignRoomMap.stream()
+                .collect(Collectors.toMap(
+                        map -> map.get("roomModelId") + "_" + map.get("floor"),
+                        map -> map,
+                        (v1, v2) -> v1
+                ));
+        Map<String, Integer> roomNumMap = roomNumList.stream()
+                .collect(Collectors.toMap(
+                        dto -> dto.getRoomModelId() + "_" + dto.getFloor(),
+                        RoomModelFloorNumDTO::getNum,
+                        (v1, v2) -> v1
+                ));
+        Map<String, Map<String, Object>> lockLeaveMap = listMap.stream()
+                .collect(Collectors.toMap(
+                        map -> map.get("roomModelId") + "_" + map.get("floor"),
+                        map -> map,
+                        (v1, v2) -> v1
+                ));
+
+        bean.forEach(item -> {
+            String key = item.getRoomModelId() + "_" + item.getFloor();
+            // 设置游轮固定房间数
+            Integer num = roomNumMap.get(key);
+            if (num != null) {
+                item.setRoomNum(BigDecimal.valueOf(num));
+            } else {
+                item.setRoomNum(BigDecimal.ZERO);
+            }
+            // 获取指定房间数
+            Map<String, Object> assignRoomData = assignRoomNumMap.get(key);
+            if (assignRoomData != null) {
+                Object assignRoomNum = assignRoomData.get("totalNum");
+                if (assignRoomNum != null) {
+                    item.setAssignRoomNum(new BigDecimal(assignRoomNum.toString()));
+                } else {
+                    item.setAssignRoomNum(BigDecimal.ZERO);
+                }
+            } else {
+                item.setAssignRoomNum(BigDecimal.ZERO);
+            }
+            // 设置留位、锁位、其他数量
+            Map<String, Object> lockLeaveData = lockLeaveMap.get(key);
+            if (lockLeaveData != null) {
+                Object leaveNumObj = lockLeaveData.get("leaveNum");
+                Object lockNumObj = lockLeaveData.get("lockNum");
+                Object otherNumObj = lockLeaveData.get("otherNum");
+
+                item.setLeaveNum(leaveNumObj != null ? new BigDecimal(leaveNumObj.toString()) : BigDecimal.ZERO);
+                item.setLockNum(lockNumObj != null ? new BigDecimal(lockNumObj.toString()) : BigDecimal.ZERO);
+                item.setOtherNum(otherNumObj != null ? new BigDecimal(otherNumObj.toString()) : BigDecimal.ZERO);
+            } else {
+                item.setLeaveNum(BigDecimal.ZERO);
+                item.setLockNum(BigDecimal.ZERO);
+                item.setOtherNum(BigDecimal.ZERO);
+            }
+        });
+        return bean;
+    }
+
     private Boolean handleBatchCreateVoyageStock(List<Long> voyageIds, VoyageStockDetailBatchSaveReqVO createReqVO) {
         if(voyageIds.isEmpty()) {
             return true;