Sfoglia il codice sorgente

fix: 处理初定时的房间使用,使用了的房间就不能操作了

luofeiyun 2 settimane fa
parent
commit
743d9640d4
16 ha cambiato i file con 335 aggiunte e 43 eliminazioni
  1. 3 0
      ship-module-product/ship-module-product-api/src/main/java/com/yc/ship/module/product/api/dto/ReduceStockReqDTO.java
  2. 2 0
      ship-module-product/ship-module-product-api/src/main/java/com/yc/ship/module/product/enums/ErrorCodeConstants.java
  3. 41 16
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java
  4. 4 13
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyagestock/VoyageStockController.java
  5. 65 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/dataobject/voyagestock/VoyageStockRoomUsedDO.java
  6. 1 1
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestock/VoyageStockMapper.java
  7. 55 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestock/VoyageStockRoomUsedMapper.java
  8. 2 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestockdistribute/VoyageStockDistributeNewMapper.java
  9. 11 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestock/VoyageStockRoomUsedService.java
  10. 23 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestock/VoyageStockRoomUsedServiceImpl.java
  11. 1 1
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestock/VoyageStockService.java
  12. 20 2
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestock/VoyageStockServiceImpl.java
  13. 77 9
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestockdistribute/VoyageStockDistributeNewServiceImpl.java
  14. 0 1
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestockdistribute/VoyageStockDistributeServiceImpl.java
  15. 23 0
      ship-module-product/ship-module-product-biz/src/main/resources/mapper/voyagestockdistribute/VoyageStockDistributeNewMapper.xml
  16. 7 0
      ship-module-resource/ship-module-resource-api/src/main/java/com/yc/ship/module/resource/api/room/dto/RoomRespDTO.java

+ 3 - 0
ship-module-product/ship-module-product-api/src/main/java/com/yc/ship/module/product/api/dto/ReduceStockReqDTO.java

