feat: 新增门店选址分析功能

- 创建选址分析7个SQL视图+5张物化表(38s→33ms)
- 后端新增5个选址API端点
- 前端新增SiteSelectionPage页面(散点图+4Tab)
- 侧边栏新增门店选址导航入口
- 修复SQL列引用错误(d.→a.,去掉重复列)
- 创建v_store_action_priority_deep_april和v_store_area_efficiency_april基础视图
This commit is contained in:
freedakgmail
2026-07-27 08:33:42 +08:00
parent 521ba88937
commit 6e0c1bd7a4
18 changed files with 1892 additions and 30 deletions
+112
View File
@@ -0,0 +1,112 @@
# 马兰拉面数字化运营管理平台 - 产品演示视频
## 视频文件
- **product-demo.mp4** — 32秒,16张截图,每张2秒,1920×1080,硬切无黑屏
## 截图编排(按《餐易通×收钱吧战略融合价值分析》逻辑组织)
### 第一章:行业本质问题——餐饮数字化的"半截子"困境
| 序号 | 文件 | 页面 | 对应文档逻辑 |
|---|---|---|---|
| s01 | s01-dashboard-top.png | 总部驾驶舱-顶部 | **底层基础设施已就位**:支付数据已沉淀,KPI卡片总览全局经营 |
| s02 | s02-dashboard-charts.png | 总部驾驶舱-图表 | **但数据未转化为经营决策**:象限散点图、瀑布图、平台成本率图展示数据深度分析能力 |
### 第二章:战略定位——从"帮商户收钱"到"帮商户赚钱"
| 序号 | 文件 | 页面 | 对应文档逻辑 |
|---|---|---|---|
| s03 | s03-regional-overview.png | 区域经理工作台 | **区域经营汇总**:12个区按实收排名,红黄绿风险分布,从GMV到经营利润的价值锚点转换 |
### 第三章:数据飞轮——融合后的增长引擎
| 序号 | 文件 | 页面 | 对应文档逻辑 |
|---|---|---|---|
| s04 | s04-store-manager-full.png | 店长工作台-全页 | **数据→分析→指令→行动闭环**:经营概览→指标进度→SKU备货→任务执行 |
| s05 | s05-store-manager-top.png | 店长工作台-顶部 | **可执行的经营指令**:最新经营概览(异常标注)+ 本周指标进度条(达标判定),店长几分钟看完就知道今天干什么 |
### 第四章:餐易通为什么能做到——不是软件公司,是餐饮产业公司
| 序号 | 文件 | 页面 | 对应文档逻辑 |
|---|---|---|---|
| s06 | s06-store-detail-overview.png | 门店详情-概览 | **从支付→菜品→成本全链路**:菜百店KPI、日度趋势、平台经济性 |
| s07 | s07-store-detail-meal-period.png | 门店详情-餐段分析 | **AI客流预测基础**:午市/晚市/下午茶/早市客流热力分布 |
| s08 | s08-store-detail-category.png | 门店详情-品类结构 | **标准化SKU结构**:品类销售占比、搭售分析 |
| s09 | s09-store-detail-cost.png | 门店详情-成本分析 | **成本诊断模型**:理论成本vs实际成本差异定位 |
| s10 | s10-store-detail-member.png | 门店详情-会员分析 | **会员复购分析**RFM分层、沉睡会员召回机会 |
| s11 | s11-store-detail-anomaly.png | 门店详情-异常账单 | **风险内控**:异常账单识别与闭环处理 |
### 第五章:产业级影响——从服务商户到定义标准
| 序号 | 文件 | 页面 | 对应文档逻辑 |
|---|---|---|---|
| s12 | s12-monthly-review-summary.png | 月度验收-验收汇总 | **从"数字化"到"智能化"**:月度验收KPI汇总,每天只推少量异常和待办 |
| s13 | s13-monthly-review-grade.png | 月度验收-升降级面板 | **从"开店"到"复制盈利模型"**:P0/P1/P2等级变化,标准化经营模型验证 |
| s14 | s14-monthly-review-completion.png | 月度验收-任务完成率 | **闭环验证**:按优先级汇总任务完成率,验证改善效果 |
| s15 | s15-monthly-review-activity.png | 月度验收-活动清单 | **平台经济性分析**:逐活动贡献毛利,停/改/留清单由数据驱动 |
| s16 | s16-monthly-review-sku.png | 月度验收-SKU治理 | **标准化SKU输出**:ABC分类饼图,长尾SKU精简治理 |
## 视频合成命令
```bash
# 每张图2秒,硬切无转场,1920×1080
cd demo && ffmpeg -y -framerate 1/2 -pattern_type glob -i 's*.png' \
-c:v libx264 -pix_fmt yuv420p \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:0x0F0F0F" \
-r 30 product-demo.mp4
```
## 推荐旁白文案(按文档九章结构)
> **s01-s02 总部驾驶舱**
> "中国餐饮数字化面临'半截子'困境:支付基础设施已铺到位,但数据没有向上转化为经营决策。我们的平台从支付数据出发,构建象限散点图、瀑布图、平台成本率图,让总部一屏看全局。"
>
> **s03 区域经理工作台**
> "区域经理工作台,按12个区汇总经营数据,红黄绿风险一目了然。价值锚点从交易规模转向经营利润,从'帮商户收钱'升级为'帮商户赚钱'。"
>
> **s04-s05 店长工作台**
> "数据飞轮的核心:经营概览标注异常项,本周指标进度条直观显示达标情况,核心SKU备货提醒确保不断货,待办任务指引每日行动。店长几分钟看完就知道今天干什么——不是更多报表,而是更少的、更准的、能直接行动的指令。"
>
> **s06 门店详情-概览**
> "以菜百店为例,从支付到菜品到成本的全链路分析。日度实收趋势、平台经济性,一切用数据说话。"
>
> **s07 餐段分析**
> "餐段分析精准定位午市、晚市、下午茶、早市的客流与客单价差异,为AI客流预测和智能排班提供基础。"
>
> **s08 品类结构**
> "品类结构分析揭示销售集中度和搭售机会,为标准化SKU模型提供数据支撑。"
>
> **s09 成本分析**
> "成本诊断模型对比理论成本与实际成本,精准定位差异来源——这不是给商户一套漂亮的报表,而是给出一个店长明天就能执行的动作。"
>
> **s10 会员分析**
> "会员复购分析,基于支付身份识别自动分层,发现沉睡会员召回机会,构建精准营销闭环。"
>
> **s11 异常账单**
> "风险内控模块自动识别异常账单,从发现到处理全程闭环,让每一家门店的经营都合规可控。"
>
> **s12 月度验收汇总**
> "月度验收与复盘,从'数字化'升级为'智能化'。不是给商户更多报表,而是更少的、更准的、能直接行动的指令。"
>
> **s13 升降级面板**
> "P0/P1/P2等级变化记录,验证标准化经营模型的可复制性。从'开店'到'复制盈利模型''开一家赚一家'取代'开了再说'。"
>
> **s14 任务完成率**
> "任务完成率按优先级汇总,闭环验证改善效果。每一个改善都可追踪、可量化。"
>
> **s15 活动清单**
> "逐活动贡献毛利分析,识别'越卖越亏'的活动。停、改、留清单由数据驱动而非经验判断。"
>
> **s16 SKU治理**
> "ABC分类识别长尾SKU,推动SKU精简治理。标准SKU结构、标准备货量、标准成本管控——这就是可复制的盈利模型。"
>
> **结尾**
> "马兰拉面数字化运营管理平台——支付底座+经营大脑,数据驱动,闭环管理,让每一家门店都更好。"
## 截图参数
- 分辨率:1440×900 viewport
- 格式:PNG
- 设备像素比:deviceRetina高清)
- 门店:菜百店(store_code=1111
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/env python3
"""Add subtitle text to each screenshot, then build video with ffmpeg."""
import os, subprocess
from PIL import Image, ImageDraw, ImageFont
DEMO_DIR = os.path.dirname(os.path.abspath(__file__))
FONT_PATH = "/System/Library/Fonts/STHeiti Medium.ttc"
FONT_SIZE = 36
# (filename, subtitle_text)
screenshots = [
("s01-dashboard-top.png", "总部驾驶舱 — 全局经营总览,KPI一屏掌握"),
("s02-dashboard-charts.png", "象限散点图·瀑布图·平台成本率 — 数据深度分析"),
("s03-regional-overview.png", "区域经理工作台 — 12区经营汇总,红黄绿风险分布"),
("s04-store-manager-full.png", "店长工作台 — 经营概览·指标进度·SKU备货·任务闭环"),
("s05-store-manager-top.png", "店长工作台 — 异常标注+指标进度条,几分钟看完就知道今天干什么"),
("s06-store-detail-overview.png", "门店详情·概览 — 菜百店全链路:KPI·日度趋势·平台经济性"),
("s07-store-detail-meal-period.png", "门店详情·餐段分析 — 午市/晚市/下午茶/早市客流与客单价"),
("s08-store-detail-category.png", "门店详情·品类结构 — 销售集中度与搭售机会分析"),
("s09-store-detail-cost.png", "门店详情·成本分析 — 理论成本vs实际成本,精准定位差异"),
("s10-store-detail-member.png", "门店详情·会员分析 — RFM分层,沉睡会员召回机会"),
("s11-store-detail-anomaly.png", "门店详情·异常账单 — 风险内控,自动识别与闭环处理"),
("s12-monthly-review-summary.png", "月度验收·验收汇总 — 从数字化到智能化,只推可执行指令"),
("s13-monthly-review-grade.png", "月度验收·升降级面板 — P0/P1/P2等级变化,复制盈利模型"),
("s14-monthly-review-completion.png","月度验收·任务完成率 — 按优先级汇总,闭环验证改善效果"),
("s15-monthly-review-activity.png", "月度验收·活动清单 — 逐活动贡献毛利,停改留由数据驱动"),
("s16-monthly-review-sku.png", "月度验收·SKU治理 — ABC分类,长尾精简,标准化输出"),
]
sub_dir = os.path.join(DEMO_DIR, "sub")
os.makedirs(sub_dir, exist_ok=True)
font = ImageFont.truetype(FONT_PATH, FONT_SIZE)
for fname, text in screenshots:
src = os.path.join(DEMO_DIR, fname)
img = Image.open(src).convert("RGBA")
w, h = img.size
# Create overlay for text background bar
overlay = Image.new("RGBA", (w, h), (0, 0, 0, 0))
draw = ImageDraw.Draw(overlay)
# Measure text
bbox = draw.textbbox((0, 0), text, font=font)
tw = bbox[2] - bbox[0]
th = bbox[3] - bbox[1]
# Draw semi-transparent black bar at bottom
bar_h = th + 30
bar_y = h - bar_h
draw.rectangle([0, bar_y, w, h], fill=(0, 0, 0, 180))
# Draw text centered
tx = (w - tw) // 2
ty = bar_y + 15
draw.text((tx, ty), text, font=font, fill=(255, 255, 255, 255))
# Composite
result = Image.alpha_composite(img, overlay).convert("RGB")
dst = os.path.join(sub_dir, fname)
result.save(dst, "PNG")
print(f" {fname} -> sub/{fname}")
print(f"\nGenerated {len(screenshots)} annotated screenshots in sub/")
# Build video
print("\nBuilding video with ffmpeg...")
cmd = [
"ffmpeg", "-y",
"-framerate", "1/2",
"-pattern_type", "glob",
"-i", os.path.join(sub_dir, "s*.png"),
"-c:v", "libx264",
"-pix_fmt", "yuv420p",
"-vf", "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:0x0F0F0F",
"-r", "30",
os.path.join(DEMO_DIR, "product-demo.mp4")
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
print("Video built: product-demo.mp4")
else:
print(f"Error: {result.stderr[-500:]}")
BIN
View File
Binary file not shown.
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
cd /Users/freedak/Documents/AIDashboard/SBrainCO/demo
ffmpeg -y -framerate 1/2 -pattern_type glob -i 's*.png' \
-c:v libx264 -pix_fmt yuv420p \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:0x0F0F0F,subtitles=subtitles.srt:force_style='FontName=Heiti SC,FontSize=22,PrimaryColour=&H00FFFFFF,OutlineColour=&H000F0F0F,BorderStyle=3,Outline=2,Shadow=0,MarginV=40,Alignment=2'" \
-r 30 product-demo.mp4
+32
View File
@@ -0,0 +1,32 @@
file 's01-dashboard-top.png'
file 's01-dashboard-top.png'
file 's02-dashboard-charts.png'
file 's02-dashboard-charts.png'
file 's03-regional-overview.png'
file 's03-regional-overview.png'
file 's04-store-manager-full.png'
file 's04-store-manager-full.png'
file 's05-store-manager-top.png'
file 's05-store-manager-top.png'
file 's06-store-detail-overview.png'
file 's06-store-detail-overview.png'
file 's07-store-detail-meal-period.png'
file 's07-store-detail-meal-period.png'
file 's08-store-detail-category.png'
file 's08-store-detail-category.png'
file 's09-store-detail-cost.png'
file 's09-store-detail-cost.png'
file 's10-store-detail-member.png'
file 's10-store-detail-member.png'
file 's11-store-detail-anomaly.png'
file 's11-store-detail-anomaly.png'
file 's12-monthly-review-summary.png'
file 's12-monthly-review-summary.png'
file 's13-monthly-review-grade.png'
file 's13-monthly-review-grade.png'
file 's14-monthly-review-completion.png'
file 's14-monthly-review-completion.png'
file 's15-monthly-review-activity.png'
file 's15-monthly-review-activity.png'
file 's16-monthly-review-sku.png'
file 's16-monthly-review-sku.png'
+3
View File
@@ -0,0 +1,3 @@
scale=1920:1080:force_original_aspect_ratio=decrease
pad=1920:1080:(ow-iw)/2:(oh-ih)/2:0x0F0F0F
subtitles=subtitles.srt:force_style='FontName=Heiti SC,FontSize=22,PrimaryColour=&H00FFFFFF,OutlineColour=&H000F0F0F,BorderStyle=3,Outline=2,Shadow=0,MarginV=40,Alignment=2'
Binary file not shown.
+71
View File
@@ -0,0 +1,71 @@
1
00:00:00,000 --> 00:00:02,000
总部驾驶舱 — 全局经营总览,KPI一屏掌握
2
00:00:02,000 --> 00:00:04,000
象限散点图·瀑布图·平台成本率 — 数据深度分析
3
00:00:00,000 --> 00:00:02,000
总部驾驶舱 — 全局经营总览,KPI一屏掌握
2
00:00:02,000 --> 00:00:04,000
象限散点图·瀑布图·平台成本率 — 数据深度分析
3
00:00:04,000 --> 00:00:06,000
区域经理工作台 — 12区经营汇总,红黄绿风险分布
4
00:00:06,000 --> 00:00:08,000
店长工作台 — 经营概览·指标进度·SKU备货·任务闭环
5
00:00:08,000 --> 00:00:10,000
店长工作台 — 异常标注+指标进度条,几分钟看完就知道今天干什么
6
00:00:10,000 --> 00:00:12,000
门店详情·概览 — 菜百店全链路:KPI·日度趋势·平台经济性
7
00:00:12,000 --> 00:00:14,000
门店详情·餐段分析 — 午市/晚市/下午茶/早市客流与客单价
8
00:00:14,000 --> 00:00:16,000
门店详情·品类结构 — 销售集中度与搭售机会分析
9
00:00:16,000 --> 00:00:18,000
门店详情·成本分析 — 理论成本vs实际成本,精准定位差异
10
00:00:18,000 --> 00:00:20,000
门店详情·会员分析 — RFM分层,沉睡会员召回机会
11
00:00:20,000 --> 00:00:22,000
门店详情·异常账单 — 风险内控,自动识别与闭环处理
12
00:00:22,000 --> 00:00:24,000
月度验收·验收汇总 — 从数字化到智能化,只推可执行指令
13
00:00:24,000 --> 00:00:26,000
月度验收·升降级面板 — P0/P1/P2等级变化,复制盈利模型
14
00:00:26,000 --> 00:00:28,000
月度验收·任务完成率 — 按优先级汇总,闭环验证改善效果
15
00:00:28,000 --> 00:00:30,000
月度验收·活动清单 — 逐活动贡献毛利,停改留由数据驱动
16
00:00:30,000 --> 00:00:32,000
月度验收·SKU治理 — ABC分类,长尾精简,标准化输出