Răsfoiți Sursa

开发基础数据查询

lutong 2 luni în urmă
părinte
comite
761c1339d2

+ 78 - 0
alien-dining/src/main/java/shop/alien/dining/controller/StoreInfoController.java

@@ -0,0 +1,78 @@
+package shop.alien.dining.controller;
+
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreCuisine;
+import shop.alien.entity.store.StoreCuisineCategory;
+import shop.alien.entity.store.StoreTable;
+import shop.alien.dining.service.StoreInfoService;
+
+import java.util.List;
+
+/**
+ * 门店信息查询控制器
+ *
+ * @author system
+ * @since 2025-02-02
+ */
+@Slf4j
+@Api(tags = {"小程序-门店信息查询"})
+@CrossOrigin
+@RestController
+@RequestMapping("/store/info")
+@RequiredArgsConstructor
+public class StoreInfoController {
+
+    private final StoreInfoService storeInfoService;
+
+    @ApiOperation(value = "根据门店ID查询桌号列表", notes = "查询指定门店下的所有桌号")
+    @GetMapping("/tables")
+    public R<List<StoreTable>> getTablesByStoreId(
+            @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId) {
+        try {
+            if (storeId == null) {
+                return R.fail("门店ID不能为空");
+            }
+            List<StoreTable> tables = storeInfoService.getTablesByStoreId(storeId);
+            return R.data(tables);
+        } catch (Exception e) {
+            log.error("查询桌号列表失败: {}", e.getMessage(), e);
+            return R.fail("查询桌号列表失败: " + e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "根据门店ID查询菜品种类列表", notes = "查询指定门店下的所有菜品种类")
+    @GetMapping("/categories")
+    public R<List<StoreCuisineCategory>> getCategoriesByStoreId(
+            @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId) {
+        try {
+            if (storeId == null) {
+                return R.fail("门店ID不能为空");
+            }
+            List<StoreCuisineCategory> categories = storeInfoService.getCategoriesByStoreId(storeId);
+            return R.data(categories);
+        } catch (Exception e) {
+            log.error("查询菜品种类列表失败: {}", e.getMessage(), e);
+            return R.fail("查询菜品种类列表失败: " + e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "根据菜品种类ID查询菜品信息列表", notes = "查询指定分类下的所有菜品信息")
+    @GetMapping("/cuisines")
+    public R<List<StoreCuisine>> getCuisinesByCategoryId(
+            @ApiParam(value = "菜品种类ID", required = true) @RequestParam Integer categoryId) {
+        try {
+            if (categoryId == null) {
+                return R.fail("菜品种类ID不能为空");
+            }
+            List<StoreCuisine> cuisines = storeInfoService.getCuisinesByCategoryId(categoryId);
+            return R.data(cuisines);
+        } catch (Exception e) {
+            log.error("查询菜品信息列表失败: {}", e.getMessage(), e);
+            return R.fail("查询菜品信息列表失败: " + e.getMessage());
+        }
+    }
+}

+ 40 - 0
alien-dining/src/main/java/shop/alien/dining/service/StoreInfoService.java

@@ -0,0 +1,40 @@
+package shop.alien.dining.service;
+
+import shop.alien.entity.store.StoreCuisine;
+import shop.alien.entity.store.StoreCuisineCategory;
+import shop.alien.entity.store.StoreTable;
+
+import java.util.List;
+
+/**
+ * 门店信息查询服务接口
+ *
+ * @author system
+ * @since 2025-02-02
+ */
+public interface StoreInfoService {
+
+    /**
+     * 根据门店ID查询桌号列表
+     *
+     * @param storeId 门店ID
+     * @return 桌号列表
+     */
+    List<StoreTable> getTablesByStoreId(Integer storeId);
+
+    /**
+     * 根据门店ID查询菜品种类列表
+     *
+     * @param storeId 门店ID
+     * @return 菜品种类列表
+     */
+    List<StoreCuisineCategory> getCategoriesByStoreId(Integer storeId);
+
+    /**
+     * 根据菜品种类ID查询菜品信息列表
+     *
+     * @param categoryId 菜品种类ID
+     * @return 菜品信息列表
+     */
+    List<StoreCuisine> getCuisinesByCategoryId(Integer categoryId);
+}

+ 99 - 0
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreInfoServiceImpl.java

@@ -0,0 +1,99 @@
+package shop.alien.dining.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.store.StoreCuisine;
+import shop.alien.entity.store.StoreCuisineCategory;
+import shop.alien.entity.store.StoreTable;
+import shop.alien.mapper.StoreCuisineCategoryMapper;
+import shop.alien.mapper.StoreCuisineMapper;
+import shop.alien.mapper.StoreTableMapper;
+import shop.alien.dining.service.StoreInfoService;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+/**
+ * 门店信息查询服务实现类
+ *
+ * @author system
+ * @since 2025-02-02
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class StoreInfoServiceImpl implements StoreInfoService {
+
+    private final StoreTableMapper storeTableMapper;
+    private final StoreCuisineCategoryMapper storeCuisineCategoryMapper;
+    private final StoreCuisineMapper storeCuisineMapper;
+
+    @Override
+    public List<StoreTable> getTablesByStoreId(Integer storeId) {
+        log.info("根据门店ID查询桌号列表, storeId={}", storeId);
+        
+        LambdaQueryWrapper<StoreTable> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreTable::getStoreId, storeId);
+        wrapper.eq(StoreTable::getDeleteFlag, 0);
+        wrapper.orderByAsc(StoreTable::getTableNumber);
+        
+        return storeTableMapper.selectList(wrapper);
+    }
+
+    @Override
+    public List<StoreCuisineCategory> getCategoriesByStoreId(Integer storeId) {
+        log.info("根据门店ID查询菜品种类列表, storeId={}", storeId);
+        
+        LambdaQueryWrapper<StoreCuisineCategory> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCuisineCategory::getStoreId, storeId);
+        wrapper.eq(StoreCuisineCategory::getDeleteFlag, 0);
+        wrapper.eq(StoreCuisineCategory::getStatus, 1); // 只查询启用的分类
+        wrapper.orderByAsc(StoreCuisineCategory::getSort); // 按排序字段排序
+        
+        return storeCuisineCategoryMapper.selectList(wrapper);
+    }
+
+    @Override
+    public List<StoreCuisine> getCuisinesByCategoryId(Integer categoryId) {
+        log.info("根据菜品种类ID查询菜品信息列表, categoryId={}", categoryId);
+        
+        // 先查询分类信息,获取 storeId
+        StoreCuisineCategory category = storeCuisineCategoryMapper.selectById(categoryId);
+        if (category == null) {
+            log.warn("菜品种类不存在, categoryId={}", categoryId);
+            return new java.util.ArrayList<>();
+        }
+        
+        // 查询该门店下所有上架的菜品
+        LambdaQueryWrapper<StoreCuisine> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCuisine::getStoreId, category.getStoreId());
+        wrapper.eq(StoreCuisine::getDeleteFlag, 0);
+        wrapper.eq(StoreCuisine::getShelfStatus, 1); // 只查询上架的菜品
+        
+        List<StoreCuisine> allCuisines = storeCuisineMapper.selectList(wrapper);
+        
+        // 过滤出包含该分类ID的菜品
+        // categoryIds 是 JSON 数组格式,如:[1,2,3]
+        return allCuisines.stream()
+                .filter(cuisine -> {
+                    String categoryIdsStr = cuisine.getCategoryIds();
+                    if (StringUtils.isBlank(categoryIdsStr)) {
+                        return false;
+                    }
+                    try {
+                        // 解析 JSON 数组
+                        List<Integer> categoryIds = JSON.parseArray(categoryIdsStr, Integer.class);
+                        return categoryIds != null && categoryIds.contains(categoryId);
+                    } catch (Exception e) {
+                        log.warn("解析菜品分类IDs失败, cuisineId={}, categoryIds={}, error={}", 
+                                cuisine.getId(), categoryIdsStr, e.getMessage());
+                        // 如果解析失败,使用简单的字符串匹配作为降级方案
+                        return categoryIdsStr.contains(String.valueOf(categoryId));
+                    }
+                })
+                .collect(java.util.stream.Collectors.toList());
+    }
+}

+ 8 - 1
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java

@@ -67,7 +67,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
             throw new RuntimeException("购物车为空");
         }
 
-        // 验证优惠券
+        // 验证优惠券(可选,couponId 可以为 null,不选择优惠券时 discountAmount 为 0)
         BigDecimal discountAmount = BigDecimal.ZERO;
         if (dto.getCouponId() != null) {
             // 检查桌号是否已使用优惠券(考虑换桌情况)
@@ -124,6 +124,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         String orderNo = generateOrderNo();
 
         // 创建订单
+        Date now = new Date();
         StoreOrder order = new StoreOrder();
         order.setOrderNo(orderNo);
         order.setStoreId(table.getStoreId());
@@ -147,6 +148,10 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         order.setPayStatus(0); // 未支付
         order.setRemark(dto.getRemark());
         order.setCreatedUserId(userId);
+        order.setUpdatedUserId(userId);
+        // 手动设置创建时间和更新时间(临时方案,避免自动填充未生效导致 created_time 为 null)
+        order.setCreatedTime(now);
+        order.setUpdatedTime(now);
         this.save(order);
 
         // 更新优惠券使用记录状态为已下单
@@ -183,6 +188,8 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
                     detail.setAddUserPhone(item.getAddUserPhone());
                     detail.setRemark(item.getRemark());
                     detail.setCreatedUserId(userId);
+                    detail.setCreatedTime(now);
+                    detail.setUpdatedTime(now);
                     return detail;
                 })
                 .collect(Collectors.toList());

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

@@ -23,7 +23,7 @@ public class CreateOrderDTO {
     @ApiModelProperty(value = "就餐人数")
     private Integer dinerCount;
 
-    @ApiModelProperty(value = "优惠券ID")
+    @ApiModelProperty(value = "优惠券ID(可选,不选择优惠券时传 null 或不传此字段)")
     private Integer couponId;
 
     @ApiModelProperty(value = "联系电话")