liyafei 3 месяцев назад
Родитель
Сommit
5872e6f914

+ 2 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/CategoryGroupDto.java

@@ -1,5 +1,6 @@
 package shop.alien.entity.store.dto;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -18,6 +19,7 @@ import java.util.List;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
 @ApiModel(value = "CategoryGroupDto", description = "套餐分类组")
 public class CategoryGroupDto {
 

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/CuisineItemDto.java

@@ -27,5 +27,8 @@ public class CuisineItemDto {
 
     @ApiModelProperty(value = "数量")
     private Integer quantity;
+
+    @ApiModelProperty(value = "单位")
+    private String unit;
 }
 

+ 73 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/CuisineTypeResponseDto.java

@@ -0,0 +1,73 @@
+package shop.alien.entity.store.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 根据类型获取美食详情响应 DTO
+ *
+ * @author auto-generated
+ * @since 2025-01-01
+ */
+@Data
+@ApiModel(value = "CuisineTypeResponseDto", description = "根据类型获取美食详情响应")
+public class CuisineTypeResponseDto {
+
+    @ApiModelProperty(value = "名称,格式:套餐:{套餐名称}(引用上述两个单品)")
+    private String name;
+
+    @ApiModelProperty(value = "数据对象")
+    private CuisineTypeData data;
+
+    @Data
+    @ApiModel(value = "CuisineTypeData", description = "美食详情数据")
+    public static class CuisineTypeData {
+
+        @ApiModelProperty(value = "美食类型: 1-单品,2-套餐")
+        private Integer cuisineType;
+
+        @ApiModelProperty(value = "商户id")
+        private Integer storeId;
+
+        @ApiModelProperty(value = "菜名/套餐名")
+        private String name;
+
+        @ApiModelProperty(value = "总价")
+        private BigDecimal totalPrice;
+
+        @ApiModelProperty(value = "图片列表,最多 9 张 URL,逗号分隔")
+        private String images;
+
+        @ApiModelProperty(value = "菜品原料json(原料名称:name,所需重量:height,成本价:cost,推荐价格:suggest)")
+        private String rawJson;
+
+        @ApiModelProperty(value = "图文详情-图片")
+        private String imageContent;
+
+        @ApiModelProperty(value = "图文详情-文字")
+        private String detailContent;
+
+        @ApiModelProperty(value = "补充说明")
+        private String extraNote;
+
+        @ApiModelProperty(value = "是否需要预约:0=否,1=是")
+        private Integer needReserve;
+
+        @ApiModelProperty(value = "预约规则")
+        private String reserveRule;
+
+        @ApiModelProperty(value = "适用人数")
+        private Integer peopleLimit;
+
+        @ApiModelProperty(value = "使用规则")
+        private String usageRule;
+
+        @ApiModelProperty(value = "套餐组合JSON字符串")
+        private String groupJson;
+    }
+}
+

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

@@ -13,7 +13,7 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.StoreCuisine;
 import shop.alien.entity.store.StorePrice;
 import shop.alien.entity.store.dto.CuisineComboDto;
-import shop.alien.entity.store.dto.CuisineDetailDto;
+import shop.alien.entity.store.dto.CuisineTypeResponseDto;
 import shop.alien.entity.store.vo.PriceListVo;
 import shop.alien.store.service.StoreCuisineService;
 import shop.alien.store.service.StorePriceService;
@@ -79,8 +79,8 @@ public class StoreCuisineController {
             @ApiImplicitParam(name = "cuisineType", value = "美食类型:1-单品,2-套餐", dataType = "Integer", paramType = "query", required = true)
     })
     @GetMapping("/getByCuisineType")
