Преглед на файлове

预约服务 桌号管理 增删改查

qinxuyang преди 2 месеца
родител
ревизия
bb4a5eaa92

+ 66 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreBookingTable.java

@@ -0,0 +1,66 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 预订服务桌号表
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude
+@TableName("store_booking_table")
+@ApiModel(value = "StoreBookingTable对象", description = "预订服务桌号表")
+public class StoreBookingTable {
+
+    @ApiModelProperty(value = "主键ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "门店ID")
+    @TableField("store_id")
+    private Integer storeId;
+
+    @ApiModelProperty(value = "分类ID(关联store_booking_category表)")
+    @TableField("category_id")
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "桌号")
+    @TableField("table_number")
+    private String tableNumber;
+
+    @ApiModelProperty(value = "座位数")
+    @TableField("seating_capacity")
+    private Integer seatingCapacity;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 33 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/StoreBookingTableDTO.java

@@ -0,0 +1,33 @@
+package shop.alien.entity.store.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 预订服务桌号DTO
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "StoreBookingTableDTO", description = "预订服务桌号DTO")
+public class StoreBookingTableDTO {
+
+    @ApiModelProperty(value = "桌号ID(编辑时必填)")
+    private Integer id;
+
+    @ApiModelProperty(value = "门店ID", required = true)
+    private Integer storeId;
+
+    @ApiModelProperty(value = "分类ID(关联store_booking_category表)", required = true)
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "桌号", required = true)
+    private String tableNumber;
+
+    @ApiModelProperty(value = "座位数", required = true)
+    private Integer seatingCapacity;
+}

+ 13 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreBookingTableMapper.java

