浏览代码

fix:批量生成航次信息

luofeiyun 1 月之前
父节点
当前提交
5ca12ccd47

+ 7 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyage/VoyageController.java

@@ -53,6 +53,13 @@ public class VoyageController {
         return success(voyageService.createVoyage(createReqVO));
     }
 
+    @PostMapping("/create-batch")
+    @Operation(summary = "批量创建航次管理")
+    @PreAuthorize("@ss.hasPermission('product:voyage:batchCreate')")
+    public CommonResult<Boolean> createVoyageBatch(@Valid @RequestBody VoyageSaveBatchReqVO createReqVO) {
+        voyageService.createVoyageBatch(createReqVO);
+        return success(true);
+    }
     @PutMapping("/update")
     @Operation(summary = "更新航次管理")
     @PreAuthorize("@ss.hasPermission('product:voyage:update')")

+ 62 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyage/vo/VoyageSaveBatchReqVO.java

@@ -0,0 +1,62 @@
+package com.yc.ship.module.product.controller.admin.voyage.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 批量保存航次管理
+ *
+ * @author yc
+ * @since 2023-04-23
+ */
+@Schema(description = "管理后台 - 批量保存航次管理")
+@Data
+public class VoyageSaveBatchReqVO {
+
+    @Schema(description = "开始时间")
+    private LocalDate startDate;
+    @Schema(description = "结束时间")
+    private LocalDate endDate;
+    @Schema(description = "航次天数")
+    private Integer voyageDays;
+    @Schema(description = "间隔天数")
+    private Integer intervalDays;
+    @Schema(description = "游轮", example = "6699")
+    private Long shipId;
+    @Schema(description = "航线", example = "4445")
+    private Long routeId;
+    @Schema(description = "登船时间")
+    private String boardingTime;
+    @Schema(description = "开航时间")
+    private String startTime;
+    @Schema(description = "离船时间")
+    private String leaveTime;
+    @Schema(description = "航次类别", example = "1")
+    private Integer type;
+    @Schema(description = "登船码头ID")
+    private Long boardingDockId;
+    @Schema(description = "登船地点")
+    private String boardingAddress;
+    @Schema(description = "离船地点")
+    private String leaveAddress;
+    @Schema(description = "预定渠道")
+    private List<Integer> channel;
+
+    @Schema(description = "库存是否可见")
+    private Integer stockVisible;
+
+    @Schema(description = "上架状态", example = "1")
+    private Integer shelfStatus;
+
+    @Schema(description = "集合地点")
+    private String venue;
+
+    @Schema(description = "产品介绍")
+    private String introduce;
+
+    @Schema(description = "登船须知")
+    private String notice;
+}

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

@@ -9,6 +9,7 @@ import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
 import com.yc.ship.module.product.enums.VoyageShelfStatusEnum;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.time.LocalDate;
 import java.util.List;
 
 /**
@@ -49,4 +50,18 @@ public interface VoyageMapper extends BaseMapperX<VoyageDO> {
                 .eq(VoyageDO::getShelfStatus, VoyageShelfStatusEnum.ON_SHELF.getValue())
                 .orderByAsc(VoyageDO::getCreateTime));
     }
+
+    /**
+     * 删除该日期内当前游轮当前航线的所有航次
+     * @param startDate
+     * @param endDate
+     * @param shipId
+     * @param routeId
+     */
+    default void deleteByShipIdAndRouteId(LocalDate startDate, LocalDate endDate, Long shipId, Long routeId) {
+        delete(new LambdaQueryWrapperX<VoyageDO>()
+                .between(VoyageDO::getStartTime, startDate, endDate)
+                .eq(VoyageDO::getShipId, shipId)
+                .eq(VoyageDO::getRouteId, routeId));
+    }
 }

+ 7 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyage/VoyageService.java

@@ -3,6 +3,7 @@ package com.yc.ship.module.product.service.voyage;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.module.product.controller.admin.voyage.vo.VoyagePageReqVO;
 import com.yc.ship.module.product.controller.admin.voyage.vo.VoyageReqVO;
+import com.yc.ship.module.product.controller.admin.voyage.vo.VoyageSaveBatchReqVO;
 import com.yc.ship.module.product.controller.admin.voyage.vo.VoyageSaveReqVO;
 import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
 
