1. 项目背景与核心价值
这个茶饮门店数字化运营平台源于我在大学期间观察到的一个行业痛点:传统茶馆的运营模式已经难以满足当代年轻消费者的需求。去年暑假我在一家新中式茶馆打工时,亲眼目睹了服务员手写点单效率低下、高峰期经常出错、库存管理混乱等问题。这促使我决定将毕业设计聚焦于解决这个实际问题。
基于Java技术栈开发的这套系统,本质上是一个B/S架构的智能服务解决方案。它最核心的价值在于通过数字化手段重构茶馆的传统业务流程,具体体现在三个维度:
- 顾客端:提供微信小程序点单界面,支持在线菜单浏览、特色茶饮推荐、自定义口味调整和在线支付
- 运营端:实现从原料采购、库存管理到销售分析的全流程数字化
- 管理端:提供员工业绩考核、门店经营报表等决策支持功能
2. 技术架构设计解析
2.1 整体技术选型
选择SpringBoot作为基础框架主要基于以下考量:
- 快速启动特性:内嵌Tomcat简化部署,适合学生项目开发周期短的特点
- 约定优于配置:减少XML配置,更专注于业务逻辑实现
- 丰富的Starter依赖:轻松整合MyBatis、Redis等常用组件
技术栈组成:
- 前端:Vue.js + ElementUI (管理端) + 微信小程序 (顾客端)
- 后端:SpringBoot 2.7 + MyBatis-Plus + Redis
- 数据库:MySQL 8.0 (关系型) + MongoDB (非结构化数据)
- 基础设施:Nginx反向代理 + 阿里云ECS
2.2 核心模块划分
系统采用经典的三层架构,但针对茶饮行业特性做了特殊设计:
-
用户服务模块:
- 会员等级体系(根据消费金额自动升级)
- 口味偏好分析(基于历史订单数据)
- 积分兑换系统
-
订单服务模块:
- 实时库存检查(防止超卖)
- 复杂计价规则(支持加料、甜度选择等附加项)
- 订单状态机设计(包含制作中、待取餐等特有状态)
-
商品服务模块:
- 季节限定商品自动上下架
- 茶饮成分标签系统(如咖啡因含量、甜度指数)
- 智能推荐算法(基于用户画像和天气数据)
3. 关键功能实现细节
3.1 微信小程序点单流程
点单功能看似简单,但实际开发中遇到了几个技术难点:
- 并发控制:
java复制// 使用Redis分布式锁防止库存超卖
public boolean reduceStock(Long itemId, int quantity) {
String lockKey = "stock_lock:" + itemId;
try {
// 获取锁(设置3秒过期防止死锁)
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 3, TimeUnit.SECONDS);
if (Boolean.TRUE.equals(locked)) {
// 检查库存
Integer stock = stockMapper.selectById(itemId).getQuantity();
if (stock >= quantity) {
// 扣减库存
stockMapper.updateStock(itemId, quantity);
return true;
}
}
return false;
} finally {
// 释放锁
redisTemplate.delete(lockKey);
}
}
- 复杂定价逻辑:
- 基础价格 + 加料价格(珍珠、奶盖等)
- 会员折扣(不同等级不同折扣)
- 时段优惠(下午茶特惠)
- 组合优惠(奶茶+点心套餐)
我们最终采用策略模式实现这套灵活的价格体系:
java复制public interface PricingStrategy {
BigDecimal calculate(OrderItem item, User user);
}
@Service
public class AfternoonTeaStrategy implements PricingStrategy {
// 实现下午2-5点特定商品8折逻辑
}
// 在订单服务中组合使用
public BigDecimal calculateFinalPrice(Order order) {
List<PricingStrategy> strategies = Arrays.asList(
new MemberDiscountStrategy(),
new TimeBasedStrategy(),
new ComboStrategy()
);
return strategies.stream()
.reduce(order.getOriginalPrice(),
(price, strategy) -> strategy.apply(price, order),
BigDecimal::add);
}
3.2 智能推荐系统实现
基于内容的推荐算法主要考虑以下维度:
- 用户历史订单(偏好品类)
- 当前天气(热饮/冷饮推荐)
- 时段特征(早晨推荐提神茶饮)
- 社交属性(网红爆款标记)
技术实现要点:
- 使用Elasticsearch存储商品标签
- 实时计算推荐分数:
java复制public List<TeaItem> recommendItems(User user, Weather weather) {
// 基础权重
Map<String, Double> weights = new HashMap<>();
weights.put("history", 0.4);
weights.put("weather", 0.3);
weights.put("time", 0.2);
weights.put("trend", 0.1);
// 构建ES查询
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加历史偏好条件
if (user.getFavoriteCategory() != null) {
queryBuilder.withQuery(QueryBuilders
.termQuery("category", user.getFavoriteCategory()));
}
// 添加天气条件
String tempCondition = weather.getTemp() > 25 ? "cold" : "hot";
queryBuilder.withFilter(QueryBuilders
.termQuery("suitable_temp", tempCondition));
// 执行查询并加权排序
return elasticsearchTemplate.search(queryBuilder.build(), TeaItem.class)
.getContent().stream()
.map(hit -> {
TeaItem item = hit.getContent();
double score = calculateScore(item, user, weather, weights);
item.setRecommendScore(score);
return item;
})
.sorted(Comparator.comparingDouble(TeaItem::getRecommendScore).reversed())
.limit(5)
.collect(Collectors.toList());
}
4. 典型问题与解决方案
4.1 订单状态同步延迟
初期设计采用简单的数据库状态更新,在高峰时段出现以下问题:
- 前台显示"制作完成"但后厨终端未及时更新
- 多设备间状态不同步
解决方案:
- 引入WebSocket实现实时状态推送
java复制@GetMapping("/order/{id}")
public String getOrderStatus(@PathVariable Long id) {
// 先返回当前数据库状态
return orderService.getStatus(id);
}
// WebSocket配置
@ServerEndpoint("/orderStatus/{orderId}")
public class OrderStatusEndpoint {
@OnOpen
public void onOpen(Session session, @PathParam("orderId") Long orderId) {
// 将session与orderId关联
}
// 在订单状态变更时调用
public static void notifyStatusChange(Long orderId, String newStatus) {
// 向所有监听该orderId的session推送新状态
}
}
- 添加状态变更日志表,提供最终一致性保证:
sql复制CREATE TABLE order_status_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id BIGINT NOT NULL,
from_status VARCHAR(20),
to_status VARCHAR(20) NOT NULL,
changed_at DATETIME NOT NULL,
operator VARCHAR(50)
);
4.2 库存管理痛点
实际运营中发现的问题:
- 原料损耗难以精确统计(如煮茶时的自然蒸发)
- 临期原料提醒不及时
改进方案:
- 引入周期盘点机制:
java复制// 每天营业结束后执行
@Scheduled(cron = "0 0 23 * * ?")
public void dailyInventoryCheck() {
// 1. 对比理论库存与实际盘点
// 2. 自动生成损耗报告
// 3. 预测次日原料需求
}
- 智能预警系统:
- 基于OpenCV的原料图像识别(判断茶叶存量)
- 加权移动平均法预测消耗量:
java复制public double predictConsumption(Long itemId) {
// 获取最近7天消耗量
List<Double> history = inventoryMapper.getWeeklyUsage(itemId);
// 计算加权平均值(越近的数据权重越高)
double sum = 0;
double weightSum = 0;
for (int i = 0; i < history.size(); i++) {
double weight = (i + 1) * 0.1; // 线性权重
sum += history.get(i) * weight;
weightSum += weight;
}
return sum / weightSum;
}
5. 项目演进与优化方向
5.1 已实现的进阶功能
- 员工绩效看板:
- 制作效率指标(单杯平均用时)
- 服务质量评分(基于顾客评价)
- 差错率统计(错单、退款情况)
- 茶饮实验室功能:
- 允许顾客DIY茶饮配方
- 热门配方可上架销售
- 配方知识产权保护机制
5.2 未来优化计划
- 引入计算机视觉:
- 通过摄像头自动识别客流量
- 制作过程质量检测(如奶茶分层效果)
- 供应链协同:
- 与茶叶供应商系统对接
- 自动补货算法优化
- 增强数据分析:
- 顾客停留时间分析
- 菜单项关联规则挖掘
- 促销活动效果预测
这个项目从最初的简单点餐系统,逐步演进成为涵盖运营全流程的数字化平台。在开发过程中,最大的收获是认识到行业知识对技术方案设计的重要性。比如茶叶有"醒茶"这样的特殊工序,就需要在库存管理中考虑"可用库存"与"实际库存"的区别。这些细节往往决定了系统是否真正实用。