@@ -0,0 +1,13 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.StoreBookingTable;
+
+/**
+ * 预订服务桌号表 Mapper 接口
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+public interface StoreBookingTableMapper extends BaseMapper<StoreBookingTable> {
+}

+ 25 - 0
alien-entity/src/main/resources/mapper/StoreBookingTableMapper.xml

@@ -0,0 +1,25 @@
+<?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="shop.alien.mapper.StoreBookingTableMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="shop.alien.entity.store.StoreBookingTable">
+        <id column="id" property="id" />
+        <result column="store_id" property="storeId" />
+        <result column="category_id" property="categoryId" />
+        <result column="table_number" property="tableNumber" />
+        <result column="seating_capacity" property="seatingCapacity" />
+        <result column="delete_flag" property="deleteFlag" />
+        <result column="created_time" property="createdTime" />
+        <result column="created_user_id" property="createdUserId" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="updated_user_id" property="updatedUserId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, store_id, category_id, table_number, seating_capacity, 
+        delete_flag, created_time, created_user_id, updated_time, updated_user_id
+    </sql>
+
+</mapper>

+ 191 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreBookingTableController.java

@@ -0,0 +1,191 @@
+package shop.alien.store.controller;
+
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreBookingTable;
+import shop.alien.entity.store.dto.StoreBookingTableDTO;
+import shop.alien.store.service.StoreBookingTableService;
+
+import java.util.List;
+
+/**
+ * 预订服务桌号管理 前端控制器
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Api(tags = {"预订服务-桌号管理"})
+@ApiSort(16)
+@CrossOrigin
+@RestController
+@RequestMapping("/store/booking/table")
+@RequiredArgsConstructor
+public class StoreBookingTableController {
+
+    private final StoreBookingTableService storeBookingTableService;
+
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("查询预订服务桌号列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "storeId", value = "门店ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "categoryId", value = "分类ID(可选,不传则查询全部)", dataType = "Integer", paramType = "query", required = false)
+    })
+    @GetMapping("/list")
+    public R<List<StoreBookingTable>> getTableList(
+            @RequestParam Integer storeId,
+            @RequestParam(required = false) Integer categoryId) {
+        log.info("StoreBookingTableController.getTableList?storeId={}, categoryId={}", storeId, categoryId);
+        
+        if (storeId == null) {
+            return R.fail("门店ID不能为空");
+        }
+        
+        try {
+            List<StoreBookingTable> list = storeBookingTableService.getTableList(storeId, categoryId);
+            return R.data(list);
+        } catch (Exception e) {
+            log.error("查询预订服务桌号列表失败", e);
+            return R.fail("查询失败:" + e.getMessage());
+        }
+    }
+
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("查询预订服务桌号详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "桌号ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/detail")
+    public R<StoreBookingTable> getTableDetail(@RequestParam Integer id) {
+        log.info("StoreBookingTableController.getTableDetail?id={}", id);
+        
+        if (id == null) {
+            return R.fail("桌号ID不能为空");
+        }
+        
+        try {
+            StoreBookingTable table = storeBookingTableService.getById(id);
+            if (table == null) {
+                return R.fail("桌号不存在");
+            }
+            return R.data(table);
+        } catch (Exception e) {
+            log.error("查询预订服务桌号详情失败", e);
+            return R.fail("查询失败:" + e.getMessage());
+        }
+    }
+
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("新增预订服务桌号")
+    @PostMapping("/add")
+    public R<StoreBookingTable> addTable(@RequestBody StoreBookingTableDTO dto) {
+        log.info("StoreBookingTableController.addTable?dto={}", dto);
+        
+        // 参数验证
+        if (dto.getStoreId() == null) {
+            return R.fail("门店ID不能为空");
+        }
+        if (dto.getCategoryId() == null) {
+            return R.fail("分类ID不能为空");
+        }
+        if (!StringUtils.hasText(dto.getTableNumber())) {
+            return R.fail("桌号不能为空");
+        }
+        if (dto.getSeatingCapacity() == null || dto.getSeatingCapacity() <= 0) {
+            return R.fail("座位数必须大于0");
+        }
+        
+        try {
+            StoreBookingTable table = new StoreBookingTable();
+            table.setStoreId(dto.getStoreId());
+            table.setCategoryId(dto.getCategoryId());
+            table.setTableNumber(dto.getTableNumber());
+            table.setSeatingCapacity(dto.getSeatingCapacity());
+            
+            boolean result = storeBookingTableService.addTable(table);
+            if (result) {
+                // 返回保存后的完整对象
+                StoreBookingTable savedTable = storeBookingTableService.getById(table.getId());
+                return R.data(savedTable, "新增成功");
+            } else {
+                return R.fail("新增失败");
+            }
+        } catch (Exception e) {
+            log.error("新增预订服务桌号失败", e);
+            // 如果是桌号已存在的错误,直接返回友好提示
+            if (e.getMessage() != null && e.getMessage().contains("此桌号已存在")) {
+                return R.fail("此桌号已存在");
+            }
+            return R.fail("新增失败:" + e.getMessage());
+        }
+    }
+
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("编辑预订服务桌号")
+    @PostMapping("/update")
+    public R<String> updateTable(@RequestBody StoreBookingTableDTO dto) {
+        log.info("StoreBookingTableController.updateTable?dto={}", dto);
+        
+        if (dto.getId() == null) {
+            return R.fail("桌号ID不能为空");
+        }
+        
+        try {
+            StoreBookingTable table = new StoreBookingTable();
+            table.setId(dto.getId());
+            if (dto.getCategoryId() != null) {
+                table.setCategoryId(dto.getCategoryId());
+            }
+            if (StringUtils.hasText(dto.getTableNumber())) {
+                table.setTableNumber(dto.getTableNumber());
+            }
+            if (dto.getSeatingCapacity() != null) {
+                table.setSeatingCapacity(dto.getSeatingCapacity());
+            }
+            
+            boolean result = storeBookingTableService.updateTable(table);
+            if (result) {
+                return R.success("更新成功");
+            } else {
+                return R.fail("更新失败");
+            }
+        } catch (Exception e) {
+            log.error("更新预订服务桌号失败", e);
+            // 如果是桌号已存在的错误,直接返回友好提示
+            if (e.getMessage() != null && e.getMessage().contains("此桌号已存在")) {
+                return R.fail("此桌号已存在");
+            }
+            return R.fail("更新失败:" + e.getMessage());
+        }
+    }
+
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("删除预订服务桌号")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "桌号ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @PostMapping("/delete")
+    public R<String> deleteTable(@RequestParam Integer id) {
+        log.info("StoreBookingTableController.deleteTable?id={}", id);
+        
+        if (id == null) {
+            return R.fail("桌号ID不能为空");
+        }
+        
+        try {
+            boolean result = storeBookingTableService.deleteTable(id);
+            if (result) {
+                return R.success("删除成功");
+            } else {
+                return R.fail("删除失败");
+            }
+        } catch (Exception e) {
+            log.error("删除预订服务桌号失败", e);
+            return R.fail("删除失败:" + e.getMessage());
+        }
+    }
+}

+ 48 - 0
alien-store/src/main/java/shop/alien/store/service/StoreBookingTableService.java

@@ -0,0 +1,48 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.store.StoreBookingTable;
+
+import java.util.List;
+
+/**
+ * 预订服务桌号表 服务类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+public interface StoreBookingTableService extends IService<StoreBookingTable> {
+
+    /**
+     * 查询预订服务桌号列表
+     *
+     * @param storeId   门店ID
+     * @param categoryId 分类ID(可选,null表示查询全部)
+     * @return List<StoreBookingTable>
+     */
+    List<StoreBookingTable> getTableList(Integer storeId, Integer categoryId);
+
+    /**
+     * 新增预订服务桌号
+     *
+     * @param table 桌号对象
+     * @return boolean
+     */
+    boolean addTable(StoreBookingTable table);
+
+    /**
+     * 更新预订服务桌号
+     *
+     * @param table 桌号对象
+     * @return boolean
+     */
+    boolean updateTable(StoreBookingTable table);
+
+    /**
+     * 删除预订服务桌号
+     *
+     * @param id 桌号ID
+     * @return boolean
+     */
+    boolean deleteTable(Integer id);
+}