@@ -67,4 +68,10 @@ public interface VoyageService {
      * @return
      */
     List<VoyageDO> getOnShelfListByShipId(Long shipId);
+
+    /**
+     * 批量创建航次
+     * @param createReqVO
+     */
+    void createVoyageBatch(VoyageSaveBatchReqVO createReqVO);
 }

+ 103 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyage/VoyageServiceImpl.java

@@ -1,10 +1,15 @@
 package com.yc.ship.module.product.service.voyage;
 
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.IdUtil;
 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.module.product.controller.admin.voyage.vo.VoyagePageReqVO;
 import com.yc.ship.module.product.controller.admin.voyage.vo.VoyageReqVO;
+import com.yc.ship.module.product.controller.admin.voyage.vo.VoyageSaveBatchReqVO;
 import com.yc.ship.module.product.controller.admin.voyage.vo.VoyageSaveReqVO;
 import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockDO;
@@ -12,6 +17,7 @@ import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDe
 import com.yc.ship.module.product.dal.mysql.voyage.VoyageMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestockdetail.VoyageStockDetailMapper;
+import com.yc.ship.module.product.enums.YesOrNoEnum;
 import com.yc.ship.module.product.utils.VoyageUUCodeUtils;
 import com.yc.ship.module.resource.api.ship.ShipApi;
 import com.yc.ship.module.resource.api.ship.dto.RoomModelFloorNumDTO;
@@ -22,6 +28,7 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -127,6 +134,53 @@ public class VoyageServiceImpl implements VoyageService {
         }
     }
 
