目录
方案概述
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应用四大产品线,将数据仓库的数据转化为真正的业务价值。
核心思路:
- L1-信息 (报表) → 了解过去
- L2-洞察 (驾驶舱) → 掌握当下
- L3-预测 (模型) → 预见未来
- L4-决策 (自动化) → 自主优化