Explorar o código

预约服务 分类管理 新增编辑增加分类名称去重判断

qinxuyang hai 2 meses
pai
achega
15439fe1f0

+ 37 - 33
alien-store/src/main/java/shop/alien/store/controller/StoreBookingCategoryController.java

@@ -3,6 +3,7 @@ package shop.alien.store.controller;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
@@ -53,49 +54,48 @@ public class StoreBookingCategoryController {
     }
 
     @ApiOperationSupport(order = 2)
+    @ApiOperation("查询预订服务分类详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "分类ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/detail")
+    public R<StoreBookingCategory> getCategoryDetail(@RequestParam Integer id) {
+        log.info("StoreBookingCategoryController.getCategoryDetail?id={}", id);
+        
+        if (id == null) {
+            return R.fail("分类ID不能为空");
+        }
+        
+        try {
+            StoreBookingCategory category = storeBookingCategoryService.getById(id);
+            if (category == null) {
+                return R.fail("分类不存在");
+            }
+            return R.data(category);
+        } catch (Exception e) {
+            log.error("查询预订服务分类详情失败", e);
+            return R.fail("查询失败:" + e.getMessage());
+        }
+    }
+
+    @ApiOperationSupport(order = 3)
     @ApiOperation("新增预订服务分类")
     @PostMapping("/add")
     public R<StoreBookingCategory> addCategory(@RequestBody StoreBookingCategoryDTO dto) {
         log.info("StoreBookingCategoryController.addCategory?dto={}", dto);
-        
-        // 参数验证
-        if (dto.getStoreId() == null) {
-            return R.fail("门店ID不能为空");
-        }
-        if (!StringUtils.hasText(dto.getCategoryName())) {
-            return R.fail("分类名称不能为空");
-        }
-        if (!StringUtils.hasText(dto.getFloorPlanImages())) {
-            return R.fail("平面图不能为空");
-        }
-        if (dto.getMaxBookingTime() == null || dto.getMaxBookingTime() <= 0) {
-            return R.fail("最长预订时间必须大于0");
-        }
-        
         try {
             StoreBookingCategory category = new StoreBookingCategory();
-            category.setStoreId(dto.getStoreId());
-            category.setCategoryName(dto.getCategoryName());
-            category.setFloorPlanImages(dto.getFloorPlanImages());
-            category.setIsDisplay(dto.getIsDisplay() != null ? dto.getIsDisplay() : 1); // 默认显示
-            category.setMaxBookingTime(dto.getMaxBookingTime());
-            category.setSort(dto.getSort());
-            
-            boolean result = storeBookingCategoryService.addCategory(category);
-            if (result) {
-                // 返回保存后的完整对象
-                StoreBookingCategory savedCategory = storeBookingCategoryService.getById(category.getId());
-                return R.data(savedCategory, "新增成功");
-            } else {
-                return R.fail("新增失败");
-            }
+            BeanUtils.copyProperties(dto, category);
+            storeBookingCategoryService.addCategory(category);
         } catch (Exception e) {
             log.error("新增预订服务分类失败", e);
+            // 如果是名称已存在的错误,直接返回友好提示
             return R.fail("新增失败:" + e.getMessage());
         }
+        return R.success("新增成功");
     }
 
-    @ApiOperationSupport(order = 3)
+    @ApiOperationSupport(order = 4)
     @ApiOperation("编辑预订服务分类")
     @PostMapping("/update")
     public R<String> updateCategory(@RequestBody StoreBookingCategoryDTO dto) {
@@ -132,11 +132,15 @@ public class StoreBookingCategoryController {
             }
         } catch (Exception e) {
             log.error("更新预订服务分类失败", e);
+            // 如果是名称已存在的错误,直接返回友好提示
+            if (e.getMessage() != null && e.getMessage().contains("此名称已存在")) {
+                return R.fail("此名称已存在");
+            }
             return R.fail("更新失败:" + e.getMessage());
         }
     }
 
-    @ApiOperationSupport(order = 4)
+    @ApiOperationSupport(order = 5)
     @ApiOperation("删除预订服务分类")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", value = "分类ID", dataType = "Integer", paramType = "query", required = true)
@@ -162,7 +166,7 @@ public class StoreBookingCategoryController {
         }
     }
 