+ 199 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreBookingTableServiceImpl.java

@@ -0,0 +1,199 @@
+package shop.alien.store.service.impl;
+
+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.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import shop.alien.entity.store.StoreBookingTable;
+import shop.alien.mapper.StoreBookingTableMapper;
+import shop.alien.store.service.StoreBookingTableService;
+import shop.alien.util.common.JwtUtil;
+
+import java.util.List;
+
+/**
+ * 预订服务桌号表 服务实现类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class StoreBookingTableServiceImpl extends ServiceImpl<StoreBookingTableMapper, StoreBookingTable> implements StoreBookingTableService {
+
+    @Override
+    public List<StoreBookingTable> getTableList(Integer storeId, Integer categoryId) {
+        log.info("StoreBookingTableServiceImpl.getTableList?storeId={}, categoryId={}", storeId, categoryId);
+        
+        LambdaQueryWrapper<StoreBookingTable> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreBookingTable::getStoreId, storeId);
+        
+        // 如果指定了分类ID,则按分类筛选;否则查询全部
+        if (categoryId != null) {
+            wrapper.eq(StoreBookingTable::getCategoryId, categoryId);
+        }
+        
+        // 按创建时间倒序排列
+        wrapper.orderByDesc(StoreBookingTable::getCreatedTime);
+        
+        return this.list(wrapper);
+    }
+
+    @Override
+    public boolean addTable(StoreBookingTable table) {
+        log.info("StoreBookingTableServiceImpl.addTable?table={}", table);
+        
+        // 从JWT获取当前登录用户ID
+        Integer userId = getCurrentUserId();
+        
+        // 参数验证
+        if (table.getStoreId() == null) {
+            log.warn("新增预订服务桌号失败:门店ID不能为空");
+            throw new RuntimeException("门店ID不能为空");
+        }
+        if (table.getCategoryId() == null) {
+            log.warn("新增预订服务桌号失败:分类ID不能为空");
+            throw new RuntimeException("分类ID不能为空");
+        }
+        if (!StringUtils.hasText(table.getTableNumber())) {
+            log.warn("新增预订服务桌号失败:桌号不能为空");
+            throw new RuntimeException("桌号不能为空");
+        }
+        if (table.getSeatingCapacity() == null || table.getSeatingCapacity() <= 0) {
+            log.warn("新增预订服务桌号失败:座位数必须大于0");
+            throw new RuntimeException("座位数必须大于0");
+        }
+        
+        // 处理桌号:去除前后空格
+        String tableNumber = table.getTableNumber().trim();
+        table.setTableNumber(tableNumber);
+        
+        // 检查当前门店下该分类是否已存在相同的桌号
+        LambdaQueryWrapper<StoreBookingTable> checkWrapper = new LambdaQueryWrapper<>();
+        checkWrapper.eq(StoreBookingTable::getStoreId, table.getStoreId())
+                .eq(StoreBookingTable::getCategoryId, table.getCategoryId())
+                .eq(StoreBookingTable::getTableNumber, tableNumber);
+        // @TableLogic 会自动过滤已删除的记录(delete_flag=0)
+        StoreBookingTable existingTable = this.getOne(checkWrapper);
+        if (existingTable != null) {
+            log.warn("新增预订服务桌号失败:当前分类下桌号已存在,storeId={}, categoryId={}, tableNumber={}", 
+                    table.getStoreId(), table.getCategoryId(), tableNumber);
+            throw new RuntimeException("此桌号已存在");
+        }
+        
+        table.setCreatedUserId(userId);
+        
+        return this.save(table);
+    }
+
+    @Override
+    public boolean updateTable(StoreBookingTable table) {
+        log.info("StoreBookingTableServiceImpl.updateTable?table={}", table);
+        
+        // 从JWT获取当前登录用户ID
+        Integer userId = getCurrentUserId();
+        
+        // 参数验证
+        if (table.getId() == null) {
+            log.warn("更新预订服务桌号失败:桌号ID不能为空");
+            throw new RuntimeException("桌号ID不能为空");
+        }
+        
+        StoreBookingTable existingTable = this.getById(table.getId());
+        if (existingTable == null) {
+            log.warn("更新预订服务桌号失败:桌号不存在,id={}", table.getId());
+            throw new RuntimeException("桌号不存在");
+        }
+        
+        // 如果修改了桌号,检查新桌号是否已存在
+        if (StringUtils.hasText(table.getTableNumber())) {
+            // 处理桌号:去除前后空格
+            String tableNumber = table.getTableNumber().trim();
+            table.setTableNumber(tableNumber);
+            
+            // 如果桌号有变化,检查当前门店下该分类是否已存在相同的桌号
+            if (!tableNumber.equals(existingTable.getTableNumber()) || 
+                (table.getCategoryId() != null && !table.getCategoryId().equals(existingTable.getCategoryId()))) {
+                // 确定要检查的分类ID(如果传入了新的分类ID,使用新的;否则使用原有的)
+                Integer checkCategoryId = table.getCategoryId() != null ? table.getCategoryId() : existingTable.getCategoryId();
+                
+                LambdaQueryWrapper<StoreBookingTable> wrapper = new LambdaQueryWrapper<>();
+                wrapper.eq(StoreBookingTable::getStoreId, existingTable.getStoreId())
+                        .eq(StoreBookingTable::getCategoryId, checkCategoryId)
+                        .eq(StoreBookingTable::getTableNumber, tableNumber)
+                        .ne(StoreBookingTable::getId, table.getId());
+                // @TableLogic 会自动过滤已删除的记录(delete_flag=0)
+                StoreBookingTable duplicateTable = this.getOne(wrapper);
+                if (duplicateTable != null) {
+                    log.warn("更新预订服务桌号失败:当前分类下桌号已存在,storeId={}, categoryId={}, tableNumber={}, id={}", 
+                            existingTable.getStoreId(), checkCategoryId, tableNumber, table.getId());
+                    throw new RuntimeException("此桌号已存在");
+                }
+            }
+        }
+        
+        // 验证座位数
+        if (table.getSeatingCapacity() != null && table.getSeatingCapacity() <= 0) {
+            log.warn("更新预订服务桌号失败:座位数必须大于0");
+            throw new RuntimeException("座位数必须大于0");
+        }
+        
+        // 更新字段
+        LambdaUpdateWrapper<StoreBookingTable> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(StoreBookingTable::getId, table.getId());
+        
+        if (StringUtils.hasText(table.getTableNumber())) {
+            updateWrapper.set(StoreBookingTable::getTableNumber, table.getTableNumber());
+        }
+        if (table.getCategoryId() != null) {
+            updateWrapper.set(StoreBookingTable::getCategoryId, table.getCategoryId());
+        }
+        if (table.getSeatingCapacity() != null) {
+            updateWrapper.set(StoreBookingTable::getSeatingCapacity, table.getSeatingCapacity());
+        }
+        
+        if (userId != null) {
+            updateWrapper.set(StoreBookingTable::getUpdatedUserId, userId);
+        }
+        
+        return this.update(updateWrapper);
+    }
+
+    @Override
+    public boolean deleteTable(Integer id) {
+        log.info("StoreBookingTableServiceImpl.deleteTable?id={}", id);
+        
+        StoreBookingTable table = this.getById(id);
+        if (table == null) {
+            log.warn("删除预订服务桌号失败:桌号不存在,id={}", id);
+            throw new RuntimeException("桌号不存在");
+        }
+        
+        // 逻辑删除
+        return this.removeById(id);
+    }
+
+    /**
+     * 从JWT获取当前登录用户ID
+     *
+     * @return 用户ID,如果未登录返回null
+     */
+    private Integer getCurrentUserId() {
+        try {
+            JSONObject userInfo = JwtUtil.getCurrentUserInfo();
+            if (userInfo != null) {
+                return userInfo.getInteger("userId");
+            }
+        } catch (Exception e) {
+            log.warn("获取当前登录用户ID失败: {}", e.getMessage());
+        }
+        return null;
+    }
+}