餐饮供应链的数仓设计思考 (七) 数据产品与应用创新方案

目录

  1. 方案概述
  2. BI报表系统设计
  3. 门店经理驾驶舱
  4. 实时运营看板
  5. 智能决策引擎
  6. AI/ML创新应用

方案概述

1.1 数据产品的价值定位

makefile 复制代码
数据产品三个层级:

L1 - 信息展示 (BI报表)
├─ 面向: 所有业务人员
├─ 特点: 静态/半静态报表, 看历史数据
├─ 延迟: T+1 (次日查看)
└─ 价值: 了解过去发生了什么

L2 - 实时看板 (驾驶舱/看板)
├─ 面向: 管理层、运营层
├─ 特点: 实时数据、拖拽交互、多维分析
├─ 延迟: <5分钟更新
└─ 价值: 实时掌握当前状态

L3 - 智能决策 (AI/自动化)
├─ 面向: 决策层、系统自动化
├─ 特点: 预测、推荐、自动优化
├─ 延迟: 毫秒级
└─ 价值: 预测未来、指导行动、自动化决策

1.2 数据产品全景

scss 复制代码
┌─────────────────────────────────────────────────────┐
│        数据产品与应用创新全景图                      │
├─────────────────────────────────────────────────────┤
│                                                      │
│ 1️⃣ BI报表系统 (月度/周度/日度)                      │
│    ├─ 财务汇总报表                                  │
│    ├─ 门店经营日报                                  │
│    ├─ 营销活动评估                                  │
│    └─ 供应链成本分析                                │
│                                                      │
│ 2️⃣ 实时驾驶舱 (董事长/总经理级)                     │
│    ├─ KPI概览                                       │
│    ├─ 门店排行榜                                    │
│    ├─ 成本控制                                      │
│    └─ 风险告警                                      │
│                                                      │
│ 3️⃣ 门店经理看板 (一线门店用)                        │
│    ├─ 今日经营                                      │
│    ├─ 班次管理                                      │
│    ├─ 菜品销售                                      │
│    └─ 库存预警                                      │
│                                                      │
│ 4️⃣ 实时运营平台 (财务/供应链用)                    │
│    ├─ 实时成本监控                                  │
│    ├─ 库存动态                                      │
│    └─ 采购管理                                      │
│                                                      │
│ 5️⃣ 智能决策引擎 (算法/优化)                        │
│    ├─ 销售预测→班次推荐                             │
│    ├─ 库存预测→补货推荐                             │
│    ├─ 菜品预测→菜单设计推荐                         │
│    └─ 选址评估→新店决策                             │
│                                                      │
│ 6️⃣ AI/ML应用 (创新驱动)                            │
│    ├─ 个性化推荐                                    │
│    ├─ 动态定价                                      │
│    ├─ 智能订货                                      │
│    └─ 客流预测                                      │
│                                                      │
└─────────────────────────────────────────────────────┘

BI报表系统设计

2.1 报表体系架构

r 复制代码
BI系统应包含的6类报表:

┌─ 财务报表 ──────────────────┬─ 日财务汇总
│                              ├─ 周财务分析
│ 用途: CFO/财务部门            ├─ 月财务决算
│ 延迟: T+1, T+7, T+31         └─ 成本对标分析
│
├─ 门店报表 ──────────────────┬─ 门店日报
│                              ├─ 门店周报
│ 用途: 门店经理/运营管理       ├─ 门店月报
│ 延迟: T+1                    └─ 门店对标排行
│
├─ 营销报表 ──────────────────┬─ 活动效果报告
│                              ├─ 会员分析
│ 用途: 营销部门/运营           ├─ 渠道对标
│ 延迟: T+1                    └─ 促销评估
│
├─ 供应链报表 ────────────────┬─ 库存分析
│                              ├─ 采购成本
│ 用途: 供应链/采购              ├─ 食材损耗
│ 延迟: T+1                    └─ 供应商评估
│
├─ 人力报表 ──────────────────┬─ 人效分析
│                              ├─ 班次统计
│ 用途: HR/门店经理             ├─ 工资核算
│ 延迟: T+1, T+7              └─ 员工评级
│
└─ 战略报表 ──────────────────┬─ 战略仪表板
                               ├─ 竞争对标
                               ├─ 新店评估
                               └─ 区域规划

2.2 门店经营日报设计

报表包含的核心内容:

