Browse Source

feat: 添加批量上架库存功能

luofeiyun 2 weeks ago
parent
commit
92d36a8d80

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

@@ -50,6 +50,13 @@ public class VoyageStockDetailController {
         return success(voyageStockDetailService.createVoyageStock(createReqVO));
     }
 
+    @PostMapping("/batch-create")
+    @Operation(summary = "批量创建航次库存")
+    @PreAuthorize("@ss.hasPermission('product:voyage-stock-detail:batchcreate')")
+    public CommonResult<Boolean> batchCreateVoyageStock(@Valid @RequestBody VoyageStockDetailBatchSaveReqVO createReqVO) {
+        return success(voyageStockDetailService.batchCreateVoyageStock(createReqVO));
+    }
+
     @PutMapping("/update")
     @Operation(summary = "更新航次库存")
     @PreAuthorize("@ss.hasPermission('product:voyage-stock-detail:update')")
@@ -163,6 +170,13 @@ public class VoyageStockDetailController {
         return success(BeanUtils.toBean(list, VoyageStockDetailRespNewVO.class));
     }
 
+    @GetMapping("/getInitByShip")
+    @Operation(summary = "获得初始化航次库存")
+    @Parameter(name = "shipId", description = "船ID", required = true, example = "1024")
+    public CommonResult<List<VoyageStockDetailRespNewVO>> getInitByShip(@RequestParam("shipId") Long shipId) {
+        return success(voyageStockDetailService.getInitByShip(shipId));
+    }
+
     @GetMapping("/getByVoyageIdMap")
     @Operation(summary = "获得航次库存")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")

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

@@ -0,0 +1,29 @@
+package com.yc.ship.module.product.controller.admin.voyagestockdetail.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Schema(description = "管理后台 - 航次库存新增/修改 Request VO")
+@Data
+public class VoyageStockDetailBatchSaveReqVO {
+
+    @Schema(description = "船ID")
+    @ExcelProperty("船ID")
+    private Long shipId;
+
+    @Schema(description = "类型")
+    @ExcelProperty("类型")
+    private Integer type;
+
+    @Schema(description = "航次ID")
+    private List<Long> voyageIds;
+
+    @Schema(description = "航次库存列表")
+    private List<VoyageStockDetailSaveReqVO> list;
+
+
+}

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

@@ -8,6 +8,8 @@ import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockDO;
 import org.apache.ibatis.annotations.Mapper;
 import com.yc.ship.module.product.controller.admin.voyagestock.vo.*;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * 航次库存 Mapper
@@ -27,4 +29,17 @@ public interface VoyageStockMapper extends BaseMapperX<VoyageStockDO> {
     default void deleteByVoyageId(Long id) {
         delete(new LambdaQueryWrapperX<VoyageStockDO>().eq(VoyageStockDO::getVoyageId, id));
     }
+
+    /**
+     * 获取未上架过库存的航次ID
+     * @param shipId
+     * @return
+     */
+    @Select("select voyage_id from product_voyage_stock where voyage_id not in (select voyage_id from product_voyage_stock where shelfed_num <> 0 and ship_id = ${shipId}) and ship_id = ${shipId}")
+    List<Long> selectNoShelfdNumVoyageIdsByShipId(@Param("shipId") Long shipId);
+    /**
+     * 获取未上架过库存的航次ID
+     * @return
+     */
+    List<Long> selectNoShelfdNumVoyageIdsByVoyageIds(@Param("voyageIds") List<Long> voyageIds);
 }

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

@@ -2,6 +2,8 @@ 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.VoyageStockDetailRespNewVO;
 import com.yc.ship.module.product.controller.admin.voyagestockdetail.vo.VoyageStockDetailSaveReqVO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDetailDO;
 
@@ -55,4 +57,18 @@ public interface VoyageStockDetailService {
      * @param distributeNum 已分配给分销商的库存
      */
     void handleShareNum(Long voyageId,  BigDecimal distributeNum);
+
+    /**
+     * 批量初始化库存时设置库存的初始值
+     * @param shipId
+     * @return
+     */
+    List<VoyageStockDetailRespNewVO> getInitByShip(Long shipId);
+
+    /**
+     * 批量初始化库存
+     * @param createReqVO
+     * @return
+     */
+    Boolean batchCreateVoyageStock(VoyageStockDetailBatchSaveReqVO createReqVO);
 }

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

@@ -1,12 +1,19 @@
 package com.yc.ship.module.product.service.voyagestockdetail;
 
+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.mysql.voyagestock.VoyageStockMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestockdistribute.VoyageStockDistributeNewMapper;
 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.dataobject.roommodel.ResourceRoomModelDO;