-    public R<CuisineDetailDto> getByCuisineType(Integer id, Integer cuisineType) {
-        return R.data(storeCuisineService.getByCuisineType(id, cuisineType));
+    public R<CuisineTypeResponseDto> getByCuisineType(Integer id, Integer cuisineType) {
+        return R.data(storeCuisineService.getByCuisineTypeNew(id, cuisineType));
     }
 
 

+ 3 - 2
alien-store/src/main/java/shop/alien/store/service/StoreCuisineService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.store.StoreCuisine;
 import shop.alien.entity.store.dto.CuisineComboDto;
 import shop.alien.entity.store.dto.CuisineDetailDto;
+import shop.alien.entity.store.dto.CuisineTypeResponseDto;
 
 import java.util.List;
 
@@ -31,11 +32,11 @@ public interface StoreCuisineService extends IService<StoreCuisine> {
     List<StoreCuisine> getSingleName();
 
     /**
-     * 根据 id 与类型获取详情:
+     * 根据 id 与类型获取详情(新格式)
      * - type = 1:返回单品详情
      * - type = 2:返回套餐详情(主信息 + 套餐包含的单品列表)
      */
-    CuisineDetailDto getByCuisineType(Integer id, Integer cuisineType);
+    CuisineTypeResponseDto getByCuisineTypeNew(Integer id, Integer cuisineType);
 
     /**
      * 上下架操作:1-上架,2-下架

+ 78 - 37
alien-store/src/main/java/shop/alien/store/service/impl/StoreCuisineServiceImpl.java

@@ -10,11 +10,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.store.StoreCuisine;
 import shop.alien.entity.store.StoreCuisineCombo;
-import shop.alien.entity.store.StoreInfo;
 import shop.alien.entity.store.dto.CategoryGroupDto;
 import shop.alien.entity.store.dto.CuisineComboDto;
-import shop.alien.entity.store.dto.CuisineDetailDto;
 import shop.alien.entity.store.dto.CuisineItemDto;
+import shop.alien.entity.store.dto.CuisineTypeResponseDto;
 import shop.alien.mapper.StoreCuisineMapper;
 import shop.alien.mapper.StoreInfoMapper;
 import shop.alien.store.service.StoreCuisineComboService;
@@ -116,46 +115,55 @@ public class StoreCuisineServiceImpl extends ServiceImpl<StoreCuisineMapper, Sto
         return updateById(cuisine);
     }
 
+
     /**
-     * 根据 id 与类型获取详情:
+     * 根据 id 与类型获取详情(新格式)
      * - type = 1:返回单品详情
      * - type = 2:返回套餐详情(主信息 + 套餐包含的单品列表)
      */
     @Override
-    public CuisineDetailDto getByCuisineType(Integer id, Integer cuisineType) {
+    public CuisineTypeResponseDto getByCuisineTypeNew(Integer id, Integer cuisineType) {
         // 1. 先查主表记录
         StoreCuisine base = getById(id);
         if (base == null) {
             return null;
         }
 
-        CuisineDetailDto dto = new CuisineDetailDto();
-        dto.setBaseInfo(base);
-
-        //查询当前门店套餐/单品列表 详情头部使用
-        List<StoreCuisine> cuisineList = storeCuisineMapper.selectList(new LambdaQueryWrapper<StoreCuisine>().eq(StoreCuisine :: getStoreId, base.getStoreId()));
-        dto.setStoreCuisineList(cuisineList);
-
-        //查询门店手机号 门店名称
-        StoreInfo storeInfo = storeInfoMapper.selectOne(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo :: getId, base.getStoreId()));
-        if(storeInfo !=null){
-            dto.setStorePhone(storeInfo.getStoreTel());
-            dto.setStoreName(storeInfo.getStoreName());
-        }
-
-        // 单品:直接返回主信息,items 为空
+        CuisineTypeResponseDto response = new CuisineTypeResponseDto();
+        CuisineTypeResponseDto.CuisineTypeData data = new CuisineTypeResponseDto.CuisineTypeData();
+        
+        // 填充基本信息
+        data.setCuisineType(base.getCuisineType());
+        data.setStoreId(base.getStoreId());
+        data.setName(base.getName());
+        data.setTotalPrice(base.getTotalPrice());
+        data.setImages(base.getImages());
+        data.setImageContent(base.getImageContent());
+        data.setDetailContent(base.getDetailContent());
+        data.setExtraNote(base.getExtraNote());
+        data.setNeedReserve(base.getNeedReserve());
+        data.setReserveRule(base.getReserveRule());
+        data.setPeopleLimit(base.getPeopleLimit());
+        data.setUsageRule(base.getUsageRule());
+        data.setRawJson(base.getRawJson());
+        // 单品:groupJson 为空,name 为单品名称
         if (cuisineType != null && cuisineType == 1) {
-            dto.setItems(Collections.emptyList());
-            return dto;
+            response.setName(base.getName());
+            data.setGroupJson("");
+            response.setData(data);
+            return response;
         }
 
-        // 套餐:通过中间表查出包含哪些单品
+        // 套餐:通过中间表查出包含哪些单品,构建 groupJson
         LambdaQueryWrapper<StoreCuisineCombo> comboWrapper = new LambdaQueryWrapper<>();
         comboWrapper.eq(StoreCuisineCombo::getCid, id);
         List<StoreCuisineCombo> combos = storeCuisineComboService.list(comboWrapper);
+        
         if (combos.isEmpty()) {
-            dto.setItems(Collections.emptyList());
-            return dto;
+            response.setName("套餐:" + base.getName());
+            data.setGroupJson("[]");
+            response.setData(data);
+            return response;
         }
 
         // 收集所有单品 sid
@@ -171,21 +179,54 @@ public class StoreCuisineServiceImpl extends ServiceImpl<StoreCuisineMapper, Sto
         Map<Integer, StoreCuisine> singleMap = singles.stream()
                 .collect(Collectors.toMap(StoreCuisine::getId, s -> s));
 
-        // 组装套餐明细
-        List<CuisineDetailDto.CuisineItemDetail> itemDetails = new ArrayList<>();
-        for (StoreCuisineCombo combo : combos) {
-            StoreCuisine single = singleMap.get(combo.getSid());
-            if (single == null) {
-                continue;
+        // 按分类分组构建 CategoryGroupDto 列表
+        Map<String, List<StoreCuisineCombo>> categoryMap = combos.stream()
+                .collect(Collectors.groupingBy(StoreCuisineCombo::getCategory));
+
+        List<CategoryGroupDto> categoryGroups = new ArrayList<>();
+        
+        for (Map.Entry<String, List<StoreCuisineCombo>> entry : categoryMap.entrySet()) {
+            String categoryName = entry.getKey();
+            List<StoreCuisineCombo> categoryCombos = entry.getValue();
+            
+            CategoryGroupDto group = new CategoryGroupDto();
+            group.setCategoryName(categoryName);
+            
+            List<CuisineItemDto> items = new ArrayList<>();
+            for (StoreCuisineCombo combo : categoryCombos) {
+                StoreCuisine single = singleMap.get(combo.getSid());
+                if (single == null) {
+                    continue;
+                }
+                
+                CuisineItemDto item = new CuisineItemDto();
+                item.setCuisineId(single.getId());
+                item.setCuisineName(single.getName());
+                item.setQuantity(combo.getSnum());
+                item.setUnit("份");
+                items.add(item);
             }
-            CuisineDetailDto.CuisineItemDetail detail = new CuisineDetailDto.CuisineItemDetail();
-            detail.setSingle(single);
-            detail.setQuantity(combo.getSnum());
-            detail.setCategory(combo.getCategory());
-            itemDetails.add(detail);
+            group.setItems(items);
+            categoryGroups.add(group);
         }
-        dto.setItems(itemDetails);
-        return dto;
+
+        // 将 CategoryGroupDto 列表转换为 JSON 字符串
+        String groupJson;
+        try {
+            groupJson = objectMapper.writeValueAsString(categoryGroups);
+        } catch (IOException e) {
+            throw new RuntimeException("构建套餐组合 JSON 失败", e);
+        }
+        data.setGroupJson(groupJson);
+
+        // 构建 name 字段:套餐:{套餐名称}(引用上述{数量}个单品)
+        // 计算不同单品的数量(去重后的 sid 数量)
+        int singleCount = sidList.size();
+        String countText = singleCount == 2 ? "两个" : (singleCount == 3 ? "三个" : singleCount + "个");
+        response.setName("套餐:" + base.getName() + "(引用上述" + countText + "单品)");
+
+        response.setData(data);
+        return response;
     }
 
     /**

+ 13 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreImgServiceImpl.java

@@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LifeUser;
 import shop.alien.entity.store.StoreImg;
@@ -159,6 +160,18 @@ public class StoreImgServiceImpl extends ServiceImpl<StoreImgMapper, StoreImg> i
      */
     @Override
     public List<StoreImg> getByBusinessId(Integer storeId, Integer imgType, Integer businessId) {
+        if (imgType==4){
+            LambdaQueryWrapper<StoreOfficialAlbum> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(StoreOfficialAlbum::getStoreId, storeId)
+                    .eq(StoreOfficialAlbum::getAlbumName, "环境");
+            List<StoreOfficialAlbum> list = storeOfficialAlbumMapper.selectList(queryWrapper);
+            if (!CollectionUtils.isEmpty(list)) {
+                StoreOfficialAlbum officialAlbum = list.get(0);
+                if (ObjectUtils.isNotEmpty(officialAlbum)) {
+                    businessId = officialAlbum.getId();
+                }
+            }
+        }
         LambdaQueryWrapper<StoreImg> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(StoreImg::getStoreId, storeId)
                 .eq(StoreImg::getImgType, imgType)