erlang 复制代码
┌─────────────────────────────────────────────────────┐
│           门店经营日报 (Daily Report)                 │
├─────────────────────────────────────────────────────┤
│ 门店: SHOP001 门店001                                │
│ 日期: 2025-12-07 (周日)                             │
│ 生成时间: 06:00 (第二天早晨)                        │
├─────────────────────────────────────────────────────┤
│                                                      │
│ 📊 昨日概览                                          │
│ ├─ 日销售额: ¥28,500 (环比↑8%, 同比↑5%)            │
│ ├─ 订单数: 245笔 (平均¥116.3/单)                   │
│ ├─ 客流人数: 380人                                  │
│ ├─ 成本额: ¥9,050 (31.7% - 目标30%)                │
│ └─ 毛利润: ¥19,450 (68.3%)                         │
│                                                      │
│ 📈 时段分布 (柱状图)                                 │
│ ├─ 11:00-12:00 (午餐1): ¥5,200 (18%)              │
│ ├─ 12:00-13:00 (午餐2): ¥4,800 (17%)              │
│ ├─ 17:00-18:00 (晚餐1): ¥6,200 (22%)              │
│ ├─ 18:00-19:00 (晚餐2): ¥7,500 (26%)              │
│ └─ 其他时段: ¥4,800 (17%)                          │
│                                                      │
│ 🍽️ 菜品TOP 5 (表格)                                 │
│ ├─ 红烧肉: 58份, ¥2204, 毛利38%                    │
│ ├─ 炒青菜: 42份, ¥840, 毛利52%                     │
│ ├─ 鱼香肉丝: 45份, ¥1620, 毛利35%                  │
│ ├─ 番茄鸡蛋: 38份, ¥570, 毛利45%                   │
│ └─ 排骨汤: 35份, ¥875, 毛利30%                     │
│                                                      │
│ 👥 客流分析                                          │
│ ├─ 堂食: 280人 (73.7%)                             │
│ ├─ 外卖: 85人 (22.4%)                              │
│ ├─ 配送: 15人 (3.9%)                               │
│ ├─ 会员消费: 142人 (37.4%)                         │
│ └─ 新客: 45人 (11.8%)                              │
│                                                      │
│ ⚠️ 预警与建议                                        │
│ ├─ ✓ 成本控制良好                                   │
│ ├─ ⚠️ 人均客单价略低 (¥116 vs目标¥130)            │
│ ├─ ⚠️ 炒青菜库存仅3份 (明天可能缺货)               │
│ └─ ✓ 会员占比达到目标 (>35%)                       │
│                                                      │
│ 📋 今日计划                                          │
│ ├─ 推荐: 搭配销售"排骨汤+米饭" 套餐                 │
│ ├─ 库存: 补货 青菜×50斤, 排骨×30斤                 │
│ ├─ 人力: 今晚多调1人(预计客流↑15%)                │
│ └─ 促销: 下午茶时段提供折扣菜品                    │
│                                                      │
└─────────────────────────────────────────────────────┘

2.3 BI工具选型与实现

推荐方案: Metabase (开源) + 自研数据仓库

Metabase仪表板JSON示例:

json 复制代码
{
  "name": "门店经营看板",
  "description": "实时门店KPI监控",
  "cards": [
    {
      "id": 1,
      "name": "日销售额",
      "type": "gauge",
      "query": {
        "source-table": "dws_daily_shop",
        "aggregation": ["sum", ["field", "daily_sales"]],
        "filter": ["=", ["field", "shop_id"], "SHOP001"],
        "filter": ["=", ["field", "stat_date"], "TODAY"]
      },
      "visualization": {
        "gauge": {"min": 15000, "max": 35000, "target": 25000}
      }
    },
    {
      "id": 2,
      "name": "实时客流",
      "type": "line",
      "query": {
        "source-table": "rt_traffic",
        "dimensions": ["hour"],
        "metrics": ["count"],
        "order-by": [["hour", "ascending"]]
      }
    },
    {
      "id": 3,
      "name": "菜品排行",
      "type": "table",
      "query": {
        "source-table": "ods_order_items",
        "aggregation": [
          ["sum", ["field", "quantity"]],
          ["sum", ["field", "revenue"]]
        ],
        "group-by": ["menu_name"],
        "order-by": [["revenue", "descending"]],
        "limit": 10
      }
    }
  ]
}

门店经理驾驶舱

3.1 驾驶舱核心设计

面向: 店长、地区经理、运营管理层

实时更新频率: 5分钟

ini 复制代码
┌─────────────────────────────────────────────────────────┐
│         门店经理驾驶舱 (Real-time Dashboard)             │
├─────────────────────────────────────────────────────────┤
│                                                          │
│ 📊 三大核心指标 (卡片式)                                 │
│ ┌──────────┬──────────┬──────────┬──────────┐           │
│ │ 今日销售 │ 目标达成 │ 人均效率 │ 成本率   │           │
│ │ ¥18,500 │  74.0%   │ ¥3,050  │  31.2%   │           │
│ │ ↑5.2%   │ ↓3.5%    │ ↑2.1%   │ ↑0.8%    │           │
│ └──────────┴──────────┴──────────┴──────────┘           │
│                                                          │
│ 📈 时序趋势 (4个小时级图表)                              │
│ ├─ 销售额趋势: 折线图 (当日vs昨日vs历史平均)           │
│ ├─ 客流趋势: 柱状图 (实时客流数)                       │
│ ├─ 成本监控: 面积图 (成本率走势)                       │
│ └─ 人效走势: 折线图 (每个服务员的产出)                │
│                                                          │
│ 🏪 门店排行 (表格 - 可排序)                             │
│ ├─ SHOP001: ¥28,500 ★★★★★ (排名1/200)               │
│ ├─ SHOP012: ¥26,200 ★★★★☆ (排名2/200)               │
│ ├─ SHOP045: ¥25,800 ★★★★☆ (排名3/200)               │
│ └─ ... (下拉可见所有门店, 可按销售/成本/人效排序)      │
│                                                          │
│ ⚠️ 实时告警 (滚动消息)                                  │
│ ├─ 🔴 SHOP067 成本率异常 (35.6%, 目标30%)             │
│ ├─ 🟡 SHOP102 客流预警 (17:00后客流未到位)           │
│ ├─ 🟠 SHOP089 缺货预警 (红烧肉库存仅5份)             │
│ └─ 🟢 SHOP201 目标达成 (已完成105%)                   │
│                                                          │
│ 📍 地理分布 (地图)                                      │
│ ├─ 热力图: 显示各区域销售强度                          │
│ ├─ 点击门店: 查看详细数据                              │
│ └─ 筛选: 按城市/区域/类型筛选                          │
│                                                          │
│ 📱 快捷操作                                             │
│ ├─ [查看详情] → 进入门店详细看板                       │
│ ├─ [导出报表] → 导出Excel/PDF                         │
│ ├─ [下钻分析] → 进入更细粒度数据                       │
│ └─ [分享] → 分享给其他管理者                          │
│                                                          │
└─────────────────────────────────────────────────────────┘