-    @ApiOperationSupport(order = 5)
+    @ApiOperationSupport(order = 6)
     @ApiOperation("更新预订服务分类排序")
     @PostMapping("/updateSort")
     public R<String> updateCategorySort(@RequestBody StoreBookingCategorySortDTO dto) {

+ 31 - 15
alien-store/src/main/java/shop/alien/store/service/impl/StoreBookingCategoryServiceImpl.java

@@ -72,14 +72,21 @@ public class StoreBookingCategoryServiceImpl extends ServiceImpl<StoreBookingCat
             throw new RuntimeException("平面图最多9张");
         }
         
-        // 检查分类名称是否已存在
+        // 先通过门店ID查询当前门店下的所有分类,检查分类名称是否重复
+        // 处理分类名称:去除前后空格
+        String categoryName = category.getCategoryName().trim();
+        category.setCategoryName(categoryName);
+        
+        // 查询当前门店下是否已存在相同的分类名称(只检查未删除的记录)
         LambdaQueryWrapper<StoreBookingCategory> checkWrapper = new LambdaQueryWrapper<>();
         checkWrapper.eq(StoreBookingCategory::getStoreId, category.getStoreId())
-                .eq(StoreBookingCategory::getCategoryName, category.getCategoryName());
+                .eq(StoreBookingCategory::getCategoryName, categoryName);
+        // @TableLogic 会自动过滤已删除的记录(delete_flag=0)
         StoreBookingCategory existingCategory = this.getOne(checkWrapper);
         if (existingCategory != null) {
-            log.warn("新增预订服务分类失败:分类名称已存在,categoryName={}", category.getCategoryName());
-            throw new RuntimeException("分类名称已存在:" + category.getCategoryName());
+            log.warn("新增预订服务分类失败:当前门店下分类名称已存在,storeId={}, categoryName={}", 
+                    category.getStoreId(), categoryName);
+            throw new RuntimeException("此名称已存在");
         }
         
         // 查询当前最大的排序值
@@ -121,17 +128,26 @@ public class StoreBookingCategoryServiceImpl extends ServiceImpl<StoreBookingCat
             throw new RuntimeException("分类不存在");
         }
         
-        // 如果修改了分类名称,检查新分类名称是否已存在
-        if (StringUtils.hasText(category.getCategoryName()) && 
-            !category.getCategoryName().equals(existingCategory.getCategoryName())) {
-            LambdaQueryWrapper<StoreBookingCategory> wrapper = new LambdaQueryWrapper<>();
-            wrapper.eq(StoreBookingCategory::getStoreId, existingCategory.getStoreId())
-                    .eq(StoreBookingCategory::getCategoryName, category.getCategoryName())
-                    .ne(StoreBookingCategory::getId, category.getId());
-            StoreBookingCategory duplicateCategory = this.getOne(wrapper);
-            if (duplicateCategory != null) {
-                log.warn("更新预订服务分类失败:分类名称已存在,categoryName={}", category.getCategoryName());
-                throw new RuntimeException("分类名称已存在:" + category.getCategoryName());
+        // 如果修改了分类名称,先通过门店ID查询当前门店下的所有分类,检查新分类名称是否重复
+        if (StringUtils.hasText(category.getCategoryName())) {
+            // 处理分类名称:去除前后空格
+            String categoryName = category.getCategoryName().trim();
+            category.setCategoryName(categoryName);
+            
+            // 如果分类名称有变化,检查当前门店下是否已存在相同的分类名称
+            if (!categoryName.equals(existingCategory.getCategoryName())) {
+                // 查询当前门店下是否已存在相同的分类名称(排除当前记录,只检查未删除的记录)
+                LambdaQueryWrapper<StoreBookingCategory> wrapper = new LambdaQueryWrapper<>();
+                wrapper.eq(StoreBookingCategory::getStoreId, existingCategory.getStoreId())
+                        .eq(StoreBookingCategory::getCategoryName, categoryName)
+                        .ne(StoreBookingCategory::getId, category.getId());
+                // @TableLogic 会自动过滤已删除的记录(delete_flag=0)
+                StoreBookingCategory duplicateCategory = this.getOne(wrapper);
+                if (duplicateCategory != null) {
+                    log.warn("更新预订服务分类失败:当前门店下分类名称已存在,storeId={}, categoryName={}, id={}", 
+                            existingCategory.getStoreId(), categoryName, category.getId());
+                    throw new RuntimeException("此名称已存在不能编辑");
+                }
             }
         }