+    private void saveOrUpdateVoyageStockBatch(List<VoyageDO> voyageDOList, Long shipId) {
+        // 批量插入库存统计数据
+        List<VoyageStockDO> voyageStockDOList = new ArrayList<>();
+        //添加库存详情
+        List<VoyageStockDetailDO> stockDetailDOS = new ArrayList<>();
+        //新增时添加统计数据
+        List<RoomModelFloorNumDTO> list = shipApi.queryRoomModelFloorToNum(shipId);
+        int sum = list.stream().mapToInt(RoomModelFloorNumDTO::getNum).sum();
+        voyageDOList.stream().forEach(item -> {
+            VoyageStockDO voyageStockDO = new VoyageStockDO();
+            voyageStockDO.setVoyageId(item.getId());
+            voyageStockDO.setVoyageName(item.getName());
+            voyageStockDO.setShipId(item.getShipId());
+            voyageStockDO.setType(item.getType());
+            voyageStockDO.setTotalNum(sum);
+            voyageStockDO.setRealTotalNum(sum);
+            voyageStockDO.setNotShelfNum(sum);
+            voyageStockDO.setShelfedNum(0);
+            voyageStockDO.setBookNum(0);
+            voyageStockDO.setCanSellNum(0);
+            voyageStockDO.setVirtualNum(0);
+            voyageStockDO.setOversoldNum(0);
+            voyageStockDO.setSurplusNum(sum);
+            voyageStockDOList.add(voyageStockDO);
+            list.stream().forEach(roomModelFloorNumDTO -> {
+                VoyageStockDetailDO stockDetailDO = new VoyageStockDetailDO();
+                stockDetailDO.setVoyageId(item.getId());
+                stockDetailDO.setRoomModelId(roomModelFloorNumDTO.getRoomModelId());
+                stockDetailDO.setRoomModelName(roomModelFloorNumDTO.getRoomModelName());
+                stockDetailDO.setFloor(roomModelFloorNumDTO.getFloor());
+                stockDetailDO.setTotalNum(roomModelFloorNumDTO.getNum());
+                stockDetailDO.setRealTotalNum(roomModelFloorNumDTO.getNum());
+                stockDetailDO.setShelfNum(0);
+                stockDetailDO.setNotShelfNum(roomModelFloorNumDTO.getNum());
+                stockDetailDO.setShelfedNum(0);
+                stockDetailDO.setBookNum(0);
+                stockDetailDO.setCanSellNum(0);
+                stockDetailDO.setOversoldNum(0);
+                stockDetailDO.setVirtualNum(0);
+                stockDetailDO.setSurplusNum(roomModelFloorNumDTO.getNum());
+                stockDetailDOS.add(stockDetailDO);
+            });
+        });
+        voyageStockMapper.insertBatch(voyageStockDOList);
+        voyageStockDetailMapper.insertBatch(stockDetailDOS);
+    }
+
     @Override
     public void deleteVoyage(Long id) {
         // 校验存在
@@ -175,4 +229,53 @@ public class VoyageServiceImpl implements VoyageService {
         return voyageMapper.selectOnShelfListByShipId(shipId);
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void createVoyageBatch(VoyageSaveBatchReqVO createReqVO) {
+        LocalDate startDate = createReqVO.getStartDate();
+        LocalDate endDate = createReqVO.getEndDate();
+        Integer voyageDays = createReqVO.getVoyageDays();
+        Integer intervalDays = createReqVO.getIntervalDays();
+        String startTime = createReqVO.getStartTime();
+        String leaveTime = createReqVO.getLeaveTime();
+        String boardingTime = createReqVO.getBoardingTime();
+        Long shipId = createReqVO.getShipId();
+
+        // 删除该日期内当前游轮当前航线的所有航次
+        voyageMapper.deleteByShipIdAndRouteId(startDate, endDate, shipId, createReqVO.getRouteId());
+
+        ShipRespDTO shipRespDTO = shipApi.queryShip(shipId);
+        List<VoyageDO> voyageDOList = new ArrayList<>();
+        while (startDate.isBefore(endDate)) {
+            VoyageDO voyageDO = new VoyageDO();
+            Long id = IdUtil.getSnowflakeNextId();
+            voyageDO.setId(id);
+            LocalDate leaveDate = startDate.plusDays(voyageDays);// 离船日期
+            String startDateStr = LocalDateTimeUtil.format(startDate, DatePattern.NORM_DATE_PATTERN);
+            voyageDO.setName(shipRespDTO.getName()+startDateStr);
+            voyageDO.setCode(VoyageUUCodeUtils.generateVoyageNo(shipRespDTO.getCode(), startDateStr, createReqVO.getBoardingAddress(), createReqVO.getLeaveAddress()));
+            voyageDO.setShipId(shipId);
+            voyageDO.setRouteId(createReqVO.getRouteId());
+            voyageDO.setStartTime(LocalDateTimeUtil.parse(startDateStr+"T"+startTime));
+            voyageDO.setLeaveTime(LocalDateTimeUtil.parse(leaveDate+"T"+leaveTime));
+            voyageDO.setBoardingTime(LocalDateTimeUtil.parse(startDateStr+"T"+boardingTime));
+            voyageDO.setType(createReqVO.getType());
+            voyageDO.setTransfer(YesOrNoEnum.NO.getType());
+            voyageDO.setTransferTime(null);
+            voyageDO.setBoardingDockId(createReqVO.getBoardingDockId());
+            voyageDO.setBoardingAddress(createReqVO.getBoardingAddress());
+            voyageDO.setLeaveAddress(createReqVO.getLeaveAddress());
+            voyageDO.setChannel(createReqVO.getChannel());
+            voyageDO.setStockVisible(createReqVO.getStockVisible());
+            voyageDO.setShelfStatus(createReqVO.getShelfStatus());
+            voyageDO.setVenue(createReqVO.getVenue());
+            voyageDO.setIntroduce(createReqVO.getIntroduce());
+            voyageDO.setNotice(createReqVO.getNotice());
+            voyageDOList.add(voyageDO);
+            startDate = leaveDate.plusDays(intervalDays);
+        }
+        voyageMapper.insertBatch(voyageDOList);
+        saveOrUpdateVoyageStockBatch(voyageDOList, shipId);
+    }
+
 }

+ 11 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/utils/VoyageUUCodeUtils.java

@@ -27,6 +27,17 @@ public class VoyageUUCodeUtils {
         return shipCode + "-" + startTimeStr + "-" + boardPy + "-" + leavePy;
     }
 
+    /**
+     * 规则是游轮编号+航次日期+起始地字母,例如 CJXLY-20250904-YC-CQ,
+     * 意思是 长江行揽月+20250901+宜昌+重庆
+     * @return
+     */
+    public static String generateVoyageNo(String shipCode, String starDate, String boardingAddress, String leaveAddress) {
+        String boardPy = getFirstSpell(boardingAddress);
+        String leavePy = getFirstSpell(leaveAddress);
+        return shipCode + "-" + starDate + "-" + boardPy + "-" + leavePy;
+    }
+
     /**
      * 获取汉字串拼音首字母,英文字符不变
      * @param chinese 汉字串