소스 검색

订单分页查询 添加购物菜品展示 开发菜品详情接口

lutong 2 달 전
부모
커밋
545a665cd6

+ 0 - 5
alien-dining/src/main/java/shop/alien/dining/controller/DiningController.java

@@ -99,11 +99,6 @@ public class DiningController {
             @ApiParam(value = "菜品ID", required = true) @PathVariable Integer cuisineId,
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
         try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
             CuisineDetailVO vo = diningService.getCuisineDetail(cuisineId, tableId);
             return R.data(vo);
         } catch (Exception e) {

+ 4 - 3
alien-dining/src/main/java/shop/alien/dining/controller/StoreOrderController.java

@@ -22,6 +22,7 @@ import shop.alien.entity.store.dto.ChangeTableDTO;
 import shop.alien.entity.store.dto.CreateOrderDTO;
 import shop.alien.entity.store.vo.OrderChangeLogBatchVO;
 import shop.alien.entity.store.vo.OrderInfoVO;
+import shop.alien.entity.store.vo.StoreOrderPageVO;
 import shop.alien.mapper.StoreInfoMapper;
 import shop.alien.mapper.StoreOrderDetailMapper;
 import shop.alien.mapper.StoreTableLogMapper;
@@ -413,9 +414,9 @@ public class StoreOrderController {
         }
     }
 
-    @ApiOperation(value = "分页查询订单列表", notes = "分页查询订单列表")
+    @ApiOperation(value = "分页查询订单列表", notes = "分页查询订单列表,包含订单中的菜品数量、菜品名称、菜品图片")
     @GetMapping("/page")
