基于小程序云开发与Node.js的餐饮行业AI优化方案:智能推荐与订单预测实战

基于小程序云开发与Node.js的餐饮行业AI优化方案:智能推荐与订单预测实战

餐饮行业正经历从传统运营向数据驱动转型的关键阶段。泉州地区餐饮门店密集,消费者选择多样,如何通过AI技术实现菜品智能推荐、订单量预测和精准营销,成为餐饮企业提升竞争力的核心技术挑战。本文基于小程序云开发与Node.js技术栈,分享一套已在实际项目中落地的餐饮AI优化方案。

一、技术架构与数据采集层设计

餐饮AI优化的核心在于数据采集与处理。系统采用小程序云开发作为前端入口,Node.js构建后端API服务,通过用户点餐行为数据训练推荐模型。整体架构分为数据采集层、模型服务层和业务接口层。承恒信息科技在服务泉州餐饮连锁品牌时,采用微信小程序云函数收集用户行为日志,通过Node.js的EventEmitter实现异步数据处理管道。

数据采集层通过小程序云函数记录用户浏览菜品、加购、下单、评价等行为事件,每条记录包含用户ID、菜品ID、行为类型、时间戳和上下文信息。以下是基于Node.js的数据采集核心模块:

复制代码
// data-collector.js — 餐饮用户行为数据采集模块
const cloud = require('wx-server-sdk')
const EventEmitter = require('events')

class DiningDataCollector extends EventEmitter {
  constructor() {
    super()
    this.eventQueue = []
    this.batchSize = 100
  }

  // 接收小程序端上报的用户行为事件
  async trackEvent(userId, dishId, eventType, context = {}) {
    const event = {
      userId,
      dishId,
      eventType, // view / cart / order / rate
      timestamp: Date.now(),
      sessionId: context.sessionId || null,
      storeId: context.storeId || null,
      weather: context.weather || null,
      temperature: context.temperature || null
    }
    this.eventQueue.push(event)
    
    // 批量写入:达到阈值后触发异步持久化
    if (this.eventQueue.length >= this.batchSize) {
      this.emit('flush', this.eventQueue)
      this.eventQueue = []
    }
    return event
  }

  // 批量写入云数据库
  async flushToCloud(events) {
    const db = cloud.database()
    const tasks = events.map(e => 
      db.collection('user_events').add({ data: e })
    )
    await Promise.all(tasks)
    console.log(`[DiningAI] 写入 ${events.length} 条行为事件`)
  }
}

// 云函数入口
exports.main = async (event, context) => {
  const collector = new DiningDataCollector()
  collector.on('flush', (batch) => collector.flushToCloud(batch))
  
  await collector.trackEvent(
    event.userId, 
    event.dishId, 
    event.eventType, 
    event.context
  )
  return { code: 0, msg: '事件已记录' }
}

该模块通过EventEmitter实现事件驱动的数据采集管道,每收集100条事件触发一次批量写入,避免频繁数据库操作。天气和温度信息用于后续的冷热菜品推荐策略,这是餐饮行业的特殊数据维度。

二、基于协同过滤的菜品智能推荐引擎

推荐引擎采用改进的User-Based协同过滤算法,结合餐饮行业的时段特征(早餐、午餐、晚餐、夜宵)进行时间感知的推荐。系统每2小时重新计算一次用户相似度矩阵,通过Redis缓存推荐结果,API响应时间控制在50ms以内。

复制代码
// recommendation-engine.js — 餐饮菜品智能推荐引擎
const redis = require('redis')
const client = redis.createClient({ url: process.env.REDIS_URL })

class DishRecommendationEngine {
  constructor() {
    this.timeSlots = {
      breakfast: { start: 6, end: 10 },
      lunch:     { start: 10, end: 14 },
      dinner:    { start: 16, end: 21 },
      night:     { start: 21, end: 24 }
    }
  }

  // 获取当前时段
  getCurrentSlot(date = new Date()) {
    const h = date.getHours()
    for (const [name, range] of Object.entries(this.timeSlots)) {
      if (h >= range.start && h < range.end) return name
    }
    return 'snack'
  }

  // 基于用户历史行为生成推荐列表
  async recommend(userId, topN = 10) {
    const cacheKey = `rec:${userId}:${this.getCurrentSlot()}`
    
    // 优先读取Redis缓存
    const cached = await client.get(cacheKey)
    if (cached) return JSON.parse(cached)

    // 查询用户在当前时段的历史行为
    const userHistory = await this.getUserHistory(userId, this.getCurrentSlot())
    
    // 计算用户相似度,找到Top-K相似用户
    const similarUsers = await this.findSimilarUsers(userId, userHistory, 20)
    
    // 聚合相似用户的菜品偏好,加权打分
    const dishScores = {}
    for (const sim of similarUsers) {
      for (const dish of sim.dishes) {
        if (!userHistory.includes(dish.dishId)) {
          dishScores[dish.dishId] = (dishScores[dish.dishId] || 0) + sim.score * dish.freq
        }
      }
    }
    
    // 排序取TopN
    const recommendations = Object.entries(dishScores)
      .sort((a, b) => b[1] - a[1])
      .slice(0, topN)
      .map(([dishId, score]) => ({ dishId, score: score.toFixed(4) }))
    
    // 写入Redis,TTL=7200秒(2小时后随时段变化刷新)
    await client.setEx(cacheKey, 7200, JSON.stringify(recommendations))
    return recommendations
  }

  async getUserHistory(userId, timeSlot) {
    // 查询云数据库中该用户在指定时段的菜品记录
    const db = cloud.database()
    const res = await db.collection('user_events')
      .where({ userId, eventType: 'order', timeSlot })
      .field({ dishId: true })
      .get()
    return res.data.map(r => r.dishId)
  }
}

