feat:套餐展示

This commit is contained in:
dzc committed 2026-08-06 11:46:03 +08:00
1 parent 112c8dde3c
commit ccc2b0e4da
6 files changed
+150 -21

No files matched your search

@@ -2,59 +2,112 @@ package com.bsd.pjcloud.canteen.vo.app;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
/**
* App 每日菜谱展示信息,聚合菜谱日期、餐段和关联菜品的详情字段。
*/
@Data
public class DailyMenuAppVO {
/**
* 每日菜谱记录 ID,是 App 详情接口和页面跳转使用的唯一标识。
*/
private Long id;
/**
* 菜品id
* 菜谱生效日期。
*/
private LocalDate startTime;
/**
* 菜谱所属商户 ID。
*/
private Long merchantId;
/**
* 关联菜品 SPU ID,用于套餐组成查询和下单。
*/
private Long spuId;
/**
* 菜品名称
* 菜品名称。
*/
private String name;
/**
* 商品价格,单位使用:分
* 商品销售价格,单位为分。
*/
private Integer price;
/**
* 菜品分类编号
* 商品市场价格,单位为分;为空时不展示划线价。
*/
private Integer marketPrice;
/**
* 菜品分类编号。
*/
private Long categoryId;
/**
* 菜品封面图
* 菜品分类名称;分类不存在或已删除时为空。
*/
private String categoryName;
/**
* 菜品封面图地址。
*/
private String picUrl;
/**
* 库存
* 商品轮播图地址,多个地址按逗号分隔。
*/
private String sliderPicUrls;
/**
* 商品简介;为空时详情页不展示简介区域。
*/
private String introduction;
/**
* 商品富文本详情;为空或仅包含空标签时详情页不展示图文区域。
*/
private String description;
/**
* 当前可售库存。
*/
private Integer stock;
/**
* 时间类型
* 商品销量,仅用于详情页展示。
*/
private Integer salesCount;
/**
* 餐段类型:1 早餐、2 午餐、3 晚餐。
*/
private Integer hourType;
/**
* 菜品展示排序,数值越小越靠前。
*/
private Integer sort;
/**
* 是否显示
* 是否显示,沿用菜品表协议值;App 查询只返回值为 0 的记录。
*/
private String isShow;
/**
* 商品类型:1单品 2套餐
*/
private Integer spuType;
/**
* 商品类型:1 单品、2 套餐。
*/
private Integer spuType;
/**
* 套餐组成
*/
private List<OnlineSpuComboItemVO> comboItems;
/**
* 套餐组成;单品或套餐未配置明细时返回空列表。
*/
private List<OnlineSpuComboItemVO> comboItems;
}
@@ -15,6 +15,7 @@ import com.bsd.pjcloud.canteen.dto.app.DailyMenuDTO;
import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity;
import com.bsd.pjcloud.canteen.service.CanteenSpuService;
import com.bsd.pjcloud.canteen.vo.ADCanteenDailyMenuListVO;
import com.bsd.pjcloud.canteen.vo.app.DailyMenuAppVO;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.canteen.entity.CanteenDailyMenuEntity;
@@ -212,6 +213,19 @@ public class CanteenDailyMenuController {
return R.ok(canteenDailyMenuService.selectTimeFoodPage(page, dailyMenuDTO));
}
/**
* 按每日菜谱记录 ID 查询 App 详情。
*
* @param id 每日菜谱记录 ID
* @return 每日菜谱详情;记录不存在、已删除或菜品已隐藏时 data 为空
*/
@Operation(summary = "查询每日菜谱详情", description = "按每日菜谱记录 ID 查询 App 展示详情")
@ApiCryptoAes
@GetMapping("/app/{id}")
public R<DailyMenuAppVO> getAppDetail(@PathVariable("id") Long id) {
return R.ok(canteenDailyMenuService.getAppDetail(id));
}
/**
* 获取当天指定菜品
@@ -34,4 +34,12 @@ public interface CanteenDailyMenuMapper extends PjcloudBaseMapper<CanteenDailyMe
Page<DailyMenuAppVO> selectTimeFoodPage(@Param("page")Page page, DailyMenuDTO dailyMenuDTO);
}
/**
* 按每日菜谱记录 ID 查询 App 详情,结果聚合菜谱、菜品和分类的展示字段。
*
* @param id 每日菜谱记录 ID
* @return 可展示的每日菜谱详情;记录不存在、已删除或菜品已隐藏时返回 null
*/
DailyMenuAppVO selectAppDetail(@Param("id") Long id);
}
@@ -7,6 +7,7 @@ import com.bsd.pjcloud.canteen.dto.DailyMenuAll;
import com.bsd.pjcloud.canteen.dto.app.DailyMenuDTO;
import com.bsd.pjcloud.canteen.entity.CanteenDailyMenuEntity;
import com.bsd.pjcloud.canteen.vo.ADCanteenDailyMenuListVO;
import com.bsd.pjcloud.canteen.vo.app.DailyMenuAppVO;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
@@ -53,6 +54,14 @@ public interface CanteenDailyMenuService extends IService<CanteenDailyMenuEntity
Page selectTimeFoodPage(Page page, DailyMenuDTO dailyMenuDTO);
/**
* 按每日菜谱记录 ID 查询 App 详情,并补充套餐组成数据。
*
* @param id 每日菜谱记录 ID
* @return 每日菜谱详情;记录不存在、已删除或菜品已隐藏时返回 null
*/
DailyMenuAppVO getAppDetail(Long id);
/**
* 一键复制
@@ -60,4 +69,4 @@ public interface CanteenDailyMenuService extends IService<CanteenDailyMenuEntity
* @return
*/
R cv(CanteenDailyMenuCVDTO creenDailyMenuCVDTO);
}
}
@@ -150,6 +150,21 @@ public class CanteenDailyMenuServiceImpl extends ServiceImpl<CanteenDailyMenuMap
return pageData;
}
/**
* 按每日菜谱记录 ID 查询 App 详情,并使用关联 SPU 补齐套餐组成。
*
* @param id 每日菜谱记录 ID
* @return 可展示的每日菜谱详情;无有效记录时返回 null
*/
@Override
public DailyMenuAppVO getAppDetail(Long id) {
DailyMenuAppVO detail = baseMapper.selectAppDetail(id);
if (detail != null) {
fillDailyMenuAppCombo(Collections.singletonList(detail));
}
return detail;
}
private void fillDailyMenuCombo(List<DailyMenuVO> list) {
if (CollectionUtils.isEmpty(list)) {
return;
@@ -249,4 +264,4 @@ public class CanteenDailyMenuServiceImpl extends ServiceImpl<CanteenDailyMenuMap
if (ObjectUtil.isEmpty(mchId)) return;
Optional.of(remoteMchService.getById(mchId)).map(R::getData).map(MchManageVo::getDeptId).ifPresent(remoteMqttEventService::sendCanteenProductChangeMsg);
}
}
}
@@ -118,4 +118,34 @@
</where>
order by s.sort asc
</select>
</mapper>
<select id="selectAppDetail" resultType="com.bsd.pjcloud.canteen.vo.app.DailyMenuAppVO">
SELECT m.id,
m.start_time,
m.hour_type,
m.merchant_id,
s.id AS spu_id,
s.name,
s.price,
s.market_price,
s.stock,
s.sales_count,
s.pic_url,
s.slider_pic_urls,
s.introduction,
s.description,
s.sort,
s.is_show,
c.id AS category_id,
c.name AS category_name,
IFNULL(s.spu_type, 1) AS spu_type
FROM canteen_daily_menu m
INNER JOIN canteen_spu s ON m.spu_id = s.id
LEFT JOIN canteen_category c ON s.category_id = c.id AND c.del_flag = 0
WHERE m.id = #{id}
AND m.del_flag = 0
AND s.del_flag = 0
AND s.is_show = 0
LIMIT 1
</select>
</mapper>