-    public R<IPage<StoreOrder>> getOrderPage(
+    public R<IPage<StoreOrderPageVO>> getOrderPage(
             @ApiParam(value = "页码", required = true) @RequestParam(defaultValue = "1") Long current,
             @ApiParam(value = "每页数量", required = true) @RequestParam(defaultValue = "10") Long size,
             @ApiParam(value = "门店ID") @RequestParam(required = false) Integer storeId,
@@ -428,7 +429,7 @@ public class StoreOrderController {
                 return R.fail("用户未登录");
             }
             Page<StoreOrder> page = new Page<>(current, size);
-            IPage<StoreOrder> result = orderService.getOrderPage(page, storeId, tableId, orderStatus);
+            IPage<StoreOrderPageVO> result = orderService.getOrderPageWithCuisines(page, storeId, tableId, orderStatus);
             return R.data(result);
         } catch (Exception e) {
             log.error("分页查询订单列表失败: {}", e.getMessage(), e);

+ 12 - 0
alien-dining/src/main/java/shop/alien/dining/service/StoreOrderService.java

@@ -7,6 +7,7 @@ import shop.alien.entity.store.StoreOrder;
 import shop.alien.entity.store.dto.CreateOrderDTO;
 import shop.alien.entity.store.vo.OrderChangeLogBatchVO;
 import shop.alien.entity.store.vo.OrderInfoVO;
+import shop.alien.entity.store.vo.StoreOrderPageVO;
 
 import java.util.List;
 
@@ -71,6 +72,17 @@ public interface StoreOrderService extends IService<StoreOrder> {
     IPage<StoreOrder> getOrderPage(Page<StoreOrder> page, Integer storeId, Integer tableId, Integer orderStatus);
 
     /**
+     * 分页查询订单列表(包含菜品信息)
+     *
+     * @param page     分页参数
+     * @param storeId  门店ID
+     * @param tableId  桌号ID
+     * @param orderStatus 订单状态
+     * @return 订单分页列表(包含菜品信息)
+     */
+    IPage<StoreOrderPageVO> getOrderPageWithCuisines(Page<StoreOrder> page, Integer storeId, Integer tableId, Integer orderStatus);
+
+    /**
      * 加餐(在已有订单基础上添加菜品)
      *
      * @param orderId 订单ID

+ 17 - 1
alien-dining/src/main/java/shop/alien/dining/service/impl/DiningServiceImpl.java

@@ -131,7 +131,23 @@ public class DiningServiceImpl implements DiningService {
         }
 
         CuisineDetailVO vo = new CuisineDetailVO();
-        BeanUtils.copyProperties(cuisine, vo);
+        // 手动映射所有字段,确保所有属性都被正确复制
+        vo.setId(cuisine.getId());
+        vo.setStoreId(cuisine.getStoreId());
+        vo.setName(cuisine.getName());
+        vo.setTotalPrice(cuisine.getTotalPrice());
+        vo.setCuisineType(cuisine.getCuisineType());
+        vo.setCategoryIds(cuisine.getCategoryIds());
+        vo.setTags(cuisine.getTags());
+        vo.setDishReview(cuisine.getDishReview());
+        vo.setDescription(cuisine.getDescription());
+        vo.setDetailContent(cuisine.getDetailContent());
+        vo.setImageContent(cuisine.getImageContent());
+        vo.setExtraNote(cuisine.getExtraNote());
+        vo.setNeedReserve(cuisine.getNeedReserve());
+        vo.setReserveRule(cuisine.getReserveRule());
+        vo.setPeopleLimit(cuisine.getPeopleLimit());
+        vo.setUsageRule(cuisine.getUsageRule());
 
         // 处理图片列表
         if (StringUtils.hasText(cuisine.getImages())) {

+ 66 - 0
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java

@@ -21,6 +21,8 @@ import shop.alien.entity.store.dto.CreateOrderDTO;
 import shop.alien.entity.store.vo.OrderChangeLogBatchVO;
 import shop.alien.entity.store.vo.OrderChangeLogItemVO;
 import shop.alien.entity.store.vo.OrderInfoVO;
+import shop.alien.entity.store.vo.StoreOrderPageVO;
+import shop.alien.entity.store.vo.OrderCuisineItemVO;
 import shop.alien.mapper.*;
 
 import java.math.BigDecimal;
@@ -439,6 +441,70 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
     }
 
     @Override
+    public IPage<StoreOrderPageVO> getOrderPageWithCuisines(Page<StoreOrder> page, Integer storeId, Integer tableId, Integer orderStatus) {
+        log.info("分页查询订单列表(包含菜品信息), storeId={}, tableId={}, orderStatus={}", storeId, tableId, orderStatus);
+        
+        // 1. 查询订单列表
+        IPage<StoreOrder> orderPage = getOrderPage(page, storeId, tableId, orderStatus);
+        
+        // 2. 获取所有订单ID
+        List<StoreOrder> orders = orderPage.getRecords();
+        if (orders == null || orders.isEmpty()) {
+            // 如果没有订单,返回空的分页结果
+            Page<StoreOrderPageVO> resultPage = new Page<>(page.getCurrent(), page.getSize());
+            resultPage.setTotal(orderPage.getTotal());
+            resultPage.setPages(orderPage.getPages());
+            return resultPage;
+        }
+        
+        List<Integer> orderIds = orders.stream()
+                .map(StoreOrder::getId)
+                .collect(Collectors.toList());
+        
+        // 3. 批量查询所有订单的菜品详情
+        LambdaQueryWrapper<StoreOrderDetail> detailWrapper = new LambdaQueryWrapper<>();
+        detailWrapper.in(StoreOrderDetail::getOrderId, orderIds);
+        detailWrapper.eq(StoreOrderDetail::getDeleteFlag, 0);
+        detailWrapper.orderByAsc(StoreOrderDetail::getOrderId);
+        detailWrapper.orderByAsc(StoreOrderDetail::getCreatedTime);
+        List<StoreOrderDetail> allDetails = orderDetailMapper.selectList(detailWrapper);
+        
+        // 4. 按订单ID分组菜品详情
+        Map<Integer, List<StoreOrderDetail>> detailsMap = allDetails.stream()
+                .collect(Collectors.groupingBy(StoreOrderDetail::getOrderId));
+        
+        // 5. 构建返回结果
+        List<StoreOrderPageVO> voList = orders.stream().map(order -> {
+            StoreOrderPageVO vo = new StoreOrderPageVO();
+            vo.setOrder(order);
+            
+            // 获取该订单的菜品列表
+            List<StoreOrderDetail> orderDetails = detailsMap.getOrDefault(order.getId(), new ArrayList<>());
+            List<OrderCuisineItemVO> cuisineItems = orderDetails.stream()
+                    .map(detail -> {
+                        OrderCuisineItemVO item = new OrderCuisineItemVO();
+                        item.setCuisineId(detail.getCuisineId());
+                        item.setCuisineName(detail.getCuisineName());
+                        item.setCuisineImage(detail.getCuisineImage());
+                        item.setQuantity(detail.getQuantity());
+                        return item;
+                    })
+                    .collect(Collectors.toList());
+            vo.setCuisineItems(cuisineItems);
+            
+            return vo;
+        }).collect(Collectors.toList());
+        
+        // 6. 构建分页结果
+        Page<StoreOrderPageVO> resultPage = new Page<>(page.getCurrent(), page.getSize());
+        resultPage.setRecords(voList);
+        resultPage.setTotal(orderPage.getTotal());
+        resultPage.setPages(orderPage.getPages());
+        
+        return resultPage;
+    }
+
+    @Override
     public StoreOrder addDishToOrder(Integer orderId, Integer cuisineId, Integer quantity, String remark) {
         log.info("加餐, orderId={}, cuisineId={}, quantity={}", orderId, cuisineId, quantity);
 

+ 32 - 5
alien-entity/src/main/java/shop/alien/entity/store/vo/CuisineDetailVO.java

@@ -20,14 +20,17 @@ public class CuisineDetailVO {
     @ApiModelProperty(value = "菜品ID")
     private Integer id;
 
+    @ApiModelProperty(value = "商户id")
+    private Integer storeId;
+
     @ApiModelProperty(value = "菜品名称")
     private String name;
 
     @ApiModelProperty(value = "菜品图片列表")
     private List<String> images;
 
-    @ApiModelProperty(value = "价格")
-    private BigDecimal price;
+    @ApiModelProperty(value = "价格(总价)")
+    private BigDecimal totalPrice;
 
     @ApiModelProperty(value = "月售数量")
     private Integer monthlySales;
@@ -35,12 +38,36 @@ public class CuisineDetailVO {
     @ApiModelProperty(value = "标签(多个标签用逗号分隔)")
     private String tags;
 
-    @ApiModelProperty(value = "短评")
-    private String shortComment;
+    @ApiModelProperty(value = "菜品短评")
+    private String dishReview;
+
+    @ApiModelProperty(value = "菜品描述")
+    private String description;
 
-    @ApiModelProperty(value = "菜品介绍")
+    @ApiModelProperty(value = "图文详情-文字")
     private String detailContent;
 
+    @ApiModelProperty(value = "图文详情-图片")
+    private String imageContent;
+
+    @ApiModelProperty(value = "补充说明")
+    private String extraNote;
+
+    @ApiModelProperty(value = "菜品分类ids(JSON数组,如:[1,2,3])")
+    private String categoryIds;
+
+    @ApiModelProperty(value = "是否需要预约:0=否,1=是")
+    private Integer needReserve;
+
+    @ApiModelProperty(value = "预约规则")
+    private String reserveRule;
+
+    @ApiModelProperty(value = "适用人数")
+    private String peopleLimit;
+
+    @ApiModelProperty(value = "使用规则")
+    private String usageRule;
+
     @ApiModelProperty(value = "购物车中的数量")
     private Integer cartQuantity;
 

+ 28 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/OrderCuisineItemVO.java

@@ -0,0 +1,28 @@
+package shop.alien.entity.store.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 订单菜品项VO
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "OrderCuisineItemVO对象", description = "订单菜品项VO")
+public class OrderCuisineItemVO {
+
+    @ApiModelProperty(value = "菜品ID")
+    private Integer cuisineId;
+
+    @ApiModelProperty(value = "菜品名称")
+    private String cuisineName;
+
+    @ApiModelProperty(value = "菜品图片")
+    private String cuisineImage;
+
+    @ApiModelProperty(value = "数量")
+    private Integer quantity;
+}

+ 24 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreOrderPageVO.java

@@ -0,0 +1,24 @@
+package shop.alien.entity.store.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 订单分页VO(包含菜品信息)
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "StoreOrderPageVO对象", description = "订单分页VO(包含菜品信息)")
+public class StoreOrderPageVO {
+
+    @ApiModelProperty(value = "订单信息")
+    private shop.alien.entity.store.StoreOrder order;
+
+    @ApiModelProperty(value = "订单菜品列表")
+    private List<OrderCuisineItemVO> cuisineItems;
+}