3.2 驾驶舱建立SQL

sql 复制代码
-- 创建驾驶舱数据源表
CREATE TABLE rt_dashboard_kpi AS
SELECT
    shop_id,
    shop_name,
    city,
    district,
    CURRENT_TIMESTAMP() as update_time,
    
    -- 核心指标
    SUM(CASE WHEN stat_date = CURDATE() THEN daily_sales ELSE 0 END) AS today_sales,
    SUM(CASE WHEN stat_date = CURDATE() - INTERVAL 1 DAY THEN daily_sales ELSE 0 END) AS yesterday_sales,
    AVG(CASE WHEN stat_date >= CURDATE() - INTERVAL 30 DAY THEN daily_sales ELSE NULL END) AS avg_30day_sales,
    
    -- 目标达成
    SUM(CASE WHEN stat_date = CURDATE() THEN daily_sales ELSE 0 END) / 25000 * 100 AS target_achievement,
    
    -- 人均效率
    SUM(CASE WHEN stat_date = CURDATE() THEN daily_sales ELSE 0 END) / 
    NULLIF(AVG(CASE WHEN stat_date = CURDATE() THEN daily_staff_count ELSE 0 END), 0) AS per_capita_efficiency,
    
    -- 成本率
    SUM(CASE WHEN stat_date = CURDATE() THEN total_cost ELSE 0 END) / 
    NULLIF(SUM(CASE WHEN stat_date = CURDATE() THEN daily_sales ELSE 0 END), 0) * 100 AS cost_ratio,
    
    -- 环比和同比
    (SUM(CASE WHEN stat_date = CURDATE() THEN daily_sales ELSE 0 END) - 
     SUM(CASE WHEN stat_date = CURDATE() - INTERVAL 1 DAY THEN daily_sales ELSE 0 END)) / 
    NULLIF(SUM(CASE WHEN stat_date = CURDATE() - INTERVAL 1 DAY THEN daily_sales ELSE 0 END), 0) * 100 AS mom_growth,
    
    -- 排名
    ROW_NUMBER() OVER (ORDER BY SUM(CASE WHEN stat_date = CURDATE() THEN daily_sales ELSE 0 END) DESC) AS rank,
    
    -- 评级
    CASE 
        WHEN SUM(CASE WHEN stat_date = CURDATE() THEN daily_sales ELSE 0 END) / 25000 >= 1.0 THEN '✓优秀'
        WHEN SUM(CASE WHEN stat_date = CURDATE() THEN daily_sales ELSE 0 END) / 25000 >= 0.9 THEN '✓良好'
        WHEN SUM(CASE WHEN stat_date = CURDATE() THEN daily_sales ELSE 0 END) / 25000 >= 0.8 THEN '⚠️一般'
        ELSE '❌预警'
    END AS performance_rating
    
FROM dws_daily_shop_analysis
WHERE stat_date >= CURDATE() - INTERVAL 90 DAY
GROUP BY 1, 2, 3, 4
ORDER BY rank;

实时运营看板

4.1 财务实时看板

erlang 复制代码
┌─────────────────────────────────────────────────────┐
│       实时财务运营看板 (CFO Dashboard)                │
├─────────────────────────────────────────────────────┤
│                                                      │
│ 📊 今日核心财务指标                                  │
│ ├─ 集团日销: ¥5,680,000 (实时累计)                  │
│ ├─ 累计毛利: ¥3,876,400 (68.2%)                    │
│ ├─ 累计成本: ¥1,803,600 (31.8%)                    │
│ └─ 期末预估: ¥5,850,000 (基于当前趋势)            │
│                                                      │
│ 💰 财务实时趋势                                      │
│ ├─ 销售趋势: 📈 (实时数据, 每5分钟更新)            │
│ ├─ 成本监控: 📊 (与预算对比)                       │
│ ├─ 现金流: 📈 (应收/应付动态)                      │
│ └─ 利润曲线: 📊 (实际vs预测)                       │
│                                                      │
│ 🏪 成本预警                                          │
│ ├─ 高成本门店Top 5 (成本率>35%)                     │
│ │  └─ SHOP067: 35.6%, SHOP089: 34.8% ...          │
│ ├─ 食材成本异常: XXX食材成本↑12%                   │
│ ├─ 人工成本异常: 本月累计加班费↑18%                 │
│ └─ 采购异常: 某供应商价格↑8%                       │
│                                                      │
│ 📈 按时段监控                                        │
│ ├─ 早餐 (07:00-10:00): ¥450,000                   │
│ ├─ 午餐 (11:00-14:00): ¥2,100,000                 │
│ ├─ 下午茶 (14:00-17:00): ¥800,000                 │
│ └─ 晚餐 (17:00-22:00): ¥2,330,000                 │
│                                                      │
│ 🔍 对标分析                                          │
│ ├─ 本月vs上月: +8.2%                               │
│ ├─ 本月vs去年: +12.5%                              │
│ ├─ 本月vs预算: -2.3%                               │
│ └─ 行业平均: +4.5%                                 │
│                                                      │
└─────────────────────────────────────────────────────┘