+import com.yc.ship.module.resource.service.roommodel.ResourceRoomModelService;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
@@ -22,6 +29,7 @@ import com.yc.ship.module.product.dal.mysql.voyagestockdetail.VoyageStockDetailM
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
@@ -46,6 +54,9 @@ public class VoyageStockDetailServiceImpl implements VoyageStockDetailService {
     @Resource
     private RedissonClient redissonClient;
 
+    @Resource
+    private ShipApi shipApi;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean createVoyageStock(List<VoyageStockDetailSaveReqVO> createReqVO) {
@@ -93,6 +104,90 @@ public class VoyageStockDetailServiceImpl implements VoyageStockDetailService {
         stockDO.setShareNum(stockDO.getTotalNum().subtract(distributeNum));
         voyageStockMapper.updateById(stockDO);
     }
+
+    @Override
+    public List<VoyageStockDetailRespNewVO> getInitByShip(Long shipId) {
+        List<VoyageStockDetailDO> result = new ArrayList<>();
+        List<RoomModelFloorNumDTO> list = shipApi.queryRoomModelFloorToNum(shipId);
+        list.stream().forEach(item -> {
+            VoyageStockDetailDO stockDetailDO = new VoyageStockDetailDO();
+            stockDetailDO.setRoomModelId(item.getRoomModelId());
+            stockDetailDO.setRoomModelName(item.getRoomModelName());
+            stockDetailDO.setFloor(item.getFloor());
+            stockDetailDO.setTotalNum(BigDecimal.valueOf(item.getNum()));
+            stockDetailDO.setRealTotalNum(BigDecimal.valueOf(item.getNum()));
+            stockDetailDO.setShelfNum(BigDecimal.ZERO);
+            stockDetailDO.setNotShelfNum(BigDecimal.valueOf(item.getNum()));
+            stockDetailDO.setShelfedNum(BigDecimal.ZERO);
+            stockDetailDO.setBookNum(BigDecimal.ZERO);
+            stockDetailDO.setCanSellNum(BigDecimal.ZERO);
+            stockDetailDO.setOversoldNum(BigDecimal.ZERO);
+            stockDetailDO.setVirtualNum(BigDecimal.ZERO);
+            stockDetailDO.setSurplusNum(BigDecimal.valueOf(item.getNum()));
+            result.add(stockDetailDO);
+        });
+        int intSum = list.stream().mapToInt(RoomModelFloorNumDTO::getNum).sum();
+        BigDecimal sum = BigDecimal.valueOf(intSum);
+        VoyageStockDetailDO voyageStockDO = new VoyageStockDetailDO();
+        voyageStockDO.setTotalNum(sum);
+        voyageStockDO.setRealTotalNum(sum);
+        voyageStockDO.setNotShelfNum(sum);
+        voyageStockDO.setShelfedNum(BigDecimal.ZERO);
+        voyageStockDO.setBookNum(BigDecimal.ZERO);
+        voyageStockDO.setCanSellNum(BigDecimal.ZERO);
+        voyageStockDO.setVirtualNum(BigDecimal.ZERO);
+        voyageStockDO.setOversoldNum(BigDecimal.ZERO);
+        voyageStockDO.setSurplusNum(sum);
+        voyageStockDO.setRoomModelName("合计");
+        voyageStockDO.setFloor(0);
+        result.add(voyageStockDO);
+        return BeanUtils.toBean(result, VoyageStockDetailRespNewVO.class);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean batchCreateVoyageStock(VoyageStockDetailBatchSaveReqVO createReqVO) {
+        if(createReqVO.getList().isEmpty()) {
+            return true;
+        }
+        Long shipId = createReqVO.getShipId();
+        Integer type = createReqVO.getType();
+        //TODO: 该处type不应使用魔法值,后续优化
+        // 批量初始化库存,1表示该邮轮的全部航次,2表示指定航次
+        if(type == 1) {
+            //查询该邮轮未设置库存的航次
+            List<Long> voyageIds = voyageStockMapper.selectNoShelfdNumVoyageIdsByShipId(shipId);
+            handleBatchCreateVoyageStock(voyageIds, createReqVO);
+        }else if(type == 2){
+            List<Long> voyageIds = createReqVO.getVoyageIds();
+            List<Long> voyageIdsNew = voyageStockMapper.selectNoShelfdNumVoyageIdsByVoyageIds(voyageIds);
+            handleBatchCreateVoyageStock(voyageIdsNew, createReqVO);
+        }
+        return true;
+    }
+
+    private Boolean handleBatchCreateVoyageStock(List<Long> voyageIds, VoyageStockDetailBatchSaveReqVO createReqVO) {
+        if(voyageIds.isEmpty()) {
+            return true;
+        }
+        List<VoyageStockDetailDO> list = BeanUtils.toBean(createReqVO.getList(), VoyageStockDetailDO.class);
+        List<VoyageStockDetailDO> insertList = new ArrayList<>();
+        voyageIds.stream().forEach(voyageId -> {
+            voyageStockDetailMapper.deleteByVoyageId(voyageId);
+            list.stream().forEach(item -> {
+                item.setVoyageId(voyageId);
+                if(ProductStockStaticsName.TOTAL.equals(item.getRoomModelName())) {
+                    VoyageStockDO stockDO = BeanUtils.toBean(item, VoyageStockDO.class);
+                    stockDO.setShareNum(stockDO.getTotalNum());
+                    voyageStockMapper.updateById(stockDO);
+                }else {
+                    insertList.add(item);
+                }
+            });
+        });
+        return voyageStockDetailMapper.insertBatch(insertList);
+    }
+
     @Override
     public void updateVoyageStock(VoyageStockDetailSaveReqVO updateReqVO) {
         // 更新

+ 21 - 0
ship-module-product/ship-module-product-biz/src/main/resources/mapper/voyagestock/VoyageStockMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+    <select id="selectNoShelfdNumVoyageIdsByVoyageIds" resultType="java.lang.Long">
+        select voyage_id
+        from product_voyage_stock
+        where voyage_id not in (select voyage_id from product_voyage_stock where shelfed_num != 0)
+         and voyage_id in
+         <foreach item="item" collection="voyageIds" open="(" separator="," close=")">
+            #{item}
+         </foreach>
+    </select>
+</mapper>