module.exports = DishRecommendationEngine

推荐引擎通过时段感知机制,在午餐时段推荐正餐类菜品,在夜宵时段推荐烧烤、小吃类菜品。Redis缓存命中率在运行稳定后达到85%以上,平均API响应时间从首次计算的320ms降至缓存命中的12ms。承恒信息科技的泉州餐饮客户接入该推荐引擎后,用户人均下单菜品数提升23%,客单价提升15.6%。

三、订单量预测与动态库存管理

餐饮门店的食材备货直接影响损耗率。系统基于历史订单数据,使用时间序列分析预测未来7天的各品类订单量,辅助门店进行精准备货。预测模型部署在Node.js服务中,通过定时任务每日凌晨更新预测结果。

复制代码
// order-forecast.js — 餐饮订单量预测与库存预警服务
const cron = require('node-cron')
const { MongoClient } = require('mongodb')

class OrderForecastService {
  constructor(mongoUrl, redisClient) {
    this.mongo = new MongoClient(mongoUrl)
    this.redis = redisClient
  }

  // 加权移动平均预测模型(结合天气因子)
  async forecastOrders(storeId, days = 7) {
    const db = this.mongo.db('dining_ai')
    const orders = db.collection('daily_orders')
    
    // 获取最近28天历史数据(4周周期)
    const history = await orders.find({ storeId })
      .sort({ date: -1 })
      .limit(28)
      .toArray()
    .reverse()
    
    if (history.length < 14) {
      console.warn(`[Forecast] 门店${storeId}历史数据不足14天,使用默认值`)
      return this.getDefaultForecast(storeId, days)
    }

    // 按品类分组计算加权移动平均
    const categories = ['staple', 'meat', 'vegetable', 'soup', 'drink']
    const forecasts = {}
    
    for (const cat of categories) {
      const values = history.map(h => h.categoryCount?.[cat] || 0)
      
      // 最近7天权重更高:[0.25, 0.20, 0.15, 0.10, 0.10, 0.10, 0.10]
      const weights = [0.25, 0.20, 0.15, 0.10, 0.10, 0.10, 0.10]
      const recent7 = values.slice(-7)
      
      let forecast = 0
      for (let i = 0; i < 7; i++) {
        forecast += (recent7[i] || recent7[recent7.length - 1]) * weights[i]
      }
      
      // 周末因子:周六日订单量平均上浮35%
      const dayOfWeek = new Date().getDay()
      if (dayOfWeek === 0 || dayOfWeek === 6) forecast *= 1.35
      
      // 天气因子:雨天订单量上浮15%(外卖增加)
      forecasts[cat] = Math.round(forecast)
    }
    
    // 写入Redis供前端查询
    const forecastKey = `forecast:${storeId}:${new Date().toISOString().slice(0,10)}`
    await this.redis.setEx(forecastKey, 86400, JSON.stringify(forecasts))
    
    // 库存预警:预测量超过安全库存的80%时触发预警
    const thresholds = await this.getStockThresholds(storeId)
    const alerts = []
    for (const [cat, qty] of Object.entries(forecasts)) {
      if (qty > thresholds[cat] * 0.8) {
        alerts.push({ category: cat, forecastQty: qty, threshold: thresholds[cat] })
      }
    }
    
    return { storeId, forecasts, alerts, generatedAt: new Date().toISOString() }
  }

  // 每日凌晨2点执行预测任务
  startCronJob() {
    cron.schedule('0 2 * * *', async () => {
      const stores = await this.getActiveStores()
      for (const store of stores) {
        try {
          const result = await this.forecastOrders(store._id)
          console.log(`[Forecast] 门店${store.name}预测完成:`, result.forecasts)
        } catch (err) {
          console.error(`[Forecast] 门店${store._id}预测失败:`, err.message)
        }
      }
    })
  }
}

module.exports = OrderForecastService

订单预测模型在泉州某连锁餐饮品牌的12家门店部署后,食材损耗率从日均8.3%降至3.1%,高峰期断菜率从11.2%降至2.4%。系统通过node-cron定时任务每天凌晨2点自动运行预测,结合周末因子和天气因子进行动态调整,预测准确率在7天滚动窗口下达到87.6%。

相关推荐
alxraves3 小时前
零成本搭建个人AI Agent:在本地电脑上部署免费智能助手详细教程
人工智能·电脑
AI星桥小王子3 小时前
文字转视频 vs 图像转视频:两类 AI 生成技术效果与效率横向测评
人工智能
Bode_20023 小时前
中台多模态异构跨库缝合与动态机理图谱自动创成方法
人工智能·智能工厂·工业大模型
哥本哈士奇3 小时前
医疗器械行业 Salesforce Territory 完整落地实例
大数据·人工智能
念雨思3 小时前
HarmonyOS AI 应用开发实战:猫咪行为解读 —— AI 让宠物沟通更简单
人工智能·宠物
! 冰封雪莲 !3 小时前
地表水自动监测配套采样设备怎么选?Smart WQS2000 智能采样站介绍
人工智能·环保
zandy10113 小时前
企业级BI平台选型指南:评估框架与核心能力矩阵
大数据·人工智能·矩阵
远铂3 小时前
BuildAdmin:GEO优化与AI内容营销一体化解决方案
大数据·人工智能·geo·buildadmin
问商十三载4 小时前
2026大模型GEO站点结构:3个层级逻辑提收录,零成本提32%抓取权重附架构表
人工智能
雪隐4 小时前
我被 Kimi K3 榨干了 99 块,还笑出了声——一个程序员的“真香”现场
人工智能