@@ -13,6 +13,9 @@ public class ReduceStockReqDTO {
     @Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private Long OrderId;
 
+    @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer orderStatus;
+
     @Schema(description = "航次ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private Long voyageId;
 

+ 2 - 0
ship-module-product/ship-module-product-api/src/main/java/com/yc/ship/module/product/enums/ErrorCodeConstants.java

@@ -49,6 +49,8 @@ public interface ErrorCodeConstants {
 
     ErrorCode VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH = new ErrorCode(10_031, "分销商库存-%s-%s可售房间不足");
 
+    ErrorCode VOYAGE_ROOM_NOT_EXIST = new ErrorCode(10_032, "订单所选房间%s不存在");
+
 
 
 

+ 41 - 16
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java

@@ -7,9 +7,12 @@ import com.yc.ship.module.product.api.dto.ReduceStockReqDTO;
 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewDetailReqVO;
 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewRespVO;
 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockDO;
+import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockRoomUsedDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDetailDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeNewDO;
+import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeRoomDO;
 import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockMapper;
+import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockRoomUsedMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestockdetail.VoyageStockDetailMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestockdistribute.VoyageStockDistributeMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestockdistribute.VoyageStockDistributeNewMapper;
@@ -26,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -55,10 +59,13 @@ public class VoyageApiImpl implements VoyageApi{
     @Resource
     private RedissonClient redissonClient;
 
+    @Resource
+    private VoyageStockRoomUsedMapper voyageStockRoomUsedMapper;
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void preReduceStock(ReduceStockReqDTO reqDTO) {
-        //TODO: 当前阶段不考虑门店库存,此处应标记已使用的房间
+        //TODO: 当前阶段不考虑门店库存
 
         Long voyageId = reqDTO.getVoyageId();
         //现在给整个航次的库存加锁
@@ -93,6 +100,8 @@ public class VoyageApiImpl implements VoyageApi{
         Long distributorId = reqDTO.getDistributorId(); //分销商ID
         Long storeId = reqDTO.getStoreId(); //门店ID
         BigDecimal totalUseNum = reqDTO.getUseRoomNum(); //总共使用房间数量
+        Long orderId = reqDTO.getOrderId();
+        Integer orderStatus = reqDTO.getOrderStatus();
 
         // 获取航次总库存
         VoyageStockDO stockDO = voyageStockMapper.selectById(voyageId);
@@ -111,19 +120,19 @@ public class VoyageApiImpl implements VoyageApi{
         detailReqVO.setType(type);
         detailReqVO.setObjectId(distributorId);
         List<VoyageStockDistributeNewRespVO> distributeNewRespVOS =  voyageStockDistributeNewService.getDetail(detailReqVO);
+        List<ReduceStockReqDTO.OrderRoomDTO> orderRoomList = reqDTO.getOrderRoomList();//订单使用房间详情
+        List<Long> roomIds = CollectionUtils.convertList(orderRoomList, ReduceStockReqDTO.OrderRoomDTO::getRoomId);
+        List<RoomRespDTO> roomList = roomApi.getRoomListByIds(roomIds);
+        Map<Long, BigDecimal> roomMap = CollectionUtils.convertMap(orderRoomList, item -> item.getRoomId(), item -> item.getNum());
+        Map<String, BigDecimal> roomModelFloorNumMap = CollectionUtils.convertMap(roomList,
+                item -> item.getRoomModelId() + "_" + item.getFloors(),
+                item -> roomMap.get(item.getId()) == null ? BigDecimal.ZERO : roomMap.get(item.getId()));
         if(distributeNewRespVOS.isEmpty()) {//分销商未分配库存,扣共享库存
             //判断共享库存是否充足
             if(shareNum.compareTo(totalUseNum) < 0) {
                 throw exception(VOYAGE_SHARE_STOCK_NOT_ENOUGH);
             }
             //判断航次房型楼层库存是否充足
-            List<ReduceStockReqDTO.OrderRoomDTO> orderRoomList = reqDTO.getOrderRoomList();//订单使用房间详情
-            Map<Long, BigDecimal> roomMap = CollectionUtils.convertMap(orderRoomList, item -> item.getRoomId(), item -> item.getNum());
-            List<Long> roomIds = CollectionUtils.convertList(orderRoomList, ReduceStockReqDTO.OrderRoomDTO::getRoomId);
-            List<RoomRespDTO> roomList = roomApi.getRoomListByIds(roomIds);
-            Map<String, BigDecimal> roomModelFloorNumMap = CollectionUtils.convertMap(roomList,
-                    item -> item.getRoomModelId() + "_" + item.getFloors(),
-                    item -> roomMap.get(item.getId()) == null ? BigDecimal.ZERO : roomMap.get(item.getId()));
             // 判断库存是否充足
             stockDetailList.stream().forEach(item -> {
                 BigDecimal canSellNum = item.getCanSellNum();
@@ -181,14 +190,6 @@ public class VoyageApiImpl implements VoyageApi{
             //分销商已分配库存,扣自身库存
 
             //判断航次房型楼层库存是否充足
-            List<ReduceStockReqDTO.OrderRoomDTO> orderRoomList = reqDTO.getOrderRoomList();//订单使用房间详情
-            Map<Long, BigDecimal> roomMap = CollectionUtils.convertMap(orderRoomList, item -> item.getRoomId(), item -> item.getNum());
-            List<Long> roomIds = CollectionUtils.convertList(orderRoomList, ReduceStockReqDTO.OrderRoomDTO::getRoomId);
-            List<RoomRespDTO> roomList = roomApi.getRoomListByIds(roomIds);
-            Map<String, BigDecimal> roomModelFloorNumMap = CollectionUtils.convertMap(roomList,
-                    item -> item.getRoomModelId() + "_" + item.getFloors(),
-                    item -> roomMap.get(item.getId()) == null ? BigDecimal.ZERO : roomMap.get(item.getId()));
-
             distributeNewRespVOS.stream().forEach(item -> {
                 BigDecimal canSellNum = item.getNum();
                 BigDecimal useNum = roomModelFloorNumMap.get(item.getRoomModelId() + "_" + item.getFloor());
@@ -255,5 +256,29 @@ public class VoyageApiImpl implements VoyageApi{
             stockDO.setShareNum(stockDO.getShareNum().subtract(totalUseNum));
             voyageStockMapper.updateById(stockDO);
         }
+        // 添加房间使用记录
+        List<VoyageStockRoomUsedDO> roomUsedList = new ArrayList<>();
+        Map<Long, RoomRespDTO> roomIdMap = CollectionUtils.convertMap(roomList, RoomRespDTO::getId);
+        orderRoomList.forEach(item -> {
+            VoyageStockRoomUsedDO roomUsedDO = new VoyageStockRoomUsedDO();
+            roomUsedDO.setOrderId(orderId);
+            roomUsedDO.setVoyageId(voyageId);
+            RoomRespDTO roomRespDTO = roomIdMap.get(item.getRoomId());
+            if(roomRespDTO == null) {
+                throw exception(VOYAGE_ROOM_NOT_EXIST.getCode(), String.format(VOYAGE_ROOM_NOT_EXIST.getMsg(), item.getRoomId()));
+            }
+            roomUsedDO.setRoomModelId(roomRespDTO.getRoomModelId());
+            roomUsedDO.setFloor(roomRespDTO.getFloors());
+            roomUsedDO.setRoomId(item.getRoomId());
+            roomUsedDO.setNum(item.getNum());
+            roomUsedDO.setStatus(orderStatus);
+            roomUsedList.add(roomUsedDO);
+        });
+        //先删除当前订单已被使用的房间
+        voyageStockRoomUsedMapper.deleteByOrderId(orderId);
+        if(roomUsedList.size() > 0) {
+            voyageStockRoomUsedMapper.insertBatch(roomUsedList);
+        }
+
     }
 }

+ 4 - 13
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyagestock/VoyageStockController.java

@@ -45,8 +45,6 @@ public class VoyageStockController {
     @Resource
     private VoyageStockService voyageStockService;
 
-    @Resource
-    private ShipApi shipApi;
 
     @PostMapping("/create")
     @Operation(summary = "创建航次库存")
@@ -85,15 +83,8 @@ public class VoyageStockController {
     @Operation(summary = "获得航次库存分页")
     @PreAuthorize("@ss.hasPermission('product:voyage-stock:query')")
     public CommonResult<PageResult<VoyageStockRespVO>> getVoyageStockPage(@Valid VoyageStockPageReqVO pageReqVO) {
-        PageResult<VoyageStockDO> pageResult = voyageStockService.getVoyageStockPage(pageReqVO);
-        PageResult<VoyageStockRespVO> page = BeanUtils.toBean(pageResult, VoyageStockRespVO.class);
-        List<VoyageStockRespVO> list = page.getList();
-        List<Long> shipIds = CollectionUtils.convertList(list, VoyageStockRespVO::getShipId);
-        Map<Long, ShipRespDTO> shipMap = shipApi.queryShip(shipIds);
-        list.stream().forEach(item -> {
-            item.setShipName(shipMap.get(item.getShipId()).getName());
-        });
-        return success(page);
+        PageResult<VoyageStockRespVO> pageResult = voyageStockService.getVoyageStockPage(pageReqVO);
+        return success(pageResult);
     }
 
     @GetMapping("/export-excel")
@@ -103,10 +94,10 @@ public class VoyageStockController {
     public void exportVoyageStockExcel(@Valid VoyageStockPageReqVO pageReqVO,
               HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<VoyageStockDO> list = voyageStockService.getVoyageStockPage(pageReqVO).getList();
+        List<VoyageStockRespVO> list = voyageStockService.getVoyageStockPage(pageReqVO).getList();
         // 导出 Excel
         ExcelUtils.write(response, "航次库存.xls", "数据", VoyageStockRespVO.class,
-                        BeanUtils.toBean(list, VoyageStockRespVO.class));
+                       list);
     }
 
 }

+ 65 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/dataobject/voyagestock/VoyageStockRoomUsedDO.java

@@ -0,0 +1,65 @@
+package com.yc.ship.module.product.dal.dataobject.voyagestock;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 已被使用的房间 DO
+ *
+ * @author 管理员
+ */
+@TableName(value = "product_voyage_stock_room_used", autoResultMap = true)
+@KeySequence("product_voyage_stock_room_used_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class VoyageStockRoomUsedDO extends TenantBaseDO {
+
+    /**
+     * ID
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 订单ID
+     */
+    private Long orderId;
+
+    /**
+     * 航次ID
+     */
+    private Long voyageId;
+    /**
+     * 房型ID
+     */
+    private Long roomModelId;
+    /**
+     * 楼层号
+     */
+    private Integer floor;
+
+    /**
+     * 房间ID
+     */
+    private Long roomId;
+
+    /**
+     * 使用数量
+     */
+    private BigDecimal num;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+}

+ 1 - 1
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestock/VoyageStockMapper.java

@@ -21,7 +21,7 @@ public interface VoyageStockMapper extends BaseMapperX<VoyageStockDO> {
         return selectPage(reqVO, new LambdaQueryWrapperX<VoyageStockDO>()
                 .likeIfPresent(VoyageStockDO::getVoyageName, reqVO.getVoyageName())
                 .eqIfPresent(VoyageStockDO::getShipId, reqVO.getShipId())
-                .orderByDesc(VoyageStockDO::getVoyageId));
+                .orderByAsc(VoyageStockDO::getVoyageId));
     }
 
     default void deleteByVoyageId(Long id) {

+ 55 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestock/VoyageStockRoomUsedMapper.java

@@ -0,0 +1,55 @@
+package com.yc.ship.module.product.dal.mysql.voyagestock;
+
+
+import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
+import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockRoomUsedDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 已被使用的房间 Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface VoyageStockRoomUsedMapper extends BaseMapperX<VoyageStockRoomUsedDO> {
+    /**
+     * 获取完全被使用的房间
+     * @param voyageId
+     * @return
+     */
+    default List<VoyageStockRoomUsedDO> selectAllUsedList(Long voyageId) {
+        return selectList(new LambdaQueryWrapperX<VoyageStockRoomUsedDO>()
+                .eq(VoyageStockRoomUsedDO::getVoyageId, voyageId)
+                .eq(VoyageStockRoomUsedDO::getNum, 1));
+    }
+
+    /**
+     * 获取使用了一半的房间
+     * @param voyageId
+     * @return
+     */
+    default List<VoyageStockRoomUsedDO> selectHalfUsedRoom(Long voyageId) {
+        return selectList(new LambdaQueryWrapperX<VoyageStockRoomUsedDO>()
+                .eq(VoyageStockRoomUsedDO::getVoyageId, voyageId)
+                .eq(VoyageStockRoomUsedDO::getNum, 0.5));
+    }
+
+    /**
+     * 获取已被使用的房间
+     * @param voyageId
+     * @return
+     */
+    default List<VoyageStockRoomUsedDO> selectListByVoyageId(Long voyageId) {
+        return selectList(new LambdaQueryWrapperX<VoyageStockRoomUsedDO>()
+                .eq(VoyageStockRoomUsedDO::getVoyageId, voyageId));
+    }
+
+    /**
+     * 删除当前订单使用的房间记录
+     * @param orderId
+     */
+    void deleteByOrderId(Long orderId);
+}

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

@@ -50,4 +50,6 @@ public interface VoyageStockDistributeNewMapper extends BaseMapperX<VoyageStockD
         delete(new LambdaQueryWrapperX<VoyageStockDistributeNewDO>()
                 .eq(VoyageStockDistributeNewDO::getVoyageId, id));
     }
+
+    List<VoyageStockDistributeNewPageRespVO> selectList(@Param("voyageIds") List<Long> voyageIds, @Param("params") VoyageStockDistributeNewPageReqVO reqVO);
 }

+ 11 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestock/VoyageStockRoomUsedService.java

@@ -0,0 +1,11 @@
+package com.yc.ship.module.product.service.voyagestock;
+
+
+
+/**
+ * 航次库存分配 Service 接口
+ *
+ * @author 管理员
+ */
+public interface VoyageStockRoomUsedService {
+}

+ 23 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestock/VoyageStockRoomUsedServiceImpl.java

@@ -0,0 +1,23 @@
+package com.yc.ship.module.product.service.voyagestock;
+
+import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockRoomUsedMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+/**
+ * 航次库存分配给商家的房间 Service 实现类
+ *
+ * @author 管理员
+ */
+@Service
+@Validated
+public class VoyageStockRoomUsedServiceImpl implements VoyageStockRoomUsedService {
+
+    @Resource
+    private VoyageStockRoomUsedMapper voyageStockRoomUsedMapper;
+
+
+
+}

+ 1 - 1
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyagestock/VoyageStockService.java

@@ -48,6 +48,6 @@ public interface VoyageStockService {
      * @param pageReqVO 分页查询
      * @return 航次库存分页
      */
-    PageResult<VoyageStockDO> getVoyageStockPage(VoyageStockPageReqVO pageReqVO);
+    PageResult<VoyageStockRespVO> getVoyageStockPage(VoyageStockPageReqVO pageReqVO);
 
 }

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

@@ -1,5 +1,8 @@
 package com.yc.ship.module.product.service.voyagestock;
 
+import com.yc.ship.framework.common.util.collection.CollectionUtils;
+import com.yc.ship.module.resource.api.ship.ShipApi;
+import com.yc.ship.module.resource.api.ship.dto.ShipRespDTO;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 
@@ -13,6 +16,9 @@ import com.yc.ship.framework.common.util.object.BeanUtils;
 
 import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockMapper;
 
+import java.util.List;
+import java.util.Map;
+
 
 /**
  * 航次库存 Service 实现类
@@ -27,6 +33,10 @@ public class VoyageStockServiceImpl implements VoyageStockService {
     private VoyageStockMapper voyageStockMapper;
 
 
+    @Resource
+    private ShipApi shipApi;
+
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Long createVoyageStock(VoyageStockSaveReqVO createReqVO) {
@@ -57,8 +67,16 @@ public class VoyageStockServiceImpl implements VoyageStockService {
     }
 
     @Override
-    public PageResult<VoyageStockDO> getVoyageStockPage(VoyageStockPageReqVO pageReqVO) {
-        return voyageStockMapper.selectPage(pageReqVO);
+    public PageResult<VoyageStockRespVO> getVoyageStockPage(VoyageStockPageReqVO pageReqVO) {
+        PageResult<VoyageStockDO> pageResult = voyageStockMapper.selectPage(pageReqVO);
+        PageResult<VoyageStockRespVO> page = BeanUtils.toBean(pageResult, VoyageStockRespVO.class);
+        List<VoyageStockRespVO> list = page.getList();
+        List<Long> shipIds = CollectionUtils.convertList(list, VoyageStockRespVO::getShipId);
+        Map<Long, ShipRespDTO> shipMap = shipApi.queryShip(shipIds);
+        list.stream().forEach(item -> {
+            item.setShipName(shipMap.get(item.getShipId()).getName());
+        });
+        return page;
     }
 
 }

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

@@ -6,12 +6,19 @@ import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.framework.common.util.collection.CollectionUtils;
 import com.yc.ship.framework.common.util.object.BeanUtils;
 import com.yc.ship.framework.mybatis.core.util.MyBatisUtils;
+import com.yc.ship.module.product.controller.admin.voyagestock.vo.VoyageStockPageReqVO;
+import com.yc.ship.module.product.controller.admin.voyagestock.vo.VoyageStockRespVO;
 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.*;
+import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockDO;
+import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockRoomUsedDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeNewDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeRoomDO;
+import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockRoomUsedMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestockdistribute.VoyageStockDistributeNewMapper;
 import com.yc.ship.module.product.enums.DistributorOrStoreEnum;
+import com.yc.ship.module.product.enums.YesOrNoEnum;
 import com.yc.ship.module.product.framework.lock.ProductRedisKeyConstants;
+import com.yc.ship.module.product.service.voyagestock.VoyageStockService;
 import com.yc.ship.module.product.service.voyagestockdetail.VoyageStockDetailService;
 import com.yc.ship.module.resource.api.room.RoomApi;
 import com.yc.ship.module.resource.api.room.dto.RoomRespDTO;
@@ -60,6 +67,13 @@ public class VoyageStockDistributeNewServiceImpl implements VoyageStockDistribut
     @Resource
     private RedissonClient redissonClient;
 
+    @Resource
+    private VoyageStockService voyageStockService;
+
+
+    @Resource
+    private VoyageStockRoomUsedMapper voyageStockRoomUsedMapper;
+
 
     @Transactional(rollbackFor = Exception.class)
     @Override
@@ -149,10 +163,17 @@ public class VoyageStockDistributeNewServiceImpl implements VoyageStockDistribut
         // 获取已被分配的房间
         List<VoyageStockDistributeRoomDO> distributeRoomList = voyageStockDistributeRoomService.getListByVoyageId(voyageId, DistributorOrStoreEnum.DISTRIBUTOR.getValue());
         List<Long> selectedRoomIds = CollectionUtils.convertList(distributeRoomList, VoyageStockDistributeRoomDO::getRoomId);
+        //获取已被使用的房间
+        List<VoyageStockRoomUsedDO> roomUsedList = voyageStockRoomUsedMapper.selectListByVoyageId(voyageId);
+        List<Long> usedRoomIds = CollectionUtils.convertList(roomUsedList, VoyageStockRoomUsedDO::getRoomId);
         roomList.stream().forEach(item -> {
             item.setIsSelected(selectedRoomIds.contains(item.getId()));
-            //TODO 待完善,已被销售的房间不可操作
             item.setDisabled(false);//当前全部都可操作
+            if(usedRoomIds.contains(item.getId())) {
+                item.setDisabled(true);
+            }else {
+                item.setDisabled(false);
+            }
         });
         return roomList;
     }
@@ -170,16 +191,58 @@ public class VoyageStockDistributeNewServiceImpl implements VoyageStockDistribut
             roomList = new ArrayList<>();
         }
         List<Long> roomIds = CollectionUtils.convertList(roomList, VoyageStockDistributeRoomDO::getRoomId);
-        List<RoomRespDTO> roomRespList = roomApi.getRoomListByIds(roomIds);
-        //TODO: 待完善,此处应该去掉已被选了的房间
+        //获取完全被使用的房间
+        List<VoyageStockRoomUsedDO> allUsedList = voyageStockRoomUsedMapper.selectAllUsedList(reqVO.getVoyageId());
+        List<Long> allUserRoomId = CollectionUtils.convertList(allUsedList, VoyageStockRoomUsedDO::getRoomId);
+        //过滤掉完全被使用的房间
+        List<Long> canSelectRoomIds = roomIds.stream().filter(item -> !allUserRoomId.contains(item)).collect(Collectors.toList());
+        List<RoomRespDTO> roomRespList = roomApi.getRoomListByIds(canSelectRoomIds);
+        // 获取使用一半的房间
+        List<VoyageStockRoomUsedDO> halfUsedList = voyageStockRoomUsedMapper.selectHalfUsedRoom(reqVO.getVoyageId());
+        List<Long> halfUsedRoomIds = CollectionUtils.convertList(halfUsedList, VoyageStockRoomUsedDO::getRoomId);
+        roomRespList.stream().forEach(item -> {
+           if(halfUsedRoomIds.contains(item.getId())) {
+               item.setNum(BigDecimal.valueOf(0.5));
+           }else {
+               item.setNum(BigDecimal.ONE);
+           }
+        });
         return roomRespList;
     }
 
     @Override
     public PageResult<VoyageStockDistributeNewPageRespVO> getPage(VoyageStockDistributeNewPageReqVO reqVO) {
-        IPage<VoyageStockDistributeNewPageRespVO> page = MyBatisUtils.buildPage(reqVO);
-        IPage iPage = voyageStockDistributeNewMapper.selectPage(page, reqVO);
-        return new PageResult<>(iPage.getRecords(), iPage.getTotal());
+        VoyageStockPageReqVO pageParams = BeanUtils.toBean(reqVO, VoyageStockPageReqVO.class);
+        PageResult<VoyageStockRespVO> voyageStockPage = voyageStockService.getVoyageStockPage(pageParams);
+        List<VoyageStockRespVO> list = voyageStockPage.getList();
+        List<Long> voyageIds = CollectionUtils.convertList(list, VoyageStockRespVO::getVoyageId);
+        List<VoyageStockDistributeNewPageRespVO> distributeNewDOS = voyageStockDistributeNewMapper.selectList(voyageIds, reqVO);
+        Map<Long, BigDecimal> idNumMap = CollectionUtils.convertMap(distributeNewDOS, VoyageStockDistributeNewPageRespVO::getVoyageId, VoyageStockDistributeNewPageRespVO::getNum);
+        Map<Long, BigDecimal> idRoomModelNumMap = CollectionUtils.convertMap(distributeNewDOS, VoyageStockDistributeNewPageRespVO::getVoyageId, VoyageStockDistributeNewPageRespVO::getRoomModelNum);
+        List<VoyageStockDistributeNewPageRespVO> resultList = new ArrayList<>();
+        list.stream().forEach(item -> {
+            BigDecimal num = idNumMap.get(item.getVoyageId());
+            BigDecimal roomModelNum = idRoomModelNumMap.get(item.getVoyageId());
+            VoyageStockDistributeNewPageRespVO respVO = new VoyageStockDistributeNewPageRespVO();
+            respVO.setVoyageId(item.getVoyageId());
+            respVO.setVoyageName(item.getVoyageName());
+            respVO.setShipId(item.getShipId());
+            respVO.setShipName(item.getShipName());
+            if(num != null) {
+                respVO.setNum(num);
+                respVO.setEnableShare(YesOrNoEnum.NO.getType());
+            }else {
+                respVO.setNum(item.getShareNum());
+                respVO.setEnableShare(YesOrNoEnum.YES.getType());
+            }
+            if(roomModelNum != null) {
+                respVO.setRoomModelNum(roomModelNum);
+            }else {
+                respVO.setRoomModelNum(BigDecimal.ZERO);
+            }
+            resultList.add(respVO);
+        });
+        return new PageResult<>(resultList, voyageStockPage.getTotal());
     }
 
     @Override
@@ -231,11 +294,16 @@ public class VoyageStockDistributeNewServiceImpl implements VoyageStockDistribut
         //获取已被门店选择的房间
         List<VoyageStockDistributeRoomDO> storeRoomList = voyageStockDistributeRoomService.getListByVoyageId(voyageId, DistributorOrStoreEnum.STORE.getValue());
         List<Long> selectedStoreRoomIds = CollectionUtils.convertList(storeRoomList, VoyageStockDistributeRoomDO::getRoomId);
-
+        //获取已被使用的房间
+        List<VoyageStockRoomUsedDO> roomUsedList = voyageStockRoomUsedMapper.selectListByVoyageId(voyageId);
+        List<Long> usedRoomIds = CollectionUtils.convertList(roomUsedList, VoyageStockRoomUsedDO::getRoomId);
         roomList.stream().forEach(item -> {
             item.setIsSelected(selectedStoreRoomIds.contains(item.getId()));
-            //TODO 待完善,已被销售的房间不可操作
-            item.setDisabled(false);//当前全部都可操作
+            if(usedRoomIds.contains(item.getId())) {
+                item.setDisabled(true);
+            }else {
+                item.setDisabled(false);
+            }
         });
         return roomList;
     }

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

@@ -330,7 +330,6 @@ public class VoyageStockDistributeServiceImpl implements VoyageStockDistributeSe
             return new ArrayList<Integer>().stream();
         }).collect(Collectors.toList());
         List<RoomRespDTO> result = roomList.stream().filter(room -> canSelectList.contains(room.getRoomNum())).collect(Collectors.toList());
-        //TODO:还要去掉订单中已被选择的房间号
         return result;
     }
 

+ 23 - 0
ship-module-product/ship-module-product-biz/src/main/resources/mapper/voyagestockdistribute/VoyageStockDistributeNewMapper.xml

@@ -42,4 +42,27 @@
         select sum(num) from product_voyage_stock_distribute_new
         where deleted = 0 and voyage_id = #{voyageId} and type = 1
     </select>
+    <select id="selectList"
+            resultType="com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewPageRespVO">
+        SELECT
+        t1.voyage_id,
+        sum( num ) num,
+        sum( room_model_num ) room_model_num,
+        sum(ifnull(book_num,0)) book_num,
+        t1.enable_share
+        FROM
+        product_voyage_stock_distribute_new t1
+        WHERE
+        t1.deleted = 0
+        <if test="voyageIds != null and voyageIds.size() > 0">
+            AND t1.voyage_id in
+            <foreach item="item" collection="voyageIds" separator="," open="(" close=")" index="index">
+                #{item}
+            </foreach>
+        </if>
+        AND t1.object_id = #{params.objectId}
+        AND t1.type = #{params.type}
+        GROUP BY
+        voyage_id
+    </select>
 </mapper>

+ 7 - 0
ship-module-resource/ship-module-resource-api/src/main/java/com/yc/ship/module/resource/api/room/dto/RoomRespDTO.java

@@ -2,6 +2,8 @@ package com.yc.ship.module.resource.api.room.dto;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class RoomRespDTO {
 
@@ -40,4 +42,9 @@ public class RoomRespDTO {
      * 已被卖出的房间不可操作
      */
     private Boolean disabled;
+
+    /**
+     * 房间可以使用的数量
+     */
+    private BigDecimal num;
 }