4.2 库存实时看板

yaml 复制代码
┌─────────────────────────────────────────────────────┐
│        库存实时监控看板 (Inventory Dashboard)        │
├─────────────────────────────────────────────────────┤
│                                                      │
│ 📦 库存状态概览                                      │
│ ├─ 在库商品: 45种, 库存价值¥280万                   │
│ ├─ 库存周转率: 12.5次/年 (行业平均10)              │
│ ├─ 库存积压率: 2.3% (目标<3%)                      │
│ └─ 即期商品: 3种, 需在7天内售出                    │
│                                                      │
│ ⚠️ 库存预警 (红黄绿灯)                              │
│ ├─ 🔴 缺货风险 (3种):                              │
│ │  ├─ 红烧肉: 库存5份, 日均消耗15份                │
│ │  ├─ 排骨汤: 库存3份, 日均消耗12份                │
│ │  └─ 建议: 立即补货 (预计3小时内到达)            │
│ ├─ 🟡 库存预警 (8种):                              │
│ │  └─ 建议: 加快销售, 安排打折促销                │
│ └─ 🟢 库存正常 (34种)                              │
│                                                      │
│ 📊 库存ROI分析                                       │
│ ├─ 高流转商品 Top 5: (周转>3次/月)                 │
│ │  └─ 大米, 油, 盐, 酱油, 鸡蛋                    │
│ ├─ 低流转商品 Top 5: (周转<1次/月)                 │
│ │  └─ 某高档食材, 某小众菜品 → 建议淘汰           │
│ └─ 库存成本: ¥2,800/天 (目标¥2,500/天)            │
│                                                      │
│ 🗓️ 采购日程                                         │
│ ├─ 今日到货: 3批 (13:00, 15:30, 18:00)            │
│ ├─ 明日计划: 红烧肉×100份, 青菜×80份              │
│ ├─ 周采购: 总采购额¥45,000 (vs预算¥48,000)       │
│ └─ 异常采购: 某批蔬菜质量不合格, 已申请退货        │
│                                                      │
└─────────────────────────────────────────────────────┘

智能决策引擎

5.1 智能推荐系统

python 复制代码
# intelligent_recommendation.py - 智能决策推荐引擎

