酒吧点单系统中,酒水商品包含单品、组合套餐、试饮商品三类,不同商品的定价、库存、限购逻辑差异很大。很多早期实现将所有商品混在同一张数据表,容易出现套餐价格计算错误、库存超扣、试饮配额失控等问题。本文结合Java后端开发实践,讲解该模块的数据设计、接口逻辑、校验规则,实现一套可稳定落地的酒水分类管理方案。

单品酒水是独立售卖商品,拥有独立SKU与库存;套餐是多个单品组合售卖,使用套餐专属优惠价;试饮商品一般用于引流,设置总配额、单用户限购次数、活动时间。 开发中常见问题:套餐修改搭配单品后,历史订单价格发生变动;套餐下单时没有联动校验子商品库存;试饮退款后配额没有回滚;前端分类展示混乱。模块设计核心思路:商品主表统一管理基础信息,通过扩展表承载套餐、试饮的差异化规则。
商品主表保存通用字段:商品ID、商品名称、分类ID、商品类型(1单品,2套餐,3试饮)、封面图、状态、排序。 单品SKU表:绑定单品ID,记录规格、售价、库存、成本。 套餐明细表:绑定套餐ID,关联单品ID、搭配数量、套餐内单品参考价。 试饮配置表:绑定试饮商品ID,总配额、单用户限购数、活动起止时间。 用户试饮记录表:记录用户ID、商品ID、购买份数、核销状态,用于限购校验。

商品类型枚举,统一区分三类商品:
public enum GoodsTypeEnum {
SINGLE(1, "单品"),
COMBO(2, "套餐"),
TASTE(3, "试饮");
private final Integer code;
private final String desc;
GoodsTypeEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() { return code; }
}试饮下单前核心校验片段:
// 校验总配额、用户限购
public void checkTasteGoods(Long goodsId, Long userId, Integer buyNum){
TasteGoodsConfig config = tasteConfigMapper.selectByGoodsId(goodsId);
// 已售卖数量
Integer soldCount = tasteRecordMapper.sumBuyNum(goodsId);
if(soldCount + buyNum > config.getTotalQuota()){
throw new RuntimeException("试饮商品配额不足");
}
// 用户已购买数量
Integer userBuy = tasteRecordMapper.sumUserBuyNum(goodsId, userId);
if(userBuy + buyNum > config.getUserLimit()){
throw new RuntimeException("该商品每人限购"+config.getUserLimit()+"份");
}
}套餐下单时,循环校验套餐内所有子单品库存,任意单品库存不足直接拦截下单,避免超卖。
分类管理:支持新增、编辑、停用酒水分类,如啤酒、洋酒、鸡尾酒、套餐专区、试饮专区,支持拖拽排序,控制分类是否在前端展示。 单品配置:上传图片、填写售价、维护SKU库存,支持上下架。 套餐配置:选择内部单品,设置搭配数量,填写套餐售卖价,支持设置套餐是否限时有效。套餐库存策略采用子单品库存联动校验,不推荐独立虚拟库存。 试饮配置:设置总配额、单人限购数量、活动时间范围。所有修改操作写入操作日志,方便对账追溯。
用户端首页横向展示分类标签,切换标签过滤对应商品,网格卡片展示图片、名称、价格,提供加入购物车按钮。 单品直接展示售价与库存;套餐详情页展示套餐总价、原价对比,列出套餐内包含酒水;试饮商品卡片带有专属标识,展示剩余配额。 加入购物车时请求后端校验,根据商品类型执行不同校验逻辑:单品校验SKU库存、套餐校验子商品库存、试饮校验配额与用户限购。结算时按商品类型执行对应的金额计算逻辑。
单品下单,扣减对应SKU库存;退款时恢复库存。 套餐下单,不扣套餐虚拟库存,扣减套餐内每一个单品的库存;退款时批量回滚子单品库存。套餐价格固定,不实时累加单品价格,保证历史订单价格稳定。 试饮商品下单生成购买记录,占用配额;订单退款成功后,释放对应配额,恢复用户可购买次数,防止配额永久占用。
商品分类、热销商品列表增加Redis缓存,减少数据库频繁查询;商品图片存储到对象存储,开启图片压缩。 接口层面做好参数校验,防止非法参数修改库存、配额;同时前后端双重校验,前端仅做UI展示,核心校验逻辑全部放在后端。 上线前重点测试:套餐内单品下架,套餐自动不可下单;试饮达到限购后无法继续购买;退款场景库存、配额正常回滚。
酒吧酒水分类管理模块,采用“主表统一+扩展表差异化”的设计方式,用类型字段区分单品、套餐、试饮三类商品,Java后端通过枚举、独立校验方法隔离不同业务规则。开发重点在于套餐子商品库存联动校验、试饮配额与用户限购控制,同时做好退款场景的数据回滚。该方案适配小程序、H5酒吧点单场景,具备良好的扩展性,可以后续叠加时段价、优惠券等营销能力,适配酒吧夜间、节假日的经营需求。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。