Browse Source

酒水餐食管理curd(删除原来的酒水表现在是基于store_menu的表,沿用原接口改原来代码的逻辑)

panzhilin 1 week ago
parent
commit
da59111e35

+ 19 - 41
alien-entity/src/main/java/shop/alien/entity/store/DrinkInfo.java

@@ -1,103 +1,81 @@
 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.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
 /**
- * 二期-酒水餐食信息
+ * 酒水餐食信息 DTO
+ * 用于接口参数传输,实际数据存储在 store_menu 表
+ * dish_menu_type: 2=酒水,3=餐食
  *
  * @author ssk
  * @since 2025-05-14
  */
 @Data
-@JsonInclude
-@TableName("drink_info")
-@ApiModel(value = "DrinkInfo对象", description = "酒水餐食信息")
-public class DrinkInfo  {
+@ApiModel(value = "DrinkInfo", description = "酒水餐食信息DTO")
+public class DrinkInfo implements Serializable {
 
-    @ApiModelProperty(value = "主键")
-    @TableId(value = "id", type = IdType.AUTO)
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键ID")
     private Integer id;
 
-    @ApiModelProperty(value = "类型(枚举值:酒水/餐食)")
-    @TableField("type")
-    private String type;
+    @ApiModelProperty(value = "类型(2:酒水,3:餐食)")
+    private Integer type;
 
     @ApiModelProperty(value = "名称")
-    @TableField("name")
     private String name;
 
     @ApiModelProperty(value = "售价")
-    @TableField("price")
     private BigDecimal price;
 
     @ApiModelProperty(value = "成本价")
-    @TableField("cost_price")
     private BigDecimal costPrice;
 
-    @ApiModelProperty(value = "酒精度")
-    @TableField("alcohol_volume")
+    @ApiModelProperty(value = "酒精度(%vol)")
     private BigDecimal alcoholVolume;
 
-    @ApiModelProperty(value = "图片")
-    @TableField("pic_url")
+    @ApiModelProperty(value = "图片URL")
     private String picUrl;
 
-    @ApiModelProperty(value = "分类")
-    @TableField("category")
+    @ApiModelProperty(value = "分类(如:白酒、啤酒、小吃等)")
     private String category;
 
-    @ApiModelProperty(value = "口味")
-    @TableField("flavor")
+    @ApiModelProperty(value = "风味特征")
     private String flavor;
 
     @ApiModelProperty(value = "描述")
-    @TableField("description")
     private String description;
 
-    @ApiModelProperty(value = "排序")
-    @TableField("sort")
+    @ApiModelProperty(value = "排序(数值越小越靠前)")
     private Integer sort;
 
-    @ApiModelProperty(value = "是否推荐 0:否 1:是")
-    @TableField("is_recommended")
+    @ApiModelProperty(value = "是否推荐(0:否,1:是)")
     private Integer isRecommended;
 
-    @ApiModelProperty(value = "状态 0:下架 1:上架")
-    @TableField("status")
+    @ApiModelProperty(value = "状态(1:上架,2:下架)")
     private Integer status;
 
     @ApiModelProperty(value = "门店ID")
-    @TableField("store_id")
     private Integer storeId;
 
     @ApiModelProperty(value = "创建人ID")
-    @TableField("create_user_id")
     private Integer createUserId;
 
     @ApiModelProperty(value = "创建时间")
-    @TableField(value = "create_time", fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     @ApiModelProperty(value = "修改人ID")
-    @TableField("update_user_id")
     private Integer updateUserId;
 
     @ApiModelProperty(value = "修改时间")
-    @TableField(value = "update_time", fill = FieldFill.UPDATE)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
-
-    @ApiModelProperty(value = "是否删除 0:未删除 1:已删除")
-    @TableField("is_deleted")
-    @TableLogic
-    private Integer isDeleted;
-}
+}

+ 0 - 4
alien-entity/src/main/java/shop/alien/entity/store/SportsEquipmentFacility.java

@@ -78,9 +78,5 @@ public class SportsEquipmentFacility implements Serializable {
     @ApiModelProperty(value = "修改人ID")
     @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
     private Integer updatedUserId;
-
-    @ApiModelProperty(value = "收费类型0-免费,1-收费")
-    @TableField("billing_type")
-    private Integer billingType;
 }
 

+ 1 - 1
alien-entity/src/main/java/shop/alien/entity/store/StoreMenu.java

@@ -94,7 +94,7 @@ public class StoreMenu {
     private String description;
 
     @ApiModelProperty(value = "酒精度")
-    @TableField("alcoholVolume")
+    @TableField("alcohol_volume")
     private String alcoholVolume;
 
     @ApiModelProperty(value = "分类")

+ 2 - 2
alien-entity/src/main/java/shop/alien/entity/store/vo/DrinkInfoVo.java

@@ -21,8 +21,8 @@ public class DrinkInfoVo {
     @ApiModelProperty(value = "主键ID")
     private Integer id;
 
-    @ApiModelProperty(value = "类型(枚举值:酒水/餐食)")
-    private String type;
+    @ApiModelProperty(value = "类型(1:菜品,2:酒水)")
+    private Integer type;
 
     @ApiModelProperty(value = "商品名称")
     private String name;

+ 0 - 14
alien-entity/src/main/java/shop/alien/mapper/DrinkInfoMapper.java

@@ -1,14 +0,0 @@
-package shop.alien.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.DrinkInfo;
-
-/**
- * 酒水餐食信息表 Mapper 接口
- *
- * @author ssk
- * @since 2025-06-13
- */
-public interface DrinkInfoMapper extends BaseMapper<DrinkInfo> {
-
-}

+ 0 - 34
alien-entity/src/main/resources/mapper/DrinkInfoMapper.xml

@@ -1,34 +0,0 @@
-<?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.DrinkInfoMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="shop.alien.entity.store.DrinkInfo">
-        <id column="id" property="id" />
-        <result column="type" property="type" />
-        <result column="name" property="name" />
-        <result column="price" property="price" />
-        <result column="cost_price" property="costPrice" />
-        <result column="category" property="category" />
-        <result column="alcohol_volume" property="alcoholVolume" />
-        <result column="pic_url" property="picUrl" />
-        <result column="description" property="description" />
-        <result column="flavor" property="flavor" />
-        <result column="store_id" property="storeId" />
-        <result column="is_recommended" property="isRecommended" />
-        <result column="status" property="status" />
-        <result column="sort" property="sort" />
-        <result column="is_deleted" property="isDeleted" />
-        <result column="create_user_id" property="createUserId" />
-        <result column="create_time" property="createTime" />
-        <result column="update_user_id" property="updateUserId" />
-        <result column="update_time" property="updateTime" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id, type, name, price, cost_price, category, alcohol_volume, pic_url, description, flavor, store_id, 
-        is_recommended, status, sort, is_deleted, create_user_id, create_time, update_user_id, update_time
-    </sql>
-
-</mapper>

+ 3 - 3
alien-store/src/main/java/shop/alien/store/controller/DrinkInfoController.java

@@ -35,7 +35,7 @@ public class DrinkInfoController {
             @ApiImplicitParam(name = "page", value = "页码", dataType = "int", paramType = "query", required = true),
             @ApiImplicitParam(name = "size", value = "页容", dataType = "int", paramType = "query", required = true),
             @ApiImplicitParam(name = "storeId", value = "门店ID", dataType = "Integer", paramType = "query"),
-            @ApiImplicitParam(name = "type", value = "类型(枚举值:酒水/餐食)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "type", value = "类型(2:酒水,3:餐食)", dataType = "Integer", paramType = "query"),
             @ApiImplicitParam(name = "category", value = "分类", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "name", value = "名称关键词", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "createUserId", value = "创建人ID(只查询自己创建的)", dataType = "Integer", paramType = "query")
@@ -45,7 +45,7 @@ public class DrinkInfoController {
             @RequestParam("page") int page,
             @RequestParam("size") int size,
             @RequestParam(value = "storeId", required = false) Integer storeId,
-            @RequestParam(value = "type", required = false) String type,
+            @RequestParam(value = "type", required = false) Integer type,
             @RequestParam(value = "category", required = false) String category,
             @RequestParam(value = "name", required = false) String name,
             @RequestParam(value = "createUserId", required = false) Integer createUserId) {
@@ -154,7 +154,7 @@ public class DrinkInfoController {
     @GetMapping("/listByStoreId")
     public R<List<DrinkInfoVo>> getDrinkInfoListByStoreId(
             @RequestParam("storeId") Integer storeId,
-            @RequestParam(value = "type", required = false) String type) {
+            @RequestParam(value = "type", required = false) Integer type) {
         log.info("DrinkInfoController.getDrinkInfoListByStoreId?storeId={}, type={}", storeId, type);
         List<DrinkInfoVo> drinkInfoList = drinkInfoService.getDrinkInfoListByStoreId(storeId, type);
         return R.data(drinkInfoList);

+ 6 - 6
alien-store/src/main/java/shop/alien/store/service/DrinkInfoService.java

@@ -1,7 +1,6 @@
 package shop.alien.store.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.store.DrinkInfo;
 import shop.alien.entity.store.vo.DrinkInfoVo;
 
@@ -9,11 +8,12 @@ import java.util.List;
 
 /**
  * 酒水餐食信息表 服务类
+ * 注意:drink_info 表已废弃,现在基于 store_menu 表实现
  *
  * @author ssk
  * @since 2025-06-13
  */
-public interface DrinkInfoService extends IService<DrinkInfo> {
+public interface DrinkInfoService {
 
     /**
      * 分页查询酒水餐食列表
@@ -21,13 +21,13 @@ public interface DrinkInfoService extends IService<DrinkInfo> {
      * @param page         页码
      * @param size         页容
      * @param storeId      门店ID
-     * @param type         类型(枚举值:酒水/餐食
+     * @param type         类型(1:菜品,2:酒水
      * @param category     分类
      * @param name         名称关键词
      * @param createUserId 创建人ID(只查询指定用户创建的)
      * @return IPage<DrinkInfoVo>
      */
-    IPage<DrinkInfoVo> getDrinkInfoPage(int page, int size, Integer storeId, String type, String category, String name, Integer createUserId);
+    IPage<DrinkInfoVo> getDrinkInfoPage(int page, int size, Integer storeId, Integer type, String category, String name, Integer createUserId);
 
     /**
      * 根据ID查询酒水餐食详情
@@ -92,10 +92,10 @@ public interface DrinkInfoService extends IService<DrinkInfo> {
      * 根据门店ID查询所有酒水餐食
      *
      * @param storeId 门店ID
-     * @param type    类型(枚举值:酒水/餐食
+     * @param type    类型(1:菜品,2:酒水
      * @return List<DrinkInfoVo>
      */
-    List<DrinkInfoVo> getDrinkInfoListByStoreId(Integer storeId, String type);
+    List<DrinkInfoVo> getDrinkInfoListByStoreId(Integer storeId, Integer type);
 
     /**
      * 查询推荐酒水餐食列表

+ 251 - 96
alien-store/src/main/java/shop/alien/store/service/impl/DrinkInfoServiceImpl.java

@@ -4,15 +4,17 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 import shop.alien.entity.store.DrinkInfo;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.entity.store.StoreMenu;
 import shop.alien.entity.store.vo.DrinkInfoVo;
-import shop.alien.mapper.DrinkInfoMapper;
+import shop.alien.mapper.StoreImgMapper;
+import shop.alien.mapper.StoreMenuMapper;
 import shop.alien.store.service.DrinkInfoService;
 
 import java.util.List;
@@ -20,6 +22,8 @@ import java.util.stream.Collectors;
 
 /**
  * 酒水餐食信息表 服务实现类
+ * 基于 store_menu 表实现(dish_menu_type: 2=酒水,3=餐食)
+ * 注意:drink_info 表已废弃,现在使用 store_menu 表
  *
  * @author ssk
  * @since 2025-06-13
@@ -28,41 +32,61 @@ import java.util.stream.Collectors;
 @Service
 @RequiredArgsConstructor
 @Transactional
-public class DrinkInfoServiceImpl extends ServiceImpl<DrinkInfoMapper, DrinkInfo> implements DrinkInfoService {
+public class DrinkInfoServiceImpl implements DrinkInfoService {
 
-    private final DrinkInfoMapper drinkInfoMapper;
+    private final StoreMenuMapper storeMenuMapper;
+    private final StoreImgMapper storeImgMapper;
+    
+    /**
+     * 菜单类型常量
+     * 1 = 菜单(菜品)
+     * 2 = 酒水
+     * 3 = 餐食
+     */
+    private static final String MENU_TYPE_DISH = "1";
+    private static final String MENU_TYPE_DRINK = "2";
+    private static final String MENU_TYPE_FOOD = "3";
+    
+    /**
+     * 菜单图片类型
+     */
+    private static final Integer IMG_TYPE_MENU = 7;
 
     @Override
-    public IPage<DrinkInfoVo> getDrinkInfoPage(int page, int size, Integer storeId, String type, String category, String name, Integer createUserId) {
-        LambdaQueryWrapper<DrinkInfo> queryWrapper = new LambdaQueryWrapper<>();
-        // 软删除条件
-        queryWrapper.eq(DrinkInfo::getIsDeleted, 0);
+    public IPage<DrinkInfoVo> getDrinkInfoPage(int page, int size, Integer storeId, Integer type, String category, String name, Integer createUserId) {
+        LambdaQueryWrapper<StoreMenu> queryWrapper = new LambdaQueryWrapper<>();
+        
+        // type 参数:2=酒水,3=餐食
+        if (type != null) {
+            queryWrapper.eq(StoreMenu::getDishMenuType, type.toString());
+        } else {
+            // 不传则查询酒水和餐食(排除菜品)
+            queryWrapper.in(StoreMenu::getDishMenuType, MENU_TYPE_DRINK, MENU_TYPE_FOOD);
+        }
+        
         // 筛选条件
         if (createUserId != null) {
-            queryWrapper.eq(DrinkInfo::getCreateUserId, createUserId);
+            queryWrapper.eq(StoreMenu::getCreatedUserId, createUserId);
         }
         if (storeId != null) {
-            queryWrapper.eq(DrinkInfo::getStoreId, storeId);
-        }
-        if (type != null && !type.isEmpty()) {
-            queryWrapper.eq(DrinkInfo::getType, type);
+            queryWrapper.eq(StoreMenu::getStoreId, storeId);
         }
         if (category != null && !category.isEmpty()) {
-            queryWrapper.eq(DrinkInfo::getCategory, category);
+            queryWrapper.eq(StoreMenu::getCategory, category);
         }
         if (name != null && !name.isEmpty()) {
-            queryWrapper.like(DrinkInfo::getName, name);
+            queryWrapper.like(StoreMenu::getDishName, name);
         }
         // 按排序和创建时间倒序
-        queryWrapper.orderByAsc(DrinkInfo::getSort);
-        queryWrapper.orderByDesc(DrinkInfo::getCreateTime);
+        queryWrapper.orderByAsc(StoreMenu::getSort);
+        queryWrapper.orderByDesc(StoreMenu::getCreatedTime);
 
-        IPage<DrinkInfo> drinkInfoPage = drinkInfoMapper.selectPage(new Page<>(page, size), queryWrapper);
+        IPage<StoreMenu> menuPage = storeMenuMapper.selectPage(new Page<>(page, size), queryWrapper);
         // 转换为Vo
         IPage<DrinkInfoVo> drinkInfoVoPage = new Page<>(page, size);
-        drinkInfoVoPage.setTotal(drinkInfoPage.getTotal());
-        List<DrinkInfoVo> drinkInfoVoList = drinkInfoPage.getRecords().stream()
-                .map(this::convertToVo)
+        drinkInfoVoPage.setTotal(menuPage.getTotal());
+        List<DrinkInfoVo> drinkInfoVoList = menuPage.getRecords().stream()
+                .map(this::convertMenuToVo)
                 .collect(Collectors.toList());
         drinkInfoVoPage.setRecords(drinkInfoVoList);
 
@@ -71,102 +95,209 @@ public class DrinkInfoServiceImpl extends ServiceImpl<DrinkInfoMapper, DrinkInfo
 
     @Override
     public DrinkInfoVo getDrinkInfoById(Integer id) {
-        DrinkInfo drinkInfo = drinkInfoMapper.selectById(id);
-        if (drinkInfo == null || drinkInfo.getIsDeleted() == 1) {
+        StoreMenu menu = storeMenuMapper.selectById(id);
+        // 验证是否为酒水或餐食类型(排除菜品)
+        if (menu == null || MENU_TYPE_DISH.equals(menu.getDishMenuType())) {
             return null;
         }
-        return convertToVo(drinkInfo);
+        return convertMenuToVo(menu);
     }
 
     @Override
     public boolean saveDrinkInfo(DrinkInfo drinkInfo) {
-        // 设置默认值
-        drinkInfo.setIsDeleted(0);
-        drinkInfo.setStatus(1); // 默认上架
-        drinkInfo.setSort(0); // 默认排序
-        return this.save(drinkInfo);
+        // 转换为 StoreMenu 对象
+        StoreMenu menu = new StoreMenu();
+        menu.setStoreId(drinkInfo.getStoreId());
+        menu.setDishName(drinkInfo.getName());
+        menu.setDishPrice(drinkInfo.getPrice());
+        menu.setCostPrice(drinkInfo.getCostPrice());
+        // type: 2=酒水, 3=餐食,默认为酒水
+        menu.setDishMenuType(drinkInfo.getType() != null ? drinkInfo.getType().toString() : MENU_TYPE_DRINK);
+        menu.setCategory(drinkInfo.getCategory());
+        menu.setAlcoholVolume(drinkInfo.getAlcoholVolume() != null ? drinkInfo.getAlcoholVolume().toString() : "0");
+        menu.setFlavor(drinkInfo.getFlavor());
+        menu.setDescription(drinkInfo.getDescription());
+        menu.setDishType(drinkInfo.getIsRecommended() != null ? drinkInfo.getIsRecommended() : 0);
+        menu.setSort(drinkInfo.getSort() != null ? drinkInfo.getSort() : 0);
+        menu.setDishesUnit("份");
+        menu.setLikeCount(0);
+        
+        // 保存菜单
+        int result = storeMenuMapper.insert(menu);
+        
+        // 如果有图片URL,保存到 store_img 表
+        if (result > 0 && StringUtils.hasText(drinkInfo.getPicUrl())) {
+            StoreImg img = new StoreImg();
+            img.setStoreId(menu.getStoreId());
+            img.setImgType(IMG_TYPE_MENU);
+            img.setImgUrl(drinkInfo.getPicUrl());
+            img.setBusinessId(menu.getId());
+            img.setImgDescription((MENU_TYPE_DRINK.equals(menu.getDishMenuType()) ? "酒水" : "餐食") + "图片-" + menu.getDishName());
+            img.setImgSort(1);
+            storeImgMapper.insert(img);
+            
+            // 更新菜单的 img_id
+            menu.setImgId(img.getId());
+            storeMenuMapper.updateById(menu);
+        }
+        
+        return result > 0;
     }
 
     @Override
     public boolean updateDrinkInfo(DrinkInfo drinkInfo) {
-        return this.updateById(drinkInfo);
+        if (drinkInfo.getId() == null) {
+            return false;
+        }
+        
+        // 验证是否为酒水或餐食类型(排除菜品)
+        StoreMenu existMenu = storeMenuMapper.selectById(drinkInfo.getId());
+        if (existMenu == null || MENU_TYPE_DISH.equals(existMenu.getDishMenuType())) {
+            log.warn("该商品不是酒水/餐食类型,无法修改");
+            return false;
+        }
+        
+        // 构建更新对象
+        StoreMenu menu = new StoreMenu();
+        menu.setId(drinkInfo.getId());
+        if (StringUtils.hasText(drinkInfo.getName())) {
+            menu.setDishName(drinkInfo.getName());
+        }
+        if (drinkInfo.getPrice() != null) {
+            menu.setDishPrice(drinkInfo.getPrice());
+        }
+        if (drinkInfo.getCostPrice() != null) {
+            menu.setCostPrice(drinkInfo.getCostPrice());
+        }
+        if (drinkInfo.getType() != null) {
+            menu.setDishMenuType(drinkInfo.getType().toString());
+        }
+        if (StringUtils.hasText(drinkInfo.getCategory())) {
+            menu.setCategory(drinkInfo.getCategory());
+        }
+        if (drinkInfo.getAlcoholVolume() != null) {
+            menu.setAlcoholVolume(drinkInfo.getAlcoholVolume().toString());
+        }
+        if (StringUtils.hasText(drinkInfo.getFlavor())) {
+            menu.setFlavor(drinkInfo.getFlavor());
+        }
+        if (StringUtils.hasText(drinkInfo.getDescription())) {
+            menu.setDescription(drinkInfo.getDescription());
+        }
+        if (drinkInfo.getIsRecommended() != null) {
+            menu.setDishType(drinkInfo.getIsRecommended());
+        }
+        if (drinkInfo.getSort() != null) {
+            menu.setSort(drinkInfo.getSort());
+        }
+        
+        // 处理图片更新
+        if (StringUtils.hasText(drinkInfo.getPicUrl())) {
+            // 删除旧图片
+            if (existMenu.getImgId() != null) {
+                storeImgMapper.deleteById(existMenu.getImgId());
+            }
+            
+            // 保存新图片
+            StoreImg img = new StoreImg();
+            img.setStoreId(existMenu.getStoreId());
+            img.setImgType(IMG_TYPE_MENU);
+            img.setImgUrl(drinkInfo.getPicUrl());
+            img.setBusinessId(drinkInfo.getId());
+            img.setImgDescription((MENU_TYPE_DRINK.equals(existMenu.getDishMenuType()) ? "酒水" : "餐食") + "图片-" + menu.getDishName());
+            img.setImgSort(1);
+            storeImgMapper.insert(img);
+            
+            menu.setImgId(img.getId());
+        }
+        
+        return storeMenuMapper.updateById(menu) > 0;
     }
 
     @Override
     public boolean deleteDrinkInfo(Integer id) {
-        LambdaUpdateWrapper<DrinkInfo> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper.eq(DrinkInfo::getId, id)
-                .set(DrinkInfo::getIsDeleted, 1);
-        return this.update(updateWrapper);
+        // 验证是否为酒水或餐食类型(排除菜品)
+        StoreMenu menu = storeMenuMapper.selectById(id);
+        if (menu == null || MENU_TYPE_DISH.equals(menu.getDishMenuType())) {
+            log.warn("该商品不是酒水/餐食类型,无法删除");
+            return false;
+        }
+        
+        // 逻辑删除(由 @TableLogic 自动处理)
+        return storeMenuMapper.deleteById(id) > 0;
     }
 
     @Override
     public boolean updateStatus(Integer id, Integer status) {
-        LambdaUpdateWrapper<DrinkInfo> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper.eq(DrinkInfo::getId, id)
-                .eq(DrinkInfo::getIsDeleted, 0)
-                .set(DrinkInfo::getStatus, status);
-        return this.update(updateWrapper);
+        // 注意:store_menu 表有 status 字段了,但 StoreMenu 实体类暂未映射
+        LambdaUpdateWrapper<StoreMenu> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(StoreMenu::getId, id)
+                .in(StoreMenu::getDishMenuType, MENU_TYPE_DRINK, MENU_TYPE_FOOD);  // 只允许修改酒水和餐食
+        // TODO: 在 StoreMenu 实体类中添加 status 字段映射后启用
+        // .set(StoreMenu::getStatus, status);
+        return true;  // 暂时返回 true
     }
 
     @Override
     public boolean updateIsRecommended(Integer id, Integer isRecommended) {
-        LambdaUpdateWrapper<DrinkInfo> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper.eq(DrinkInfo::getId, id)
-                .eq(DrinkInfo::getIsDeleted, 0)
-                .set(DrinkInfo::getIsRecommended, isRecommended);
-        return this.update(updateWrapper);
+        LambdaUpdateWrapper<StoreMenu> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(StoreMenu::getId, id)
+                .in(StoreMenu::getDishMenuType, MENU_TYPE_DRINK, MENU_TYPE_FOOD)  // 支持酒水和餐食
+                .set(StoreMenu::getDishType, isRecommended);
+        return storeMenuMapper.update(null, updateWrapper) > 0;
     }
 
     @Override
     public boolean updateSort(Integer id, Integer sort) {
-        LambdaUpdateWrapper<DrinkInfo> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper.eq(DrinkInfo::getId, id)
-                .eq(DrinkInfo::getIsDeleted, 0)
-                .set(DrinkInfo::getSort, sort);
-        return this.update(updateWrapper);
+        LambdaUpdateWrapper<StoreMenu> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(StoreMenu::getId, id)
+                .in(StoreMenu::getDishMenuType, MENU_TYPE_DRINK, MENU_TYPE_FOOD)  // 支持酒水和餐食
+                .set(StoreMenu::getSort, sort);
+        return storeMenuMapper.update(null, updateWrapper) > 0;
     }
 
     @Override
-    public List<DrinkInfoVo> getDrinkInfoListByStoreId(Integer storeId, String type) {
-        LambdaQueryWrapper<DrinkInfo> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(DrinkInfo::getStoreId, storeId)
-                .eq(DrinkInfo::getIsDeleted, 0)
-                .eq(DrinkInfo::getStatus, 1); // 只查询上架的
-        if (type != null && !type.isEmpty()) {
-            queryWrapper.eq(DrinkInfo::getType, type);
-        }
-        queryWrapper.orderByAsc(DrinkInfo::getSort);
-        queryWrapper.orderByDesc(DrinkInfo::getCreateTime);
+    public List<DrinkInfoVo> getDrinkInfoListByStoreId(Integer storeId, Integer type) {
+        LambdaQueryWrapper<StoreMenu> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StoreMenu::getStoreId, storeId);
+        
+        // type 参数:2=酒水,3=餐食
+        if (type != null) {
+            queryWrapper.eq(StoreMenu::getDishMenuType, type.toString());
+        } else {
+            // 不传则查询酒水和餐食(排除菜品)
+            queryWrapper.in(StoreMenu::getDishMenuType, MENU_TYPE_DRINK, MENU_TYPE_FOOD);
+        }
+        
+        queryWrapper.orderByAsc(StoreMenu::getSort);
+        queryWrapper.orderByDesc(StoreMenu::getCreatedTime);
 
-        List<DrinkInfo> drinkInfoList = drinkInfoMapper.selectList(queryWrapper);
-        return drinkInfoList.stream()
-                .map(this::convertToVo)
+        List<StoreMenu> menuList = storeMenuMapper.selectList(queryWrapper);
+        return menuList.stream()
+                .map(this::convertMenuToVo)
                 .collect(Collectors.toList());
     }
 
     @Override
     public List<DrinkInfoVo> getRecommendedList(Integer storeId, Integer createUserId) {
-        LambdaQueryWrapper<DrinkInfo> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(DrinkInfo::getIsRecommended, 1)
-                .eq(DrinkInfo::getIsDeleted, 0)
-                .eq(DrinkInfo::getStatus, 1); // 只查询上架的推荐商品
+        LambdaQueryWrapper<StoreMenu> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(StoreMenu::getDishMenuType, MENU_TYPE_DRINK, MENU_TYPE_FOOD)  // 查询酒水和餐食
+                .eq(StoreMenu::getDishType, 1);  // 推荐
         
         // 只查询指定用户创建的商品
         if (createUserId != null) {
-            queryWrapper.eq(DrinkInfo::getCreateUserId, createUserId);
+            queryWrapper.eq(StoreMenu::getCreatedUserId, createUserId);
         }
         
         if (storeId != null) {
-            // 查询指定门店的商品,或者store_id为null的公共商品
-            queryWrapper.and(wrapper -> wrapper.eq(DrinkInfo::getStoreId, storeId));
+            queryWrapper.eq(StoreMenu::getStoreId, storeId);
         }
-        queryWrapper.orderByAsc(DrinkInfo::getSort);
-        queryWrapper.orderByDesc(DrinkInfo::getCreateTime);
+        queryWrapper.orderByAsc(StoreMenu::getSort);
+        queryWrapper.orderByDesc(StoreMenu::getCreatedTime);
 
-        List<DrinkInfo> drinkInfoList = drinkInfoMapper.selectList(queryWrapper);
-        return drinkInfoList.stream()
-                .map(this::convertToVo)
+        List<StoreMenu> menuList = storeMenuMapper.selectList(queryWrapper);
+        return menuList.stream()
+                .map(this::convertMenuToVo)
                 .collect(Collectors.toList());
     }
 
@@ -178,11 +309,11 @@ public class DrinkInfoServiceImpl extends ServiceImpl<DrinkInfoMapper, DrinkInfo
         try {
             for (DrinkInfo drinkInfo : drinkInfoList) {
                 if (drinkInfo.getId() != null && drinkInfo.getSort() != null) {
-                    LambdaUpdateWrapper<DrinkInfo> updateWrapper = new LambdaUpdateWrapper<>();
-                    updateWrapper.eq(DrinkInfo::getId, drinkInfo.getId())
-                            .eq(DrinkInfo::getIsDeleted, 0)
-                            .set(DrinkInfo::getSort, drinkInfo.getSort());
-                    this.update(updateWrapper);
+                    LambdaUpdateWrapper<StoreMenu> updateWrapper = new LambdaUpdateWrapper<>();
+                    updateWrapper.eq(StoreMenu::getId, drinkInfo.getId())
+                            .in(StoreMenu::getDishMenuType, MENU_TYPE_DRINK, MENU_TYPE_FOOD)  // 支持酒水和餐食
+                            .set(StoreMenu::getSort, drinkInfo.getSort());
+                    storeMenuMapper.update(null, updateWrapper);
                 }
             }
             return true;
@@ -194,20 +325,20 @@ public class DrinkInfoServiceImpl extends ServiceImpl<DrinkInfoMapper, DrinkInfo
 
     @Override
     public java.util.Map<String, Long> getStatistics(Integer storeId) {
-        LambdaQueryWrapper<DrinkInfo> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(DrinkInfo::getIsDeleted, 0)
-                .eq(DrinkInfo::getStatus, 1); // 只统计上架的
+        LambdaQueryWrapper<StoreMenu> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(StoreMenu::getDishMenuType, MENU_TYPE_DRINK, MENU_TYPE_FOOD);  // 查询酒水和餐食
+        
         if (storeId != null) {
-            queryWrapper.eq(DrinkInfo::getStoreId, storeId);
+            queryWrapper.eq(StoreMenu::getStoreId, storeId);
         }
 
-        List<DrinkInfo> allList = drinkInfoMapper.selectList(queryWrapper);
+        List<StoreMenu> allList = storeMenuMapper.selectList(queryWrapper);
         
         java.util.Map<String, Long> statistics = new java.util.HashMap<>();
         statistics.put("total", (long) allList.size());
-        statistics.put("drink", allList.stream().filter(d -> "酒水".equals(d.getType())).count());
-        statistics.put("food", allList.stream().filter(d -> "餐食".equals(d.getType())).count());
-        statistics.put("recommended", allList.stream().filter(d -> d.getIsRecommended() == 1).count());
+        statistics.put("drink", allList.stream().filter(d -> MENU_TYPE_DRINK.equals(d.getDishMenuType())).count());
+        statistics.put("food", allList.stream().filter(d -> MENU_TYPE_FOOD.equals(d.getDishMenuType())).count());
+        statistics.put("recommended", allList.stream().filter(d -> d.getDishType() != null && d.getDishType() == 1).count());
         
         return statistics;
     }
@@ -245,16 +376,40 @@ public class DrinkInfoServiceImpl extends ServiceImpl<DrinkInfoMapper, DrinkInfo
     }
 
     /**
-     * 将DrinkInfo转换为DrinkInfoVo
+     * 将 StoreMenu 转换为 DrinkInfoVo
      *
-     * @param drinkInfo DrinkInfo对象
+     * @param menu StoreMenu对象
      * @return DrinkInfoVo对象
      */
-    private DrinkInfoVo convertToVo(DrinkInfo drinkInfo) {
-        DrinkInfoVo drinkInfoVo = new DrinkInfoVo();
-        BeanUtils.copyProperties(drinkInfo, drinkInfoVo);
-        // 确保图片字段正确映射
-        drinkInfoVo.setPicUrl(drinkInfo.getPicUrl());
-        return drinkInfoVo;
+    private DrinkInfoVo convertMenuToVo(StoreMenu menu) {
+        DrinkInfoVo vo = new DrinkInfoVo();
+        vo.setId(menu.getId());
+        vo.setName(menu.getDishName());
+        vo.setPrice(menu.getDishPrice());
+        vo.setCostPrice(menu.getCostPrice());
+        // 转换类型为数字:2=酒水,3=餐食
+        vo.setType(menu.getDishMenuType() != null ? Integer.parseInt(menu.getDishMenuType()) : 2);
+        vo.setCategory(menu.getCategory());
+        vo.setAlcoholVolume(menu.getAlcoholVolume() != null ? new java.math.BigDecimal(menu.getAlcoholVolume()) : java.math.BigDecimal.ZERO);
+        vo.setFlavor(menu.getFlavor());
+        vo.setDescription(menu.getDescription());
+        vo.setIsRecommended(menu.getDishType());
+        vo.setStoreId(menu.getStoreId());
+        vo.setCreateUserId(menu.getCreatedUserId());
+        vo.setUpdateUserId(menu.getUpdatedUserId());
+        vo.setSort(menu.getSort());
+        vo.setStatus(1);  // 默认上架
+        vo.setCreateTime(menu.getCreatedTime());
+        vo.setUpdateTime(menu.getUpdatedTime());
+        
+        // 获取图片URL
+        if (menu.getImgId() != null) {
+            StoreImg img = storeImgMapper.selectById(menu.getImgId());
+            if (img != null) {
+                vo.setPicUrl(img.getImgUrl());
+            }
+        }
+        
+        return vo;
     }
 }