Forráskód Böngészése

商家端 线上预订 信息设置保留时长增加效验 联动分类最长预订时间

qinxuyang 4 hete
szülő
commit
f99197f6b7

+ 30 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreBookingCategoryServiceImpl.java

@@ -6,17 +6,19 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.store.StoreBookingCategory;
+import shop.alien.entity.store.StoreBookingSettings;
 import shop.alien.entity.store.StoreBookingTable;
 import shop.alien.entity.store.UserReservation;
 import shop.alien.mapper.StoreBookingCategoryMapper;
 import shop.alien.mapper.UserReservationMapper;
 import shop.alien.store.service.StoreBookingCategoryService;
+import shop.alien.store.service.StoreBookingSettingsService;
 import shop.alien.store.service.StoreBookingTableService;
 import shop.alien.util.common.JwtUtil;
 
@@ -31,11 +33,20 @@ import java.util.List;
 @Slf4j
 @Service
 @Transactional
-@RequiredArgsConstructor
 public class StoreBookingCategoryServiceImpl extends ServiceImpl<StoreBookingCategoryMapper, StoreBookingCategory> implements StoreBookingCategoryService {
 
     private final StoreBookingTableService storeBookingTableService;
     private final UserReservationMapper userReservationMapper;
+    private final StoreBookingSettingsService storeBookingSettingsService;
+
+    public StoreBookingCategoryServiceImpl(
+            StoreBookingTableService storeBookingTableService,
+            UserReservationMapper userReservationMapper,
+            @Lazy StoreBookingSettingsService storeBookingSettingsService) {
+        this.storeBookingTableService = storeBookingTableService;
+        this.userReservationMapper = userReservationMapper;
+        this.storeBookingSettingsService = storeBookingSettingsService;
+    }
 
     @Override
     public List<StoreBookingCategory> getCategoryList(Integer storeId) {
@@ -92,6 +103,23 @@ public class StoreBookingCategoryServiceImpl extends ServiceImpl<StoreBookingCat
             throw new RuntimeException("最长预订时间必须大于0");
         }
         
+        // 校验:如果当前门店有信息设置,分类中的最长预订时间要超过信息设置的保留时间
+        // 如果没有信息设置,分类的最长预订时间可随意设置
+        StoreBookingSettings settings = storeBookingSettingsService.getByStoreId(category.getStoreId());
+        if (settings != null) {
+            // 如果门店有信息设置,且设置了保留位置(retain_position_flag = 1)
+            if (settings.getRetainPositionFlag() != null && settings.getRetainPositionFlag() == 1) {
+                // 如果设置了保留时长,则分类的最长预订时间要超过保留时长
+                if (settings.getRetentionDuration() != null && settings.getRetentionDuration() > 0) {
+                    if (category.getMaxBookingTime() <= settings.getRetentionDuration()) {
+                        log.warn("新增预订服务分类失败:分类的最长预订时间要超过信息设置的保留时间,maxBookingTime={}, retentionDuration={}", 
+                                category.getMaxBookingTime(), settings.getRetentionDuration());
+                        throw new RuntimeException("分类的最长预订时间要超过信息设置的保留时间(" + settings.getRetentionDuration() + "分钟)");
+                    }
+                }
+            }
+        }
+        
         // 验证图片数量(最多9张)
         String[] images = category.getFloorPlanImages().split(",");
         if (images.length > 9) {

+ 39 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreBookingSettingsServiceImpl.java

@@ -4,14 +4,15 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.store.EssentialHolidayComparison;
 import shop.alien.entity.store.StoreBookingBusinessHours;
+import shop.alien.entity.store.StoreBookingCategory;
 import shop.alien.entity.store.StoreBookingSettings;
 import shop.alien.entity.store.StoreBusinessInfo;
 import shop.alien.entity.store.dto.StoreBookingBusinessHoursDTO;
@@ -20,6 +21,7 @@ import shop.alien.mapper.EssentialHolidayComparisonMapper;
 import shop.alien.mapper.StoreBookingSettingsMapper;
 import shop.alien.mapper.StoreBusinessInfoMapper;
 import shop.alien.store.service.StoreBookingBusinessHoursService;
+import shop.alien.store.service.StoreBookingCategoryService;
 import shop.alien.store.service.StoreBookingSettingsService;
 import shop.alien.util.common.JwtUtil;
 
@@ -37,12 +39,23 @@ import java.util.regex.Pattern;
 @Slf4j
 @Service
 @Transactional
-@RequiredArgsConstructor
 public class StoreBookingSettingsServiceImpl extends ServiceImpl<StoreBookingSettingsMapper, StoreBookingSettings> implements StoreBookingSettingsService {
 
     private final StoreBookingBusinessHoursService storeBookingBusinessHoursService;
     private final EssentialHolidayComparisonMapper essentialHolidayComparisonMapper;
     private final StoreBusinessInfoMapper storeBusinessInfoMapper;
+    private final StoreBookingCategoryService storeBookingCategoryService;
+
+    public StoreBookingSettingsServiceImpl(
+            StoreBookingBusinessHoursService storeBookingBusinessHoursService,
+            EssentialHolidayComparisonMapper essentialHolidayComparisonMapper,
+            StoreBusinessInfoMapper storeBusinessInfoMapper,
+            @Lazy StoreBookingCategoryService storeBookingCategoryService) {
+        this.storeBookingBusinessHoursService = storeBookingBusinessHoursService;
+        this.essentialHolidayComparisonMapper = essentialHolidayComparisonMapper;
+        this.storeBusinessInfoMapper = storeBusinessInfoMapper;
+        this.storeBookingCategoryService = storeBookingCategoryService;
+    }
 
     // 时间格式正则:HH:mm
     private static final Pattern TIME_PATTERN = Pattern.compile("^([0-1][0-9]|2[0-3]):[0-5][0-9]$");
@@ -185,6 +198,30 @@ public class StoreBookingSettingsServiceImpl extends ServiceImpl<StoreBookingSet
     public boolean saveSettingsWithBusinessHours(StoreBookingSettingsDTO dto) {
         log.info("StoreBookingSettingsServiceImpl.saveSettingsWithBusinessHours?dto={}", dto);
         
+        // 校验:如果有保留时长(retain_position_flag = 1),保留时长不能超过分类中的最短最长预订时间
+        // 如果当前门店没有分类,那保留时长可随意设置
+        if (dto.getRetainPositionFlag() != null && dto.getRetainPositionFlag() == 1) {
+            if (dto.getRetentionDuration() != null && dto.getRetentionDuration() > 0) {
+                // 查询该门店下所有分类的最短最长预订时间(最小值)
+                List<StoreBookingCategory> categories = storeBookingCategoryService.getCategoryList(dto.getStoreId());
+                // 如果门店有分类,才进行校验
+                if (categories != null && !categories.isEmpty()) {
+                    Integer minMaxBookingTime = categories.stream()
+                            .filter(c -> c.getMaxBookingTime() != null && c.getMaxBookingTime() > 0)
+                            .map(StoreBookingCategory::getMaxBookingTime)
+                            .min(Integer::compareTo)
+                            .orElse(null);
+                    
+                    if (minMaxBookingTime != null && dto.getRetentionDuration() > minMaxBookingTime) {
+                        log.warn("保留时长不能超过最长预订时长,retentionDuration={}, minMaxBookingTime={}", 
+                                dto.getRetentionDuration(), minMaxBookingTime);
+                        throw new RuntimeException("保留时长不能超过最长预订时长");
+                    }
+                }
+                // 如果门店没有分类,跳过校验,保留时长可随意设置
+            }
+        }
+        
         // 1. 先保存或更新设置信息
         StoreBookingSettings settings = new StoreBookingSettings();
         settings.setId(dto.getId());