class IntelligentRecommendationEngine:
    """智能推荐引擎 - 基于预测和优化的决策支持"""
    
    def recommend_staffing_schedule(self, shop_id, date):
        """推荐班次安排"""
        # 获取销售预测
        forecast = self._get_sales_forecast(shop_id, date)
        
        # 按小时级预测分解
        hourly_forecast = forecast['hourly_breakdown']
        
        # 推荐班次
        recommendations = []
        for hour, predicted_orders in hourly_forecast.items():
            # 基于订单数推荐需要的人数
            # 平均每个服务员可处理15个订单/小时
            recommended_staff = max(2, int(predicted_orders / 15))
            
            recommendations.append({
                'hour': hour,
                'predicted_orders': predicted_orders,
                'recommended_staff': recommended_staff,
                'estimated_payroll': recommended_staff * 50,  # 50元/人/小时
                'confidence': forecast['confidence_level']
            })
        
        # 成本优化
        total_cost = sum([r['estimated_payroll'] for r in recommendations])
        
        return {
            'date': date,
            'schedule': recommendations,
            'estimated_daily_payroll': total_cost,
            'cost_vs_budget': total_cost / 6000,  # 与日均预算比较
            'confidence_level': forecast['confidence_level']
        }
    
    def recommend_menu_optimization(self, shop_id):
        """推荐菜单优化"""
        # 分析菜品的销售、利润、出菜效率
        menu_analysis = self._analyze_menu_performance(shop_id)
        
        recommendations = {
            'high_profit_items': [],  # 高利润菜品→推荐主推
            'low_profit_items': [],   # 低利润菜品→建议调整价格
            'slow_moving_items': [],  # 滞销菜品→建议下架或促销
            'combo_suggestions': []   # 搭配建议
        }
        
        for menu in menu_analysis:
            if menu['profit_margin'] > 50 and menu['popularity'] > 50:
                recommendations['high_profit_items'].append({
                    'menu_id': menu['id'],
                    'menu_name': menu['name'],
                    'profit_margin': menu['profit_margin'],
                    'action': '↑优化菜单位置, 增加推荐'
                })
            
            if menu['popularity'] < 10:
                recommendations['slow_moving_items'].append({
                    'menu_id': menu['id'],
                    'menu_name': menu['name'],
                    'action': '调整价格或下架'
                })
        
        return recommendations
    
    def recommend_inventory_replenishment(self, shop_id):
        """推荐库存补货"""
        # 获取需求预测
        demand_forecast = self._get_ingredient_demand_forecast(shop_id, days=7)
        
        # 当前库存
        current_inventory = self._get_current_inventory(shop_id)
        
        recommendations = []
        for ingredient_id, predicted_demand in demand_forecast.items():
            current = current_inventory.get(ingredient_id, 0)
            reorder_point = predicted_demand['7day_total'] * 1.1 * 0.2  # 覆盖1.4天
            
            if current <= reorder_point:
                order_qty = predicted_demand['7day_total'] * 1.2  # 订购1.2倍需求
                
                recommendations.append({
                    'ingredient_id': ingredient_id,
                    'ingredient_name': self._get_ingredient_name(ingredient_id),
                    'current_stock': current,
                    'recommended_qty': order_qty,
                    'urgency': 'P0_紧急' if current < reorder_point * 0.5 else 'P1_需补货',
                    'estimated_arrival': self._get_supplier_lead_time(ingredient_id),
                    'estimated_cost': order_qty * self._get_unit_price(ingredient_id)
                })
        
        return sorted(recommendations, key=lambda x: x['urgency'])
    
    def recommend_marketing_action(self, member_id):
        """推荐个性化营销行动"""
        # 获取会员档案
        profile = self._get_member_profile(member_id)
        
        # 计算流失风险
        churn_prob = self._calculate_churn_probability(profile)
        
        # 计算LTV
        ltv = self._calculate_ltv(profile)
        
        # 根据风险等级推荐营销行动
        if churn_prob > 0.7:
            # 高流失风险→挽回营销
            action = {
                'action': 'win_back_campaign',
                'discount': 20,  # 20%折扣
                'frequency': 'immediate',
                'channel': 'push_notification',
                'message': f"好久不见! 专为您准备{profile['favorite_category']}特优惠"
            }
        elif churn_prob > 0.5 and ltv > 1000:
            # 中流失风险+高价值→升级推荐
            action = {
                'action': 'upgrade_offer',
                'recommend_items': self._get_premium_recommendations(profile),
                'frequency': 'weekly',
                'channel': 'email'
            }
        else:
            # 低风险→定期推荐
            action = {
                'action': 'regular_offer',
                'recommend_items': self._get_personalized_menu(profile),
                'frequency': 'monthly'
            }
        
        return action
    
    def recommend_site_selection(self, candidate_sites):
        """推荐选址决策"""
        recommendations = []
        
        for site in candidate_sites:
            # 使用训练的模型预测成功概率
            success_prob = self._predict_store_success(site)
            
            # 估算财务指标
            financials = self._estimate_financials(site)
            
            # 生成决策建议
            if success_prob >= 0.8:
                decision = '🟢 立即开店'
            elif success_prob >= 0.6:
                decision = '🟡 可以考虑'
            else:
                decision = '🔴 不建议'
            
            recommendations.append({
                'site_id': site['id'],
                'site_address': site['address'],
                'success_probability': success_prob,
                'decision': decision,
                'estimated_monthly_sales': financials['monthly_sales'],
                'payback_period_months': financials['payback_months'],
                'risk_factors': site['risk_factors']
            })
        
        return sorted(recommendations, key=lambda x: x['success_probability'], reverse=True)
    
    # 辅助方法
    def _get_sales_forecast(self, shop_id, date):
        pass
    
    def _analyze_menu_performance(self, shop_id):
        pass
    
    def _get_ingredient_demand_forecast(self, shop_id, days):
        pass
    
    def _get_current_inventory(self, shop_id):
        pass

5.2 决策建议API

python 复制代码
# decision_api.py - 智能决策API接口

from fastapi import FastAPI, HTTPException
import json

app = FastAPI()
engine = IntelligentRecommendationEngine()

@app.get("/api/v1/recommendation/staffing")
async def get_staffing_recommendation(shop_id: str, date: str = None):
    """获取班次安排推荐"""
    try:
        recommendation = engine.recommend_staffing_schedule(shop_id, date or datetime.now().date())
        return {
            'code': 200,
            'data': recommendation
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/api/v1/recommendation/menu")
async def get_menu_recommendation(shop_id: str):
    """获取菜单优化建议"""
    try:
        recommendation = engine.recommend_menu_optimization(shop_id)
        return {
            'code': 200,
            'data': recommendation
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/api/v1/recommendation/inventory")
async def get_inventory_recommendation(shop_id: str):
    """获取库存补货建议"""
    try:
        recommendation = engine.recommend_inventory_replenishment(shop_id)
        return {
            'code': 200,
            'data': recommendation,
            'summary': {
                'total_items': len(recommendation),
                'urgent_items': sum(1 for r in recommendation if 'P0' in r['urgency']),
                'total_cost': sum(r['estimated_cost'] for r in recommendation)
            }
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/api/v1/recommendation/marketing/{member_id}")
async def get_marketing_recommendation(member_id: str):
    """获取会员营销建议"""
    try:
        recommendation = engine.recommend_marketing_action(member_id)
        return {
            'code': 200,
            'data': recommendation
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.post("/api/v1/recommendation/site-selection")
async def get_site_selection_recommendation(sites: list):
    """获取选址决策建议"""
    try:
        recommendations = engine.recommend_site_selection(sites)
        return {
            'code': 200,
            'data': recommendations,
            'top_choice': recommendations[0] if recommendations else None
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

AI/ML创新应用

6.1 个性化推荐系统

python 复制代码
# personalization.py - AI个性化推荐

class PersonalizationEngine:
    """基于用户行为的个性化推荐引擎"""
    
    def __init__(self, db_connection):
        self.db = db_connection
        self.embedding_model = None  # 使用预训练embedding模型
    
    def recommend_menu_items(self, member_id, context=None):
        """根据用户历史行为推荐菜品"""
        
        # 获取用户档案
        user_profile = self._get_user_profile(member_id)
        
        # 获取用户的消费向量 (embedding)
        # 通过聚类用户的菜品偏好
        user_vector = self._get_user_embedding(member_id)
        
        # 计算菜品向量
        all_menus = self._get_all_menus()
        
        # 计算用户-菜品相似度
        recommendations = []
        for menu in all_menus:
            menu_vector = self._get_menu_embedding(menu['id'])
            similarity = self._cosine_similarity(user_vector, menu_vector)
            
            # 考虑上下文因素
            if context:
                time_of_day = context.get('time_of_day')
                day_type = context.get('day_type')  # 工作日/周末
                
                # 调整相似度 (时间和菜品搭配)
                if time_of_day == 'lunch' and menu['category'] == '饭菜':
                    similarity *= 1.3
                elif time_of_day == 'breakfast' and menu['category'] == '粥':
                    similarity *= 1.2
            
            # 过滤用户已消费过多次的菜品
            if menu['id'] in user_profile['consumed_items']:
                if user_profile['consumed_items'][menu['id']] > 10:
                    similarity *= 0.7  # 降低相似度
            
            recommendations.append({
                'menu_id': menu['id'],
                'menu_name': menu['name'],
                'similarity_score': similarity,
                'reason': self._generate_explanation(member_id, menu['id'], similarity)
            })
        
        # 返回top 10
        recommendations = sorted(recommendations, key=lambda x: x['similarity_score'], reverse=True)
        return recommendations[:10]
    
    def _generate_explanation(self, member_id, menu_id, similarity):
        """生成推荐理由 (可解释性)"""
        user_profile = self._get_user_profile(member_id)
        menu = self._get_menu(menu_id)
        
        # 简单的因果解释
        if menu['category'] in user_profile['favorite_categories']:
            return f"基于您的{menu['category']}偏好"
        elif menu['price'] in user_profile['price_range']:
            return f"价格在您偏好的范围内"
        else:
            return "新菜推荐"
    
    def _cosine_similarity(self, vec1, vec2):
        """计算向量余弦相似度"""
        from numpy import dot
        from numpy.linalg import norm
        return dot(vec1, vec2) / (norm(vec1) * norm(vec2))
    
    def _get_user_embedding(self, member_id):
        """获取用户embedding向量"""
        # 基于用户消费历史、偏好、人口统计信息
        # 使用预训练模型或自训练embedding
        pass
    
    def _get_menu_embedding(self, menu_id):
        """获取菜品embedding向量"""
        # 基于菜品特征、成分、价格、销售等
        pass

6.2 动态定价系统

python 复制代码
# dynamic_pricing.py - AI动态定价

class DynamicPricingEngine:
    """基于需求、库存、竞争的动态定价引擎"""
    
    def calculate_optimal_price(self, menu_id, shop_id):
        """计算最优价格"""
        
        # 获取菜品信息
        menu = self._get_menu(menu_id)
        base_price = menu['base_price']
        cost = menu['cost']
        
        # 获取需求信息
        demand_forecast = self._get_demand_forecast(menu_id, shop_id)
        current_stock = self._get_current_stock(menu_id, shop_id)
        
        # 竞争信息
        competitor_price = self._get_competitor_price(menu_id)
        
        # 时间因素
        hour = datetime.now().hour
        day_type = 'weekend' if datetime.now().weekday() >= 5 else 'weekday'
        
        # 价格弹性系数
        price_elasticity = self._estimate_price_elasticity(menu_id)
        
        # 计算最优价格
        # 目标: 最大化 (价格 - 成本) × 销量
        # 同时: 清理积压库存, 应对竞争
        
        optimal_price = base_price
        
        # 调整因素1: 库存压力
        if current_stock > demand_forecast['avg_daily'] * 3:
            # 库存过多→降价刺激销售
            optimal_price *= 0.85
        elif current_stock < demand_forecast['avg_daily'] * 0.5:
            # 库存不足→提价获取更高利润
            optimal_price *= 1.10
        
        # 调整因素2: 需求预测
        predicted_demand_ratio = demand_forecast['predicted'] / demand_forecast['avg_daily']
        if predicted_demand_ratio > 1.3:
            # 需求高→提价
            optimal_price *= 1.08
        elif predicted_demand_ratio < 0.7:
            # 需求低→降价
            optimal_price *= 0.92
        
        # 调整因素3: 竞争
        if competitor_price and competitor_price < base_price:
            # 竞争对手价格更低→适当降价但不过低
            optimal_price = min(optimal_price, competitor_price * 0.98)
        
        # 调整因素4: 时间
        if hour in [12, 13, 18, 19]:  # 高峰时段
            optimal_price *= 1.05
        elif hour in [14, 15, 16]:  # 低迷时段
            optimal_price *= 0.95
        
        # 确保价格合理 (不低于成本的110%)
        optimal_price = max(optimal_price, cost * 1.1)
        
        return {
            'menu_id': menu_id,
            'menu_name': menu['name'],
            'base_price': base_price,
            'optimal_price': round(optimal_price, 2),
            'price_change_pct': round((optimal_price - base_price) / base_price * 100, 2),
            'expected_impact': self._forecast_price_impact(menu_id, optimal_price),
            'valid_until': datetime.now() + timedelta(hours=2),  # 2小时后重新计算
            'confidence': 0.75
        }
    
    def _estimate_price_elasticity(self, menu_id):
        """估算价格需求弹性"""
        # 基于历史数据分析: 价格变化对销量的影响
        # 高弹性菜品 (-1.5): 价格敏感型
        # 低弹性菜品 (-0.3): 必需菜品
        pass
    
    def _forecast_price_impact(self, menu_id, new_price):
        """预测价格变化的影响"""
        elasticity = self._estimate_price_elasticity(menu_id)
        base_demand = self._get_base_demand(menu_id)
        
        # 需求变化 = 需求量 × 价格弹性 × 价格变化%
        demand_change = elasticity * (new_price - self._get_current_price(menu_id)) / self._get_current_price(menu_id)
        
        return {
            'expected_sales_change_pct': round(demand_change * 100, 2),
            'expected_revenue_change_pct': round(
                ((1 + demand_change) * new_price / self._get_current_price(menu_id) - 1) * 100, 2
            ),
            'message': '销量会有所下降,但总收益上升' if demand_change < 0 else '销量会增加'
        }

6.3 智能订货系统

python 复制代码
# smart_ordering.py - AI智能订货

class SmartOrderingSystem:
    """基于预测和优化的智能订货系统"""
    
    def generate_purchasing_order(self, shop_id, lead_time_days=2):
        """生成采购订单建议"""
        
        orders = []
        
        # 获取所有食材
        all_ingredients = self._get_all_ingredients()
        
        for ingredient in all_ingredients:
            # 获取需求预测
            demand = self._forecast_ingredient_demand(
                ingredient['id'],
                shop_id,
                days=lead_time_days + 7  # 覆盖lead time + 一周库存
            )
            
            # 获取当前库存
            current_stock = self._get_current_stock(ingredient['id'], shop_id)
            
            # 计算最优订购量
            order_qty = max(
                0,
                demand['7day_total'] * 1.1 - current_stock  # 需求 - 当前库存
            )
            
            # 考虑MOQ (最小订购量) 和打包规格
            if order_qty > 0:
                order_qty = self._apply_moq_constraint(order_qty, ingredient['moq'])
            
            # 成本计算
            unit_price = self._get_supplier_unit_price(ingredient['id'])
            total_cost = order_qty * unit_price
            
            # 智能选择供应商 (基于价格、交期、质量)
            suppliers = self._get_qualified_suppliers(ingredient['id'])
            best_supplier = self._select_best_supplier(suppliers, order_qty, lead_time_days)
            
            if order_qty > 0:
                orders.append({
                    'ingredient_id': ingredient['id'],
                    'ingredient_name': ingredient['name'],
                    'order_qty': round(order_qty, 2),
                    'unit': ingredient['unit'],
                    'unit_price': unit_price,
                    'total_cost': round(total_cost, 2),
                    'supplier_id': best_supplier['id'],
                    'supplier_name': best_supplier['name'],
                    'expected_delivery': datetime.now() + timedelta(days=lead_time_days),
                    'reason': self._explain_order(ingredient, demand, current_stock)
                })
        
        # 按供应商分组生成采购单
        purchase_orders_by_supplier = {}
        for order in orders:
            supplier_id = order['supplier_id']
            if supplier_id not in purchase_orders_by_supplier:
                purchase_orders_by_supplier[supplier_id] = []
            purchase_orders_by_supplier[supplier_id].append(order)
        
        return {
            'shop_id': shop_id,
            'generated_time': datetime.now(),
            'total_items': len(orders),
            'total_cost': round(sum(o['total_cost'] for o in orders), 2),
            'orders_by_supplier': purchase_orders_by_supplier,
            'approval_status': 'pending'
        }
    
    def _forecast_ingredient_demand(self, ingredient_id, shop_id, days):
        """预测食材需求"""
        # 基于菜品销售预测 × 菜品配方
        pass
    
    def _apply_moq_constraint(self, qty, moq):
        """应用最小订购量约束"""
        import math
        return math.ceil(qty / moq) * moq
    
    def _select_best_supplier(self, suppliers, qty, lead_time):
        """选择最优供应商"""
        # 综合考虑: 价格、质量评分、交期、最小订购量
        scored_suppliers = []
        for supplier in suppliers:
            score = 0
            score += (1 - supplier['unit_price'] / max(s['unit_price'] for s in suppliers)) * 40  # 价格权重40%
            score += supplier['quality_score'] / 5 * 30  # 质量权重30%
            score += (1 - supplier['lead_time'] / lead_time) * 20 if supplier['lead_time'] <= lead_time else 0  # 交期权重20%
            score += 10 if qty >= supplier['moq'] else -10  # MOQ检查
            
            scored_suppliers.append({**supplier, 'overall_score': score})
        
        return max(scored_suppliers, key=lambda x: x['overall_score'])
    
    def _explain_order(self, ingredient, demand, current_stock):
        """生成订单说明"""
        days_to_runout = current_stock / (demand['7day_total'] / 7) if demand['7day_total'] > 0 else float('inf')
        
        if days_to_runout < 2:
            return '库存紧张,需立即补货'
        elif days_to_runout < 5:
            return '库存偏低,建议尽快补货'
        else:
            return '库存正常,定期补货'

实现路线图与成效预期

7.1 12个月实现路线

阶段 时间 交付物 关键KPI
M1-M3 月1-3 BI工具+5个核心报表 报表数80+, 日活用户200+
M4-M6 月4-6 门店驾驶舱+库存看板 驾驶舱访问量500+/天, 库存预警准确率90%
M7-M9 月7-9 智能推荐API+动态定价 个性化推荐使用率60%, 定价优化↑8%收益
M10-M12 月10-12 AI订货+全链路优化 订货自动化80%, 库存↓18%

7.2 预期成效

erlang 复制代码
┌─────────────────────────────────────────────────────┐
│          数据产品创新的成效预期 (12个月)             │
├─────────────────────────────────────────────────────┤
│                                                      │
│ 📊 数据应用覆盖                                      │
│ ├─ 日活业务用户: 200+ → 1000+ (5倍增长)            │
│ ├─ 日查询数: 5000+ → 50000+ (10倍增长)             │
│ ├─ 自助分析占比: 30% → 70%                         │
│ └─ 数据驱动决策占比: 40% → 85%                     │
│                                                      │
│ 💰 业务价值提升                                      │
│ ├─ 人效提升: 班次优化→↑12%                         │
│ ├─ 客单价: 个性化推荐→↑8%                          │
│ ├─ 库存成本: 智能订货→↓18%                         │
│ ├─ 营销ROI: 精准营销→↑25%                          │
│ ├─ 新店成功率: 科学选址→↑35%                       │
│ └─ 合计收益: 3000-5000万/年                        │
│                                                      │
│ 🚀 数据能力建设                                      │
│ ├─ 数据技能覆盖: 60% → 90% (员工)                  │
│ ├─ 数据产品数: 6 → 30+                             │
│ ├─ 自动化决策: 10% → 60%                          │
│ └─ 机制化创新: 试错-验证-推广的闭环建立            │
│                                                      │
│ 🎯 竞争力提升                                        │
│ ├─ 决策效率: 月度→日/周                            │
│ ├─ 精细化程度: 店级→门店/班次/菜品                 │
│ ├─ 实时性: T+1 → 实时                              │
│ └─ 预测能力: 被动应对→主动优化                     │
│                                                      │
└─────────────────────────────────────────────────────┘

总结

本文档详细阐述了餐饮连锁企业如何通过BI系统、驾驶舱、智能引擎、AI应用四大产品线,将数据仓库的数据转化为真正的业务价值。

核心思路:

  1. L1-信息 (报表) → 了解过去
  2. L2-洞察 (驾驶舱) → 掌握当下
  3. L3-预测 (模型) → 预见未来
  4. L4-决策 (自动化) → 自主优化
相关推荐
语落心生11 小时前
餐饮供应链的数仓设计思考 (六) 数据分析与业务预测方案
数据分析
数据智研14 小时前
【数据分享】腾格里沙漠空间矢量范围
大数据·信息可视化·数据分析
数据智研15 小时前
【数据分享】毛乌素沙地(毛乌素沙漠)空间矢量范围
大数据·人工智能·信息可视化·数据分析
小王毕业啦16 小时前
2000-2023年 地级市-公路运输相关数据
大数据·人工智能·数据挖掘·数据分析·数据统计·社科数据·实证数据
B站_计算机毕业设计之家17 小时前
python招聘数据 求职就业数据可视化平台 大数据毕业设计 BOSS直聘数据可视化分析系统 Flask框架 Echarts可视化 selenium爬虫技术✅
大数据·python·深度学习·考研·信息可视化·数据分析·flask
咚咚王者1 天前
人工智能之数据分析 Pandas:第七章 相关性分析
人工智能·数据分析·pandas
咚咚王者1 天前
人工智能之数据分析 Pandas:第六章 数据清洗
人工智能·数据分析·pandas
B站计算机毕业设计之家1 天前
大数据项目:基于python电商平台用户行为数据分析可视化系统 电商订单数据分析 Django框架 Echarts可视化 大数据技术(建议收藏)
大数据·python·机器学习·数据分析·django·电商·用户分析
Maxwell_li11 天前
Pandas 描述分析和分组分析学习文档
学习·数据分析·numpy·pandas·matplotlib