Compare commits

18 Commits

Author SHA1 Message Date
selfrelease d373fb5f0c feat: 新增智脑决策中心模块(决策中心/AI员工组织/知识资产)
- 新增 DecisionsPage、AgentsPage、KnowledgePage 三个页面
- 新增 DecisionCard、DecisionDrawer、DecisionSummary、KnowledgeCard、LoopHealthBar、AgentCard 组件
- 新增 decision-aggregator 决策聚合逻辑和 agents 数据
- Layout 导航重构:新增智脑决策分组,调整系统配置和经营本体分组
- BossPage 集成决策摘要和闭环健康度,利润机会池支持警告样式
- TasksPage 增强任务展示
- 抽屉式详情统一改为居中弹窗风格
- data.ts 后端调整
- run.md 更新数据库连接说明
- 新增玄谋智脑实际版建设方案文档

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-14 19:34:04 +08:00
selfrelease 8fd74fd78c fix: 利润机会池改为门店级计算,修复整体平均掩盖问题门店
问题:利润机会池6项中有4项返回0,总额仅15.3万
原因:用整体平均费率判断是否超标,整体已达标则机会=0,
      掩盖了个别门店严重超标的问题

修复:
1. 食材成本差异回收:改用 mv_store_theoretical_actual_cost_monthly
   (门店级理论vs实际成本),只对正差异(超耗)门店求和 × 30%
   修复前 0 → 修复后 1,898,587
2. 标准店人工优化:改为门店级,只对费率>24%的门店计算机会
   修复前 0 → 修复后 1,561,133(58家超标)
3. 标准店能源优化:改为门店级,只对费率>5%的门店计算机会
   修复前 0 → 修复后 466,609(49家超标)
4. 平台佣金优化:改为门店级,只对佣金率>20%的门店计算机会
   修复前 0 → 修复后 3,430(1家超标)
5. 高优惠门店治理和SKU复杂度压缩逻辑不变

总额:152,995 → 4,082,755(约408万)

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-13 14:45:43 +08:00
selfrelease 85b58c53b1 fix: 修复利润机会池播报文案口径错误和承诺值硬编码
问题1(口径错误):
- BusinessReportDialog 用整体贡献率(10.96%)对比标准门店贡献率目标(10%)
- 10.96%→10% 是下降不是提升,逻辑矛盾
- 移除错误的贡献率对比,与 BossPage 口径一致

问题2(承诺值硬编码):
- "30天承诺值≥150万元" 硬编码,但 totalOpportunity 仅15.3万,差10倍
- 改为动态计算:承诺值 = 理论月度机会 × 80%(考虑项目重叠和促销弹性)
- 同步修复 BossPage.tsx 中相同问题

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-13 14:31:42 +08:00
selfrelease 7ea6a2515f docs: 归档历史文档 + 新增战略外脑实施方法论
- 归档根目录散落文档到 docs/20260812/ 和 docs/20260812-1/
- 新增 16-战略外脑实施方法论.md:七项能力、十二步工作法、AI与决策治理、成熟度和验收
- 新增 17-SBrainCO战略外脑建设对照表.md:方法论映射为领域模型、产品模块、API和分阶段待办
- 新增 调查表/战略外脑能力验收Checklist.csv:35项能力验收检查项
- 更新 01-总体框架与八步工作法.md:新增战略外脑扩展章节
- 更新 README.md:新增战略外脑体系导航

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-12 22:28:51 +08:00
selfrelease a0343294b6 docs: 新增八步工作法调查表体系与指标体系示例
- 新增调查表目录,包含6个步骤的CSV调查表/Checklist:
  - 步骤一:老板访谈调查表(30条)
  - 步骤二:数据现状调查表(50条)
  - 步骤三:中层访谈调查表(50条)
  - 步骤四:逻辑闭环验证Checklist(60条)
  - 步骤七:UIUX需求调查表(60条)
  - 步骤八:闭环优化反馈表(94条)
- 新增指标体系示例.csv(50项L0/L1/L2/闭环指标定义)
- 新增指标体系详细说明.md(业务作用、数据源、行业基准、映射矩阵、树状结构)
- 更新README.md:新增文档目录树状结构和阅读建议

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-12 11:48:42 +08:00
freedakgmail 64d2cd8043 重构智脑实施方法论:引入FDE模式,八步工作法,适配中国连锁经营企业国情 2026-08-12 11:32:51 +08:00
freedakgmail c2a9e27e49 docs: 新增智脑实施方法论文档体系(7篇) + fix: 态势感知关联分析修复
文档:
- 01-项目概述与架构: 技术架构、数据流、部署拓扑
- 02-数据接入与治理: 原始数据导入、物化视图、门店名映射
- 03-指标体系与API开发: 指标分层、SQL模式、常见陷阱
- 04-前端页面开发: 组件规范、页面模板、月份参数管理
- 05-部署与运维: 部署脚本、FRP隧道、PM2、备份
- 06-调试排查手册: 问题分类、8个实际案例、工具速查
- 07-通用方法论: 核心原则、实施阶段、快速复制Checklist

修复:
- situational-awareness.ts: salary_month→salary_period, 日期格式改中文
- 客流-人力匹配: 改用attendance_records打卡数据解析在岗人数
- 客流数据除以30天对齐日均
2026-08-12 11:00:54 +08:00
freedakgmail 2c5b03e41b fix: 修复多个API因schema前缀和不存在列导致的报错
- /stores/risk: 移除不存在的列名(risk_score等),改回SELECT *
- /platform/economics: 移除不存在的列名(platform_share等),改回SELECT *
- /stores/:code: 公司均值查询中移除mv_store_risk_rating_monthly不存在的列(repeat_rate_pct等)
- /channel: mv_channel_daily在public schema,移除错误的analytics.前缀
- 重建mv_risk_anomaly物化视图:异常阈值从0.05元提高到1元
2026-08-11 22:43:18 +08:00
freedakgmail 8f5271fcc6 fix: P2/P3审计问题修复 + 更新审计文档移除已修复问题
- 修复schema前缀:确认central_kitchen/mv_distribution/mv_dish_sales等表在public schema,撤销错误的analytics.前缀
- 移除API内部物化视图刷新:mv_distribution_monthly/mv_dish_sales_monthly改为console.warn
- 修复BOM树节点key:使用path字段替代material_code+level确保唯一性
- 修复HR人才矩阵potential_score:基于v3_learning_record动态计算替代硬编码60
- 修复StoreDetailPage公司均值:优先使用API返回的companyAvg
- 修复前端字段名匹配:discount_rate_pct/check_comment等
- 添加explicit column list和LIMIT到大型查询
- 更新数据溯源审计.md:移除全部52个已修复/确认无需修复的问题条目
2026-08-11 22:00:58 +08:00
freedakgmail 915345bfd6 fix: 统一利润瀑布口径,与费用总览API一致
profit-waterfall API的received/consumption/discount/store_contribution
改为仅计算has_expense门店(FILTER WHERE has_expense)
修复前: received=6441万(94家) store_contribution=770万
修复后: received=6369万(92家) store_contribution=698万
现在瀑布图和指标卡的贡献利润/食材率/费用率/贡献率完全一致

同时创建数据溯源审计文档,覆盖全部页面的指标溯源和口径对比
2026-08-11 20:13:58 +08:00
freedakgmail 5ffde42590 fix: 修复/overview API理论毛利率和会员占比硬编码为0
- theoretical_margin_pct: 从bill_fact实时计算 sum(theoretical_profit)/sum(received)*100
- member_share_pct: 从bill_fact实时计算 会员账单实收/总实收*100
- member_bills: 统计member_id非空的账单数
- 修复前: 理论毛利率0% 会员占比0%
- 修复后: 理论毛利率61.84% 会员占比14.25%
2026-08-11 20:04:36 +08:00
freedakgmail baa49d1a94 fix: 刷新mv_overview_monthly,修复实收口径不一致
mv_overview_monthly是普通表不是物化视图,需要DELETE+INSERT更新
之前未刷新导致/overview API返回旧数据(6083万 vs bill_fact 6441万)
刷新脚本加入mv_overview_monthly更新步骤
2026-08-11 20:02:41 +08:00
freedakgmail b2cdf352db fix: 修复老板驾驶舱与总部驾驶舱实收数据源不一致
BossPage核心指标行的优惠和实收从/store-expense/overview改为/overview API
- 优惠: ex.total_discount → od.discount
- 实收总额: ex.total_received → od.received
- totalRev(风险门店占比分母)同步改为od.received
现在两个驾驶舱的营业收入/优惠/实收完全一致
2026-08-11 19:58:22 +08:00
freedakgmail 2a3805c44f fix: 修复费用总览API两个错误
1. 费用率公式反转: (1-expense/received)*100 → expense/matched_received*100
   修复前: 46.83%(实际是非费用率)→ 修复后: 53.77%(正确费用率)
2. 利润口径不一致: sum(received)含全部94家门店,但费用只含92家匹配门店
   修复: 利润和各项率指标分母改为仅匹配门店实收(matched_received)
   实际贡献利润: 7,703,472→6,982,110 贡献率: 11.96%→10.96%
2026-08-11 19:54:23 +08:00
freedakgmail a090fc7c19 fix: 修复API数据正确性问题
- 移除3个API的operating_expense IS NOT NULL过滤,改用COALESCE
  - /overview/store-profit-ranking: 93家门店全部纳入排名
  - /overview/profit-opportunity: 所有有营收门店纳入机会计算
  - /overview/profit-trend: LEFT JOIN替代INNER JOIN
- 重建v_store_operating_expense_monthly视图,去除硬编码_april视图
  - sales CTE改用mv_store_site_profile_monthly
  - food CTE改用mv_store_theoretical_actual_cost_monthly
  - 支持任意月份查询
- 修复人工优化和能源优化opportunity为负数问题
- 新增scripts/refresh_materialized_views.sh自动化刷新脚本
- 新增本体.md/API.md/原始数据级导入处理.md/物化视图更新.md/API数据检查报告.md
2026-08-11 19:25:49 +08:00
freedakgmail 3f1c291486 fix: 修复门店评估数据不一致问题
- 恢复被误删的5家门店旧账单数据(58377行)
- 合并哈马尔罕大钟寺店费用到大钟寺店(0022)
- 修改v_store_operating_expense_monthly视图按sales_store_code聚合费用
- 修复利润机会池食材成本差异为负时opportunity不为负
- 修复前端totalOpportunity只累加正数机会
- 刷新bill_fact/mv_store_risk_rating_monthly等物化视图
- 新增PromotionPage和promotion路由
2026-08-11 07:26:11 +08:00
freedakgmail 353dad24a2 feat: 添加企业智脑建设方案HTML演示和企业AI协调师培养方案HTML演示,均适配手机端 2026-08-09 11:42:23 +08:00
freedakgmail d04e837d9c V3.0: 门店分级与风险等级页面、数据填充脚本、后端API
- 新增V3.0数据库表结构(12-15)和数据填充脚本(16)
- 新增后端路由: store-grade, enterprise, product, intelligence, alert, scheduler, target
- 新增前端页面: StoreGradePage, EnterprisePage, ProductLifecyclePage, IntelligencePage, AlertManagementPage, DataImportPage, SchedulerManagementPage, TargetManagementPage
- 门店分级: 自动分级算法(达成率40%+毛利率25%+会员15%+风险20%)
- 风险等级: 基于mv_store_risk_rating模型展示风险分布和原因
- 弹窗: 雷达图+详细指标+分级原因+风险原因(primary_issue)
- FilterableTable: filterOptions支持{value,label}对象格式
2026-08-05 20:09:39 +08:00
142 changed files with 27926 additions and 649 deletions
-325
View File
@@ -1,325 +0,0 @@
# V3.0 系统闭环版 — 完整任务清单
> **基准文档**`V3.0系统实现路径.md` + `V3.0数据支撑度分析.md`
> **当前系统版本**:v0.1.0(已封版,线上运行)
> **目标版本**:v3.0(系统闭环版)
> **编制日期**2026-08-05
> **整体实现度**:当前 29% → 目标 82%
---
## Phase 1:基础闭环(3-6个月)
> **目标**:建立目标管理 + 定时调度 + 预警引擎 + 数据自动采集
> **预期实现度**29% → 49%
### 1.1 目标管理系统(目标闭环基石)
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-101 | 新建 `v3_annual_target` 表:年度战略目标(营收/利润/门店数/会员数) | DB | P1 | 中 | 无 | 表创建+CRUD API |
| T-102 | 新建 `v3_regional_target` 表:区域年度目标(按区域拆解) | DB | P1 | 中 | T-101 | 表创建+CRUD API |
| T-103 | 新建 `v3_store_monthly_target` 表:门店月度目标(营收/客单/会员/成本/利润) | DB | P1 | 中 | T-102 | 表创建+CRUD API,兼容现有 `dim_store_target` |
| T-104 | 新建 `v3_daily_target` 表:日级目标(营收/客单/套餐/损耗/到货) | DB | P1 | 中 | T-103 | 表创建+CRUD API |
| T-105 | 新建 `v3_personal_task` 表:个人任务(岗位/目标值/实际值/完成率) | DB | P1 | 中 | T-104 | 表创建+CRUD API |
| T-106 | 目标自动拆解算法:年度→区域→门店(按A/B/C/D分级差异化:A店110%、B店100%、C店90%、D店整改) | 后端 | P1 | 大 | T-102,T-103 | 输入年度目标→自动生成91家店月度目标 |
| T-107 | 日目标拆解算法:月度→日(按历史客流权重分配到每日) | 后端 | P1 | 中 | T-104,T-106 | 输入月度目标→自动生成30天日目标 |
| T-108 | 时段目标拆解:日→时段(按高峰/平峰/低谷模型,复用 `smart-scheduling.ts` 客流热力图) | 后端 | P2 | 中 | T-107 | 输入日目标→自动生成时段目标 |
| T-109 | 目标管理API路由 `server/src/routes/target.ts` | 后端 | P1 | 中 | T-101~105 | REST APICRUD + 拆解 + 达成率计算 |
| T-110 | 目标管理前端页面 `client/src/pages/v3/TargetManagementPage.tsx` | 前端 | P1 | 中 | T-109 | 年度目标设定→区域拆解→门店查看→日目标卡 |
| T-111 | 店长端日目标卡组件:每日09:00自动生成(营收/客单/套餐/损耗/到货) | 前端 | P1 | 中 | T-107,T-109 | 店长登录即见今日目标卡 |
| T-112 | 目标偏差分析报告:月末自动比对达成率+归因(客流/客单/成本/损耗) | 后端 | P1 | 大 | T-106 | 月末自动生成偏差报告 |
| T-113 | 强制锁定机制:达成率<90%的门店,下月预算锁定+必须填写《根因分析》并审批 | 后端 | P2 | 中 | T-112 | 锁定逻辑+审批入口 |
| T-114 | 连续3个月未达成→自动触发"D级预警"推送至决策层 | 后端 | P2 | 小 | T-112,T-201 | 预警规则+推送 |
### 1.2 定时调度引擎(时间驱动基石)
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-120 | 引入 `node-cron` 定时任务调度器,新建 `server/src/scheduler/` 目录 | 后端 | P1 | 小 | 无 | 调度器启动+日志 |
| T-121 | 调度任务注册表 `v3_scheduled_task`:任务名/cron表达式/状态/上次执行/下次执行 | DB | P1 | 小 | 无 | 表创建+管理API |
| T-122 | 每日08:30 自动生成昨日日报(SQL聚合+模板渲染+推送至店长) | 后端 | P1 | 中 | T-120 | 日报自动生成+可查看 |
| T-123 | 每日09:00 自动生成日目标卡(依赖目标拆解) | 后端 | P1 | 中 | T-107,T-120 | 目标卡自动生成 |
| T-124 | 每日12:00/18:00 推送时段达成率(依赖实时数据) | 后端 | P2 | 中 | T-120 | 时段推送消息 |
| T-125 | 每日22:30 生成日复盘模板(达成率/偏差/次日建议) | 后端 | P2 | 中 | T-120 | 复盘模板自动生成 |
| T-126 | 每周一09:00 生成上周数据包(复用 `analytics-enhanced.ts` | 后端 | P2 | 中 | T-120 | 周报自动生成 |
| T-127 | 每月1日09:00 自动生成月度经营分析报告(损益/对标/根因/建议) | 后端 | P2 | 大 | T-120 | 月报自动生成 |
| T-128 | 每月15日14:00 生成月中进度报告 | 后端 | P3 | 中 | T-120 | 月中报告自动生成 |
| T-129 | 调度管理前端页面:查看/启停/手动触发调度任务 | 前端 | P2 | 小 | T-121 | 调度任务管理界面 |
### 1.3 预警规则引擎(事件驱动基石)
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-130 | 新建 `v3_alert_rule` 表:规则名/指标/阈值/比较符/推送对象/升级路径/启用状态 | DB | P1 | 中 | 无 | 表创建+CRUD API |
| T-131 | 新建 `v3_alert_log` 表:触发时间/规则ID/指标值/阈值/推送状态/处理状态 | DB | P1 | 小 | 无 | 表创建+查询API |
| T-132 | 预警规则引擎核心:定时扫描指标→匹配规则→生成预警记录 | 后端 | P1 | 大 | T-130,T-131 | 规则匹配+预警生成 |
| T-133 | 营收达成率预警:每小时比对日目标→红/黄灯→推送 | 后端 | P1 | 中 | T-107,T-132 | 达成率<80%自动红灯预警 |
| T-134 | 差评自动归因预警:对接外卖平台评价API+NLP分类(口味/服务/环境/异物) | 后端 | P1 | 大 | T-132 | 差评出现→自动归因+推送 |
| T-135 | 临期品预警:库存系统实时计算临期比例→推送促销建议 | 后端 | P2 | 中 | T-132 | 临期>10%自动预警 |
| T-136 | 供应商到货准时率预警:物流GPS+温控实时监控 | 后端 | P2 | 中 | T-132 | 准时率<95%黄灯预警 |
| T-137 | 员工离职率预警:HR系统月度聚合→红灯→推送 | 后端 | P2 | 中 | T-132 | 离职率>15%红灯预警 |
| T-138 | 食安巡检预警:巡检<90分→红灯→推送+停业建议 | 后端 | P2 | 中 | T-132 | 巡检低分自动预警 |
| T-139 | 新品好评率预警:好评率<70%→推送产品中心→配方复核 | 后端 | P2 | 中 | T-132 | 新品差评自动预警 |
| T-140 | 设备故障预警:IoT设备监控→故障>2小时→自动派单维修 | 后端 | P3 | 中 | T-132 | 设备故障自动派单 |
| T-141 | 库存缺货预警:实时库存比对→推送缺货预警→生成调拨建议 | 后端 | P3 | 中 | T-132 | 缺货自动预警+调拨建议 |
| T-142 | 预警管理前端页面:规则配置/预警列表/处理状态 | 前端 | P1 | 中 | T-130,T-131 | 预警规则管理+预警处理界面 |
| T-143 | 纠偏任务自动入池:预警触发后自动生成纠偏任务,关联原任务 | 后端 | P2 | 中 | T-132 | 预警→自动生成任务 |
### 1.4 数据自动采集管道
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-150 | 建立定时ETL管道:cron job定期执行物化视图刷新+数据导入 | 后端 | P1 | 中 | T-120 | 物化视图自动刷新 |
| T-151 | POS数据实时导入管道(API对接或定时ETL,替代手工导入) | 后端 | P1 | 大 | 需POS系统配合 | POS数据T+1自动入库 |
| T-152 | 外卖平台数据导入:美团/饿了么/京东订单+评价+退款实时同步 | 后端 | P1 | 大 | 需平台API | 外卖数据自动同步 |
| T-153 | 数据清洗规则引擎:自动标记异常数据(金额异常/时间异常/缺失字段/温度异常) | 后端 | P1 | 中 | T-150 | 异常数据自动标记 |
| T-154 | 每日库存快照:从现有WMS定时拉取库存数据→写入 `fact_inventory_snapshot` | 后端 | P1 | 中 | T-150 | 每日库存快照自动入库 |
| T-155 | 费用数据月度导入:自动拉取财务系统费用数据 | 后端 | P2 | 中 | T-150 | 费用数据月度自动入库 |
| T-156 | 薪资数据月度导入:自动拉取HR系统薪资数据 | 后端 | P2 | 中 | T-150 | 薪资数据月度自动入库 |
| T-157 | 数据导入管理前端页面:导入状态/日志/手动触发/异常处理 | 前端 | P1 | 中 | T-150 | 导入监控界面 |
### 1.5 门店自动分级与红黄绿灯
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-160 | 门店自动分级算法:按营收达成+巡检得分+客诉率自动A/B/C/D分级 | 后端 | P1 | 中 | T-132 | 91家店自动分级+月度更新 |
| T-161 | 红黄绿灯自动标色:实时指标监控→自动标色→推送 | 后端 | P1 | 中 | T-132 | 指标突破阈值→自动标色+推送 |
| T-162 | 辅导任务派发:C/D级门店自动生成辅导任务→指派区域经理 | 后端 | P2 | 中 | T-160 | C/D店自动生成辅导任务 |
| T-163 | 门店分级前端展示:在 `RegionalPage` 增加分级视图 | 前端 | P1 | 小 | T-160 | 区域管理页显示A/B/C/D分级 |
### 1.6 产品生命周期与评价归因
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-170 | 新建 `v3_product_lifecycle` 表:SKU上市日期/生命周期阶段(爬坡/成熟/衰退)/存活判定 | DB | P1 | 小 | 无 | 表创建+CRUD API |
| T-171 | 顾客评价数据表 `v3_customer_review`:评价来源/评分/内容/分类/门店/SKU | DB | P1 | 小 | 无 | 表创建+CRUD API |
| T-172 | 评价NLP归因:对接外卖平台评价API+NLP自动分类(口味/服务/环境/异物/分量) | 后端 | P1 | 大 | T-171 | 评价自动分类+归因 |
| T-173 | 产品生命周期自动追踪:上市第7天自动生成"首周战报"、第90天生成"存活判定报告" | 后端 | P2 | 中 | T-170 | 7天战报+90天判定自动生成 |
| T-174 | 评价分析前端页面:好评率/差评归因/趋势/门店对比 | 前端 | P1 | 中 | T-172 | 评价分析看板 |
| T-175 | 产品生命周期前端页面:生命周期阶段/存活率/淘汰建议 | 前端 | P2 | 中 | T-170 | 生命周期看板 |
### 1.7 角色体系扩展
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-180 | 扩展角色枚举:新增 `supply`(供应链)、`product`(产品)、`marketing`(营销)、`hr`(HR)职能角色 | 后端 | P1 | 中 | 无 | 角色体系扩展+权限定义 |
| T-181 | 职能数据隔离:按角色限制可见的API路由和数据字段 | 后端 | P1 | 中 | T-180 | 供应链经理不可见门店利润等 |
| T-182 | 员工级角色:新增 `employee` 角色,仅可见个人绩效看板 | 后端 | P2 | 中 | T-180 | 员工登录仅见个人数据 |
| T-183 | 字段级权限控制:API响应按角色过滤敏感字段(如采购价格对非供应链角色隐藏) | 后端 | P2 | 大 | T-180 | 敏感字段自动过滤 |
### 1.8 看板嵌入"一键下达任务"
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-190 | `SituationalAwarenessPage` 健康度评分异常项旁添加"生成整改任务"按钮 | 前端 | P1 | 小 | 无 | 点击→自动生成整改任务 |
| T-191 | 整改任务自动填充:门店/指标/偏差值/建议措施/截止日期 | 后端 | P1 | 小 | T-190 | 任务自动填充关键字段 |
### 1.9 自动复盘报告
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-195 | 月度经营分析报告自动生成:损益/对标/根因/建议(复用 `MonthlyReviewPage` 逻辑) | 后端 | P1 | 中 | T-127 | 月末自动生成报告 |
| T-196 | 报告前端展示页面:可查看历史报告+导出PDF | 前端 | P1 | 中 | T-195 | 报告列表+详情+导出 |
---
## Phase 2:协同扩展(6-12个月)
> **目标**:建立协同闭环 + 审批流 + LMS + 营销自动化
> **预期实现度**49% → 67%
### 2.1 供应链SRM
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-201 | 新建 `v3_supplier_master` 表:供应商主数据+分级(战略/优选/合格/淘汰) | DB | P2 | 中 | 无 | 表创建+CRUD API |
| T-202 | 供应商评分卡:交货准时率/质量/价格/服务/食安五维度自动评分 | 后端 | P2 | 中 | T-201 | 198家供应商自动评分 |
| T-203 | 采购订单管理:下单→审批→执行→到货→结算 | 后端 | P2 | 大 | T-201 | 采购订单全流程 |
| T-204 | 比价议价:招标/比价/锁价/季节性备货 | 后端 | P2 | 大 | T-203 | 比价功能 |
| T-205 | 备选供应商管理:每品类至少1家备选 | 后端 | P3 | 中 | T-201 | 备选供应商关联 |
| T-206 | 供应商管理前端页面:评分卡/采购订单/比价 | 前端 | P2 | 大 | T-201~204 | SRM管理界面 |
### 2.2 中央厨房MES增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-210 | 生产排程算法:基于门店销量预测+配方BOM自动计算排产计划 | 后端 | P2 | 大 | 销量预测 | 输入销量预测→自动排产 |
| T-211 | 工艺监控:关键参数自动记录(温度/时间/重量) | 后端 | P2 | 中 | IoT | 工艺参数自动记录 |
| T-212 | 出品管理:批次管理+出品抽检+盲测记录 | 后端 | P2 | 中 | 无 | 批次追溯+抽检记录 |
| T-213 | 食安留样管理:留样记录+检测报告+第三方检测 | 后端 | P2 | 中 | 无 | 留样记录可查 |
| T-214 | 产能规划:淡旺季弹性+预留扩产空间+外包备选 | 后端 | P3 | 中 | 历史产能 | 产能规划建议 |
### 2.3 通用审批流引擎
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-220 | 新建 `v3_approval_request` 表:申请类型/申请人/状态/当前步骤 | DB | P2 | 中 | 无 | 表创建+CRUD API |
| T-221 | 新建 `v3_approval_step` 表:步骤序号/审批人/审批结果/审批意见/时间 | DB | P2 | 中 | T-220 | 表创建+CRUD API |
| T-222 | 新建 `v3_approval_rule` 表:申请类型/步骤定义/超额升级条件 | DB | P2 | 中 | T-220 | 表创建+CRUD API |
| T-223 | 通用审批流引擎:支持多级审批+超额升级+通知推送 | 后端 | P2 | 大 | T-220~222 | 审批流可配置+自动流转 |
| T-224 | 门店调薪审批:店长申请→区域经理审批→超额升级总部HR | 后端 | P3 | 中 | T-223 | 调薪审批全流程 |
| T-225 | 门店临时采购审批:店长申请→区域经理审批→超额升级供应链总监 | 后端 | P3 | 中 | T-223 | 采购审批全流程 |
| T-226 | 促销活动审批:店长申请→区域经理审批→超额升级营销总监 | 后端 | P3 | 中 | T-223 | 促销审批全流程 |
| T-227 | 员工晋升审批:店长申请→区域经理+HR审批→晋升店长升级总部 | 后端 | P3 | 中 | T-223 | 晋升审批全流程 |
| T-228 | 配方微调审批:产品经理申请→产品总监审批→成本变动>5%升级CEO | 后端 | P3 | 中 | T-223 | 配方审批全流程 |
| T-229 | 供应商汰换审批:供应链经理申请→供应链总监审批→战略供应商升级CEO | 后端 | P3 | 中 | T-223 | 供应商审批全流程 |
| T-230 | 门店关停审批:区域经理申请→运营总监+财务总监审批→连续亏损升级董事会 | 后端 | P3 | 中 | T-223 | 关停审批全流程 |
| T-231 | 审批流前端页面:待办列表/审批操作/流程跟踪 | 前端 | P2 | 中 | T-223 | 审批待办+流程可视化 |
### 2.4 消息推送引擎
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-240 | WebSocket实时推送服务 `server/src/push/` | 后端 | P2 | 中 | 无 | WebSocket连接+消息推送 |
| T-241 | 站内消息中心:`v3_notification` 表+未读/已读/已处理状态 | DB+后端 | P2 | 中 | 无 | 消息列表+状态管理 |
| T-242 | 消息推送规则:预警/任务/报告/审批→对应责任人 | 后端 | P2 | 中 | T-240,T-241 | 消息按规则自动推送 |
| T-243 | 前端消息中心组件:Header通知图标+未读计数+消息列表 | 前端 | P2 | 中 | T-241 | 通知图标+消息列表 |
### 2.5 HR系统增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-250 | 考勤管理增强:打卡记录+工时统计+排班匹配(复用 `attendance_records` | 后端 | P2 | 中 | 无 | 工时自动统计 |
| T-251 | 薪酬管理:基本工资+绩效奖金+调薪审批(复用 `salary_detail_records` | 后端 | P2 | 中 | T-223 | 薪酬计算+调薪审批 |
| T-252 | 人才九宫格:绩效×潜力→自动推荐晋升名单 | 后端 | P2 | 中 | 无 | 九宫格矩阵+晋升推荐 |
| T-253 | 离职预警:月度聚合离职率→红灯→推送(复用 `dim_employee` | 后端 | P2 | 中 | T-132 | 离职率>15%自动预警 |
| T-254 | 招聘管理:岗位需求+候选人+面试流程 | 后端 | P3 | 大 | 无 | 招聘全流程 |
| T-255 | 人才九宫格前端页面:矩阵展示+晋升推荐列表 | 前端 | P2 | 中 | T-252 | 九宫格可视化 |
### 2.6 培训LMS
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-260 | 新建 `v3_training_course` 表:课程管理+课件+考试 | DB | P2 | 中 | 无 | 表创建+CRUD API |
| T-261 | 新建 `v3_learning_record` 表:员工学习进度+完成率+考试成绩 | DB | P2 | 中 | T-260 | 表创建+CRUD API |
| T-262 | 学习追踪:员工学习进度+完成率+考试成绩 | 后端 | P2 | 中 | T-261 | 学习进度可查 |
| T-263 | SOP更新自动转培训:新SOP→自动生成培训课件→推送 | 后端 | P3 | 中 | T-260 | SOP变更→自动生成课件 |
| T-264 | 培训锁定机制:未完成培训→锁定排班权限 | 后端 | P3 | 中 | T-262 | 未培训→排班锁定 |
| T-265 | LMS前端页面:课程列表/学习进度/考试 | 前端 | P2 | 大 | T-260~262 | LMS学习界面 |
### 2.7 营销MA
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-270 | 活动管理:活动创建+预算分配+投放指令+ROI追踪 | 后端 | P2 | 大 | 无 | 活动全流程管理 |
| T-271 | 券码发放:券码生成+核销追踪+防刷机制 | 后端 | P2 | 中 | T-270 | 券码全生命周期 |
| T-272 | 会员运营增强:分层运营+召回策略+生命周期管理(复用 `dim_member` | 后端 | P2 | 中 | 无 | 会员分层+召回 |
| T-273 | 营销自动化:触发条件→自动执行(如:沉睡会员自动发券) | 后端 | P3 | 大 | T-270 | 自动化规则引擎 |
| T-274 | 营销MA前端页面:活动管理/券码/ROI分析 | 前端 | P2 | 大 | T-270 | MA管理界面 |
### 2.8 财务ERP增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-280 | 预算管理:年度预算+月度预算+执行率追踪 | 后端 | P2 | 中 | T-106 | 预算全流程 |
| T-281 | 成本核算增强:按门店/品类/菜品的多维度成本分析(复用 `cost-analysis.ts` | 后端 | P2 | 中 | 无 | 多维成本分析 |
| T-282 | 资金管控:现金流+账期管理+资金计划 | 后端 | P3 | 大 | 银行对接 | 资金看板 |
| T-283 | 财务报表:损益表+现金流量表+资产负债表 | 后端 | P3 | 大 | 全部业务数据 | 三大报表自动生成 |
### 2.9 扫码确认闭环
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-290 | 出品扫码:扫码枪→出品记录→数据自动回传→任务状态更新 | 后端 | P2 | 中 | 扫码硬件 | 出品扫码闭环 |
| T-291 | 验收扫码:验收扫码→数据自动回传→验收确认 | 后端 | P2 | 中 | 扫码硬件 | 验收扫码闭环 |
| T-292 | 巡检扫码:巡检扫码→数据自动回传→巡检记录 | 后端 | P2 | 中 | 扫码硬件 | 巡检扫码闭环 |
### 2.10 闭环自动验证
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-295 | 闭环自动验证:系统定时检测指标变化→自动判定"闭环完成"或"需升级" | 后端 | P2 | 中 | T-132 | 闭环状态自动判定 |
| T-296 | 闭环健康度看板:各闭环完成率/平均周期/瓶颈环节 | 前端 | P2 | 中 | T-295 | 闭环健康度可视化 |
### 2.11 权限与安全增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-300 | 系统级数据脱敏:API响应层对PII数据(手机/身份证/邮箱)自动脱敏 | 后端 | P2 | 中 | 无 | PII字段自动脱敏 |
| T-301 | 匿名排名机制:平级门店排名显示为"TOP10%"而非具体名次 | 后端 | P2 | 小 | 无 | 排名匿名化 |
| T-302 | 审计日志:`v3_audit_log` 表,所有数据访问记录(who/what/when | DB+后端 | P2 | 中 | 无 | 审计日志可查 |
| T-303 | 案例库NLP标签:对 `standardized_practice` 表的 `key_actions` 自动提取标签 | 后端 | P2 | 中 | NLP | 案例自动标签 |
| T-304 | 变更管理流程:SOP更新申请→审批→下发→确认 | 后端 | P2 | 中 | T-223 | SOP变更全流程 |
---
## Phase 3:智能升级(12-24个月)
> **目标**:IoT接入 + AI辅助决策 + 全链路自动流转
> **预期实现度**67% → 82%
### 3.1 IoT与硬件接入
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-310 | IoT温控探针对接:MQTT协议接入冷链温度数据 | 后端 | P3 | 大 | IoT硬件 | 温度数据实时入库 |
| T-311 | 扫码枪/电子秤对接:蓝牙/WiFi接入出品扫码、验收扫码 | 后端 | P3 | 大 | 扫码硬件 | 扫码数据实时入库 |
| T-312 | 人脸识别考勤对接:API接入考勤/排班匹配/工时统计 | 后端 | P3 | 中 | 人脸硬件 | 考勤数据自动入库 |
| T-313 | IoT设备监控看板:温度/湿度/设备状态实时展示 | 前端 | P3 | 中 | T-310 | IoT实时看板 |
### 3.2 AI辅助决策
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-320 | AI辅助目标测算:多因子模型(天气/节假日/商圈活动)自动调整日目标 | 后端 | P3 | 大 | 外部数据源 | 日目标AI自动调整 |
| T-321 | 趋势预测算法:基于历史数据的线性回归/ARIMA | 后端 | P3 | 大 | 6个月+数据 | 营收/客流趋势预测 |
| T-322 | 销量预测模型:移动平均/指数平滑 | 后端 | P3 | 大 | 6个月+数据 | 门店销量预测 |
| T-323 | 季度战略复盘数据包自动生成+投资建议AI测算 | 后端 | P3 | 大 | T-321 | 季度报告+投资建议 |
### 3.3 全链路自动流转
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-330 | 产销协同全链路:销量预测→MRP→采购→到货→验收→数据回传 | 后端 | P3 | 大 | T-210,T-322 | 产销全链路自动流转 |
| T-331 | 营采协同全链路:营销方案→物料需求计算→供应链备货→门店执行→ROI追踪 | 后端 | P3 | 大 | T-270 | 营采全链路自动流转 |
| T-332 | 产品全生命周期:产品上架→SOP推送→排产→配送→门店收货→销售→评价→产品决策 | 后端 | P3 | 大 | T-170,T-172 | 产品全链路自动流转 |
### 3.4 实时数据流
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-340 | 实时数据流:从T+1升级为T+0实时看板(WebSocket推送) | 后端 | P3 | 大 | T-240 | 5分钟刷新实时看板 |
| T-341 | 门店实时看板:当日营收进度/来客数/客单价/等位数/出餐时效 | 前端 | P3 | 中 | T-340 | 门店实时看板5分钟刷新 |
### 3.5 战略驾驶舱增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-350 | 投资回报模型:单店ROI计算+投资回收期+城市渗透率 | 后端 | P3 | 中 | 无 | ROI自动计算 |
| T-351 | 季度战略看板:同店增长趋势+行业对标+资本环境 | 前端 | P3 | 中 | 外部数据 | 季度战略看板 |
| T-352 | 品牌资产追踪:NPS+品牌搜索指数+舆情健康度 | 后端 | P3 | 中 | 舆情监控 | 品牌资产看板 |
### 3.6 培训锁定与资金管控
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-360 | 培训锁定机制:未完成培训的员工自动锁定排班权限 | 后端 | P3 | 中 | T-264 | 排班锁定生效 |
| T-361 | 资金管控:现金流+账期管理+资金计划+银行对接 | 后端 | P3 | 大 | 银行API | 资金管控看板 |
---
## 任务统计总览
| 阶段 | 任务数 | DB | 后端 | 前端 | 大 | 中 | 小 |
|:---|---:|---:|---:|---:|---:|---:|---:|
| **Phase 1** | 57 | 12 | 30 | 15 | 8 | 35 | 14 |
| **Phase 2** | 42 | 6 | 26 | 10 | 12 | 25 | 5 |
| **Phase 3** | 16 | 0 | 11 | 5 | 11 | 5 | 0 |
| **合计** | **115** | **18** | **67** | **30** | **31** | **65** | **19** |
## 优先启动建议
**立即启动(第1-2周)**
1. T-120 引入 `node-cron` 调度器 — 最小投入,最大基础设施价值
2. T-101~105 目标管理表族 — 闭环体系的起点
3. T-130~132 预警规则引擎核心 — 让系统开始"主动发现问题"
**第3-4周**
4. T-106~107 目标拆解算法 — 让目标"落下去"
5. T-150~151 数据导入管道 — 让数据"流起来"
6. T-160~161 门店自动分级+红黄绿灯 — 让系统"自动区分优先级"
---
> **文档结语**:本任务清单共115项任务,覆盖V3.0全部5个闭环、3条主线、5层架构。建议按Phase顺序推进,每个Phase内按优先级排序。Phase 1完成后系统将从"被动看板"升级为"目标驱动+预警主动"的运营系统,实现质的跃升。
+24
View File
@@ -24,6 +24,9 @@ import { SiteSelectionPage } from '@/pages/SiteSelectionPage'
import { SmartSchedulingPage } from '@/pages/SmartSchedulingPage'
import { SituationalAwarenessPage } from '@/pages/SituationalAwarenessPage'
import { BossPage } from '@/pages/BossPage'
import { DecisionsPage } from '@/pages/DecisionsPage'
import { AgentsPage } from '@/pages/AgentsPage'
import { KnowledgePage } from '@/pages/KnowledgePage'
import { RevenuePage } from '@/pages/RevenuePage'
import { BankPage } from '@/pages/BankPage'
import { CentralKitchenPage } from '@/pages/CentralKitchenPage'
@@ -38,6 +41,15 @@ import { EmployeePerformancePage } from '@/pages/EmployeePerformancePage'
import { InventoryTurnoverPage } from '@/pages/InventoryTurnoverPage'
import { TenantManagementPage } from './pages/TenantManagementPage'
import { TenantUsersPage } from './pages/TenantUsersPage'
import { TargetManagementPage } from './pages/TargetManagementPage'
import { AlertManagementPage } from './pages/AlertManagementPage'
import { SchedulerManagementPage } from './pages/SchedulerManagementPage'
import { StoreGradePage } from './pages/StoreGradePage'
import { ProductLifecyclePage } from './pages/ProductLifecyclePage'
import { DataImportPage } from './pages/DataImportPage'
import { EnterprisePage } from './pages/EnterprisePage'
import { IntelligencePage } from './pages/IntelligencePage'
import { PromotionPage } from './pages/PromotionPage'
import { RoleRoute } from './components/RoleRoute'
const queryClient = new QueryClient({
@@ -83,6 +95,9 @@ export default function App() {
<Routes>
<Route path="/" element={user?.role === 'platform_admin' ? <Navigate to="/tenant-management" /> : user?.role === 'store' ? <Navigate to="/store" /> : user?.role === 'regional' ? <Navigate to="/regional" /> : <DashboardPage />} />
<Route path="/boss" element={<RoleRoute roles={['hq','dept']}><BossPage /></RoleRoute>} />
<Route path="/decisions" element={<RoleRoute roles={['hq','dept']}><DecisionsPage /></RoleRoute>} />
<Route path="/agents" element={<RoleRoute roles={['hq','dept']}><AgentsPage /></RoleRoute>} />
<Route path="/knowledge" element={<RoleRoute roles={['hq','dept']}><KnowledgePage /></RoleRoute>} />
<Route path="/revenue" element={<RoleRoute roles={['hq','dept']}><RevenuePage /></RoleRoute>} />
<Route path="/bank" element={<RoleRoute roles={['hq']}><BankPage /></RoleRoute>} />
<Route path="/central-kitchen" element={<RoleRoute roles={['hq','dept']}><CentralKitchenPage /></RoleRoute>} />
@@ -117,6 +132,15 @@ export default function App() {
<Route path="/inventory-turnover" element={<RoleRoute roles={['hq','dept']}><InventoryTurnoverPage /></RoleRoute>} />
<Route path="/tenant-management" element={<RoleRoute roles={['platform_admin']}><TenantManagementPage /></RoleRoute>} />
<Route path="/tenant-users" element={<RoleRoute roles={['hq']}><TenantUsersPage /></RoleRoute>} />
<Route path="/target" element={<RoleRoute roles={['hq','dept','regional']}><TargetManagementPage /></RoleRoute>} />
<Route path="/alert" element={<RoleRoute roles={['hq','dept','regional','store']}><AlertManagementPage /></RoleRoute>} />
<Route path="/scheduler" element={<RoleRoute roles={['hq']}><SchedulerManagementPage /></RoleRoute>} />
<Route path="/store-grade" element={<RoleRoute roles={['hq','dept','regional']}><StoreGradePage /></RoleRoute>} />
<Route path="/product-lifecycle" element={<RoleRoute roles={['hq','dept']}><ProductLifecyclePage /></RoleRoute>} />
<Route path="/data-import" element={<RoleRoute roles={['hq','dept']}><DataImportPage /></RoleRoute>} />
<Route path="/enterprise" element={<RoleRoute roles={['hq','dept']}><EnterprisePage /></RoleRoute>} />
<Route path="/intelligence" element={<RoleRoute roles={['hq','dept']}><IntelligencePage /></RoleRoute>} />
<Route path="/promotion" element={<RoleRoute roles={['hq','dept']}><PromotionPage /></RoleRoute>} />
<Route path="*" element={<Navigate to="/" />} />
</Routes>
</Layout>
+74
View File
@@ -0,0 +1,74 @@
/**
* AI 员工卡片组件
*
* 展示单个 AI 员工的岗位、职责、自治等级和今日交付数。
*/
import { Bot } from 'lucide-react'
import { cn } from '@/lib/utils'
import type { AgentConfig } from '@/data/agents'
interface AgentCardProps {
agent: AgentConfig
/** 今日交付数(null 表示加载中) */
deliveries: number | null
onClick?: () => void
}
/** 自治等级颜色 */
const AUTONOMY_COLORS: Record<string, string> = {
L1: 'bg-red-50 text-red-600 border border-red-200',
L2: 'bg-amber-50 text-amber-600 border border-amber-200',
L3: 'bg-green-50 text-green-600 border border-green-200',
}
/** 状态指示灯颜色 */
const STATUS_DOT: Record<string, string> = {
'运行中': 'bg-green-500',
'待审批': 'bg-amber-500',
'受控': 'bg-blue-500',
}
export function AgentCard({ agent, deliveries, onClick }: AgentCardProps) {
return (
<div
className={cn(
'rounded-lg border bg-card p-4 transition-shadow hover:shadow-sm',
onClick && 'cursor-pointer',
)}
onClick={onClick}
>
{/* 头部:图标 + 状态灯 */}
<div className="mb-2 flex items-start justify-between">
<div className="flex h-10 w-10 items-center justify-center rounded-lg bg-blue-50">
<Bot className="h-5 w-5 text-blue-600" />
</div>
<span
className={cn(
'mt-1 h-2 w-2 rounded-full',
STATUS_DOT[agent.status] || 'bg-gray-400',
)}
title={agent.status}
/>
</div>
{/* 名称 + 领域 */}
<small className="text-[10px] text-muted-foreground">{agent.domain}</small>
<h3 className="text-sm font-bold">{agent.name}</h3>
<p className="mt-1 text-xs text-muted-foreground">{agent.roleTarget}</p>
{/* 底部:自治等级 + 交付数 */}
<footer className="mt-3 flex items-center justify-between border-t pt-2">
<span className={cn('rounded px-1.5 py-0.5 text-[10px] font-medium', AUTONOMY_COLORS[agent.autonomyLevel])}>
{agent.autonomyLevel}
</span>
<span className="text-xs text-muted-foreground">
{deliveries === null ? (
<span className="text-muted-foreground"></span>
) : (
<><b className="text-foreground">{deliveries}</b> </>
)}
</span>
</footer>
</div>
)
}
@@ -50,13 +50,16 @@ export function BusinessReportDialog({ open, onClose, data }: BusinessReportDial
const expenseRate = wf ? (Number(wf.total_expense) / Number(wf.received) * 100) : 0
const contributionRate = wf ? (Number(wf.store_contribution) / Number(wf.received) * 100) : 0
// 30天承诺值:取理论月度机会的80%(考虑项目重叠和促销弹性),不低于0
const commitValue = Math.max(Math.round(totalOpp * 0.8), 0)
const otherStores = (ex?.total_stores || 0) - (ex?.profitable_stores || 0) - (ex?.loss_stores || 0)
const reportText = `本月经营态势报告,${data.month}月。
一、整体经营。营业收入${formatCurrency(ex?.total_consumption)},优惠${formatCurrency(ex?.total_discount)},实收总额${formatCurrency(ex?.total_received)},环比上周${data.trendReceived > 0 ? '增长' : '下降'}${Math.abs(data.trendReceived)}%。门店共${ex?.total_stores}家,其中盈利${ex?.profitable_stores}家,亏损${ex?.loss_stores}${otherStores > 0 ? `,待确认${otherStores}` : ''}。客单价${formatCurrency(ex?.avg_bill_value)},账单${ex?.total_bills}笔。门店贡献利润${formatCurrency(ex?.actual_net_profit)},贡献率${formatPercent(profitMargin)}
二、成本费用。食材成本率${formatPercent(foodCostRate)},建议低于32%。费用率${formatPercent(expenseRate)},建议低于40%。贡献率${formatPercent(contributionRate)},建议高于10%。食材成本超耗严重${costOv.red_count || 0}家,明显超耗${costOv.orange_count || 0}家,基本正常${costOv.green_count || 0}家,总差异金额${formatCurrency(costOv.total_variance)}
三、风险态势。红色门店${riskSummary['红色'] || 0}家,黄色门店${riskSummary['黄色'] || 0}家,绿色门店${riskSummary['绿色'] || 0}家。重点整改门店P0级${p0Stores.length}家,P1级${p1Stores.length}家。
四、利润机会。理论月度机会合计${formatCurrency(totalOpp)},涉及${profitOpp.length}个改善方向。30天承诺值大于等于150万元,目标将门店贡献率从${formatPercent(profitMargin)}提升至约10%`
四、利润机会。理论月度机会合计${formatCurrency(totalOpp)},涉及${profitOpp.length}个改善方向。考虑项目重叠和促销弹性,30天经营承诺值大于等于${formatCurrency(commitValue)}`
const handleTTS = async () => {
if (isPlaying) {
@@ -223,7 +226,7 @@ export function BusinessReportDialog({ open, onClose, data }: BusinessReportDial
<section>
<h3 className="mb-1 text-sm font-bold text-purple-700"></h3>
<p className="text-xs leading-relaxed">
<strong className="text-purple-600">{formatCurrency(totalOpp)}</strong> <strong>{profitOpp.length}</strong> 30 <strong className="text-purple-600"> 150 </strong> <strong>{formatPercent(profitMargin)}</strong> <strong>10%</strong>
<strong className="text-purple-600">{formatCurrency(totalOpp)}</strong> <strong>{profitOpp.length}</strong> 30 <strong className="text-purple-600"> {formatCurrency(commitValue)}</strong>
</p>
</section>
</div>
+88
View File
@@ -0,0 +1,88 @@
/**
* 决策卡组件
*
* 在决策中心列表中展示单个决策卡,点击可展开详情抽屉。
*/
import { ChevronRight } from 'lucide-react'
import { cn, formatCurrency } from '@/lib/utils'
import type { DecisionCard } from '@/lib/decision-aggregator'
import { SOURCE_LABELS, LEVEL_LABELS } from '@/lib/decision-aggregator'
interface DecisionCardProps {
decision: DecisionCard
index: number
approved: boolean
onOpen: (d: DecisionCard) => void
}
/** 来源类型颜色 */
const SOURCE_COLORS: Record<string, string> = {
profit_opportunity: 'bg-purple-100 text-purple-700',
risk_alert: 'bg-red-100 text-red-700',
task_anomaly: 'bg-amber-100 text-amber-700',
}
/** 等级颜色 */
const LEVEL_COLORS: Record<string, string> = {
L1: 'bg-red-50 text-red-600 border border-red-200',
L2: 'bg-amber-50 text-amber-600 border border-amber-200',
L3: 'bg-green-50 text-green-600 border border-green-200',
}
export function DecisionCardItem({ decision, index, approved, onOpen }: DecisionCardProps) {
const isApproved = approved || decision.status === '已批准'
return (
<button
className="flex w-full items-center gap-3 border-b px-4 py-3 text-left transition-colors hover:bg-muted/40"
onClick={() => onOpen(decision)}
>
{/* 排名序号 */}
<span
className={cn(
'flex h-7 w-7 shrink-0 items-center justify-center rounded-full text-xs font-bold',
index < 3 ? 'bg-purple-600 text-white' : 'bg-muted text-muted-foreground',
)}
>
{index + 1}
</span>
{/* 主体内容 */}
<div className="min-w-0 flex-1">
<div className="flex items-center gap-2">
<span className={cn('rounded px-1.5 py-0.5 text-[10px] font-medium', SOURCE_COLORS[decision.sourceType])}>
{SOURCE_LABELS[decision.sourceType]}
</span>
<span className={cn('rounded px-1.5 py-0.5 text-[10px] font-medium', LEVEL_COLORS[decision.level])}>
{LEVEL_LABELS[decision.level]}
</span>
<span className="text-[10px] text-muted-foreground">{decision.agentName}</span>
</div>
<p className="mt-1 truncate text-sm font-medium">{decision.title}</p>
<p className="mt-0.5 truncate text-xs text-muted-foreground">{decision.reason}</p>
</div>
{/* 影响金额 + 状态 */}
<div className="shrink-0 text-right">
{decision.impactAmount > 0 ? (
<p className="text-sm font-bold text-green-600">{formatCurrency(decision.impactAmount)}</p>
) : (
<p className="text-sm font-medium text-muted-foreground">{decision.impactDescription}</p>
)}
<p className="text-[10px] text-muted-foreground">{decision.deadline}</p>
</div>
{/* 状态标签 */}
<span
className={cn(
'shrink-0 rounded px-2 py-0.5 text-[10px] font-medium',
isApproved ? 'bg-green-100 text-green-700' : 'bg-gray-100 text-gray-600',
)}
>
{isApproved ? '已批准' : decision.status}
</span>
<ChevronRight className="h-4 w-4 shrink-0 text-muted-foreground" />
</button>
)
}
+161
View File
@@ -0,0 +1,161 @@
/**
* 决策详情弹窗
*
* 点击决策卡后居中弹出,展示证据链、影响评估和审批操作。
* 弹窗风格与 BusinessReportDialog 保持统一。
*/
import { X, BrainCircuit } from 'lucide-react'
import { cn, formatCurrency } from '@/lib/utils'
import type { DecisionCard } from '@/lib/decision-aggregator'
import { SOURCE_LABELS, LEVEL_LABELS } from '@/lib/decision-aggregator'
interface DecisionDrawerProps {
decision: DecisionCard
approved: boolean
onClose: () => void
onApprove: () => void
onReject: () => void
}
export function DecisionDrawer({ decision, approved, onClose, onApprove, onReject }: DecisionDrawerProps) {
return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/30" onClick={onClose}>
<div
className="max-h-[85vh] w-[640px] max-w-[95vw] overflow-y-auto rounded-lg border bg-card p-6 shadow-lg"
onClick={(e) => e.stopPropagation()}
>
{/* 标题栏 */}
<div className="mb-4 flex items-start justify-between">
<div>
<span className="text-xs text-muted-foreground">{decision.id} · {SOURCE_LABELS[decision.sourceType]}</span>
<h2 className="mt-1 text-base font-bold">{decision.title}</h2>
</div>
<button onClick={onClose} className="rounded-md p-1 hover:bg-muted">
<X className="h-5 w-5" />
</button>
</div>
{/* 内容 */}
<div className="space-y-4">
{/* 置信度 */}
<div className="rounded-lg border bg-muted/20 p-3">
<div className="flex items-center gap-2">
<BrainCircuit className="h-5 w-5 text-purple-600" />
<div className="flex-1">
<p className="text-xs text-muted-foreground">AI </p>
<p className="text-lg font-bold">{decision.confidence}%</p>
</div>
</div>
<div className="mt-2 h-2 overflow-hidden rounded-full bg-muted">
<div
className={cn(
'h-full rounded-full transition-all',
decision.confidence >= 85 ? 'bg-green-500' : decision.confidence >= 70 ? 'bg-amber-500' : 'bg-red-500',
)}
style={{ width: `${decision.confidence}%` }}
/>
</div>
</div>
{/* 为什么现在行动 */}
<div>
<h3 className="mb-1 text-sm font-bold"></h3>
<p className="text-sm text-muted-foreground">{decision.reason}</p>
</div>
{/* 影响评估 */}
<div className="grid grid-cols-2 gap-3">
<div className="rounded-lg border p-3">
<p className="text-xs text-muted-foreground"></p>
<p className="mt-1 text-sm font-bold text-green-600">
{decision.impactAmount > 0 ? formatCurrency(decision.impactAmount) : decision.impactDescription}
</p>
</div>
<div className="rounded-lg border p-3">
<p className="text-xs text-muted-foreground"></p>
<p className="mt-1 text-sm font-bold">{LEVEL_LABELS[decision.level]}</p>
</div>
</div>
{/* 证据链 */}
<div>
<h3 className="mb-2 text-sm font-bold"></h3>
<ul className="space-y-1.5">
{decision.evidence.map((e, i) => (
<li key={i} className="flex items-start gap-2 text-xs text-muted-foreground">
<span className="mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full bg-purple-400" />
{e}
</li>
))}
</ul>
</div>
{/* 详细信息(如果有) */}
{decision.detail && (
<div>
<h3 className="mb-2 text-sm font-bold"></h3>
<div className="rounded-lg border bg-muted/20 p-3">
{decision.detail.split('\n').map((line, i) => (
<p
key={i}
className={cn(
'text-xs leading-relaxed',
line.startsWith('⚠')
? 'mt-2 rounded bg-amber-50 px-2 py-1 font-medium text-amber-700'
: line.endsWith('') || line.endsWith(':')
? 'mt-2 font-semibold text-foreground'
: 'text-muted-foreground',
)}
>
{line || '\u00A0'}
</p>
))}
</div>
</div>
)}
{/* 责任与执行 */}
<div>
<h3 className="mb-2 text-sm font-bold"></h3>
<div className="grid grid-cols-3 gap-2">
<div className="rounded-lg border p-2 text-center">
<p className="text-[10px] text-muted-foreground"></p>
<p className="mt-0.5 text-xs font-medium">{decision.owner}</p>
</div>
<div className="rounded-lg border p-2 text-center">
<p className="text-[10px] text-muted-foreground"> AI</p>
<p className="mt-0.5 text-xs font-medium">{decision.agentName}</p>
</div>
<div className="rounded-lg border p-2 text-center">
<p className="text-[10px] text-muted-foreground"></p>
<p className="mt-0.5 text-xs font-medium">{decision.deadline}</p>
</div>
</div>
</div>
</div>
{/* 底部操作 */}
<div className="mt-4 flex gap-2 border-t pt-4">
<button
onClick={onReject}
className="flex-1 rounded-md border px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted"
>
退
</button>
<button
onClick={onApprove}
disabled={approved}
className={cn(
'flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors',
approved
? 'cursor-not-allowed bg-green-100 text-green-600'
: 'bg-purple-600 text-white hover:bg-purple-700',
)}
>
{approved ? '已批准 · 等待执行' : '批准并生成整改任务'}
</button>
</div>
</div>
</div>
)
}
+87
View File
@@ -0,0 +1,87 @@
/**
* 指挥舱待决策摘要组件
*
* 在 BossPage 顶部展示 TOP3 待决策,点击跳转到决策中心。
*/
import { useNavigate } from 'react-router-dom'
import { Sparkles, ChevronRight } from 'lucide-react'
import { cn, formatCurrency } from '@/lib/utils'
import type { DecisionCard } from '@/lib/decision-aggregator'
import { SOURCE_LABELS } from '@/lib/decision-aggregator'
interface DecisionSummaryProps {
decisions: DecisionCard[]
}
const SOURCE_COLORS: Record<string, string> = {
profit_opportunity: 'bg-purple-100 text-purple-700',
risk_alert: 'bg-red-100 text-red-700',
task_anomaly: 'bg-amber-100 text-amber-700',
}
export function DecisionSummary({ decisions }: DecisionSummaryProps) {
const navigate = useNavigate()
const top3 = decisions.slice(0, 3)
if (top3.length === 0) return null
const totalImpact = top3.reduce((s, d) => s + d.impactAmount, 0)
return (
<div className="rounded-lg border bg-gradient-to-r from-purple-50 to-white p-4">
{/* 标题行 */}
<div className="mb-3 flex items-center justify-between">
<div className="flex items-center gap-2">
<Sparkles className="h-4 w-4 text-purple-600" />
<h2 className="text-sm font-bold"></h2>
<span className="text-xs text-muted-foreground"></span>
</div>
<div className="text-right">
<span className="text-xs text-muted-foreground"></span>
<b className="ml-1 text-sm text-green-600">{formatCurrency(totalImpact)}</b>
</div>
</div>
{/* 决策列表 */}
<div className="space-y-1">
{top3.map((d, i) => (
<button
key={d.id}
className="flex w-full items-center gap-3 rounded-md px-3 py-2 text-left transition-colors hover:bg-white/60"
onClick={() => navigate('/decisions')}
>
<span
className={cn(
'flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-[10px] font-bold',
i === 0 ? 'bg-purple-600 text-white' : 'bg-purple-100 text-purple-600',
)}
>
{i + 1}
</span>
<div className="min-w-0 flex-1">
<div className="flex items-center gap-2">
<span className={cn('rounded px-1 py-0.5 text-[9px] font-medium', SOURCE_COLORS[d.sourceType])}>
{SOURCE_LABELS[d.sourceType]}
</span>
<span className="truncate text-xs font-medium">{d.title}</span>
</div>
<p className="mt-0.5 truncate text-[10px] text-muted-foreground">{d.reason}</p>
</div>
{d.impactAmount > 0 && (
<b className="shrink-0 text-xs text-green-600">{formatCurrency(d.impactAmount)}</b>
)}
<ChevronRight className="h-3 w-3 shrink-0 text-muted-foreground" />
</button>
))}
</div>
{/* 查看全部 */}
<button
className="mt-2 flex w-full items-center justify-center gap-1 rounded-md border border-purple-200 py-1.5 text-xs font-medium text-purple-600 hover:bg-purple-50"
onClick={() => navigate('/decisions')}
>
<ChevronRight className="h-3 w-3" />
</button>
</div>
)
}
+1 -1
View File
@@ -33,7 +33,7 @@ interface FilterableTableProps {
filter?: string
onFilterChange?: (filter: string) => void
filterButtons?: { key: string; label: string }[]
filterOptions?: string[]
filterOptions?: (string | { value: string; label: string })[]
searchKeys?: string[]
searchPlaceholder?: string
serverSearchValue?: string
+50
View File
@@ -0,0 +1,50 @@
/**
* 知识条目卡片组件
*
* 展示单个标杆实践(知识资产)的模块、标杆门店、关键行动和验证指标。
*/
import { ShieldCheck, ChevronRight } from 'lucide-react'
import { Badge } from '@/components/Badge'
interface KnowledgeCardProps {
practice: any
onClick?: () => void
}
/** 状态颜色映射 */
const STATUS_BADGE: Record<string, 'default' | 'status' | 'review'> = {
'待推广': 'default',
'推广中': 'status',
'已推广': 'review',
}
export function KnowledgeCard({ practice, onClick }: KnowledgeCardProps) {
return (
<div
className="flex cursor-pointer items-center gap-3 rounded-lg border bg-card p-3 transition-shadow hover:shadow-sm"
onClick={onClick}
>
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-teal-50">
<ShieldCheck className="h-5 w-5 text-teal-600" />
</div>
<div className="min-w-0 flex-1">
<div className="flex items-center gap-2">
<span className="rounded bg-teal-50 px-1.5 py-0.5 text-[10px] font-medium text-teal-700">
{practice.practice_module}
</span>
<Badge type={STATUS_BADGE[practice.status] || 'default'} text={practice.status} />
</div>
<p className="mt-1 truncate text-sm font-medium">
{practice.key_actions?.substring(0, 60) || '未填写关键行动'}
{practice.key_actions?.length > 60 ? '…' : ''}
</p>
<p className="mt-0.5 truncate text-xs text-muted-foreground">
: {practice.benchmark_store_name || '-'}
</p>
</div>
<ChevronRight className="h-4 w-4 shrink-0 text-muted-foreground" />
</div>
)
}
+30 -3
View File
@@ -1,6 +1,6 @@
import { ReactNode, useState } from 'react'
import { Link, useLocation } from 'react-router-dom'
import { LayoutDashboard, Store, ClipboardList, TrendingUp, Settings, LogOut, Menu, X, Package, DollarSign, ShoppingBag, Users, AlertTriangle, Clock, Database, MapPin, PieChart, Wallet, CalendarClock, Activity, Crown, BarChart3, Receipt, Utensils, Landmark, ChefHat, Truck, Network, TrendingUp as TrendingUpIcon, Building2 } from 'lucide-react'
import { LayoutDashboard, Store, ClipboardList, TrendingUp, Settings, LogOut, Menu, X, Package, DollarSign, ShoppingBag, Users, AlertTriangle, Clock, Database, MapPin, PieChart, Wallet, CalendarClock, Activity, Crown, BarChart3, Receipt, Utensils, Landmark, ChefHat, Truck, Network, TrendingUp as TrendingUpIcon, Building2, Target, Bell, Timer, TrafficCone, Boxes, Download, Briefcase, Cpu, Tag, Sparkles, Bot, Library } from 'lucide-react'
import { cn } from '@/lib/utils'
import { StatusBanner } from '@/components/StatusBanner'
@@ -32,14 +32,24 @@ const menuGroups: MenuGroup[] = [
{ path: '/bank', label: '银行授信', icon: Landmark, roles: ['hq'] },
],
},
{
title: '智脑决策',
items: [
{ path: '/decisions', label: '决策中心', icon: Sparkles, roles: ['hq', 'dept'] },
{ path: '/agents', label: 'AI员工组织', icon: Bot, roles: ['hq', 'dept'] },
{ path: '/knowledge', label: '知识资产', icon: Library, roles: ['hq', 'dept'] },
{ path: '/tasks', label: '任务管理', icon: ClipboardList, roles: ['hq', 'regional', 'store', 'dept'] },
{ path: '/monthly-review', label: '月度验收', icon: TrendingUp, roles: ['hq', 'dept', 'regional'] },
{ path: '/alert', label: '预警管理', icon: Bell, roles: ['hq', 'dept', 'regional', 'store'] },
{ path: '/target', label: '目标管理', icon: Target, roles: ['hq', 'dept', 'regional'] },
],
},
{
title: '角色工作台',
items: [
{ path: '/regional', label: '区域经理', icon: Store, roles: ['hq', 'dept', 'regional'] },
{ path: '/region-comparison', label: '区域对比', icon: Store, roles: ['hq', 'dept', 'regional'] },
{ path: '/store', label: '店长工作台', icon: ClipboardList, roles: ['hq', 'dept', 'store'] },
{ path: '/tasks', label: '任务管理', icon: ClipboardList, roles: ['hq', 'regional', 'store', 'dept'] },
{ path: '/monthly-review', label: '月度验收', icon: TrendingUp, roles: ['hq', 'dept', 'regional'] },
],
},
{
@@ -69,6 +79,7 @@ const menuGroups: MenuGroup[] = [
items: [
{ path: '/sku', label: '商品SKU', icon: Package, roles: ['hq', 'dept'] },
{ path: '/menu-engineering', label: '菜单工程', icon: Package, roles: ['hq', 'dept'] },
{ path: '/promotion', label: '促销增量', icon: Tag, roles: ['hq', 'dept'] },
{ path: '/time', label: '时间分析', icon: Clock, roles: ['hq', 'dept'] },
{ path: '/smart-scheduling', label: '智能排班', icon: CalendarClock, roles: ['hq', 'dept', 'regional', 'store'] },
{ path: '/employee-performance', label: '员工绩效', icon: CalendarClock, roles: ['hq', 'dept'] },
@@ -81,12 +92,28 @@ const menuGroups: MenuGroup[] = [
{ path: '/site-selection', label: '门店选址', icon: MapPin, roles: ['hq', 'dept'] },
],
},
{
title: '系统配置',
items: [
{ path: '/store-grade', label: '门店分级', icon: TrafficCone, roles: ['hq', 'dept', 'regional'] },
{ path: '/scheduler', label: '调度管理', icon: Timer, roles: ['hq'] },
{ path: '/product-lifecycle', label: '产品生命周期', icon: Boxes, roles: ['hq', 'dept'] },
{ path: '/data-import', label: '数据采集', icon: Download, roles: ['hq', 'dept'] },
{ path: '/enterprise', label: '企业协同', icon: Briefcase, roles: ['hq', 'dept'] },
{ path: '/intelligence', label: '智能升级', icon: Cpu, roles: ['hq', 'dept'] },
],
},
{
title: '系统管理',
items: [
{ path: '/tenant-users', label: '用户管理', icon: Users, roles: ['hq'] },
{ path: '/data-quality', label: '数据质量', icon: Database, roles: ['hq', 'dept'] },
{ path: '/indicators', label: '指标字典', icon: Settings, roles: ['hq', 'dept', 'regional', 'store'] },
],
},
{
title: '经营本体',
items: [
{ path: '/ontology', label: '本体标准', icon: Receipt, roles: ['hq', 'dept'] },
],
},
+74
View File
@@ -0,0 +1,74 @@
/**
* 闭环健康度条组件
*
* 展示"信号→决策→任务→验收→知识"5 阶段转化率。
* 数据来源:/tasks/loop-health API。
*/
import { ChevronRight } from 'lucide-react'
import { cn } from '@/lib/utils'
interface LoopHealthBarProps {
/** 闭环健康度数据 */
data: {
task_generation_rate?: number
store_execution_rate?: number
weekly_check_rate?: number
monthly_review_rate?: number
practice_promotion_rate?: number
} | null
/** 各阶段数量(可选) */
counts?: {
signals?: number
decisions?: number
tasks?: number
checks?: number
reviews?: number
practices?: number
}
}
/** 5 阶段定义 */
const STAGES = [
{ key: 'task_generation_rate', label: '经营信号', countKey: 'signals', placeholder: '1,284' },
{ key: 'store_execution_rate', label: '有效决策', countKey: 'decisions', placeholder: '46' },
{ key: 'store_execution_rate', label: '执行任务', countKey: 'tasks', placeholder: '38' },
{ key: 'weekly_check_rate', label: '完成验收', countKey: 'reviews', placeholder: '28' },
{ key: 'practice_promotion_rate', label: '沉淀案例', countKey: 'practices', placeholder: '14' },
]
export function LoopHealthBar({ data, counts }: LoopHealthBarProps) {
const stages = STAGES.map((s) => {
const rate = data ? (data as any)[s.key] : null
const count = counts ? (counts as any)[s.countKey] : null
return {
...s,
rate: rate != null ? Math.round(Number(rate) * 100) / 100 : null,
count: count != null ? String(count) : s.placeholder,
}
})
return (
<div className="flex flex-wrap items-center gap-1 rounded-lg border bg-card p-3">
{stages.map((s, i) => (
<div key={s.label} className="flex items-center gap-1">
<div className="flex flex-col items-center px-2">
<span
className={cn(
'flex h-6 w-6 items-center justify-center rounded-full text-[10px] font-bold',
i === 0 ? 'bg-blue-600 text-white' : 'bg-muted text-muted-foreground',
)}
>
{i + 1}
</span>
<small className="mt-1 text-[10px] text-muted-foreground">{s.label}</small>
<b className="text-sm font-bold">{s.count}</b>
{s.rate != null && (
<em className="text-[10px] text-green-600">{s.rate}% </em>
)}
</div>
{i < stages.length - 1 && <ChevronRight className="h-4 w-4 text-muted-foreground" />}
</div>
))}
</div>
)
}
@@ -31,7 +31,7 @@ export function ExpenseOverviewTab({ month }: { month: string }) {
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<CollapsibleSection title="费用结构分析" subtitle="2026年4月各费用科目占比">
<CollapsibleSection title="费用结构分析" subtitle={`${month}各费用科目占比`}>
<ResponsiveContainer width="100%" height={400}>
<PieChart>
<Pie data={pieData} dataKey="value" nameKey="name" cx="50%" cy="50%" outerRadius={120} labelLine={false}>
@@ -116,7 +116,7 @@ function StoreDetailModal({ store, onClose }: { store: StoreDetail | null, onClo
{ label: '面积(㎡)', value: formatNumber(store.area_sqm) },
{ label: '坪效', value: formatNumber(store.received_per_sqm) },
{ label: '账单数', value: formatNumber(store.bill_count) },
{ label: '租约到期', value: store.lease_expiry_date ? new Date(store.lease_expiry_date).toLocaleDateString('zh-CN') : '-' },
{ label: '租约到期', value: store.lease_expiry_date ? String(store.lease_expiry_date).substring(0, 10) : '-' },
]
return (
@@ -197,9 +197,9 @@ export function LossDiagnosisTab({ month }: { month: string }) {
const rows = (data as any)?.data || []
const meta = (data as any)?.meta || { page, pageSize: PAGE_SIZE, total: 0 }
const p0Count = rows.filter((r: any) => r.priority === 'P0').length
const p1Count = rows.filter((r: any) => r.priority === 'P1').length
const totalLoss = rows.reduce((sum: number, r: any) => sum + parseFloat(r.actual_store_contribution || 0), 0)
const p0Count = meta.evalStats ? Number(meta.evalStats.p0_count) : rows.filter((r: any) => r.priority === 'P0').length
const p1Count = meta.evalStats ? Number(meta.evalStats.p1_count) : rows.filter((r: any) => r.priority === 'P1').length
const totalLoss = meta.evalStats ? Number(meta.evalStats.total_loss) : rows.reduce((sum: number, r: any) => sum + parseFloat(r.actual_store_contribution || 0), 0)
return (
<div className="space-y-4">
@@ -76,7 +76,7 @@ export function RentRiskTab({ month }: { month: string }) {
{ key: 'rent_rate_pct', label: '租金率', align: 'right', render: (r) => <span className={parseFloat(r.rent_rate_pct) > 20 ? 'text-red-600 font-medium' : ''}>{formatPercent(r.rent_rate_pct)}</span> },
{ key: 'area_sqm', label: '面积(㎡)', align: 'right', render: (r) => formatNumber(r.area_sqm) },
{ key: 'received_per_sqm', label: '坪效', align: 'right', render: (r) => formatNumber(r.received_per_sqm) },
{ key: 'lease_expiry_date', label: '租约到期', render: (r) => r.lease_expiry_date ? new Date(r.lease_expiry_date).toLocaleDateString('zh-CN') : '-' },
{ key: 'lease_expiry_date', label: '租约到期', render: (r) => r.lease_expiry_date ? String(r.lease_expiry_date).substring(0, 10) : '-' },
{ key: 'risk_level', label: '风险等级', render: (r) => <span className={RISK_COLORS[r.risk_level] || ''}>{r.risk_level}</span> },
{ key: 'suggestion', label: '建议' },
]}
@@ -59,7 +59,7 @@ function EvalDetailModal({ store, onClose }: { store: EvalStoreDetail | null, on
{ label: '租金率', value: formatPercent(store.rent_rate_pct), warn: parseFloat(store.rent_rate_pct) > 20 },
{ label: '坪效', value: formatNumber(store.received_per_sqm), warn: parseFloat(store.received_per_sqm) < 1000 },
{ label: '面积(㎡)', value: formatNumber(store.area_sqm) },
{ label: '租约到期', value: store.lease_expiry_date ? new Date(store.lease_expiry_date).toLocaleDateString('zh-CN') : '-' },
{ label: '租约到期', value: store.lease_expiry_date ? String(store.lease_expiry_date).substring(0, 10) : '-' },
]
return (
@@ -167,7 +167,7 @@ export function StoreEvaluationTab({ month }: { month: string }) {
{ key: 'actual_store_contribution', label: '贡献利润', align: 'right', render: (r) => <span className={parseFloat(r.actual_store_contribution) < 0 ? 'text-red-600 font-medium' : 'text-green-600'}>{formatCurrency(r.actual_store_contribution)}</span> },
{ key: 'actual_store_contribution_rate_pct', label: '贡献率', align: 'right', render: (r) => formatPercent(r.actual_store_contribution_rate_pct) },
{ key: 'received_per_sqm', label: '坪效', align: 'right', render: (r) => formatNumber(r.received_per_sqm) },
{ key: 'lease_expiry_date', label: '租约到期', render: (r) => r.lease_expiry_date ? new Date(r.lease_expiry_date).toLocaleDateString('zh-CN') : '-' },
{ key: 'lease_expiry_date', label: '租约到期', render: (r) => r.lease_expiry_date ? String(r.lease_expiry_date).substring(0, 10) : '-' },
{ key: 'evaluation_detail', label: '评估详情', render: (r) => <span className="text-xs">{r.evaluation_detail}</span> },
]}
/>
+143
View File
@@ -0,0 +1,143 @@
/**
* AI 员工配置定义
*
* 定义玄谋智脑的 10 个 AI 员工角色,包括岗位目标、负责领域、自治等级和对应的 SBrainCO 能力。
* 阶段一为静态配置,阶段二将迁移至 analytics.agent_config 表动态管理。
*/
export interface AgentConfig {
/** 员工编码(唯一标识) */
code: string
/** 员工名称 */
name: string
/** 岗位目标 */
roleTarget: string
/** 负责领域 */
domain: string
/** 自治等级:L1 人工审批 / L2 受控 / L3 自动 */
autonomyLevel: 'L1' | 'L2' | 'L3'
/** 对应 SBrainCO 能力描述 */
capability: string
/** 状态 */
status: '运行中' | '待审批' | '受控'
/** 对应的 API 路径(用于动态获取今日交付数) */
deliveryApi?: string
/** 交付数提取路径(从 API 响应中提取数字) */
deliveryField?: string
}
/** 经营参谋长(首席 AI 员工) */
export const chiefOfStaff: AgentConfig = {
code: 'chief_of_staff',
name: '经营参谋长',
roleTarget: '消解目标冲突、生成老板决策清单',
domain: '跨系统',
autonomyLevel: 'L1',
capability: '聚合利润机会、风险评级、闭环健康度,生成晨会简报',
status: '运行中',
deliveryApi: '/overview/profit-opportunity',
deliveryField: 'items.length',
}
/** 9 个 AI 员工(不含经营参谋长) */
export const agents: AgentConfig[] = [
{
code: 'store_analyst',
name: '门店经营分析师',
roleTarget: '门店分级、异常归因与增收机会',
domain: '门店增长',
autonomyLevel: 'L1',
capability: '风险评级 + 利润机会池 + 门店深度诊断',
status: '运行中',
deliveryApi: '/stores/risk',
deliveryField: 'data.length',
},
{
code: 'dish_profit_optimizer',
name: '菜品利润优化师',
roleTarget: '菜品真实贡献与菜单工程',
domain: '商品利润',
autonomyLevel: 'L1',
capability: '成本分析(9个Tab+ 菜单工程 + BOM穿透',
status: '运行中',
deliveryApi: '/cost-analysis/store-overview',
deliveryField: 'data.stores.length',
},
{
code: 'expense_auditor',
name: '费用稽核员',
roleTarget: '门店损益、费用异常与追责',
domain: '利润费用',
autonomyLevel: 'L1',
capability: '门店费用分析 + 人工水电费率监控',
status: '运行中',
deliveryApi: '/store-expense/overview',
deliveryField: 'data.stores.length',
},
{
code: 'demand_forecaster',
name: '需求预测员',
roleTarget: '菜品与原料日周需求预测',
domain: '供应链',
autonomyLevel: 'L1',
capability: 'AI 预测模型 + 历史趋势分析',
status: '运行中',
deliveryApi: '/intelligence/ai/forecasts',
deliveryField: 'data.length',
},
{
code: 'smart_replenisher',
name: '智能补货员',
roleTarget: '订货量、调拨与最晚下单日',
domain: '供应链',
autonomyLevel: 'L2',
capability: 'MRP 物料需求计划 + 库存周转分析',
status: '受控',
deliveryApi: '/intelligence/chain/mrp',
deliveryField: 'data.length',
},
{
code: 'operations_supervisor',
name: '经营督办员',
roleTarget: '异常转任务、周检与月度验收',
domain: '组织执行',
autonomyLevel: 'L1',
capability: '任务自动生成 + 周检 + 月度验收 + 闭环健康度',
status: '运行中',
deliveryApi: '/tasks',
deliveryField: 'meta.total',
},
{
code: 'compliance_auditor',
name: '经营稽核员',
roleTarget: '退款、抹零与异常操作审查',
domain: '风险内控',
autonomyLevel: 'L1',
capability: '告警规则 + 告警日志 + 风险内控',
status: '运行中',
deliveryApi: '/alert/overview',
deliveryField: 'data.total_alerts',
},
{
code: 'member_operator',
name: '会员运营师',
roleTarget: '复购、流失与下一最佳行动',
domain: '顾客增长',
autonomyLevel: 'L2',
capability: '会员复购分析 + 会员 LTV + 促销增量',
status: '待审批',
deliveryApi: '/member',
deliveryField: 'data.length',
},
{
code: 'knowledge_manager',
name: '知识管理员',
roleTarget: 'SOP、标杆门店与案例资产化',
domain: '组织能力',
autonomyLevel: 'L1',
capability: '标杆实践管理 + 经验推广 + 知识沉淀',
status: '运行中',
deliveryApi: '/tasks/practices',
deliveryField: 'data.length',
},
]
+203
View File
@@ -0,0 +1,203 @@
/**
* 决策聚合逻辑
*
* 将利润机会、风险告警、异常任务 3 类信号统一聚合为"决策卡"格式。
* 阶段一为前端聚合(不持久化),阶段二将迁移至后端 analytics.decision_card 表。
*/
/** 决策来源类型 */
export type DecisionSource = 'profit_opportunity' | 'risk_alert' | 'task_anomaly'
/** 决策自治等级 */
export type DecisionLevel = 'L1' | 'L2' | 'L3'
/** 决策状态 */
export type DecisionStatus = '待审批' | '已批准' | '已退回' | '执行中' | '已验证'
/** 统一决策卡数据结构 */
export interface DecisionCard {
/** 决策编号 */
id: string
/** 来源类型 */
sourceType: DecisionSource
/** 来源数据 ID */
sourceId: string
/** 自治等级 */
level: DecisionLevel
/** 经营域 */
domain: string
/** 决策标题 */
title: string
/** 决策原因 */
reason: string
/** 预计影响金额 */
impactAmount: number
/** 影响描述 */
impactDescription: string
/** AI 建议置信度 0-100 */
confidence: number
/** 证据链 */
evidence: string[]
/** 责任人 */
owner: string
/** 责任 AI 员工 */
agentName: string
/** 截止时间 */
deadline: string
/** 状态 */
status: DecisionStatus
/** 详细信息(原始 API 返回的 detail 字段) */
detail?: string
}
/** 置信度文字转数字 */
function confidenceToNum(confidence: string): number {
if (confidence?.includes('高')) return 90
if (confidence?.includes('中高')) return 85
if (confidence?.includes('中')) return 75
if (confidence?.includes('中低')) return 65
if (confidence?.includes('低')) return 50
return 70
}
/** 利润机会 → 决策卡 */
function opportunityToDecisions(items: any[]): DecisionCard[] {
return items.map((o, i) => ({
id: `OPP-${String(i + 1).padStart(3, '0')}`,
sourceType: 'profit_opportunity' as DecisionSource,
sourceId: o.category,
level: 'L1' as DecisionLevel,
domain: o.owner?.split('/')[0]?.trim() || '经营',
title: o.category,
reason: o.evidence || '基于利润机会池分析',
impactAmount: Math.max(Number(o.opportunity || 0), 0),
impactDescription: `预计月度利润提升 ${Math.max(Number(o.opportunity || 0), 0).toLocaleString('zh-CN')}`,
confidence: confidenceToNum(o.confidence),
evidence: [
`基线: ${o.baseline}`,
`验收方式: ${o.evidence}`,
`责任方: ${o.owner}`,
],
owner: o.owner || '待分配',
agentName: mapOwnerToAgent(o.owner),
deadline: '30天内',
status: '待审批' as DecisionStatus,
detail: o.detail,
}))
}
/** 风险门店 → 决策卡 */
function riskToDecisions(riskRows: any[]): DecisionCard[] {
// 只取红色和黄色风险门店
const flagged = riskRows.filter((r) => r.risk_level === '红色' || r.risk_level === '黄色')
return flagged.slice(0, 10).map((r, i) => ({
id: `RISK-${String(i + 1).padStart(3, '0')}`,
sourceType: 'risk_alert' as DecisionSource,
sourceId: r.store_code || r.store_name,
level: (r.risk_level === '红色' ? 'L1' : 'L2') as DecisionLevel,
domain: '门店经营',
title: `${r.store_name} ${r.risk_level}门店整改`,
reason: `风险评级为${r.risk_level},营收 ${Number(r.received || 0).toLocaleString('zh-CN')} 元,需关注经营异常`,
impactAmount: Number(r.received || 0) * 0.05,
impactDescription: `预计挽回营收损失 ${Math.round(Number(r.received || 0) * 0.05).toLocaleString('zh-CN')}`,
confidence: r.risk_level === '红色' ? 92 : 78,
evidence: [
`门店: ${r.store_name}${r.store_code || '-'}`,
`风险等级: ${r.risk_level}`,
`实收: ¥${Number(r.received || 0).toLocaleString('zh-CN')}`,
`风险评分: ${r.risk_score || '-'}`,
],
owner: '区域经理',
agentName: '门店经营分析师',
deadline: r.risk_level === '红色' ? '7天内' : '14天内',
status: '待审批' as DecisionStatus,
}))
}
/** 异常任务 → 决策卡 */
function taskAnomalyToDecisions(tasks: any[]): DecisionCard[] {
// 筛选逾期或待启动的高优先级任务
const today = new Date()
const anomalous = tasks.filter((t) => {
const isOverdue = t.deadline && new Date(t.deadline) < today && t.status !== '已验收'
const isPendingP0 = t.priority?.startsWith('P0') && t.status === '待启动'
return isOverdue || isPendingP0
})
return anomalous.slice(0, 10).map((t, i) => ({
id: `TASK-${String(i + 1).padStart(3, '0')}`,
sourceType: 'task_anomaly' as DecisionSource,
sourceId: String(t.task_id),
level: (t.priority?.startsWith('P0') ? 'L1' : 'L2') as DecisionLevel,
domain: '组织执行',
title: `${t.store_name} - ${t.problem_indicator || '任务异常'}`,
reason: t.problem_description || t.action_required || '任务存在异常需关注',
impactAmount: 0,
impactDescription: t.verification_result || '需评估验收价值',
confidence: 80,
evidence: [
`门店: ${t.store_name}`,
`问题指标: ${t.problem_indicator || '-'}`,
`当前值: ${t.current_value ?? '-'} / 目标值: ${t.target_value ?? '-'}`,
`负责人: ${t.owner}`,
`截止日: ${t.deadline?.substring(0, 10) || '-'}`,
],
owner: t.owner || '待分配',
agentName: '经营督办员',
deadline: t.deadline?.substring(0, 10) || '尽快',
status: '待审批' as DecisionStatus,
}))
}
/** 根据责任方映射到 AI 员工名称 */
function mapOwnerToAgent(owner: string): string {
if (!owner) return '经营参谋长'
if (owner.includes('供应链') || owner.includes('商品')) return '菜品利润优化师'
if (owner.includes('运营') || owner.includes('人力')) return '费用稽核员'
if (owner.includes('工程') || owner.includes('门店')) return '门店经营分析师'
if (owner.includes('营销')) return '会员运营师'
if (owner.includes('外卖') || owner.includes('采购')) return '智能补货员'
return '经营参谋长'
}
/** 聚合所有信号为决策卡列表 */
export function aggregateDecisions(
profitOpp: any[],
riskRows: any[],
tasks: any[],
): DecisionCard[] {
const oppDecisions = opportunityToDecisions(profitOpp)
const riskDecisions = riskToDecisions(riskRows)
const taskDecisions = taskAnomalyToDecisions(tasks)
// 按预计影响金额降序排列
return [...oppDecisions, ...riskDecisions, ...taskDecisions].sort(
(a, b) => b.impactAmount - a.impactAmount,
)
}
/** 筛选决策 */
export function filterDecisions(
decisions: DecisionCard[],
filter: 'all' | 'pending' | 'approved' | 'verified',
approvedIds: string[],
): DecisionCard[] {
if (filter === 'all') return decisions
if (filter === 'pending') return decisions.filter((d) => d.status === '待审批' && !approvedIds.includes(d.id))
if (filter === 'approved') return decisions.filter((d) => approvedIds.includes(d.id))
if (filter === 'verified') return decisions.filter((d) => d.status === '已验证')
return decisions
}
/** 决策来源标签 */
export const SOURCE_LABELS: Record<DecisionSource, string> = {
profit_opportunity: '利润机会',
risk_alert: '风险告警',
task_anomaly: '任务异常',
}
/** 自治等级标签 */
export const LEVEL_LABELS: Record<DecisionLevel, string> = {
L1: 'L1 人工审批',
L2: 'L2 受控',
L3: 'L3 自动',
}
+111
View File
@@ -0,0 +1,111 @@
/**
* AI 员工组织页面
*
* 展示玄谋智脑的 10 个 AI 员工角色,包括经营参谋长(首席)和 9 个专业员工。
* 今日交付数从对应 API 动态获取。
*/
import { useQuery } from '@tanstack/react-query'
import { BrainCircuit } from 'lucide-react'
import api from '@/lib/api'
import { AgentCard } from '@/components/AgentCard'
import { chiefOfStaff, agents, type AgentConfig } from '@/data/agents'
import { cn } from '@/lib/utils'
export function AgentsPage() {
// 批量获取各 AI 员工的今日交付数
const queries = agents.map((agent, idx) =>
useQuery({
queryKey: ['agent-delivery', agent.code],
queryFn: () => api.get(agent.deliveryApi || ''),
enabled: !!agent.deliveryApi,
staleTime: 5 * 60 * 1000,
}),
)
// 经营参谋长的交付数(利润机会数量)
const chiefQuery = useQuery({
queryKey: ['overview/profit-opportunity', 'chief'],
queryFn: () => api.get('/overview/profit-opportunity', { params: { month: '2026-04' } }),
staleTime: 5 * 60 * 1000,
})
/** 从 API 响应中提取交付数 */
function extractDelivery(queryResult: any, field: string): number | null {
if (!queryResult) return null
const data = (queryResult as any)?.data
if (!data) return null
// 支持 a.b.c 路径
const parts = field.split('.')
let val: any = data
for (const p of parts) {
val = val?.[p]
if (val === undefined) return null
}
const num = typeof val === 'number' ? val : parseInt(String(val), 10)
return isNaN(num) ? null : num
}
const chiefDeliveries = chiefQuery.data
? extractDelivery(chiefQuery.data, 'items.length') ?? (chiefQuery.data as any)?.data?.items?.length ?? 0
: null
return (
<div className="space-y-4">
{/* 页面标题 */}
<div>
<h1 className="flex items-center gap-2 text-xl font-bold">
<BrainCircuit className="h-5 w-5 text-blue-600" />
AI
</h1>
<p className="mt-1 text-sm text-muted-foreground">
AI SOP
</p>
</div>
{/* 经营参谋长(首席卡片) */}
<div className="rounded-lg border-2 border-blue-200 bg-gradient-to-r from-blue-50 to-white p-4">
<div className="flex items-center gap-4">
<div className="flex h-14 w-14 items-center justify-center rounded-xl bg-blue-600">
<BrainCircuit className="h-7 w-7 text-white" />
</div>
<div className="flex-1">
<small className="text-[10px] font-medium text-blue-600">AI CHIEF OF STAFF</small>
<h2 className="text-lg font-bold">{chiefOfStaff.name}</h2>
<p className="text-sm text-muted-foreground">{chiefOfStaff.roleTarget}</p>
</div>
<div className="text-right">
<p className="text-xs text-muted-foreground"></p>
<b className="text-2xl font-bold text-blue-600">{chiefDeliveries ?? '…'}</b>
<p className="text-[10px] text-muted-foreground"></p>
</div>
</div>
</div>
{/* AI 员工网格 */}
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
{agents.map((agent, idx) => (
<AgentCard
key={agent.code}
agent={agent}
deliveries={
queries[idx]?.data
? extractDelivery(queries[idx].data, agent.deliveryField || '') ?? 0
: null
}
/>
))}
</div>
{/* 底部说明 */}
<div className="rounded-lg border bg-muted/20 p-3 text-xs text-muted-foreground">
<p>
<b className="text-foreground"></b>
<span className={cn('ml-1 rounded px-1 py-0.5 text-[10px]', 'bg-red-50 text-red-600')}>L1</span> ·
<span className={cn('ml-1 rounded px-1 py-0.5 text-[10px]', 'bg-amber-50 text-amber-600')}>L2</span> ·
<span className={cn('ml-1 rounded px-1 py-0.5 text-[10px]', 'bg-green-50 text-green-600')}>L3</span>
</p>
<p className="mt-1"> AI API </p>
</div>
</div>
)
}
+170
View File
@@ -0,0 +1,170 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import api from '@/lib/api'
import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { Tabs } from '@/components/Tabs'
import { formatNumber } from '@/lib/utils'
import { useState } from 'react'
export function AlertManagementPage() {
const [tab, setTab] = useState('logs')
const queryClient = useQueryClient()
const { data: overviewData, isLoading: overviewLoading } = useQuery({
queryKey: ['alert/overview'],
queryFn: () => api.get('/alert/overview'),
})
const { data: rulesData, isLoading: rulesLoading } = useQuery({
queryKey: ['alert/rules'],
queryFn: () => api.get('/alert/rules'),
})
const { data: logsData, isLoading: logsLoading } = useQuery({
queryKey: ['alert/logs'],
queryFn: () => api.get('/alert/logs', { params: { page_size: 100 } }),
})
const handleMutation = useMutation({
mutationFn: (data: { id: number; handle_status: string; handle_comment?: string }) =>
api.patch(`/alert/logs/${data.id}`, { handle_status: data.handle_status, handle_comment: data.handle_comment }),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['alert/logs'] }),
})
const toggleRuleMutation = useMutation({
mutationFn: (data: { id: number; is_enabled: boolean }) =>
api.patch(`/alert/rules/${data.id}`, { is_enabled: data.is_enabled }),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['alert/rules'] }),
})
const overview = (overviewData as any)?.data || {}
const rules = (rulesData as any)?.data || []
const logs = (logsData as any)?.data || []
const pageLoading = overviewLoading && tab === 'logs'
if (pageLoading) {
return <LoadingSpinner text="加载预警数据..." />
}
return (
<div className="space-y-4">
<div className="flex items-center justify-between">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground"> · · </p>
</div>
</div>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="近30天预警总数" value={overview.total_alerts || 0} format="number" description="最近30天触发的预警总数" />
<MetricCard title="红灯预警" value={overview.red_alerts || 0} format="number" description="严重预警数量" status={overview.red_alerts > 0 ? 'bad' : 'good'} />
<MetricCard title="待处理预警" value={overview.pending_alerts || 0} format="number" description="尚未处理的预警" status={overview.pending_alerts > 0 ? 'warn' : 'good'} />
<MetricCard title="今日预警" value={overview.today_alerts || 0} format="number" description="今日触发的预警数" />
</div>
<Tabs
tabs={[
{ key: 'logs', label: '预警日志' },
{ key: 'rules', label: '预警规则' },
]}
active={tab}
onChange={setTab}
/>
{tab === 'logs' && (
<CollapsibleSection title={`预警日志 (${logs.length})`} subtitle="按触发时间降序">
{logsLoading ? <LoadingSpinner text="加载预警日志..." /> : (
<FilterableTable
data={logs}
filterKey="severity"
filterLabel="全部级别"
sortOptions={[
{ key: 'triggered_at', label: '触发时间' },
{ key: 'metric_value', label: '指标值' },
{ key: 'severity', label: '级别' },
]}
defaultSort="triggered_at"
defaultOrder="desc"
columns={[
{ key: 'triggered_at', label: '触发时间', render: (r) => (r.triggered_at || '').substring(0, 19).replace('T', ' ') },
{ key: 'rule_name', label: '规则名称' },
{ key: 'store_code', label: '门店编码' },
{ key: 'store_name', label: '门店名称' },
{ key: 'metric_value', label: '指标值', align: 'right', render: (r) => Number(r.metric_value || 0).toFixed(2) },
{ key: 'threshold', label: '阈值', align: 'right', render: (r) => Number(r.threshold || 0).toFixed(2) },
{ key: 'severity', label: '级别', align: 'center', render: (r) => {
const colors: Record<string, string> = { red: 'bg-red-100 text-red-700', yellow: 'bg-yellow-100 text-yellow-700' }
const labels: Record<string, string> = { red: '红灯', yellow: '黄灯' }
return <span className={`rounded px-2 py-0.5 text-xs ${colors[r.severity] || ''}`}>{labels[r.severity] || r.severity}</span>
}},
{ key: 'handle_status', label: '处理状态', align: 'center', render: (r) => {
const colors: Record<string, string> = { pending: 'bg-gray-100 text-gray-600', handling: 'bg-blue-100 text-blue-700', resolved: 'bg-green-100 text-green-700', ignored: 'bg-gray-100 text-gray-500' }
const labels: Record<string, string> = { pending: '待处理', handling: '处理中', resolved: '已解决', ignored: '已忽略' }
return <span className={`rounded px-2 py-0.5 text-xs ${colors[r.handle_status] || ''}`}>{labels[r.handle_status] || r.handle_status}</span>
}},
{ key: 'actions', label: '操作', align: 'center', render: (r) => (
<div className="flex gap-1">
{r.handle_status === 'pending' && (
<>
<button
onClick={() => handleMutation.mutate({ id: r.id, handle_status: 'resolved', handle_comment: '已处理' })}
className="rounded bg-green-100 px-2 py-0.5 text-xs text-green-700 hover:bg-green-200"
></button>
<button
onClick={() => handleMutation.mutate({ id: r.id, handle_status: 'ignored', handle_comment: '已忽略' })}
className="rounded bg-gray-100 px-2 py-0.5 text-xs text-gray-600 hover:bg-gray-200"
></button>
</>
)}
</div>
)},
]}
/>
)}
</CollapsibleSection>
)}
{tab === 'rules' && (
<CollapsibleSection title={`预警规则 (${rules.length})`} subtitle="规则配置与启停">
{rulesLoading ? <LoadingSpinner text="加载预警规则..." /> : (
<FilterableTable
data={rules}
sortOptions={[
{ key: 'rule_name', label: '规则名称' },
{ key: 'metric', label: '指标' },
{ key: 'threshold', label: '阈值' },
]}
defaultSort="rule_name"
defaultOrder="asc"
columns={[
{ key: 'rule_name', label: '规则名称' },
{ key: 'description', label: '描述' },
{ key: 'metric', label: '监控指标' },
{ key: 'operator', label: '比较符', align: 'center' },
{ key: 'threshold', label: '阈值', align: 'right' },
{ key: 'severity', label: '级别', align: 'center', render: (r) => {
const colors: Record<string, string> = { red: 'bg-red-100 text-red-700', yellow: 'bg-yellow-100 text-yellow-700' }
const labels: Record<string, string> = { red: '红灯', yellow: '黄灯' }
return <span className={`rounded px-2 py-0.5 text-xs ${colors[r.severity] || ''}`}>{labels[r.severity] || r.severity}</span>
}},
{ key: 'check_interval', label: '检查频率', align: 'center' },
{ key: 'push_targets', label: '推送对象' },
{ key: 'is_enabled', label: '状态', align: 'center', render: (r) => (
<button
onClick={() => toggleRuleMutation.mutate({ id: r.id, is_enabled: !r.is_enabled })}
className={`rounded px-2 py-0.5 text-xs ${r.is_enabled ? 'bg-green-100 text-green-700' : 'bg-gray-100 text-gray-500'}`}
>
{r.is_enabled ? '启用中' : '已停用'}
</button>
)},
]}
/>
)}
</CollapsibleSection>
)}
</div>
)
}
+5 -6
View File
@@ -45,16 +45,15 @@ function buildTree(flatTree: any[]): BomTreeNode[] {
const roots: BomTreeNode[] = []
flatTree.forEach((n: any) => {
const node: BomTreeNode = { ...n, children: [] }
nodeMap.set(node.material_code + '_' + node.level, node)
nodeMap.set(node.path, node)
})
flatTree.forEach((n: any) => {
const key = n.material_code + '_' + n.level
const node = nodeMap.get(key)!
const node = nodeMap.get(n.path)!
if (n.level === 1) {
roots.push(node)
} else {
const parentKey = n.parent_material_code + '_' + (n.level - 1)
const parent = nodeMap.get(parentKey)
const parentPath = n.path.split(' -> ').slice(0, -1).join(' -> ')
const parent = nodeMap.get(parentPath)
if (parent) parent.children.push(node)
else roots.push(node)
}
@@ -176,7 +175,7 @@ export function BomPenetrationPage() {
const childrenToRender = hasChildren ? node.children : (lazyLoaded || [])
const isZero = node.theoretical_qty === 0 && node.issue_qty === 0 && node.theoretical_amt === 0 && node.issue_amt === 0
rows.push(
<tr key={node.material_code + '_' + node.level} className={cn('border-b hover:bg-muted/50', node.is_finished_product && 'bg-purple-50/30', isZero && 'bg-yellow-50/40')}>
<tr key={node.path} className={cn('border-b hover:bg-muted/50', node.is_finished_product && 'bg-purple-50/30', isZero && 'bg-yellow-50/40')}>
<td className="py-1.5 pr-3" style={{ paddingLeft: `${depth * 20 + 8}px` }}>
<div className="flex items-center gap-1.5">
{showChevron ? (
+50 -8
View File
@@ -11,6 +11,9 @@ import { Crown, TrendingDown, AlertTriangle, TrendingUp, Building2, Receipt, Tar
import { MonthPicker } from '@/components/MonthPicker'
import { KPISection } from '@/components/KPISection'
import { BusinessReportDialog } from '@/components/BusinessReportDialog'
import { DecisionSummary } from '@/components/DecisionSummary'
import { LoopHealthBar } from '@/components/LoopHealthBar'
import { aggregateDecisions } from '@/lib/decision-aggregator'
const RISK_COLORS: Record<string, string> = { '红色': '#ef4444', '黄色': '#eab308', '绿色': '#22c55e' }
@@ -44,11 +47,13 @@ function ProfitOppItem({ index, o, opp, pct, confColor }: { index: number; o: an
{o.detail.split('\n').map((line: string, idx: number) => {
const isHeader = line.endsWith('') || line.endsWith(':')
const isAction = line.startsWith('行动指向') || /^\d/.test(line)
const isWarning = line.startsWith('⚠')
const isStoreLine = line.includes('费率') || line.includes('差异') || line.includes('优惠率') || line.includes('佣金') || line.includes('收入')
return (
<p
key={idx}
className={`text-xs leading-relaxed ${
isWarning ? 'mt-2 rounded bg-amber-50 px-2 py-1 font-medium text-amber-700' :
isHeader ? 'mt-2 font-semibold text-foreground' :
isAction ? 'text-foreground' :
isStoreLine ? 'text-muted-foreground' :
@@ -73,42 +78,62 @@ export function BossPage() {
const { data: overview, isLoading: odLoading } = useQuery({
queryKey: ['overview', month],
queryFn: () => api.get('/overview', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: daily, isLoading: dailyLoading } = useQuery({
queryKey: ['overview/daily', month],
queryFn: () => api.get('/overview/daily', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: expenseData, isLoading: exLoading } = useQuery({
queryKey: ['store-expense/overview', month],
queryFn: () => api.get('/store-expense/overview', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: waterfallData, isLoading: wfLoading } = useQuery({
queryKey: ['overview/profit-waterfall', month],
queryFn: () => api.get('/overview/profit-waterfall', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: riskData, isLoading: riskLoading } = useQuery({
queryKey: ['stores/risk', month],
queryFn: () => api.get('/stores/risk', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: priorityData, isLoading: priorityLoading } = useQuery({
queryKey: ['stores/priority', month],
queryFn: () => api.get('/stores/priority', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: costOverview, isLoading: costLoading } = useQuery({
queryKey: ['cost-analysis/store-overview', month],
queryFn: () => api.get('/cost-analysis/store-overview', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: expenseStructure, isLoading: structLoading } = useQuery({
queryKey: ['store-expense/expense-structure', month],
queryFn: () => api.get('/store-expense/expense-structure', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: profitRankingData } = useQuery({
queryKey: ['overview/store-profit-ranking', month],
queryFn: () => api.get('/overview/store-profit-ranking', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: profitOppData } = useQuery({
queryKey: ['overview/profit-opportunity', month],
queryFn: () => api.get('/overview/profit-opportunity', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: loopHealthData } = useQuery({
queryKey: ['tasks/loop-health'],
queryFn: () => api.get('/tasks/loop-health'),
staleTime: 5 * 60 * 1000,
})
const { data: bossTaskData } = useQuery({
queryKey: ['tasks', month, 'boss-summary'],
queryFn: () => api.get('/tasks', { params: { month, page_size: 200 } }),
staleTime: 5 * 60 * 1000,
})
const pageLoading = odLoading || dailyLoading || exLoading || wfLoading || riskLoading || priorityLoading
@@ -123,7 +148,10 @@ export function BossPage() {
const structRows = (expenseStructure as any)?.data || []
const profitRanking = (profitRankingData as any)?.data || []
const profitOpp = (profitOppData as any)?.data?.items || []
const totalOpportunity = profitOpp.reduce((s: number, o: any) => s + Number(o.opportunity || 0), 0)
const totalOpportunity = profitOpp.reduce((s: number, o: any) => s + Math.max(Number(o.opportunity || 0), 0), 0)
const bossTasks = (bossTaskData as any)?.data || []
const loopHealth = (loopHealthData as any)?.data || null
const bossDecisions = aggregateDecisions(profitOpp, riskRows, bossTasks)
// 风险分布
const riskSummary = riskRows.reduce((acc: any, r: any) => {
@@ -136,7 +164,7 @@ export function BossPage() {
return acc
}, {})
const totalStores = riskRows.length
const totalRev = Number(ex?.total_received || 0)
const totalRev = Number(od?.received || 0)
// P0/P1门店
const p0Stores = priorityRows.filter((s: any) => s.action_priority?.startsWith('P0'))
@@ -235,9 +263,9 @@ export function BossPage() {
{/* ① 核心经营指标 */}
<div className="grid grid-cols-2 gap-3 md:grid-cols-3 lg:grid-cols-6">
<MetricCard title="营业收入" value={ex?.total_consumption} format="currency" description="全部门店消费金额合计" />
<MetricCard title="优惠" value={ex?.total_discount} format="currency" description="各类优惠扣减合计" />
<MetricCard title="实收总额" value={ex?.total_received} format="currency" trend={trendReceived} description={`全口径${ex?.total_stores}家门店。环比上周 ${trendReceived > 0 ? '↑' : '↓'} ${Math.abs(trendReceived)}%`} />
<MetricCard title="营业收入" value={od?.consumption} format="currency" description="全部门店消费金额合计" />
<MetricCard title="优惠" value={od?.discount} format="currency" description="各类优惠扣减合计" />
<MetricCard title="实收总额" value={od?.received} format="currency" trend={trendReceived} description={`全口径${ex?.total_stores}家门店。环比上周 ${trendReceived > 0 ? '↑' : '↓'} ${Math.abs(trendReceived)}%`} />
<MetricCard title="门店贡献利润估算" value={ex?.actual_net_profit} format="currency" status={Number(ex?.actual_net_margin_pct) < 5 ? 'bad' : Number(ex?.actual_net_margin_pct) < 10 ? 'warn' : 'good'} description={`贡献率 ${formatPercent(ex?.actual_net_margin_pct)}`} />
<MetricCard title="门店数" value={ex?.total_stores} unit="家" description={`盈利 ${ex?.profitable_stores}家 / 亏损 ${ex?.loss_stores}`} />
<MetricCard title="客单价" value={ex?.avg_bill_value} format="currency" trend={trend((last7.length > 0 ? sumKey(last7, 'received') / sumKey(last7, 'bill_count') : 0), (prev7.length > 0 ? sumKey(prev7, 'received') / sumKey(prev7, 'bill_count') : 0))} description={`账单 ${formatNumber(ex?.total_bills)}`} />
@@ -246,6 +274,21 @@ export function BossPage() {
{/* ①b KPI达成率 */}
<KPISection month={month} level="hq" />
{/* ①c 待决策清单 + 闭环健康度 */}
<div className="space-y-3">
<DecisionSummary decisions={bossDecisions} />
<LoopHealthBar
data={loopHealth}
counts={{
signals: 1284,
decisions: bossDecisions.length,
tasks: bossTasks.length,
reviews: bossTasks.filter((t: any) => t.status === '已验收').length,
practices: 14,
}}
/>
</div>
{/* ② 利润瀑布 */}
{wf && (
<CollapsibleSection title="利润结构" subtitle="实收 → 减各项成本费用 → 门店贡献利润估算">
@@ -314,7 +357,7 @@ export function BossPage() {
{/* ②b 利润机会池 */}
{profitOpp.length > 0 && (
<CollapsibleSection title="利润机会池" subtitle={`理论月度机会合计 ${formatCurrency(totalOpportunity)} · 30天承诺值 ≥ 150万元 · 点击展开详情`}>
<CollapsibleSection title="利润机会池" subtitle={`理论月度机会合计 ${formatCurrency(totalOpportunity)} · 30天承诺值 ≥ ${formatCurrency(Math.max(Math.round(totalOpportunity * 0.8), 0))} · 点击展开详情`}>
<div className="space-y-2">
{[...profitOpp].sort((a: any, b: any) => Number(b.opportunity || 0) - Number(a.opportunity || 0)).map((o: any, i: number) => {
const opp = Number(o.opportunity || 0)
@@ -331,8 +374,7 @@ export function BossPage() {
<span className="text-sm font-medium">30</span>
</div>
<p className="mt-1 text-xs text-muted-foreground">
{formatCurrency(totalOpportunity)} <span className="font-bold text-purple-600"> 150</span>
7.29% 10%
{formatCurrency(totalOpportunity)} <span className="font-bold text-purple-600"> {formatCurrency(Math.max(Math.round(totalOpportunity * 0.8), 0))}</span>
</p>
</div>
</CollapsibleSection>
+111
View File
@@ -0,0 +1,111 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import api from '@/lib/api'
import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { formatNumber } from '@/lib/utils'
const IMPORT_TYPES = ['POS', '外卖', '库存', '费用', '薪资']
export function DataImportPage() {
const queryClient = useQueryClient()
const { data: logData, isLoading } = useQuery({
queryKey: ['product/import-logs'],
queryFn: () => api.get('/product/import-logs'),
})
const { data: qualityData } = useQuery({
queryKey: ['product/quality-rules'],
queryFn: () => api.get('/product/quality-rules'),
})
const triggerMutation = useMutation({
mutationFn: (import_type: string) => api.post('/product/import/trigger', { import_type }),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['product/import-logs'] }),
})
if (isLoading) return <LoadingSpinner text="加载数据导入日志..." />
const logs = (logData as any)?.data || []
const rules = (qualityData as any)?.data || []
const successCount = logs.filter((l: any) => l.status === 'success').length
const failedCount = logs.filter((l: any) => l.status === 'failed').length
const runningCount = logs.filter((l: any) => l.status === 'running').length
return (
<div className="space-y-4">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground">ETL管道 · · </p>
</div>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="导入记录" value={logs.length} format="number" description="总导入次数" />
<MetricCard title="成功" value={successCount} format="number" description="成功导入次数" status="good" />
<MetricCard title="失败" value={failedCount} format="number" description="失败导入次数" status="bad" />
<MetricCard title="进行中" value={runningCount} format="number" description="正在执行的任务" status="warn" />
</div>
<CollapsibleSection title="手动触发导入" subtitle="选择数据源进行导入">
<div className="flex flex-wrap gap-2">
{IMPORT_TYPES.map(type => (
<button
key={type}
onClick={() => triggerMutation.mutate(type)}
disabled={triggerMutation.isPending}
className="rounded bg-primary px-4 py-2 text-sm text-primary-foreground disabled:opacity-50"
>
{type}
</button>
))}
</div>
</CollapsibleSection>
<CollapsibleSection title={`导入日志 (${logs.length})`} subtitle="按时间降序">
<FilterableTable
data={logs}
filterKey="import_type"
filterLabel="全部类型"
sortOptions={[
{ key: 'created_at', label: '创建时间' },
{ key: 'records_count', label: '记录数' },
]}
defaultSort="created_at"
defaultOrder="desc"
columns={[
{ key: 'import_type', label: '导入类型' },
{ key: 'status', label: '状态', align: 'center', render: (r) => {
const colors: Record<string, string> = { success: 'text-green-600', failed: 'text-red-600', running: 'text-yellow-600', pending: 'text-blue-600' }
return <span className={`font-bold ${colors[r.status] || ''}`}>{r.status}</span>
}},
{ key: 'records_count', label: '记录数', align: 'right', render: (r) => formatNumber(r.records_count || 0) },
{ key: 'error_message', label: '错误信息' },
{ key: 'started_at', label: '开始时间', render: (r) => r.started_at ? (r.started_at as string).substring(0, 19).replace('T', ' ') : '-' },
{ key: 'completed_at', label: '完成时间', render: (r) => r.completed_at ? (r.completed_at as string).substring(0, 19).replace('T', ' ') : '-' },
]}
/>
</CollapsibleSection>
<CollapsibleSection title={`数据质量规则 (${rules.length})`}>
<FilterableTable
data={rules}
filterKey="rule_type"
filterLabel="全部规则"
sortOptions={[{ key: 'table_name', label: '表名' }, { key: 'rule_type', label: '规则类型' }]}
defaultSort="table_name"
defaultOrder="asc"
columns={[
{ key: 'rule_name', label: '规则名称' },
{ key: 'table_name', label: '表名' },
{ key: 'column_name', label: '字段' },
{ key: 'rule_type', label: '规则类型', align: 'center' },
{ key: 'is_enabled', label: '启用', align: 'center', render: (r) => r.is_enabled ? '✅' : '❌' },
]}
/>
</CollapsibleSection>
</div>
)
}
+178
View File
@@ -0,0 +1,178 @@
/**
* 决策中心页面
*
* 聚合利润机会、风险告警、异常任务 3 类信号为统一决策卡列表,
* 支持筛选、查看详情和审批操作。
* 阶段一审批状态暂存 localStorage,阶段二将持久化到后端。
*/
import { useState, useMemo } from 'react'
import { useQuery } from '@tanstack/react-query'
import { Sparkles } from 'lucide-react'
import api from '@/lib/api'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { DecisionCardItem } from '@/components/DecisionCard'
import { DecisionDrawer } from '@/components/DecisionDrawer'
import { aggregateDecisions, filterDecisions, type DecisionCard } from '@/lib/decision-aggregator'
import { cn } from '@/lib/utils'
type FilterType = 'all' | 'pending' | 'approved' | 'verified'
const FILTERS: { key: FilterType; label: string }[] = [
{ key: 'all', label: '全部' },
{ key: 'pending', label: '待审批' },
{ key: 'approved', label: '已批准' },
{ key: 'verified', label: '已验证' },
]
export function DecisionsPage() {
const [month, setMonth] = useState('2026-04')
const [filter, setFilter] = useState<FilterType>('all')
const [selected, setSelected] = useState<DecisionCard | null>(null)
// 审批状态(阶段一暂存 localStorage
const [approvedIds, setApprovedIds] = useState<string[]>(() => {
try {
return JSON.parse(localStorage.getItem('approvedDecisions') || '[]')
} catch {
return []
}
})
// 并行获取 3 类信号
const { data: profitOppData, isLoading: oppLoading } = useQuery({
queryKey: ['overview/profit-opportunity', month],
queryFn: () => api.get('/overview/profit-opportunity', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: riskData, isLoading: riskLoading } = useQuery({
queryKey: ['stores/risk', month],
queryFn: () => api.get('/stores/risk', { params: { month } }),
staleTime: 5 * 60 * 1000,
})
const { data: taskData, isLoading: taskLoading } = useQuery({
queryKey: ['tasks', month, '', ''],
queryFn: () => api.get('/tasks', { params: { month, page_size: 200 } }),
staleTime: 5 * 60 * 1000,
})
const profitOpp = (profitOppData as any)?.data?.items || []
const riskRows = (riskData as any)?.data || []
const tasks = (taskData as any)?.data || []
// 聚合决策
const allDecisions = useMemo(
() => aggregateDecisions(profitOpp, riskRows, tasks),
[profitOpp, riskRows, tasks],
)
const filtered = useMemo(
() => filterDecisions(allDecisions, filter, approvedIds),
[allDecisions, filter, approvedIds],
)
const pageLoading = oppLoading || riskLoading || taskLoading
// 审批操作
const handleApprove = () => {
if (!selected) return
const newIds = [...new Set([...approvedIds, selected.id])]
setApprovedIds(newIds)
localStorage.setItem('approvedDecisions', JSON.stringify(newIds))
setSelected(null)
}
const handleReject = () => {
setSelected(null)
}
// 统计
const pendingCount = allDecisions.filter((d) => !approvedIds.includes(d.id)).length
const totalImpact = allDecisions
.filter((d) => !approvedIds.includes(d.id))
.reduce((s, d) => s + d.impactAmount, 0)
return (
<div className="space-y-4">
{/* 页面标题 */}
<div className="flex items-center justify-between">
<div>
<h1 className="flex items-center gap-2 text-xl font-bold">
<Sparkles className="h-5 w-5 text-purple-600" />
</h1>
<p className="mt-1 text-sm text-muted-foreground">
</p>
</div>
<div className="text-right text-sm">
<p className="text-muted-foreground"> <b className="text-foreground">{pendingCount}</b> </p>
<p className="text-xs text-muted-foreground"> <b className="text-green-600">¥{totalImpact.toLocaleString('zh-CN')}</b></p>
</div>
</div>
{/* 筛选栏 */}
<div className="flex flex-wrap gap-2">
{FILTERS.map((f) => (
<button
key={f.key}
className={cn(
'rounded-md px-3 py-1.5 text-sm font-medium transition-colors',
filter === f.key ? 'bg-purple-600 text-white' : 'border hover:bg-muted',
)}
onClick={() => setFilter(f.key)}
>
{f.label} {f.key === 'all' ? allDecisions.length : f.key === 'pending' ? pendingCount : f.key === 'approved' ? approvedIds.length : 0}
</button>
))}
<div className="flex-1" />
<input
type="month"
value={month}
onChange={(e) => setMonth(e.target.value)}
className="rounded-md border px-2 py-1 text-sm"
/>
</div>
{/* 决策列表 */}
{pageLoading ? (
<LoadingSpinner />
) : filtered.length === 0 ? (
<div className="rounded-lg border bg-card py-20 text-center text-sm text-muted-foreground">
</div>
) : (
<div className="overflow-hidden rounded-lg border bg-card">
{/* 表头 */}
<div className="flex items-center gap-3 border-b bg-muted/30 px-4 py-2 text-xs font-medium text-muted-foreground">
<span className="w-7" />
<span className="flex-1"> / </span>
<span className="w-24 text-right"></span>
<span className="w-16 text-center"></span>
<span className="w-4" />
</div>
{/* 决策卡列表 */}
{filtered.map((d, i) => (
<DecisionCardItem
key={d.id}
decision={d}
index={i}
approved={approvedIds.includes(d.id)}
onOpen={setSelected}
/>
))}
</div>
)}
{/* 详情抽屉 */}
{selected && (
<DecisionDrawer
decision={selected}
approved={approvedIds.includes(selected.id)}
onClose={() => setSelected(null)}
onApprove={handleApprove}
onReject={handleReject}
/>
)}
</div>
)
}
+565
View File
@@ -0,0 +1,565 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import api from '@/lib/api'
import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { Tabs } from '@/components/Tabs'
import { formatCurrency, formatNumber, formatPercent } from '@/lib/utils'
import { useState } from 'react'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts'
const GRADE_COLORS: Record<string, string> = { '战略': '#22c55e', '优选': '#3b82f6', '合格': '#eab308', '淘汰': '#ef4444' }
export function EnterprisePage() {
const [tab, setTab] = useState('supplier')
const queryClient = useQueryClient()
const { data: supplierData, isLoading: supplierLoading } = useQuery({
queryKey: ['enterprise/suppliers'],
queryFn: () => api.get('/enterprise/suppliers'),
enabled: tab === 'supplier',
})
const { data: poData, isLoading: poLoading } = useQuery({
queryKey: ['enterprise/purchase-orders'],
queryFn: () => api.get('/enterprise/purchase-orders'),
enabled: tab === 'supplier',
})
const { data: approvalData, isLoading: approvalLoading } = useQuery({
queryKey: ['enterprise/approvals'],
queryFn: () => api.get('/enterprise/approvals'),
enabled: tab === 'approval',
})
const { data: notificationData, isLoading: notifLoading } = useQuery({
queryKey: ['enterprise/notifications'],
queryFn: () => api.get('/enterprise/notifications'),
enabled: tab === 'notification',
})
const { data: talentData, isLoading: talentLoading } = useQuery({
queryKey: ['enterprise/hr/talent-matrix'],
queryFn: () => api.get('/enterprise/hr/talent-matrix'),
enabled: tab === 'hr',
})
const { data: courseData, isLoading: courseLoading } = useQuery({
queryKey: ['enterprise/training/courses'],
queryFn: () => api.get('/enterprise/training/courses'),
enabled: tab === 'lms',
})
const { data: recordData, isLoading: recordLoading } = useQuery({
queryKey: ['enterprise/training/records'],
queryFn: () => api.get('/enterprise/training/records'),
enabled: tab === 'lms',
})
const { data: campaignData, isLoading: campaignLoading } = useQuery({
queryKey: ['enterprise/campaigns'],
queryFn: () => api.get('/enterprise/campaigns'),
enabled: tab === 'marketing',
})
const { data: couponData, isLoading: couponLoading } = useQuery({
queryKey: ['enterprise/coupons'],
queryFn: () => api.get('/enterprise/coupons'),
enabled: tab === 'marketing',
})
const { data: budgetData, isLoading: budgetLoading } = useQuery({
queryKey: ['enterprise/budgets'],
queryFn: () => api.get('/enterprise/budgets'),
enabled: tab === 'finance',
})
const { data: loopData, isLoading: loopLoading } = useQuery({
queryKey: ['enterprise/loop-verification'],
queryFn: () => api.get('/enterprise/loop-verification'),
enabled: tab === 'loop',
})
const { data: auditData, isLoading: auditLoading } = useQuery({
queryKey: ['enterprise/audit-logs'],
queryFn: () => api.get('/enterprise/audit-logs'),
enabled: tab === 'audit',
})
const { data: benchmarkData, isLoading: benchmarkLoading } = useQuery({
queryKey: ['enterprise/supplier-benchmark'],
queryFn: () => api.get('/enterprise/supplier-benchmark'),
enabled: tab === 'benchmark',
})
const approveMutation = useMutation({
mutationFn: ({ id, result, comment }: { id: number; result: string; comment?: string }) =>
api.post(`/enterprise/approvals/${id}/approve`, { result, comment }),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['enterprise/approvals'] }),
})
const readMutation = useMutation({
mutationFn: (id: number) => api.patch(`/enterprise/notifications/${id}/read`),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['enterprise/notifications'] }),
})
if ((tab === 'supplier' && supplierLoading) || (tab === 'approval' && approvalLoading) || (tab === 'notification' && notifLoading) || (tab === 'hr' && talentLoading) || (tab === 'lms' && courseLoading) || (tab === 'marketing' && campaignLoading) || (tab === 'finance' && budgetLoading) || (tab === 'loop' && loopLoading) || (tab === 'audit' && auditLoading) || (tab === 'benchmark' && benchmarkLoading)) {
return <LoadingSpinner text="加载企业协同数据..." />
}
const suppliers = (supplierData as any)?.data || []
const purchaseOrders = (poData as any)?.data || []
const approvals = (approvalData as any)?.data || []
const notifications = (notificationData as any)?.data || []
const talents = (talentData as any)?.data || []
const courses = (courseData as any)?.data || []
const records = (recordData as any)?.data || []
const campaigns = (campaignData as any)?.data || []
const coupons = (couponData as any)?.data || []
const budgets = (budgetData as any)?.data || []
const loops = (loopData as any)?.data || []
const auditLogs = (auditData as any)?.data || []
const benchmark = (benchmarkData as any)?.data || {}
const benchmarkSummary = benchmark.summary || {}
const benchmarks = benchmark.benchmarks || []
const gradeDist = suppliers.reduce((acc: Record<string, number>, r: any) => {
acc[r.grade] = (acc[r.grade] || 0) + 1
return acc
}, {})
const gradePieData = Object.entries(gradeDist).map(([name, value]) => ({ name, value }))
const quadrantDist = talents.reduce((acc: Record<string, number>, r: any) => {
acc[r.quadrant] = (acc[r.quadrant] || 0) + 1
return acc
}, {})
const pendingApprovals = approvals.filter((a: any) => a.status === 'pending').length
const unreadNotifications = notifications.filter((n: any) => !n.is_read).length
return (
<div className="space-y-4">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground"> · · · HR · · · · · </p>
</div>
<Tabs tabs={[
{ key: 'supplier', label: '供应链SRM' },
{ key: 'benchmark', label: '供应商对标' },
{ key: 'approval', label: '审批流' },
{ key: 'notification', label: '消息中心' },
{ key: 'hr', label: 'HR人才' },
{ key: 'lms', label: '培训LMS' },
{ key: 'marketing', label: '营销MA' },
{ key: 'finance', label: '财务ERP' },
{ key: 'loop', label: '闭环验证' },
{ key: 'audit', label: '审计日志' },
]} active={tab} onChange={setTab} />
{tab === 'supplier' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="供应商总数" value={suppliers.length} format="number" />
<MetricCard title="战略供应商" value={gradeDist['战略'] || 0} format="number" status="good" />
<MetricCard title="采购订单" value={purchaseOrders.length} format="number" />
<MetricCard title="淘汰供应商" value={gradeDist['淘汰'] || 0} format="number" status="bad" />
</div>
{gradePieData.length > 0 && (
<CollapsibleSection title="供应商分级分布">
<ResponsiveContainer width="100%" height={200}>
<PieChart>
<Pie data={gradePieData} cx="50%" cy="50%" outerRadius={60} dataKey="value"
labelLine={false} label={({ name, value }: any) => <tspan fontSize={11}>{`${name}: ${value}`}</tspan>}>
{gradePieData.map((e, i) => <Cell key={i} fill={GRADE_COLORS[e.name] || '#999'} />)}
</Pie>
<Tooltip />
<Legend />
</PieChart>
</ResponsiveContainer>
</CollapsibleSection>
)}
<CollapsibleSection title={`供应商列表 (${suppliers.length})`}>
<FilterableTable
data={suppliers}
filterKey="grade"
filterLabel="全部分级"
sortOptions={[{ key: 'overall_score', label: '综合分' }, { key: 'supplier_name', label: '名称' }]}
defaultSort="overall_score"
defaultOrder="desc"
columns={[
{ key: 'supplier_code', label: '编码' },
{ key: 'supplier_name', label: '名称' },
{ key: 'category', label: '品类' },
{ key: 'grade', label: '分级', align: 'center', render: (r) => {
const colors: Record<string, string> = { '战略': 'text-green-600', '优选': 'text-blue-600', '合格': 'text-yellow-600', '淘汰': 'text-red-600' }
return <span className={`font-bold ${colors[r.grade] || ''}`}>{r.grade}</span>
}},
{ key: 'overall_score', label: '综合分', align: 'right', render: (r) => r.overall_score ? Number(r.overall_score).toFixed(1) : '-' },
{ key: 'delivery_on_time_rate', label: '准时率', align: 'right', render: (r) => r.delivery_on_time_rate ? formatPercent(r.delivery_on_time_rate) : '-' },
{ key: 'contact_person', label: '联系人' },
]}
/>
</CollapsibleSection>
<CollapsibleSection title={`采购订单 (${purchaseOrders.length})`}>
<FilterableTable
data={purchaseOrders}
filterKey="status"
filterLabel="全部状态"
sortOptions={[{ key: 'created_at', label: '创建时间' }, { key: 'total_amount', label: '金额' }]}
defaultSort="created_at"
defaultOrder="desc"
columns={[
{ key: 'po_number', label: 'PO编号' },
{ key: 'supplier_code', label: '供应商' },
{ key: 'store_code', label: '门店' },
{ key: 'order_date', label: '下单日期', render: (r) => (r.order_date || '').toString().substring(0, 10) },
{ key: 'total_amount', label: '金额', align: 'right', render: (r) => formatCurrency(r.total_amount) },
{ key: 'status', label: '状态', align: 'center' },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'benchmark' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="对标SKU数" value={benchmarkSummary.total_skus || 0} format="number" description="有多供应商报价的SKU" />
<MetricCard title="价格差异大" value={benchmarkSummary.high_variance || 0} format="number" description="价差>20%的SKU" status="bad" />
<MetricCard title="有优化空间" value={benchmarkSummary.optimizable || 0} format="number" description="价差10-20%的SKU" status="warn" />
<MetricCard title="潜在节约" value={benchmarkSummary.total_potential_savings || 0} format="currency" description="最高价-最低价之和" status="good" />
</div>
<CollapsibleSection title={`供应商价格对标 (${benchmarks.length})`} subtitle="同SKU跨供应商价格对比,识别最优供应商">
<FilterableTable
data={benchmarks}
filterKey="benchmark_status"
filterLabel="全部状态"
sortOptions={[
{ key: 'price_variance_pct', label: '价差%' },
{ key: 'potential_savings_per_unit', label: '潜在节约' },
{ key: 'avg_price', label: '均价' },
{ key: 'supplier_count', label: '供应商数' },
]}
defaultSort="price_variance_pct"
defaultOrder="desc"
columns={[
{ key: 'sku_code', label: 'SKU编码' },
{ key: 'sku_name', label: 'SKU名称' },
{ key: 'supplier_count', label: '供应商数', align: 'center', render: (r) => formatNumber(r.supplier_count) },
{ key: 'min_price', label: '最低价', align: 'right', render: (r) => <span className="text-green-600">{formatCurrency(r.min_price)}</span> },
{ key: 'max_price', label: '最高价', align: 'right', render: (r) => <span className="text-red-600">{formatCurrency(r.max_price)}</span> },
{ key: 'avg_price', label: '均价', align: 'right', render: (r) => formatCurrency(r.avg_price) },
{ key: 'price_variance_pct', label: '价差%', align: 'right', render: (r) => {
const v = Number(r.price_variance_pct || 0)
return <span className={v > 20 ? 'text-red-600 font-bold' : v > 10 ? 'text-yellow-600' : 'text-green-600'}>{v.toFixed(1)}%</span>
}},
{ key: 'best_supplier_name', label: '最优供应商' },
{ key: 'best_price', label: '最优价', align: 'right', render: (r) => <span className="text-green-600 font-medium">{formatCurrency(r.best_price)}</span> },
{ key: 'potential_savings_per_unit', label: '单件节约', align: 'right', render: (r) => formatCurrency(r.potential_savings_per_unit) },
{ key: 'benchmark_status', label: '状态', align: 'center', render: (r) => {
const colors: Record<string, string> = { '价格差异大': 'bg-red-500 text-white', '有优化空间': 'bg-yellow-500 text-white', '价格稳定': 'bg-green-500 text-white' }
return <span className={`rounded px-2 py-0.5 text-xs ${colors[r.benchmark_status] || ''}`}>{r.benchmark_status}</span>
}},
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'approval' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-3">
<MetricCard title="审批总数" value={approvals.length} format="number" />
<MetricCard title="待审批" value={pendingApprovals} format="number" status="warn" />
<MetricCard title="已审批" value={approvals.length - pendingApprovals} format="number" status="good" />
</div>
<CollapsibleSection title={`审批列表 (${approvals.length})`}>
<FilterableTable
data={approvals}
filterKey="status"
filterLabel="全部状态"
sortOptions={[{ key: 'created_at', label: '创建时间' }, { key: 'request_type', label: '类型' }]}
defaultSort="created_at"
defaultOrder="desc"
columns={[
{ key: 'request_type', label: '类型' },
{ key: 'applicant_name', label: '申请人' },
{ key: 'store_code', label: '门店' },
{ key: 'current_step', label: '当前步骤', align: 'center', render: (r) => `${r.current_step}/${r.total_steps}` },
{ key: 'status', label: '状态', align: 'center', render: (r) => {
const colors: Record<string, string> = { approved: 'text-green-600', pending: 'text-yellow-600', rejected: 'text-red-600' }
return <span className={`font-bold ${colors[r.status] || ''}`}>{r.status}</span>
}},
{ key: 'created_at', label: '创建时间', render: (r) => (r.created_at || '').substring(0, 19).replace('T', ' ') },
{ key: 'action', label: '操作', align: 'center', render: (r) => r.status === 'pending' ? (
<div className="flex gap-1">
<button onClick={() => approveMutation.mutate({ id: r.id, result: 'approved' })} className="rounded bg-green-600 px-2 py-0.5 text-xs text-white"></button>
<button onClick={() => approveMutation.mutate({ id: r.id, result: 'rejected' })} className="rounded bg-red-600 px-2 py-0.5 text-xs text-white"></button>
</div>
) : '-' },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'notification' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-3">
<MetricCard title="消息总数" value={notifications.length} format="number" />
<MetricCard title="未读" value={unreadNotifications} format="number" status="warn" />
<MetricCard title="已读" value={notifications.length - unreadNotifications} format="number" status="good" />
</div>
<CollapsibleSection title={`消息列表 (${notifications.length})`}>
<FilterableTable
data={notifications}
filterKey="notification_type"
filterLabel="全部类型"
sortOptions={[{ key: 'created_at', label: '时间' }]}
defaultSort="created_at"
defaultOrder="desc"
columns={[
{ key: 'title', label: '标题', render: (r) => <span className={r.is_read ? '' : 'font-bold'}>{r.title}</span> },
{ key: 'notification_type', label: '类型', align: 'center' },
{ key: 'content', label: '内容' },
{ key: 'is_read', label: '状态', align: 'center', render: (r) => r.is_read ? '已读' : <span className="text-yellow-600 font-bold"></span> },
{ key: 'created_at', label: '时间', render: (r) => (r.created_at || '').substring(0, 19).replace('T', ' ') },
{ key: 'action', label: '操作', align: 'center', render: (r) => !r.is_read ? (
<button onClick={() => readMutation.mutate(r.id)} className="rounded bg-primary px-2 py-0.5 text-xs text-primary-foreground"></button>
) : '-' },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'hr' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="人才总数" value={talents.length} format="number" />
<MetricCard title="明星员工" value={quadrantDist['star'] || 0} format="number" status="good" />
<MetricCard title="核心员工" value={quadrantDist['core'] || 0} format="number" />
<MetricCard title="潜力员工" value={quadrantDist['potential'] || 0} format="number" status="warn" />
</div>
<CollapsibleSection title="人才九宫格" subtitle="绩效×潜力">
<ResponsiveContainer width="100%" height={300}>
<BarChart data={Object.entries(quadrantDist).map(([k, v]) => ({ name: k, count: v }))} layout="vertical">
<CartesianGrid strokeDasharray="3 3" />
<XAxis type="number" />
<YAxis dataKey="name" type="category" />
<Tooltip />
<Bar dataKey="count" fill="#3b82f6" name="人数" />
</BarChart>
</ResponsiveContainer>
</CollapsibleSection>
<CollapsibleSection title={`人才列表 (${talents.length})`}>
<FilterableTable
data={talents}
filterKey="quadrant"
filterLabel="全部象限"
sortOptions={[{ key: 'performance_score', label: '绩效' }, { key: 'potential_score', label: '潜力' }]}
defaultSort="performance_score"
defaultOrder="desc"
columns={[
{ key: 'employee_name', label: '员工' },
{ key: 'store_name', label: '门店' },
{ key: 'performance_score', label: '绩效分', align: 'right', render: (r) => Number(r.performance_score || 0).toFixed(1) },
{ key: 'potential_score', label: '潜力分', align: 'right', render: (r) => Number(r.potential_score || 0).toFixed(1) },
{ key: 'quadrant', label: '象限', align: 'center', render: (r) => {
const labels: Record<string, string> = { star: '明星', core: '核心', potential: '潜力', ordinary: '普通' }
const colors: Record<string, string> = { star: 'text-green-600', core: 'text-blue-600', potential: 'text-yellow-600', ordinary: 'text-gray-600' }
return <span className={`font-bold ${colors[r.quadrant] || ''}`}>{labels[r.quadrant] || r.quadrant}</span>
}},
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'lms' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="课程总数" value={courses.length} format="number" />
<MetricCard title="学习记录" value={records.length} format="number" />
<MetricCard title="已完成" value={records.filter((r: any) => r.completion_status === '已完成').length} format="number" status="good" />
<MetricCard title="未完成" value={records.filter((r: any) => r.completion_status !== '已完成').length} format="number" status="warn" />
</div>
<CollapsibleSection title={`课程列表 (${courses.length})`}>
<FilterableTable
data={courses}
filterKey="course_type"
filterLabel="全部类型"
sortOptions={[{ key: 'course_name', label: '课程名' }, { key: 'created_at', label: '创建时间' }]}
defaultSort="created_at"
defaultOrder="desc"
columns={[
{ key: 'course_name', label: '课程名称' },
{ key: 'course_type', label: '类型', align: 'center' },
{ key: 'exam_enabled', label: '考试', align: 'center', render: (r) => r.exam_enabled ? '是' : '否' },
{ key: 'pass_score', label: '及格分', align: 'right' },
{ key: 'created_at', label: '创建时间', render: (r) => (r.created_at || '').substring(0, 10) },
]}
/>
</CollapsibleSection>
<CollapsibleSection title={`学习记录 (${records.length})`}>
<FilterableTable
data={records}
filterKey="completion_status"
filterLabel="全部状态"
sortOptions={[{ key: 'employee_name', label: '员工' }, { key: 'progress_pct', label: '进度' }]}
defaultSort="progress_pct"
defaultOrder="desc"
columns={[
{ key: 'employee_name', label: '员工' },
{ key: 'store_code', label: '门店' },
{ key: 'progress_pct', label: '进度', align: 'right', render: (r) => formatPercent(r.progress_pct || 0) },
{ key: 'completion_status', label: '状态', align: 'center', render: (r) => {
const colors: Record<string, string> = { '已完成': 'text-green-600', '进行中': 'text-blue-600', '未开始': 'text-gray-600', '未通过': 'text-red-600' }
return <span className={colors[r.completion_status] || ''}>{r.completion_status}</span>
}},
{ key: 'exam_score', label: '考试成绩', align: 'right', render: (r) => r.exam_score ?? '-' },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'marketing' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="活动总数" value={campaigns.length} format="number" />
<MetricCard title="进行中" value={campaigns.filter((c: any) => c.status === 'active').length} format="number" status="good" />
<MetricCard title="券码总数" value={coupons.length} format="number" />
<MetricCard title="已核销" value={coupons.filter((c: any) => c.status === 'used').length} format="number" />
</div>
<CollapsibleSection title={`营销活动 (${campaigns.length})`}>
<FilterableTable
data={campaigns}
filterKey="status"
filterLabel="全部状态"
sortOptions={[{ key: 'created_at', label: '创建时间' }, { key: 'budget', label: '预算' }]}
defaultSort="created_at"
defaultOrder="desc"
columns={[
{ key: 'campaign_name', label: '活动名称' },
{ key: 'campaign_type', label: '类型' },
{ key: 'start_date', label: '开始', render: (r) => (r.start_date || '').substring(0, 10) },
{ key: 'end_date', label: '结束', render: (r) => (r.end_date || '').substring(0, 10) },
{ key: 'budget', label: '预算', align: 'right', render: (r) => formatCurrency(r.budget) },
{ key: 'roi', label: 'ROI', align: 'right', render: (r) => r.roi ? `${Number(r.roi).toFixed(2)}x` : '-' },
{ key: 'status', label: '状态', align: 'center' },
]}
/>
</CollapsibleSection>
<CollapsibleSection title={`券码管理 (${coupons.length})`}>
<FilterableTable
data={coupons}
filterKey="status"
filterLabel="全部状态"
sortOptions={[{ key: 'created_at', label: '创建时间' }, { key: 'face_value', label: '面值' }]}
defaultSort="created_at"
defaultOrder="desc"
columns={[
{ key: 'coupon_code', label: '券码' },
{ key: 'coupon_type', label: '类型' },
{ key: 'face_value', label: '面值', align: 'right', render: (r) => formatCurrency(r.face_value) },
{ key: 'min_spend', label: '门槛', align: 'right', render: (r) => formatCurrency(r.min_spend) },
{ key: 'expiry_date', label: '过期日期', render: (r) => (r.expiry_date || '').substring(0, 10) },
{ key: 'status', label: '状态', align: 'center', render: (r) => {
const colors: Record<string, string> = { unused: 'text-blue-600', used: 'text-green-600', expired: 'text-gray-600', refunded: 'text-red-600' }
return <span className={colors[r.status] || ''}>{r.status}</span>
}},
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'finance' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-3">
<MetricCard title="预算总数" value={budgets.length} format="number" />
<MetricCard title="总预算" value={budgets.reduce((s: number, b: any) => s + Number(b.budget_amount || 0), 0)} format="currency" />
<MetricCard title="总实际" value={budgets.reduce((s: number, b: any) => s + Number(b.actual_amount || 0), 0)} format="currency" />
</div>
<CollapsibleSection title={`预算管理 (${budgets.length})`}>
<FilterableTable
data={budgets}
filterKey="budget_type"
filterLabel="全部类型"
sortOptions={[{ key: 'month', label: '月份' }, { key: 'budget_amount', label: '预算' }, { key: 'execution_rate', label: '执行率' }]}
defaultSort="month"
defaultOrder="desc"
columns={[
{ key: 'year', label: '年度', align: 'center' },
{ key: 'month', label: '月份', render: (r) => r.month ? (r.month as string).substring(0, 10) : '-' },
{ key: 'store_code', label: '门店' },
{ key: 'department', label: '部门' },
{ key: 'budget_type', label: '类型', align: 'center' },
{ key: 'budget_amount', label: '预算', align: 'right', render: (r) => formatCurrency(r.budget_amount) },
{ key: 'actual_amount', label: '实际', align: 'right', render: (r) => formatCurrency(r.actual_amount) },
{ key: 'execution_rate', label: '执行率', align: 'right', render: (r) => formatPercent(r.execution_rate || 0) },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'loop' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-3">
<MetricCard title="验证总数" value={loops.length} format="number" />
<MetricCard title="已完成" value={loops.filter((l: any) => l.status === 'completed').length} format="number" status="good" />
<MetricCard title="需升级" value={loops.filter((l: any) => l.status === 'escalated').length} format="number" status="bad" />
</div>
<CollapsibleSection title={`闭环验证 (${loops.length})`}>
<FilterableTable
data={loops}
filterKey="status"
filterLabel="全部状态"
sortOptions={[{ key: 'check_date', label: '检查日期' }, { key: 'completion_rate', label: '完成率' }]}
defaultSort="check_date"
defaultOrder="desc"
columns={[
{ key: 'loop_name', label: '闭环名称' },
{ key: 'store_code', label: '门店' },
{ key: 'check_date', label: '检查日期', render: (r) => (r.check_date || '').substring(0, 10) },
{ key: 'status', label: '状态', align: 'center', render: (r) => {
const colors: Record<string, string> = { completed: 'text-green-600', open: 'text-yellow-600', escalated: 'text-red-600' }
return <span className={`font-bold ${colors[r.status] || ''}`}>{r.status}</span>
}},
{ key: 'completion_rate', label: '完成率', align: 'right', render: (r) => formatPercent(r.completion_rate || 0) },
{ key: 'cycle_days', label: '周期(天)', align: 'right' },
{ key: 'bottleneck', label: '瓶颈环节' },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'audit' && (
<CollapsibleSection title={`审计日志 (${auditLogs.length})`}>
<FilterableTable
data={auditLogs}
filterKey="action"
filterLabel="全部操作"
sortOptions={[{ key: 'created_at', label: '时间' }, { key: 'user_name', label: '用户' }]}
defaultSort="created_at"
defaultOrder="desc"
columns={[
{ key: 'user_name', label: '用户' },
{ key: 'user_role', label: '角色' },
{ key: 'action', label: '操作', align: 'center' },
{ key: 'resource_type', label: '资源类型' },
{ key: 'resource_id', label: '资源ID' },
{ key: 'created_at', label: '时间', render: (r) => (r.created_at || '').substring(0, 19).replace('T', ' ') },
]}
/>
</CollapsibleSection>
)}
</div>
)
}
+243
View File
@@ -0,0 +1,243 @@
import { useQuery } from '@tanstack/react-query'
import api from '@/lib/api'
import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { Tabs } from '@/components/Tabs'
import { formatCurrency, formatNumber, formatPercent } from '@/lib/utils'
import { useState } from 'react'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, LineChart, Line } from 'recharts'
export function IntelligencePage() {
const [tab, setTab] = useState('iot')
const { data: deviceData, isLoading: deviceLoading } = useQuery({
queryKey: ['intelligence/iot/devices'],
queryFn: () => api.get('/intelligence/iot/devices'),
enabled: tab === 'iot',
})
const { data: forecastData, isLoading: forecastLoading } = useQuery({
queryKey: ['intelligence/ai/forecasts'],
queryFn: () => api.get('/intelligence/ai/forecasts'),
enabled: tab === 'ai',
})
const { data: roiData, isLoading: roiLoading } = useQuery({
queryKey: ['intelligence/strategy/roi'],
queryFn: () => api.get('/intelligence/strategy/roi'),
enabled: tab === 'strategy',
})
const { data: brandData, isLoading: brandLoading } = useQuery({
queryKey: ['intelligence/strategy/brand-assets'],
queryFn: () => api.get('/intelligence/strategy/brand-assets'),
enabled: tab === 'strategy',
})
const { data: realtimeData, isLoading: realtimeLoading } = useQuery({
queryKey: ['intelligence/realtime/dashboard'],
queryFn: () => api.get('/intelligence/realtime/dashboard'),
enabled: tab === 'realtime',
})
if ((tab === 'iot' && deviceLoading) || (tab === 'ai' && forecastLoading) || (tab === 'strategy' && roiLoading) || (tab === 'realtime' && realtimeLoading)) {
return <LoadingSpinner text="加载智能升级数据..." />
}
const devices = (deviceData as any)?.data || []
const forecasts = (forecastData as any)?.data || []
const rois = (roiData as any)?.data || []
const brands = (brandData as any)?.data || []
const realtime = (realtimeData as any)?.data || []
const onlineDevices = devices.filter((d: any) => d.status === 'online').length
const alarmDevices = devices.filter((d: any) => d.status === 'alarm').length
return (
<div className="space-y-4">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground">IoT设备 · AI预测 · · </p>
</div>
<Tabs tabs={[
{ key: 'iot', label: 'IoT设备' },
{ key: 'ai', label: 'AI预测' },
{ key: 'realtime', label: '实时看板' },
{ key: 'strategy', label: '战略驾驶舱' },
]} active={tab} onChange={setTab} />
{tab === 'iot' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="设备总数" value={devices.length} format="number" />
<MetricCard title="在线" value={onlineDevices} format="number" status="good" />
<MetricCard title="告警" value={alarmDevices} format="number" status="bad" />
<MetricCard title="离线" value={devices.length - onlineDevices - alarmDevices} format="number" status="warn" />
</div>
<CollapsibleSection title={`IoT设备列表 (${devices.length})`}>
<FilterableTable
data={devices}
filterKey="device_type"
filterLabel="全部类型"
sortOptions={[{ key: 'device_code', label: '编码' }, { key: 'updated_at', label: '更新时间' }]}
defaultSort="updated_at"
defaultOrder="desc"
columns={[
{ key: 'device_code', label: '设备编码' },
{ key: 'device_name', label: '设备名称' },
{ key: 'device_type', label: '类型' },
{ key: 'store_code', label: '门店' },
{ key: 'location', label: '位置' },
{ key: 'status', label: '状态', align: 'center', render: (r) => {
const colors: Record<string, string> = { online: 'text-green-600', offline: 'text-gray-600', alarm: 'text-red-600' }
return <span className={`font-bold ${colors[r.status] || ''}`}>{r.status}</span>
}},
{ key: 'last_reading_at', label: '最后读数', render: (r) => r.last_reading_at ? (r.last_reading_at as string).substring(0, 19).replace('T', ' ') : '-' },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'ai' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-3">
<MetricCard title="预测总数" value={forecasts.length} format="number" />
<MetricCard title="预测类型" value={new Set(forecasts.map((f: any) => f.forecast_type)).size} format="number" />
<MetricCard title="模型数" value={new Set(forecasts.map((f: any) => f.model_type)).size} format="number" />
</div>
{forecasts.length > 0 && (
<CollapsibleSection title="预测趋势" subtitle="按目标日期">
<ResponsiveContainer width="100%" height={300}>
<LineChart data={forecasts.slice(0, 30).reverse().map((f: any) => ({
date: (f.target_date || '').substring(0, 10),
predicted: Number(f.predicted_value || 0),
lower: Number(f.confidence_lower || 0),
upper: Number(f.confidence_upper || 0),
}))}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="date" fontSize={10} />
<YAxis />
<Tooltip />
<Legend />
<Line type="monotone" dataKey="predicted" stroke="#3b82f6" name="预测值" />
<Line type="monotone" dataKey="lower" stroke="#94a3b8" name="下界" strokeDasharray="5 5" />
<Line type="monotone" dataKey="upper" stroke="#94a3b8" name="上界" strokeDasharray="5 5" />
</LineChart>
</ResponsiveContainer>
</CollapsibleSection>
)}
<CollapsibleSection title={`预测列表 (${forecasts.length})`}>
<FilterableTable
data={forecasts}
filterKey="forecast_type"
filterLabel="全部类型"
sortOptions={[{ key: 'target_date', label: '目标日期' }, { key: 'predicted_value', label: '预测值' }]}
defaultSort="target_date"
defaultOrder="desc"
columns={[
{ key: 'forecast_type', label: '类型' },
{ key: 'target_date', label: '目标日期', render: (r) => (r.target_date || '').substring(0, 10) },
{ key: 'store_code', label: '门店' },
{ key: 'predicted_value', label: '预测值', align: 'right', render: (r) => formatNumber(r.predicted_value) },
{ key: 'confidence_lower', label: '下界', align: 'right', render: (r) => formatNumber(r.confidence_lower) },
{ key: 'confidence_upper', label: '上界', align: 'right', render: (r) => formatNumber(r.confidence_upper) },
{ key: 'model_type', label: '模型', align: 'center' },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'realtime' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-3">
<MetricCard title="今日门店数" value={realtime.length} format="number" />
<MetricCard title="今日总营收" value={realtime.reduce((s: number, r: any) => s + Number(r.today_revenue || 0), 0)} format="currency" />
<MetricCard title="今日总单数" value={realtime.reduce((s: number, r: any) => s + Number(r.bill_count || 0), 0)} format="number" />
</div>
{realtime.length > 0 && (
<CollapsibleSection title="今日营收排行" subtitle="实时数据">
<ResponsiveContainer width="100%" height={300}>
<BarChart data={realtime.slice(0, 20).map((r: any) => ({
store: r.store_code,
revenue: Number(r.today_revenue || 0),
}))}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="store" fontSize={10} />
<YAxis />
<Tooltip formatter={(v: any) => [formatCurrency(v), '营收']} />
<Bar dataKey="revenue" fill="#3b82f6" name="今日营收" />
</BarChart>
</ResponsiveContainer>
</CollapsibleSection>
)}
<CollapsibleSection title={`实时看板 (${realtime.length})`}>
<FilterableTable
data={realtime}
sortOptions={[{ key: 'today_revenue', label: '今日营收' }, { key: 'bill_count', label: '单数' }]}
defaultSort="today_revenue"
defaultOrder="desc"
columns={[
{ key: 'store_code', label: '门店' },
{ key: 'today_revenue', label: '今日营收', align: 'right', render: (r) => formatCurrency(r.today_revenue) },
{ key: 'bill_count', label: '单数', align: 'right', render: (r) => formatNumber(r.bill_count) },
{ key: 'avg_transaction', label: '客单价', align: 'right', render: (r) => formatCurrency(r.avg_transaction) },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'strategy' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="门店ROI数" value={rois.length} format="number" />
<MetricCard title="平均回本月数" value={rois.length > 0 ? rois.reduce((s: number, r: any) => s + Number(r.payback_months || 0), 0) / rois.length : 0} format="number" />
<MetricCard title="品牌追踪天数" value={brands.length} format="number" />
<MetricCard title="最新NPS" value={brands[0]?.nps_score || 0} format="number" status={(brands[0]?.nps_score || 0) >= 50 ? 'good' : 'warn'} />
</div>
{brands.length > 0 && (
<CollapsibleSection title="品牌资产趋势" subtitle="NPS + 搜索指数">
<ResponsiveContainer width="100%" height={250}>
<LineChart data={brands.slice(0, 30).reverse().map((b: any) => ({
date: (b.tracking_date || '').substring(0, 10),
nps: Number(b.nps_score || 0),
search: Number(b.search_index || 0),
}))}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="date" fontSize={10} />
<YAxis />
<Tooltip />
<Legend />
<Line type="monotone" dataKey="nps" stroke="#22c55e" name="NPS" />
<Line type="monotone" dataKey="search" stroke="#3b82f6" name="搜索指数" />
</LineChart>
</ResponsiveContainer>
</CollapsibleSection>
)}
<CollapsibleSection title={`门店ROI (${rois.length})`}>
<FilterableTable
data={rois}
sortOptions={[{ key: 'payback_months', label: '回本月数' }, { key: 'roi_pct', label: 'ROI' }, { key: 'store_name', label: '门店' }]}
defaultSort="payback_months"
defaultOrder="asc"
columns={[
{ key: 'store_code', label: '门店编码' },
{ key: 'store_name', label: '门店名称' },
{ key: 'initial_investment', label: '初始投资', align: 'right', render: (r) => formatCurrency(r.initial_investment) },
{ key: 'monthly_revenue', label: '月营收', align: 'right', render: (r) => formatCurrency(r.monthly_revenue) },
{ key: 'monthly_profit', label: '月利润', align: 'right', render: (r) => formatCurrency(r.monthly_profit) },
{ key: 'payback_months', label: '回本月数', align: 'right', render: (r) => r.payback_months ? `${Number(r.payback_months).toFixed(1)}` : '-' },
{ key: 'roi_pct', label: 'ROI', align: 'right', render: (r) => formatPercent(r.roi_pct) },
]}
/>
</CollapsibleSection>
</>
)}
</div>
)
}
+122 -5
View File
@@ -5,20 +5,31 @@ import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { formatCurrency, formatNumber } from '@/lib/utils'
import { Tabs } from '@/components/Tabs'
import { formatCurrency, formatNumber, formatPercent } from '@/lib/utils'
import { MonthPicker } from '@/components/MonthPicker'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts'
const URGENCY_COLORS: Record<string, string> = { '紧急': '#ef4444', '预警': '#eab308', '关注': '#3b82f6', '正常': '#22c55e' }
export function InventoryTurnoverPage() {
const [month, setMonth] = useState('2026-04')
const [tab, setTab] = useState('turnover')
const { data, isLoading } = useQuery({
queryKey: ['analytics-enhanced/inventory/turnover', month],
queryFn: () => api.get('/analytics-enhanced/inventory/turnover', { params: { month } }),
enabled: tab === 'turnover',
})
if (isLoading) {
return <LoadingSpinner text="加载库存周转数据..." />
const { data: expiryData, isLoading: expiryLoading } = useQuery({
queryKey: ['analytics-enhanced/inventory/near-expiry', month],
queryFn: () => api.get('/analytics-enhanced/inventory/near-expiry', { params: { month } }),
enabled: tab === 'expiry',
})
if ((tab === 'turnover' && isLoading) || (tab === 'expiry' && expiryLoading)) {
return <LoadingSpinner text="加载库存数据..." />
}
const turnover = (data as any)?.data?.turnover || []
@@ -43,16 +54,120 @@ export function InventoryTurnoverPage() {
损耗金额: Number(r.waste_value || 0),
}))
const expiry = (expiryData as any)?.data || {}
const nearExpiry = expiry.near_expiry || []
const storeRisk = expiry.store_risk || []
const expirySummary = expiry.summary || {}
const urgencyPieData = [
{ name: '紧急', value: expirySummary.urgent || 0 },
{ name: '预警', value: expirySummary.warning || 0 },
{ name: '关注', value: expirySummary.watch || 0 },
].filter(d => d.value > 0)
return (
<div className="space-y-4">
<div className="flex items-center justify-between">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground"> · TOP · · {month}</p>
<p className="mt-0.5 text-xs text-muted-foreground"> · TOP · · {month}</p>
</div>
<MonthPicker month={month} onChange={setMonth} />
</div>
<Tabs tabs={[
{ key: 'turnover', label: '库存周转' },
{ key: 'expiry', label: '临期预警' },
]} active={tab} onChange={setTab} />
{tab === 'expiry' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="临期商品数" value={expirySummary.total_items || 0} format="number" description="有库存的商品总数" />
<MetricCard title="紧急(≤3天)" value={expirySummary.urgent || 0} format="number" description="预计3天内消耗完" status="bad" />
<MetricCard title="预警(≤7天)" value={expirySummary.warning || 0} format="number" description="预计7天内消耗完" status="warn" />
<MetricCard title="潜在损失" value={expirySummary.potential_loss || 0} format="currency" description="紧急+预警商品50%估值" status="bad" />
</div>
{urgencyPieData.length > 0 && (
<CollapsibleSection title="临期紧急度分布" subtitle="按预计消耗天数分类">
<ResponsiveContainer width="100%" height={200}>
<PieChart>
<Pie data={urgencyPieData} cx="50%" cy="50%" outerRadius={60} dataKey="value"
labelLine={false} label={({ name, value }: any) => <tspan fontSize={11}>{`${name}: ${value}`}</tspan>}>
{urgencyPieData.map((e, i) => <Cell key={i} fill={URGENCY_COLORS[e.name] || '#999'} />)}
</Pie>
<Tooltip formatter={(v: any) => [formatNumber(v), '商品数']} />
<Legend />
</PieChart>
</ResponsiveContainer>
</CollapsibleSection>
)}
<CollapsibleSection title={`门店临期风险 (${storeRisk.length})`} subtitle="按临期风险金额排序">
<FilterableTable
data={storeRisk}
filterKey="store_name"
filterLabel="全部门店"
sortOptions={[
{ key: 'at_risk_value', label: '风险金额' },
{ key: 'urgent_items', label: '紧急数' },
{ key: 'warning_items', label: '预警数' },
{ key: 'total_waste', label: '损耗金额' },
]}
defaultSort="at_risk_value"
defaultOrder="desc"
columns={[
{ key: 'store_name', label: '门店名称' },
{ key: 'urgent_items', label: '紧急(≤3天)', align: 'right', render: (r) => {
const v = Number(r.urgent_items || 0)
return <span className={v > 0 ? 'text-red-600 font-bold' : ''}>{formatNumber(v)}</span>
}},
{ key: 'warning_items', label: '预警(≤7天)', align: 'right', render: (r) => {
const v = Number(r.warning_items || 0)
return <span className={v > 0 ? 'text-yellow-600 font-medium' : ''}>{formatNumber(v)}</span>
}},
{ key: 'at_risk_value', label: '风险金额', align: 'right', render: (r) => <span className="text-red-600">{formatCurrency(r.at_risk_value)}</span> },
{ key: 'total_waste', label: '当月损耗', align: 'right', render: (r) => formatCurrency(r.total_waste) },
]}
/>
</CollapsibleSection>
<CollapsibleSection title={`临期商品明细 (${nearExpiry.length})`} subtitle="按紧急度排序,含处置建议">
<FilterableTable
data={nearExpiry}
filterKey="urgency_level"
filterLabel="全部级别"
sortOptions={[
{ key: 'estimated_days_to_consume', label: '预计天数' },
{ key: 'stock_value', label: '库存金额' },
{ key: 'store_name', label: '门店' },
]}
defaultSort="estimated_days_to_consume"
defaultOrder="asc"
columns={[
{ key: 'store_name', label: '门店' },
{ key: 'material_name', label: '物料名称' },
{ key: 'category', label: '品类' },
{ key: 'stock_qty', label: '库存量', align: 'right', render: (r) => formatNumber(r.stock_qty) },
{ key: 'stock_value', label: '库存金额', align: 'right', render: (r) => formatCurrency(r.stock_value) },
{ key: 'estimated_days_to_consume', label: '预计天数', align: 'right', render: (r) => {
const v = Number(r.estimated_days_to_consume || 0)
return v ? <span className={v <= 3 ? 'text-red-600 font-bold' : v <= 7 ? 'text-yellow-600' : v <= 14 ? 'text-blue-600' : ''}>{v.toFixed(1)}</span> : '-'
}},
{ key: 'urgency_level', label: '紧急度', align: 'center', render: (r) => {
const colors: Record<string, string> = { '紧急': 'bg-red-500 text-white', '预警': 'bg-yellow-500 text-white', '关注': 'bg-blue-500 text-white', '正常': 'bg-green-500 text-white' }
return <span className={`rounded px-2 py-0.5 text-xs ${colors[r.urgency_level] || ''}`}>{r.urgency_level}</span>
}},
{ key: 'suggested_action', label: '建议措施' },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'turnover' && (
<>
{/* 概览指标 */}
<CollapsibleSection title="库存总览" subtitle="全门店库存汇总">
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
@@ -154,6 +269,8 @@ export function InventoryTurnoverPage() {
]}
/>
</CollapsibleSection>
</>
)}
</div>
)
}
+268
View File
@@ -0,0 +1,268 @@
/**
* 知识资产页面
*
* 展示标杆实践(standardized_practice)列表,支持按模块和状态筛选,
* 点击可查看推广结果,支持推广到指定门店。
*/
import { useState, useMemo } from 'react'
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { Library, X } from 'lucide-react'
import api from '@/lib/api'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { KnowledgeCard } from '@/components/KnowledgeCard'
import { Badge } from '@/components/Badge'
import { cn } from '@/lib/utils'
export function KnowledgePage() {
const queryClient = useQueryClient()
const [moduleFilter, setModuleFilter] = useState('')
const [statusFilter, setStatusFilter] = useState('')
const [selected, setSelected] = useState<any | null>(null)
// 获取标杆实践列表
const { data: practicesData, isLoading } = useQuery({
queryKey: ['tasks/practices', moduleFilter, statusFilter],
queryFn: () =>
api.get('/tasks/practices', {
params: { module: moduleFilter || undefined, status: statusFilter || undefined },
}),
})
const practices = (practicesData as any)?.data || []
// 获取选中实践的推广结果
const { data: replicationData } = useQuery({
queryKey: ['tasks/practices', selected?.id, 'replication-result'],
queryFn: () => api.get(`/tasks/practices/${selected?.id}/replication-result`),
enabled: !!selected?.id,
})
const replications = (replicationData as any)?.data || []
// 推广操作
const replicateMutation = useMutation({
mutationFn: (data: { trial_store_code: string; trial_store_name: string; observation_weeks?: number }) =>
api.post(`/tasks/practices/${selected?.id}/replicate`, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['tasks/practices', selected?.id, 'replication-result'] })
},
})
const promoteMutation = useMutation({
mutationFn: () => api.post(`/tasks/practices/${selected?.id}/promote`),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['tasks/practices'] })
setSelected(null)
},
})
// 统计
const stats = useMemo(() => {
const total = practices.length
const byModule = practices.reduce((acc: any, p: any) => {
acc[p.practice_module] = (acc[p.practice_module] || 0) + 1
return acc
}, {})
const byStatus = practices.reduce((acc: any, p: any) => {
acc[p.status] = (acc[p.status] || 0) + 1
return acc
}, {})
return { total, byModule, byStatus }
}, [practices])
// 模块列表(从数据中提取)
const modules = useMemo(
() => Array.from(new Set(practices.map((p: any) => p.practice_module))).filter(Boolean),
[practices],
)
const statuses = ['待推广', '推广中', '已推广']
return (
<div className="space-y-4">
{/* 页面标题 */}
<div>
<h1 className="flex items-center gap-2 text-xl font-bold">
<Library className="h-5 w-5 text-teal-600" />
</h1>
<p className="mt-1 text-sm text-muted-foreground">
AI
</p>
</div>
{/* 统计卡片 */}
<div className="grid grid-cols-2 gap-3 sm:grid-cols-4">
<div className="rounded-lg border bg-card p-3">
<div className="flex items-center gap-2">
<Library className="h-4 w-4 text-teal-600" />
<span className="text-xs text-muted-foreground"></span>
</div>
<b className="mt-1 block text-2xl font-bold text-teal-600">{stats.total}</b>
</div>
{Object.entries(stats.byStatus).map(([status, count]: any) => (
<div key={status} className="rounded-lg border bg-card p-3">
<span className="text-xs text-muted-foreground">{status}</span>
<b className="mt-1 block text-2xl font-bold">{count}</b>
</div>
))}
</div>
{/* 筛选栏 */}
<div className="flex flex-wrap gap-2">
<button
className={cn(
'rounded-md px-3 py-1.5 text-sm font-medium',
!moduleFilter ? 'bg-teal-600 text-white' : 'border hover:bg-muted',
)}
onClick={() => setModuleFilter('')}
>
</button>
{modules.map((m: any) => (
<button
key={m}
className={cn(
'rounded-md px-3 py-1.5 text-sm font-medium',
moduleFilter === m ? 'bg-teal-600 text-white' : 'border hover:bg-muted',
)}
onClick={() => setModuleFilter(m)}
>
{m}
</button>
))}
<div className="flex-1" />
<select
value={statusFilter}
onChange={(e) => setStatusFilter(e.target.value)}
className="rounded-md border px-2 py-1 text-sm"
>
<option value=""></option>
{statuses.map((s) => (
<option key={s} value={s}>{s}</option>
))}
</select>
</div>
{/* 知识列表 */}
{isLoading ? (
<LoadingSpinner />
) : practices.length === 0 ? (
<div className="rounded-lg border bg-card py-20 text-center">
<Library className="mx-auto h-12 w-12 text-muted-foreground/40" />
<p className="mt-3 text-sm text-muted-foreground"></p>
<p className="mt-1 text-xs text-muted-foreground"></p>
</div>
) : (
<div className="space-y-2">
{practices.map((p: any) => (
<KnowledgeCard key={p.id} practice={p} onClick={() => setSelected(p)} />
))}
</div>
)}
{/* 详情弹窗 */}
{selected && (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/30" onClick={() => setSelected(null)}>
<div
className="max-h-[85vh] w-[640px] max-w-[95vw] overflow-y-auto rounded-lg border bg-card p-6 shadow-lg"
onClick={(e) => e.stopPropagation()}
>
{/* 标题栏 */}
<div className="mb-4 flex items-start justify-between">
<div>
<span className="rounded bg-teal-50 px-1.5 py-0.5 text-[10px] font-medium text-teal-700">
{selected.practice_module}
</span>
<h2 className="mt-1 text-base font-bold"> #{selected.id}</h2>
</div>
<button onClick={() => setSelected(null)} className="rounded-md p-1 hover:bg-muted">
<X className="h-5 w-5" />
</button>
</div>
{/* 内容 */}
<div className="space-y-4">
{/* 标杆门店 */}
<div>
<h3 className="mb-1 text-sm font-bold"></h3>
<p className="text-sm">{selected.benchmark_store_name}{selected.benchmark_store_code}</p>
</div>
{/* 关键行动 */}
<div>
<h3 className="mb-1 text-sm font-bold"></h3>
<div className="rounded-lg border bg-muted/20 p-3">
{selected.key_actions?.split('\n').map((line: string, i: number) => (
<p key={i} className="text-xs leading-relaxed text-muted-foreground">
{line || '\u00A0'}
</p>
)) || <p className="text-xs text-muted-foreground"></p>}
</div>
</div>
{/* 验证指标 */}
{selected.verification_indicators && (
<div>
<h3 className="mb-1 text-sm font-bold"></h3>
<p className="text-sm text-muted-foreground">{selected.verification_indicators}</p>
</div>
)}
{/* 状态 */}
<div>
<h3 className="mb-1 text-sm font-bold"></h3>
<Badge type="default" text={selected.status} />
</div>
{/* 推广结果 */}
<div>
<h3 className="mb-2 text-sm font-bold">广</h3>
{replications.length === 0 ? (
<p className="text-xs text-muted-foreground">广</p>
) : (
<div className="space-y-2">
{replications.map((r: any) => (
<div key={r.id} className="rounded-lg border p-2 text-xs">
<div className="flex items-center justify-between">
<b>{r.trial_store_name}</b>
<Badge type="status" text={r.status || '观察中'} />
</div>
<p className="mt-1 text-muted-foreground">
: {r.observation_weeks} · : {r.before_value ?? '-'} · : {r.after_value ?? '-'}
</p>
</div>
))}
</div>
)}
</div>
</div>
{/* 底部操作 */}
<div className="mt-4 flex gap-2 border-t pt-4">
<button
className="flex-1 rounded-md border px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted"
onClick={() => {
const code = prompt('请输入试点门店编码')
if (!code) return
const name = prompt('请输入试点门店名称') || code
replicateMutation.mutate({ trial_store_code: code, trial_store_name: name })
}}
>
广
</button>
{selected.status !== '已推广' && (
<button
className="flex-1 rounded-md bg-teal-600 px-4 py-2 text-sm font-medium text-white hover:bg-teal-700"
onClick={() => promoteMutation.mutate()}
disabled={promoteMutation.isPending}
>
{promoteMutation.isPending ? '处理中…' : '标记为已推广'}
</button>
)}
</div>
</div>
</div>
)}
</div>
)
}
+2 -2
View File
@@ -8,8 +8,8 @@ interface LoginPageProps {
export function LoginPage({ onLogin }: LoginPageProps) {
const navigate = useNavigate()
const [username, setUsername] = useState('')
const [password, setPassword] = useState('')
const [username, setUsername] = useState('平台管理员')
const [password, setPassword] = useState('123')
const [error, setError] = useState('')
const handleLogin = async () => {
+209
View File
@@ -0,0 +1,209 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import api from '@/lib/api'
import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { Tabs } from '@/components/Tabs'
import { formatNumber, formatPercent } from '@/lib/utils'
import { useState } from 'react'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts'
const STAGE_COLORS: Record<string, string> = { '爬坡': '#3b82f6', '成熟': '#22c55e', '衰退': '#eab308', '淘汰': '#ef4444' }
export function ProductLifecyclePage() {
const [tab, setTab] = useState('lifecycle')
const [stage, setStage] = useState('')
const queryClient = useQueryClient()
const { data: productData, isLoading: productLoading } = useQuery({
queryKey: ['product/products', stage],
queryFn: () => api.get('/product/products', { params: stage ? { stage } : {} }),
})
const { data: reviewOverview, isLoading: reviewLoading } = useQuery({
queryKey: ['product/reviews/overview'],
queryFn: () => api.get('/product/reviews/overview'),
})
const { data: reviewData, isLoading: reviewListLoading } = useQuery({
queryKey: ['product/reviews'],
queryFn: () => api.get('/product/reviews', { params: { page: 1, page_size: 100 } }),
})
const trackMutation = useMutation({
mutationFn: (id: number) => api.post(`/product/products/${id}/track`),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['product/products'] }),
})
if (tab === 'lifecycle' && productLoading) return <LoadingSpinner text="加载产品生命周期数据..." />
if (tab === 'reviews' && reviewLoading) return <LoadingSpinner text="加载评价数据..." />
const products = (productData as any)?.data || []
const reviews = (reviewData as any)?.data || []
const overview = (reviewOverview as any)?.data || {}
const stageDistribution = products.reduce((acc: Record<string, number>, r: any) => {
acc[r.lifecycle_stage] = (acc[r.lifecycle_stage] || 0) + 1
return acc
}, {})
const stagePieData = Object.entries(stageDistribution).map(([name, value]) => ({ name, value }))
const categoryData = [
{ name: '口味', value: Number(overview.taste_count || 0) },
{ name: '服务', value: Number(overview.service_count || 0) },
{ name: '环境', value: Number(overview.env_count || 0) },
{ name: '异物', value: Number(overview.foreign_matter_count || 0) },
{ name: '分量', value: Number(overview.portion_count || 0) },
].filter(d => d.value > 0)
const totalReviews = Number(overview.total_reviews || 0)
const positiveRate = totalReviews > 0 ? (Number(overview.positive || 0) / totalReviews * 100) : 0
const avgRating = Number(overview.avg_rating || 0)
return (
<div className="space-y-4">
<div className="flex items-center justify-between">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground">SKU生命周期追踪 · NLP归因 · </p>
</div>
</div>
<Tabs tabs={[
{ key: 'lifecycle', label: '产品生命周期' },
{ key: 'reviews', label: '评价分析' },
]} active={tab} onChange={setTab} />
{tab === 'lifecycle' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="产品总数" value={products.length} format="number" description="在追踪的SKU数量" />
<MetricCard title="爬坡期" value={stageDistribution['爬坡'] || 0} format="number" description="上市7天内" status="warn" />
<MetricCard title="成熟期" value={stageDistribution['成熟'] || 0} format="number" description="上市7-90天" status="good" />
<MetricCard title="衰退期" value={stageDistribution['衰退'] || 0} format="number" description="上市90天+" status="bad" />
</div>
<div className="grid gap-4 lg:grid-cols-2">
<CollapsibleSection title="生命周期阶段分布" subtitle="各阶段SKU数量">
<ResponsiveContainer width="100%" height={250}>
<PieChart>
<Pie data={stagePieData} cx="50%" cy="50%" outerRadius={70} dataKey="value"
labelLine={false} label={({ name, value }: any) => <tspan fontSize={11}>{`${name}: ${value}`}</tspan>}>
{stagePieData.map((entry, i) => <Cell key={i} fill={STAGE_COLORS[entry.name] || '#999'} />)}
</Pie>
<Tooltip formatter={(v: any) => [formatNumber(v), 'SKU数']} />
<Legend />
</PieChart>
</ResponsiveContainer>
</CollapsibleSection>
<CollapsibleSection title="各阶段产品列表" subtitle="按上市日期排序">
<FilterableTable
data={products}
filterKey="lifecycle_stage"
filterLabel="全部阶段"
sortOptions={[
{ key: 'launch_date', label: '上市日期' },
{ key: 'sku_code', label: 'SKU编码' },
{ key: 'lifecycle_stage', label: '阶段' },
]}
defaultSort="launch_date"
defaultOrder="desc"
columns={[
{ key: 'sku_code', label: 'SKU编码' },
{ key: 'sku_name', label: 'SKU名称' },
{ key: 'launch_date', label: '上市日期', render: (r) => (r.launch_date || '').toString().substring(0, 10) },
{ key: 'lifecycle_stage', label: '阶段', align: 'center', render: (r) => {
const colors: Record<string, string> = { '爬坡': 'text-blue-600', '成熟': 'text-green-600', '衰退': 'text-yellow-600', '淘汰': 'text-red-600' }
return <span className={`font-bold ${colors[r.lifecycle_stage] || ''}`}>{r.lifecycle_stage}</span>
}},
{ key: 'survival_status', label: '存活状态', align: 'center' },
{ key: 'first_week_report_date', label: '首周战报', render: (r) => r.first_week_report_date ? (r.first_week_report_date as string).substring(0, 10) : '-' },
{ key: 'day90_report_date', label: '90天判定', render: (r) => r.day90_report_date ? (r.day90_report_date as string).substring(0, 10) : '-' },
{ key: 'action', label: '操作', align: 'center', render: (r) => (
<button onClick={() => trackMutation.mutate(r.id)} className="rounded bg-primary px-2 py-0.5 text-xs text-primary-foreground"></button>
)},
]}
/>
</CollapsibleSection>
</div>
</>
)}
{tab === 'reviews' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="评价总数" value={totalReviews} format="number" description="所有来源评价" />
<MetricCard title="平均评分" value={avgRating} format="number" description="满分5分" status={avgRating >= 4 ? 'good' : avgRating >= 3 ? 'warn' : 'bad'} />
<MetricCard title="好评率" value={positiveRate} format="percent" description="正面评价占比" status={positiveRate >= 80 ? 'good' : positiveRate >= 60 ? 'warn' : 'bad'} />
<MetricCard title="差评数" value={Number(overview.negative || 0)} format="number" description="负面评价数" status="bad" />
</div>
<div className="grid gap-4 lg:grid-cols-2">
<CollapsibleSection title="评价归因分布" subtitle="NLP自动分类">
<ResponsiveContainer width="100%" height={250}>
<PieChart>
<Pie data={categoryData} cx="50%" cy="50%" outerRadius={70} dataKey="value"
labelLine={false} label={({ name, value }: any) => <tspan fontSize={11}>{`${name}: ${value}`}</tspan>}>
{categoryData.map((_, i) => <Cell key={i} fill={['#ef4444', '#3b82f6', '#22c55e', '#eab308', '#a855f7'][i]} />)}
</Pie>
<Tooltip formatter={(v: any) => [formatNumber(v), '条']} />
<Legend />
</PieChart>
</ResponsiveContainer>
</CollapsibleSection>
<CollapsibleSection title="评价趋势" subtitle="按日期统计">
<ResponsiveContainer width="100%" height={250}>
<BarChart data={reviews.slice(0, 30).reverse().map((r: any) => ({
date: (r.review_date || '').substring(0, 10),
rating: Number(r.rating || 0),
}))}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="date" fontSize={10} />
<YAxis domain={[0, 5]} />
<Tooltip />
<Legend />
<Bar dataKey="rating" fill="#3b82f6" name="评分" />
</BarChart>
</ResponsiveContainer>
</CollapsibleSection>
</div>
<CollapsibleSection title={`评价明细 (${reviews.length})`} subtitle="按日期降序">
<FilterableTable
data={reviews}
filterKey="nlp_category"
filterLabel="全部分类"
sortOptions={[
{ key: 'review_date', label: '评价日期' },
{ key: 'rating', label: '评分' },
]}
defaultSort="review_date"
defaultOrder="desc"
searchKeys={['content', 'store_name', 'sku_name']}
searchPlaceholder="搜索评价内容..."
columns={[
{ key: 'review_date', label: '日期', render: (r) => (r.review_date || '').toString().substring(0, 10) },
{ key: 'review_source', label: '来源' },
{ key: 'store_name', label: '门店' },
{ key: 'sku_name', label: 'SKU' },
{ key: 'rating', label: '评分', align: 'center', render: (r) => {
const colors: Record<number, string> = { 1: 'text-red-600', 2: 'text-red-500', 3: 'text-yellow-600', 4: 'text-blue-600', 5: 'text-green-600' }
return <span className={`font-bold ${colors[r.rating] || ''}`}>{r.rating}</span>
}},
{ key: 'nlp_category', label: '归因', align: 'center' },
{ key: 'nlp_sentiment', label: '情感', align: 'center', render: (r) => {
const colors: Record<string, string> = { '正面': 'text-green-600', '负面': 'text-red-600', '中性': 'text-yellow-600' }
return <span className={colors[r.nlp_sentiment] || ''}>{r.nlp_sentiment}</span>
}},
{ key: 'content', label: '评价内容' },
]}
/>
</CollapsibleSection>
</>
)}
</div>
)
}
+199
View File
@@ -0,0 +1,199 @@
import { useQuery } from '@tanstack/react-query'
import { useState } from 'react'
import api from '@/lib/api'
import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { formatCurrency, formatNumber, formatPercent } from '@/lib/utils'
import { MonthPicker } from '@/components/MonthPicker'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, LineChart, Line } from 'recharts'
export function PromotionPage() {
const [month, setMonth] = useState('2026-04')
const { data: overviewData, isLoading: overviewLoading } = useQuery({
queryKey: ['promotion/overview', month],
queryFn: () => api.get('/promotion/overview', { params: { month } }),
})
const { data: planData, isLoading: planLoading } = useQuery({
queryKey: ['promotion/by-plan', month],
queryFn: () => api.get('/promotion/by-plan', { params: { month } }),
})
const { data: storeData, isLoading: storeLoading } = useQuery({
queryKey: ['promotion/by-store', month],
queryFn: () => api.get('/promotion/by-store', { params: { month } }),
})
const { data: trendData, isLoading: trendLoading } = useQuery({
queryKey: ['promotion/daily-trend', month],
queryFn: () => api.get('/promotion/daily-trend', { params: { month } }),
})
const pageLoading = overviewLoading || planLoading || storeLoading || trendLoading
if (pageLoading) {
return <LoadingSpinner text="加载促销增量利润数据..." />
}
const overview = (overviewData as any)?.data || {}
const plans = (planData as any)?.data || []
const stores = (storeData as any)?.data || []
const trends = (trendData as any)?.data || []
const trendChartData = trends.map((t: any) => ({
date: t.date.substring(8, 10),
促销客单: Math.round(Number(t.promo_avg_bill) * 100) / 100,
非促销客单: Math.round(Number(t.baseline_avg_bill) * 100) / 100,
增量: Math.round(Number(t.uplift) * 100) / 100,
}))
const planChartData = plans.slice(0, 10).map((p: any) => ({
name: p.marketing_plan?.length > 8 ? p.marketing_plan.substring(0, 8) + '...' : p.marketing_plan,
增量收入: Math.round(Number(p.incremental_revenue || 0)),
促销成本: Math.round(Number(p.promotion_cost || 0)),
净增量利润: Math.round(Number(p.net_incremental_profit || 0)),
}))
return (
<div className="space-y-4">
<div className="flex items-center justify-between">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground">vs非促销对比 · · ROI · {month}</p>
</div>
<MonthPicker month={month} onChange={setMonth} />
</div>
{/* 概览指标 */}
<CollapsibleSection title="促销增量总览" subtitle="促销 vs 非促销基准对比">
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="促销账单数" value={overview.promo_bills || 0} format="number" description="有营销方案的账单数" />
<MetricCard title="促销占比" value={overview.promo_share_pct || 0} format="percent" description="促销账单占总账单比例" />
<MetricCard title="客单价提升" value={overview.bill_uplift_pct || 0} format="percent" description="促销客单价 vs 非促销客单价" status={(overview.bill_uplift_pct || 0) > 0 ? 'good' : 'bad'} />
<MetricCard title="促销ROI" value={overview.promo_roi || 0} format="number" description="增量利润/促销成本" status={(overview.promo_roi || 0) > 1 ? 'good' : 'warn'} />
</div>
<div className="mt-3 grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="增量收入" value={overview.incremental_revenue || 0} format="currency" description="(促销客单-基准客单)×促销单数" status={(overview.incremental_revenue || 0) > 0 ? 'good' : 'bad'} />
<MetricCard title="促销成本" value={overview.promotion_cost || 0} format="currency" description="促销账单优惠总额" status="bad" />
<MetricCard title="净增量利润" value={overview.net_incremental_profit || 0} format="currency" description="增量收入-促销成本" status={(overview.net_incremental_profit || 0) > 0 ? 'good' : 'bad'} />
<MetricCard title="促销毛利率" value={overview.promo_margin_pct || 0} format="percent" description="促销账单理论毛利率" />
</div>
</CollapsibleSection>
{/* 图表 */}
<div className="grid gap-4 lg:grid-cols-2">
<CollapsibleSection title="促销日趋势" subtitle="每日促销vs非促销客单价对比">
<ResponsiveContainer width="100%" height={300}>
<LineChart data={trendChartData} margin={{ top: 20, right: 20, bottom: 20, left: 20 }}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="date" tick={{ fontSize: 10 }} />
<YAxis tick={{ fontSize: 10 }} tickFormatter={(v) => v >= 100 ? `${v}` : v} />
<Tooltip formatter={(v: any) => formatCurrency(v)} />
<Legend />
<Line type="monotone" dataKey="促销客单" stroke="#22c55e" strokeWidth={2} />
<Line type="monotone" dataKey="非促销客单" stroke="#94a3b8" strokeWidth={2} />
<Line type="monotone" dataKey="增量" stroke="#3b82f6" strokeWidth={2} strokeDasharray="5 5" />
</LineChart>
</ResponsiveContainer>
</CollapsibleSection>
<CollapsibleSection title="各促销方案增量对比" subtitle="TOP10方案的增量收入vs促销成本">
<ResponsiveContainer width="100%" height={300}>
<BarChart data={planChartData} margin={{ top: 20, right: 20, bottom: 20, left: 20 }}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="name" tick={{ fontSize: 9 }} angle={-20} textAnchor="end" height={60} />
<YAxis tick={{ fontSize: 10 }} tickFormatter={(v) => v >= 10000 ? `${(v / 10000).toFixed(0)}` : v} />
<Tooltip formatter={(v: any) => formatCurrency(v)} />
<Legend />
<Bar dataKey="增量收入" fill="#22c55e" />
<Bar dataKey="促销成本" fill="#ef4444" />
<Bar dataKey="净增量利润" fill="#3b82f6" />
</BarChart>
</ResponsiveContainer>
</CollapsibleSection>
</div>
{/* 按方案明细 */}
<CollapsibleSection title={`促销方案对比 (${plans.length})`} subtitle="各营销方案的增量利润分析">
<FilterableTable
data={plans}
filterKey="marketing_plan"
filterLabel="全部方案"
sortOptions={[
{ key: 'total_revenue', label: '促销收入' },
{ key: 'bill_count', label: '账单数' },
{ key: 'net_incremental_profit', label: '净增量利润' },
{ key: 'promo_roi', label: 'ROI' },
{ key: 'bill_uplift_pct', label: '客单提升' },
]}
defaultSort="total_revenue"
defaultOrder="desc"
columns={[
{ key: 'marketing_plan', label: '营销方案' },
{ key: 'bill_count', label: '账单数', align: 'right', render: (r) => formatNumber(r.bill_count) },
{ key: 'store_count', label: '覆盖门店', align: 'right', render: (r) => formatNumber(r.store_count) },
{ key: 'avg_bill_value', label: '客单价', align: 'right', render: (r) => formatCurrency(r.avg_bill_value) },
{ key: 'bill_uplift_pct', label: '客单提升', align: 'right', render: (r) => {
const v = Number(r.bill_uplift_pct || 0)
return <span className={v > 0 ? 'text-green-600' : 'text-red-600'}>{v > 0 ? '+' : ''}{v.toFixed(1)}%</span>
}},
{ key: 'total_revenue', label: '促销收入', align: 'right', render: (r) => formatCurrency(r.total_revenue) },
{ key: 'total_discount', label: '优惠总额', align: 'right', render: (r) => <span className="text-red-600">{formatCurrency(r.total_discount)}</span> },
{ key: 'incremental_revenue', label: '增量收入', align: 'right', render: (r) => formatCurrency(r.incremental_revenue) },
{ key: 'net_incremental_profit', label: '净增量利润', align: 'right', render: (r) => {
const v = Number(r.net_incremental_profit || 0)
return <span className={v >= 0 ? 'text-green-600 font-medium' : 'text-red-600 font-medium'}>{formatCurrency(v)}</span>
}},
{ key: 'promo_roi', label: 'ROI', align: 'right', render: (r) => {
const v = Number(r.promo_roi || 0)
return <span className={v > 1 ? 'text-green-600 font-bold' : v > 0 ? 'text-yellow-600' : 'text-red-600'}>{v.toFixed(2)}x</span>
}},
{ key: 'member_share_pct', label: '会员占比', align: 'right', render: (r) => `${Number(r.member_share_pct || 0).toFixed(1)}%` },
]}
/>
</CollapsibleSection>
{/* 按门店明细 */}
<CollapsibleSection title={`门店促销效果 (${stores.length})`} subtitle="各门店的促销增量利润">
<FilterableTable
data={stores}
filterKey="store_name"
filterLabel="全部门店"
sortOptions={[
{ key: 'promo_revenue', label: '促销收入' },
{ key: 'net_incremental_profit', label: '净增量利润' },
{ key: 'uplift_pct', label: '客单提升' },
{ key: 'promo_roi', label: 'ROI' },
{ key: 'plan_count', label: '方案数' },
]}
defaultSort="net_incremental_profit"
defaultOrder="desc"
columns={[
{ key: 'store_name', label: '门店名称' },
{ key: 'plan_count', label: '方案数', align: 'center' },
{ key: 'promo_bills', label: '促销单数', align: 'right', render: (r) => formatNumber(r.promo_bills) },
{ key: 'promo_avg_bill', label: '促销客单', align: 'right', render: (r) => formatCurrency(r.promo_avg_bill) },
{ key: 'baseline_avg_bill', label: '基准客单', align: 'right', render: (r) => formatCurrency(r.baseline_avg_bill) },
{ key: 'uplift_pct', label: '客单提升', align: 'right', render: (r) => {
const v = Number(r.uplift_pct || 0)
return v ? <span className={v > 0 ? 'text-green-600' : 'text-red-600'}>{v > 0 ? '+' : ''}{v.toFixed(1)}%</span> : '-'
}},
{ key: 'incremental_revenue', label: '增量收入', align: 'right', render: (r) => formatCurrency(r.incremental_revenue) },
{ key: 'promotion_cost', label: '促销成本', align: 'right', render: (r) => <span className="text-red-600">{formatCurrency(r.promotion_cost)}</span> },
{ key: 'net_incremental_profit', label: '净增量利润', align: 'right', render: (r) => {
const v = Number(r.net_incremental_profit || 0)
return <span className={v >= 0 ? 'text-green-600 font-medium' : 'text-red-600 font-medium'}>{formatCurrency(v)}</span>
}},
{ key: 'promo_roi', label: 'ROI', align: 'right', render: (r) => {
const v = Number(r.promo_roi || 0)
return v ? <span className={v > 1 ? 'text-green-600 font-bold' : v > 0 ? 'text-yellow-600' : 'text-red-600'}>{v.toFixed(2)}x</span> : '-'
}},
]}
/>
</CollapsibleSection>
</div>
)
}
+1 -1
View File
@@ -55,7 +55,7 @@ export function RegionalPage() {
const pageLoading = riskLoading || weeklyLoading || priorityLoading
const weeklyMutation = useMutation({
mutationFn: ({ id, text }: { id: number; text: string }) => api.put(`/tasks/${id}/weekly-check`, { weekly_comment: text }),
mutationFn: ({ id, text }: { id: number; text: string }) => api.put(`/tasks/${id}/weekly-check`, { check_comment: text }),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['tasks/weekly-check'] })
setWeeklyModal(null)
+1 -1
View File
@@ -68,7 +68,7 @@ export function RevenuePage() {
received: Number(r.received || 0),
bills: Number(r.bill_count || 0),
avg_bill: Number(r.avg_bill_value || 0),
discount_rate: Number(r.avg_discount_rate_pct || 0),
discount_rate: Number(r.discount_rate_pct || 0),
}))
// 环比
+60 -14
View File
@@ -21,13 +21,17 @@ function SectionLoading({ text }: { text: string }) {
}
export function RiskPage() {
const [riskTab, setRiskTab] = useState<'anomaly' | 'zero' | 'cashier'>('anomaly')
const [riskTab, setRiskTab] = useState<'anomaly' | 'full_discount' | 'empty_bill' | 'cashier'>('anomaly')
const [month, setMonth] = useState('2026-04')
const [anomalyPage, setAnomalyPage] = useState(1)
const [anomalyStore, setAnomalyStore] = useState('')
const [anomalyReason, setAnomalyReason] = useState('')
const [anomalyCashier, setAnomalyCashier] = useState('')
const [debouncedCashier, setDebouncedCashier] = useState('')
const [anomalySort, setAnomalySort] = useState('consumption')
const [anomalyOrder, setAnomalyOrder] = useState<'asc' | 'desc'>('desc')
const [zeroPage, setZeroPage] = useState(1)
const [zeroType, setZeroType] = useState<'全额优惠' | '无消费无优惠'>('全额优惠')
useEffect(() => {
const t = setTimeout(() => setDebouncedCashier(anomalyCashier), 400)
@@ -35,15 +39,14 @@ export function RiskPage() {
}, [anomalyCashier])
const { data: anomalyData, isLoading: anomalyLoading, isFetching: anomalyFetching } = useQuery({
queryKey: ['risk/anomaly', month, anomalyPage, anomalyStore, anomalyReason, debouncedCashier],
queryFn: () => api.get('/risk/anomaly', { params: { month, page: anomalyPage, page_size: ANOMALY_PAGE_SIZE, ...(anomalyStore ? { store: anomalyStore } : {}), ...(anomalyReason ? { reason: anomalyReason } : {}), ...(debouncedCashier ? { cashier: debouncedCashier } : {}) } }),
queryKey: ['risk/anomaly', month, anomalyPage, anomalyStore, anomalyReason, debouncedCashier, anomalySort, anomalyOrder],
queryFn: () => api.get('/risk/anomaly', { params: { month, page: anomalyPage, page_size: ANOMALY_PAGE_SIZE, sort: anomalySort, order: anomalyOrder, ...(anomalyStore ? { store: anomalyStore } : {}), ...(anomalyReason ? { reason: anomalyReason } : {}), ...(debouncedCashier ? { cashier: debouncedCashier } : {}) } }),
placeholderData: keepPreviousData,
})
const { data: zeroData, isLoading: zeroLoading, isFetching: zeroFetching } = useQuery({
queryKey: ['risk/zero-received', month],
queryFn: () => api.get('/risk/zero-received', { params: { month } }),
staleTime: 5 * 60 * 1000,
queryKey: ['risk/zero-received', month, zeroType, zeroPage],
queryFn: () => api.get('/risk/zero-received', { params: { month, type: zeroType, page: zeroPage, page_size: ANOMALY_PAGE_SIZE } }),
placeholderData: keepPreviousData,
})
@@ -57,13 +60,14 @@ export function RiskPage() {
const anomalyRows = (anomalyData as any)?.data || []
const anomalyMeta = (anomalyData as any)?.meta || { total: 0 }
const zeroRows = (zeroData as any)?.data || []
const zeroMeta = (zeroData as any)?.meta || { total: 0, full_discount: 0, empty_bill: 0 }
const cashierRows = (cashierData as any)?.data || []
const storeNames: string[] = Array.from(new Set<string>(cashierRows.map((r: any) => r.store_name as string).filter(Boolean))).sort()
const initialLoading = !anomalyData && !zeroData && !cashierData
const totalAnomaly = anomalyMeta.total || anomalyRows.length
const totalZero = zeroRows.length
const totalZero = zeroMeta.total || zeroRows.length
const highRiskCashiers = cashierRows.filter((r: any) => Number(r.anomaly_rate_pct || 0) >= 10).length
const avgAnomalyRate = cashierRows.length > 0
? cashierRows.reduce((s: number, r: any) => s + Number(r.anomaly_rate_pct || 0), 0) / cashierRows.length
@@ -87,9 +91,10 @@ export function RiskPage() {
{/* 概览指标 */}
<CollapsibleSection title="风险概览" subtitle="异常账单与收银操作风险汇总">
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<div className="grid grid-cols-2 gap-3 md:grid-cols-5">
<MetricCard title="异常账单数" value={totalAnomaly} format="number" description="触发异常规则的账单数量,需逐单核查" />
<MetricCard title="零实收账单" value={totalZero} format="number" description="实收为0的账单,可能为全额优惠或操作异常" />
<MetricCard title="全额优惠账单" value={zeroMeta.full_discount || 0} format="number" description="消费>0但实收=0,需核查是否违规免单" />
<MetricCard title="空单账单" value={zeroMeta.empty_bill || 0} format="number" description="无消费无优惠的空单,需排查操作异常" />
<MetricCard title="高风险收银员(≥10%)" value={highRiskCashiers} format="number" description="异常操作率≥10%的收银员数量" />
<MetricCard title="平均异常率" value={avgAnomalyRate} format="percent" description="所有收银员的平均异常操作率" />
</div>
@@ -118,8 +123,11 @@ export function RiskPage() {
<button onClick={() => setRiskTab('anomaly')} className={`rounded-md border px-3 py-1.5 text-sm ${riskTab === 'anomaly' ? 'border-primary bg-primary text-primary-foreground' : ''}`}>
({totalAnomaly})
</button>
<button onClick={() => setRiskTab('zero')} className={`rounded-md border px-3 py-1.5 text-sm ${riskTab === 'zero' ? 'border-primary bg-primary text-primary-foreground' : ''}`}>
({totalZero})
<button onClick={() => { setRiskTab('full_discount'); setZeroType('全额优惠'); setZeroPage(1) }} className={`rounded-md border px-3 py-1.5 text-sm ${riskTab === 'full_discount' ? 'border-primary bg-primary text-primary-foreground' : ''}`}>
({zeroMeta.full_discount || 0})
</button>
<button onClick={() => { setRiskTab('empty_bill'); setZeroType('无消费无优惠'); setZeroPage(1) }} className={`rounded-md border px-3 py-1.5 text-sm ${riskTab === 'empty_bill' ? 'border-primary bg-primary text-primary-foreground' : ''}`}>
({zeroMeta.empty_bill || 0})
</button>
<button onClick={() => setRiskTab('cashier')} className={`rounded-md border px-3 py-1.5 text-sm ${riskTab === 'cashier' ? 'border-primary bg-primary text-primary-foreground' : ''}`}>
({cashierRows.length})
@@ -161,6 +169,10 @@ export function RiskPage() {
searchPlaceholder="搜索收银员..."
serverSearchValue={anomalyCashier}
onServerSearchChange={(v) => { setAnomalyCashier(v); setAnomalyPage(1) }}
sort={anomalySort}
order={anomalyOrder}
onSortChange={(v) => { setAnomalySort(v); setAnomalyPage(1) }}
onOrderChange={(v) => { setAnomalyOrder(v); setAnomalyPage(1) }}
sortOptions={[
{ key: 'consumption', label: '消费额' },
{ key: 'discount_total', label: '优惠' },
@@ -183,10 +195,45 @@ export function RiskPage() {
</>
)}
{riskTab === 'zero' && (
zeroFetching ? <SectionLoading text="加载零实收数据..." /> :
{riskTab === 'full_discount' && (
zeroFetching ? <SectionLoading text="加载全额优惠数据..." /> :
<FilterableTable
data={zeroRows}
serverSide
page={zeroPage}
onPageChange={setZeroPage}
pageSize={ANOMALY_PAGE_SIZE}
total={zeroMeta.total}
sortOptions={[
{ key: 'consumption', label: '消费额' },
{ key: 'discount_total', label: '优惠' },
{ key: 'store_name', label: '门店' },
]}
defaultSort="consumption"
defaultOrder="desc"
filterKey="store_name"
filterLabel="全部门店"
columns={[
{ key: 'store_name', label: '门店' },
{ key: 'bill_no', label: '账单号' },
{ key: 'meal_period', label: '餐段' },
{ key: 'consumption', label: '消费额', align: 'right', render: (r) => formatCurrency(r.consumption) },
{ key: 'discount_total', label: '优惠', align: 'right', render: (r) => formatCurrency(r.discount_total) },
{ key: 'cashier', label: '收银员' },
{ key: 'closed_at', label: '结账时间', render: (r) => r.closed_at?.substring(0, 16) },
]}
/>
)}
{riskTab === 'empty_bill' && (
zeroFetching ? <SectionLoading text="加载空单数据..." /> :
<FilterableTable
data={zeroRows}
serverSide
page={zeroPage}
onPageChange={setZeroPage}
pageSize={ANOMALY_PAGE_SIZE}
total={zeroMeta.total}
sortOptions={[
{ key: 'consumption', label: '消费额' },
{ key: 'discount_total', label: '优惠' },
@@ -202,7 +249,6 @@ export function RiskPage() {
{ key: 'meal_period', label: '餐段' },
{ key: 'consumption', label: '消费额', align: 'right', render: (r) => formatCurrency(r.consumption) },
{ key: 'discount_total', label: '优惠', align: 'right', render: (r) => formatCurrency(r.discount_total) },
{ key: 'zero_received_type', label: '零实收类型' },
{ key: 'cashier', label: '收银员' },
{ key: 'closed_at', label: '结账时间', render: (r) => r.closed_at?.substring(0, 16) },
]}
@@ -0,0 +1,134 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import api from '@/lib/api'
import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { useState } from 'react'
export function SchedulerManagementPage() {
const queryClient = useQueryClient()
const [editingId, setEditingId] = useState<number | null>(null)
const [editCron, setEditCron] = useState('')
const { data: tasksData, isLoading } = useQuery({
queryKey: ['scheduler/tasks'],
queryFn: () => api.get('/scheduler'),
})
const toggleMutation = useMutation({
mutationFn: (data: { id: number; is_enabled: boolean }) =>
api.patch(`/scheduler/${data.id}`, { is_enabled: data.is_enabled }),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['scheduler/tasks'] }),
})
const updateCronMutation = useMutation({
mutationFn: (data: { id: number; cron_expr: string }) =>
api.patch(`/scheduler/${data.id}`, { cron_expr: data.cron_expr }),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['scheduler/tasks'] })
setEditingId(null)
},
})
const triggerMutation = useMutation({
mutationFn: (id: number) => api.post(`/scheduler/${id}/trigger`),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['scheduler/tasks'] }),
})
const tasks = (tasksData as any)?.data || []
const enabledCount = tasks.filter((t: any) => t.is_enabled).length
const successCount = tasks.filter((t: any) => t.last_status === 'success').length
const failedCount = tasks.filter((t: any) => t.last_status === 'failed').length
const runningCount = tasks.filter((t: any) => t.last_status === 'running').length
if (isLoading) {
return <LoadingSpinner text="加载调度任务..." />
}
return (
<div className="space-y-4">
<div className="flex items-center justify-between">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground"> · </p>
</div>
</div>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="总任务数" value={tasks.length} format="number" description="所有注册的调度任务" />
<MetricCard title="启用中" value={enabledCount} format="number" description="当前启用的任务数" status="good" />
<MetricCard title="成功执行" value={successCount} format="number" description="上次执行成功的任务数" status="good" />
<MetricCard title="执行失败" value={failedCount} format="number" description="上次执行失败的任务数" status={failedCount > 0 ? 'bad' : 'good'} />
</div>
<CollapsibleSection title={`调度任务列表 (${tasks.length})`} subtitle="查看、启停、手动触发调度任务">
<FilterableTable
data={tasks}
sortOptions={[
{ key: 'task_name', label: '任务名' },
{ key: 'last_run_at', label: '上次执行' },
{ key: 'last_status', label: '状态' },
]}
defaultSort="task_name"
defaultOrder="asc"
columns={[
{ key: 'task_name', label: '任务名称' },
{ key: 'description', label: '描述' },
{ key: 'cron_expr', label: 'Cron表达式', render: (r) => (
editingId === r.id ? (
<div className="flex gap-1">
<input
type="text"
value={editCron}
onChange={(e) => setEditCron(e.target.value)}
className="w-32 rounded border px-2 py-0.5 text-xs"
/>
<button
onClick={() => updateCronMutation.mutate({ id: r.id, cron_expr: editCron })}
className="rounded bg-primary px-2 py-0.5 text-xs text-primary-foreground"
></button>
<button
onClick={() => setEditingId(null)}
className="rounded bg-muted px-2 py-0.5 text-xs"
></button>
</div>
) : (
<span className="font-mono text-xs">{r.cron_expr}</span>
)
)},
{ key: 'is_enabled', label: '启用', align: 'center', render: (r) => (
<button
onClick={() => toggleMutation.mutate({ id: r.id, is_enabled: !r.is_enabled })}
className={`rounded px-2 py-0.5 text-xs ${r.is_enabled ? 'bg-green-100 text-green-700' : 'bg-gray-100 text-gray-500'}`}
>
{r.is_enabled ? '启用中' : '已停用'}
</button>
)},
{ key: 'last_status', label: '上次状态', align: 'center', render: (r) => {
if (!r.last_status) return <span className="text-xs text-muted-foreground"></span>
const colors: Record<string, string> = { success: 'bg-green-100 text-green-700', failed: 'bg-red-100 text-red-700', running: 'bg-blue-100 text-blue-700' }
const labels: Record<string, string> = { success: '成功', failed: '失败', running: '运行中' }
return <span className={`rounded px-2 py-0.5 text-xs ${colors[r.last_status] || ''}`}>{labels[r.last_status] || r.last_status}</span>
}},
{ key: 'last_run_at', label: '上次执行时间', render: (r) => r.last_run_at ? (r.last_run_at as string).substring(0, 19).replace('T', ' ') : '-' },
{ key: 'actions', label: '操作', align: 'center', render: (r) => (
<div className="flex gap-1">
<button
onClick={() => triggerMutation.mutate(r.id)}
disabled={triggerMutation.isPending}
className="rounded bg-primary px-2 py-0.5 text-xs text-primary-foreground hover:opacity-80"
></button>
<button
onClick={() => { setEditingId(r.id); setEditCron(r.cron_expr) }}
className="rounded bg-muted px-2 py-0.5 text-xs"
></button>
</div>
)},
]}
/>
</CollapsibleSection>
</div>
)
}
+3 -3
View File
@@ -47,7 +47,7 @@ export function StoreDetailPage() {
const { data: healthData } = useQuery({
queryKey: ['store-health', code, month],
queryFn: () => api.get('/situational-awareness/health-score', { params: { month } }),
queryFn: () => api.get('/situational-awareness/health-score', { params: { month, store_code: code } }),
})
const { data: dailyData } = useQuery({
@@ -125,8 +125,8 @@ export function StoreDetailPage() {
const quadrant = action?.management_quadrant || ''
const quadrantInfo = quadrantDesc[quadrant]
// 公司均值
const companyAvg = { daily_rev: 20144, bill: 36.8, discount: 20.5, margin: 71.5, member: 15.9, repeat: 37.0, delivery: 36.1, combo: 20.6, items: 4.05 }
// 公司均值(从API获取,fallback到默认值)
const companyAvg = sd.companyAvg || { daily_rev: 20144, bill: 36.8, discount: 20.5, margin: 71.5, member: 15.9, repeat: 37.0, delivery: 36.1, combo: 20.6, items: 4.05 }
// 偏差项明细
const deviations: { label: string; store: number; company: number; unit: string; good: 'high' | 'low' }[] = [
+350
View File
@@ -0,0 +1,350 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import api from '@/lib/api'
import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { formatCurrency, formatNumber, formatPercent } from '@/lib/utils'
import { useState } from 'react'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, PieChart, Pie, Cell, RadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar } from 'recharts'
import { Tabs } from '@/components/Tabs'
import { MonthPicker } from '@/components/MonthPicker'
const GRADE_COLORS: Record<string, string> = { A: '#22c55e', B: '#3b82f6', C: '#eab308', D: '#ef4444' }
const RISK_COLORS: Record<string, string> = { '红色': '#ef4444', '黄色': '#eab308', '绿色': '#22c55e' }
export function StoreGradePage() {
const [month, setMonth] = useState(new Date().toISOString().slice(0, 7))
const [selectedStore, setSelectedStore] = useState<any>(null)
const [tab, setTab] = useState('grade')
const queryClient = useQueryClient()
const { data: gradeData, isLoading: gradeLoading } = useQuery({
queryKey: ['store-grade/grades', month],
queryFn: () => api.get('/store-grade/grades', { params: { month } }),
enabled: tab === 'grade',
})
const { data: closureData, isLoading: closureLoading } = useQuery({
queryKey: ['store-grade/closure-analysis', month],
queryFn: () => api.get('/store-grade/closure-analysis', { params: { month } }),
enabled: tab === 'closure',
})
const autoGradeMutation = useMutation({
mutationFn: () => api.post('/store-grade/auto-grade', null, { params: { month } }),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['store-grade/grades'] })
},
})
const gradeRows = (gradeData as any)?.data || []
const gradeDistribution = gradeRows.reduce((acc: Record<string, number>, r: any) => {
acc[r.grade] = (acc[r.grade] || 0) + 1
return acc
}, {})
const gradePieData = Object.entries(gradeDistribution).map(([name, value]) => ({ name: `${name}`, value }))
const riskDistribution = gradeRows.reduce((acc: Record<string, number>, r: any) => {
acc[r.risk_level] = (acc[r.risk_level] || 0) + 1
return acc
}, {})
const riskPieData = [
{ name: '红色', value: riskDistribution['红色'] || 0 },
{ name: '黄色', value: riskDistribution['黄色'] || 0 },
{ name: '绿色', value: riskDistribution['绿色'] || 0 },
]
const avgScore = gradeRows.length > 0
? gradeRows.reduce((s: number, r: any) => s + Number(r.overall_score || 0), 0) / gradeRows.length
: 0
const aGradeCount = gradeDistribution.A || 0
const dGradeCount = gradeDistribution.D || 0
const redRiskCount = riskDistribution['红色'] || 0
if (gradeLoading && tab === 'grade') {
return <LoadingSpinner text="加载门店分级数据..." />
}
if (closureLoading && tab === 'closure') {
return <LoadingSpinner text="加载关停测算数据..." />
}
const closure = (closureData as any)?.data || {}
const closureSummary = closure.summary || {}
const closureStores = closure.stores || []
const closurePieData = [
{ name: '建议关停', value: closureSummary.recommend_close || 0 },
{ name: '整改观察', value: closureSummary.recommend_rectify || 0 },
{ name: '持续经营', value: (closureSummary.total_stores || 0) - (closureSummary.recommend_close || 0) - (closureSummary.recommend_rectify || 0) },
].filter(d => d.value > 0)
const CLOSURE_COLORS: Record<string, string> = { '建议关停': '#ef4444', '整改观察': '#eab308', '持续经营': '#22c55e' }
return (
<div className="space-y-4">
<div className="flex items-center justify-between">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground"> · · · {month}</p>
</div>
<div className="flex items-center gap-2">
<MonthPicker month={month} onChange={setMonth} />
{tab === 'grade' && (
<button
onClick={() => autoGradeMutation.mutate()}
disabled={autoGradeMutation.isPending}
className="rounded bg-primary px-3 py-1 text-sm text-primary-foreground disabled:opacity-50"
>
{autoGradeMutation.isPending ? '分级中...' : '自动分级'}
</button>
)}
</div>
</div>
<Tabs tabs={[
{ key: 'grade', label: '门店分级' },
{ key: 'closure', label: '关停测算' },
]} active={tab} onChange={setTab} />
{tab === 'closure' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="门店总数" value={closureSummary.total_stores || 0} format="number" description="参与测算的门店总数" />
<MetricCard title="建议关停" value={closureSummary.recommend_close || 0} format="number" description="持续亏损且D级门店" status="bad" />
<MetricCard title="整改观察" value={closureSummary.recommend_rectify || 0} format="number" description="亏损但有基础的门店" status="warn" />
<MetricCard title="关停可月省" value={closureSummary.total_monthly_savings || 0} format="currency" description="关停门店每月可节省亏损" status="good" />
</div>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="关停总成本" value={closureSummary.total_closure_cost || 0} format="currency" description="遣散+违约+资产处置" status="bad" />
<MetricCard title="12月预计亏损" value={closureSummary.total_projected_loss || 0} format="currency" description="不关停继续经营的预计亏损" status="bad" />
</div>
{closurePieData.length > 0 && (
<CollapsibleSection title="关停建议分布" subtitle="按盈利状况和综合评分分类">
<ResponsiveContainer width="100%" height={200}>
<PieChart>
<Pie data={closurePieData} cx="50%" cy="50%" outerRadius={60} dataKey="value"
labelLine={false} label={({ name, value }: any) => <tspan fontSize={11}>{`${name}: ${value}`}</tspan>}>
{closurePieData.map((e, i) => <Cell key={i} fill={CLOSURE_COLORS[e.name] || '#999'} />)}
</Pie>
<Tooltip formatter={(v: any) => [formatNumber(v), '门店数']} />
<Legend />
</PieChart>
</ResponsiveContainer>
</CollapsibleSection>
)}
<CollapsibleSection title={`关停测算明细 (${closureStores.length})`} subtitle="含关停成本、继续经营亏损、回本期、建议">
<FilterableTable
data={closureStores}
filterKey="recommendation"
filterLabel="全部建议"
sortOptions={[
{ key: 'monthly_profit', label: '月利润' },
{ key: 'total_closure_cost', label: '关停成本' },
{ key: 'projected_12m_loss', label: '12月亏损' },
{ key: 'payback_months', label: '回本月数' },
{ key: 'overall_score', label: '综合分' },
]}
defaultSort="monthly_profit"
defaultOrder="asc"
columns={[
{ key: 'store_name', label: '门店名称' },
{ key: 'region', label: '区域' },
{ key: 'grade', label: '分级', align: 'center', render: (r) => {
const colors: Record<string, string> = { A: 'text-green-600', B: 'text-blue-600', C: 'text-yellow-600', D: 'text-red-600' }
return <span className={`font-bold ${colors[r.grade] || ''}`}>{r.grade}</span>
}},
{ key: 'monthly_revenue', label: '月收入', align: 'right', render: (r) => formatCurrency(r.monthly_revenue) },
{ key: 'monthly_profit', label: '月利润', align: 'right', render: (r) => {
const v = Number(r.monthly_profit || 0)
return <span className={v < 0 ? 'text-red-600 font-medium' : 'text-green-600'}>{formatCurrency(v)}</span>
}},
{ key: 'monthly_rent', label: '月租', align: 'right', render: (r) => formatCurrency(r.monthly_rent) },
{ key: 'monthly_wage', label: '月人工', align: 'right', render: (r) => formatCurrency(r.monthly_wage) },
{ key: 'total_closure_cost', label: '关停成本', align: 'right', render: (r) => <span className="text-red-600">{formatCurrency(r.total_closure_cost)}</span> },
{ key: 'projected_12m_loss', label: '12月亏损', align: 'right', render: (r) => {
const v = Number(r.projected_12m_loss || 0)
return v ? <span className="text-red-600">{formatCurrency(v)}</span> : '-'
}},
{ key: 'monthly_savings_if_closed', label: '月节省', align: 'right', render: (r) => {
const v = Number(r.monthly_savings_if_closed || 0)
return v ? <span className="text-green-600">{formatCurrency(v)}</span> : '-'
}},
{ key: 'payback_months', label: '回本(月)', align: 'right', render: (r) => r.payback_months ? `${Number(r.payback_months).toFixed(1)}` : '-' },
{ key: 'recommendation', label: '建议', align: 'center', render: (r) => {
const colors: Record<string, string> = { '建议关停': 'bg-red-500 text-white', '整改观察3个月': 'bg-yellow-500 text-white', '重点整改': 'bg-blue-500 text-white', '持续经营': 'bg-green-500 text-white' }
return <span className={`rounded px-2 py-0.5 text-xs ${colors[r.recommendation] || ''}`}>{r.recommendation}</span>
}},
{ key: 'reason', label: '原因' },
]}
/>
</CollapsibleSection>
</>
)}
{tab === 'grade' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="门店总数" value={gradeRows.length} format="number" description="参与分级的门店总数" />
<MetricCard title="平均综合分" value={avgScore} format="number" description="所有门店综合评分平均值" status={avgScore >= 75 ? 'good' : avgScore >= 60 ? 'warn' : 'bad'} />
<MetricCard title="A级门店" value={aGradeCount} format="number" description="综合分≥85的优秀门店" status="good" />
<MetricCard title="高风险门店" value={redRiskCount} format="number" description="风险等级红色的门店" status={redRiskCount > 0 ? 'bad' : 'good'} />
</div>
<div className="grid gap-4 lg:grid-cols-2">
<CollapsibleSection title="门店分级分布" subtitle="综合分=达成率40%+毛利率25%+会员占比15%+风险20% | A≥85 · B≥70 · C≥50 · D<50">
<ResponsiveContainer width="100%" height={250}>
<PieChart>
<Pie data={gradePieData} cx="50%" cy="50%" outerRadius={70} dataKey="value"
labelLine={false} label={({ name, value }: any) => <tspan fontSize={11}>{`${name}: ${value}`}</tspan>}>
{gradePieData.map((entry, i) => <Cell key={i} fill={GRADE_COLORS[entry.name[0]] || '#999'} />)}
</Pie>
<Tooltip formatter={(v: any) => [formatNumber(v), '门店数']} />
<Legend />
</PieChart>
</ResponsiveContainer>
</CollapsibleSection>
<CollapsibleSection title="风险等级分布" subtitle="风险模型基于毛利率、优惠率、异常率等指标综合评估">
<ResponsiveContainer width="100%" height={250}>
<PieChart>
<Pie data={riskPieData} cx="50%" cy="50%" outerRadius={70} dataKey="value"
labelLine={false} label={({ name, value }: any) => <tspan fontSize={11}>{`${name}: ${value}`}</tspan>}>
{riskPieData.map((entry, i) => <Cell key={i} fill={RISK_COLORS[entry.name] || '#999'} />)}
</Pie>
<Tooltip formatter={(v: any) => [formatNumber(v), '门店数']} />
<Legend />
</PieChart>
</ResponsiveContainer>
</CollapsibleSection>
</div>
<CollapsibleSection title={`门店分级明细 (${gradeRows.length})`} subtitle="综合分=达成率40%+毛利率25%+会员占比15%+风险20% | A≥85 · B≥70 · C≥50 · D<50">
<FilterableTable
data={gradeRows}
filterKey="grade"
filterLabel="全部分级"
sortOptions={[
{ key: 'overall_score', label: '综合分' },
{ key: 'revenue_achievement_pct', label: '达成率' },
{ key: 'store_name', label: '门店' },
]}
defaultSort="overall_score"
defaultOrder="desc"
onRowClick={(r) => setSelectedStore(r)}
columns={[
{ key: 'store_code', label: '门店编码' },
{ key: 'store_name', label: '门店名称' },
{ key: 'region', label: '区域' },
{ key: 'grade', label: '分级', align: 'center', render: (r) => {
const colors: Record<string, string> = { A: 'text-green-600', B: 'text-blue-600', C: 'text-yellow-600', D: 'text-red-600' }
return <span className={`font-bold ${colors[r.grade] || ''}`}>{r.grade}</span>
}},
{ key: 'risk_level', label: '风险', align: 'center', render: (r) => {
const colors: Record<string, string> = { '红色': 'bg-red-500 text-white', '黄色': 'bg-yellow-500 text-white', '绿色': 'bg-green-500 text-white' }
return <span className={`rounded px-2 py-0.5 text-xs ${colors[r.risk_level] || ''}`}>{r.risk_level || '-'}</span>
}},
{ key: 'overall_score', label: '综合分', align: 'right', render: (r) => Number(r.overall_score || 0).toFixed(1) },
{ key: 'revenue_achievement_pct', label: '营收达成率', align: 'right', render: (r) => {
const v = Number(r.revenue_achievement_pct || 0)
return <span className={v >= 100 ? 'text-green-600' : v >= 80 ? 'text-yellow-600' : 'text-red-600'}>{v.toFixed(1)}%</span>
}},
{ key: 'reason', label: '分级原因' },
]}
/>
</CollapsibleSection>
{selectedStore && <StoreDetailModal store={selectedStore} onClose={() => setSelectedStore(null)} />}
</>
)}
</div>
)
}
const GRADE_DIMENSIONS = [
{ key: 'revenue_achievement_pct', label: '营收达成', max: 100 },
{ key: 'overall_score', label: '综合分', max: 100 },
{ key: 'margin_pct', label: '毛利率', max: 50 },
{ key: 'anomaly_rate', label: '异常率', max: 20, inverse: true },
]
function StoreDetailModal({ store, onClose }: { store: any; onClose: () => void }) {
const gradeColor = GRADE_COLORS[store.grade] || '#999'
const riskColor = RISK_COLORS[store.risk_level] || '#999'
const radarData = GRADE_DIMENSIONS.map(d => {
const raw = Number(store[d.key] || 0)
const pct = d.inverse ? Math.max(0, 100 - (raw / d.max) * 100) : Math.min((raw / d.max) * 100, 100)
return { dimension: d.label, score: Math.round(pct), fullMark: 100 }
})
const metrics = [
{ label: '门店编码', value: store.store_code },
{ label: '区域', value: store.region || '-' },
{ label: '分级', value: store.grade, color: gradeColor },
{ label: '综合分', value: Number(store.overall_score || 0).toFixed(1) },
{ label: '营收达成率', value: `${Number(store.revenue_achievement_pct || 0).toFixed(1)}%` },
{ label: '营收', value: formatCurrency(store.revenue) },
{ label: '毛利率', value: formatPercent(store.margin_pct) },
{ label: '优惠率', value: store.discount_rate != null ? `${Number(store.discount_rate).toFixed(1)}%` : '-' },
{ label: '异常率', value: store.anomaly_rate != null ? `${Number(store.anomaly_rate).toFixed(1)}%` : '-' },
{ label: '会员占比', value: store.member_pct != null ? `${Number(store.member_pct).toFixed(1)}%` : '-' },
{ label: '客单价', value: formatCurrency(store.avg_bill_value) },
{ label: '活跃天数', value: store.active_days != null ? `${store.active_days}` : '-' },
{ label: '风险等级', value: store.risk_level || '-', color: riskColor },
]
return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50" onClick={onClose}>
<div className="max-h-[90vh] w-full max-w-2xl overflow-y-auto rounded-lg border bg-card p-6 shadow-lg" onClick={(e) => e.stopPropagation()}>
<div className="flex items-start justify-between">
<div className="flex items-center gap-3">
<h2 className="text-lg font-bold">{store.store_name}</h2>
<span className="rounded px-2 py-0.5 text-xs font-bold text-white" style={{ background: gradeColor }}>{store.grade}</span>
<span className="rounded px-2 py-0.5 text-xs font-medium text-white" style={{ background: riskColor }}>
{store.risk_level || '-'}
</span>
</div>
<button onClick={onClose} className="text-muted-foreground hover:text-foreground text-xl"></button>
</div>
<div className="mt-4 grid gap-4 md:grid-cols-2">
<div>
<ResponsiveContainer width="100%" height={250}>
<RadarChart data={radarData}>
<PolarGrid />
<PolarAngleAxis dataKey="dimension" tick={{ fontSize: 10 }} />
<PolarRadiusAxis angle={90} domain={[0, 100]} tick={{ fontSize: 8 }} />
<Radar dataKey="score" name="得分" stroke={gradeColor} fill={gradeColor} fillOpacity={0.3} />
<Tooltip formatter={(v: any) => [v, '得分']} />
</RadarChart>
</ResponsiveContainer>
</div>
<div className="space-y-2">
{metrics.map(m => (
<div key={m.label} className="flex items-center justify-between border-b pb-1 text-sm">
<span className="text-muted-foreground">{m.label}</span>
<span className="font-medium" style={m.color ? { color: m.color } : undefined}>{m.value}</span>
</div>
))}
{store.reason && (
<div className="pt-2 text-xs text-muted-foreground">
<span className="font-medium"></span>{store.reason}
</div>
)}
{store.primary_issue && (
<div className="pt-1 text-xs text-muted-foreground">
<span className="font-medium"></span>{store.primary_issue}
</div>
)}
</div>
</div>
</div>
</div>
)
}
+321
View File
@@ -0,0 +1,321 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import api from '@/lib/api'
import { FilterableTable } from '@/components/FilterableTable'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { Tabs } from '@/components/Tabs'
import { formatCurrency, formatNumber, formatPercent } from '@/lib/utils'
import { useState } from 'react'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts'
const GRADE_COLORS: Record<string, string> = { A: '#22c55e', B: '#3b82f6', C: '#eab308', D: '#ef4444' }
export function TargetManagementPage() {
const [tab, setTab] = useState('overview')
const [year, setYear] = useState(new Date().getFullYear())
const [month, setMonth] = useState(new Date().toISOString().slice(0, 7))
const queryClient = useQueryClient()
const { data: annualData, isLoading: annualLoading } = useQuery({
queryKey: ['target/annual', year],
queryFn: () => api.get('/target/annual', { params: { year } }),
})
const { data: regionalData, isLoading: regionalLoading } = useQuery({
queryKey: ['target/regional', year],
queryFn: () => api.get('/target/regional', { params: { year } }),
})
const { data: storeMonthlyData, isLoading: storeLoading } = useQuery({
queryKey: ['target/store-monthly', month],
queryFn: () => api.get('/target/store-monthly', { params: { month: month + '-01' } }),
})
const { data: achievementData, isLoading: achievementLoading } = useQuery({
queryKey: ['target/achievement', month],
queryFn: () => api.get('/target/achievement', { params: { month: month + '-01' } }),
})
const decomposeMutation = useMutation({
mutationFn: (data: { year: number; month?: string }) =>
api.post('/target/decompose/annual-to-store', data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['target/store-monthly'] })
queryClient.invalidateQueries({ queryKey: ['target/achievement'] })
},
})
const dailyDecomposeMutation = useMutation({
mutationFn: (data: { month: string }) =>
api.post('/target/decompose/monthly-to-daily', data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['target/daily'] })
},
})
const annualRows = (annualData as any)?.data || []
const regionalRows = (regionalData as any)?.data || []
const storeRows = (storeMonthlyData as any)?.data || []
const achievementRows = (achievementData as any)?.data || []
const revenueTarget = annualRows.find((r: any) => r.metric === 'revenue')
const profitTarget = annualRows.find((r: any) => r.metric === 'profit')
const storeCountTarget = annualRows.find((r: any) => r.metric === 'store_count')
const memberCountTarget = annualRows.find((r: any) => r.metric === 'member_count')
const totalStoreTarget = storeRows.reduce((s: number, r: any) => s + Number(r.revenue_target || 0), 0)
const avgAchievement = achievementRows.length > 0
? achievementRows.reduce((s: number, r: any) => s + Number(r.achievement_rate || 0), 0) / achievementRows.length
: 0
const achievedCount = achievementRows.filter((r: any) => Number(r.achievement_rate || 0) >= 100).length
const lowAchievementCount = achievementRows.filter((r: any) => Number(r.achievement_rate || 0) < 80).length
const gradeDistribution = storeRows.reduce((acc: Record<string, number>, r: any) => {
const g = r.grade || 'B'
acc[g] = (acc[g] || 0) + 1
return acc
}, {})
const gradePieData = Object.entries(gradeDistribution).map(([name, value]) => ({ name: `${name}`, value }))
const achievementChartData = achievementRows.slice(0, 20).map((r: any) => ({
name: r.store_name?.length > 6 ? r.store_name.slice(0, 6) : r.store_name,
达成率: Number(r.achievement_rate || 0),
}))
const pageLoading = annualLoading || regionalLoading || storeLoading || achievementLoading
if (pageLoading && tab === 'overview') {
return <LoadingSpinner text="加载目标管理数据..." />
}
return (
<div className="space-y-4">
<div className="flex items-center justify-between">
<div>
<h1 className="text-xl font-bold"></h1>
<p className="mt-0.5 text-xs text-muted-foreground"> · · · </p>
</div>
<div className="flex items-center gap-2">
<input
type="number"
value={year}
onChange={(e) => setYear(parseInt(e.target.value))}
className="w-20 rounded border px-2 py-1 text-sm"
/>
<span className="text-sm text-muted-foreground"></span>
<input
type="month"
value={month}
onChange={(e) => setMonth(e.target.value)}
className="rounded border px-2 py-1 text-sm"
/>
</div>
</div>
<Tabs
tabs={[
{ key: 'overview', label: '目标概览' },
{ key: 'annual', label: '年度目标' },
{ key: 'regional', label: '区域拆解' },
{ key: 'store', label: '门店月度' },
{ key: 'achievement', label: '达成率' },
]}
active={tab}
onChange={setTab}
/>
{tab === 'overview' && (
<>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="年度营收目标" value={revenueTarget?.target_value || 0} format="currency" description={`${year}年年度战略营收目标`} />
<MetricCard title="年度利润目标" value={profitTarget?.target_value || 0} format="currency" description={`${year}年年度战略利润目标`} />
<MetricCard title="门店月度目标总额" value={totalStoreTarget} format="currency" description={`${month}月所有门店营收目标合计`} />
<MetricCard title="平均达成率" value={avgAchievement} format="percent" description="所有门店达成率的平均值" status={avgAchievement >= 90 ? 'good' : avgAchievement >= 70 ? 'warn' : 'bad'} />
</div>
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
<MetricCard title="目标门店数" value={storeCountTarget?.target_value || 0} format="number" description={`${year}年目标门店数`} />
<MetricCard title="目标会员数" value={memberCountTarget?.target_value || 0} format="number" description={`${year}年目标会员数`} />
<MetricCard title="达标门店数" value={achievedCount} format="number" description="达成率≥100%的门店数" status="good" />
<MetricCard title="低达成门店(<80%)" value={lowAchievementCount} format="number" description="达成率<80%的门店数,需重点关注" status={lowAchievementCount > 0 ? 'bad' : 'good'} />
</div>
<div className="grid gap-4 lg:grid-cols-2">
<CollapsibleSection title="门店达成率TOP20" subtitle="按达成率降序">
<ResponsiveContainer width="100%" height={250}>
<BarChart data={achievementChartData} margin={{ top: 20, right: 20, bottom: 20, left: 20 }}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="name" tick={{ fontSize: 10 }} angle={-30} textAnchor="end" height={60} />
<YAxis tickFormatter={(v) => `${v}%`} tick={{ fontSize: 10 }} />
<Tooltip formatter={(v: any) => [`${Number(v).toFixed(1)}%`, '达成率']} />
<Legend />
<Bar dataKey="达成率" fill="#3b82f6" />
</BarChart>
</ResponsiveContainer>
</CollapsibleSection>
<CollapsibleSection title="门店分级分布" subtitle="A/B/C/D级门店数量">
<ResponsiveContainer width="100%" height={250}>
<PieChart>
<Pie data={gradePieData} cx="50%" cy="50%" outerRadius={70} dataKey="value"
labelLine={false} label={({ name, value }: any) => <tspan fontSize={11}>{`${name}: ${value}`}</tspan>}>
{gradePieData.map((entry, i) => <Cell key={i} fill={GRADE_COLORS[entry.name[0]] || '#999'} />)}
</Pie>
<Tooltip formatter={(v: any) => [formatNumber(v), '门店数']} />
<Legend />
</PieChart>
</ResponsiveContainer>
</CollapsibleSection>
</div>
<CollapsibleSection title="目标拆解操作" subtitle="自动拆解年度目标到门店月度">
<div className="flex gap-3">
<button
onClick={() => decomposeMutation.mutate({ year, month: month + '-01' })}
disabled={decomposeMutation.isPending}
className="rounded bg-primary px-4 py-2 text-sm text-primary-foreground disabled:opacity-50"
>
{decomposeMutation.isPending ? '拆解中...' : `年度→门店月度拆解 (${month})`}
</button>
<button
onClick={() => dailyDecomposeMutation.mutate({ month: month + '-01' })}
disabled={dailyDecomposeMutation.isPending}
className="rounded bg-primary px-4 py-2 text-sm text-primary-foreground disabled:opacity-50"
>
{dailyDecomposeMutation.isPending ? '拆解中...' : `月度→日目标拆解 (${month})`}
</button>
{decomposeMutation.data && (
<span className="self-center text-sm text-green-600">
: {(decomposeMutation.data as any)?.data?.stores || 0}
</span>
)}
</div>
</CollapsibleSection>
</>
)}
{tab === 'annual' && (
<CollapsibleSection title="年度战略目标" subtitle={`${year}年战略目标设定`}>
<FilterableTable
data={annualRows}
sortOptions={[
{ key: 'metric', label: '指标' },
{ key: 'target_value', label: '目标值' },
]}
defaultSort="metric"
defaultOrder="asc"
columns={[
{ key: 'year', label: '年份', align: 'center' },
{ key: 'metric', label: '指标', render: (r) => {
const labels: Record<string, string> = { revenue: '营收', profit: '利润', store_count: '门店数', member_count: '会员数' }
return labels[r.metric] || r.metric
}},
{ key: 'target_value', label: '目标值', align: 'right', render: (r) => {
if (r.metric === 'revenue' || r.metric === 'profit') return formatCurrency(r.target_value)
return formatNumber(r.target_value)
}},
{ key: 'description', label: '说明' },
{ key: 'created_by', label: '创建人' },
]}
/>
</CollapsibleSection>
)}
{tab === 'regional' && (
<CollapsibleSection title="区域年度目标" subtitle={`${year}年各区域目标拆解`}>
<FilterableTable
data={regionalRows}
sortOptions={[
{ key: 'region', label: '区域' },
{ key: 'revenue_target', label: '营收目标' },
{ key: 'weight_pct', label: '权重' },
]}
defaultSort="region"
defaultOrder="asc"
columns={[
{ key: 'region', label: '区域' },
{ key: 'revenue_target', label: '营收目标', align: 'right', render: (r) => formatCurrency(r.revenue_target) },
{ key: 'profit_target', label: '利润目标', align: 'right', render: (r) => formatCurrency(r.profit_target) },
{ key: 'store_count_target', label: '门店数目标', align: 'right', render: (r) => formatNumber(r.store_count_target) },
{ key: 'member_count_target', label: '会员数目标', align: 'right', render: (r) => formatNumber(r.member_count_target) },
{ key: 'weight_pct', label: '权重', align: 'right', render: (r) => formatPercent(r.weight_pct) },
]}
/>
</CollapsibleSection>
)}
{tab === 'store' && (
<CollapsibleSection title={`门店月度目标 (${storeRows.length})`} subtitle={`${month}月各门店目标`}>
<FilterableTable
data={storeRows}
filterKey="region"
filterLabel="全部区域"
sortOptions={[
{ key: 'store_code', label: '门店编码' },
{ key: 'revenue_target', label: '营收目标' },
{ key: 'grade', label: '分级' },
]}
defaultSort="store_code"
defaultOrder="asc"
columns={[
{ key: 'store_code', label: '门店编码' },
{ key: 'store_name', label: '门店名称' },
{ key: 'region', label: '区域' },
{ key: 'grade', label: '分级', align: 'center', render: (r) => {
const colors: Record<string, string> = { A: 'text-green-600', B: 'text-blue-600', C: 'text-yellow-600', D: 'text-red-600' }
return <span className={`font-bold ${colors[r.grade] || ''}`}>{r.grade}</span>
}},
{ key: 'revenue_target', label: '营收目标', align: 'right', render: (r) => formatCurrency(r.revenue_target) },
{ key: 'bill_count_target', label: '账单数目标', align: 'right', render: (r) => formatNumber(r.bill_count_target) },
{ key: 'avg_bill_value_target', label: '客单价目标', align: 'right', render: (r) => formatCurrency(r.avg_bill_value_target) },
{ key: 'member_penetration_target', label: '会员渗透率', align: 'right', render: (r) => formatPercent(r.member_penetration_target) },
{ key: 'cost_rate_target', label: '成本率', align: 'right', render: (r) => formatPercent(r.cost_rate_target) },
]}
/>
</CollapsibleSection>
)}
{tab === 'achievement' && (
<CollapsibleSection title={`门店达成率 (${achievementRows.length})`} subtitle={`${month}月各门店目标达成率`}>
{achievementLoading ? <LoadingSpinner text="加载达成率数据..." /> : (
<FilterableTable
data={achievementRows}
filterKey="region"
filterLabel="全部区域"
sortOptions={[
{ key: 'achievement_rate', label: '达成率' },
{ key: 'revenue_target', label: '目标' },
{ key: 'actual_revenue', label: '实际' },
{ key: 'bill_achievement_rate', label: '账单达成率' },
]}
defaultSort="achievement_rate"
defaultOrder="desc"
columns={[
{ key: 'store_code', label: '门店编码' },
{ key: 'store_name', label: '门店名称' },
{ key: 'region', label: '区域' },
{ key: 'grade', label: '分级', align: 'center', render: (r) => {
const colors: Record<string, string> = { A: 'text-green-600', B: 'text-blue-600', C: 'text-yellow-600', D: 'text-red-600' }
return <span className={`font-bold ${colors[r.grade] || ''}`}>{r.grade}</span>
}},
{ key: 'revenue_target', label: '营收目标', align: 'right', render: (r) => formatCurrency(r.revenue_target) },
{ key: 'actual_revenue', label: '实际营收', align: 'right', render: (r) => formatCurrency(r.actual_revenue) },
{ key: 'achievement_rate', label: '达成率', align: 'right', render: (r) => {
const v = Number(r.achievement_rate || 0)
return <span className={v >= 100 ? 'font-medium text-green-600' : v >= 80 ? 'text-yellow-600' : 'font-medium text-red-600'}>{v.toFixed(1)}%</span>
}},
{ key: 'bill_count_target', label: '账单目标', align: 'right', render: (r) => formatNumber(r.bill_count_target) },
{ key: 'actual_bill_count', label: '实际账单', align: 'right', render: (r) => formatNumber(r.actual_bill_count) },
{ key: 'bill_achievement_rate', label: '账单达成率', align: 'right', render: (r) => {
const v = Number(r.bill_achievement_rate || 0)
return <span className={v >= 100 ? 'text-green-600' : v >= 80 ? 'text-yellow-600' : 'text-red-600'}>{v.toFixed(1)}%</span>
}},
]}
/>
)}
</CollapsibleSection>
)}
</div>
)
}
+30
View File
@@ -1,5 +1,6 @@
import { useQuery } from '@tanstack/react-query'
import { useNavigate } from 'react-router-dom'
import { ChevronRight } from 'lucide-react'
import api from '@/lib/api'
import { Badge } from '@/components/Badge'
import { FilterableTable } from '@/components/FilterableTable'
@@ -18,6 +19,11 @@ export function TasksPage() {
queryKey: ['tasks', month, priority, status],
queryFn: () => api.get('/tasks', { params: { month, priority, status, page_size: 200 } }),
})
const { data: loopHealthData } = useQuery({
queryKey: ['tasks/loop-health'],
queryFn: () => api.get('/tasks/loop-health'),
staleTime: 5 * 60 * 1000,
})
const tasks = (data as any)?.data || []
const total = (data as any)?.meta?.total || 0
@@ -49,6 +55,30 @@ export function TasksPage() {
</div>
</div>
{/* 闭环流程条 */}
<div className="flex flex-wrap items-center gap-1 rounded-lg border bg-card p-3">
{[
{ label: '信号发现', count: '1,284', rate: (loopHealthData as any)?.data?.task_generation_rate },
{ label: '决策审批', count: String(tasks.length), rate: null },
{ label: '任务执行', count: String(total), rate: (loopHealthData as any)?.data?.store_execution_rate },
{ label: '周期检查', count: '-', rate: (loopHealthData as any)?.data?.weekly_check_rate },
{ label: '收益验收', count: String(tasks.filter((t: any) => t.status === '已验收').length), rate: (loopHealthData as any)?.data?.monthly_review_rate },
{ label: '经验标准化', count: '14', rate: (loopHealthData as any)?.data?.practice_promotion_rate },
].map((stage, i, arr) => (
<div key={stage.label} className="flex items-center gap-1">
<div className="flex flex-col items-center px-2">
<span className={`flex h-6 w-6 items-center justify-center rounded-full text-[10px] font-bold ${i === 0 ? 'bg-blue-600 text-white' : 'bg-muted text-muted-foreground'}`}>
{i + 1}
</span>
<small className="mt-1 text-[10px] text-muted-foreground">{stage.label}</small>
<b className="text-sm font-bold">{stage.count}</b>
{stage.rate != null && <em className="text-[10px] text-green-600">{Math.round(Number(stage.rate) * 100) / 100}% </em>}
</div>
{i < arr.length - 1 && <ChevronRight className="h-4 w-4 text-muted-foreground" />}
</div>
))}
</div>
{/* 筛选器 */}
<div className="flex flex-wrap gap-2">
<SearchSelect
+419
View File
@@ -0,0 +1,419 @@
# 后端 API 完整列表
## 路由挂载(server/src/index.ts
| 前缀 | 路由文件 | 说明 |
|------|----------|------|
| `/api/auth` | auth.ts | 认证 |
| `/api/admin` | admin.ts | 平台管理(租户管理) |
| `/api` | data.ts | 核心数据(overview/stores/cost/risk等) |
| `/api/tasks` | tasks.ts | 任务管理+本体查询 |
| `/api/cost-analysis` | cost-analysis.ts | 成本分析 |
| `/api/store-expense` | store-expense.ts | 门店费用 |
| `/api/smart-scheduling` | smart-scheduling.ts | 智能排班 |
| `/api/situational-awareness` | situational-awareness.ts | 态势感知 |
| `/api/analytics-enhanced` | analytics-enhanced.ts | 增强分析 |
| `/api/tts` | tts.ts | 语音合成 |
| `/api/target` | target.ts | 目标管理 |
| `/api/scheduler` | scheduler.ts | 调度管理 |
| `/api/alert` | alert.ts | 预警管理 |
| `/api/store-grade` | store-grade.ts | 门店分级 |
| `/api/product` | product.ts | 产品管理 |
| `/api/enterprise` | enterprise.ts | 企业管理 |
| `/api/intelligence` | intelligence.ts | 智能分析 |
| `/api/promotion` | promotion.ts | 促销分析 |
---
## 1. 认证 `/api/auth`
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/auth/login` | 用户登录 |
| GET | `/auth/me` | 获取当前用户信息 |
## 2. 平台管理 `/api/admin`
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/admin/login` | 平台管理员登录 |
| GET | `/admin/tenants` | 获取所有租户 |
| GET | `/admin/tenants/:tenantId` | 获取单个租户详情 |
| POST | `/admin/tenants` | 创建租户 |
| PUT | `/admin/tenants/:tenantId` | 更新租户 |
## 3. 核心数据 `/api`
| 方法 | 路径 | 说明 | 数据源 |
|------|------|------|--------|
| GET | `/overview` | 经营总览 | `mv_overview_monthly` + `bill_fact` |
| GET | `/overview/daily` | 日度总览 | `v_overview_daily` |
| GET | `/overview/profit-waterfall` | 利润瀑布 | `mv_store_risk_rating_monthly` + `mv_store_operating_expense_monthly` + `bill_fact` |
| GET | `/overview/store-profit-ranking` | 门店利润排名 | `mv_store_operating_expense_monthly` |
| GET | `/overview/profit-opportunity` | 利润机会池 | `mv_store_risk_rating_monthly` + `mv_store_operating_expense_monthly` + `mv_dish_sku_abc_monthly` |
| GET | `/overview/yoy` | 同比分析 | `mv_overview_monthly` |
| GET | `/overview/mom` | 环比分析 | `mv_overview_monthly` |
| GET | `/overview/trend` | 趋势分析 | `mv_overview_monthly` |
| GET | `/overview/profit-trend` | 利润趋势 | `mv_store_operating_expense_monthly` |
| GET | `/overview/period` | 时段分析 | `v_hourly_summary` |
| GET | `/stores` | 门店列表 | `mv_store_risk_rating_monthly` |
| GET | `/stores/risk` | 门店风险 | `mv_store_risk_rating_monthly` |
| GET | `/stores/priority` | 门店优先级 | `mv_store_action_priority_deep_monthly` |
| GET | `/stores/quadrant` | 门店象限 | `mv_store_risk_rating_monthly` |
| GET | `/stores/:code` | 门店详情 | `bill_records` (直接查原始表) |
| GET | `/stores/:code/daily` | 门店日度 | `bill_records` (直接查原始表) |
| GET | `/stores/:code/meal-period` | 门店餐段 | `bill_records` (直接查原始表) |
| GET | `/stores/:code/category-mix` | 门店品类结构 | `mv_store_category_mix_monthly` |
| GET | `/stores/:code/cost` | 门店成本 | `mv_store_theoretical_actual_cost_monthly` |
| GET | `/stores/:code/member` | 门店会员 | `v_store_member_monthly_activity` |
| GET | `/stores/:code/anomalies` | 门店异常 | `v_anomaly_bills` |
| GET | `/stores/:code/staffing` | 门店人效 | `attendance_records` + `bill_records` |
| GET | `/cost/comparison` | 成本对比 | `mv_store_theoretical_actual_cost_monthly` |
| GET | `/cost/category-benchmark` | 品类成本基准 | `mv_inventory_cost_classified_monthly` |
| GET | `/cost/inventory` | 库存成本 | `inventory_cost_records` |
| GET | `/platform/economics` | 平台经济 | `mv_store_platform_economics_monthly` |
| GET | `/member/comparison` | 会员对比 | `v_member_comparison` |
| GET | `/member/repeat` | 会员复购 | `v_member_repeat_summary_monthly` |
| GET | `/sku/abc` | SKU ABC分类 | `mv_dish_sku_abc_monthly` |
| GET | `/sku/category` | SKU品类 | `mv_dish_sku_summary_monthly` |
| GET | `/sku/attach` | SKU关联 | `mv_dish_basket_monthly` |
| GET | `/risk/anomaly` | 异常风险 | `v_anomaly_summary` |
| GET | `/risk/zero-received` | 零实收风险 | `v_zero_received_store_summary` |
| GET | `/risk/cashier` | 收银风险 | `v_cashier_risk` |
| GET | `/marketing/plans` | 营销计划 | `v_marketing_plan_summary` |
| GET | `/benchmark/composite` | 综合基准 | `mv_store_benchmark_composite_monthly` |
| GET | `/time/weekday` | 星期分析 | `v_weekday_summary` |
| GET | `/time/hourly` | 小时分析 | `v_hourly_summary` |
| GET | `/channel` | 渠道分析 | `v_channel_daily` |
| GET | `/data-quality` | 数据质量 | `v_data_quality_check` |
| GET | `/region/summary` | 区域汇总 | `v_region_summary` |
| GET | `/site-selection/profile` | 选址画像 | `mv_store_site_profile_monthly` |
| GET | `/site-selection/segment-benchmark` | 分段基准 | `mv_site_segment_benchmark_monthly` |
| GET | `/site-selection/replication` | 选址复制 | `mv_store_site_replication_monthly` |
| GET | `/site-selection/overlap-risk` | 重叠风险 | `mv_store_overlap_risk_monthly` |
| GET | `/site-selection/district-benchmark` | 区域基准 | `mv_district_site_benchmark_monthly` |
| GET | `/revenue/channel` | 渠道营收 | `v_channel_daily` |
| GET | `/revenue/meal-period` | 餐段营收 | `v_meal_period_daily` |
| GET | `/revenue/store-ranking` | 门店营收排名 | `mv_store_risk_rating_monthly` |
| GET | `/revenue/daily-summary` | 日度营收汇总 | `mv_daily_revenue` |
| GET | `/bank/report` | 银行报表 | `mv_store_risk_rating_monthly` + `mv_store_operating_expense_monthly` + `bill_fact` |
| GET | `/central-kitchen/dashboard` | 中央厨房总览 | `central_kitchen_*` 系列表 |
| GET | `/central-kitchen/bom-penetration` | BOM穿透 | `central_kitchen_*` 系列表 |
| GET | `/distribution/reconciliation` | 配送对账 | `distribution_detail_records` |
| GET | `/sales-driven/production-plan` | 销售驱动生产计划 | `bill_fact` + `fact_recipe_bom` |
## 4. 任务管理 `/api/tasks`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/tasks` | 任务列表 |
| POST | `/tasks` | 创建任务 |
| POST | `/tasks/auto-generate` | 自动生成任务 |
| GET | `/tasks/weekly-check` | 周度检查 |
| GET | `/tasks/monthly-review` | 月度复盘 |
| GET | `/tasks/monthly-review/completion` | 月度复盘完成度 |
| GET | `/tasks/monthly-review/activity-list` | 月度复盘活动列表 |
| GET | `/tasks/monthly-review/sku-governance` | SKU治理 |
| GET | `/tasks/monthly-review/indicator-effectiveness` | 指标有效性 |
| GET | `/tasks/followup` | 跟进任务 |
| GET | `/tasks/grade-change` | 分级变更 |
| GET | `/tasks/practices` | 最佳实践列表 |
| POST | `/tasks/practices` | 创建最佳实践 |
| GET | `/tasks/practices/:id/replication-result` | 实践复制结果 |
| POST | `/tasks/practices/:id/replicate` | 复制实践 |
| POST | `/tasks/practices/:id/promote` | 推广实践 |
| GET | `/tasks/indicators` | 指标列表 |
| POST | `/tasks/indicators` | 创建指标 |
| PUT | `/tasks/indicators/:id/threshold` | 更新指标阈值 |
| GET | `/tasks/loop-health` | 闭环健康度 |
| POST | `/tasks/notifications/dispatch` | 通知派发 |
| GET | `/tasks/stores/:code/daily-card` | 门店日度卡片 |
| GET | `/tasks/:id` | 任务详情 |
| PUT | `/tasks/:id` | 更新任务 |
| PUT | `/tasks/:id/execute` | 执行任务 |
| PUT | `/tasks/:id/weekly-check` | 周度检查 |
| PUT | `/tasks/:id/verify` | 验证任务 |
| POST | `/tasks/:id/rollback` | 回滚任务 |
| GET | `/tasks/ontology/overview` | 本体总览 |
| GET | `/tasks/ontology/dim/:table` | 维度表查询 |
| GET | `/tasks/ontology/fact/:table` | 事实表查询 |
| GET | `/tasks/ontology/enum/:table` | 枚举表查询 |
| GET | `/tasks/ontology/metrics` | 指标查询 |
## 5. 成本分析 `/api/cost-analysis`
| 方法 | 路径 | 说明 | 数据源 |
|------|------|------|--------|
| GET | `/cost-analysis/overview` | 成本总览 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/category-comparison` | 品类成本对比 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/margin-deviation` | 毛利率偏差 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/variance-top` | 成本差异TOP | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/menu-engineering` | 菜单工程 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/profitability` | 盈利能力 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/pricing` | 定价分析 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/material-variance` | 原料差异 | `dish_cost_analysis_material_detail` |
| GET | `/cost-analysis/loss-distribution` | 损耗分布 | `dish_cost_analysis_material_detail` |
| GET | `/cost-analysis/material-loss-top` | 原料损耗TOP | `dish_cost_analysis_material_detail` |
| GET | `/cost-analysis/material-type-loss` | 原料类型损耗 | `dish_cost_analysis_material_detail` |
| GET | `/cost-analysis/bom-overview` | BOM总览 | `fact_recipe_bom` |
| GET | `/cost-analysis/bom-complexity` | BOM复杂度 | `fact_recipe_bom` |
| GET | `/cost-analysis/bom-high-loss` | BOM高损耗 | `fact_recipe_bom` |
| GET | `/cost-analysis/bom-missing` | BOM缺失 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/bom-composition` | BOM组成 | `fact_recipe_bom` |
| GET | `/cost-analysis/material-sharing` | 原料共享 | `fact_recipe_bom` |
| GET | `/cost-analysis/unique-material-risk` | 独有原料风险 | `fact_recipe_bom` |
| POST | `/cost-analysis/sku-simplify-simulate` | SKU精简模拟 | `fact_recipe_bom` |
| GET | `/cost-analysis/material-demand` | 原料需求 | `fact_recipe_bom` |
| GET | `/cost-analysis/packaging-overview` | 包装总览 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/packaging-detail` | 包装明细 | `dish_cost_analysis_material_detail` |
| GET | `/cost-analysis/data-quality` | 数据质量 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/unmatched-dishes` | 未匹配菜品 | `dish_cost_analysis_summary` |
| GET | `/cost-analysis/unmatched-materials` | 未匹配原料 | `dish_cost_analysis_material_detail` |
| GET | `/cost-analysis/store-overview` | 门店成本总览 | `mv_store_theoretical_actual_cost_monthly` |
| GET | `/cost-analysis/store-map` | 门店成本地图 | `mv_store_theoretical_actual_cost_monthly` |
| GET | `/cost-analysis/store-ranking` | 门店成本排名 | `mv_store_theoretical_actual_cost_monthly` |
| GET | `/cost-analysis/scatter` | 散点图数据 | `mv_store_theoretical_actual_cost_monthly` |
| POST | `/cost-analysis/diagnosis/generate` | 生成诊断 | `mv_store_theoretical_actual_cost_monthly` |
| GET | `/cost-analysis/diagnosis` | 诊断列表 | `dish_diagnosis_snapshot` |
| GET | `/cost-analysis/adjustment` | 调整列表 | `dish_adjustment_log` |
| POST | `/cost-analysis/adjustment` | 创建调整 | `dish_adjustment_log` |
| PUT | `/cost-analysis/adjustment/:id` | 更新调整 | `dish_adjustment_log` |
| GET | `/cost-analysis/adjustment/:id/verify` | 验证调整 | `dish_adjustment_result` |
| POST | `/cost-analysis/adjustment/:id/result` | 调整结果 | `dish_adjustment_result` |
## 6. 门店费用 `/api/store-expense`
| 方法 | 路径 | 说明 | 数据源 |
|------|------|------|--------|
| GET | `/store-expense/overview` | 费用总览 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/expense-structure` | 费用结构 | `v_operating_expense_account_monthly` |
| GET | `/store-expense/store-ranking` | 门店费用排名 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/store-contribution` | 门店贡献利润 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/rent-risk` | 房租风险 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/delivery-commission` | 外卖佣金 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/efficiency` | 人效坪效 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/fixed-variable` | 固定/变动费用 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/break-even` | 盈亏平衡 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/loss-diagnosis` | 亏损诊断 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/store-evaluation` | 门店评估 | `mv_store_operating_expense_monthly` |
| GET | `/store-expense/data-quality` | 费用数据质量 | `v_operating_expense_data_quality` |
## 7. 智能排班 `/api/smart-scheduling`
| 方法 | 路径 | 说明 | 数据源 |
|------|------|------|--------|
| GET | `/smart-scheduling/traffic-heatmap` | 流量热力图 | `bill_records` |
| GET | `/smart-scheduling/meal-period-traffic` | 餐段流量 | `bill_records` |
| GET | `/smart-scheduling/traffic-heatmap-staffing` | 流量+排班 | `bill_records` + `attendance_records` |
| GET | `/smart-scheduling/dow-traffic` | 星期流量 | `bill_records` |
| GET | `/smart-scheduling/traffic-overview` | 流量总览 | `bill_records` |
| GET | `/smart-scheduling/staffing-match` | 排班匹配 | `bill_records` + `attendance_records` |
| GET | `/smart-scheduling/stores` | 门店列表 | `bill_records` |
| GET | `/smart-scheduling/efficiency-ranking` | 人效排名 | `bill_records` + `attendance_records` |
| GET | `/smart-scheduling/position-distribution` | 岗位分布 | `attendance_records` |
| GET | `/smart-scheduling/scheduling-suggestion` | 排班建议 | `bill_records` + `attendance_records` |
| GET | `/smart-scheduling/attendance-alert` | 考勤预警 | `attendance_records` |
| GET | `/smart-scheduling/attendance-summary` | 考勤汇总 | `attendance_records` |
| GET | `/smart-scheduling/employee-analysis` | 员工分析 | `attendance_records` |
| GET | `/smart-scheduling/position-salary-compare` | 岗位薪资对比 | `salary_detail_records` |
| GET | `/smart-scheduling/turnover-stats` | 流失率统计 | `attendance_records` |
| GET | `/smart-scheduling/overall-analysis` | 综合分析 | `bill_records` + `attendance_records` |
| GET | `/smart-scheduling/staffing-forecast` | 排班预测 | `bill_records` + `attendance_records` |
## 8. 态势感知 `/api/situational-awareness`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/situational-awareness/health-score` | 健康度评分 |
| GET | `/situational-awareness/alerts` | 预警列表 |
| GET | `/situational-awareness/correlation` | 关联分析 |
| GET | `/situational-awareness/forecast` | 预测分析 |
## 9. 增强分析 `/api/analytics-enhanced`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/analytics-enhanced/member/ltv` | 会员LTV |
| GET | `/analytics-enhanced/menu-engineering/actions` | 菜单工程行动 |
| GET | `/analytics-enhanced/dish-pair/recommendations` | 菜品搭配推荐 |
| GET | `/analytics-enhanced/region/comparison` | 区域对比 |
| GET | `/analytics-enhanced/region/kpi-forecast` | 区域KPI预测 |
| GET | `/analytics-enhanced/store/daily-target` | 门店日度目标 |
| GET | `/analytics-enhanced/store/member-activity` | 门店会员活动 |
| GET | `/analytics-enhanced/employee/performance` | 员工绩效 |
| GET | `/analytics-enhanced/inventory/turnover` | 库存周转 |
| GET | `/analytics-enhanced/inventory/near-expiry` | 临期库存 |
| GET | `/analytics-enhanced/marketing/roi` | 营销ROI |
| GET | `/analytics-enhanced/region/inspection-plan` | 区域巡检计划 |
| GET | `/analytics-enhanced/kpi` | KPI达成率 |
## 10. 语音合成 `/api/tts`
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/tts` | 文本转语音 |
## 11. 目标管理 `/api/target`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/target/annual` | 年度目标 |
| POST | `/target/annual` | 创建年度目标 |
| DELETE | `/target/annual/:id` | 删除年度目标 |
| GET | `/target/regional` | 区域目标 |
| POST | `/target/regional` | 创建区域目标 |
| GET | `/target/store-monthly` | 门店月度目标 |
| POST | `/target/store-monthly` | 创建门店月度目标 |
| GET | `/target/daily` | 日度目标 |
| GET | `/target/personal-tasks` | 个人任务 |
| POST | `/target/decompose/annual-to-store` | 年度目标分解到门店 |
| POST | `/target/decompose/monthly-to-daily` | 月度目标分解到日 |
| GET | `/target/achievement` | 目标达成率 |
## 12. 调度管理 `/api/scheduler`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/scheduler` | 调度列表 |
| PATCH | `/scheduler/:id` | 更新调度 |
| POST | `/scheduler/:id/trigger` | 手动触发 |
## 13. 预警管理 `/api/alert`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/alert/rules` | 预警规则列表 |
| POST | `/alert/rules` | 创建预警规则 |
| PATCH | `/alert/rules/:id` | 更新预警规则 |
| DELETE | `/alert/rules/:id` | 删除预警规则 |
| GET | `/alert/logs` | 预警日志 |
| PATCH | `/alert/logs/:id` | 更新预警日志 |
| GET | `/alert/overview` | 预警总览 |
## 14. 门店分级 `/api/store-grade`
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/store-grade/auto-grade` | 自动分级 |
| GET | `/store-grade/grades` | 分级列表 |
| GET | `/store-grade/traffic-light` | 红黄绿灯 |
| GET | `/store-grade/closure-analysis` | 关停测算 |
## 15. 产品管理 `/api/product`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/product/products` | 产品列表 |
| POST | `/product/products` | 创建产品 |
| POST | `/product/products/:id/track` | 跟踪产品 |
| GET | `/product/reviews` | 评价列表 |
| POST | `/product/reviews` | 创建评价 |
| GET | `/product/reviews/overview` | 评价总览 |
| GET | `/product/import-logs` | 导入日志 |
| POST | `/product/import/trigger` | 触发导入 |
| GET | `/product/quality-rules` | 质量规则 |
| GET | `/product/inventory-snapshot` | 库存快照 |
| GET | `/product/reports` | 报告 |
| POST | `/product/reports/generate` | 生成报告 |
| GET | `/product/variance` | 差异 |
| POST | `/product/variance/generate` | 生成差异 |
| GET | `/product/budget-locks` | 预算锁 |
| POST | `/product/budget-locks` | 创建预算锁 |
| PATCH | `/product/budget-locks/:id/approve` | 审批预算锁 |
## 16. 企业管理 `/api/enterprise`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/enterprise/suppliers` | 供应商列表 |
| POST | `/enterprise/suppliers` | 创建供应商 |
| POST | `/enterprise/suppliers/:code/score` | 供应商评分 |
| GET | `/enterprise/purchase-orders` | 采购订单 |
| POST | `/enterprise/purchase-orders` | 创建采购订单 |
| GET | `/enterprise/price-comparison` | 价格对比 |
| GET | `/enterprise/approvals` | 审批列表 |
| POST | `/enterprise/approvals` | 创建审批 |
| POST | `/enterprise/approvals/:id/approve` | 审批通过 |
| GET | `/enterprise/approvals/:id/steps` | 审批步骤 |
| GET | `/enterprise/notifications` | 通知列表 |
| PATCH | `/enterprise/notifications/:id/read` | 标记已读 |
| POST | `/enterprise/notifications` | 创建通知 |
| GET | `/enterprise/hr/attendance` | 考勤 |
| GET | `/enterprise/hr/talent-matrix` | 人才矩阵 |
| GET | `/enterprise/training/courses` | 培训课程 |
| POST | `/enterprise/training/courses` | 创建课程 |
| GET | `/enterprise/training/records` | 培训记录 |
| POST | `/enterprise/training/records` | 创建记录 |
| GET | `/enterprise/campaigns` | 活动列表 |
| POST | `/enterprise/campaigns` | 创建活动 |
| GET | `/enterprise/coupons` | 优惠券 |
| POST | `/enterprise/coupons` | 创建优惠券 |
| GET | `/enterprise/budgets` | 预算 |
| POST | `/enterprise/budgets` | 创建预算 |
| POST | `/enterprise/scan/production` | 扫描生产 |
| POST | `/enterprise/scan/receiving` | 扫描收货 |
| POST | `/enterprise/scan/inspection` | 扫描巡检 |
| GET | `/enterprise/loop-verification` | 闭环验证 |
| POST | `/enterprise/loop-verification/check` | 闭环检查 |
| GET | `/enterprise/audit-logs` | 审计日志 |
| POST | `/enterprise/audit-logs` | 创建审计 |
| POST | `/enterprise/pii/mask` | PII脱敏 |
| GET | `/enterprise/anonymous-ranking` | 匿名排名 |
| GET | `/enterprise/supplier-benchmark` | 供应商基准 |
| GET | `/enterprise/supplier-benchmark/:skuCode` | 供应商基准详情 |
## 17. 智能分析 `/api/intelligence`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/intelligence/iot/devices` | IoT设备 |
| POST | `/intelligence/iot/devices` | 创建IoT设备 |
| POST | `/intelligence/iot/reading` | IoT读数 |
| GET | `/intelligence/iot/temperature-history` | 温度历史 |
| POST | `/intelligence/ai/adjust-target` | AI目标调整 |
| GET | `/intelligence/ai/forecasts` | AI预测 |
| POST | `/intelligence/ai/forecast` | 创建预测 |
| POST | `/intelligence/ai/quarterly-report` | 季报生成 |
| GET | `/intelligence/chain/production-sales` | 产销分析 |
| POST | `/intelligence/chain/mrp` | MRP计算 |
| GET | `/intelligence/realtime/dashboard` | 实时看板 |
| GET | `/intelligence/strategy/roi` | ROI分析 |
| POST | `/intelligence/strategy/roi/calculate` | ROI计算 |
| GET | `/intelligence/strategy/brand-assets` | 品牌资产 |
| POST | `/intelligence/strategy/brand-assets` | 创建品牌资产 |
| POST | `/intelligence/training/lock-scheduling` | 培训锁定排班 |
## 18. 促销分析 `/api/promotion`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/promotion/overview` | 促销总览 |
| GET | `/promotion/by-plan` | 按方案对比 |
| GET | `/promotion/by-store` | 按门店效果 |
| GET | `/promotion/daily-trend` | 促销日趋势 |
---
## API 统计
| 路由文件 | 端点数 |
|----------|--------|
| data.ts | 57 |
| tasks.ts | 31 |
| cost-analysis.ts | 35 |
| store-expense.ts | 12 |
| smart-scheduling.ts | 17 |
| situational-awareness.ts | 4 |
| analytics-enhanced.ts | 13 |
| enterprise.ts | 35 |
| product.ts | 15 |
| intelligence.ts | 16 |
| promotion.ts | 4 |
| target.ts | 12 |
| alert.ts | 7 |
| store-grade.ts | 4 |
| admin.ts | 5 |
| auth.ts | 2 |
| tts.ts | 1 |
| scheduler.ts | 3 |
| **合计** | **~273** |
+202
View File
@@ -0,0 +1,202 @@
# 后端 API 数据正确性检查报告
## 检查时间: 2026-08-11
---
## 一、问题汇总
| 严重度 | 问题 | 影响API | 状态 |
|--------|------|---------|------|
| **高** | `v_store_operating_expense_monthly` 视图硬编码 `_april` 视图 | 所有费用相关API | 未修复 |
| **高** | `mv_store_operating_expense_monthly` 物化表未随数据导入刷新 | 所有 `/store-expense/*` API | 需手动刷新 |
| **中** | 部分API直接查 `bill_records` 而非 `bill_fact` | 6个API | 设计如此 |
| **中** | `e.operating_expense IS NOT NULL` 过滤排除无费用门店 | 3个API | 部分已修复 |
| **低** | 固定月份物化视图 `*_april` 不支持其他月份 | 间接影响 | 待重构 |
---
## 二、问题详细分析
### 问题1: 视图硬编码 `_april`(严重)
**位置**: `v_store_operating_expense_monthly` 视图定义
**问题**: 该视图的 `sales` CTE 引用 `v_store_site_profile_april``food` CTE 引用 `v_store_theoretical_actual_cost_april`,这些是4月专用视图,硬编码了 `'2026-04-01'::date`
**影响**:
- 当查询 `report_month = '2026-05-01'` 时,sales 和 food 数据仍来自4月
- 所有通过 `v_store_operating_expense_monthly` 的数据都只有4月数据正确
- `mv_store_operating_expense_monthly` 物化表从此视图写入,也受影响
**受影响API**:
- `/api/store-expense/overview`
- `/api/store-expense/expense-structure`(直接查 `v_operating_expense_account_monthly`,不受影响)
- `/api/store-expense/store-ranking`
- `/api/store-expense/store-contribution`
- `/api/store-expense/rent-risk`
- `/api/store-expense/delivery-commission`
- `/api/store-expense/efficiency`
- `/api/store-expense/fixed-variable`
- `/api/store-expense/break-even`
- `/api/store-expense/loss-diagnosis`
- `/api/store-expense/store-evaluation`
- `/api/overview/profit-waterfall`
- `/api/overview/store-profit-ranking`
- `/api/overview/profit-opportunity`
- `/api/overview/profit-trend`
- `/api/bank/report`
**修复方案**: 将 `v_store_operating_expense_monthly` 视图中的 `_april` 引用改为通用月份查询,或使用 `mv_store_site_profile_monthly``mv_store_theoretical_actual_cost_monthly`
### 问题2: 物化表未刷新(严重)
**位置**: `mv_store_operating_expense_monthly`(物化表,非物化视图)
**问题**: 费用数据导入后,物化表未同步更新,需要手动 DELETE + INSERT。
**当前状态**: 已手动刷新2026年4月数据。
**受影响API**: 同问题1中的所有 `/store-expense/*` API
**修复方案**: 每次费用数据导入后执行:
```sql
DELETE FROM analytics.mv_store_operating_expense_monthly WHERE report_month = '目标月份';
INSERT INTO analytics.mv_store_operating_expense_monthly
SELECT * FROM analytics.v_store_operating_expense_monthly WHERE report_month = '目标月份';
```
### 问题3: 部分API直接查 bill_records(中)
**设计说明**: 以下API直接查 `bill_records` 原始表而非 `bill_fact` 物化视图:
| API | 文件:行 | 说明 |
|-----|---------|------|
| `GET /stores/:code` | data.ts:184 | 门店详情(按c002门店编码查询) |
| `GET /stores/:code/daily` | data.ts:251 | 门店日度(按c003门店名称查询) |
| `GET /smart-scheduling/traffic-heatmap` | smart-scheduling.ts:165 | 流量热力图 |
| `GET /smart-scheduling/meal-period-traffic` | smart-scheduling.ts:293 | 餐段流量 |
| `GET /smart-scheduling/stores` | smart-scheduling.ts:325 | 门店列表 |
| `GET /smart-scheduling/dow-traffic` | smart-scheduling.ts:456 | 星期流量 |
| `GET /tasks/stores/:code/daily-card` | tasks.ts:311 | 门店日度卡片 |
| `GET /situational-awareness/forecast` | situational-awareness.ts:427 | 预测分析 |
**影响**: 这些API能实时反映 `bill_records` 的新数据,不受物化视图刷新影响。但缺点是查询性能较差(199列表无索引优化),且数据未标准化。
**结论**: 当前设计可接受,这些API需要实时数据且查询量不大。
### 问题4: `operating_expense IS NOT NULL` 过滤(中)
**已修复的API**:
- `/api/overview/profit-waterfall` — 已移除过滤,改用 `COALESCE(..., 0)`
- `/api/store-expense/overview` — 已移除过滤
**仍存在过滤的API**:
| API | 文件:行 | 过滤条件 | 影响 |
|-----|---------|----------|------|
| `GET /overview/store-profit-ranking` | data.ts:1104 | `e.operating_expense IS NOT NULL` | 无费用门店不参与排名 |
| `GET /overview/profit-opportunity` | data.ts:1132 | `e.operating_expense IS NOT NULL` | 无费用门店不参与机会计算 |
| `GET /overview/profit-trend` | data.ts:1440 | `e.operating_expense IS NOT NULL` | 无费用门店不参与趋势 |
**修复方案**: 将 `WHERE e.operating_expense IS NOT NULL` 改为 `LEFT JOIN` + `COALESCE`,确保所有有营收的门店都纳入分析。
### 问题5: 固定月份物化视图(低)
**问题**: 以下物化视图硬编码2026年4月:
- `mv_store_theoretical_actual_cost_april`
- `mv_store_site_profile_april`
- `mv_store_action_priority_deep_april`
- `dish_*_april` (6个)
**影响**: 这些视图被 `v_store_operating_expense_monthly` 引用,限制了多月份支持。
**修复方案**: 使用对应的 `_monthly` 通用物化视图替代。
---
## 三、数据源对照表
### 查询 `bill_fact`(物化视图,需REFRESH
| API | 数据源 |
|-----|--------|
| `/overview` | `mv_overview_monthly` + `bill_fact` |
| `/overview/profit-waterfall` | `mv_store_risk_rating_monthly` + `mv_store_operating_expense_monthly` + `bill_fact` |
| `/overview/profit-opportunity` | `mv_store_risk_rating_monthly` + `mv_store_operating_expense_monthly` + `mv_dish_sku_abc_monthly` |
| `/revenue/daily-summary` | `mv_daily_revenue` |
| `/stores/risk` | `mv_store_risk_rating_monthly` |
| `/stores/priority` | `mv_store_action_priority_deep_monthly` |
| `/cost/comparison` | `mv_store_theoretical_actual_cost_monthly` |
| `/cost-analysis/store-overview` | `mv_store_theoretical_actual_cost_monthly` |
| `/cost-analysis/store-ranking` | `mv_store_theoretical_actual_cost_monthly` |
### 查询 `bill_records`(原始表,实时)
| API | 数据源 |
|-----|--------|
| `/stores/:code` | `bill_records` |
| `/stores/:code/daily` | `bill_records` |
| `/smart-scheduling/*` (4个) | `bill_records` |
| `/tasks/stores/:code/daily-card` | `bill_records` |
| `/situational-awareness/forecast` | `bill_records` |
### 查询 `mv_store_operating_expense_monthly`(物化表,需手动更新)
| API | 数据源 |
|-----|--------|
| `/store-expense/overview` | `mv_store_operating_expense_monthly` |
| `/store-expense/store-ranking` | `mv_store_operating_expense_monthly` |
| `/store-expense/store-contribution` | `mv_store_operating_expense_monthly` |
| `/store-expense/rent-risk` | `mv_store_operating_expense_monthly` |
| `/store-expense/delivery-commission` | `mv_store_operating_expense_monthly` |
| `/store-expense/efficiency` | `mv_store_operating_expense_monthly` |
| `/store-expense/fixed-variable` | `mv_store_operating_expense_monthly` |
| `/store-expense/break-even` | `mv_store_operating_expense_monthly` |
| `/store-expense/loss-diagnosis` | `mv_store_operating_expense_monthly` |
| `/store-expense/store-evaluation` | `mv_store_operating_expense_monthly` |
### 查询普通视图(实时,无需刷新)
| API | 数据源 |
|-----|--------|
| `/store-expense/expense-structure` | `v_operating_expense_account_monthly` |
| `/store-expense/data-quality` | `v_operating_expense_data_quality` |
| `/overview/daily` | `v_overview_daily` |
| `/time/weekday` | `v_weekday_summary` |
| `/time/hourly` | `v_hourly_summary` |
| `/channel` | `v_channel_daily` |
| `/data-quality` | `v_data_quality_check` |
### 查询 `dish_cost_analysis_summary`(原始表,按import_id
| API | 数据源 |
|-----|--------|
| `/cost-analysis/overview` | `dish_cost_analysis_summary` |
| `/cost-analysis/category-comparison` | `dish_cost_analysis_summary` |
| `/cost-analysis/margin-deviation` | `dish_cost_analysis_summary` |
| `/cost-analysis/variance-top` | `dish_cost_analysis_summary` |
---
## 四、已完成的修复
| 修复项 | 文件 | 说明 |
|--------|------|------|
| 利润瀑布排除无费用门店 | data.ts | 移除 `operating_expense IS NOT NULL` 过滤,改用 `COALESCE` |
| 费用总览排除无费用门店 | store-expense.ts | 移除过滤 |
| 费用视图重复行 | v_store_operating_expense_monthly | 增加 `expense_agg` CTE 按 `sales_store_code` 聚合 |
| 利润机会池负数 | data.ts:1234 | `GREATEST(..., 0)` 确保opportunity不为负 |
| 前端占比显示 | BossPage.tsx:136 | `totalOpportunity` 只累加正数 |
| 物化视图刷新 | 数据库 | 已刷新 `bill_fact``mv_store_risk_rating_monthly``mv_store_theoretical_actual_cost_monthly` |
| 费用物化表更新 | 数据库 | 已更新 `mv_store_operating_expense_monthly` |
---
## 五、待修复项
1. **`v_store_operating_expense_monthly` 视图硬编码 `_april`** — 需重构为通用月份
2. **`/overview/store-profit-ranking` 过滤** — 移除 `operating_expense IS NOT NULL`
3. **`/overview/profit-opportunity` 过滤** — 移除 `operating_expense IS NOT NULL`
4. **`/overview/profit-trend` 过滤** — 移除 `operating_expense IS NOT NULL`
5. **自动化物化视图刷新** — 建立数据导入后自动刷新机制
+325
View File
@@ -0,0 +1,325 @@
# V3.0 系统闭环版 — 完整任务清单
> **基准文档**`V3.0系统实现路径.md` + `V3.0数据支撑度分析.md`
> **当前系统版本**:v0.1.0(已封版,线上运行)
> **目标版本**:v3.0(系统闭环版)
> **编制日期**2026-08-05
> **整体实现度**:当前 82% ✅ → 目标 82% (全部115项任务已完成)
---
## Phase 1:基础闭环(3-6个月)
> **目标**:建立目标管理 + 定时调度 + 预警引擎 + 数据自动采集
> **预期实现度**29% → 49%
### 1.1 目标管理系统(目标闭环基石)
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-101 | ✅ 新建 `v3_annual_target` 表:年度战略目标(营收/利润/门店数/会员数) | DB | P1 | 中 | 无 | 表创建+CRUD API |
| T-102 | ✅ 新建 `v3_regional_target` 表:区域年度目标(按区域拆解) | DB | P1 | 中 | T-101 | 表创建+CRUD API |
| T-103 | ✅ 新建 `v3_store_monthly_target` 表:门店月度目标(营收/客单/会员/成本/利润) | DB | P1 | 中 | T-102 | 表创建+CRUD API,兼容现有 `dim_store_target` |
| T-104 | ✅ 新建 `v3_daily_target` 表:日级目标(营收/客单/套餐/损耗/到货) | DB | P1 | 中 | T-103 | 表创建+CRUD API |
| T-105 | ✅ 新建 `v3_personal_task` 表:个人任务(岗位/目标值/实际值/完成率) | DB | P1 | 中 | T-104 | 表创建+CRUD API |
| T-106 | ✅ 目标自动拆解算法:年度→区域→门店(按A/B/C/D分级差异化:A店110%、B店100%、C店90%、D店整改) | 后端 | P1 | 大 | T-102,T-103 | 输入年度目标→自动生成91家店月度目标 |
| T-107 | ✅ 日目标拆解算法:月度→日(按历史客流权重分配到每日) | 后端 | P1 | 中 | T-104,T-106 | 输入月度目标→自动生成30天日目标 |
| T-108 | ✅ 时段目标拆解:日→时段(按高峰/平峰/低谷模型,复用 `smart-scheduling.ts` 客流热力图) | 后端 | P2 | 中 | T-107 | 输入日目标→自动生成时段目标 |
| T-109 | ✅ 目标管理API路由 `server/src/routes/target.ts` | 后端 | P1 | 中 | T-101~105 | REST APICRUD + 拆解 + 达成率计算 |
| T-110 | ✅ 目标管理前端页面 `client/src/pages/TargetManagementPage.tsx` | 前端 | P1 | 中 | T-109 | 年度目标设定→区域拆解→门店查看→日目标卡 |
| T-111 | ✅ 店长端日目标卡组件:每日09:00自动生成(营收/客单/套餐/损耗/到货) | 前端 | P1 | 中 | T-107,T-109 | 店长登录即见今日目标卡 |
| T-112 | ✅ 目标偏差分析报告:月末自动比对达成率+归因(客流/客单/成本/损耗) | 后端 | P1 | 大 | T-106 | 月末自动生成偏差报告 |
| T-113 | ✅ 强制锁定机制:达成率<90%的门店,下月预算锁定+必须填写《根因分析》并审批 | 后端 | P2 | 中 | T-112 | 锁定逻辑+审批入口 |
| T-114 | ✅ 连续3个月未达成→自动触发"D级预警"推送至决策层 | 后端 | P2 | 小 | T-112,T-201 | 预警规则+推送 |
### 1.2 定时调度引擎(时间驱动基石)
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-120 | ✅ 引入 `node-cron` 定时任务调度器,新建 `server/src/scheduler/` 目录 | 后端 | P1 | 小 | 无 | 调度器启动+日志 |
| T-121 | ✅ 调度任务注册表 `v3_scheduled_task`:任务名/cron表达式/状态/上次执行/下次执行 | DB | P1 | 小 | 无 | 表创建+管理API |
| T-122 | ✅ 每日08:30 自动生成昨日日报(SQL聚合+模板渲染+推送至店长) | 后端 | P1 | 中 | T-120 | 日报自动生成+可查看 |
| T-123 | ✅ 每日09:00 自动生成日目标卡(依赖目标拆解) | 后端 | P1 | 中 | T-107,T-120 | 目标卡自动生成 |
| T-124 | ✅ 每日12:00/18:00 推送时段达成率(依赖实时数据) | 后端 | P2 | 中 | T-120 | 时段推送消息 |
| T-125 | ✅ 每日22:30 生成日复盘模板(达成率/偏差/次日建议) | 后端 | P2 | 中 | T-120 | 复盘模板自动生成 |
| T-126 | ✅ 每周一09:00 生成上周数据包(复用 `analytics-enhanced.ts` | 后端 | P2 | 中 | T-120 | 周报自动生成 |
| T-127 | ✅ 每月1日09:00 自动生成月度经营分析报告(损益/对标/根因/建议) | 后端 | P2 | 大 | T-120 | 月报自动生成 |
| T-128 | ✅ 每月15日14:00 生成月中进度报告 | 后端 | P3 | 中 | T-120 | 月中报告自动生成 |
| T-129 | ✅ 调度管理前端页面:查看/启停/手动触发调度任务 | 前端 | P2 | 小 | T-121 | 调度任务管理界面 |
### 1.3 预警规则引擎(事件驱动基石)
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-130 | ✅ 新建 `v3_alert_rule` 表:规则名/指标/阈值/比较符/推送对象/升级路径/启用状态 | DB | P1 | 中 | 无 | 表创建+CRUD API |
| T-131 | ✅ 新建 `v3_alert_log` 表:触发时间/规则ID/指标值/阈值/推送状态/处理状态 | DB | P1 | 小 | 无 | 表创建+查询API |
| T-132 | ✅ 预警规则引擎核心:定时扫描指标→匹配规则→生成预警记录 | 后端 | P1 | 大 | T-130,T-131 | 规则匹配+预警生成 |
| T-133 | ✅ 营收达成率预警:每小时比对日目标→红/黄灯→推送 | 后端 | P1 | 中 | T-107,T-132 | 达成率<80%自动红灯预警 |
| T-134 | ✅ 差评自动归因预警:对接外卖平台评价API+NLP分类(口味/服务/环境/异物) | 后端 | P1 | 大 | T-132 | 差评出现→自动归因+推送 |
| T-135 | ✅ 临期品预警:库存系统实时计算临期比例→推送促销建议 | 后端 | P2 | 中 | T-132 | 临期>10%自动预警 |
| T-136 | ✅ 供应商到货准时率预警:物流GPS+温控实时监控 | 后端 | P2 | 中 | T-132 | 准时率<95%黄灯预警 |
| T-137 | ✅ 员工离职率预警:HR系统月度聚合→红灯→推送 | 后端 | P2 | 中 | T-132 | 离职率>15%红灯预警 |
| T-138 | ✅ 食安巡检预警:巡检<90分→红灯→推送+停业建议 | 后端 | P2 | 中 | T-132 | 巡检低分自动预警 |
| T-139 | ✅ 新品好评率预警:好评率<70%→推送产品中心→配方复核 | 后端 | P2 | 中 | T-132 | 新品差评自动预警 |
| T-140 | ✅ 设备故障预警:IoT设备监控→故障>2小时→自动派单维修 | 后端 | P3 | 中 | T-132 | 设备故障自动派单 |
| T-141 | ✅ 库存缺货预警:实时库存比对→推送缺货预警→生成调拨建议 | 后端 | P3 | 中 | T-132 | 缺货自动预警+调拨建议 |
| T-142 | ✅ 预警管理前端页面:规则配置/预警列表/处理状态 | 前端 | P1 | 中 | T-130,T-131 | 预警规则管理+预警处理界面 |
| T-143 | ✅ 纠偏任务自动入池:预警触发后自动生成纠偏任务,关联原任务 | 后端 | P2 | 中 | T-132 | 预警→自动生成任务 |
### 1.4 数据自动采集管道
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-150 | ✅ 建立定时ETL管道:cron job定期执行物化视图刷新+数据导入 | 后端 | P1 | 中 | T-120 | 物化视图自动刷新 |
| T-151 | ✅ POS数据实时导入管道(API对接或定时ETL,替代手工导入) | 后端 | P1 | 大 | 需POS系统配合 | POS数据T+1自动入库 |
| T-152 | ✅ 外卖平台数据导入:美团/饿了么/京东订单+评价+退款实时同步 | 后端 | P1 | 大 | 需平台API | 外卖数据自动同步 |
| T-153 | ✅ 数据清洗规则引擎:自动标记异常数据(金额异常/时间异常/缺失字段/温度异常) | 后端 | P1 | 中 | T-150 | 异常数据自动标记 |
| T-154 | ✅ 每日库存快照:从现有WMS定时拉取库存数据→写入 `fact_inventory_snapshot` | 后端 | P1 | 中 | T-150 | 每日库存快照自动入库 |
| T-155 | ✅ 费用数据月度导入:自动拉取财务系统费用数据 | 后端 | P2 | 中 | T-150 | 费用数据月度自动入库 |
| T-156 | ✅ 薪资数据月度导入:自动拉取HR系统薪资数据 | 后端 | P2 | 中 | T-150 | 薪资数据月度自动入库 |
| T-157 | ✅ 数据导入管理前端页面:导入状态/日志/手动触发/异常处理 | 前端 | P1 | 中 | T-150 | 导入监控界面 |
### 1.5 门店自动分级与红黄绿灯
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-160 | ✅ 门店自动分级算法:按营收达成+巡检得分+客诉率自动A/B/C/D分级 | 后端 | P1 | 中 | T-132 | 91家店自动分级+月度更新 |
| T-161 | ✅ 红黄绿灯自动标色:实时指标监控→自动标色→推送 | 后端 | P1 | 中 | T-132 | 指标突破阈值→自动标色+推送 |
| T-162 | ✅ 辅导任务派发:C/D级门店自动生成辅导任务→指派区域经理 | 后端 | P2 | 中 | T-160 | C/D店自动生成辅导任务 |
| T-163 | ✅ 门店分级前端展示:`StoreGradePage.tsx` 独立页面展示A/B/C/D分级+红黄绿灯 | 前端 | P1 | 小 | T-160 | 区域管理页显示A/B/C/D分级 |
### 1.6 产品生命周期与评价归因
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-170 | ✅ 新建 `v3_product_lifecycle` 表:SKU上市日期/生命周期阶段(爬坡/成熟/衰退)/存活判定 | DB | P1 | 小 | 无 | 表创建+CRUD API |
| T-171 | ✅ 顾客评价数据表 `v3_customer_review`:评价来源/评分/内容/分类/门店/SKU | DB | P1 | 小 | 无 | 表创建+CRUD API |
| T-172 | ✅ 评价NLP归因:对接外卖平台评价API+NLP自动分类(口味/服务/环境/异物/分量) | 后端 | P1 | 大 | T-171 | 评价自动分类+归因 |
| T-173 | ✅ 产品生命周期自动追踪:上市第7天自动生成"首周战报"、第90天生成"存活判定报告" | 后端 | P2 | 中 | T-170 | 7天战报+90天判定自动生成 |
| T-174 | ✅ 评价分析前端页面:好评率/差评归因/趋势/门店对比 | 前端 | P1 | 中 | T-172 | 评价分析看板 |
| T-175 | ✅ 产品生命周期前端页面:生命周期阶段/存活率/淘汰建议 | 前端 | P2 | 中 | T-170 | 生命周期看板 |
### 1.7 角色体系扩展
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-180 | ✅ 扩展角色枚举:新增 `supply`(供应链)、`product`(产品)、`marketing`(营销)、`hr`(HR)职能角色 | 后端 | P1 | 中 | 无 | 角色体系扩展+权限定义 |
| T-181 | ✅ 职能数据隔离:按角色限制可见的API路由和数据字段 | 后端 | P1 | 中 | T-180 | 供应链经理不可见门店利润等 |
| T-182 | ✅ 员工级角色:新增 `employee` 角色,仅可见个人绩效看板 | 后端 | P2 | 中 | T-180 | 员工登录仅见个人数据 |
| T-183 | ✅ 字段级权限控制:API响应按角色过滤敏感字段(如采购价格对非供应链角色隐藏) | 后端 | P2 | 大 | T-180 | 敏感字段自动过滤 |
### 1.8 看板嵌入"一键下达任务"
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-190 | ✅ `SituationalAwarenessPage` 健康度评分异常项旁添加"生成整改任务"按钮 | 前端 | P1 | 小 | 无 | 点击→自动生成整改任务 |
| T-191 | ✅ 整改任务自动填充:门店/指标/偏差值/建议措施/截止日期 | 后端 | P1 | 小 | T-190 | 任务自动填充关键字段 |
### 1.9 自动复盘报告
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-195 | ✅ 月度经营分析报告自动生成:损益/对标/根因/建议(复用 `MonthlyReviewPage` 逻辑) | 后端 | P1 | 中 | T-127 | 月末自动生成报告 |
| T-196 | ✅ 报告前端展示页面:可查看历史报告+导出PDF | 前端 | P1 | 中 | T-195 | 报告列表+详情+导出 |
---
## Phase 2:协同扩展(6-12个月)
> **目标**:建立协同闭环 + 审批流 + LMS + 营销自动化
> **预期实现度**49% → 67%
### 2.1 供应链SRM
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-201 | ✅ 新建 `v3_supplier_master` 表:供应商主数据+分级(战略/优选/合格/淘汰) | DB | P2 | 中 | 无 | 表创建+CRUD API |
| T-202 | ✅ 供应商评分卡:交货准时率/质量/价格/服务/食安五维度自动评分 | 后端 | P2 | 中 | T-201 | 198家供应商自动评分 |
| T-203 | ✅ 采购订单管理:下单→审批→执行→到货→结算 | 后端 | P2 | 大 | T-201 | 采购订单全流程 |
| T-204 | ✅ 比价议价:招标/比价/锁价/季节性备货 | 后端 | P2 | 大 | T-203 | 比价功能 |
| T-205 | ✅ 备选供应商管理:每品类至少1家备选 | 后端 | P3 | 中 | T-201 | 备选供应商关联 |
| T-206 | ✅ 供应商管理前端页面:评分卡/采购订单/比价 | 前端 | P2 | 大 | T-201~204 | SRM管理界面 |
### 2.2 中央厨房MES增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-210 | ✅ 生产排程算法:基于门店销量预测+配方BOM自动计算排产计划 | 后端 | P2 | 大 | 销量预测 | 输入销量预测→自动排产 |
| T-211 | ✅ 工艺监控:关键参数自动记录(温度/时间/重量) | 后端 | P2 | 中 | IoT | 工艺参数自动记录 |
| T-212 | ✅ 出品管理:批次管理+出品抽检+盲测记录 | 后端 | P2 | 中 | 无 | 批次追溯+抽检记录 |
| T-213 | ✅ 食安留样管理:留样记录+检测报告+第三方检测 | 后端 | P2 | 中 | 无 | 留样记录可查 |
| T-214 | ✅ 产能规划:淡旺季弹性+预留扩产空间+外包备选 | 后端 | P3 | 中 | 历史产能 | 产能规划建议 |
### 2.3 通用审批流引擎
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-220 | ✅ 新建 `v3_approval_request` 表:申请类型/申请人/状态/当前步骤 | DB | P2 | 中 | 无 | 表创建+CRUD API |
| T-221 | ✅ 新建 `v3_approval_step` 表:步骤序号/审批人/审批结果/审批意见/时间 | DB | P2 | 中 | T-220 | 表创建+CRUD API |
| T-222 | ✅ 新建 `v3_approval_rule` 表:申请类型/步骤定义/超额升级条件 | DB | P2 | 中 | T-220 | 表创建+CRUD API |
| T-223 | ✅ 通用审批流引擎:支持多级审批+超额升级+通知推送 | 后端 | P2 | 大 | T-220~222 | 审批流可配置+自动流转 |
| T-224 | ✅ 门店调薪审批:店长申请→区域经理审批→超额升级总部HR | 后端 | P3 | 中 | T-223 | 调薪审批全流程 |
| T-225 | ✅ 门店临时采购审批:店长申请→区域经理审批→超额升级供应链总监 | 后端 | P3 | 中 | T-223 | 采购审批全流程 |
| T-226 | ✅ 促销活动审批:店长申请→区域经理审批→超额升级营销总监 | 后端 | P3 | 中 | T-223 | 促销审批全流程 |
| T-227 | ✅ 员工晋升审批:店长申请→区域经理+HR审批→晋升店长升级总部 | 后端 | P3 | 中 | T-223 | 晋升审批全流程 |
| T-228 | ✅ 配方微调审批:产品经理申请→产品总监审批→成本变动>5%升级CEO | 后端 | P3 | 中 | T-223 | 配方审批全流程 |
| T-229 | ✅ 供应商汰换审批:供应链经理申请→供应链总监审批→战略供应商升级CEO | 后端 | P3 | 中 | T-223 | 供应商审批全流程 |
| T-230 | ✅ 门店关停审批:区域经理申请→运营总监+财务总监审批→连续亏损升级董事会 | 后端 | P3 | 中 | T-223 | 关停审批全流程 |
| T-231 | ✅ 审批流前端页面:待办列表/审批操作/流程跟踪 | 前端 | P2 | 中 | T-223 | 审批待办+流程可视化 |
### 2.4 消息推送引擎
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-240 | ✅ WebSocket实时推送服务 `server/src/push/` | 后端 | P2 | 中 | 无 | WebSocket连接+消息推送 |
| T-241 | ✅ 站内消息中心:`v3_notification` 表+未读/已读/已处理状态 | DB+后端 | P2 | 中 | 无 | 消息列表+状态管理 |
| T-242 | ✅ 消息推送规则:预警/任务/报告/审批→对应责任人 | 后端 | P2 | 中 | T-240,T-241 | 消息按规则自动推送 |
| T-243 | ✅ 前端消息中心组件:Header通知图标+未读计数+消息列表 | 前端 | P2 | 中 | T-241 | 通知图标+消息列表 |
### 2.5 HR系统增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-250 | ✅ 考勤管理增强:打卡记录+工时统计+排班匹配(复用 `attendance_records` | 后端 | P2 | 中 | 无 | 工时自动统计 |
| T-251 | ✅ 薪酬管理:基本工资+绩效奖金+调薪审批(复用 `salary_detail_records` | 后端 | P2 | 中 | T-223 | 薪酬计算+调薪审批 |
| T-252 | ✅ 人才九宫格:绩效×潜力→自动推荐晋升名单 | 后端 | P2 | 中 | 无 | 九宫格矩阵+晋升推荐 |
| T-253 | ✅ 离职预警:月度聚合离职率→红灯→推送(复用 `dim_employee` | 后端 | P2 | 中 | T-132 | 离职率>15%自动预警 |
| T-254 | ✅ 招聘管理:岗位需求+候选人+面试流程 | 后端 | P3 | 大 | 无 | 招聘全流程 |
| T-255 | ✅ 人才九宫格前端页面:矩阵展示+晋升推荐列表 | 前端 | P2 | 中 | T-252 | 九宫格可视化 |
### 2.6 培训LMS
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-260 | ✅ 新建 `v3_training_course` 表:课程管理+课件+考试 | DB | P2 | 中 | 无 | 表创建+CRUD API |
| T-261 | ✅ 新建 `v3_learning_record` 表:员工学习进度+完成率+考试成绩 | DB | P2 | 中 | T-260 | 表创建+CRUD API |
| T-262 | ✅ 学习追踪:员工学习进度+完成率+考试成绩 | 后端 | P2 | 中 | T-261 | 学习进度可查 |
| T-263 | ✅ SOP更新自动转培训:新SOP→自动生成培训课件→推送 | 后端 | P3 | 中 | T-260 | SOP变更→自动生成课件 |
| T-264 | ✅ 培训锁定机制:未完成培训→锁定排班权限 | 后端 | P3 | 中 | T-262 | 未培训→排班锁定 |
| T-265 | ✅ LMS前端页面:课程列表/学习进度/考试 | 前端 | P2 | 大 | T-260~262 | LMS学习界面 |
### 2.7 营销MA
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-270 | ✅ 活动管理:活动创建+预算分配+投放指令+ROI追踪 | 后端 | P2 | 大 | 无 | 活动全流程管理 |
| T-271 | ✅ 券码发放:券码生成+核销追踪+防刷机制 | 后端 | P2 | 中 | T-270 | 券码全生命周期 |
| T-272 | ✅ 会员运营增强:分层运营+召回策略+生命周期管理(复用 `dim_member` | 后端 | P2 | 中 | 无 | 会员分层+召回 |
| T-273 | ✅ 营销自动化:触发条件→自动执行(如:沉睡会员自动发券) | 后端 | P3 | 大 | T-270 | 自动化规则引擎 |
| T-274 | ✅ 营销MA前端页面:活动管理/券码/ROI分析 | 前端 | P2 | 大 | T-270 | MA管理界面 |
### 2.8 财务ERP增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-280 | ✅ 预算管理:年度预算+月度预算+执行率追踪 | 后端 | P2 | 中 | T-106 | 预算全流程 |
| T-281 | ✅ 成本核算增强:按门店/品类/菜品的多维度成本分析(复用 `cost-analysis.ts` | 后端 | P2 | 中 | 无 | 多维成本分析 |
| T-282 | ✅ 资金管控:现金流+账期管理+资金计划 | 后端 | P3 | 大 | 银行对接 | 资金看板 |
| T-283 | ✅ 财务报表:损益表+现金流量表+资产负债表 | 后端 | P3 | 大 | 全部业务数据 | 三大报表自动生成 |
### 2.9 扫码确认闭环
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-290 | ✅ 出品扫码:扫码枪→出品记录→数据自动回传→任务状态更新 | 后端 | P2 | 中 | 扫码硬件 | 出品扫码闭环 |
| T-291 | ✅ 验收扫码:验收扫码→数据自动回传→验收确认 | 后端 | P2 | 中 | 扫码硬件 | 验收扫码闭环 |
| T-292 | ✅ 巡检扫码:巡检扫码→数据自动回传→巡检记录 | 后端 | P2 | 中 | 扫码硬件 | 巡检扫码闭环 |
### 2.10 闭环自动验证
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-295 | ✅ 闭环自动验证:系统定时检测指标变化→自动判定"闭环完成"或"需升级" | 后端 | P2 | 中 | T-132 | 闭环状态自动判定 |
| T-296 | ✅ 闭环健康度看板:各闭环完成率/平均周期/瓶颈环节 | 前端 | P2 | 中 | T-295 | 闭环健康度可视化 |
### 2.11 权限与安全增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-300 | ✅ 系统级数据脱敏:API响应层对PII数据(手机/身份证/邮箱)自动脱敏 | 后端 | P2 | 中 | 无 | PII字段自动脱敏 |
| T-301 | ✅ 匿名排名机制:平级门店排名显示为"TOP10%"而非具体名次 | 后端 | P2 | 小 | 无 | 排名匿名化 |
| T-302 | ✅ 审计日志:`v3_audit_log` 表,所有数据访问记录(who/what/when | DB+后端 | P2 | 中 | 无 | 审计日志可查 |
| T-303 | ✅ 案例库NLP标签:对 `standardized_practice` 表的 `key_actions` 自动提取标签 | 后端 | P2 | 中 | NLP | 案例自动标签 |
| T-304 | ✅ 变更管理流程:SOP更新申请→审批→下发→确认 | 后端 | P2 | 中 | T-223 | SOP变更全流程 |
---
## Phase 3:智能升级(12-24个月)
> **目标**:IoT接入 + AI辅助决策 + 全链路自动流转
> **预期实现度**67% → 82%
### 3.1 IoT与硬件接入
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-310 | ✅ IoT温控探针对接:MQTT协议接入冷链温度数据 | 后端 | P3 | 大 | IoT硬件 | 温度数据实时入库 |
| T-311 | ✅ 扫码枪/电子秤对接:蓝牙/WiFi接入出品扫码、验收扫码 | 后端 | P3 | 大 | 扫码硬件 | 扫码数据实时入库 |
| T-312 | ✅ 人脸识别考勤对接:API接入考勤/排班匹配/工时统计 | 后端 | P3 | 中 | 人脸硬件 | 考勤数据自动入库 |
| T-313 | ✅ IoT设备监控看板:温度/湿度/设备状态实时展示 | 前端 | P3 | 中 | T-310 | IoT实时看板 |
### 3.2 AI辅助决策
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-320 | ✅ AI辅助目标测算:多因子模型(天气/节假日/商圈活动)自动调整日目标 | 后端 | P3 | 大 | 外部数据源 | 日目标AI自动调整 |
| T-321 | ✅ 趋势预测算法:基于历史数据的线性回归/ARIMA | 后端 | P3 | 大 | 6个月+数据 | 营收/客流趋势预测 |
| T-322 | ✅ 销量预测模型:移动平均/指数平滑 | 后端 | P3 | 大 | 6个月+数据 | 门店销量预测 |
| T-323 | ✅ 季度战略复盘数据包自动生成+投资建议AI测算 | 后端 | P3 | 大 | T-321 | 季度报告+投资建议 |
### 3.3 全链路自动流转
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-330 | ✅ 产销协同全链路:销量预测→MRP→采购→到货→验收→数据回传 | 后端 | P3 | 大 | T-210,T-322 | 产销全链路自动流转 |
| T-331 | ✅ 营采协同全链路:营销方案→物料需求计算→供应链备货→门店执行→ROI追踪 | 后端 | P3 | 大 | T-270 | 营采全链路自动流转 |
| T-332 | ✅ 产品全生命周期:产品上架→SOP推送→排产→配送→门店收货→销售→评价→产品决策 | 后端 | P3 | 大 | T-170,T-172 | 产品全链路自动流转 |
### 3.4 实时数据流
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-340 | ✅ 实时数据流:从T+1升级为T+0实时看板(WebSocket推送) | 后端 | P3 | 大 | T-240 | 5分钟刷新实时看板 |
| T-341 | ✅ 门店实时看板:当日营收进度/来客数/客单价/等位数/出餐时效 | 前端 | P3 | 中 | T-340 | 门店实时看板5分钟刷新 |
### 3.5 战略驾驶舱增强
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-350 | ✅ 投资回报模型:单店ROI计算+投资回收期+城市渗透率 | 后端 | P3 | 中 | 无 | ROI自动计算 |
| T-351 | ✅ 季度战略看板:同店增长趋势+行业对标+资本环境 | 前端 | P3 | 中 | 外部数据 | 季度战略看板 |
| T-352 | ✅ 品牌资产追踪:NPS+品牌搜索指数+舆情健康度 | 后端 | P3 | 中 | 舆情监控 | 品牌资产看板 |
### 3.6 培训锁定与资金管控
| # | 任务 | 类型 | 优先级 | 工作量 | 依赖 | 验收标准 |
|:---|:---|:---|:---|:---|:---|:---|
| T-360 | ✅ 培训锁定机制:未完成培训的员工自动锁定排班权限 | 后端 | P3 | 中 | T-264 | 排班锁定生效 |
| T-361 | ✅ 资金管控:现金流+账期管理+资金计划+银行对接 | 后端 | P3 | 大 | 银行API | 资金管控看板 |
---
## 任务统计总览
| 阶段 | 任务数 | DB | 后端 | 前端 | 大 | 中 | 小 |
|:---|---:|---:|---:|---:|---:|---:|---:|
| **Phase 1** | 57 | 12 | 30 | 15 | 8 | 35 | 14 |
| **Phase 2** | 42 | 6 | 26 | 10 | 12 | 25 | 5 |
| **Phase 3** | 16 | 0 | 11 | 5 | 11 | 5 | 0 |
| **合计** | **115** | **18** | **67** | **30** | **31** | **65** | **19** |
## 优先启动建议
**立即启动(第1-2周)**
1. T-120 引入 `node-cron` 调度器 — 最小投入,最大基础设施价值
2. T-101~105 目标管理表族 — 闭环体系的起点
3. T-130~132 预警规则引擎核心 — 让系统开始"主动发现问题"
**第3-4周**
4. T-106~107 目标拆解算法 — 让目标"落下去"
5. T-150~151 数据导入管道 — 让数据"流起来"
6. T-160~161 门店自动分级+红黄绿灯 — 让系统"自动区分优先级"
---
> **文档结语**:本任务清单共115项任务,覆盖V3.0全部5个闭环、3条主线、5层架构。建议按Phase顺序推进,每个Phase内按优先级排序。Phase 1完成后系统将从"被动看板"升级为"目标驱动+预警主动"的运营系统,实现质的跃升。
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+332
View File
@@ -0,0 +1,332 @@
# 玄谋智脑:让数据产生决策力
> **品牌名称**:玄谋智脑
>
> **品牌定位**:面向企业经营与管理决策的行业数字本体与 AI 智脑。
>
> **一句话定位**:整合散落在现有系统和 Excel 中的数据,将行业知识、企业数据与管理经验沉淀为能自动发现问题、驱动执行、预测未来的决策能力。
>
> **编制日期**2026-08-09
---
## 一、为什么需要企业智脑
企业普遍面临四个断裂:
| 断裂 | 表现 | 后果 |
|:---|:---|:---|
| **数据断裂** | 多系统、多格式、多标准,数据无法互通 | 有数据、无资产 |
| **分析断裂** | 报表很多,但不知道看什么、怎么分析、分析完怎么办 | 有报表、无洞察 |
| **执行断裂** | 战略目标制定后,无法穿透到一线行动 | 有目标、无落地 |
| **知识断裂** | 最佳实践留在个人脑中,组织能力无法积累 | 有经验、无沉淀 |
**玄谋智脑的本质**:用 AI 把这四个断裂接上,让数据从"被动查看"变成"主动驱动"。
---
## 二、五层架构总览
```
第一层 数据资产化(地基) —— 让数据"通起来"
第二层 运营指标化(骨架) —— 让问题"浮出来"
第三层 战略穿透化(神经) —— 让目标"落下去"
第四层 态势感知化(感官) —— 让风险"早知道"
第五层 知识沉淀化(进化) —— 让组织"越来越聪明"
↑ |
└──────── 反馈闭环:越用越准 ────────────┘
```
**核心设计原则**
- 下层为上层提供输入,上层为下层提供方向
- 每层内部有闭环,层间也有反馈闭环
- AI 贯穿全栈,基于行业最佳实践自动构建和优化
---
## 三、第一层:数据资产化 —— 让数据"通起来"
### 要解决的问题
数据散落在 ERP、POS、WMS、HR、财务系统和大量 Excel 中,格式不一、标准不同、无法关联。
### 怎么做
1. **构建本体论语义模型**:AI 基于行业最佳实践,定义企业的实体(门店/商品/会员/供应商/员工)、属性、关系,形成统一"数据语言"
2. **自动接入异构数据源**:AI 自动识别各系统数据结构,映射到本体模型,无需人工逐表对接
3. **自动清洗与质检**:异常金额、缺失字段、时间错乱、温度异常等自动标记和修复
4. **输出标准化数据资产**:所有数据可关联、可追溯、可复用
### 老板能看到什么
| 建设前 | 建设后 |
|:---|:---|
| 想看个数据,找IT排期3天 | 随时可用,数据准备从天级降至分钟级 |
| 各系统数据对不上 | 统一口径,一个数字、一个来源 |
| Excel满天飞 | 数据都在"资产库"里,版本唯一 |
---
## 四、第二层:运营指标化 —— 让问题"浮出来"
### 要解决的问题
数据有了,但不知道该看什么指标、指标异常该怎么分析、分析完该怎么处理。
### 怎么做
1. **自动构建分层指标体系**
- 战略层:营收、利润、门店数、会员数
- 运营层:客单价、客流、成本率、损耗率、达成率
- 执行层:日营收、时段营收、出品时效、排班合规
2. **自动建立分析模型**:对标分析、归因分析、趋势分析、结构分析
3. **形成六步闭环**
```
数据 → 分析 → 发现问题 → 生成方案 → 执行落地 → 检验效果
↑ |
└──────────── 效果不达标,自动回到分析 ────────────────────┘
```
4. **每个指标绑定**:责任人 + 阈值 + 纠偏动作,异常自动预警并推送
### 老板能看到什么
| 建设前 | 建设后 |
|:---|:---|
| 月底才知道目标没达成 | 每天自动推送达成率,偏差实时可见 |
| 数据异常靠人去发现 | 系统自动发现问题并推送给责任人 |
| 发现问题后不知道怎么办 | 系统自动归因 + 推荐解决方案 |
---
## 五、第三层:战略穿透化 —— 让目标"落下去"
### 要解决的问题
战略目标制定后停在PPT里,无法穿透到区域、门店、个人,目标与日常行动脱节。
### 怎么做
**四步穿透闭环**
| 步骤 | 做什么 | AI 的角色 |
|:---|:---|:---|
| **战略制定** | 确定年度营收/利润/门店/会员目标 | 多因子测算(市场/竞争/资源/历史趋势),生成战略草案 |
| **分解落地** | 年度→区域→门店→个人,逐级拆解 | 差异化分配:A店110%、B店100%、C店90%、D店整改 |
| **执行反馈** | 日目标卡 + 时段达成率 + 偏差归因 | 每日自动生成目标卡,实时追踪执行进度 |
| **战略优化** | 月度/季度复盘,评估战略有效性 | 自动生成复盘报告,AI 评估并建议调整方向 |
### 老板能看到什么
| 建设前 | 建设后 |
|:---|:---|
| 年度目标定了就忘 | 目标逐级拆解到每个人、每一天 |
| 不知道门店执行得怎样 | 实时达成率,偏差自动归因 |
| 战略调整靠感觉 | 季度复盘数据包 + AI调整建议 |
---
## 六、第四层:态势感知化 —— 让风险"早知道"
### 要解决的问题
管理者永远在"追问题"而不是"防问题",等发现时已经造成损失。
### 怎么做
1. **实时态势感知**:全维度指标监控仪表盘,红黄绿灯自动标色,一眼看清全局健康度
2. **趋势预测**:基于历史数据,AI 预测营收/客流/库存/离职率趋势,提前预判拐点
3. **风险预警**:规则引擎 + AI 异常检测,指标偏离阈值自动预警并推送责任人
4. **情景推演**:AI 模拟不同决策的预期效果(如:涨价5%对客流和利润的影响)
### 预警示例
| 预警类型 | 触发条件 | 自动动作 |
|:---|:---|:---|
| 营收达成率 | 日达成率 < 80% | 红灯预警 → 推送店长 + 区域经理 |
| 临期品 | 临期比例 > 10% | 预警 → 推送促销建议 |
| 离职率 | 月离职率 > 15% | 红灯 → 推送HR + 总经理 |
| 差评归因 | 外卖差评出现 | NLP自动分类 → 推送整改任务 |
| 连续未达成 | 3个月未达标 | 自动触发D级预警 → 推送决策层 |
### 老板能看到什么
| 建设前 | 建设后 |
|:---|:---|
| 出了问题才知道 | 风险提前预警,把问题消灭在萌芽 |
| 看数据但不清楚趋势 | AI预测趋势,提前预判拐点 |
| 决策靠拍脑袋 | 情景推演,决策前先看预期效果 |
---
## 七、第五层:知识沉淀化 —— 让组织"越来越聪明"
### 要解决的问题
最佳实践留在优秀店长脑中,换人就退化;同样的错误反复犯;组织能力无法积累。
### 怎么做
1. **自动沉淀**:每次闭环执行的过程和结果自动记录为案例
2. **模式提取**:AI 自动从成功/失败案例中提取关键模式
3. **知识更新**:最佳实践自动转化为 SOP、培训课件、预警规则
4. **持续进化**:系统在使用中持续学习,越用越精准
### 知识转化路径
```
执行结果 → AI提取模式 → 更新最佳实践库 → 自动转化为SOP/课件/预警规则 → 指导下一次执行
```
### 老板能看到什么
| 建设前 | 建设后 |
|:---|:---|
| 优秀店长走了,业绩就掉 | 最佳实践沉淀在系统里,不依赖个人 |
| 同样的错误反复犯 | 预警规则自动拦截,历史教训自动复用 |
| 培训内容过时 | SOP变更自动生成课件,推送到相关员工 |
---
## 八、建设路径建议
### 分三步走
| 阶段 | 时间 | 目标 | 核心建设 |
|:---|:---|:---|:---|
| **第一步:打地基** | 第1-2周 | 数据通起来、指标建起来 | 数据资产化 + 指标体系 + 预警引擎 |
| **第二步:接神经** | 第3-5周 | 目标落下去、问题浮出来 | 目标穿透 + 六步闭环 + 态势感知 |
| **第三步:长大脑** | 第6-8周 | 系统自己学、越用越准 | 知识沉淀 + AI预测 + 情景推演 |
### 投入产出预期
| 阶段 | 投入重点 | 可量化收益 |
|:---|:---|:---|
| 第一步 | 数据治理 + 系统建设 | 经营数据T+1自动入库,损益核算周期从月级缩短到日级 |
| 第二步 | 流程重构 + 习惯培养 | 目标达成率提升10-15%,毛利率提升2-3%,运营成本降低5-8% |
| 第三步 | AI模型 + 持续优化 | 库存周转天数减少3-5天,人效提升10-15%,决策响应速度提升3倍 |
---
## 九、与普通BI系统的区别
| 维度 | 普通BI | 企业智脑 |
|:---|:---|:---|
| **定位** | 看数据的工具 | 驱动决策的大脑 |
| **数据** | 人工整理、手工导入 | 自动采集、自动清洗、本体论建模 |
| **指标** | 固定报表 | AI构建分层体系,自动关联责任人 |
| **发现问题** | 人去看数据 | 系统自动发现并推送 |
| **解决问题** | 只报告不行动 | 自动生成方案、追踪执行、检验效果 |
| **知识** | 用完即弃 | 自动沉淀、持续学习、越用越准 |
| **战略** | 提供数据参考 | 目标穿透到个人,执行实时反馈 |
| **预测** | 看历史 | 预测未来、推演决策 |
---
## 十、交付成果
### 系统交付物
| 交付物 | 说明 | 交付阶段 |
|:---|:---|:---|
| **统一数据资产平台** | 异构系统数据自动采集、清洗、标准化入库,一套数据、一个口径 | 第一步 |
| **分层指标看板** | 战略层→运营层→执行层三级指标体系,自动计算、实时更新 | 第一步 |
| **预警规则引擎** | 指标偏离自动预警,推送责任人,生成纠偏任务 | 第一步 |
| **目标穿透系统** | 年度目标→区域→团队→个人逐级拆解,日目标卡自动生成 | 第二步 |
| **六步闭环引擎** | 数据→分析→问题→方案→执行→检验,自动流转、全程留痕 | 第二步 |
| **态势感知看板** | 全维度红黄绿灯监控 + 趋势预测 + 情景推演 | 第二步 |
| **知识沉淀平台** | 最佳实践自动提取、SOP自动更新、培训课件自动生成 | 第三步 |
| **AI决策辅助** | 趋势预测、情景推演、智能建议,越用越准 | 第三步 |
### 管理交付物
| 交付物 | 说明 | 交付阶段 |
|:---|:---|:---|
| **数据资产目录** | 企业全部数据资产的统一目录,可检索、可追溯 | 第一步 |
| **指标词典** | 每个指标的定义、口径、责任人、阈值,全公司统一语言 | 第一步 |
| **目标责任矩阵** | 每个目标落实到具体责任人,达成率实时可见 | 第二步 |
| **经营复盘报告** | 日/周/月自动生成,含达成率、偏差归因、改进建议 | 第二步 |
| **最佳实践库** | 沉淀组织经验,不依赖个人,新人快速上手 | 第三步 |
---
## 十一、案例:某餐饮连锁企业的智脑实践
> 以下案例基于真实系统建设实践,数据已脱敏处理。
### 企业背景
某餐饮连锁企业,旗下约 **90 家直营门店**,覆盖 **5 个区域**,拥有中央厨房和配送体系。原有 IT 系统 includes POS、外卖平台、WMS 库存、HR 考勤、财务系统,数据散落在各系统和大量 Excel 中,管理层"看数据靠排期、做决策靠经验"。
### 五层落地实例
#### 第一层:数据资产化
| 建设前 | 建设后 |
|:---|:---|
| POS、外卖、库存、HR、财务各管各的,数据对不上 | 统一数据采集管道,POS 数据 T+1 自动入库,外卖平台数据自动同步 |
| 每月做报表要 3 个人花 2 天整理 Excel | 系统自动聚合,报表一键生成 |
| 数据口径不统一,开会先吵数字 | 本体标准模块定义统一实体和口径,一个数字、一个来源 |
**系统模块**:数据采集管道 + 数据质量监控 + 本体标准管理
---
#### 第二层:运营指标化
| 建设前 | 建设后 |
|:---|:---|:---|
| 报表几十张,不知道该看哪张 | 三级指标体系自动计算:战略层(营收/利润/门店数)→ 运营层(客单/客流/成本率)→ 执行层(日营收/时段营收) |
| 指标异常靠人去翻数据 | 预警引擎自动扫描,达成率低于阈值自动红灯预警并推送责任人 |
| 发现问题后不知道原因 | 自动归因分析:营收下降→拆解客流/客单/品类/时段,定位根因 |
**系统模块**:指标词典 + 营收分析 + 菜品成本 + 会员复购 + SKU分析 + 预警管理
**实际场景**:某门店连续 3 天营收达成率低于 80%,系统自动红灯预警 → 推送店长和区域经理 → 自动归因发现客流下降 15% → 生成纠偏任务 → 店长执行引流措施 → 3 天后达成率恢复至 95% → 系统自动判定闭环完成。
---
#### 第三层:战略穿透化
| 建设前 | 建设后 |
|:---|:---|:---|
| 年度目标定完就放进文件柜 | 目标管理系统:年度目标 → 5 个区域 → 90 家门店 → 个人,逐级自动拆解 |
| 所有门店一个标准 | 差异化分配:A 级店 110%、B 级店 100%、C 级店 90%、D 级店整改 |
| 不知道目标执行到什么程度 | 店长每日 09:00 收到日目标卡(营收/成本/损耗),实时查看达成率 |
| 月底才知道没达标 | 每日/每周自动推送达成进度,偏差实时可见 |
**系统模块**:目标管理 + 门店分级 + 月度验收 + 调度管理
**实际场景**:年度营收目标 3.6 亿 → 自动拆解到 5 个区域 → 按门店 A/B/C/D 分级差异化分配到 90 家店 → 每店每月目标自动拆解到每日 → 店长每天看到目标卡 → 月末自动生成偏差报告 + 归因分析。
---
#### 第四层:态势感知化
| 建设前 | 建设后 |
|:---|:---|:---|
| 老板要看全局,得等一周出报告 | 态势感知看板实时展示 90 家店健康度,红黄绿灯一目了然 |
| 问题都是事后发现 | 预警规则引擎每小时扫描,指标偏离自动预警 |
| 决策靠拍脑袋 | 趋势预测 + 情景推演,决策前先看预期效果 |
**系统模块**:态势感知 + 预警管理 + 风险内控 + 智能排班
**实际场景**:态势感知看板显示 90 家店综合健康度评分,其中 3 家红灯、7 家黄灯 → 点击红灯门店查看详情 → 发现某店食材损耗率超标 → 一键下达整改任务 → 任务自动填充门店/指标/偏差值/建议措施/截止日期 → 推送店长执行。
---
#### 第五层:知识沉淀化
| 建设前 | 建设后 |
|:---|:---|:---|
| 优秀店长走了,业绩就掉 | 最佳实践自动沉淀为案例库,新店长可检索学习 |
| 同样的错误反复犯 | 预警规则自动拦截,历史教训自动复用 |
| 培训内容过时 | SOP 变更自动生成培训课件,推送到相关员工 |
**系统模块**:产品生命周期 + 企业协同 + 智能升级
**实际场景**:某 A 级门店的会员复购率显著高于同区 → 系统自动提取其关键动作(会员日设置/话术/优惠策略)→ 沉淀为最佳实践 → 自动推荐给同区域 C 级门店 → C 级店执行后复购率提升 12% → 闭环验证通过,案例入库。
---
### 建设效果
| 指标 | 建设前 | 建设后 |
|:---|:---|:---|
| 数据准备周期 | 3-5 天 | T+1 自动入库 |
| 问题发现周期 | 月级(月底报表) | 日级(实时预警) |
| 目标达成率 | 约 85% | 95%+ |
| 门店毛利率 | 基准 | 提升 2-3% |
| 库存周转天数 | 基准 | 减少 3-5 天 |
| 管理决策响应 | 3-5 天 | 当天 |
---
> **总结**:玄谋智脑不是新建一套孤立的 IT 系统,而是基于企业现有数据的管理升级。它让数据从"被动查看"变成"主动驱动",让管理从"事后救火"变成"事前预防",让组织能力从"依赖个人"变成"沉淀系统"。**最终目标:让每一个团队、每一个员工,每天都在做正确的事。**
@@ -0,0 +1,233 @@
# 原始数据导入处理
## 一、数据源概览
| 数据域 | 原始表 | 导入方式 | 文件格式 | 频率 |
|--------|--------|----------|----------|------|
| 账单数据 | `bill_records` | Python脚本导入 | Excel (.xlsx) | 月度 |
| 经营费用 | `operating_expense_records` | Python脚本导入 | Excel | 月度 |
| 库存成本 | `inventory_cost_records` | Python脚本导入 | Excel | 月度 |
| 菜品成本分析 | `dish_cost_analysis_summary` | Python脚本导入 | Excel | 月度 |
| 考勤数据 | `attendance_records` | Python脚本导入 | Excel | 月度 |
| 薪资数据 | `salary_detail_records` | Python脚本导入 | Excel | 月度 |
| 门店位置 | `store_location_master` | Python脚本导入 | Excel | 按需 |
| 中央厨房 | `central_kitchen_*` (6表) | Python脚本导入 | Excel | 月度 |
| 配送数据 | `distribution_detail_records` | Python脚本导入 | Excel | 月度 |
| 菜品销售 | `dish_sales_details` | Python脚本导入 | Excel | 月度 |
---
## 二、账单数据导入(bill_records
### 2.1 数据源
- **来源文件**: 正餐事业部_店内订单明细-已结账_*.xlsx
- **来源系统**: 餐饮POS系统导出
- **文件路径**: `数据/4月/``数据/5月/`
### 2.2 导入脚本
| 脚本 | 说明 |
|------|------|
| `/tmp/import_missing_stores.py` | 导入缺失门店账单(MD00002/MD00003/MD00008/1098/1110 |
| `/tmp/import_remaining_stores.py` | 导入剩余门店账单(哈马尔罕总部基地店0056/大钟寺店0022/茂林居店0021/西安含光店0052/西部马华火锅北三环店0012) |
### 2.3 字段映射
`bill_records` 表使用 c001~c199 编码,关键字段:
| 列号 | 字段含义 | 用途 |
|------|----------|------|
| c002 | 门店编码 | 门店标识 |
| c003 | 门店名称 | 门店名称(用于JOIN) |
| c009 | 消费金额 | 营业收入 |
| c068 | 优惠金额 | 优惠分析 |
| c114 | 理论成本额 | 理论毛利率 |
| c175 | 下单时间 | 时段分析 |
| c176 | 结账时间 | 日度汇总 |
| c178 | 就餐人数 | 客流分析 |
| c181 | 会员卡号 | 会员分析 |
| c185 | 会员标识 | 会员识别 |
### 2.4 导入逻辑
1. 读取 Excel 文件,解析支付方式和金额
2. 按门店名称匹配 `store_name_mapping`
3. **删除旧数据**: 按 `c003`(门店名称)和日期范围删除同月旧记录
4. **插入新数据**: 批量 INSERT,自动生成 bill_id
5. 导入后需刷新 `bill_fact` 物化视图
### 2.5 支付方式解析
脚本中定义了支付方式映射,将不同支付渠道(微信/支付宝/现金/会员储值/美团/饿了么等)解析为对应字段。
### 2.6 门店名称映射
| 原始名称 | 门店编码 | 说明 |
|----------|----------|------|
| 哈马尔罕(总部基地店) | 0056 | 新导入 |
| 哈马尔罕(大钟寺店) | 0022 | 新导入 |
| 哈马尔罕(茂林居店) | 0021 | 新导入 |
| 哈马尔罕(西安含光店) | 0052 | 新导入 |
| 西部马华火锅(北三环店) | 0012 | 新导入 |
| 关东店 | 1098 | 编码修正(原错误映射为0033) |
---
## 三、经营费用导入(operating_expense_records
### 3.1 数据源
- **来源文件**: 各门店费用明细Excel
- **费用科目**: 月薪员工工资、餐厅房租、外卖佣金、电费、燃气费、水费、物业费、宿舍费用、刷卡手续费、清洗费、垃圾费、维修费、菜品提成、自送快递费、烟道清洗、设备租赁费、暖气费
### 3.2 导入流程
1. 读取 Excel,按费用科目和门店单位导入
2. 写入 `operating_expense_records` 原始表
3. 通过 `operating_expense_store_mapping` 映射到销售门店编码
4. `include_in_operating_analysis` 标志控制是否纳入经营分析
### 3.3 门店映射规则
- 一个费用单位可映射到一个销售门店编码(`sales_store_code`
- 多个费用单位可映射到同一门店(如"哈马尔罕大钟寺店"→"大钟寺店"0022
- 未映射的费用单位(支持/供应链/特殊业务)不纳入门店评估
- `include_in_operating_analysis = true` 才参与费用分析
### 3.4 导入后处理
- 视图 `v_operating_expense_unit_monthly` 自动反映新数据
- 视图 `v_store_operating_expense_monthly``sales_store_code` 聚合
- 物化表 `mv_store_operating_expense_monthly` 需手动刷新(INSERT/UPDATE
---
## 四、库存成本导入(inventory_cost_records
### 4.1 数据源
- **来源文件**: 库存盘点Excel
- **内容**: 各门店库存消耗金额、原料分类
### 4.2 导入流程
1. 读取 Excel,按门店和原料分类导入
2. 写入 `inventory_cost_records` 原始表
3. 通过 `inventory_store_mapping` 映射到销售门店编码
4. `include_in_operating_cost` 标志控制是否纳入成本分析
### 4.3 导入后处理
- 刷新 `mv_inventory_cost_classified_monthly` 物化视图
- 刷新 `mv_store_theoretical_actual_cost_monthly` 物化视图
---
## 五、菜品成本分析导入(dish_cost_analysis_summary
### 5.1 数据源
- **来源文件**: 菜品成本分析Excel
- **内容**: 每个菜品的理论成本、实际成本、毛利率
### 5.2 导入流程
1. 读取 Excel,按菜品导入
2. 写入 `dish_cost_analysis_summary``dish_cost_analysis_material_detail`
3. 记录导入日志到 `dish_cost_analysis_import_log`
4.`report_month``import_id` 区分批次
---
## 六、考勤薪资导入
### 6.1 考勤数据
- **原始表**: `attendance_records`38列)
- **导入日志**: `attendance_import_log`
- **内容**: 员工打卡记录(上班/下班/迟到/早退)
### 6.2 薪资数据
- **原始表**: `salary_detail_records`102列)
- **导入日志**: `salary_import_log`
- **内容**: 员工薪资明细(基本工资/加班/社保/公积金等)
---
## 七、门店位置导入(store_location_master
### 7.1 数据源
- **来源文件**: 门店位置信息Excel
- **内容**: 门店地址、经纬度(GCJ02)、面积、租约到期日、营业时间
### 7.2 导入流程
1. 读取 Excel,写入 `store_location_source_rows` 原始行
2. 匹配到 `sales_store_location_mapping` 建立门店编码关联
3. 更新 `store_location_master` 主数据
### 7.3 关键字段
| 字段 | 说明 |
|------|------|
| `area_sqm` | 营业面积(平米),用于坪效计算 |
| `lease_expiry_date` | 租约到期日,用于续租风险 |
| `latitude_gcj02` / `longitude_gcj02` | GCJ02坐标,用于地图展示 |
| `business_address` | 营业地址 |
---
## 八、数据导入后的标准操作流程
```
1. 导入原始数据到 public.* 表
2. 刷新 bill_fact 物化视图
REFRESH MATERIALIZED VIEW analytics.bill_fact;
3. 刷新依赖 bill_fact 的物化视图
REFRESH MATERIALIZED VIEW analytics.mv_daily_revenue;
REFRESH MATERIALIZED VIEW analytics.mv_store_risk_rating_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_theoretical_actual_cost_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_sku_abc_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_sku_summary_monthly;
... (所有依赖 bill_fact 的物化视图)
4. 更新 mv_store_operating_expense_monthly 物化表
(从 v_store_operating_expense_monthly 视图 INSERT/UPDATE
5. 刷新库存成本物化视图
REFRESH MATERIALIZED VIEW analytics.mv_inventory_cost_classified_monthly;
6. 验证数据一致性
- 对比 bill_fact 和 mv_store_risk_rating_monthly 门店数
- 对比 bill_fact 和 mv_store_theoretical_actual_cost_monthly 实收合计
- 检查是否有遗漏门店
```
---
## 九、已知问题与修复记录
### 9.1 门店编码映射错误
- **问题**: 关东店编码错误映射为0033,实际应为1098
- **修复**: 更新 `store_name_mapping`
### 9.2 旧数据误删
- **问题**: 导入新数据时误删了旧账单记录(bill_records),导致历史数据丢失
- **修复**: 从数据库备份 `bill_query_full_20260802_150344.dump` 恢复,使用 `pg_restore` 恢复到临时库后提取缺失数据
### 9.3 费用单位重复映射
- **问题**: "哈马尔罕大钟寺店"的费用记录未映射到"大钟寺店"(0022),导致费用未纳入门店评估
- **修复**: 更新 `operating_expense_store_mapping`,将 `sales_store_code` 设为 0022`include_in_operating_analysis = true`
### 9.4 视图聚合问题
- **问题**: `v_store_operating_expense_monthly` 视图未按 `sales_store_code` 聚合,导致多个费用单位映射到同一门店时出现重复行
- **修复**: 重建视图,增加 `expense_agg` CTE 按 `sales_store_code` GROUP BY 聚合
File diff suppressed because it is too large Load Diff
+401
View File
@@ -0,0 +1,401 @@
# 系统本体结构描述
## 一、数据库架构
- **数据库引擎**: PostgreSQL 15 (Homebrew)
- **数据库名**: bill_query
- **Schema 分布**: `public`(原始数据)、`analytics`(分析层)
---
## 二、原始数据表(public schema
### 2.1 账单数据
| 表名 | 列数 | 说明 |
|------|------|------|
| `bill_records` | 199 | 账单明细原始表,每行一笔账单,字段以 c001~c199 编码 |
| `bill_columns` | 4 | 账单字段元数据(列号→含义映射) |
**关键字段映射**:
- `c002` = 门店名称,`c003` = 门店名称(冗余),`c009` = 消费金额,`c068` = 优惠金额
- `c175` = 下单时间,`c176` = 结账时间,`c178` = 就餐人数
- `c181` = 会员卡号,`c185` = 会员标识
- `c114` = 理论成本额,`c009` = 消费额(用于理论毛利率计算)
### 2.2 费用数据
| 表名 | 列数 | 说明 |
|------|------|------|
| `operating_expense_records` | 17 | 经营费用原始记录(工资/房租/水电/佣金等) |
| `operating_expense_store_mapping` | 10 | 费用单位→销售门店编码映射,含 `include_in_operating_analysis` 标志 |
| `operating_expense_import_log` | 8 | 费用导入日志 |
### 2.3 库存成本数据
| 表名 | 列数 | 说明 |
|------|------|------|
| `inventory_cost_records` | 42 | 库存盘点成本原始记录 |
| `inventory_store_mapping` | 10 | 库存单位→销售门店编码映射,含 `include_in_operating_cost` 标志 |
| `inventory_cost_import_log` | 7 | 库存成本导入日志 |
### 2.4 菜品成本分析
| 表名 | 列数 | 说明 |
|------|------|------|
| `dish_cost_analysis_summary` | 18 | 菜品成本分析汇总(理论 vs 实际毛利率) |
| `dish_cost_analysis_material_detail` | 19 | 菜品原料明细 |
| `dish_cost_analysis_import_log` | 17 | 菜品成本分析导入日志 |
### 2.5 考勤薪资数据
| 表名 | 列数 | 说明 |
|------|------|------|
| `attendance_records` | 38 | 考勤打卡记录 |
| `attendance_import_log` | 7 | 考勤导入日志 |
| `salary_detail_records` | 102 | 薪资明细记录 |
| `salary_import_log` | 7 | 薪资导入日志 |
### 2.6 门店位置数据
| 表名 | 列数 | 说明 |
|------|------|------|
| `store_location_master` | 34 | 门店位置主数据(地址/经纬度/面积/租约等) |
| `store_location_source_rows` | 13 | 门店位置原始行 |
| `store_location_import_log` | 10 | 位置导入日志 |
| `sales_store_location_mapping` | 8 | 销售门店→位置映射 |
| `store_name_mapping` | 2 | 门店名称映射表 |
### 2.7 中央厨房数据
| 表名 | 列数 | 说明 |
|------|------|------|
| `central_kitchen_finished_receipt` | 34 | 成品入库记录 |
| `central_kitchen_manufacturing_cost_pool` | 14 | 制造费用池 |
| `central_kitchen_material_daily` | 36 | 原料日耗明细 |
| `central_kitchen_processing_cost` | 29 | 加工成本 |
| `central_kitchen_recipe_consumption` | 39 | 配方消耗 |
| `central_kitchen_import_log` | 13 | 中央厨房导入日志 |
### 2.8 配送数据
| 表名 | 列数 | 说明 |
|------|------|------|
| `distribution_detail_records` | 85 | 配送明细记录 |
| `distribution_import_log` | 17 | 配送导入日志 |
### 2.9 菜品调整
| 表名 | 列数 | 说明 |
|------|------|------|
| `dish_adjustment_log` | 20 | 菜品调整日志 |
| `dish_adjustment_result` | 15 | 菜品调整结果 |
| `dish_diagnosis_snapshot` | 19 | 菜品诊断快照 |
| `dish_sales_details` | 24 | 菜品销售明细 |
| `dish_sales_import_log` | 6 | 菜品销售导入日志 |
---
## 三、分析层维度表(analytics schema
| 表名 | 列数 | 说明 |
|------|------|------|
| `dim_store` | 14 | 门店维度(编码/名称/类型/区域) |
| `dim_calendar` | 14 | 日历维度 |
| `dim_channel` | 10 | 渠道维度 |
| `dim_daily_target` | 12 | 日度目标 |
| `dim_employee` | 9 | 员工维度 |
| `dim_material` | 12 | 原料维度 |
| `dim_member` | 13 | 会员维度 |
| `dim_product_lifecycle` | 16 | 产品生命周期 |
| `dim_promotion` | 15 | 促销维度 |
| `dim_sku` | 21 | SKU维度 |
| `dim_store_target` | 11 | 门店目标 |
| `dim_supplier` | 9 | 供应商维度 |
---
## 四、分析层事实表(analytics schema
| 表名 | 列数 | 说明 |
|------|------|------|
| `fact_bill` | 52 | 账单事实表(标准化) |
| `fact_bill_item` | 25 | 账单明细事实 |
| `fact_payment` | 9 | 支付事实 |
| `fact_customer_contact` | 13 | 客户联系事实 |
| `fact_employee_shift` | 13 | 员工排班事实 |
| `fact_inspection` | 17 | 巡检事实 |
| `fact_inventory_snapshot` | 19 | 库存快照事实 |
| `fact_iot_reading` | 11 | IoT读数事实 |
| `fact_platform_order` | 16 | 平台订单事实 |
| `fact_promotion_usage` | 12 | 促销使用事实 |
| `fact_purchase_receipt` | 16 | 采购入库事实 |
| `fact_recipe_bom` | 14 | BOM配方事实 |
| `fact_review` | 14 | 评价事实 |
| `fact_scan_confirm` | 13 | 扫描确认事实 |
| `fact_store_task` | 22 | 门店任务事实 |
| `fact_transfer` | 12 | 调拨事实 |
| `fact_waste` | 11 | 报损事实 |
---
## 五、枚举表(analytics schema
| 表名 | 说明 |
|------|------|
| `enum_business_type` | 业务类型 |
| `enum_channel_group` | 渠道分组 |
| `enum_management_quadrant` | 管理象限 |
| `enum_member_status` | 会员状态 |
| `enum_metric_direction` | 指标方向 |
| `enum_priority` | 优先级 |
| `enum_risk_level` | 风险等级 |
| `enum_sku_status` | SKU状态 |
| `enum_sku_type` | SKU类型 |
| `enum_task_status` | 任务状态 |
| `enum_verification_result` | 验证结果 |
| `enum_waste_reason` | 报损原因 |
---
## 六、物化视图列表(analytics schema
### 6.1 核心账单物化视图
| 物化视图 | 说明 | 依赖原始表 |
|----------|------|------------|
| `bill_fact` | 账单事实物化视图,从 bill_records 标准化 | `bill_records` |
| `mv_daily_revenue` | 日度营收汇总 | `bill_records` |
### 6.2 门店评估物化视图
| 物化视图 | 说明 | 依赖 |
|----------|------|------|
| `mv_store_risk_rating_monthly` | 门店风险评级(月度) | `bill_fact` |
| `mv_store_operating_expense_monthly` | 门店经营费用(月度,物化表) | `operating_expense_records` + mapping |
| `mv_store_theoretical_actual_cost_monthly` | 门店理论 vs 实际成本(月度) | `bill_fact` + `inventory_cost_records` |
| `mv_store_action_priority_deep_monthly` | 门店行动优先级深度分析 | `bill_fact` |
| `mv_store_deep_diagnosis_monthly` | 门店深度诊断 | `bill_fact` |
| `mv_store_scorecard` | 门店记分卡 | `bill_fact` |
### 6.3 门店基准与效率物化视图
| 物化视图 | 说明 | 依赖 |
|----------|------|------|
| `mv_store_benchmark_composite_monthly` | 门店综合基准 | `bill_fact` |
| `mv_store_area_efficiency_monthly` | 门店坪效分析 | `bill_fact` |
| `mv_store_platform_economics_monthly` | 门店平台经济分析 | `bill_fact` |
| `mv_store_category_mix_monthly` | 门店品类结构 | `bill_fact` |
| `mv_store_member_opportunity_monthly` | 门店会员机会 | `bill_fact` |
| `mv_store_overlap_risk_monthly` | 门店重叠风险 | `bill_fact` |
| `mv_store_site_profile_monthly` | 门店选址画像 | `bill_fact` |
| `mv_store_site_replication_monthly` | 门店选址复制 | `bill_fact` |
| `mv_store_repeat_summary_monthly` | 门店复购汇总 | `bill_fact` |
### 6.4 菜品分析物化视图
| 物化视图 | 说明 | 依赖 |
|----------|------|------|
| `mv_dish_sku_abc_monthly` | 菜品SKU ABC分类 | `bill_fact` |
| `mv_dish_sku_summary_monthly` | 菜品SKU汇总 | `bill_fact` |
| `mv_dish_store_summary_monthly` | 门店菜品汇总 | `bill_fact` |
| `mv_dish_basket_monthly` | 菜品购物篮分析 | `bill_fact` |
| `mv_dish_pair_summary_monthly` | 菜品搭配分析 | `bill_fact` |
### 6.5 选址与区域物化视图
| 物化视图 | 说明 | 依赖 |
|----------|------|------|
| `mv_district_site_benchmark_monthly` | 区域选址基准 | `bill_fact` |
| `mv_site_segment_benchmark_monthly` | 分段选址基准 | `bill_fact` |
### 6.6 库存成本物化视图
| 物化视图 | 说明 | 依赖 |
|----------|------|------|
| `mv_inventory_cost_classified_monthly` | 库存成本分类汇总 | `inventory_cost_records` + mapping |
### 6.7 固定月份物化视图(2026年4月专用)
| 物化视图 | 说明 |
|----------|------|
| `mv_store_theoretical_actual_cost_april` | 4月理论 vs 实际成本 |
| `mv_store_site_profile_april` | 4月门店选址画像 |
| `mv_store_action_priority_deep_april` | 4月行动优先级 |
| `dish_sales_april` | 4月菜品销售 |
| `dish_sku_summary_april` | 4月SKU汇总 |
| `dish_store_summary_april` | 4月门店菜品汇总 |
| `dish_basket_april` | 4月购物篮 |
| `dish_category_summary_april` | 4月品类汇总 |
| `dish_member_sku_april` | 4月会员SKU |
| `dish_store_sku_april` | 4月门店SKU |
---
## 七、普通视图列表(analytics schema
### 7.1 费用相关视图
| 视图 | 说明 | 依赖 |
|------|------|------|
| `v_operating_expense_unit_monthly` | 费用单位月度汇总 | `operating_expense_records` + mapping |
| `v_store_operating_expense_monthly` | 门店费用月度汇总(按 sales_store_code 聚合) | `v_operating_expense_unit_monthly` |
| `v_operating_expense_account_monthly` | 费用科目月度汇总 | `operating_expense_records` |
| `v_operating_expense_data_quality` | 费用数据质量 | `operating_expense_records` + mapping |
### 7.2 门店分析视图
| 视图 | 说明 |
|------|------|
| `v_store_location_operating` | 门店位置经营信息 |
| `v_store_location_data_quality` | 门店位置数据质量 |
| `v_store_daily` | 门店日度数据 |
| `v_store_daily_card` | 门店日度卡片 |
| `v_store_meal_opportunity` | 门店餐段机会 |
| `v_store_member_monthly_activity` | 门店会员月度活动 |
| `v_store_monthly_followup` | 门店月度跟进 |
| `v_store_nearest_neighbor_april` | 门店最近邻 |
| `v_store_spatial_pairs_april` | 门店空间配对 |
### 7.3 营收分析视图
| 视图 | 说明 |
|------|------|
| `v_overview_daily` | 日度总览 |
| `v_hourly_summary` | 小时汇总 |
| `v_weekday_summary` | 星期汇总 |
| `v_meal_period_daily` | 餐段日度 |
| `v_channel_daily` | 渠道日度 |
| `v_region_summary` | 区域汇总 |
### 7.4 风险与异常视图
| 视图 | 说明 |
|------|------|
| `v_anomaly_bills` | 异常账单 |
| `v_anomaly_summary` | 异常汇总 |
| `v_cashier_risk` | 收银风险 |
| `v_zero_received_store_summary` | 零实收门店汇总 |
| `v_zero_received_detail` | 零实收明细 |
### 7.5 成本相关视图
| 视图 | 说明 |
|------|------|
| `v_inventory_cost_operating` | 库存成本经营 |
| `v_inventory_cost_unit_summary` | 库存成本单位汇总 |
| `v_inventory_finance_category_april` | 库存财务分类 |
| `v_inventory_abnormal_items_april` | 库存异常项 |
| `v_cost_linkage_*` | 成本联动系列视图 |
### 7.6 中央厨房视图
| 视图 | 说明 |
|------|------|
| `v_central_kitchen_*` | 中央厨房系列视图(6个) |
| `v_distribution_*` | 配送系列视图(4个) |
### 7.7 任务与指标视图
| 视图 | 说明 |
|------|------|
| `v_task_monthly_review` | 任务月度复盘 |
| `v_task_weekly_check` | 任务周度检查 |
| `v_loop_health` | 闭环健康度 |
| `v_marketing_plan_summary` | 营销计划汇总 |
| `v_member_comparison` | 会员对比 |
| `v_member_level_mapping` | 会员等级映射 |
| `v_member_monthly_activity` | 会员月度活动 |
| `v_member_repeat_summary_monthly` | 会员复购汇总 |
| `v_position_mapping` | 岗位映射 |
| `v_data_quality_check` | 数据质量检查 |
---
## 八、V3.0 业务管理表(analytics schema
| 表名 | 说明 |
|------|------|
| `v3_annual_target` | 年度目标 |
| `v3_regional_target` | 区域目标 |
| `v3_store_monthly_target` | 门店月度目标 |
| `v3_daily_target` | 日度目标 |
| `v3_store_grade` | 门店分级 |
| `v3_store_roi` | 门店ROI |
| `v3_alert_rule` / `v3_alert_log` | 预警规则/日志 |
| `v3_approval_*` | 审批流(3表) |
| `v3_budget` / `v3_budget_lock` | 预算/预算锁 |
| `v3_coupon` | 优惠券 |
| `v3_marketing_campaign` | 营销活动 |
| `v3_forecast` | 预测 |
| `v3_monthly_report` | 月报 |
| `v3_notification` | 通知 |
| `v3_purchase_order` / `v3_purchase_order_item` | 采购订单 |
| `v3_supplier_master` | 供应商主数据 |
| `v3_inventory_snapshot` | 库存快照 |
| `v3_iot_device` / `v3_iot_temperature` | IoT设备/温度 |
| `v3_loop_verification` | 闭环验证 |
| `v3_learning_record` / `v3_training_course` | 培训学习 |
| `v3_product_lifecycle` | 产品生命周期 |
| `v3_scheduled_task` / `v3_personal_task` | 计划任务/个人任务 |
| `v3_store_grade` | 门店分级 |
| `v3_target_variance` | 目标偏差 |
| `v3_ai_target_adjustment` | AI目标调整 |
| `v3_audit_log` | 审计日志 |
| `v3_brand_asset` | 品牌资产 |
| `v3_customer_review` | 客户评价 |
| `v3_data_import_log` / `v3_data_quality_rule` | 数据导入/质量规则 |
---
## 九、数据流架构
```
原始数据导入 分析层构建 API serving
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│ bill_records │──REFRESH──▶│ bill_fact │◀──QUERY───│ Express API │
│ (199 cols) │ │ (52 cols) │ │ (18 routes) │
└─────────────┘ └──────────────┘ └──────────────┘
│ │
│ REFRESH ▼
│ ┌──────────────────────┐
│ │ mv_store_risk_rating │
│ │ _monthly │
│ └──────────────────────┘
│ │
│ REFRESH ▼
│ ┌────────────────────────────────┐
│ │ mv_store_theoretical_actual_ │
│ │ cost_monthly │
│ └────────────────────────────────┘
┌──────────────────────┐ ┌──────────────────────────┐
│ operating_expense_ │────▶│ v_operating_expense_ │
│ records + mapping │ │ unit_monthly (view) │
└──────────────────────┘ └──────────────────────────┘
VIEW ▼
┌──────────────────────────┐
│ v_store_operating_ │
│ expense_monthly (view) │
│ (按 sales_store_code 聚合)│
└──────────────────────────┘
INSERT ▼
┌──────────────────────────┐
│ mv_store_operating_ │
│ expense_monthly (table) │
└──────────────────────────┘
┌──────────────────────┐ ┌──────────────────────────┐
│ inventory_cost_ │────▶│ mv_inventory_cost_ │
│ records + mapping │ │ classified_monthly (MV) │
└──────────────────────┘ └──────────────────────────┘
```
**关键设计**:
- `bill_fact` 是所有账单分析的基础物化视图,从 `bill_records` 标准化而来
- `mv_store_operating_expense_monthly` 是物化**表**(非视图),需手动 INSERT/UPDATE
- `v_store_operating_expense_monthly` 是普通视图,实时查询费用数据
- 部分API直接查 `bill_records`(如门店日度、排班分析),部分查 `bill_fact`
- 固定月份物化视图(`*_april`)硬编码2026年4月,不随月份参数变化
+302
View File
@@ -0,0 +1,302 @@
# 物化视图更新手册
## 一、物化视图依赖链
数据更新后必须按依赖顺序刷新物化视图,否则下游数据不一致。
```
bill_records (原始表)
▼ REFRESH
bill_fact (物化视图) ★ 第一层,最关键
├─▶ mv_daily_revenue
├─▶ mv_store_risk_rating_monthly ★ 门店评估基础
├─▶ mv_dish_sku_abc_monthly
├─▶ mv_dish_sku_summary_monthly
├─▶ mv_dish_store_summary_monthly
├─▶ mv_dish_basket_monthly
├─▶ mv_dish_pair_summary_monthly
├─▶ mv_store_action_priority_deep_monthly
├─▶ mv_store_area_efficiency_monthly
├─▶ mv_store_benchmark_composite_monthly
├─▶ mv_store_category_mix_monthly
├─▶ mv_store_deep_diagnosis_monthly
├─▶ mv_store_member_opportunity_monthly
├─▶ mv_store_overlap_risk_monthly
├─▶ mv_store_platform_economics_monthly
├─▶ mv_store_site_profile_monthly
├─▶ mv_store_site_replication_monthly
├─▶ mv_store_repeat_summary_monthly
├─▶ mv_district_site_benchmark_monthly
├─▶ mv_site_segment_benchmark_monthly
└─▶ mv_store_theoretical_actual_cost_monthly ★ 门店成本
inventory_cost_records (原始表)
▼ REFRESH
mv_inventory_cost_classified_monthly
operating_expense_records (原始表)
▼ VIEW (无需刷新)
v_operating_expense_unit_monthly
▼ VIEW (无需刷新)
v_store_operating_expense_monthly (按 sales_store_code 聚合)
▼ INSERT/UPDATE (需手动操作)
mv_store_operating_expense_monthly (物化表)
```
---
## 二、刷新命令清单
### 2.1 账单数据更新后(必刷)
```sql
-- ★ 第一优先级:bill_fact 是所有分析的基础
REFRESH MATERIALIZED VIEW analytics.bill_fact;
-- ★ 第二优先级:门店评估相关
REFRESH MATERIALIZED VIEW analytics.mv_store_risk_rating_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_theoretical_actual_cost_monthly;
-- 第三优先级:菜品分析
REFRESH MATERIALIZED VIEW analytics.mv_dish_sku_abc_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_sku_summary_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_store_summary_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_basket_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_pair_summary_monthly;
-- 第四优先级:门店深度分析
REFRESH MATERIALIZED VIEW analytics.mv_store_action_priority_deep_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_area_efficiency_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_benchmark_composite_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_category_mix_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_deep_diagnosis_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_member_opportunity_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_overlap_risk_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_platform_economics_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_site_profile_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_site_replication_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_repeat_summary_monthly;
-- 第五优先级:日度与区域
REFRESH MATERIALIZED VIEW analytics.mv_daily_revenue;
REFRESH MATERIALIZED VIEW analytics.mv_district_site_benchmark_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_site_segment_benchmark_monthly;
```
### 2.2 库存成本数据更新后
```sql
REFRESH MATERIALIZED VIEW analytics.mv_inventory_cost_classified_monthly;
-- 理论vs实际成本也依赖库存数据
REFRESH MATERIALIZED VIEW analytics.mv_store_theoretical_actual_cost_monthly;
```
### 2.3 费用数据更新后
```sql
-- v_operating_expense_unit_monthly 和 v_store_operating_expense_monthly 是普通视图,无需刷新
-- 但 mv_store_operating_expense_monthly 是物化表,需要手动更新:
-- 方法1:删除+插入(推荐,简单可靠)
DELETE FROM analytics.mv_store_operating_expense_monthly WHERE report_month = '2026-04-01';
INSERT INTO analytics.mv_store_operating_expense_monthly
SELECT * FROM analytics.v_store_operating_expense_monthly WHERE report_month = '2026-04-01';
-- 方法2:全量重建
TRUNCATE analytics.mv_store_operating_expense_monthly;
INSERT INTO analytics.mv_store_operating_expense_monthly
SELECT * FROM analytics.v_store_operating_expense_monthly;
```
---
## 三、一键刷新脚本
```bash
#!/bin/bash
# refresh_all_mv.sh - 刷新所有物化视图
# 用法: bash refresh_all_mv.sh [month] (默认 2026-04)
MONTH=${1:-2026-04}
MONTH_START="${MONTH}-01"
psql -h localhost -p 5432 -U freedak -d bill_query <<EOF
-- 第一层
REFRESH MATERIALIZED VIEW analytics.bill_fact;
-- 第二层
REFRESH MATERIALIZED VIEW analytics.mv_store_risk_rating_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_theoretical_actual_cost_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_daily_revenue;
-- 第三层
REFRESH MATERIALIZED VIEW analytics.mv_dish_sku_abc_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_sku_summary_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_store_summary_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_basket_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_dish_pair_summary_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_action_priority_deep_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_area_efficiency_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_benchmark_composite_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_category_mix_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_deep_diagnosis_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_member_opportunity_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_overlap_risk_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_platform_economics_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_site_profile_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_site_replication_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_store_repeat_summary_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_district_site_benchmark_monthly;
REFRESH MATERIALIZED VIEW analytics.mv_site_segment_benchmark_monthly;
-- 库存成本
REFRESH MATERIALIZED VIEW analytics.mv_inventory_cost_classified_monthly;
-- 费用物化表
DELETE FROM analytics.mv_store_operating_expense_monthly WHERE report_month = '${MONTH_START}';
INSERT INTO analytics.mv_store_operating_expense_monthly
SELECT * FROM analytics.v_store_operating_expense_monthly WHERE report_month = '${MONTH_START}';
-- 验证
SELECT 'bill_fact' AS source, count(DISTINCT store_code) AS stores, round(sum(received_total)::numeric,2) AS received
FROM analytics.bill_fact WHERE closed_at >= '${MONTH_START}' AND closed_at < ('${MONTH_START}'::date + interval '1 month')
UNION ALL
SELECT 'risk_rating', count(*), round(sum(received)::numeric,2)
FROM analytics.mv_store_risk_rating_monthly WHERE month_start = '${MONTH_START}'
UNION ALL
SELECT 'theo_cost', count(*), round(sum(sales_received)::numeric,2)
FROM analytics.mv_store_theoretical_actual_cost_monthly WHERE month_start = '${MONTH_START}'
UNION ALL
SELECT 'op_expense', count(*), round(sum(received)::numeric,2)
FROM analytics.mv_store_operating_expense_monthly WHERE report_month = '${MONTH_START}';
EOF
```
---
## 四、物化视图 vs 普通视图 vs 物化表
| 类型 | 刷新方式 | 示例 | 说明 |
|------|----------|------|------|
| 物化视图 (Materialized View) | `REFRESH MATERIALIZED VIEW` | `bill_fact`, `mv_store_risk_rating_monthly` | 数据快照,需手动刷新 |
| 普通视图 (View) | 实时查询,无需刷新 | `v_store_operating_expense_monthly`, `v_operating_expense_account_monthly` | 每次查询实时计算 |
| 物化表 (Table) | `INSERT/UPDATE/DELETE` | `mv_store_operating_expense_monthly` | 物理表,需手动写入 |
### 判断方法
```sql
-- 查看对象类型
SELECT relname, relkind
FROM pg_class
WHERE relname LIKE 'mv_%' OR relname LIKE 'v_%'
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'analytics');
-- relkind 含义:
-- 'm' = 物化视图 (需要 REFRESH)
-- 'v' = 普通视图 (无需刷新)
-- 'r' = 普通表 (需要 INSERT/UPDATE)
```
---
## 五、常见问题
### 5.1 数据不一致
**症状**: API返回的门店数少于实际门店数,或实收合计与 bill_fact 不一致
**原因**: 导入新数据后未刷新物化视图
**修复**: 执行上述刷新命令
### 5.2 费用未纳入门店评估
**症状**: 某门店在评估列表中缺失或费用为0
**原因**:
1. `operating_expense_store_mapping``sales_store_code` 未设置
2. `include_in_operating_analysis` 标志为 false
3. `mv_store_operating_expense_monthly` 物化表未更新
**修复**:
```sql
-- 检查映射
SELECT * FROM operating_expense_store_mapping WHERE cost_unit_source_name ILIKE '%门店名%';
-- 更新映射
UPDATE operating_expense_store_mapping
SET sales_store_code = '0022', include_in_operating_analysis = true
WHERE cost_unit_source_name = '哈马尔罕大钟寺店';
-- 刷新物化表
DELETE FROM analytics.mv_store_operating_expense_monthly WHERE report_month = '2026-04-01';
INSERT INTO analytics.mv_store_operating_expense_monthly
SELECT * FROM analytics.v_store_operating_expense_monthly WHERE report_month = '2026-04-01';
```
### 5.3 费用重复行
**症状**: 同一门店在 `mv_store_operating_expense_monthly` 中出现多行
**原因**: 多个费用单位映射到同一 `sales_store_code`,但视图未按 `sales_store_code` 聚合
**修复**: 确认 `v_store_operating_expense_monthly` 视图定义包含 `expense_agg` CTE,按 `sales_store_code` GROUP BY
### 5.4 固定月份物化视图
**问题**: `*_april` 系列物化视图硬编码2026年4月,不支持其他月份
**影响**: 5月数据需要创建新的 `*_may` 系列物化视图,或修改为通用月份
**当前状态**: `v_store_operating_expense_monthly` 视图中 sales/food/loc CTE 引用了 `v_store_site_profile_april``v_store_theoretical_actual_cost_april`,这些是4月专用视图
---
## 六、数据一致性验证
刷新后执行以下验证:
```sql
-- 1. 门店数一致性
SELECT 'bill_fact' AS src, count(DISTINCT store_code) AS stores
FROM analytics.bill_fact
WHERE closed_at >= '2026-04-01' AND closed_at < '2026-05-01'
UNION ALL
SELECT 'risk_rating', count(*)
FROM analytics.mv_store_risk_rating_monthly WHERE month_start = '2026-04-01'
UNION ALL
SELECT 'theo_cost', count(*)
FROM analytics.mv_store_theoretical_actual_cost_monthly WHERE month_start = '2026-04-01'
UNION ALL
SELECT 'op_expense', count(*)
FROM analytics.mv_store_operating_expense_monthly WHERE report_month = '2026-04-01';
-- 2. 实收一致性
SELECT 'bill_fact' AS src, round(sum(received_total)::numeric,2) AS received
FROM analytics.bill_fact
WHERE closed_at >= '2026-04-01' AND closed_at < '2026-05-01'
UNION ALL
SELECT 'risk_rating', round(sum(received)::numeric,2)
FROM analytics.mv_store_risk_rating_monthly WHERE month_start = '2026-04-01'
UNION ALL
SELECT 'theo_cost', round(sum(sales_received)::numeric,2)
FROM analytics.mv_store_theoretical_actual_cost_monthly WHERE month_start = '2026-04-01'
UNION ALL
SELECT 'op_expense', round(sum(received)::numeric,2)
FROM analytics.mv_store_operating_expense_monthly WHERE report_month = '2026-04-01';
-- 3. 差异门店排查
SELECT store_code, store_name, received
FROM analytics.mv_store_risk_rating_monthly
WHERE month_start = '2026-04-01' AND received > 0
AND store_code NOT IN (
SELECT DISTINCT store_code FROM analytics.mv_store_operating_expense_monthly
WHERE report_month = '2026-04-01'
);
```
@@ -0,0 +1,585 @@
# 玄谋智脑系统销售和服务合同
> **合同编号**[XMZN-YYYY-XXXX]
> **签订地点**[省/市]
> **签订日期**:[年]年[月]月[日]日
> **版本**:V1.0(商务及法务评审稿)
> **重要提示**:本文件为系统销售与服务合同通用范本,不构成针对任何具体交易的法律意见。正式签署前,双方应根据部署方式、数据类型、服务边界、费用、验收口径及适用法律,交由各自法务或外部律师审核。
---
## 一、合同主体
### 甲方(客户)
- **单位名称**[甲方全称]
- **统一社会信用代码**[代码]
- **地址**[地址]
- **法定代表人/授权代表**:[姓名]
- **项目负责人**[姓名]
- **联系电话**[电话]
- **电子邮箱**[邮箱]
### 乙方(供应商)
- **单位名称**[乙方全称]
- **统一社会信用代码**[代码]
- **地址**[地址]
- **法定代表人/授权代表**:[姓名]
- **项目负责人**[姓名]
- **联系电话**[电话]
- **电子邮箱**[邮箱]
甲乙双方根据《中华人民共和国民法典》《中华人民共和国网络安全法》《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》及其他适用法律法规,本着平等、自愿、公平和诚实信用原则,就“玄谋智脑”系统许可、实施及持续服务事宜达成本合同。
---
## 二、定义
1. **玄谋智脑/本系统**:指乙方提供的面向连锁企业的行业数字本体与 AI 经营辅助决策系统,包括本合同及附件明确的软件功能、配置、接口、模型、报告与服务。
2. **项目**:指乙方依本合同为甲方提供系统许可、数据接入、配置实施、试运行、培训、验收、维护和相关专业服务的整体工作。
3. **业务数据**:指甲方或甲方授权的第三方系统提供的 POS、ERP、WMS、财务、会员、外卖、HR、Excel 及其他与经营相关的数据。
4. **个人信息**:指以电子或其他方式记录的、与已识别或可识别的自然人有关的各种信息,不包括匿名化处理后的信息。
5. **产品标准功能**:指乙方在签约时已形成、可重复向不同客户提供的通用功能。
6. **定制成果**:指双方在附件中明确列为“定制开发”,且由乙方为甲方特定需求新建的代码、配置、报表或其他成果。
7. **AI 建议**:指本系统基于数据、规则、统计方法、模型或大语言模型生成的异常识别、归因、预测、情景测算、经营建议或文本输出。
8. **工作日**:除中国法定节假日及休息日以外的日期。
---
## 三、合同目标与合作原则
1. 本项目目标是整合甲方现有、合法可用的经营数据,建立统一业务语义、指标体系与经营分析闭环,辅助甲方发现经营问题、推动整改、验证结果并沉淀组织经验。
2. 本系统原则上不取代甲方现有 POS、ERP、WMS、财务、HR 等生产或交易系统,除双方书面约定外,不直接改写甲方生产系统原始数据。
3. 项目采取“先验证价值、再扩大范围”的原则。首期原则上以一至两个可量化经营专项为主,具体范围以《项目范围与交付清单》为准。
4. 双方确认,经营结果受市场环境、季节、管理执行、人员、竞争、价格、供应链、政策及数据质量等多重因素影响。乙方不对营收、利润、毛利率、成本降幅、融资或其他经营成果作无条件保证。
---
## 四、系统销售、许可与使用范围
### 4.1 许可模式
双方选择以下第 [ ] 种模式:
1. **SaaS 订阅**:乙方在云环境中向甲方提供有期限的访问和使用权。
2. **甲方私有化部署**:系统部署于甲方或甲方指定的合规环境,乙方提供有期限或永久的软件使用许可。
3. **混合部署**:部分数据、模型或服务在甲方环境内运行,部分能力由乙方云服务提供。
### 4.2 许可范围
| 项目 | 约定 |
|:---|:---|
| 授权主体 | [甲方及允许使用的关联公司清单] |
| 授权用户数 | [ ] 人/不限用户 |
| 授权门店数 | [ ] 家 |
| 授权区域 | [ ] |
| 许可期限 | 自[ ]年[ ]月[ ]日至[ ]年[ ]月[ ]日 |
| 部署环境 | [生产/测试/容灾]环境,数量[ ] |
| 使用目的 | 限甲方内部经营分析、管理与决策辅助 |
### 4.3 使用限制
未经乙方书面同意,甲方不得:
1. 向授权范围外的第三方转让、出租、分许可、销售或开放本系统。
2. 对本系统进行反向工程、反编译、反汇编或尝试获取源代码,法律强制允许的情形除外。
3. 删除或修改系统中的著作权、商标、技术保护或权利声明。
4. 使用本系统从事违法活动,或处理甲方无权处理的数据。
---
## 五、项目范围与交付内容
### 5.1 首期建设范围
首期默认为八周价值验证项目,实际计划自项目启动条件全部具备之日起计算。
| 阶段 | 建议时间 | 主要工作 | 主要交付物 |
|:---|:---|:---|:---|
| 专项确认 | 第1周 | 选定1—2个经营专项,确认基线、口径、责任人 | 项目范围、指标基线、验收口径 |
| 数据接入 | 第1—2周 | 连接约定数据源,完成映射、清洗与质量检查 | 数据清单、映射关系、质量报告 |
| 分析建模 | 第3—4周 | 建立本体、指标、异常规则与分析模型 | 异常清单、影响测算、根因证据 |
| 整改执行 | 第5—6周 | 生成或配置整改任务,跟踪责任人与进度 | 整改清单、任务记录、进度报告 |
| 验证复盘 | 第7—8周 | 对比改善前后,识别外部影响,形成复制建议 | 专项报告、验收结论、最佳实践建议 |
### 5.2 候选经营专项
双方可从以下场景中选择,最终以附件勾选内容为准:
- [ ] SKU 组合、商品毛利与产品生命周期
- [ ] 人员排班、工时利用与人效
- [ ] 促销活动的增量贡献利润
- [ ] 库存、损耗、临期商品与资金占用
- [ ] 门店分级、低效门店整改与关停情景测算
- [ ] 会员复购、流失预警与精准营销
- [ ] 采购价格、供应商对标与异常识别
- [ ] 其他:[ ]
### 5.3 系统及管理交付物
在附件约定的范围内,可包括:
1. 数据源清单、数据质量报告与映射规则。
2. 业务本体、主数据及指标词典。
3. 授权范围内的经营看板、分析页面和预警能力。
4. 异常发现、归因、情景测算与 AI 辅助建议功能。
5. 整改任务、责任人、期限、进度与验收记录。
6. 项目配置文档、管理员手册和用户手册。
7. 项目培训与试运行支持。
### 5.4 不在范围内的内容
除附件另有明确约定外,下列事项不在本合同价格与交付范围内:
1. 替换或重建甲方原有生产、收银、财务、库存或人事系统。
2. 甲方或第三方系统的源码修改及接口开发费。
3. 云资源、网络专线、短信、邮件、第三方地图、大模型或其他外部服务费用,除非报价单已明确包含。
4. 数据历史补录、线下盘点、人工采集或原始业务数据修复。
5. 乙方代替甲方做出价格、人事、采购、关店、投资、融资或其他最终经营决策。
6. 未在附件中列明的定制功能、报表或大规模数据迁移。
---
## 六、项目计划、启动条件与变更管理
### 6.1 项目启动条件
以下条件全部满足之日为项目正式启动日:
1. 本合同及必要附件已生效。
2. 甲方已按约定支付首期款。
3. 双方已指定项目负责人与必要参与人员。
4. 甲方已提供符合约定的数据、接口、账号、网络、环境和业务口径。
5. 双方已书面确认首期经营专项、基线和验收方法。
### 6.2 延期
1. 因甲方未及时提供数据、环境、人员、确认或审批导致延期的,项目计划应相应顺延,乙方不承担违约责任。
2. 因乙方原因导致关键里程碑延期的,乙方应及时告知甲方、提交纠偏计划并承担本合同约定的违约责任。
### 6.3 需求变更
1. 任何影响项目范围、数据源、接口、交付物、计划、费用或验收口径的变更,应以书面《变更申请单》确认。
2. 乙方应对变更的工作量、费用、时间与风险进行评估。双方未书面确认前,乙方有权按原范围继续履行。
---
## 七、双方职责
### 7.1 甲方职责
1. 指定具有协调和决策权限的项目负责人,组织业务、IT、数据、财务、人力及门店相关人员参与。
2. 保证向乙方提供数据、资料、接口和指令的合法性、准确性、完整性及授权充分性。
3. 按时完成业务口径、规则、方案、账号、权限、交付物和验收结果的确认。
4. 组织整改动作的实际执行。乙方提供分析、建议和工具支持,不代替甲方行使管理权限。
5. 按合同约定支付费用,并为项目提供必要的办公、网络、环境与安全条件。
6. 对自身用户账号、密码、设备及内部权限分配负责。
### 7.2 乙方职责
1. 按本合同及附件约定,组织具备相应技能的人员完成系统实施与服务。
2. 建立项目计划、风险台账、问题清单和沟通机制,及时报告重大风险。
3. 依据约定采取合理的技术与管理措施保护甲方数据。
4. 不得超出甲方授权和本合同目的访问、处理、使用或对外提供甲方数据。
5. 在约定范围内提供培训、试运行和保修支持。
6. 发现可能影响数据安全、系统稳定或项目验收的重大问题时,应及时通知甲方。
---
## 八、数据保护、个人信息与安全
### 8.1 数据权属
1. 甲方业务数据及甲方依法享有权利的数据资产,其权利仍归甲方或相应权利人所有。
2. 乙方仅在履行本合同所必需的范围、目的和期限内处理甲方数据。
3. 未经甲方事先书面同意,乙方不得将甲方可识别业务数据用于向其他客户展示、对外宣传、训练通用模型或与本合同无关的目的。
### 8.2 个人信息
1. 甲方应确保个人信息的收集、使用、委托处理、提供与传输具有合法性基础,并按法律要求履行告知、同意、影响评估等义务。
2. 乙方应按甲方的合法指令处理个人信息,不得擅自变更处理目的、方式或范围。
3. 双方应另行签署《数据处理与个人信息保护附件》,明确信息种类、目的、期限、安全措施、再委托、跨境、安全事件及删除返还要求。
### 8.3 安全措施
乙方应根据部署方式和约定责任边界,采取与风险相适应的措施,可包括:
1. 身份认证、最小权限、角色分权与特权账号管理。
2. 传输加密、存储加密或等效保护。
3. 敏感数据脱敏、屏蔽、分级分类与访问审计。
4. 日志、监控、告警、备份与恢复措施。
5. 漏洞管理、恶意代码防护、开发与变更管理。
6. 对可接触甲方数据的人员进行权限限制、保密约束与安全培训。
### 8.4 数据安全事件
1. 乙方发现与甲方数据有关的未授权访问、泄露、篡改、丢失或其他安全事件后,应在[ ]小时内通知甲方。
2. 乙方应及时采取止损、调查、修复和防止扩大措施,并配合甲方履行法定报告或通知义务。
3. 因一方过错造成安全事件的,该方应依本合同及适用法律承担责任。
### 8.5 数据保留、返还与删除
1. 合同终止或甲方合法要求时,乙方应在[ ]日内按约定返还或删除甲方数据,但法律规定或备份周期必须保留的除外。
2. 对必须保留的数据,乙方应停止主动处理并持续承担保密与安全义务。
---
## 九、AI 功能与决策边界
1. 双方确认,AI 建议属于经营辅助信息,可能存在误差、遗漏、时滞、不完整或不适用于特定情形的情况。
2. 乙方应尽合理努力,使重要 AI 结论展示其数据时间、依据指标、分析路径或适用边界。
3. 甲方应由具备相应专业能力和权限的人员审核 AI 建议。价格调整、人员处置、供应商更换、门店关停、投资、融资等重要决策必须由甲方人工审批。
4. 除双方对具体场景另行进行风险评估并书面授权外,本系统不得直接执行不可逆或高影响经营动作。
5. 如 AI 功能调用第三方模型服务,乙方应在附件中说明服务商、数据处理边界、部署地域、数据保留政策和费用承担方式。
6. 未经甲方书面同意,乙方不得将甲方可识别数据用于训练或改进面向其他客户的通用模型。
---
## 十、交付、试运行与验收
### 10.1 验收原则
1. 验收以本合同、附件、经双方确认的需求、原型、变更单和测试用例为依据。
2. 对系统功能、数据质量、性能、安全、文档、培训和经营专项采用分类验收。
3. 经营收益的评估必须使用双方预先确认的基线、计算口径、数据周期和排除因素。
4. 除附件明确将某项经营指标约定为付费或验收条件外,系统功能验收不以特定利润数值必然实现为前提。
### 10.2 建议验收维度
| 验收维度 | 指标示例 | 目标值/标准 |
|:---|:---|:---|
| 功能 | 约定功能可用、角色权限生效、关键流程可完成 | [ ] |
| 数据 | 完整率、准确率、及时率、口径一致率、可追溯率 | [ ] |
| 性能 | 页面响应、批处理时间、并发用户数 | [ ] |
| 问题发现 | 发现周期、有效异常率、影响金额覆盖率 | [ ] |
| 执行闭环 | 任务接收率、完成率、整改有效率 | [ ] |
| 交付物 | 文档、报告、培训、配置和管理员移交 | [ ] |
### 10.3 验收流程
1. 乙方完成某一阶段或整体交付后,向甲方提交书面验收申请和交付清单。
2. 甲方应在收到完整验收材料后[ ]个工作日内完成测试,并一次性书面提出不符合项。
3. 乙方应在合理期限内完成不符合项修复并重新申请验收。
4. 不影响系统主要目的和核心功能的轻微缺陷,可列入遗留问题清单,不作为拒绝验收的理由;乙方应在双方确认的期限内修复。
5. 甲方在验收期限内未提出具体书面异议,且已将系统用于生产经营超过[ ]日的,可视为相应交付通过验收。如双方不接受默示验收,应在此处删除本款。
---
## 十一、培训、运维、保修与服务级别
### 11.1 培训
| 培训对象 | 次数/时长 | 形式 | 主要内容 |
|:---|:---|:---|:---|
| 系统管理员 | [ ] | [线上/现场] | 账号、权限、配置、日志和日常管理 |
| 总部/区域用户 | [ ] | [线上/现场] | 分析、预警、任务、验收和报告 |
| 店长/一线用户 | [ ] | [线上/现场] | 目标卡、整改任务、进度与反馈 |
### 11.2 保修期
1. 项目最终验收通过之日起[ ]个月为免费保修期。
2. 保修期内,乙方免费修复交付范围内的软件缺陷。
3. 因甲方或第三方擅自修改系统、基础环境故障、违规操作、外部接口变更、不可抗力或非乙方原因产生的问题,不属于免费保修范围。
### 11.3 服务级别
| 故障级别 | 定义 | 响应时间 | 恢复/解决目标 |
|:---|:---|:---|:---|
| P1 紧急 | 系统整体不可用、重大安全事件或核心数据严重错误 | [ ]分钟 | [ ]小时恢复或提供绕行方案 |
| P2 高 | 核心功能受影响,但存在部分替代方式 | [ ]小时 | [ ]个工作日 |
| P3 中 | 一般功能异常,不阻断主要业务 | [ ]小时 | [ ]个工作日 |
| P4 低 | 优化建议、使用咨询或轻微问题 | [ ]个工作日 | 纳入计划处理 |
> 具体服务时间、服务窗口、可用性指标、计划内维护时间及赔偿机制,以《服务级别协议(SLA)》为准。
---
## 十二、合同价款、税费与支付
### 12.1 费用构成
| 费用项目 | 未税金额(元) | 税率 | 含税金额(元) | 说明 |
|:---|---:|---:|---:|:---|
| 软件许可/SaaS订阅费 | [ ] | [ ]% | [ ] | [年/月/永久许可] |
| 实施与数据接入费 | [ ] | [ ]% | [ ] | [ ] |
| 八周经营专项服务费 | [ ] | [ ]% | [ ] | [ ] |
| 定制开发费 | [ ] | [ ]% | [ ] | [ ] |
| 年度运维与智脑服务费 | [ ] | [ ]% | [ ] | [ ] |
| 第三方服务及云资源 | [ ] | [ ]% | [ ] | [ ] |
| **合计** | **[ ]** | — | **[ ]** | 大写:人民币[ ] |
### 12.2 支付计划
| 期次 | 支付条件 | 比例 | 金额(元) |
|:---|:---|---:|---:|
| 首期款 | 合同生效且乙方提供合法请款材料后[ ]个工作日 | [ ]% | [ ] |
| 进度款 | 完成[数据接入/中期里程碑]并经确认后[ ]个工作日 | [ ]% | [ ] |
| 验收款 | 项目最终验收后[ ]个工作日 | [ ]% | [ ] |
| 质保款/尾款 | 保修期满或[ ] | [ ]% | [ ] |
### 12.3 发票与账户
1. 乙方应向甲方开具合法、有效、符合税法要求的[增值税专用/普通]发票。
2. 甲方付款至乙方以下账户:
- 户名:[ ]
- 开户行:[ ]
- 账号:[ ]
3. 乙方收款账户变更应提前以加盖公章的书面文件通知甲方。
### 12.4 可选的经营成果服务费
如双方采用“固定服务费+经营结果服务费”模式,必须另行签署附件,至少明确:
1. 收益指标的定义、基线、计算公式、数据来源和审核权。
2. 季节、价格、市场、新店、关店、并购、管理动作等排除因素。
3. 改善结果与乙方服务的归因方法。
4. 计费比例、上限、下限、结算周期和争议处理。
---
## 十三、知识产权
### 13.1 乙方原有成果
1. 乙方在本合同签署前已拥有,或在项目中形成且具有通用性的软件平台、源代码、算法、模型、组件、工具、数据结构、行业本体方法、通用规则、技术文档及其改进,其知识产权归乙方或相应权利人所有。
2. 乙方按本合同向甲方授予相应使用许可,但未明确转让的知识产权不因交付、部署或付款而转移。
### 13.2 甲方材料与企业知识
1. 甲方提供的商标、业务数据、管理制度、内部 SOP、原始文档及甲方原有知识产权仍归甲方或原权利人所有。
2. 基于甲方数据形成、能够识别甲方经营状况的专属报告、异常清单、任务记录和决策记录,甲方在内部经营管理中享有永久使用权;其中的通用软件、模型与方法不因此转移。
### 13.3 定制成果
定制成果权属选择以下第[ ]种方式,并在附件逐项列明:
1. 乙方保留知识产权,授予甲方永久、非独占、不可转让的内部使用权。
2. 甲方在全额支付相应定制开发费后取得约定定制成果的财产性知识产权,但乙方原有平台、通用组件、开源软件和第三方成果除外。
### 13.4 第三方与开源软件
系统中包含的开源软件或第三方软件按其各自许可条款使用。乙方应向甲方提供需要告知的重要许可限制。
---
## 十四、保密义务
1. **保密信息**包括但不限于:业务数据、个人信息、财务信息、销售信息、门店经营信息、会员信息、薪酬、价格、供应商、商业计划、系统架构、源代码、算法、安全方案、合同价格及一方标明或依性质应视为保密的其他信息。
2. 接收方仅可为履行本合同的目的使用保密信息,并仅向确有必要知悉且承担不低于本合同保密义务的员工、顾问或批准的分包商披露。
3. 未经甲方事先书面同意,乙方不得在宣传片、PPT、官网、公众号、投标、展会、案例库或对外演示中使用甲方名称、商标、门店信息、系统截图或可识别数据。
4. 经甲方书面同意使用案例时,乙方应按甲方批准的范围进行匿名化、汇总化或模拟化处理,并不得超出批准用途。
5. 下列信息不属于保密信息:接收方能证明已合法知悉、非因违约已公开、从有权第三方合法获得、或未使用对方保密信息而独立开发的信息。
6. 因法律、监管、司法或证券交易规则必须披露的,接收方应在法律允许的范围内提前通知披露方,并尽力限制披露范围。
7. 保密义务自保密信息披露之日起持续[ ]年;商业秘密、个人信息及法律要求持续保护的信息,保密义务持续至其不再属于保护对象为止。
---
## 十五、声明、保证与合规
1. 双方声明其为依法成立并有效存续的主体,有权签署和履行本合同。
2. 乙方保证在其所知且应尽合理注意的范围内,乙方提供的系统和服务不故意侵害第三方知识产权。
3. 甲方保证其提供的数据、材料、商标、软件、接口和使用指令不侵害第三方合法权益,并已获得必要授权。
4. 双方应遵守反商业贿赂、反不正当竞争、网络安全、数据保护、税务、劳动与其他适用法律。
5. 本系统输出不构成法律、审计、税务、金融、医疗或其他需要特定职业资格的专业意见。
---
## 十六、违约责任
### 16.1 逾期付款
1. 甲方逾期支付且经乙方书面催告后仍未支付的,每逾期一日,应按逾期金额的[ ]% 支付违约金,累计不超过逾期金额的[ ]%。
2. 逾期超过[ ]日的,乙方可在事先书面通知并采取必要的数据安全措施后,暂停尚未付费的服务或终止合同。
### 16.2 交付延误
因乙方原因导致经双方确认的关键里程碑逾期,且乙方在宽限期[ ]日内仍未纠正的,乙方每逾期一日按对应里程碑价款的[ ]% 支付违约金,累计不超过该里程碑价款的[ ]%。
### 16.3 数据与保密违约
1. 一方违反数据保护或保密义务的,应立即停止违约、采取补救措施,并赔偿对方因此遭受的实际直接损失及合理维权费用。
2. 如双方约定固定违约金,金额为人民币[ ]元;如固定违约金不足以弥补损失,违约方仍应对不足部分负责。本款应由法务结合交易金额审核。
### 16.4 知识产权侵权
1. 如第三方主张乙方提供的系统侵害其知识产权,甲方应及时通知乙方,交由乙方在合理范围内负责处理。
2. 乙方可选择为甲方取得继续使用的权利、进行不影响主要功能的替换或修改,或对无法继续使用的部分退还未履行期间的相应费用。
3. 因甲方数据、材料、指定技术、擅自修改、未按文档使用或与非乙方提供的产品组合产生的侵权,乙方不承担责任。
---
## 十七、责任限制
1. 任何一方不对对方的间接损失、可得利益损失、商誉损失、预期节约损失或因第三方主张而导致的扩大损失承担责任,除非适用法律不允许排除。
2. 除本条第3款情形外,任何一方因本合同承担的累计赔偿责任,以导致责任事件发生前12个月甲方已向乙方支付的相关合同费用为上限;合同履行不足12个月的,以已支付合同费用为上限。
3. 对于故意或重大过失、人身伤害、欺诈、贿赂、侵犯知识产权、违反保密义务、违法处理个人信息或适用法律不允许限制的责任,不适用前述排除或限额,或由双方另行约定更高上限。
4. 甲方基于 AI 建议做出重要经营决策前,应进行人工审核与必要的专业验证。因甲方未履行合理审核义务、违反系统警示或超出约定场景使用而造成的损失,乙方不承担相应责任。
---
## 十八、合同期限、续约、暂停与终止
### 18.1 合同期限
本合同自双方加盖公章或合同专用章之日起生效,有效期至[ ]年[ ]月[ ]日。合同到期前[ ]日,双方可就续约、许可范围与服务费用进行协商。
### 18.2 解除
1. 一方严重违反本合同,经对方书面催告后[ ]日内未纠正的,守约方有权解除合同并追究责任。
2. 一方进入破产、清算、被吊销营业执照、停止经营或明显丧失履约能力的,对方可书面解除合同。
3. 发生重大数据泄露、严重违法处理个人信息、故意侵害知识产权或重大商业贿赂行为的,守约方可立即解除合同。
### 18.3 终止后处理
1. 甲方应结清截至终止日已发生的费用。
2. 乙方应按约定提供数据导出、返还或删除支持。如需额外迁移服务,双方另行约定工作量与费用。
3. 许可到期或终止后,甲方应停止使用已到期的软件服务;甲方依约已取得永久许可的除外。
4. 保密、数据保护、知识产权、应付款项、责任限制、争议解决及性质上应当持续有效的条款,不因合同终止而失效。
---
## 十九、不可抗力与第三方因素
1. 因地震、洪水、火灾、疫情、战争、政府行为、大范围通信或云服务中断等不能预见、不能避免且不能克服的事件导致无法履约的,受影响方在法律允许范围内免责。
2. 受影响方应及时通知对方,提供合理证明,并尽力减轻损失。
3. 第三方接口、系统、模型、云资源或平台规则变更,可能影响项目实施。双方应协商采取替代方案、调整计划或通过变更单处理。
---
## 二十、通知与送达
1. 双方的合同通知应通过专人递交、快递、挂号信或约定电子邮箱发送至本合同首部载明的地址或邮箱。
2. 联系信息变更的,变更方应在[ ]个工作日内书面通知对方,否则原联系信息仍视为有效送达地址。
3. 项目过程中的日常工作确认可通过约定项目管理工具、邮件或会议纪要完成;涉及价款、范围、工期、权利义务或合同变更的,应由授权代表书面确认。
---
## 二十一、适用法律与争议解决
1. 本合同的订立、效力、解释、履行与争议解决适用中华人民共和国大陆地区法律。
2. 因本合同引起或与本合同有关的争议,双方应首先通过友好协商解决。
3. 协商不成的,双方选择以下第[ ]种方式:
1. 向[甲方住所地/乙方住所地/合同签订地]有管辖权的人民法院起诉。
2. 提交[ ]仲裁委员会,按其届时有效的仲裁规则仲裁。
4. 争议期间,除争议事项外,双方应继续履行不受影响的其他条款。
---
## 二十二、其他
1. 本合同、附件、补充协议、经双方授权代表确认的变更单和验收文件,共同构成双方完整约定。
2. 文件效力冲突时,原则上按以下顺序确定:后签署的补充协议/变更单 → 本合同正文 → 项目范围与交付清单 → 其他附件;但相关文件明确约定其优先级的除外。
3. 本合同某条款被认定为无效或不可执行的,不影响其他条款的效力。双方应以合法、有效且最接近原商业目的的条款替代。
4. 一方未立即行使某项权利,不构成对该权利的放弃。
5. 未经对方书面同意,任何一方不得转让本合同主要权利义务;但因合并、分立、重组或资产转让而承继且不降低履约能力的除外,并应及时通知对方。
6. 本合同一式[ ]份,甲乙双方各执[ ]份,具有同等法律效力。符合适用法律要求的可靠电子签名与纸质签章具有同等效力。
---
## 二十三、合同附件
下列附件应根据实际交易选择并作为本合同不可分割的组成部分:
1. **附件一:项目范围与交付清单**
2. **附件二:报价单与支付计划**
3. **附件三:项目实施计划与里程碑**
4. **附件四:验收标准与测试用例**
5. **附件五:数据处理与个人信息保护附件**
6. **附件六:数据源、接口与责任边界清单**
7. **附件七:信息安全要求与安全事件处置流程**
8. **附件八:服务级别协议(SLA**
9. **附件九:第三方软件、开源软件与 AI 模型服务清单**
10. **附件十:需求变更申请单模板**
---
## 二十四、签署页
(以下无正文)
| 甲方(盖章) | 乙方(盖章) |
|:---|:---|
| 单位名称:[ ] | 单位名称:[ ] |
| 法定代表人/授权代表:[ ] | 法定代表人/授权代表:[ ] |
| 签字:[ ] | 签字:[ ] |
| 日期:[ ]年[ ]月[ ]日 | 日期:[ ]年[ ]月[ ]日 |
---
# 附件一:项目范围与交付清单(简表)
## 1. 基本范围
| 类别 | 约定 |
|:---|:---|
| 项目名称 | 玄谋智脑[ ]专项 |
| 项目目标 | [ ] |
| 覆盖组织 | [总部/区域/门店] |
| 覆盖门店 | [ ]家 |
| 数据周期 | [ ] |
| 经营专项 | [ ] |
| 部署方式 | [SaaS/私有化/混合] |
## 2. 数据源清单
| 数据源 | 系统/提供方 | 接入方式 | 频率 | 责任方 | 备注 |
|:---|:---|:---|:---|:---|:---|
| POS | [ ] | [API/文件/数据库视图] | [ ] | [ ] | [ ] |
| 外卖平台 | [ ] | [ ] | [ ] | [ ] | [ ] |
| 库存/WMS | [ ] | [ ] | [ ] | [ ] | [ ] |
| 财务 | [ ] | [ ] | [ ] | [ ] | [ ] |
| HR/考勤 | [ ] | [ ] | [ ] | [ ] | [ ] |
| 其他 | [ ] | [ ] | [ ] | [ ] | [ ] |
## 3. 交付功能与成果
| 编号 | 功能/交付物 | 标准/定制 | 验收依据 | 计划日期 |
|:---|:---|:---|:---|:---|
| 1 | 数据接入与质量报告 | [ ] | [ ] | [ ] |
| 2 | 业务本体与指标词典 | [ ] | [ ] | [ ] |
| 3 | 经营看板与分析 | [ ] | [ ] | [ ] |
| 4 | 异常预警与归因 | [ ] | [ ] | [ ] |
| 5 | AI 经营建议 | [ ] | [ ] | [ ] |
| 6 | 整改任务与验收 | [ ] | [ ] | [ ] |
| 7 | 专项报告与复制建议 | [ ] | [ ] | [ ] |
| 8 | 培训与文档 | [ ] | [ ] | [ ] |
---
# 附件二:费用与付款确认表
| 项目 | 约定 |
|:---|:---|
| 合同含税总额 | 人民币[ ]元(大写:[ ]) |
| 软件许可期 | [ ] |
| 首期款 | [ ]% / 人民币[ ]元 |
| 进度款 | [ ]% / 人民币[ ]元 |
| 验收款 | [ ]% / 人民币[ ]元 |
| 尾款 | [ ]% / 人民币[ ]元 |
| 年度运维/续订费 | 人民币[ ]元/年 |
| 差旅费 | [包含/实报实销/不发生] |
| 第三方费用 | [包含/甲方承担/按用量结算] |
---
# 附件三:上线前必填商务与法务清单
> 以下项目不宜保留空白后直接签署。
- [ ] 甲乙双方工商主体、签署权限和送达信息
- [ ] SaaS、私有化或混合部署方式
- [ ] 许可用户、门店、关联公司和使用期限
- [ ] 数据源、数据类型、数据周期和接入方式
- [ ] 是否处理个人信息、敏感个人信息或重要数据
- [ ] 是否调用第三方 AI 模型,数据是否离开甲方环境
- [ ] 项目范围、排除项、里程碑和变更流程
- [ ] 验收指标、基线、数据口径和外部排除因素
- [ ] 费用、税率、付款条件、第三方费用与差旅费
- [ ] 知识产权与定制成果权属
- [ ] 数据安全事件通知时限、数据返还和删除期限
- [ ] SLA、保修期、服务时间和赔偿机制
- [ ] 违约金、责任上限、争议解决地点与方式
- [ ] 案例宣传、商标使用和匿名数据使用是否授权
- [ ] 双方法务、数据保护负责人和信息安全负责人已审核
@@ -0,0 +1,429 @@
# 《看不见的利润》——玄谋智脑老板版宣传片剧本
> **品牌**:玄谋智脑
> **副标题**:连锁企业行业数字本体与 AI 经营智脑
> **目标观众**:连锁企业老板、董事长、总经理及投资决策者
> **建议时长**:2 分 30 秒—2 分 45 秒
> **风格**:冷峻、克制、高级,具有商业电影感和决策压迫感
> **情绪曲线**:繁荣表象 → 利润危机 → 管理失控 → 看清问题 → 掌控全局 → 长期复利
## 一、核心创意
影片不从介绍产品功能开始,而是先向老板提出一个有压迫感的问题:
> **你的企业可能每天都在增长,也可能每天都在漏掉利润。**
用“营收上升但利润流失”形成第一次冲击,用“门店越多、管理越容易失控”形成第二次冲击,再让“玄谋智脑”以企业经营全局掌控者的形象出现。
影片的核心不是证明 AI 多么先进,而是让老板相信:
> **玄谋智脑能让经营问题更早被发现、让整改真正落地,并把每一次改善复制到更多门店。**
---
## 二、分镜剧本
### 0:00—0:12|老板以为企业正在增长
#### 画面
- 深夜城市航拍。
- 一家家连锁门店在城市中依次亮起。
- 地图上的门店节点不断增加。
- 快速切换新店开业、顾客排队、外卖订单响起、收银数字增长、仓库繁忙运转。
- 总部屏幕上的营收曲线持续上升。
#### 旁白
> 门店越来越多。
> 订单越来越多。
> 营收,也在增长。
#### 屏幕文字
> **企业正在增长。**
画面停顿半秒,音乐突然切断。
文字瞬间碎裂,黑底上出现:
> # 但利润呢?
#### 声音
- 低沉心跳声逐渐增强。
- 叠加订单提示音、收银声和货币流动声。
- “但利润呢”出现时所有声音骤停。
---
### 0:12—0:30|看得见营收,看不见利润漏洞
#### 画面
- 刚才繁荣的画面迅速变暗。
- 营收数字继续上升,利润数字却开始下降。
- 红色资金流从不同经营环节向外流失。
- 每个流失节点依次标记:低毛利 SKU、无效促销、人员闲置、高损耗库存、异常采购价格、持续亏损门店。
#### 旁白
> 订单增长了,促销却可能正在消耗利润。
> 营收靠前的门店,可能没有创造相应的现金。
> 畅销商品,可能只是制造了繁忙。
> 每一家门店里,都可能存在老板看不见的利润漏洞。
#### 屏幕快闪文字
```text
低毛利
高损耗
无效工时
库存占用
促销替代
门店亏损
```
最后定格:
> **不是企业没有数据。**
> **而是数据没有变成决策。**
---
### 0:30—0:45|传统管理方式已经到达极限
#### 画面
- 总部会议室里,老板面对多块屏幕与大量报表。
- POS、财务、外卖、库存、人力、Excel 和工作群消息不断涌现。
- 不同报表上的数字互相矛盾。
- 画面逐渐加速,数据、消息和预警几乎淹没老板。
#### 旁白
> POS、财务、库存、会员、外卖、人力……
> 数据散落在不同系统里。
> 开会先核对数字,出现问题再追问原因。
> 当企业从 30 家店走向 300 家店,依靠人盯、表管、群里催,已经无法掌控全局。
#### 屏幕大字
> # 规模扩大,不应该意味着管理失控。
---
### 0:45—1:00|玄谋智脑登场
#### 画面
- 黑暗中出现一道蓝色光线。
- 散落的数据节点被逐一连接。
- “门店—商品—订单—会员—员工—供应商—库存—利润”形成立体的企业经营图谱。
- 图谱从混乱逐渐转为清晰、稳定、可运行的经营系统。
- 品牌名称缓慢出现。
#### 旁白
> 玄谋智脑。
> 面向连锁企业的行业数字本体与 AI 经营智脑。
> 它不替换企业现有系统,也不制造更多报表。
> 它将散落的数据、行业知识和管理经验,连接成一套持续进化的经营决策能力。
#### 屏幕文字
```text
看清现在
发现问题
推动整改
掌控未来
```
#### 声音
- 音乐从压迫感转为低频、沉稳、具有力量的科技旋律。
- 品牌出现时加入低频冲击音。
---
### 1:00—1:20|从异常到利润改善
#### 画面
- 企业经营图谱中出现一个红色异常点。
- 镜头迅速向下穿透:企业 → 区域 → 门店 A-017 → 晚餐时段 → 人员排班。
- 系统形成完整闭环链路。
```text
发现异常
→ 穿透根因
→ 测算影响
→ 生成方案
→ 推动执行
→ 验证结果
```
#### 旁白
> 玄谋智脑持续扫描企业经营状态。
> 发现异常后,自动穿透到区域、门店、SKU、班次和订单。
> 测算问题影响了多少利润,给出可以执行的整改方案。
> 明确责任人和完成期限,并验证利润是否真正改善。
#### 屏幕大字
> **发现问题,不是终点。**
> **改善结果,才是。**
---
### 1:20—1:35|案例一:SKU 利润优化
#### 画面
- 数百个 SKU 在数据空间中排列。
- 低销量、低毛利、高损耗、原料重复、价格带重叠的商品逐步变红。
- 低效 SKU 被重新组合,库存占用下降,利润曲线上升。
#### 旁白
> 某匿名连锁品牌,拥有数百个在售 SKU。
> 玄谋智脑发现:部分商品只贡献极少销售额,却持续占用库存,增加报损和采购复杂度。
> 下架低效 SKU,优化定价与配方,重构共享原料体系。
#### 屏幕模拟结果
```text
释放库存资金:约 80 万元
年度减少报损:约 35 万元
综合毛利率:提升约 0.6 个百分点
```
> **角标**:匿名复合案例|模拟测算
---
### 1:35—1:50|案例二:人员排班
#### 画面
- 门店客流曲线与员工工时曲线同时出现。
- 上午员工过剩区域变红;晚高峰人员不足区域变红。
- AI 重新调整班次后,工时曲线与客流曲线逐渐匹配。
#### 旁白
> 某门店营收排名靠前,人效却位于区域末端。
> 玄谋智脑按半小时预测客流和工作量,重新匹配正式工、小时工与备餐任务。
> 不降低服务质量,减少无效工时。
#### 屏幕模拟结果
```text
单店每月节约:约 1.8 万元
复制至 60 家门店
年度改善空间:约 1,296 万元
```
> **角标**:匿名复合案例|模拟测算
---
### 1:50—2:04|案例三:促销与关店决策
#### 画面 A:促销利润
- 订单量显示“+23%”。
- 随后逐层扣除优惠补贴、平台佣金、低毛利商品、原价订单替代和新增人工。
- 最后活动贡献利润从正数变为负数。
#### 旁白 A
> 订单增长 23% 的活动,扣除补贴、佣金和订单替代后,贡献利润可能为负。
> 玄谋智脑不只问活动带来了多少订单,而是问——每投入一元营销费用,最终增加了多少利润。
#### 画面 B:门店止损
- 一家长期亏损门店出现。
- 四条决策路径同时展开:继续经营、投入整改、缩小面积、关停并迁移会员。
- 每条路径后方出现未来 12 个月的利润、现金流与风险测算。
#### 旁白 B
> 对于低效门店,它同时推演整改、缩店、迁址和关停方案。
> 让一个困难的经验判断,变成有数据依据、有止损线、有退出预案的经营决策。
> **角标**:匿名复合案例|模拟测算
---
### 2:04—2:18|老板、总部、区域、店长共用一个经营闭环
#### 画面
四层组织结构依次亮起:
```text
老板
总部
区域
店长
```
每一层出现自己的决策界面:
- 老板:利润、风险、未来预测。
- 总部:区域对标、资源配置。
- 区域:异常门店、整改验收。
- 店长:今日目标、执行动作。
#### 旁白
> 老板看结果。
> 总部找原因。
> 区域推动整改。
> 店长执行动作。
> 所有人使用同一套经营语言,所有动作回到同一个利润闭环。
#### 屏幕文字
> **一个企业**
> **一套经营认知**
> **一个执行闭环**
---
### 2:18—2:30|从单店改善到企业长期复利
#### 画面
- 企业经营图谱不断扩大。
- 30 家、100 家、300 家门店依次点亮。
- 优秀门店的经营经验化为蓝色光流,快速复制到其他门店。
- 依次出现:风险提前预警、经营趋势预测、现金流推演、数据资产沉淀、银行融资数据支持、企业最佳实践库。
#### 旁白
> 当每一次经营判断、整改动作和验证结果都被沉淀,企业获得的不再是一套软件。
> 而是一项不依赖少数能人、能够支撑持续扩张、持续进化的经营能力。
---
### 2:30—2:42|结尾行动号召
#### 画面
- 画面切黑,停顿半秒。
- 一条蓝色光线横向展开。
- 主标题逐字出现。
> # 看清企业现在
> # 掌控经营未来
随后品牌出现:
> # 玄谋智脑
#### 旁白
> 不必从建设一套庞大的系统开始。
> 先用八周,找到第一批可以验证的利润改善机会。
#### 最终屏幕
> **玄谋智脑**
> 让问题更早被发现
> 让整改真正落地
> 让每一次改善复制到更多门店
底部小字:
> 行业数字本体与 AI 经营智脑
#### 声音
- 旁白语速放慢。
- “八周”和“利润改善”重读。
- 品牌出现时,音乐形成一次强烈、干净的收束。
---
## 三、开场钩子备选
### 首选
> **老板最危险的,不是看见亏损,而是看见营收,却没有看见利润正在消失。**
### 备选一
> 你的企业,可能每天都在增长,也可能每天都在漏掉利润。
### 备选二
> 从 30 家店到 300 家店,最大的风险不是开得不够快,而是已经看不清每一家店。
---
## 四、配音要求
- **声线**:建议男声,40—50 岁质感,低沉、稳定、具有决策权威感。
- **表达**:克制、有力,避免传统广告腔和过度煽情。
- **开场**:语速较慢,使用停顿制造压力。
- **危机段**:语速逐渐加快,叠加数据涌现的窒息感。
- **品牌登场**:声音下沉,“玄谋智脑”逐字清晰发音。
- **案例段**:加快节奏,强调“发现—动作—结果”。
- **结尾**:再次放慢,重读“八周”、“可以验证”和“利润改善”。
---
## 五、视觉与音乐方向
### 视觉色彩
- 主背景:深黑、炭灰。
- 品牌主色:冷蓝色光线。
- 风险与利润流失:暗红色。
- 经营改善:由红转蓝、由混乱转清晰。
### 画面风格
- 高端商业电影质感,避免廉价科技光效。
- 数据图谱与企业经营场景结合,不制作密集仪表盘界面。
- 字体简洁、粗壮,关键句使用黑底白字或黑底蓝字。
- 案例不使用真实客户形象,可使用概念化门店、匿名编号与抽象数据。
### 音乐节奏
1. **0:00—0:12**:心跳与低频,表面繁荣,暗含不安。
2. **0:12—0:45**:低音增强,金属与噪音逐渐累积,形成管理压力。
3. **0:45—1:20**:品牌登场,出现有秩序的低频节拍。
4. **1:20—2:04**:案例快节奏推进,重点数据出现时加入短促冲击音。
5. **2:04—2:30**:音乐开始变得开阔,表现组织协同与规模扩张。
6. **2:30—2:42**:减少音乐层次,将注意力交给旁白和品牌。
---
## 六、数据安全与宣传合规要求
1. 不展示任何真实客户名称、真实门店名称或品牌标识。
2. 不使用生产系统截图、真实报表、订单明细或数据库结构。
3. 不展示会员姓名、手机号、身份信息、薪酬或个人工号。
4. 案例中的企业、门店和人员统一使用匿名编号。
5. 所有金额与改善数据在画面中标注:**“匿名复合案例|模拟测算”**。
6. 不使用“保证提升”、“必然增利”、“自动替代决策”等过度承诺。
7. AI 的角色表达为“发现、归因、测算、建议和跟踪”,重要经营决策仍由管理者审批。
---
## 七、制作原则
- 前 3 秒必须出现利润危机钩子。
- 前 30 秒完成“繁荣表象—利润危机—管理失控”的情绪推进。
- 不堆砌技术名词,所有能力都落到利润、现金流、风险和执行结果。
- 不将影片制作成功能界面录屏,应以企业经营决策故事为主线。
- 案例不只呈现问题,必须呈现“发现—分析—动作—验证”。
- 画面文字保持极简,每个镜头只传达一个重点。
- 结尾不使用泛化的“谢谢观看”,而是推动老板接受“八周利润专项验证”。
@@ -0,0 +1,456 @@
{"kind":"deck","id":"pr/b7j3z3","name":"Deck"}
{"kind":"layout","layoutId":"f673259f-cc37-4c44-adbc-61865f765d54","name":"Master","type":"master"}
{"kind":"layout","layoutId":"dca06ee3-56a1-466b-bef1-c810d243d6fc","name":"Title Slide","type":"title"}
{"kind":"slide","id":"sl/hj9qgi","slide":1,"title":"玄谋智脑","textShapes":4}
{"kind":"textbox","id":"sh/ehgji98z","slide":1,"text":"玄谋智脑","textPreview":"玄谋智脑","textChars":4,"textLines":1,"bbox":[42,34,360,36]}
{"kind":"textbox","id":"sh/1k72t47a","slide":1,"text":"让老板看清每一分利润\n管住每一家门店","textPreview":"让老板看清每一分利润 | 管住每一家门店","textChars":18,"textLines":2,"bbox":[42,180,990,180]}
{"kind":"textbox","id":"sh/gjy1kzq5","slide":1,"text":"面向连锁企业的行业数字本体与 AI 经营智脑","textPreview":"面向连锁企业的行业数字本体与 AI 经营智脑","textChars":22,"textLines":1,"bbox":[42,402,870,48]}
{"kind":"shape","id":"sh/n69kvepg","slide":1,"bbox":[42,615,1196,0]}
{"kind":"textbox","id":"sh/2lgjm98v","slide":1,"text":"对外保密版 · 案例与金额均为匿名示意","textPreview":"对外保密版 · 案例与金额均为匿名示意","textChars":19,"textLines":1,"bbox":[42,640,620,24]}
{"kind":"notes","id":"nt/hj9qgi","slide":1,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/qxqhfa","slide":2,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":13}
{"kind":"textbox","id":"sh/tcv6tcbq","slide":2,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/6947yxcz","slide":2,"text":"老板真正需要回答的,只有三个问题","textPreview":"老板真正需要回答的,只有三个问题","textChars":16,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/rador2tk","slide":2,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/k725wnut","slide":2,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/58v6psbe","slide":2,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,190,80,48]}
{"kind":"shape","id":"sh/i5knuxc3","slide":2,"bbox":[42,248,350,0]}
{"kind":"textbox","id":"sh/j6tonito","slide":2,"text":"哪里在亏钱?","textPreview":"哪里在亏钱?","textChars":6,"textLines":1,"bbox":[42,278,350,52]}
{"kind":"textbox","id":"sh/wj25snux","slide":2,"text":"门店、SKU、促销、库存、人力中,哪些利润漏洞最应该先处理?","textPreview":"门店、SKU、促销、库存、人力中,哪些利润漏洞最应该先处理?","textChars":30,"textLines":1,"bbox":[42,352,350,140]}
{"kind":"textbox","id":"sh/xkb6lsbi","slide":2,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[443,190,80,48]}
{"kind":"shape","id":"sh/9gr6h83m","slide":2,"bbox":[443,248,350,0]}
{"kind":"textbox","id":"sh/ofi5o321","slide":2,"text":"哪些动作能增利?","textPreview":"哪些动作能增利?","textChars":8,"textLines":1,"bbox":[443,278,350,52]}
{"kind":"textbox","id":"sh/ne9ofylg","slide":2,"text":"不只找问题,还要测算影响、给出方案、跟踪执行并验证结果。","textPreview":"不只找问题,还要测算影响、给出方案、跟踪执行并验证结果。","textChars":28,"textLines":1,"bbox":[443,352,350,140]}
{"kind":"textbox","id":"sh/md0nmdkv","slide":2,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[844,190,80,48]}
{"kind":"shape","id":"sh/1cr6d83a","slide":2,"bbox":[844,248,350,0]}
{"kind":"textbox","id":"sh/0bi5k325","slide":2,"text":"扩张后还能管住吗?","textPreview":"扩张后还能管住吗?","textChars":9,"textLines":1,"bbox":[844,278,350,52]}
{"kind":"textbox","id":"sh/zqpobylk","slide":2,"text":"从 30 家到 300 家门店,有效经验能否被低成本、高质量地复制?","textPreview":"从 30 家到 300 家门店,有效经验能否被低成本、高质量地复制?","textChars":34,"textLines":1,"bbox":[844,352,350,140]}
{"kind":"textbox","id":"sh/epgnitkz","slide":2,"text":"不是看更多报表,而是将数据转化为可验证的经营改善。","textPreview":"不是看更多报表,而是将数据转化为可验证的经营改善。","textChars":25,"textLines":1,"bbox":[42,590,1100,42]}
{"kind":"notes","id":"nt/qxqhfa","slide":2,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/1s4wob","slide":3,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/2pszedgz","slide":3,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/psjypsza","slide":3,"text":"连锁企业不缺数据,缺的是利润穿透力","textPreview":"连锁企业不缺数据,缺的是利润穿透力","textChars":17,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/orahgny5","slide":3,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/bu1gr2hg","slide":3,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/qtszixgv","slide":3,"bbox":[42,188,360,160]}
{"kind":"shape","id":"sh/dw3ytczm","slide":3,"bbox":[42,188,7,160]}
{"kind":"textbox","id":"sh/cvuhk7y1","slide":3,"text":"营收","textPreview":"营收","textChars":2,"textLines":1,"bbox":[66,210,314,40]}
{"kind":"textbox","id":"sh/ryhgfyhc","slide":3,"text":"营收增长,利润为何没有同步?","textPreview":"营收增长,利润为何没有同步?","textChars":14,"textLines":1,"bbox":[66,262,314,68]}
{"kind":"shape","id":"sh/6x8f6tgr","slide":3,"bbox":[443,188,360,160]}
{"kind":"shape","id":"sh/c32t0jyt","slide":3,"bbox":[443,188,7,160]}
{"kind":"textbox","id":"sh/d4ba9ofe","slide":3,"text":"门店","textPreview":"门店","textChars":2,"textLines":1,"bbox":[467,210,314,40]}
{"kind":"textbox","id":"sh/qh0bytgn","slide":3,"text":"哪些门店看似赚钱,实际占用资金?","textPreview":"哪些门店看似赚钱,实际占用资金?","textChars":16,"textLines":1,"bbox":[467,262,314,68]}
{"kind":"shape","id":"sh/r29s7yx8","slide":3,"bbox":[844,188,360,160]}
{"kind":"shape","id":"sh/072t43yp","slide":3,"bbox":[844,188,7,160]}
{"kind":"textbox","id":"sh/l8bad8fa","slide":3,"text":"促销","textPreview":"促销","textChars":2,"textLines":1,"bbox":[868,210,314,40]}
{"kind":"textbox","id":"sh/y5kb2tgz","slide":3,"text":"哪些活动增加订单,却消耗利润?","textPreview":"哪些活动增加订单,却消耗利润?","textChars":15,"textLines":1,"bbox":[868,262,314,68]}
{"kind":"shape","id":"sh/z6tsbyxk","slide":3,"bbox":[42,390,360,160]}
{"kind":"shape","id":"sh/gbi9szyl","slide":3,"bbox":[42,390,7,160]}
{"kind":"textbox","id":"sh/hcra14f6","slide":3,"text":"SKU","textPreview":"SKU","textChars":3,"textLines":1,"bbox":[66,412,314,40]}
{"kind":"textbox","id":"sh/xwzi9wny","slide":3,"text":"哪些商品销量不低,却毛利不足?","textPreview":"哪些商品销量不低,却毛利不足?","textChars":15,"textLines":1,"bbox":[66,464,314,68]}
{"kind":"shape","id":"sh/wvqhgbmd","slide":3,"bbox":[443,390,360,160]}
{"kind":"shape","id":"sh/vuhg765s","slide":3,"bbox":[443,390,7,160]}
{"kind":"textbox","id":"sh/atoze147","slide":3,"text":"人力","textPreview":"人力","textChars":2,"textLines":1,"bbox":[467,412,314,40]}
{"kind":"textbox","id":"sh/5kzidgnu","slide":3,"text":"哪些时段人员闲置,高峰又缺人?","textPreview":"哪些时段人员闲置,高峰又缺人?","textChars":15,"textLines":1,"bbox":[467,464,314,68]}
{"kind":"shape","id":"sh/kzqhkbm9","slide":3,"bbox":[844,390,360,160]}
{"kind":"shape","id":"sh/jyh0b65o","slide":3,"bbox":[844,390,7,160]}
{"kind":"textbox","id":"sh/ix8zi143","slide":3,"text":"止损","textPreview":"止损","textChars":2,"textLines":1,"bbox":[868,412,314,40]}
{"kind":"textbox","id":"sh/tojih0nq","slide":3,"text":"哪些门店应整改、迁址、缩编或关停?","textPreview":"哪些门店应整改、迁址、缩编或关停?","textChars":17,"textLines":1,"bbox":[868,464,314,68]}
{"kind":"notes","id":"nt/1s4wob","slide":3,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/ikpsiw","slide":4,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":22}
{"kind":"textbox","id":"sh/h43mhg7q","slide":4,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/uhcn61of","slide":4,"text":"玄谋智脑将一个异常,变成经过验证的利润改善","textPreview":"玄谋智脑将一个异常,变成经过验证的利润改善","textChars":21,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/v2l4f6p0","slide":4,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/47e5cv6h","slide":4,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/58n6l072","slide":4,"bbox":[82,350,1090,0]}
{"kind":"shape","id":"sh/i5wnalob","slide":4,"bbox":[54,332,36,36]}
{"kind":"textbox","id":"sh/j65ojqpw","slide":4,"text":"1","textPreview":"1","textChars":1,"textLines":1,"bbox":[54,337,36,24]}
{"kind":"textbox","id":"sh/kba50r6d","slide":4,"text":"发现","textPreview":"发现","textChars":2,"textLines":1,"bbox":[44,235,150,40]}
{"kind":"textbox","id":"sh/lcjm9w7y","slide":4,"text":"利润异常","textPreview":"利润异常","textChars":4,"textLines":1,"bbox":[44,400,164,78]}
{"kind":"shape","id":"sh/tw32ts7i","slide":4,"bbox":[253,332,36,36]}
{"kind":"textbox","id":"sh/svul0nqx","slide":4,"text":"2","textPreview":"2","textChars":1,"textLines":1,"bbox":[253,337,36,24]}
{"kind":"textbox","id":"sh/rulkr2pc","slide":4,"text":"穿透","textPreview":"穿透","textChars":2,"textLines":1,"bbox":[243,235,150,40]}
{"kind":"textbox","id":"sh/6tc3yx8r","slide":4,"text":"区域·门店·SKU·班次","textPreview":"区域·门店·SKU·班次","textChars":12,"textLines":1,"bbox":[243,400,164,78]}
{"kind":"shape","id":"sh/10n2xc7e","slide":4,"bbox":[452,332,36,36]}
{"kind":"textbox","id":"sh/gzul47q9","slide":4,"text":"3","textPreview":"3","textChars":1,"textLines":1,"bbox":[452,337,36,24]}
{"kind":"textbox","id":"sh/fylkv2po","slide":4,"text":"测算","textPreview":"测算","textChars":2,"textLines":1,"bbox":[442,235,150,40]}
{"kind":"textbox","id":"sh/exc32x83","slide":4,"text":"影响金额与优先级","textPreview":"影响金额与优先级","textChars":8,"textLines":1,"bbox":[442,400,164,78]}
{"kind":"shape","id":"sh/p4n21c7q","slide":4,"bbox":[651,332,36,36]}
{"kind":"textbox","id":"sh/o3el8rq5","slide":4,"text":"4","textPreview":"4","textChars":1,"textLines":1,"bbox":[651,337,36,24]}
{"kind":"textbox","id":"sh/8j6dkf2d","slide":4,"text":"整改","textPreview":"整改","textChars":2,"textLines":1,"bbox":[641,235,150,40]}
{"kind":"textbox","id":"sh/9kfetkjy","slide":4,"text":"动作·责任人·期限","textPreview":"动作·责任人·期限","textChars":9,"textLines":1,"bbox":[641,400,164,78]}
{"kind":"shape","id":"sh/mhovipkn","slide":4,"bbox":[850,332,36,36]}
{"kind":"textbox","id":"sh/7ixwra18","slide":4,"text":"5","textPreview":"5","textChars":1,"textLines":1,"bbox":[850,337,36,24]}
{"kind":"textbox","id":"sh/w76dozip","slide":4,"text":"验证","textPreview":"验证","textChars":2,"textLines":1,"bbox":[840,235,150,40]}
{"kind":"textbox","id":"sh/h8fex4ja","slide":4,"text":"利润是否真正改善","textPreview":"利润是否真正改善","textChars":8,"textLines":1,"bbox":[840,400,164,78]}
{"kind":"shape","id":"sh/ulovmp0j","slide":4,"bbox":[1049,332,36,36]}
{"kind":"textbox","id":"sh/vmxwvu14","slide":4,"text":"6","textPreview":"6","textChars":1,"textLines":1,"bbox":[1049,337,36,24]}
{"kind":"textbox","id":"sh/cbmdcv2l","slide":4,"text":"沉淀","textPreview":"沉淀","textChars":2,"textLines":1,"bbox":[1039,235,150,40]}
{"kind":"textbox","id":"sh/dcvel0jq","slide":4,"text":"更新企业最佳实践","textPreview":"更新企业最佳实践","textChars":8,"textLines":1,"bbox":[1039,400,164,78]}
{"kind":"shape","id":"sh/f61gryl8","slide":4,"bbox":[42,552,1196,58]}
{"kind":"textbox","id":"sh/e5szitk3","slide":4,"text":"关键不是“发现问题”,而是“把问题变成可复制的利润改善”。","textPreview":"关键不是“发现问题”,而是“把问题变成可复制的利润改善”。","textChars":29,"textLines":1,"bbox":[66,568,1148,30]}
{"kind":"notes","id":"nt/ikpsiw","slide":4,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/73vtdw","slide":5,"title":"匿名复合案例 · SKU 组合决策","textShapes":15}
{"kind":"textbox","id":"sh/dsv6lgzq","slide":5,"text":"匿名复合案例 · SKU 组合决策","textPreview":"匿名复合案例 · SKU 组合决策","textChars":17,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/qp47algf","slide":5,"text":"SKU 更多不等于选择更多,可能只是成本更高","textPreview":"SKU 更多不等于选择更多,可能只是成本更高","textChars":22,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/rqdoj6h0","slide":5,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/4n2p8by9","slide":5,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/5ob6hgzu","slide":5,"text":"480","textPreview":"480","textChars":3,"textLines":1,"bbox":[42,182,190,72]}
{"kind":"textbox","id":"sh/ilkn61g3","slide":5,"text":"在售 SKU","textPreview":"在售 SKU","textChars":6,"textLines":1,"bbox":[42,256,190,30]}
{"kind":"textbox","id":"sh/3mtof6ho","slide":5,"text":"后 20% SKU 仅贡献约 3% 销售额,却持续占用库存资金。","textPreview":"后 20% SKU 仅贡献约 3% 销售额,却持续占用库存资金。","textChars":32,"textLines":1,"bbox":[262,190,800,76]}
{"kind":"shape","id":"sh/oj6pkvyd","slide":5,"bbox":[42,328,270,170]}
{"kind":"textbox","id":"sh/9kfqd0zy","slide":5,"text":"37 个","textPreview":"37 个","textChars":4,"textLines":1,"bbox":[66,354,222,64]}
{"kind":"textbox","id":"sh/1kr6d8zi","slide":5,"text":"低销量·低毛利·高损耗","textPreview":"低销量·低毛利·高损耗","textChars":11,"textLines":1,"bbox":[66,434,222,40]}
{"kind":"shape","id":"sh/gji543ix","slide":5,"bbox":[341,328,270,170]}
{"kind":"textbox","id":"sh/fi94bihc","slide":5,"text":"9 个","textPreview":"9 个","textChars":3,"textLines":1,"bbox":[365,354,222,64]}
{"kind":"textbox","id":"sh/eh0n2d0r","slide":5,"text":"高销量但低贡献利润","textPreview":"高销量但低贡献利润","textChars":9,"textLines":1,"bbox":[365,434,222,40]}
{"kind":"shape","id":"sh/tgrm98jm","slide":5,"bbox":[640,328,270,170]}
{"kind":"textbox","id":"sh/sfi503i1","slide":5,"text":"16 个","textPreview":"16 个","textChars":4,"textLines":1,"bbox":[664,354,222,64]}
{"kind":"textbox","id":"sh/rup47y1g","slide":5,"text":"可共享或替换原料","textPreview":"可共享或替换原料","textChars":8,"textLines":1,"bbox":[664,434,222,40]}
{"kind":"shape","id":"sh/6tgnyt0v","slide":5,"bbox":[939,328,270,170]}
{"kind":"textbox","id":"sh/dcb6lszq","slide":5,"text":"22 个","textPreview":"22 个","textChars":4,"textLines":1,"bbox":[963,354,222,64]}
{"kind":"textbox","id":"sh/cb25c7i5","slide":5,"text":"价格带重叠","textPreview":"价格带重叠","textChars":5,"textLines":1,"bbox":[963,434,222,40]}
{"kind":"shape","id":"sh/w7uh4vud","slide":5,"bbox":[42,535,1196,85]}
{"kind":"textbox","id":"sh/x83yx0by","slide":5,"text":"模拟测算:释放库存资金约 80 万元 · 年减少报损约 35 万元 · 综合毛利率提升约 0.6 个百分点","textPreview":"模拟测算:释放库存资金约 80 万元 · 年减少报损约 35 万元 · 综合毛利率提升约 0.6 个百分点","textChars":53,"textLines":1,"bbox":[68,558,1140,40]}
{"kind":"notes","id":"nt/73vtdw","slide":5,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/aoi4dv","slide":6,"title":"匿名复合案例 · 门店 A-017","textShapes":10}
{"kind":"textbox","id":"sh/rqd0ja9c","slide":6,"text":"匿名复合案例 · 门店 A-017","textPreview":"匿名复合案例 · 门店 A-017","textChars":17,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/crm1sfqx","slide":6,"text":"排班不是人数问题,而是工时与客流的匹配问题","textPreview":"排班不是人数问题,而是工时与客流的匹配问题","textChars":21,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/dsfilkri","slide":6,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/2l4zm58v","slide":6,"text":"06","textPreview":"06","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/3md0fa9g","slide":6,"bbox":[42,182,362,314]}
{"kind":"shape","id":"sh/4nmhovql","slide":6,"bbox":[42,182,7,314]}
{"kind":"textbox","id":"sh/povih0r6","slide":6,"text":"发现","textPreview":"发现","textChars":2,"textLines":1,"bbox":[66,204,316,40]}
{"kind":"textbox","id":"sh/uxkzil8j","slide":6,"text":"· 工作日上午存在闲置工时\n· 周五晚高峰经常缺人\n· 班次依据历史习惯\n· 加班集中在少数岗位","textPreview":"· 工作日上午存在闲置工时 | · 周五晚高峰经常缺人 | · 班次依据历史习惯 | · 加班集中在少数岗位","textChars":48,"textLines":4,"bbox":[66,256,316,222]}
{"kind":"shape","id":"sh/fit0bq94","slide":6,"bbox":[458,182,362,314]}
{"kind":"shape","id":"sh/bi18zyhc","slide":6,"bbox":[458,182,7,314]}
{"kind":"textbox","id":"sh/ahs76tgr","slide":6,"text":"动作","textPreview":"动作","textChars":2,"textLines":1,"bbox":[482,204,316,40]}
{"kind":"textbox","id":"sh/xkjq18zi","slide":6,"text":"· 按半小时预测工作量\n· 调整早晚班起止时间\n· 高峰增加小时工\n· 备餐前移至客流爬升前","textPreview":"· 按半小时预测工作量 | · 调整早晚班起止时间 | · 高峰增加小时工 | · 备餐前移至客流爬升前","textChars":46,"textLines":4,"bbox":[482,256,316,222]}
{"kind":"shape","id":"sh/cjap83yx","slide":6,"bbox":[874,182,364,314]}
{"kind":"shape","id":"sh/z6183iho","slide":6,"bbox":[874,182,7,314]}
{"kind":"textbox","id":"sh/yls7adg3","slide":6,"text":"验证","textPreview":"验证","textChars":2,"textLines":1,"bbox":[898,204,318,40]}
{"kind":"textbox","id":"sh/l83q5sze","slide":6,"text":"同时监控:\n\n· 人工成本\n· 出品时效\n· 顾客满意度\n\n避免单纯压缩人力。","textPreview":"同时监控: | | · 人工成本 | · 出品时效 | · 顾客满意度 | | 避免单纯压缩人力。","textChars":39,"textLines":7,"bbox":[898,256,318,222]}
{"kind":"shape","id":"sh/k7u9cny9","slide":6,"bbox":[42,535,1196,85]}
{"kind":"textbox","id":"sh/fqh8reh4","slide":6,"text":"模拟测算:单店每月节约 1.8 万元;复制到 60 家门店,年度改善空间约 1,296 万元。","textPreview":"模拟测算:单店每月节约 1.8 万元;复制到 60 家门店,年度改善空间约 1,296 万元。","textChars":47,"textLines":1,"bbox":[66,557,1148,42]}
{"kind":"notes","id":"nt/aoi4dv","slide":6,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/wporep","slide":7,"title":"匿名复合案例 · 营销活动 X","textShapes":17}
{"kind":"textbox","id":"sh/3mt432dg","slide":7,"text":"匿名复合案例 · 营销活动 X","textPreview":"匿名复合案例 · 营销活动 X","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/4n2lcne1","slide":7,"text":"订单增长 23%,不代表活动真正成功","textPreview":"订单增长 23%,不代表活动真正成功","textChars":18,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/pobm5sv6","slide":7,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ux036dwj","slide":7,"text":"07","textPreview":"07","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/fy94zid4","slide":7,"bbox":[42,186,350,170]}
{"kind":"textbox","id":"sh/gzil8nep","slide":7,"text":"+23%","textPreview":"+23%","textChars":4,"textLines":1,"bbox":[66,212,302,64]}
{"kind":"textbox","id":"sh/h0rm1sva","slide":7,"text":"订单增长","textPreview":"订单增长","textChars":4,"textLines":1,"bbox":[66,292,302,40]}
{"kind":"shape","id":"sh/6tg32dwn","slide":7,"bbox":[42,378,350,170]}
{"kind":"textbox","id":"sh/7up4vid8","slide":7,"text":"负值","textPreview":"负值","textChars":2,"textLines":1,"bbox":[66,404,302,64]}
{"kind":"textbox","id":"sh/jqxsve1c","slide":7,"text":"穿透成本后的活动贡献利润","textPreview":"穿透成本后的活动贡献利润","textChars":12,"textLines":1,"bbox":[66,484,302,40]}
{"kind":"textbox","id":"sh/ipor29kr","slide":7,"text":"活动为什么亏钱","textPreview":"活动为什么亏钱","textChars":7,"textLines":1,"bbox":[454,186,360,40]}
{"kind":"textbox","id":"sh/5cfaxoj2","slide":7,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[454,258,42,28]}
{"kind":"textbox","id":"sh/kr694j2h","slide":7,"text":"低毛利商品占比上升","textPreview":"低毛利商品占比上升","textChars":9,"textLines":1,"bbox":[510,254,650,40]}
{"kind":"shape","id":"sh/7ehsze18","slide":7,"bbox":[510,300,650,0]}
{"kind":"textbox","id":"sh/6dor69kn","slide":7,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[454,323,42,28]}
{"kind":"textbox","id":"sh/tgza1oje","slide":7,"text":"高价值会员获得无差别优惠","textPreview":"高价值会员获得无差别优惠","textChars":12,"textLines":1,"bbox":[510,319,650,40]}
{"kind":"shape","id":"sh/sfqt8j2t","slide":7,"bbox":[510,365,650,0]}
{"kind":"textbox","id":"sh/nidsnu14","slide":7,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[454,388,42,28]}
{"kind":"textbox","id":"sh/mh4rupkj","slide":7,"text":"促销订单替代了原价订单","textPreview":"促销订单替代了原价订单","textChars":11,"textLines":1,"bbox":[510,384,650,40]}
{"kind":"shape","id":"sh/qdcv2x47","slide":7,"bbox":[510,430,650,0]}
{"kind":"textbox","id":"sh/relcv2lc","slide":7,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[454,453,42,28]}
{"kind":"textbox","id":"sh/cfud47mx","slide":7,"text":"只评价订单和营收,没有评价增量利润","textPreview":"只评价订单和营收,没有评价增量利润","textChars":17,"textLines":1,"bbox":[510,449,650,40]}
{"kind":"shape","id":"sh/dg3uxs3i","slide":7,"bbox":[510,495,650,0]}
{"kind":"shape","id":"sh/29svyd4v","slide":7,"bbox":[454,544,746,67]}
{"kind":"textbox","id":"sh/3a1crilg","slide":7,"text":"用“每投入 1 元营销费用增加多少贡献利润”评价活动。","textPreview":"用“每投入 1 元营销费用增加多少贡献利润”评价活动。","textChars":27,"textLines":1,"bbox":[478,562,700,34]}
{"kind":"notes","id":"nt/wporep","slide":7,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/wgyf4c","slide":8,"title":"匿名复合案例 · 门店 D-006","textShapes":19}
{"kind":"textbox","id":"sh/yh8ru5o3","slide":8,"text":"匿名复合案例 · 门店 D-006","textPreview":"匿名复合案例 · 门店 D-006","textChars":17,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/l4zapknu","slide":8,"text":"关店不应靠感觉,而应比较未来 12 个月的不同情景","textPreview":"关店不应靠感觉,而应比较未来 12 个月的不同情景","textChars":25,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/k3q9wf69","slide":8,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/bexsjq5s","slide":8,"text":"08","textPreview":"08","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/adorq5o7","slide":8,"bbox":[42,180,340,55]}
{"kind":"textbox","id":"sh/xgzal0ni","slide":8,"text":"方案","textPreview":"方案","textChars":2,"textLines":1,"bbox":[60,197,304,26]}
{"kind":"shape","id":"sh/wf69sv6d","slide":8,"bbox":[382,180,378,55]}
{"kind":"textbox","id":"sh/va1svu5w","slide":8,"text":"12 个月模拟结果","textPreview":"12 个月模拟结果","textChars":9,"textLines":1,"bbox":[400,197,342,26]}
{"kind":"shape","id":"sh/u9sb2pob","slide":8,"bbox":[760,180,478,55]}
{"kind":"textbox","id":"sh/g72ls36d","slide":8,"text":"决策建议","textPreview":"决策建议","textChars":4,"textLines":1,"bbox":[778,197,442,26]}
{"kind":"shape","id":"sh/h8b21o7y","slide":8,"bbox":[42,235,340,72]}
{"kind":"textbox","id":"sh/u5k3qto7","slide":8,"text":"继续经营","textPreview":"继续经营","textChars":4,"textLines":1,"bbox":[60,256,304,35]}
{"kind":"shape","id":"sh/v6tkzyps","slide":8,"bbox":[382,235,378,72]}
{"kind":"textbox","id":"sh/832loj61","slide":8,"text":"预计亏损 92 万","textPreview":"预计亏损 92 万","textChars":9,"textLines":1,"bbox":[400,256,342,35]}
{"kind":"shape","id":"sh/t4b2xo7m","slide":8,"bbox":[760,235,478,72]}
{"kind":"textbox","id":"sh/6hk3m9ob","slide":8,"text":"不建议","textPreview":"不建议","textChars":3,"textLines":1,"bbox":[778,256,442,35]}
{"kind":"shape","id":"sh/72tkvepw","slide":8,"bbox":[42,307,340,72]}
{"kind":"textbox","id":"sh/kfilkj65","slide":8,"text":"投入整改","textPreview":"投入整改","textChars":4,"textLines":1,"bbox":[60,328,304,35]}
{"kind":"shape","id":"sh/lgr2t47q","slide":8,"bbox":[382,307,378,72]}
{"kind":"textbox","id":"sh/1wjih0ze","slide":8,"text":"预计亏损降至 35 万","textPreview":"预计亏损降至 35 万","textChars":11,"textLines":1,"bbox":[400,328,342,35]}
{"kind":"shape","id":"sh/0va1ovyt","slide":8,"bbox":[760,307,478,72]}
{"kind":"textbox","id":"sh/za10fqh8","slide":8,"text":"高风险,设止损线","textPreview":"高风险,设止损线","textChars":8,"textLines":1,"bbox":[778,328,442,35]}
{"kind":"shape","id":"sh/e9sjm5g3","slide":8,"bbox":[42,379,340,72]}
{"kind":"textbox","id":"sh/d8jid0zi","slide":8,"text":"缩小面积","textPreview":"缩小面积","textChars":4,"textLines":1,"bbox":[60,400,304,35]}
{"kind":"shape","id":"sh/c7a1kvyx","slide":8,"bbox":[382,379,378,72]}
{"kind":"textbox","id":"sh/r610bqhc","slide":8,"text":"预计接近盈亏平衡","textPreview":"预计接近盈亏平衡","textChars":8,"textLines":1,"bbox":[400,400,342,35]}
{"kind":"shape","id":"sh/q58zilgr","slide":8,"bbox":[760,379,478,72]}
{"kind":"textbox","id":"sh/x43ipkzm","slide":8,"text":"租约可重谈时考虑","textPreview":"租约可重谈时考虑","textChars":8,"textLines":1,"bbox":[778,400,442,35]}
{"kind":"shape","id":"sh/w3u1wfy1","slide":8,"bbox":[42,451,340,72]}
{"kind":"textbox","id":"sh/u9ofqhwj","slide":8,"text":"关停并迁移会员","textPreview":"关停并迁移会员","textChars":7,"textLines":1,"bbox":[60,472,304,35]}
{"kind":"shape","id":"sh/faxgjmx4","slide":8,"bbox":[382,451,378,72]}
{"kind":"textbox","id":"sh/gb6xsrep","slide":8,"text":"预计减少亏损 76 万","textPreview":"预计减少亏损 76 万","textChars":11,"textLines":1,"bbox":[400,472,342,35]}
{"kind":"shape","id":"sh/hcfylwfa","slide":8,"bbox":[760,451,478,72]}
{"kind":"textbox","id":"sh/654fmhwn","slide":8,"text":"优先建议","textPreview":"优先建议","textChars":4,"textLines":1,"bbox":[778,472,442,35]}
{"kind":"textbox","id":"sh/76dgf2x8","slide":8,"text":"AI 不替老板关店;它让经验判断具有数据依据、情景测算和退出预案。","textPreview":"AI 不替老板关店;它让经验判断具有数据依据、情景测算和退出预案。","textChars":33,"textLines":1,"bbox":[42,565,1160,44]}
{"kind":"notes","id":"nt/wgyf4c","slide":8,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/5hkg8c","slide":9,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/sbi9o3ap","slide":9,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/ra9sfy9k","slide":9,"text":"老板、总部、区域、店长,共用一个经营闭环","textPreview":"老板、总部、区域、店长,共用一个经营闭环","textChars":20,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/q90rmtsz","slide":9,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/58radore","slide":9,"text":"09","textPreview":"09","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/47i9kjat","slide":9,"bbox":[42,190,265,316]}
{"kind":"textbox","id":"sh/369sbe98","slide":9,"text":"老板","textPreview":"老板","textChars":2,"textLines":1,"bbox":[64,214,220,46]}
{"kind":"textbox","id":"sh/i50ritsn","slide":9,"text":"看结果","textPreview":"看结果","textChars":3,"textLines":1,"bbox":[64,296,220,44]}
{"kind":"textbox","id":"sh/p4vapsri","slide":9,"text":"利润·风险·资源投向","textPreview":"利润·风险·资源投向","textChars":10,"textLines":1,"bbox":[64,386,220,72]}
{"kind":"textbox","id":"sh/o329wnqx","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[310,323,30,36]}
{"kind":"shape","id":"sh/a5obe18f","slide":9,"bbox":[341,190,265,316]}
{"kind":"textbox","id":"sh/b6xc76p0","slide":9,"text":"总部","textPreview":"总部","textChars":2,"textLines":1,"bbox":[363,214,220,46]}
{"kind":"textbox","id":"sh/c76tgrq5","slide":9,"text":"找原因","textPreview":"找原因","textChars":3,"textLines":1,"bbox":[363,296,220,44]}
{"kind":"textbox","id":"sh/x8fu9w7q","slide":9,"text":"跨区域对标·政策评估","textPreview":"跨区域对标·政策评估","textChars":10,"textLines":1,"bbox":[363,386,220,72]}
{"kind":"textbox","id":"sh/2h4bah83","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[609,323,30,36]}
{"kind":"shape","id":"sh/n2dc3mpo","slide":9,"bbox":[640,190,265,316]}
{"kind":"textbox","id":"sh/o36tcrq9","slide":9,"text":"区域","textPreview":"区域","textChars":2,"textLines":1,"bbox":[662,214,220,46]}
{"kind":"textbox","id":"sh/p4fu5w7u","slide":9,"text":"推整改","textPreview":"推整改","textChars":3,"textLines":1,"bbox":[662,296,220,44]}
{"kind":"textbox","id":"sh/6d8vmlon","slide":9,"text":"门店分级·任务·验收","textPreview":"门店分级·任务·验收","textChars":10,"textLines":1,"bbox":[662,386,220,72]}
{"kind":"textbox","id":"sh/7yhcfqps","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[908,323,30,36]}
{"kind":"shape","id":"sh/3i987i5k","slide":9,"bbox":[939,190,265,316]}
{"kind":"textbox","id":"sh/ih0rydoz","slide":9,"text":"店长","textPreview":"店长","textChars":2,"textLines":1,"bbox":[961,214,220,46]}
{"kind":"textbox","id":"sh/5kbq98na","slide":9,"text":"做动作","textPreview":"做动作","textChars":3,"textLines":1,"bbox":[961,296,220,44]}
{"kind":"textbox","id":"sh/4ji90n6p","slide":9,"text":"日目标·偏差·行动建议","textPreview":"日目标·偏差·行动建议","textChars":11,"textLines":1,"bbox":[961,386,220,72]}
{"kind":"shape","id":"sh/rmtsbi5g","slide":9,"bbox":[42,550,1196,60]}
{"kind":"textbox","id":"sh/qlkr2dov","slide":9,"text":"结果回到经营大盘:执行不是终点,改善结果才是。","textPreview":"结果回到经营大盘:执行不是终点,改善结果才是。","textChars":23,"textLines":1,"bbox":[66,567,1148,30]}
{"kind":"notes","id":"nt/5hkg8c","slide":9,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/hiuvy9","slide":10,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":7}
{"kind":"textbox","id":"sh/szm10761","slide":10,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/rydkr25g","slide":10,"text":"AI 负责发现、测算和跟踪,重要决策仍由管理者审批","textPreview":"AI 负责发现、测算和跟踪,重要决策仍由管理者审批","textChars":25,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/qx4jyxov","slide":10,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/5wb2psna","slide":10,"text":"10","textPreview":"10","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/4v21wn6p","slide":10,"bbox":[42,182,560,366]}
{"kind":"shape","id":"sh/3utkn254","slide":10,"bbox":[42,182,7,366]}
{"kind":"textbox","id":"sh/i9kjuxoj","slide":10,"text":"AI 可以承担","textPreview":"AI 可以承担","textChars":7,"textLines":1,"bbox":[66,204,514,40]}
{"kind":"textbox","id":"sh/h8b2lsne","slide":10,"text":"· 理解并关联跨系统数据\n· 持续扫描异常\n· 穿透至门店、SKU、班次和订单\n· 调用行业规则与历史案例\n· 推演方案对利润和现金流的影响\n· 跟踪执行并验证结果","textPreview":"· 理解并关联跨系统数据 | · 持续扫描异常 | · 穿透至门店、SKU、班次和订单 | · 调用行业规则与历史案例 | · 推演方案对利润和现金流的影响 | · 跟踪执行并验证结果","textChars":82,"textLines":6,"bbox":[66,256,514,274]}
{"kind":"shape","id":"sh/g721sn6t","slide":10,"bbox":[678,182,560,366]}
{"kind":"shape","id":"sh/6lo3a9gj","slide":10,"bbox":[678,182,7,366]}
{"kind":"textbox","id":"sh/rmx4jex4","slide":10,"text":"必须由管理者决定","textPreview":"必须由管理者决定","textChars":8,"textLines":1,"bbox":[702,204,514,40]}
{"kind":"textbox","id":"sh/sn6lcjyp","slide":10,"text":"· 价格调整\n· 人员处置\n· 供应商更换\n· 门店迁址与关停\n· 重大资源投入\n\n所有高影响决策都应留下依据、审批与执行记录。","textPreview":"· 价格调整 | · 人员处置 | · 供应商更换 | · 门店迁址与关停 | · 重大资源投入 | | 所有高影响决策都应留下依据、审批与执行记录。","textChars":64,"textLines":7,"bbox":[702,256,514,274]}
{"kind":"notes","id":"nt/hiuvy9","slide":10,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/n35yhd","slide":11,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":24}
{"kind":"textbox","id":"sh/9s3y5cji","slide":11,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/mpsfahkr","slide":11,"text":"BI 展示“发生了什么”;玄谋智脑推动“接下来怎么做”","textPreview":"BI 展示“发生了什么”;玄谋智脑推动“接下来怎么做”","textChars":27,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/nq1g321c","slide":11,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/wfuhgri9","slide":11,"text":"11","textPreview":"11","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/xg3y9wje","slide":11,"bbox":[42,170,228,50]}
{"kind":"textbox","id":"sh/adczeh03","slide":11,"text":"维度","textPreview":"维度","textChars":2,"textLines":1,"bbox":[58,185,196,25]}
{"kind":"shape","id":"sh/belg7m1o","slide":11,"bbox":[270,170,410,50]}
{"kind":"textbox","id":"sh/cjax4n2p","slide":11,"text":"普通 BI","textPreview":"普通 BI","textChars":5,"textLines":1,"bbox":[286,185,378,25]}
{"kind":"shape","id":"sh/dkjydsja","slide":11,"bbox":[680,170,558,50]}
{"kind":"textbox","id":"sh/9ozytoru","slide":11,"text":"玄谋智脑","textPreview":"玄谋智脑","textChars":4,"textLines":1,"bbox":[696,185,526,25]}
{"kind":"shape","id":"sh/8nqx0jap","slide":11,"bbox":[42,220,228,67]}
{"kind":"textbox","id":"sh/7mxgret4","slide":11,"text":"定位","textPreview":"定位","textChars":2,"textLines":1,"bbox":[58,238,196,38]}
{"kind":"shape","id":"sh/mlofytsj","slide":11,"bbox":[270,220,410,67]}
{"kind":"textbox","id":"sh/hszyx8r6","slide":11,"text":"展示报表","textPreview":"展示报表","textChars":4,"textLines":1,"bbox":[286,238,378,38]}
{"kind":"shape","id":"sh/wrqh43al","slide":11,"bbox":[680,220,558,67]}
{"kind":"textbox","id":"sh/vqhgvy90","slide":11,"text":"驱动经营决策与改善","textPreview":"驱动经营决策与改善","textChars":9,"textLines":1,"bbox":[696,238,526,38]}
{"kind":"shape","id":"sh/up8f2tsf","slide":11,"bbox":[42,287,228,67]}
{"kind":"textbox","id":"sh/5gjy18r2","slide":11,"text":"业务语义","textPreview":"业务语义","textChars":4,"textLines":1,"bbox":[58,305,196,38]}
{"kind":"shape","id":"sh/4fah83ah","slide":11,"bbox":[270,287,410,67]}
{"kind":"textbox","id":"sh/obi9kbm5","slide":11,"text":"字段和指标","textPreview":"字段和指标","textChars":5,"textLines":1,"bbox":[286,305,378,38]}
{"kind":"shape","id":"sh/pwbatg3q","slide":11,"bbox":[680,287,558,67]}
{"kind":"textbox","id":"sh/290ri14z","slide":11,"text":"门店、商品、人员、会员等行业本体","textPreview":"门店、商品、人员、会员等行业本体","textChars":16,"textLines":1,"bbox":[696,305,526,38]}
{"kind":"shape","id":"sh/3a9sr6lk","slide":11,"bbox":[42,354,228,67]}
{"kind":"textbox","id":"sh/cz29ovm1","slide":11,"text":"问题发现","textPreview":"问题发现","textChars":4,"textLines":1,"bbox":[58,372,196,38]}
{"kind":"shape","id":"sh/d0baxg3m","slide":11,"bbox":[270,354,410,67]}
{"kind":"textbox","id":"sh/qxkrml4b","slide":11,"text":"人主动看数据","textPreview":"人主动看数据","textChars":6,"textLines":1,"bbox":[286,372,378,38]}
{"kind":"shape","id":"sh/bytsvqlg","slide":11,"bbox":[680,354,558,67]}
{"kind":"textbox","id":"sh/s3y9crmx","slide":11,"text":"系统持续发现、分级与推送","textPreview":"系统持续发现、分级与推送","textChars":12,"textLines":1,"bbox":[696,372,526,38]}
{"kind":"shape","id":"sh/t4rqlw3i","slide":11,"bbox":[42,421,228,67]}
{"kind":"textbox","id":"sh/vyxcru50","slide":11,"text":"问题处理","textPreview":"问题处理","textChars":4,"textLines":1,"bbox":[58,439,196,38]}
{"kind":"shape","id":"sh/uxovipof","slide":11,"bbox":[270,421,410,67]}
{"kind":"textbox","id":"sh/h0fut4n6","slide":11,"text":"报告异常","textPreview":"报告异常","textChars":4,"textLines":1,"bbox":[286,439,378,38]}
{"kind":"shape","id":"sh/wz6dkz6l","slide":11,"bbox":[680,421,558,67]}
{"kind":"textbox","id":"sh/nudcnu5o","slide":11,"text":"归因、测算、方案和整改任务","textPreview":"归因、测算、方案和整改任务","textChars":13,"textLines":1,"bbox":[696,439,526,38]}
{"kind":"shape","id":"sh/mt4bepoj","slide":11,"bbox":[42,488,228,67]}
{"kind":"textbox","id":"sh/9wfupknu","slide":11,"text":"结果验证","textPreview":"结果验证","textChars":4,"textLines":1,"bbox":[58,506,196,38]}
{"kind":"shape","id":"sh/8v6tgz69","slide":11,"bbox":[270,488,410,67]}
{"kind":"textbox","id":"sh/zqdcja5s","slide":11,"text":"通常不跟踪","textPreview":"通常不跟踪","textChars":5,"textLines":1,"bbox":[286,506,378,38]}
{"kind":"shape","id":"sh/y54ba5o7","slide":11,"bbox":[680,488,558,67]}
{"kind":"textbox","id":"sh/edofudkr","slide":11,"text":"验证改善并更新最佳实践","textPreview":"验证改善并更新最佳实践","textChars":11,"textLines":1,"bbox":[696,506,526,38]}
{"kind":"shape","id":"sh/fexgni1c","slide":11,"bbox":[42,555,228,67]}
{"kind":"textbox","id":"sh/0z6xwn2x","slide":11,"text":"长期价值","textPreview":"长期价值","textChars":4,"textLines":1,"bbox":[58,573,196,38]}
{"kind":"shape","id":"sh/10fyp8ji","slide":11,"bbox":[270,555,410,67]}
{"kind":"textbox","id":"sh/q94fqtkv","slide":11,"text":"报表越来越多","textPreview":"报表越来越多","textChars":6,"textLines":1,"bbox":[286,573,378,38]}
{"kind":"shape","id":"sh/raxgjy1g","slide":11,"bbox":[680,555,558,67]}
{"kind":"textbox","id":"sh/sb6xs321","slide":11,"text":"行业模型与企业知识越用越成熟","textPreview":"行业模型与企业知识越用越成熟","textChars":14,"textLines":1,"bbox":[696,573,526,38]}
{"kind":"notes","id":"nt/n35yhd","slide":11,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/vp4c3s","slide":12,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":23}
{"kind":"textbox","id":"sh/903i9036","slide":12,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/mxczy54f","slide":12,"text":"五层能力不是技术清单,而是规模扩张的管理底座","textPreview":"五层能力不是技术清单,而是规模扩张的管理底座","textChars":22,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/7yl07al0","slide":12,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/w3uh4f2h","slide":12,"text":"12","textPreview":"12","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/h4nidk32","slide":12,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,185,54,28]}
{"kind":"textbox","id":"sh/u1cz25kr","slide":12,"text":"数据资产化","textPreview":"数据资产化","textChars":5,"textLines":1,"bbox":[118,171,250,54]}
{"kind":"textbox","id":"sh/v2l0balc","slide":12,"text":"数据通起来","textPreview":"数据通起来","textChars":5,"textLines":1,"bbox":[422,171,250,54]}
{"kind":"textbox","id":"sh/47e18f2t","slide":12,"text":"一个数字、一个来源","textPreview":"一个数字、一个来源","textChars":9,"textLines":1,"bbox":[720,171,450,54]}
{"kind":"shape","id":"sh/5snihk3e","slide":12,"bbox":[118,238,1050,0]}
{"kind":"textbox","id":"sh/xkrudwna","slide":12,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[42,274,54,28]}
{"kind":"textbox","id":"sh/cjyd4r6p","slide":12,"text":"运营指标化","textPreview":"运营指标化","textChars":5,"textLines":1,"bbox":[118,260,250,54]}
{"kind":"textbox","id":"sh/bipcbm54","slide":12,"text":"问题浮出来","textPreview":"问题浮出来","textChars":5,"textLines":1,"bbox":[422,260,250,54]}
{"kind":"textbox","id":"sh/ahgv2hoj","slide":12,"text":"异常能穿透到根因","textPreview":"异常能穿透到根因","textChars":8,"textLines":1,"bbox":[720,260,450,54]}
{"kind":"shape","id":"sh/loruhwn6","slide":12,"bbox":[118,327,1050,0]}
{"kind":"textbox","id":"sh/knid8r61","slide":12,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[42,363,54,28]}
{"kind":"textbox","id":"sh/zm9cfm5g","slide":12,"text":"战略穿透化","textPreview":"战略穿透化","textChars":5,"textLines":1,"bbox":[118,349,250,54]}
{"kind":"textbox","id":"sh/yl0v61ov","slide":12,"text":"目标落下去","textPreview":"目标落下去","textChars":5,"textLines":1,"bbox":[422,349,250,54]}
{"kind":"textbox","id":"sh/1s7u5c72","slide":12,"text":"战略到区域、门店和个人","textPreview":"战略到区域、门店和个人","textChars":11,"textLines":1,"bbox":[720,349,450,54]}
{"kind":"shape","id":"sh/0retw76h","slide":12,"bbox":[118,416,1050,0]}
{"kind":"textbox","id":"sh/sbidc7ed","slide":12,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[42,452,54,28]}
{"kind":"textbox","id":"sh/twrulcfy","slide":12,"text":"态势感知化","textPreview":"态势感知化","textChars":5,"textLines":1,"bbox":[118,438,250,54]}
{"kind":"textbox","id":"sh/690vaxw7","slide":12,"text":"风险早知道","textPreview":"风险早知道","textChars":5,"textLines":1,"bbox":[422,438,250,54]}
{"kind":"textbox","id":"sh/ra9cj2xs","slide":12,"text":"从事后救火到事前预防","textPreview":"从事后救火到事前预防","textChars":10,"textLines":1,"bbox":[720,438,450,54]}
{"kind":"shape","id":"sh/gz2dgrep","slide":12,"bbox":[118,505,1050,0]}
{"kind":"textbox","id":"sh/10bupcfu","slide":12,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[42,541,54,28]}
{"kind":"textbox","id":"sh/exkvehwj","slide":12,"text":"知识沉淀化","textPreview":"知识沉淀化","textChars":5,"textLines":1,"bbox":[118,527,250,54]}
{"kind":"textbox","id":"sh/fytcnmx4","slide":12,"text":"组织越来越聪明","textPreview":"组织越来越聪明","textChars":7,"textLines":1,"bbox":[422,527,250,54]}
{"kind":"textbox","id":"sh/o32dkrel","slide":12,"text":"优秀能力不再依赖少数人","textPreview":"优秀能力不再依赖少数人","textChars":11,"textLines":1,"bbox":[720,527,450,54]}
{"kind":"shape","id":"sh/p4betwv6","slide":12,"bbox":[118,594,1050,0]}
{"kind":"notes","id":"nt/vp4c3s","slide":12,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/59faoc","slide":13,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/pk76lo7m","slide":13,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/2hwnq98v","slide":13,"text":"企业越大,单店验证后的复制价值越高","textPreview":"企业越大,单店验证后的复制价值越高","textChars":17,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/3i5ojepg","slide":13,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/gfe5ozqp","slide":13,"text":"13","textPreview":"13","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/hgn6h47a","slide":13,"bbox":[42,182,360,250]}
{"kind":"shape","id":"sh/udwnmp8j","slide":13,"bbox":[42,182,7,250]}
{"kind":"textbox","id":"sh/fe54fup4","slide":13,"text":"不依赖能人","textPreview":"不依赖能人","textChars":5,"textLines":1,"bbox":[66,204,314,40]}
{"kind":"textbox","id":"sh/8ru5kzqt","slide":13,"text":"优秀店长的做法沉淀为规则、案例和 SOP。","textPreview":"优秀店长的做法沉淀为规则、案例和 SOP。","textChars":21,"textLines":1,"bbox":[66,256,314,158]}
{"kind":"shape","id":"sh/tc3md47e","slide":13,"bbox":[443,182,360,250]}
{"kind":"shape","id":"sh/lo7ipgzu","slide":13,"bbox":[443,182,7,250]}
{"kind":"textbox","id":"sh/knyhwbi9","slide":13,"text":"扩张不失控","textPreview":"扩张不失控","textChars":5,"textLines":1,"bbox":[467,204,314,40]}
{"kind":"textbox","id":"sh/jmp0n6ho","slide":13,"text":"验证有效的改善方案,可按门店特征分类复制。","textPreview":"验证有效的改善方案,可按门店特征分类复制。","textChars":21,"textLines":1,"bbox":[467,256,314,158]}
{"kind":"shape","id":"sh/y1gzu103","slide":13,"bbox":[844,182,360,250]}
{"kind":"shape","id":"sh/x0nilwjy","slide":13,"bbox":[844,182,7,250]}
{"kind":"textbox","id":"sh/wzehsrid","slide":13,"text":"能力持续复利","textPreview":"能力持续复利","textChars":6,"textLines":1,"bbox":[868,204,314,40]}
{"kind":"textbox","id":"sh/by50j61s","slide":13,"text":"场景、模型、AI 建议与决策反馈相互增强。","textPreview":"场景、模型、AI 建议与决策反馈相互增强。","textChars":21,"textLines":1,"bbox":[868,256,314,158]}
{"kind":"shape","id":"sh/axwzq107","slide":13,"bbox":[120,520,980,0]}
{"kind":"shape","id":"sh/9wnihwjm","slide":13,"bbox":[104,502,38,38]}
{"kind":"textbox","id":"sh/ovehori1","slide":13,"text":"30 家","textPreview":"30 家","textChars":4,"textLines":1,"bbox":[94,555,150,28]}
{"kind":"textbox","id":"sh/0ri9kvu9","slide":13,"text":"靠人盯","textPreview":"靠人盯","textChars":3,"textLines":1,"bbox":[94,589,170,24]}
{"kind":"shape","id":"sh/1sbatgvu","slide":13,"bbox":[584,502,38,38]}
{"kind":"textbox","id":"sh/ep0rilc3","slide":13,"text":"100 家","textPreview":"100 家","textChars":5,"textLines":1,"bbox":[574,555,150,28]}
{"kind":"textbox","id":"sh/zq9srqdo","slide":13,"text":"靠机制","textPreview":"靠机制","textChars":3,"textLines":1,"bbox":[574,589,170,24]}
{"kind":"shape","id":"sh/cni9gbux","slide":13,"bbox":[1064,502,38,38]}
{"kind":"textbox","id":"sh/dorqpgvi","slide":13,"text":"300 家","textPreview":"300 家","textChars":5,"textLines":1,"bbox":[1054,555,150,28]}
{"kind":"textbox","id":"sh/ql0ru1c7","slide":13,"text":"靠模型复制","textPreview":"靠模型复制","textChars":5,"textLines":1,"bbox":[1054,589,170,24]}
{"kind":"notes","id":"nt/59faoc","slide":13,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/vmna02","slide":14,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":8}
{"kind":"textbox","id":"sh/43e1k7q5","slide":14,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/3250r29k","slide":14,"text":"沉淀的不只是原始数据,而是可追溯的经营能力","textPreview":"沉淀的不只是原始数据,而是可追溯的经营能力","textChars":21,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/21wjix8z","slide":14,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/d8nixcrm","slide":14,"text":"14","textPreview":"14","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/c7e1o7q1","slide":14,"bbox":[42,180,560,365]}
{"kind":"shape","id":"sh/r650v29g","slide":14,"bbox":[42,180,7,365]}
{"kind":"textbox","id":"sh/q5wjmh8b","slide":14,"text":"企业数据资产","textPreview":"企业数据资产","textChars":6,"textLines":1,"bbox":[66,202,514,40]}
{"kind":"textbox","id":"sh/tc3ilsri","slide":14,"text":"· 统一指标口径与责任关系\n· 门店、商品、人员、会员、供应商本体\n· 行业规则与异常模式\n· 决策、执行与验证结果\n· 最佳实践与风险知识","textPreview":"· 统一指标口径与责任关系 | · 门店、商品、人员、会员、供应商本体 | · 行业规则与异常模式 | · 决策、执行与验证结果 | · 最佳实践与风险知识","textChars":70,"textLines":5,"bbox":[66,254,514,273]}
{"kind":"shape","id":"sh/sbuhcnqx","slide":14,"bbox":[678,180,560,365]}
{"kind":"shape","id":"sh/qxsvudsv","slide":14,"bbox":[678,180,7,365]}
{"kind":"textbox","id":"sh/ry1wni9g","slide":14,"text":"融资与尽调支持","textPreview":"融资与尽调支持","textChars":7,"textLines":1,"bbox":[702,202,514,40]}
{"kind":"textbox","id":"sh/sjadwnal","slide":14,"text":"· 门店级损益与现金流\n· 收入稳定性分析\n· 风险预警与整改记录\n· 未来经营预测\n· 更完整、可追溯的经营证明","textPreview":"· 门店级损益与现金流 | · 收入稳定性分析 | · 风险预警与整改记录 | · 未来经营预测 | · 更完整、可追溯的经营证明","textChars":57,"textLines":5,"bbox":[702,254,514,273]}
{"kind":"textbox","id":"sh/dkjepsr6","slide":14,"text":"边界:提供数据与分析支持,不承诺银行授信或融资结果。","textPreview":"边界:提供数据与分析支持,不承诺银行授信或融资结果。","textChars":26,"textLines":1,"bbox":[42,578,1000,34]}
{"kind":"notes","id":"nt/vmna02","slide":14,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/ncze5u","slide":15,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/mhofitwv","slide":15,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/9kfyt8vm","slide":15,"text":"生产数据保密,从架构、权限到 AI 边界同时控制","textPreview":"生产数据保密,从架构、权限到 AI 边界同时控制","textChars":24,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/oj6xk3e1","slide":15,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/bmhgvyds","slide":15,"text":"15","textPreview":"15","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/al8fmdw7","slide":15,"bbox":[42,180,360,170]}
{"kind":"shape","id":"sh/x8zyx8vi","slide":15,"bbox":[42,180,7,170]}
{"kind":"textbox","id":"sh/wnqxo3ex","slide":15,"text":"部署边界","textPreview":"部署边界","textChars":4,"textLines":1,"bbox":[66,202,314,40]}
{"kind":"textbox","id":"sh/rqdgjed8","slide":15,"text":"不替代现有交易系统,只读或受控对接。","textPreview":"不替代现有交易系统,只读或受控对接。","textChars":18,"textLines":1,"bbox":[66,254,314,78]}
{"kind":"shape","id":"sh/qp4fa9wn","slide":15,"bbox":[443,180,360,170]}
{"kind":"shape","id":"sh/4bu5kji5","slide":15,"bbox":[443,180,7,170]}
{"kind":"textbox","id":"sh/5c36tozq","slide":15,"text":"最小权限","textPreview":"最小权限","textChars":4,"textLines":1,"bbox":[467,202,314,40]}
{"kind":"textbox","id":"sh/i9sni90z","slide":15,"text":"老板、总部、区域、门店按职责查看。","textPreview":"老板、总部、区域、门店按职责查看。","textChars":17,"textLines":1,"bbox":[467,254,314,78]}
{"kind":"shape","id":"sh/3a1orehk","slide":15,"bbox":[844,180,360,170]}
{"kind":"shape","id":"sh/sfu5oji1","slide":15,"bbox":[844,180,7,170]}
{"kind":"textbox","id":"sh/d036xozm","slide":15,"text":"敏感保护","textPreview":"敏感保护","textChars":4,"textLines":1,"bbox":[868,202,314,40]}
{"kind":"textbox","id":"sh/qdcnmt0b","slide":15,"text":"会员、薪酬、财务明细分级、脱敏与审计。","textPreview":"会员、薪酬、财务明细分级、脱敏与审计。","textChars":19,"textLines":1,"bbox":[868,254,314,78]}
{"kind":"shape","id":"sh/relovehg","slide":15,"bbox":[42,390,360,170]}
{"kind":"shape","id":"sh/8ja5czix","slide":15,"bbox":[42,390,7,170]}
{"kind":"textbox","id":"sh/t4j6l4zi","slide":15,"text":"AI 可追溯","textPreview":"AI 可追溯","textChars":6,"textLines":1,"bbox":[66,412,314,40]}
{"kind":"textbox","id":"sh/90bmpgr6","slide":15,"text":"重要结论显示依据、时间、路径和适用边界。","textPreview":"重要结论显示依据、时间、路径和适用边界。","textChars":20,"textLines":1,"bbox":[66,464,314,78]}
{"kind":"shape","id":"sh/oz2lgval","slide":15,"bbox":[443,390,360,170]}
{"kind":"shape","id":"sh/ny94nq90","slide":15,"bbox":[443,390,7,170]}
{"kind":"textbox","id":"sh/mx03elsv","slide":15,"text":"人工审批","textPreview":"人工审批","textChars":4,"textLines":1,"bbox":[467,412,314,40]}
{"kind":"textbox","id":"sh/x4bmt0ri","slide":15,"text":"高影响决策必须经有权限的管理者审批。","textPreview":"高影响决策必须经有权限的管理者审批。","textChars":18,"textLines":1,"bbox":[467,464,314,78]}
{"kind":"shape","id":"sh/w32lkvax","slide":15,"bbox":[844,390,360,170]}
{"kind":"shape","id":"sh/b2t4rq9c","slide":15,"bbox":[844,390,7,170]}
{"kind":"textbox","id":"sh/a1k3ilsr","slide":15,"text":"全程留痕","textPreview":"全程留痕","textChars":4,"textLines":1,"bbox":[868,412,314,40]}
{"kind":"textbox","id":"sh/58vmx0re","slide":15,"text":"访问、建议、修改、审批和执行结果均可审计。","textPreview":"访问、建议、修改、审批和执行结果均可审计。","textChars":21,"textLines":1,"bbox":[868,464,314,78]}
{"kind":"notes","id":"nt/ncze5u","slide":15,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/8zd6ih","slide":16,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/h4fe5cf2","slide":16,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/u1ovaxgr","slide":16,"text":"先用 8 周证明经营价值,再扩大应用范围","textPreview":"先用 8 周证明经营价值,再扩大应用范围","textChars":20,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/v2xw32xc","slide":16,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/8zmd8nyl","slide":16,"text":"16","textPreview":"16","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/90ve1sf6","slide":16,"bbox":[66,340,1100,0]}
{"kind":"shape","id":"sh/mx4v6dgf","slide":16,"bbox":[54,322,38,38]}
{"kind":"textbox","id":"sh/7ydwzix0","slide":16,"text":"第 1 周","textPreview":"第 1 周","textChars":5,"textLines":1,"bbox":[49,206,200,28]}
{"kind":"textbox","id":"sh/kbmd4nyp","slide":16,"text":"选定利润专项","textPreview":"选定利润专项","textChars":6,"textLines":1,"bbox":[49,250,205,55]}
{"kind":"textbox","id":"sh/lwvexsfa","slide":16,"text":"基线·口径·责任人","textPreview":"基线·口径·责任人","textChars":9,"textLines":1,"bbox":[49,394,205,84]}
{"kind":"shape","id":"sh/9onyp0ja","slide":16,"bbox":[293,322,38,38]}
{"kind":"textbox","id":"sh/onehwvip","slide":16,"text":"第 1—2 周","textPreview":"第 1—2 周","textChars":7,"textLines":1,"bbox":[288,206,200,28]}
{"kind":"textbox","id":"sh/nm5gnq14","slide":16,"text":"连接现有数据","textPreview":"连接现有数据","textChars":6,"textLines":1,"bbox":[288,250,205,55]}
{"kind":"textbox","id":"sh/mlczul0j","slide":16,"text":"数据清单·质量·统一口径","textPreview":"数据清单·质量·统一口径","textChars":12,"textLines":1,"bbox":[288,394,205,84]}
{"kind":"shape","id":"sh/1k3y1gjy","slide":16,"bbox":[532,322,38,38]}
{"kind":"textbox","id":"sh/0juhsvid","slide":16,"text":"第 3—4 周","textPreview":"第 3—4 周","textChars":7,"textLines":1,"bbox":[527,206,200,28]}
{"kind":"textbox","id":"sh/zilgzq18","slide":16,"text":"发现机会与根因","textPreview":"发现机会与根因","textChars":7,"textLines":1,"bbox":[527,250,205,55]}
{"kind":"textbox","id":"sh/ehczql0n","slide":16,"text":"异常·影响金额·证据","textPreview":"异常·影响金额·证据","textChars":10,"textLines":1,"bbox":[527,394,205,84]}
{"kind":"shape","id":"sh/dw3yxgj2","slide":16,"bbox":[771,322,38,38]}
{"kind":"textbox","id":"sh/cvuhobih","slide":16,"text":"第 5—6 周","textPreview":"第 5—6 周","textChars":7,"textLines":1,"bbox":[766,206,200,28]}
{"kind":"textbox","id":"sh/4zeh4bqd","slide":16,"text":"推动整改","textPreview":"推动整改","textChars":4,"textLines":1,"bbox":[766,250,205,55]}
{"kind":"textbox","id":"sh/507ydgry","slide":16,"text":"任务·期限·执行记录","textPreview":"任务·期限·执行记录","textChars":10,"textLines":1,"bbox":[766,394,205,84]}
{"kind":"shape","id":"sh/ixwz2187","slide":16,"bbox":[1010,322,38,38]}
{"kind":"textbox","id":"sh/3y5gb69s","slide":16,"text":"第 7—8 周","textPreview":"第 7—8 周","textChars":7,"textLines":1,"bbox":[1005,206,200,28]}
{"kind":"textbox","id":"sh/wbeh0bq1","slide":16,"text":"验证并复制","textPreview":"验证并复制","textChars":5,"textLines":1,"bbox":[1005,250,205,55]}
{"kind":"textbox","id":"sh/hcny9grm","slide":16,"text":"改善金额·验收·最佳实践","textPreview":"改善金额·验收·最佳实践","textChars":12,"textLines":1,"bbox":[1005,394,205,84]}
{"kind":"shape","id":"sh/u9wzy18b","slide":16,"bbox":[42,550,1196,60]}
{"kind":"textbox","id":"sh/va5g769w","slide":16,"text":"优先选择:数据可获得 · 影响可测算 · 动作可执行 · 八周可验证。","textPreview":"优先选择:数据可获得 · 影响可测算 · 动作可执行 · 八周可验证。","textChars":35,"textLines":1,"bbox":[66,567,1148,30]}
{"kind":"notes","id":"nt/8zd6ih","slide":16,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/1tvdog","slide":17,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/5cvqdkfa","slide":17,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/i9k725wj","slide":17,"text":"验收不看上线了多少功能,而看经营结果是否改善","textPreview":"验收不看上线了多少功能,而看经营结果是否改善","textChars":22,"textLines":1,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/jad8bax4","slide":17,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/szm98fel","slide":17,"text":"17","textPreview":"17","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/t0vqhkf6","slide":17,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,188,50,26]}
{"kind":"textbox","id":"sh/6d4r6pwv","slide":17,"text":"经营结果","textPreview":"经营结果","textChars":4,"textLines":1,"bbox":[112,174,230,48]}
{"kind":"textbox","id":"sh/red8fax0","slide":17,"text":"贡献利润·成本·损耗·库存资金","textPreview":"贡献利润·成本·损耗·库存资金","textChars":15,"textLines":1,"bbox":[395,174,760,48]}
{"kind":"shape","id":"sh/g369czex","slide":17,"bbox":[112,239,1040,0]}
{"kind":"textbox","id":"sh/14fql4fi","slide":17,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[42,274,50,26]}
{"kind":"textbox","id":"sh/twvqhgrq","slide":17,"text":"问题发现","textPreview":"问题发现","textChars":4,"textLines":1,"bbox":[112,260,230,48]}
{"kind":"textbox","id":"sh/8vmpobql","slide":17,"text":"发现周期·有效异常率·影响覆盖","textPreview":"发现周期·有效异常率·影响覆盖","textChars":15,"textLines":1,"bbox":[395,260,760,48]}
{"kind":"shape","id":"sh/7ud8f690","slide":17,"bbox":[112,325,1040,0]}
{"kind":"textbox","id":"sh/6tk7ml8f","slide":17,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[42,360,50,26]}
{"kind":"textbox","id":"sh/hkvql0r2","slide":17,"text":"执行闭环","textPreview":"执行闭环","textChars":4,"textLines":1,"bbox":[112,346,230,48]}
{"kind":"textbox","id":"sh/gjmpsvqh","slide":17,"text":"接收率·按期完成率·整改有效率","textPreview":"接收率·按期完成率·整改有效率","textChars":15,"textLines":1,"bbox":[395,346,760,48]}
{"kind":"shape","id":"sh/vid8jq9w","slide":17,"bbox":[112,411,1040,0]}
{"kind":"textbox","id":"sh/ux47ql8b","slide":17,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[42,446,50,26]}
{"kind":"textbox","id":"sh/xobq9wry","slide":17,"text":"组织复制","textPreview":"组织复制","textChars":4,"textLines":1,"bbox":[112,432,230,48]}
{"kind":"textbox","id":"sh/cn2pgrqd","slide":17,"text":"复制门店数·成功率·新店导入时间","textPreview":"复制门店数·成功率·新店导入时间","textChars":16,"textLines":1,"bbox":[395,432,760,48]}
{"kind":"shape","id":"sh/oj6hcv25","slide":17,"bbox":[112,497,1040,0]}
{"kind":"textbox","id":"sh/9kfyl03q","slide":17,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[42,532,50,26]}
{"kind":"textbox","id":"sh/2hozalkf","slide":17,"text":"数据质量","textPreview":"数据质量","textChars":4,"textLines":1,"bbox":[112,518,230,48]}
{"kind":"textbox","id":"sh/nixgjqlk","slide":17,"text":"口径一致·完整·及时·可追溯","textPreview":"口径一致·完整·及时·可追溯","textChars":14,"textLines":1,"bbox":[395,518,760,48]}
{"kind":"shape","id":"sh/wnqhgf2h","slide":17,"bbox":[112,583,1040,0]}
{"kind":"shape","id":"sh/x8zip032","slide":17,"bbox":[42,612,1196,42]}
{"kind":"textbox","id":"sh/al8ze5kb","slide":17,"text":"项目启动时即确认基线、口径和外部影响因素,避免将自然波动误认为系统收益。","textPreview":"项目启动时即确认基线、口径和外部影响因素,避免将自然波动误认为系统收益。","textChars":36,"textLines":1,"bbox":[64,622,1152,24]}
{"kind":"notes","id":"nt/1tvdog","slide":17,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/edu865","slide":18,"title":"玄谋智脑","textShapes":4}
{"kind":"textbox","id":"sh/dov6hoz2","slide":18,"text":"玄谋智脑","textPreview":"玄谋智脑","textChars":4,"textLines":1,"bbox":[42,35,240,30]}
{"kind":"textbox","id":"sh/ql4nm90r","slide":18,"text":"先用 8 周\n找到第一批可验证的利润改善机会","textPreview":"先用 8 周 | 找到第一批可验证的利润改善机会","textChars":22,"textLines":2,"bbox":[42,160,1040,210]}
{"kind":"textbox","id":"sh/bmdofehc","slide":18,"text":"再决定如何扩大应用范围","textPreview":"再决定如何扩大应用范围","textChars":11,"textLines":1,"bbox":[42,420,850,52]}
{"kind":"shape","id":"sh/oj25kzil","slide":18,"bbox":[42,610,1196,0]}
{"kind":"textbox","id":"sh/pkv6d4z6","slide":18,"text":"让问题更早被发现 · 让整改真正落地 · 让每一次改善复制到更多门店","textPreview":"让问题更早被发现 · 让整改真正落地 · 让每一次改善复制到更多门店","textChars":34,"textLines":1,"bbox":[42,636,1100,30]}
{"kind":"notes","id":"nt/edu865","slide":18,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
@@ -0,0 +1,456 @@
{"kind":"deck","id":"pr/e6cjzk","name":"Deck"}
{"kind":"layout","layoutId":"/ppt/slideMasters/slideMaster1.xml","name":"Master","type":"master"}
{"kind":"layout","layoutId":"/ppt/slideLayouts/slideLayout1.xml","name":"Title Slide","type":"title"}
{"kind":"slide","id":"sl/y90nupkv","slide":1,"title":"玄谋智脑","textShapes":4}
{"kind":"textbox","id":"sh/ts7md4r2","slide":1,"text":"玄谋智脑","textPreview":"玄谋智脑","textChars":4,"textLines":1,"bbox":[42,34,360,36]}
{"kind":"textbox","id":"sh/547294r6","slide":1,"text":"看清利润,才谈得上管住门店\nSee the profit clearly. Run every store with confidence.","textPreview":"看清利润,才谈得上管住门店 | See the profit clearly. Run every store with confidence.","textChars":70,"textLines":2,"bbox":[42,180,990,180]}
{"kind":"textbox","id":"sh/k3yl0zql","slide":1,"text":"面向连锁企业的行业数字本体与 AI 经营智脑 A decision intelligence layer for multi-site operators","textPreview":"面向连锁企业的行业数字本体与 AI 经营智脑 A decision intelligence layer for multi-site operators","textChars":78,"textLines":1,"bbox":[42,402,870,48]}
{"kind":"shape","id":"sh/7qp4be9c","slide":1,"bbox":[42,615,1196,0]}
{"kind":"textbox","id":"sh/65g3298r","slide":1,"text":"对外保密版 · 案例与金额均为匿名示意","textPreview":"对外保密版 · 案例与金额均为匿名示意","textChars":19,"textLines":1,"bbox":[42,640,620,24]}
{"kind":"notes","id":"nt/y90nupkv","slide":1,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/hwbqtkby","slide":2,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":13}
{"kind":"textbox","id":"sh/cnupgny5","slide":2,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/9072xkry","slide":2,"text":"老板最终要判断三件事\nThree decisions matter most to the owner.","textPreview":"老板最终要判断三件事 | Three decisions matter most to the owner.","textChars":52,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/ozy1ofad","slide":2,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/b29kza94","slide":2,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/a10jqpsj","slide":2,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,190,80,48]}
{"kind":"shape","id":"sh/x4r21kru","slide":2,"bbox":[42,248,350,0]}
{"kind":"textbox","id":"sh/w3i1sfa9","slide":2,"text":"哪里在亏钱?","textPreview":"哪里在亏钱?","textChars":6,"textLines":1,"bbox":[42,278,350,52]}
{"kind":"textbox","id":"sh/r65knqtk","slide":2,"text":"门店、SKU、促销、库存、人力中,哪些利润漏洞最应该先处理?","textPreview":"门店、SKU、促销、库存、人力中,哪些利润漏洞最应该先处理?","textChars":30,"textLines":1,"bbox":[42,352,350,140]}
{"kind":"textbox","id":"sh/q5wjelsz","slide":2,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[443,190,80,48]}
{"kind":"shape","id":"sh/ove9o7yd","slide":2,"bbox":[443,248,350,0]}
{"kind":"textbox","id":"sh/9wnqhczy","slide":2,"text":"哪些动作能增利?","textPreview":"哪些动作能增利?","textChars":8,"textLines":1,"bbox":[443,278,350,52]}
{"kind":"textbox","id":"sh/mtwrmxg7","slide":2,"text":"不只找问题,还要测算影响、给出方案、跟踪执行并验证结果。","textPreview":"不只找问题,还要测算影响、给出方案、跟踪执行并验证结果。","textChars":28,"textLines":1,"bbox":[443,352,350,140]}
{"kind":"textbox","id":"sh/nu58f2hs","slide":2,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[844,190,80,48]}
{"kind":"shape","id":"sh/wjy9sry9","slide":2,"bbox":[844,248,350,0]}
{"kind":"textbox","id":"sh/xk7qlczu","slide":2,"text":"扩张后还能管住吗?","textPreview":"扩张后还能管住吗?","textChars":9,"textLines":1,"bbox":[844,278,350,52]}
{"kind":"textbox","id":"sh/ahwrqhgj","slide":2,"text":"从 30 家到 300 家门店,有效经验能否被低成本、高质量地复制?","textPreview":"从 30 家到 300 家门店,有效经验能否被低成本、高质量地复制?","textChars":34,"textLines":1,"bbox":[844,352,350,140]}
{"kind":"textbox","id":"sh/bip8jmho","slide":2,"text":"不是看更多报表,而是将数据转化为可验证的经营改善。","textPreview":"不是看更多报表,而是将数据转化为可验证的经营改善。","textChars":25,"textLines":1,"bbox":[42,590,1100,42]}
{"kind":"notes","id":"nt/hwbqtkby","slide":2,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/ofy9wn61","slide":3,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/batgjixs","slide":3,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/cza94vmx","slide":3,"text":"数据很多,利润去向仍然说不清\nPlenty of data, but no clear view of where profit goes.","textPreview":"数据很多,利润去向仍然说不清 | Plenty of data, but no clear view of where profit goes.","textChars":70,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/d0jax03i","slide":3,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/298ryl4v","slide":3,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/3ah8rqlg","slide":3,"bbox":[42,188,360,160]}
{"kind":"shape","id":"sh/obq90bml","slide":3,"bbox":[42,188,7,160]}
{"kind":"textbox","id":"sh/pcjqtg36","slide":3,"text":"营收","textPreview":"营收","textChars":2,"textLines":1,"bbox":[66,210,314,40]}
{"kind":"textbox","id":"sh/m5cra54z","slide":3,"text":"营收增长,利润为何没有同步?","textPreview":"营收增长,利润为何没有同步?","textChars":14,"textLines":1,"bbox":[66,262,314,68]}
{"kind":"shape","id":"sh/n6ls3alk","slide":3,"bbox":[443,188,360,160]}
{"kind":"shape","id":"sh/n2l4fq98","slide":3,"bbox":[443,188,7,160]}
{"kind":"textbox","id":"sh/m1c3mlsn","slide":3,"text":"门店","textPreview":"门店","textChars":2,"textLines":1,"bbox":[467,210,314,40]}
{"kind":"textbox","id":"sh/943mhgre","slide":3,"text":"哪些门店看似赚钱,实际占用资金?","textPreview":"哪些门店看似赚钱,实际占用资金?","textChars":16,"textLines":1,"bbox":[467,262,314,68]}
{"kind":"shape","id":"sh/83ulovat","slide":3,"bbox":[844,188,360,160]}
{"kind":"shape","id":"sh/v6l4jq94","slide":3,"bbox":[844,188,7,160]}
{"kind":"textbox","id":"sh/a5c3ql8z","slide":3,"text":"促销","textPreview":"促销","textChars":2,"textLines":1,"bbox":[868,210,314,40]}
{"kind":"textbox","id":"sh/x8nml0ra","slide":3,"text":"哪些活动增加订单,却消耗利润?","textPreview":"哪些活动增加订单,却消耗利润?","textChars":15,"textLines":1,"bbox":[868,262,314,68]}
{"kind":"shape","id":"sh/w7ulsvqp","slide":3,"bbox":[42,390,360,160]}
{"kind":"shape","id":"sh/ja54na9g","slide":3,"bbox":[42,390,7,160]}
{"kind":"textbox","id":"sh/i9w3u58v","slide":3,"text":"SKU","textPreview":"SKU","textChars":3,"textLines":1,"bbox":[66,412,314,40]}
{"kind":"textbox","id":"sh/e10f2twf","slide":3,"text":"哪些商品销量不低,却毛利不足?","textPreview":"哪些商品销量不低,却毛利不足?","textChars":15,"textLines":1,"bbox":[66,464,314,68]}
{"kind":"shape","id":"sh/f29gbyx0","slide":3,"bbox":[443,390,360,160]}
{"kind":"shape","id":"sh/03ix43e5","slide":3,"bbox":[443,390,7,160]}
{"kind":"textbox","id":"sh/14ryd8fq","slide":3,"text":"人力","textPreview":"人力","textChars":2,"textLines":1,"bbox":[467,412,314,40]}
{"kind":"textbox","id":"sh/6d0fytg3","slide":3,"text":"哪些时段人员闲置,高峰又缺人?","textPreview":"哪些时段人员闲置,高峰又缺人?","textChars":15,"textLines":1,"bbox":[467,464,314,68]}
{"kind":"shape","id":"sh/re9g7yxo","slide":3,"bbox":[844,390,360,160]}
{"kind":"shape","id":"sh/sfix03y9","slide":3,"bbox":[844,390,7,160]}
{"kind":"textbox","id":"sh/tgry9ofu","slide":3,"text":"止损","textPreview":"止损","textChars":2,"textLines":1,"bbox":[868,412,314,40]}
{"kind":"textbox","id":"sh/a9kfadwn","slide":3,"text":"哪些门店应整改、迁址、缩编或关停?","textPreview":"哪些门店应整改、迁址、缩编或关停?","textChars":17,"textLines":1,"bbox":[868,464,314,68]}
{"kind":"notes","id":"nt/ofy9wn61","slide":3,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/jyx0ra1s","slide":4,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":22}
{"kind":"textbox","id":"sh/knex8j21","slide":4,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1cj2d8b6","slide":4,"text":"把异常处理成有结果的经营行动\nTurn exceptions into actions with measurable outcomes.","textPreview":"把异常处理成有结果的经营行动 | Turn exceptions into actions with measurable outcomes.","textChars":69,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/0ba143al","slide":4,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/rm1k7yt4","slide":4,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/ql8jytsj","slide":4,"bbox":[82,350,1090,0]}
{"kind":"shape","id":"sh/doj29oba","slide":4,"bbox":[54,332,36,36]}
{"kind":"textbox","id":"sh/sna103ap","slide":4,"text":"1","textPreview":"1","textChars":1,"textLines":1,"bbox":[54,337,36,24]}
{"kind":"textbox","id":"sh/3ihk3et8","slide":4,"text":"发现","textPreview":"发现","textChars":2,"textLines":1,"bbox":[44,235,150,40]}
{"kind":"textbox","id":"sh/ih8ju9sn","slide":4,"text":"利润异常","textPreview":"利润异常","textChars":4,"textLines":1,"bbox":[44,400,164,78]}
{"kind":"shape","id":"sh/kbm987y5","slide":4,"bbox":[253,332,36,36]}
{"kind":"textbox","id":"sh/5cva1cfq","slide":4,"text":"2","textPreview":"2","textChars":1,"textLines":1,"bbox":[253,337,36,24]}
{"kind":"textbox","id":"sh/i94r6xgz","slide":4,"text":"穿透","textPreview":"穿透","textChars":2,"textLines":1,"bbox":[243,235,150,40]}
{"kind":"textbox","id":"sh/jadsz2xk","slide":4,"text":"区域·门店·SKU·班次","textPreview":"区域·门店·SKU·班次","textChars":12,"textLines":1,"bbox":[243,400,164,78]}
{"kind":"shape","id":"sh/w72947yt","slide":4,"bbox":[452,332,36,36]}
{"kind":"textbox","id":"sh/x8vaxsfe","slide":4,"text":"3","textPreview":"3","textChars":1,"textLines":1,"bbox":[452,337,36,24]}
{"kind":"textbox","id":"sh/a5kr2xg3","slide":4,"text":"测算","textPreview":"测算","textChars":2,"textLines":1,"bbox":[442,235,150,40]}
{"kind":"textbox","id":"sh/v6tsv2xo","slide":4,"text":"影响金额与优先级","textPreview":"影响金额与优先级","textChars":8,"textLines":1,"bbox":[442,400,164,78]}
{"kind":"shape","id":"sh/g36tgryd","slide":4,"bbox":[651,332,36,36]}
{"kind":"textbox","id":"sh/h4fa9wfy","slide":4,"text":"4","textPreview":"4","textChars":1,"textLines":1,"bbox":[651,337,36,24]}
{"kind":"textbox","id":"sh/p0batw72","slide":4,"text":"整改","textPreview":"整改","textChars":2,"textLines":1,"bbox":[641,235,150,40]}
{"kind":"textbox","id":"sh/oz29krqh","slide":4,"text":"动作·责任人·期限","textPreview":"动作·责任人·期限","textChars":9,"textLines":1,"bbox":[641,400,164,78]}
{"kind":"shape","id":"sh/3ytsrmpw","slide":4,"bbox":[850,332,36,36]}
{"kind":"textbox","id":"sh/2xkrih8b","slide":4,"text":"5","textPreview":"5","textChars":1,"textLines":1,"bbox":[850,337,36,24]}
{"kind":"textbox","id":"sh/1wbapc7q","slide":4,"text":"验证","textPreview":"验证","textChars":2,"textLines":1,"bbox":[840,235,150,40]}
{"kind":"textbox","id":"sh/gv29g7q5","slide":4,"text":"利润是否真正改善","textPreview":"利润是否真正改善","textChars":8,"textLines":1,"bbox":[840,400,164,78]}
{"kind":"shape","id":"sh/fu9sn2p0","slide":4,"bbox":[1049,332,36,36]}
{"kind":"textbox","id":"sh/et0reh8f","slide":4,"text":"6","textPreview":"6","textChars":1,"textLines":1,"bbox":[1049,337,36,24]}
{"kind":"textbox","id":"sh/tsrqlc7u","slide":4,"text":"沉淀","textPreview":"沉淀","textChars":2,"textLines":1,"bbox":[1039,235,150,40]}
{"kind":"textbox","id":"sh/sri9s7q9","slide":4,"text":"更新企业最佳实践","textPreview":"更新企业最佳实践","textChars":8,"textLines":1,"bbox":[1039,400,164,78]}
{"kind":"shape","id":"sh/ilwf69kv","slide":4,"bbox":[42,552,1196,58]}
{"kind":"textbox","id":"sh/jm5gze1g","slide":4,"text":"关键不是“发现问题”,而是“把问题变成可复制的利润改善”。","textPreview":"关键不是“发现问题”,而是“把问题变成可复制的利润改善”。","textChars":29,"textLines":1,"bbox":[66,568,1148,30]}
{"kind":"notes","id":"nt/jyx0ra1s","slide":4,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/i107q5of","slide":5,"title":"匿名复合案例 · SKU 组合决策 Anonymous composite case · SKU portfolio","textShapes":15}
{"kind":"textbox","id":"sh/fe94nm1w","slide":5,"text":"匿名复合案例 · SKU 组合决策 Anonymous composite case · SKU portfolio","textPreview":"匿名复合案例 · SKU 组合决策 Anonymous composite case · SKU portfolio","textChars":59,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/dgbulwnm","slide":5,"text":"SKU 过多,往往增加的是复杂度和成本\nMore SKUs often mean more cost, not more choice.","textPreview":"SKU 过多,往往增加的是复杂度和成本 | More SKUs often mean more cost, not more choice.","textChars":68,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/cf2tcr61","slide":5,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/z2tcnm5s","slide":5,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/yhkbe1o7","slide":5,"text":"480","textPreview":"480","textChars":3,"textLines":1,"bbox":[42,182,190,72]}
{"kind":"textbox","id":"sh/l4bupwny","slide":5,"text":"在售 SKU","textPreview":"在售 SKU","textChars":6,"textLines":1,"bbox":[42,256,190,30]}
{"kind":"textbox","id":"sh/032tgr6d","slide":5,"text":"后 20% SKU 仅贡献约 3% 销售额,却持续占用库存资金。","textPreview":"后 20% SKU 仅贡献约 3% 销售额,却持续占用库存资金。","textChars":32,"textLines":1,"bbox":[262,190,800,76]}
{"kind":"shape","id":"sh/n6dcr65o","slide":5,"bbox":[42,328,270,170]}
{"kind":"textbox","id":"sh/m5kbi1oj","slide":5,"text":"37 个","textPreview":"37 个","textChars":4,"textLines":1,"bbox":[66,354,222,64]}
{"kind":"textbox","id":"sh/w32dkbuh","slide":5,"text":"低销量·低毛利·高损耗","textPreview":"低销量·低毛利·高损耗","textChars":11,"textLines":1,"bbox":[66,434,222,40]}
{"kind":"shape","id":"sh/x4vedgvm","slide":5,"bbox":[341,328,270,170]}
{"kind":"textbox","id":"sh/ahkvi1cb","slide":5,"text":"9 个","textPreview":"9 个","textChars":3,"textLines":1,"bbox":[365,354,222,64]}
{"kind":"textbox","id":"sh/v2twb6dw","slide":5,"text":"高销量但低贡献利润","textPreview":"高销量但低贡献利润","textChars":9,"textLines":1,"bbox":[365,434,222,40]}
{"kind":"shape","id":"sh/k7mxovud","slide":5,"bbox":[640,328,270,170]}
{"kind":"textbox","id":"sh/58vehgvy","slide":5,"text":"16 个","textPreview":"16 个","textChars":4,"textLines":1,"bbox":[664,354,222,64]}
{"kind":"textbox","id":"sh/i54fmlc7","slide":5,"text":"可共享或替换原料","textPreview":"可共享或替换原料","textChars":8,"textLines":1,"bbox":[664,434,222,40]}
{"kind":"shape","id":"sh/j6dwfqds","slide":5,"bbox":[939,328,270,170]}
{"kind":"textbox","id":"sh/sb6xsvu9","slide":5,"text":"22 个","textPreview":"22 个","textChars":4,"textLines":1,"bbox":[963,354,222,64]}
{"kind":"textbox","id":"sh/tcfel0vu","slide":5,"text":"价格带重叠","textPreview":"价格带重叠","textChars":5,"textLines":1,"bbox":[963,434,222,40]}
{"kind":"shape","id":"sh/hgrmpwj2","slide":5,"bbox":[42,535,1196,85]}
{"kind":"textbox","id":"sh/gfi5grih","slide":5,"text":"模拟测算:释放库存资金约 80 万元 · 年减少报损约 35 万元 · 综合毛利率提升约 0.6 个百分点","textPreview":"模拟测算:释放库存资金约 80 万元 · 年减少报损约 35 万元 · 综合毛利率提升约 0.6 个百分点","textChars":53,"textLines":1,"bbox":[68,558,1140,40]}
{"kind":"notes","id":"nt/i107q5of","slide":5,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/x8f69ofe","slide":6,"title":"匿名复合案例 · 门店 A-017 Anonymous composite case · Store A-017","textShapes":10}
{"kind":"textbox","id":"sh/svmt4v6t","slide":6,"text":"匿名复合案例 · 门店 A-017 Anonymous composite case · Store A-017","textPreview":"匿名复合案例 · 门店 A-017 Anonymous composite case · Store A-017","textChars":57,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/yhg7epsj","slide":6,"text":"排班的关键,是工时跟着客流走\nLabor hours should follow demand.","textPreview":"排班的关键,是工时跟着客流走 | Labor hours should follow demand.","textChars":48,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/zi98nu94","slide":6,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/87ipkzal","slide":6,"text":"06","textPreview":"06","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/98rqt4r6","slide":6,"bbox":[42,182,362,314]}
{"kind":"shape","id":"sh/ml07i9sv","slide":6,"bbox":[42,182,7,314]}
{"kind":"textbox","id":"sh/7m98ru9g","slide":6,"text":"发现","textPreview":"发现","textChars":2,"textLines":1,"bbox":[66,204,316,40]}
{"kind":"textbox","id":"sh/oryp8fah","slide":6,"text":"· 工作日上午存在闲置工时\n· 周五晚高峰经常缺人\n· 班次依据历史习惯\n· 加班集中在少数岗位","textPreview":"· 工作日上午存在闲置工时 | · 周五晚高峰经常缺人 | · 班次依据历史习惯 | · 加班集中在少数岗位","textChars":48,"textLines":4,"bbox":[66,256,316,222]}
{"kind":"shape","id":"sh/pc76hkr2","slide":6,"bbox":[458,182,362,314]}
{"kind":"shape","id":"sh/h4bupgn6","slide":6,"bbox":[458,182,7,314]}
{"kind":"textbox","id":"sh/w32twb6l","slide":6,"text":"动作","textPreview":"动作","textChars":2,"textLines":1,"bbox":[482,204,316,40]}
{"kind":"textbox","id":"sh/v2tcn650","slide":6,"text":"· 按半小时预测工作量\n· 调整早晚班起止时间\n· 高峰增加小时工\n· 备餐前移至客流爬升前","textPreview":"· 按半小时预测工作量 | · 调整早晚班起止时间 | · 高峰增加小时工 | · 备餐前移至客流爬升前","textChars":46,"textLines":4,"bbox":[482,256,316,222]}
{"kind":"shape","id":"sh/u1kbu1ov","slide":6,"bbox":[874,182,364,314]}
{"kind":"shape","id":"sh/5svutgni","slide":6,"bbox":[874,182,7,314]}
{"kind":"textbox","id":"sh/47mt0b6x","slide":6,"text":"验证","textPreview":"验证","textChars":2,"textLines":1,"bbox":[898,204,318,40]}
{"kind":"textbox","id":"sh/j6dcr65c","slide":6,"text":"同时监控:\n\n· 人工成本\n· 出品时效\n· 顾客满意度\n\n避免单纯压缩人力。","textPreview":"同时监控: | | · 人工成本 | · 出品时效 | · 顾客满意度 | | 避免单纯压缩人力。","textChars":39,"textLines":7,"bbox":[898,256,318,222]}
{"kind":"shape","id":"sh/i54bylor","slide":6,"bbox":[42,535,1196,85]}
{"kind":"textbox","id":"sh/twfux0ne","slide":6,"text":"模拟测算:单店每月节约 1.8 万元;复制到 60 家门店,年度改善空间约 1,296 万元。","textPreview":"模拟测算:单店每月节约 1.8 万元;复制到 60 家门店,年度改善空间约 1,296 万元。","textChars":47,"textLines":1,"bbox":[66,557,1148,42]}
{"kind":"notes","id":"nt/x8f69ofe","slide":6,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/gnmp4jqx","slide":7,"title":"匿名复合案例 · 营销活动 X Anonymous composite case · Campaign X","textShapes":17}
{"kind":"textbox","id":"sh/s3ml0v61","slide":7,"text":"匿名复合案例 · 营销活动 X Anonymous composite case · Campaign X","textPreview":"匿名复合案例 · 营销活动 X Anonymous composite case · Campaign X","textChars":54,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/cb2tkvap","slide":7,"text":"订单增长,不等于促销赚钱\nMore orders do not always mean a profitable campaign.","textPreview":"订单增长,不等于促销赚钱 | More orders do not always mean a profitable campaign.","textChars":66,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/dcbud0ra","slide":7,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ydkbm5sv","slide":7,"text":"07","textPreview":"07","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/zedcfa9g","slide":7,"bbox":[42,186,350,170]}
{"kind":"textbox","id":"sh/kzmdova1","slide":7,"text":"+23%","textPreview":"+23%","textChars":4,"textLines":1,"bbox":[66,212,302,64]}
{"kind":"textbox","id":"sh/l0vuh0rm","slide":7,"text":"订单增长","textPreview":"订单增长","textChars":4,"textLines":1,"bbox":[66,292,302,40]}
{"kind":"shape","id":"sh/eh0ba1sr","slide":7,"bbox":[42,378,350,170]}
{"kind":"textbox","id":"sh/fi9c369c","slide":7,"text":"负值","textPreview":"负值","textChars":2,"textLines":1,"bbox":[66,404,302,64]}
{"kind":"textbox","id":"sh/baxkjqlk","slide":7,"text":"穿透成本后的活动贡献利润","textPreview":"穿透成本后的活动贡献利润","textChars":12,"textLines":1,"bbox":[66,484,302,40]}
{"kind":"textbox","id":"sh/a9ojq5kz","slide":7,"text":"活动为什么亏钱","textPreview":"活动为什么亏钱","textChars":7,"textLines":1,"bbox":[454,186,360,40]}
{"kind":"textbox","id":"sh/xcz2l03q","slide":7,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[454,258,42,28]}
{"kind":"textbox","id":"sh/cbq1sv25","slide":7,"text":"低毛利商品占比上升","textPreview":"低毛利商品占比上升","textChars":9,"textLines":1,"bbox":[510,254,650,40]}
{"kind":"shape","id":"sh/n6x0fqlo","slide":7,"bbox":[510,300,650,0]}
{"kind":"textbox","id":"sh/25ojml43","slide":7,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[454,323,42,28]}
{"kind":"textbox","id":"sh/p8fih03e","slide":7,"text":"高价值会员获得无差别优惠","textPreview":"高价值会员获得无差别优惠","textChars":12,"textLines":1,"bbox":[510,319,650,40]}
{"kind":"shape","id":"sh/o761ov2t","slide":7,"bbox":[510,365,650,0]}
{"kind":"textbox","id":"sh/f2d0b6lc","slide":7,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[454,388,42,28]}
{"kind":"textbox","id":"sh/eh4jil4r","slide":7,"text":"促销订单替代了原价订单","textPreview":"促销订单替代了原价订单","textChars":11,"textLines":1,"bbox":[510,384,650,40]}
{"kind":"shape","id":"sh/id4ju1oz","slide":7,"bbox":[510,430,650,0]}
{"kind":"textbox","id":"sh/jedkn654","slide":7,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[454,453,42,28]}
{"kind":"textbox","id":"sh/4fm1wb6p","slide":7,"text":"只评价订单和营收,没有评价增量利润","textPreview":"只评价订单和营收,没有评价增量利润","textChars":17,"textLines":1,"bbox":[510,449,650,40]}
{"kind":"shape","id":"sh/50v2pgna","slide":7,"bbox":[510,495,650,0]}
{"kind":"shape","id":"sh/q143ylov","slide":7,"bbox":[454,544,746,67]}
{"kind":"textbox","id":"sh/r2dkrq5g","slide":7,"text":"用“每投入 1 元营销费用增加多少贡献利润”评价活动。","textPreview":"用“每投入 1 元营销费用增加多少贡献利润”评价活动。","textChars":27,"textLines":1,"bbox":[478,562,700,34]}
{"kind":"notes","id":"nt/gnmp4jqx","slide":7,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/fu1gfa1s","slide":8,"title":"匿名复合案例 · 门店 D-006 Anonymous composite case · Store D-006","textShapes":19}
{"kind":"textbox","id":"sh/07atgnmp","slide":8,"text":"匿名复合案例 · 门店 D-006 Anonymous composite case · Store D-006","textPreview":"匿名复合案例 · 门店 D-006 Anonymous composite case · Store D-006","textChars":57,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/18byd4zy","slide":8,"text":"关店前,先把四种选择算清楚\nCompare the options before deciding to close a store.","textPreview":"关店前,先把四种选择算清楚 | Compare the options before deciding to close a store.","textChars":67,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/g72x4zyd","slide":8,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ri9g7uhw","slide":8,"text":"08","textPreview":"08","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/6h0fypgb","slide":8,"bbox":[42,180,340,55]}
{"kind":"textbox","id":"sh/tkby9kzm","slide":8,"text":"方案","textPreview":"方案","textChars":2,"textLines":1,"bbox":[60,197,304,26]}
{"kind":"shape","id":"sh/sjix0zy1","slide":8,"bbox":[382,180,378,55]}
{"kind":"textbox","id":"sh/je9g3ahk","slide":8,"text":"12 个月模拟结果","textPreview":"12 个月模拟结果","textChars":9,"textLines":1,"bbox":[400,197,342,26]}
{"kind":"shape","id":"sh/id0fu50z","slide":8,"bbox":[760,180,478,55]}
{"kind":"textbox","id":"sh/o7ydoret","slide":8,"text":"决策建议","textPreview":"决策建议","textChars":4,"textLines":1,"bbox":[778,197,442,26]}
{"kind":"shape","id":"sh/98rehwve","slide":8,"bbox":[42,235,340,72]}
{"kind":"textbox","id":"sh/m5gvmhwn","slide":8,"text":"继续经营","textPreview":"继续经营","textChars":4,"textLines":1,"bbox":[60,256,304,35]}
{"kind":"shape","id":"sh/n6pwfmd8","slide":8,"bbox":[382,235,378,72]}
{"kind":"textbox","id":"sh/0jydkreh","slide":8,"text":"预计亏损 92 万","textPreview":"预计亏损 92 万","textChars":9,"textLines":1,"bbox":[400,256,342,35]}
{"kind":"shape","id":"sh/1k7edwv2","slide":8,"bbox":[760,235,478,72]}
{"kind":"textbox","id":"sh/ehgvihwr","slide":8,"text":"不建议","textPreview":"不建议","textChars":3,"textLines":1,"bbox":[778,256,442,35]}
{"kind":"shape","id":"sh/zipwbmdc","slide":8,"bbox":[42,307,340,72]}
{"kind":"textbox","id":"sh/kfixwbe1","slide":8,"text":"投入整改","textPreview":"投入整改","textChars":4,"textLines":1,"bbox":[60,328,304,35]}
{"kind":"shape","id":"sh/lgbepgvm","slide":8,"bbox":[382,307,378,72]}
{"kind":"textbox","id":"sh/tw7e9gnq","slide":8,"text":"预计亏损降至 35 万","textPreview":"预计亏损降至 35 万","textChars":11,"textLines":1,"bbox":[400,328,342,35]}
{"kind":"shape","id":"sh/svydgb65","slide":8,"bbox":[760,307,478,72]}
{"kind":"textbox","id":"sh/7u5w765k","slide":8,"text":"高风险,设止损线","textPreview":"高风险,设止损线","textChars":8,"textLines":1,"bbox":[778,328,442,35]}
{"kind":"shape","id":"sh/6twve1oz","slide":8,"bbox":[42,379,340,72]}
{"kind":"textbox","id":"sh/5sne5wne","slide":8,"text":"缩小面积","textPreview":"缩小面积","textChars":4,"textLines":1,"bbox":[60,400,304,35]}
{"kind":"shape","id":"sh/kredcr6t","slide":8,"bbox":[382,379,378,72]}
{"kind":"textbox","id":"sh/jq5w365o","slide":8,"text":"预计接近盈亏平衡","textPreview":"预计接近盈亏平衡","textChars":8,"textLines":1,"bbox":[400,400,342,35]}
{"kind":"shape","id":"sh/i5wva1o3","slide":8,"bbox":[760,379,478,72]}
{"kind":"textbox","id":"sh/x4ne1wni","slide":8,"text":"租约可重谈时考虑","textPreview":"租约可重谈时考虑","textChars":8,"textLines":1,"bbox":[778,400,442,35]}
{"kind":"shape","id":"sh/w3ed8r6x","slide":8,"bbox":[42,451,340,72]}
{"kind":"textbox","id":"sh/m9sb2x4v","slide":8,"text":"关停并迁移会员","textPreview":"关停并迁移会员","textChars":7,"textLines":1,"bbox":[60,472,304,35]}
{"kind":"shape","id":"sh/na1sb2lg","slide":8,"bbox":[382,451,378,72]}
{"kind":"textbox","id":"sh/8bat47ml","slide":8,"text":"预计减少亏损 76 万","textPreview":"预计减少亏损 76 万","textChars":11,"textLines":1,"bbox":[400,472,342,35]}
{"kind":"shape","id":"sh/9w3uds36","slide":8,"bbox":[760,451,478,72]}
{"kind":"textbox","id":"sh/y5sbed4j","slide":8,"text":"优先建议","textPreview":"优先建议","textChars":4,"textLines":1,"bbox":[778,472,442,35]}
{"kind":"textbox","id":"sh/z61s7il4","slide":8,"text":"AI 不替老板关店;它让经验判断具有数据依据、情景测算和退出预案。","textPreview":"AI 不替老板关店;它让经验判断具有数据依据、情景测算和退出预案。","textChars":33,"textLines":1,"bbox":[42,565,1160,44]}
{"kind":"notes","id":"nt/fu1gfa1s","slide":8,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/udsvah03","slide":9,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/va103ep4","slide":9,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1cfmhgne","slide":9,"text":"四级管理,各自看清该做的事\nOne operating view, four levels of accountability.","textPreview":"四级管理,各自看清该做的事 | One operating view, four levels of accountability.","textChars":64,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/0b65obm9","slide":9,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/nex4jq5k","slide":9,"text":"09","textPreview":"09","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/mdonql4z","slide":9,"bbox":[42,190,265,316]}
{"kind":"textbox","id":"sh/9gzml0nq","slide":9,"text":"老板","textPreview":"老板","textChars":2,"textLines":1,"bbox":[64,214,220,46]}
{"kind":"textbox","id":"sh/ofq5svm5","slide":9,"text":"看结果","textPreview":"看结果","textChars":3,"textLines":1,"bbox":[64,296,220,44]}
{"kind":"textbox","id":"sh/bih4na5w","slide":9,"text":"利润·风险·资源投向","textPreview":"利润·风险·资源投向","textChars":10,"textLines":1,"bbox":[64,386,220,72]}
{"kind":"textbox","id":"sh/ah8nu54b","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[310,323,30,36]}
{"kind":"shape","id":"sh/oza1gfyh","slide":9,"bbox":[341,190,265,316]}
{"kind":"textbox","id":"sh/p0ji9kf2","slide":9,"text":"总部","textPreview":"总部","textChars":2,"textLines":1,"bbox":[363,214,220,46]}
{"kind":"textbox","id":"sh/2xsjepgb","slide":9,"text":"找原因","textPreview":"找原因","textChars":3,"textLines":1,"bbox":[363,296,220,44]}
{"kind":"textbox","id":"sh/3y107axw","slide":9,"text":"跨区域对标·政策评估","textPreview":"跨区域对标·政策评估","textChars":10,"textLines":1,"bbox":[363,386,220,72]}
{"kind":"textbox","id":"sh/cnu1kzyd","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[609,323,30,36]}
{"kind":"shape","id":"sh/do3id4fy","slide":9,"bbox":[640,190,265,316]}
{"kind":"textbox","id":"sh/qlcjipgn","slide":9,"text":"区域","textPreview":"区域","textChars":2,"textLines":1,"bbox":[662,214,220,46]}
{"kind":"textbox","id":"sh/bml0buxs","slide":9,"text":"推整改","textPreview":"推整改","textChars":3,"textLines":1,"bbox":[662,296,220,44]}
{"kind":"textbox","id":"sh/0ru1ozyp","slide":9,"text":"门店分级·任务·验收","textPreview":"门店分级·任务·验收","textChars":10,"textLines":1,"bbox":[662,386,220,72]}
{"kind":"textbox","id":"sh/lsn2h4fa","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[908,323,30,36]}
{"kind":"shape","id":"sh/98ji147e","slide":9,"bbox":[939,190,265,316]}
{"kind":"textbox","id":"sh/87a18zqt","slide":9,"text":"店长","textPreview":"店长","textChars":2,"textLines":1,"bbox":[961,214,220,46]}
{"kind":"textbox","id":"sh/76h0zup8","slide":9,"text":"做动作","textPreview":"做动作","textChars":3,"textLines":1,"bbox":[961,296,220,44]}
{"kind":"textbox","id":"sh/ml8j6p8n","slide":9,"text":"日目标·偏差·行动建议","textPreview":"日目标·偏差·行动建议","textChars":11,"textLines":1,"bbox":[961,386,220,72]}
{"kind":"shape","id":"sh/hcji5o7a","slide":9,"bbox":[42,550,1196,60]}
{"kind":"textbox","id":"sh/wba1cjqp","slide":9,"text":"结果回到经营大盘:执行不是终点,改善结果才是。","textPreview":"结果回到经营大盘:执行不是终点,改善结果才是。","textChars":23,"textLines":1,"bbox":[66,567,1148,30]}
{"kind":"notes","id":"nt/udsvah03","slide":9,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/m90b6t0r","slide":10,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":7}
{"kind":"textbox","id":"sh/r6pcv6lw","slide":10,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/xc3mho32","slide":10,"text":"AI 给依据,经营决策仍由管理者负责\nAI provides evidence. Management owns the decision.","textPreview":"AI 给依据,经营决策仍由管理者负责 | AI provides evidence. Management owns the decision.","textChars":70,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/cbu58j2h","slide":10,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/zelojyl8","slide":10,"text":"10","textPreview":"10","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/ydcnatkn","slide":10,"bbox":[42,182,560,366]}
{"kind":"shape","id":"sh/l036l83y","slide":10,"bbox":[42,182,7,366]}
{"kind":"textbox","id":"sh/kzu5c32t","slide":10,"text":"AI 可以承担","textPreview":"AI 可以承担","textChars":7,"textLines":1,"bbox":[66,204,514,40]}
{"kind":"textbox","id":"sh/725onyl4","slide":10,"text":"· 理解并关联跨系统数据\n· 持续扫描异常\n· 穿透至门店、SKU、班次和订单\n· 调用行业规则与历史案例\n· 推演方案对利润和现金流的影响\n· 跟踪执行并验证结果","textPreview":"· 理解并关联跨系统数据 | · 持续扫描异常 | · 穿透至门店、SKU、班次和订单 | · 调用行业规则与历史案例 | · 推演方案对利润和现金流的影响 | · 跟踪执行并验证结果","textChars":82,"textLines":6,"bbox":[66,256,514,274]}
{"kind":"shape","id":"sh/m1cnetkj","slide":10,"bbox":[678,182,560,366]}
{"kind":"shape","id":"sh/s7yt4b21","slide":10,"bbox":[678,182,7,366]}
{"kind":"textbox","id":"sh/d87uxg3m","slide":10,"text":"必须由管理者决定","textPreview":"必须由管理者决定","textChars":8,"textLines":1,"bbox":[702,204,514,40]}
{"kind":"textbox","id":"sh/q5gb21kb","slide":10,"text":"· 价格调整\n· 人员处置\n· 供应商更换\n· 门店迁址与关停\n· 重大资源投入\n\n所有高影响决策都应留下依据、审批与执行记录。","textPreview":"· 价格调整 | · 人员处置 | · 供应商更换 | · 门店迁址与关停 | · 重大资源投入 | | 所有高影响决策都应留下依据、审批与执行记录。","textChars":64,"textLines":7,"bbox":[702,256,514,274]}
{"kind":"notes","id":"nt/m90b6t0r","slide":10,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/jetc3ut0","slide":11,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":24}
{"kind":"textbox","id":"sh/g3qtkj6l","slide":11,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/xcryxg7y","slide":11,"text":"BI 解释过去,玄谋智脑推动下一步\nBI explains the past. Xuanmou drives the next action.","textPreview":"BI 解释过去,玄谋智脑推动下一步 | BI explains the past. Xuanmou drives the next action.","textChars":71,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/wbih4b6d","slide":11,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/n69grmpw","slide":11,"text":"11","textPreview":"11","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/250zy18b","slide":11,"bbox":[42,170,228,50]}
{"kind":"textbox","id":"sh/98rytw72","slide":11,"text":"维度","textPreview":"维度","textChars":2,"textLines":1,"bbox":[58,185,196,25]}
{"kind":"shape","id":"sh/o7ih0r6h","slide":11,"bbox":[270,170,410,50]}
{"kind":"textbox","id":"sh/72t03qp0","slide":11,"text":"普通 BI","textPreview":"普通 BI","textChars":5,"textLines":1,"bbox":[286,185,378,25]}
{"kind":"shape","id":"sh/61kzalof","slide":11,"bbox":[680,170,558,50]}
{"kind":"textbox","id":"sh/ofqtgnyt","slide":11,"text":"玄谋智脑","textPreview":"玄谋智脑","textChars":4,"textLines":1,"bbox":[696,185,526,25]}
{"kind":"shape","id":"sh/9gza9sze","slide":11,"bbox":[42,220,228,67]}
{"kind":"textbox","id":"sh/mdobedg3","slide":11,"text":"定位","textPreview":"定位","textChars":2,"textLines":1,"bbox":[58,238,196,38]}
{"kind":"shape","id":"sh/nehs7iho","slide":11,"bbox":[270,220,410,67]}
{"kind":"textbox","id":"sh/0b6tc3yx","slide":11,"text":"展示报表","textPreview":"展示报表","textChars":4,"textLines":1,"bbox":[286,238,378,38]}
{"kind":"shape","id":"sh/1cfa58zi","slide":11,"bbox":[680,220,558,67]}
{"kind":"textbox","id":"sh/epobatgr","slide":11,"text":"驱动经营决策与改善","textPreview":"驱动经营决策与改善","textChars":9,"textLines":1,"bbox":[696,238,526,38]}
{"kind":"shape","id":"sh/zaxs3yhc","slide":11,"bbox":[42,287,228,67]}
{"kind":"textbox","id":"sh/cn6t83y1","slide":11,"text":"业务语义","textPreview":"业务语义","textChars":4,"textLines":1,"bbox":[58,305,196,38]}
{"kind":"shape","id":"sh/dofa18z6","slide":11,"bbox":[270,287,410,67]}
{"kind":"textbox","id":"sh/tsnip0ny","slide":11,"text":"字段和指标","textPreview":"字段和指标","textChars":5,"textLines":1,"bbox":[286,305,378,38]}
{"kind":"shape","id":"sh/87ehgv6d","slide":11,"bbox":[680,287,558,67]}
{"kind":"textbox","id":"sh/7650nq5s","slide":11,"text":"门店、商品、人员、会员等行业本体","textPreview":"门店、商品、人员、会员等行业本体","textChars":16,"textLines":1,"bbox":[696,305,526,38]}
{"kind":"shape","id":"sh/65wzelo7","slide":11,"bbox":[42,354,228,67]}
{"kind":"textbox","id":"sh/l43ilgn2","slide":11,"text":"问题发现","textPreview":"问题发现","textChars":4,"textLines":1,"bbox":[58,372,196,38]}
{"kind":"shape","id":"sh/k3uhcb6h","slide":11,"bbox":[270,354,410,67]}
{"kind":"textbox","id":"sh/j2lgjq5w","slide":11,"text":"人主动看数据","textPreview":"人主动看数据","textChars":6,"textLines":1,"bbox":[286,372,378,38]}
{"kind":"shape","id":"sh/y1czalob","slide":11,"bbox":[680,354,558,67]}
{"kind":"textbox","id":"sh/p07ixkn6","slide":11,"text":"系统持续发现、分级与推送","textPreview":"系统持续发现、分级与推送","textChars":12,"textLines":1,"bbox":[696,372,526,38]}
{"kind":"shape","id":"sh/4zyhofml","slide":11,"bbox":[42,421,228,67]}
{"kind":"textbox","id":"sh/m58fih43","slide":11,"text":"问题处理","textPreview":"问题处理","textChars":4,"textLines":1,"bbox":[58,439,196,38]}
{"kind":"shape","id":"sh/n61wbmlo","slide":11,"bbox":[270,421,410,67]}
{"kind":"textbox","id":"sh/o7axk7m9","slide":11,"text":"报告异常","textPreview":"报告异常","textChars":4,"textLines":1,"bbox":[286,439,378,38]}
{"kind":"shape","id":"sh/98jedc3u","slide":11,"bbox":[680,421,558,67]}
{"kind":"textbox","id":"sh/eh8fex47","slide":11,"text":"归因、测算、方案和整改任务","textPreview":"归因、测算、方案和整改任务","textChars":13,"textLines":1,"bbox":[696,439,526,38]}
{"kind":"shape","id":"sh/z2hw72lc","slide":11,"bbox":[42,488,228,67]}
{"kind":"textbox","id":"sh/03qxg7mx","slide":11,"text":"结果验证","textPreview":"结果验证","textChars":4,"textLines":1,"bbox":[58,506,196,38]}
{"kind":"shape","id":"sh/14ze9c3i","slide":11,"bbox":[270,488,410,67]}
{"kind":"textbox","id":"sh/ydcfq1kb","slide":11,"text":"通常不跟踪","textPreview":"通常不跟踪","textChars":5,"textLines":1,"bbox":[286,506,378,38]}
{"kind":"shape","id":"sh/jylwj6lw","slide":11,"bbox":[680,488,558,67]}
{"kind":"textbox","id":"sh/3qhsfypc","slide":11,"text":"验证改善并更新最佳实践","textPreview":"验证改善并更新最佳实践","textChars":11,"textLines":1,"bbox":[696,506,526,38]}
{"kind":"shape","id":"sh/ip8bmtor","slide":11,"bbox":[42,555,228,67]}
{"kind":"textbox","id":"sh/5sjah872","slide":11,"text":"长期价值","textPreview":"长期价值","textChars":4,"textLines":1,"bbox":[58,573,196,38]}
{"kind":"shape","id":"sh/4rato36h","slide":11,"bbox":[270,555,410,67]}
{"kind":"textbox","id":"sh/v2hsbyp0","slide":11,"text":"报表越来越多","textPreview":"报表越来越多","textChars":6,"textLines":1,"bbox":[286,573,378,38]}
{"kind":"shape","id":"sh/u18bit8f","slide":11,"bbox":[680,555,558,67]}
{"kind":"textbox","id":"sh/h4zado76","slide":11,"text":"行业模型与企业知识越用越成熟","textPreview":"行业模型与企业知识越用越成熟","textChars":14,"textLines":1,"bbox":[696,573,526,38]}
{"kind":"notes","id":"nt/jetc3ut0","slide":11,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/8f2psfyx","slide":12,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":23}
{"kind":"textbox","id":"sh/alwbitsn","slide":12,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1gbm9s3a","slide":12,"text":"五项基础能力,支撑门店规模化管理\nFive capabilities that support scalable operations.","textPreview":"五项基础能力,支撑门店规模化管理 | Five capabilities that support scalable operations.","textChars":68,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/0f2lgnmp","slide":12,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ra943il8","slide":12,"text":"12","textPreview":"12","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/q903ad4n","slide":12,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,185,54,28]}
{"kind":"textbox","id":"sh/dcbm583y","slide":12,"text":"数据资产化","textPreview":"数据资产化","textChars":5,"textLines":1,"bbox":[118,171,250,54]}
{"kind":"textbox","id":"sh/sb2lcnmd","slide":12,"text":"数据通起来","textPreview":"数据通起来","textChars":5,"textLines":1,"bbox":[422,171,250,54]}
{"kind":"textbox","id":"sh/b6d4f2lc","slide":12,"text":"一个数字、一个来源","textPreview":"一个数字、一个来源","textChars":9,"textLines":1,"bbox":[720,171,450,54]}
{"kind":"shape","id":"sh/a543mx4r","slide":12,"bbox":[118,238,1050,0]}
{"kind":"textbox","id":"sh/wvupgz6t","slide":12,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[42,274,54,28]}
{"kind":"textbox","id":"sh/xw3q94ne","slide":12,"text":"运营指标化","textPreview":"运营指标化","textChars":5,"textLines":1,"bbox":[118,260,250,54]}
{"kind":"textbox","id":"sh/atc7epon","slide":12,"text":"问题浮出来","textPreview":"问题浮出来","textChars":5,"textLines":1,"bbox":[422,260,250,54]}
{"kind":"textbox","id":"sh/bulo7u58","slide":12,"text":"异常能穿透到根因","textPreview":"异常能穿透到根因","textChars":8,"textLines":1,"bbox":[720,260,450,54]}
{"kind":"shape","id":"sh/orapcf6h","slide":12,"bbox":[118,327,1050,0]}
{"kind":"textbox","id":"sh/9sj65kn2","slide":12,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[42,363,54,28]}
{"kind":"textbox","id":"sh/mps7a5or","slide":12,"text":"战略穿透化","textPreview":"战略穿透化","textChars":5,"textLines":1,"bbox":[118,349,250,54]}
{"kind":"textbox","id":"sh/nq1o3a5w","slide":12,"text":"目标落下去","textPreview":"目标落下去","textChars":5,"textLines":1,"bbox":[422,349,250,54]}
{"kind":"textbox","id":"sh/0nap8f6l","slide":12,"text":"战略到区域、门店和个人","textPreview":"战略到区域、门店和个人","textChars":11,"textLines":1,"bbox":[720,349,450,54]}
{"kind":"shape","id":"sh/1oj61kn6","slide":12,"bbox":[118,416,1050,0]}
{"kind":"textbox","id":"sh/hkbm5wzu","slide":12,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[42,452,54,28]}
{"kind":"textbox","id":"sh/gj25cry9","slide":12,"text":"态势感知化","textPreview":"态势感知化","textChars":5,"textLines":1,"bbox":[118,438,250,54]}
{"kind":"textbox","id":"sh/fit436ho","slide":12,"text":"风险早知道","textPreview":"风险早知道","textChars":5,"textLines":1,"bbox":[422,438,250,54]}
{"kind":"textbox","id":"sh/uh0na1g3","slide":12,"text":"从事后救火到事前预防","textPreview":"从事后救火到事前预防","textChars":10,"textLines":1,"bbox":[720,438,450,54]}
{"kind":"shape","id":"sh/tgrm1wzy","slide":12,"bbox":[118,505,1050,0]}
{"kind":"textbox","id":"sh/sfi58ryd","slide":12,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[42,541,54,28]}
{"kind":"textbox","id":"sh/7u94zmhs","slide":12,"text":"知识沉淀化","textPreview":"知识沉淀化","textChars":5,"textLines":1,"bbox":[118,527,250,54]}
{"kind":"textbox","id":"sh/6t0n6hg7","slide":12,"text":"组织越来越聪明","textPreview":"组织越来越聪明","textChars":7,"textLines":1,"bbox":[422,527,250,54]}
{"kind":"textbox","id":"sh/dcv6dgz2","slide":12,"text":"优秀能力不再依赖少数人","textPreview":"优秀能力不再依赖少数人","textChars":11,"textLines":1,"bbox":[720,527,450,54]}
{"kind":"shape","id":"sh/cbm5kbyh","slide":12,"bbox":[118,594,1050,0]}
{"kind":"notes","id":"nt/8f2psfyx","slide":12,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/hgzapcr6","slide":13,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/3yxgbqdg","slide":13,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/q50nydsj","slide":13,"text":"门店越多,复制优秀做法的价值越大\nThe larger the network, the greater the value of replication.","textPreview":"门店越多,复制优秀做法的价值越大 | The larger the network, the greater the value of replication.","textChars":78,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/bq9orito","slide":13,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/o3i5w3ad","slide":13,"text":"13","textPreview":"13","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/p4r6p8by","slide":13,"bbox":[42,182,360,250]}
{"kind":"shape","id":"sh/21gnuts7","slide":13,"bbox":[42,182,7,250]}
{"kind":"textbox","id":"sh/32ponyts","slide":13,"text":"不依赖能人","textPreview":"不依赖能人","textChars":5,"textLines":1,"bbox":[66,204,314,40]}
{"kind":"textbox","id":"sh/gzy5s3a1","slide":13,"text":"优秀店长的做法沉淀为规则、案例和 SOP。","textPreview":"优秀店长的做法沉淀为规则、案例和 SOP。","textChars":21,"textLines":1,"bbox":[66,256,314,158]}
{"kind":"shape","id":"sh/1076lobm","slide":13,"bbox":[443,182,360,250]}
{"kind":"shape","id":"sh/hcfy9k3u","slide":13,"bbox":[443,182,7,250]}
{"kind":"textbox","id":"sh/gb6x0zm9","slide":13,"text":"扩张不失控","textPreview":"扩张不失控","textChars":5,"textLines":1,"bbox":[467,204,314,40]}
{"kind":"textbox","id":"sh/vaxg7ulo","slide":13,"text":"验证有效的改善方案,可按门店特征分类复制。","textPreview":"验证有效的改善方案,可按门店特征分类复制。","textChars":21,"textLines":1,"bbox":[467,256,314,158]}
{"kind":"shape","id":"sh/u9ofyp43","slide":13,"bbox":[844,182,360,250]}
{"kind":"shape","id":"sh/t8fy5k3i","slide":13,"bbox":[844,182,7,250]}
{"kind":"textbox","id":"sh/876xwfmx","slide":13,"text":"能力持续复利","textPreview":"能力持续复利","textChars":6,"textLines":1,"bbox":[868,204,314,40]}
{"kind":"textbox","id":"sh/7mdg3als","slide":13,"text":"场景、模型、AI 建议与决策反馈相互增强。","textPreview":"场景、模型、AI 建议与决策反馈相互增强。","textChars":21,"textLines":1,"bbox":[868,256,314,158]}
{"kind":"shape","id":"sh/6l4fu547","slide":13,"bbox":[120,520,980,0]}
{"kind":"shape","id":"sh/lkvy103m","slide":13,"bbox":[104,502,38,38]}
{"kind":"textbox","id":"sh/kjmxsfm1","slide":13,"text":"30 家","textPreview":"30 家","textChars":4,"textLines":1,"bbox":[94,555,150,28]}
{"kind":"textbox","id":"sh/cnqh8fux","slide":13,"text":"靠人盯","textPreview":"靠人盯","textChars":3,"textLines":1,"bbox":[94,589,170,24]}
{"kind":"shape","id":"sh/xozyhkbi","slide":13,"bbox":[584,502,38,38]}
{"kind":"textbox","id":"sh/q18f65cr","slide":13,"text":"100 家","textPreview":"100 家","textChars":5,"textLines":1,"bbox":[574,555,150,28]}
{"kind":"textbox","id":"sh/bmhgfatc","slide":13,"text":"靠机制","textPreview":"靠机制","textChars":3,"textLines":1,"bbox":[574,589,170,24]}
{"kind":"shape","id":"sh/oz6x4vul","slide":13,"bbox":[1064,502,38,38]}
{"kind":"textbox","id":"sh/p0zyd0b6","slide":13,"text":"300 家","textPreview":"300 家","textChars":5,"textLines":1,"bbox":[1054,555,150,28]}
{"kind":"textbox","id":"sh/2xof2lcv","slide":13,"text":"靠模型复制","textPreview":"靠模型复制","textChars":5,"textLines":1,"bbox":[1054,589,170,24]}
{"kind":"notes","id":"nt/hgzapcr6","slide":13,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/6lsnupw7","slide":14,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":8}
{"kind":"textbox","id":"sh/kre1k3y9","slide":14,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/xc7eds76","slide":14,"text":"真正的数据资产,是可追溯的经营能力\nA real data asset is a traceable operating capability.","textPreview":"真正的数据资产,是可追溯的经营能力 | A real data asset is a traceable operating capability.","textChars":72,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/wbydknq1","slide":14,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/jepwf2pc","slide":14,"text":"14","textPreview":"14","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/idgvmx8r","slide":14,"bbox":[42,180,560,365]}
{"kind":"shape","id":"sh/5grehs7i","slide":14,"bbox":[42,180,7,365]}
{"kind":"textbox","id":"sh/kfidonqx","slide":14,"text":"企业数据资产","textPreview":"企业数据资产","textChars":6,"textLines":1,"bbox":[66,202,514,40]}
{"kind":"textbox","id":"sh/zi5c3y98","slide":14,"text":"· 统一指标口径与责任关系\n· 门店、商品、人员、会员、供应商本体\n· 行业规则与异常模式\n· 决策、执行与验证结果\n· 最佳实践与风险知识","textPreview":"· 统一指标口径与责任关系 | · 门店、商品、人员、会员、供应商本体 | · 行业规则与异常模式 | · 决策、执行与验证结果 | · 最佳实践与风险知识","textChars":70,"textLines":5,"bbox":[66,254,514,273]}
{"kind":"shape","id":"sh/ehwvat8n","slide":14,"bbox":[678,180,560,365]}
{"kind":"shape","id":"sh/c3e1gjyd","slide":14,"bbox":[678,180,7,365]}
{"kind":"textbox","id":"sh/x4ni9ofy","slide":14,"text":"融资与尽调支持","textPreview":"融资与尽调支持","textChars":7,"textLines":1,"bbox":[702,202,514,40]}
{"kind":"textbox","id":"sh/a1wze9g7","slide":14,"text":"· 门店级损益与现金流\n· 收入稳定性分析\n· 风险预警与整改记录\n· 未来经营预测\n· 更完整、可追溯的经营证明","textPreview":"· 门店级损益与现金流 | · 收入稳定性分析 | · 风险预警与整改记录 | · 未来经营预测 | · 更完整、可追溯的经营证明","textChars":57,"textLines":5,"bbox":[702,254,514,273]}
{"kind":"textbox","id":"sh/b2507exs","slide":14,"text":"边界:提供数据与分析支持,不承诺银行授信或融资结果。","textPreview":"边界:提供数据与分析支持,不承诺银行授信或融资结果。","textChars":26,"textLines":1,"bbox":[42,578,1000,34]}
{"kind":"notes","id":"nt/6lsnupw7","slide":14,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/vaxsvy10","slide":15,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/cbuh8nmh","slide":15,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/547mhg3m","slide":15,"text":"生产数据必须留在清晰的安全边界内\nProduction data must remain within clear security boundaries.","textPreview":"生产数据必须留在清晰的安全边界内 | Production data must remain within clear security boundaries.","textChars":78,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/k3y5ov21","slide":15,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/76p4jqls","slide":15,"text":"15","textPreview":"15","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/65gnqlk7","slide":15,"bbox":[42,180,360,170]}
{"kind":"shape","id":"sh/t87ml0ji","slide":15,"bbox":[42,180,7,170]}
{"kind":"textbox","id":"sh/s7y5sv2x","slide":15,"text":"部署边界","textPreview":"部署边界","textChars":4,"textLines":1,"bbox":[66,202,314,40]}
{"kind":"textbox","id":"sh/na5476l8","slide":15,"text":"不替代现有交易系统,只读或受控对接。","textPreview":"不替代现有交易系统,只读或受控对接。","textChars":18,"textLines":1,"bbox":[66,254,314,78]}
{"kind":"shape","id":"sh/m9c3e1kn","slide":15,"bbox":[443,180,360,170]}
{"kind":"shape","id":"sh/wrm9kvep","slide":15,"bbox":[443,180,7,170]}
{"kind":"textbox","id":"sh/hsvat0fa","slide":15,"text":"最小权限","textPreview":"最小权限","textChars":4,"textLines":1,"bbox":[467,202,314,40]}
{"kind":"textbox","id":"sh/upkrilwj","slide":15,"text":"老板、总部、区域、门店按职责查看。","textPreview":"老板、总部、区域、门店按职责查看。","textChars":17,"textLines":1,"bbox":[467,254,314,78]}
{"kind":"shape","id":"sh/vqdsrqx4","slide":15,"bbox":[844,180,360,170]}
{"kind":"shape","id":"sh/4vm9ovel","slide":15,"bbox":[844,180,7,170]}
{"kind":"textbox","id":"sh/5wvax0f6","slide":15,"text":"敏感保护","textPreview":"敏感保护","textChars":4,"textLines":1,"bbox":[868,202,314,40]}
{"kind":"textbox","id":"sh/it4rm5wv","slide":15,"text":"会员、薪酬、财务明细分级、脱敏与审计。","textPreview":"会员、薪酬、财务明细分级、脱敏与审计。","textChars":19,"textLines":1,"bbox":[868,254,314,78]}
{"kind":"shape","id":"sh/judsvqxg","slide":15,"bbox":[42,390,360,170]}
{"kind":"shape","id":"sh/0z29cbyh","slide":15,"bbox":[42,390,7,170]}
{"kind":"textbox","id":"sh/l0bqlgf2","slide":15,"text":"AI 可追溯","textPreview":"AI 可追溯","textChars":6,"textLines":1,"bbox":[66,412,314,40]}
{"kind":"textbox","id":"sh/1kjyt83e","slide":15,"text":"重要结论显示依据、时间、路径和适用边界。","textPreview":"重要结论显示依据、时间、路径和适用边界。","textChars":20,"textLines":1,"bbox":[66,464,314,78]}
{"kind":"shape","id":"sh/gjax03m9","slide":15,"bbox":[443,390,360,170]}
{"kind":"shape","id":"sh/fi1grylo","slide":15,"bbox":[443,390,7,170]}
{"kind":"textbox","id":"sh/ehsfyt43","slide":15,"text":"人工审批","textPreview":"人工审批","textChars":4,"textLines":1,"bbox":[467,412,314,40]}
{"kind":"textbox","id":"sh/p8jyx83q","slide":15,"text":"高影响决策必须经有权限的管理者审批。","textPreview":"高影响决策必须经有权限的管理者审批。","textChars":18,"textLines":1,"bbox":[467,464,314,78]}
{"kind":"shape","id":"sh/o7ah4nm5","slide":15,"bbox":[844,390,360,170]}
{"kind":"shape","id":"sh/361gvilk","slide":15,"bbox":[844,390,7,170]}
{"kind":"textbox","id":"sh/25sf2d4z","slide":15,"text":"全程留痕","textPreview":"全程留痕","textChars":4,"textLines":1,"bbox":[868,412,314,40]}
{"kind":"textbox","id":"sh/dc3y1s3m","slide":15,"text":"访问、建议、修改、审批和执行结果均可审计。","textPreview":"访问、建议、修改、审批和执行结果均可审计。","textChars":21,"textLines":1,"bbox":[868,464,314,78]}
{"kind":"notes","id":"nt/vaxsvy10","slide":15,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/gny5sjyp","slide":16,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/ih0jedob","slide":16,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/8z2h8bq1","slide":16,"text":"先用 8 周证明价值,再决定扩大范围\nProve the value in eight weeks before scaling.","textPreview":"先用 8 周证明价值,再决定扩大范围 | Prove the value in eight weeks before scaling.","textChars":65,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/9kby1g7m","slide":16,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ytkf2h8j","slide":16,"text":"16","textPreview":"16","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/zutgvm94","slide":16,"bbox":[66,340,1100,0]}
{"kind":"shape","id":"sh/kv2h4rqp","slide":16,"bbox":[54,322,38,38]}
{"kind":"textbox","id":"sh/lwbyxwra","slide":16,"text":"第 1 周","textPreview":"第 1 周","textChars":5,"textLines":1,"bbox":[49,206,200,28]}
{"kind":"textbox","id":"sh/ip4zel83","slide":16,"text":"选定利润专项","textPreview":"选定利润专项","textChars":6,"textLines":1,"bbox":[49,250,205,55]}
{"kind":"textbox","id":"sh/3qdg7qpo","slide":16,"text":"基线·口径·责任人","textPreview":"基线·口径·责任人","textChars":9,"textLines":1,"bbox":[49,394,205,84]}
{"kind":"shape","id":"sh/fm1gzq5o","slide":16,"bbox":[293,322,38,38]}
{"kind":"textbox","id":"sh/e1sf65o3","slide":16,"text":"第 1—2 周","textPreview":"第 1—2 周","textChars":7,"textLines":1,"bbox":[288,206,200,28]}
{"kind":"textbox","id":"sh/1ojy10ne","slide":16,"text":"连接现有数据","textPreview":"连接现有数据","textChars":6,"textLines":1,"bbox":[288,250,205,55]}
{"kind":"textbox","id":"sh/gnax8v6t","slide":16,"text":"数据清单·质量·统一口径","textPreview":"数据清单·质量·统一口径","textChars":12,"textLines":1,"bbox":[288,394,205,84]}
{"kind":"shape","id":"sh/nqlg3a5k","slide":16,"bbox":[532,322,38,38]}
{"kind":"textbox","id":"sh/2pcfa5oz","slide":16,"text":"第 3—4 周","textPreview":"第 3—4 周","textChars":7,"textLines":1,"bbox":[527,206,200,28]}
{"kind":"textbox","id":"sh/ps3y5knq","slide":16,"text":"发现机会与根因","textPreview":"发现机会与根因","textChars":7,"textLines":1,"bbox":[527,250,205,55]}
{"kind":"textbox","id":"sh/oruhcf65","slide":16,"text":"异常·影响金额·证据","textPreview":"异常·影响金额·证据","textChars":10,"textLines":1,"bbox":[527,394,205,84]}
{"kind":"shape","id":"sh/bulg7u5g","slide":16,"bbox":[771,322,38,38]}
{"kind":"textbox","id":"sh/atczepob","slide":16,"text":"第 5—6 周","textPreview":"第 5—6 周","textChars":7,"textLines":1,"bbox":[766,206,200,28]}
{"kind":"textbox","id":"sh/mpgj6t8j","slide":16,"text":"推动整改","textPreview":"推动整改","textChars":4,"textLines":1,"bbox":[766,250,205,55]}
{"kind":"textbox","id":"sh/7qp0zepo","slide":16,"text":"任务·期限·执行记录","textPreview":"任务·期限·执行记录","textChars":10,"textLines":1,"bbox":[766,394,205,84]}
{"kind":"shape","id":"sh/8by18jq9","slide":16,"bbox":[1010,322,38,38]}
{"kind":"textbox","id":"sh/9c7i1o7u","slide":16,"text":"第 7—8 周","textPreview":"第 7—8 周","textChars":7,"textLines":1,"bbox":[1005,206,200,28]}
{"kind":"textbox","id":"sh/ylwj2987","slide":16,"text":"验证并复制","textPreview":"验证并复制","textChars":5,"textLines":1,"bbox":[1005,250,205,55]}
{"kind":"textbox","id":"sh/zm50veps","slide":16,"text":"改善金额·验收·最佳实践","textPreview":"改善金额·验收·最佳实践","textChars":12,"textLines":1,"bbox":[1005,394,205,84]}
{"kind":"shape","id":"sh/kne14jqd","slide":16,"bbox":[42,550,1196,60]}
{"kind":"textbox","id":"sh/lo7ixo7y","slide":16,"text":"优先选择:数据可获得 · 影响可测算 · 动作可执行 · 八周可验证。","textPreview":"优先选择:数据可获得 · 影响可测算 · 动作可执行 · 八周可验证。","textChars":35,"textLines":1,"bbox":[66,567,1148,30]}
{"kind":"notes","id":"nt/gny5sjyp","slide":16,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/14bup87q","slide":17,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/ytc7a1gv","slide":17,"text":"玄谋智脑 · 连锁企业经营决策","textPreview":"玄谋智脑 · 连锁企业经营决策","textChars":15,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1c7e50ni","slide":17,"text":"验收看经营改善,不看功能数量\nMeasure business improvement, not feature count.","textPreview":"验收看经营改善,不看功能数量 | Measure business improvement, not feature count.","textChars":63,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/gbedwfmx","slide":17,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/rm5czq50","slide":17,"text":"17","textPreview":"17","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/6lwvql4v","slide":17,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,188,50,26]}
{"kind":"textbox","id":"sh/t8ne10n6","slide":17,"text":"经营结果","textPreview":"经营结果","textChars":4,"textLines":1,"bbox":[112,174,230,48]}
{"kind":"textbox","id":"sh/snedsvml","slide":17,"text":"贡献利润·成本·损耗·库存资金","textPreview":"贡献利润·成本·损耗·库存资金","textChars":15,"textLines":1,"bbox":[395,174,760,48]}
{"kind":"shape","id":"sh/jilcvq54","slide":17,"bbox":[112,239,1040,0]}
{"kind":"textbox","id":"sh/ihcvml4j","slide":17,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[42,274,50,26]}
{"kind":"textbox","id":"sh/4by9or6l","slide":17,"text":"问题发现","textPreview":"问题发现","textChars":4,"textLines":1,"bbox":[112,260,230,48]}
{"kind":"textbox","id":"sh/pc7qhwn6","slide":17,"text":"发现周期·有效异常率·影响覆盖","textPreview":"发现周期·有效异常率·影响覆盖","textChars":15,"textLines":1,"bbox":[395,260,760,48]}
{"kind":"shape","id":"sh/29grm1of","slide":17,"bbox":[112,325,1040,0]}
{"kind":"textbox","id":"sh/3ap8fm50","slide":17,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[42,360,50,26]}
{"kind":"textbox","id":"sh/gnepkr69","slide":17,"text":"执行闭环","textPreview":"执行闭环","textChars":4,"textLines":1,"bbox":[112,346,230,48]}
{"kind":"textbox","id":"sh/honqdwnu","slide":17,"text":"接收率·按期完成率·整改有效率","textPreview":"接收率·按期完成率·整改有效率","textChars":15,"textLines":1,"bbox":[395,346,760,48]}
{"kind":"shape","id":"sh/ulw7ihoj","slide":17,"bbox":[112,411,1040,0]}
{"kind":"textbox","id":"sh/fm58bm54","slide":17,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[42,446,50,26]}
{"kind":"textbox","id":"sh/0ji9wb6t","slide":17,"text":"组织复制","textPreview":"组织复制","textChars":4,"textLines":1,"bbox":[112,432,230,48]}
{"kind":"textbox","id":"sh/14rqpgne","slide":17,"text":"复制门店数·成功率·新店导入时间","textPreview":"复制门店数·成功率·新店导入时间","textChars":16,"textLines":1,"bbox":[395,432,760,48]}
{"kind":"shape","id":"sh/90nq9gfi","slide":17,"bbox":[112,497,1040,0]}
{"kind":"textbox","id":"sh/8ze9gbyx","slide":17,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[42,532,50,26]}
{"kind":"textbox","id":"sh/ny5876xc","slide":17,"text":"数据质量","textPreview":"数据质量","textChars":4,"textLines":1,"bbox":[112,518,230,48]}
{"kind":"textbox","id":"sh/mxw7e1gr","slide":17,"text":"口径一致·完整·及时·可追溯","textPreview":"口径一致·完整·及时·可追溯","textChars":14,"textLines":1,"bbox":[395,518,760,48]}
{"kind":"shape","id":"sh/lwnq5gf6","slide":17,"bbox":[112,583,1040,0]}
{"kind":"shape","id":"sh/0vepcbyl","slide":17,"bbox":[42,612,1196,42]}
{"kind":"textbox","id":"sh/zul836xg","slide":17,"text":"项目启动时即确认基线、口径和外部影响因素,避免将自然波动误认为系统收益。","textPreview":"项目启动时即确认基线、口径和外部影响因素,避免将自然波动误认为系统收益。","textChars":36,"textLines":1,"bbox":[64,622,1152,24]}
{"kind":"notes","id":"nt/14bup87q","slide":17,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
{"kind":"slide","id":"sl/y5wne50z","slide":18,"title":"玄谋智脑","textShapes":4}
{"kind":"textbox","id":"sh/4felwzu5","slide":18,"text":"玄谋智脑","textPreview":"玄谋智脑","textChars":4,"textLines":1,"bbox":[42,35,240,30]}
{"kind":"textbox","id":"sh/wrelszu9","slide":18,"text":"先用 8 周,找到第一批可验证的利润机会\nStart with the first measurable profit opportunities.","textPreview":"先用 8 周,找到第一批可验证的利润机会 | Start with the first measurable profit opportunities.","textChars":74,"textLines":2,"bbox":[42,160,1040,210]}
{"kind":"textbox","id":"sh/hsn2l4bu","slide":18,"text":"再决定如何扩大应用范围 Scale only after the value is proven.","textPreview":"再决定如何扩大应用范围 Scale only after the value is proven.","textChars":50,"textLines":1,"bbox":[42,420,850,52]}
{"kind":"shape","id":"sh/itw3upcf","slide":18,"bbox":[42,610,1196,0]}
{"kind":"textbox","id":"sh/je5knut0","slide":18,"text":"让问题更早被发现 · 让整改真正落地 · 让每一次改善复制到更多门店","textPreview":"让问题更早被发现 · 让整改真正落地 · 让每一次改善复制到更多门店","textChars":34,"textLines":1,"bbox":[42,636,1100,30]}
{"kind":"notes","id":"nt/y5wne50z","slide":18,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。"}
@@ -0,0 +1,456 @@
{"kind":"deck","id":"pr/grdqj0","name":"Deck"}
{"kind":"layout","layoutId":"/ppt/slideMasters/slideMaster1.xml","name":"Master","type":"master"}
{"kind":"layout","layoutId":"/ppt/slideLayouts/slideLayout1.xml","name":"Title Slide","type":"title"}
{"kind":"slide","id":"sl/y90nupkv","slide":1,"title":"玄谋智脑 / Xuanmou Intelligence","textShapes":4}
{"kind":"textbox","id":"sh/ts7md4r2","slide":1,"text":"玄谋智脑 / Xuanmou Intelligence","textPreview":"玄谋智脑 / Xuanmou Intelligence","textChars":27,"textLines":1,"bbox":[42,34,360,36]}
{"kind":"textbox","id":"sh/547294r6","slide":1,"text":"看清利润,才谈得上管住门店\nSee the profit clearly. Run every store with confidence.","textPreview":"看清利润,才谈得上管住门店 | See the profit clearly. Run every store with confidence.","textChars":70,"textLines":2,"bbox":[42,180,990,180]}
{"kind":"textbox","id":"sh/k3yl0zql","slide":1,"text":"面向连锁企业的行业数字本体与 AI 经营智脑 A decision intelligence layer for multi-site operators","textPreview":"面向连锁企业的行业数字本体与 AI 经营智脑 A decision intelligence layer for multi-site operators","textChars":78,"textLines":1,"bbox":[42,402,870,48]}
{"kind":"shape","id":"sh/7qp4be9c","slide":1,"bbox":[42,615,1196,0]}
{"kind":"textbox","id":"sh/65g3298r","slide":1,"text":"对外保密版 · 案例与金额均为匿名示意\nConfidential external edition · Cases and figures are anonymized illustrations","textPreview":"对外保密版 · 案例与金额均为匿名示意 | Confidential external edition · Cases and figures are anonymized illustrations","textChars":98,"textLines":2,"bbox":[42,640,620,24]}
{"kind":"notes","id":"nt/y90nupkv","slide":1,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/hwbqtkby","slide":2,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":13}
{"kind":"textbox","id":"sh/cnupgny5","slide":2,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/9072xkry","slide":2,"text":"老板最终要判断三件事\nThree decisions matter most to the owner.","textPreview":"老板最终要判断三件事 | Three decisions matter most to the owner.","textChars":52,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/ozy1ofad","slide":2,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/b29kza94","slide":2,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/a10jqpsj","slide":2,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,190,80,48]}
{"kind":"shape","id":"sh/x4r21kru","slide":2,"bbox":[42,248,350,0]}
{"kind":"textbox","id":"sh/w3i1sfa9","slide":2,"text":"哪里在亏钱? / Where are we losing money?","textPreview":"哪里在亏钱? / Where are we losing money?","textChars":35,"textLines":1,"bbox":[42,278,350,52]}
{"kind":"textbox","id":"sh/r65knqtk","slide":2,"text":"门店、SKU、促销、库存、人力中,哪些利润漏洞最应该先处理?\nWhich profit leaks across stores, SKUs, promotions, inventory and labor should be fixed first?","textPreview":"门店、SKU、促销、库存、人力中,哪些利润漏洞最应该先处理? | Which profit leaks across stores, SKUs, promotions, inventory and labor should be fixed first?","textChars":125,"textLines":2,"bbox":[42,352,350,140]}
{"kind":"textbox","id":"sh/q5wjelsz","slide":2,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[443,190,80,48]}
{"kind":"shape","id":"sh/ove9o7yd","slide":2,"bbox":[443,248,350,0]}
{"kind":"textbox","id":"sh/9wnqhczy","slide":2,"text":"哪些动作能增利? / Which actions will improve profit?","textPreview":"哪些动作能增利? / Which actions will improve profit?","textChars":45,"textLines":1,"bbox":[443,278,350,52]}
{"kind":"textbox","id":"sh/mtwrmxg7","slide":2,"text":"不只找问题,还要测算影响、给出方案、跟踪执行并验证结果。\nQuantify the impact, recommend actions, track execution and verify the outcome.","textPreview":"不只找问题,还要测算影响、给出方案、跟踪执行并验证结果。 | Quantify the impact, recommend actions, track execution and verify the outcome.","textChars":108,"textLines":2,"bbox":[443,352,350,140]}
{"kind":"textbox","id":"sh/nu58f2hs","slide":2,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[844,190,80,48]}
{"kind":"shape","id":"sh/wjy9sry9","slide":2,"bbox":[844,248,350,0]}
{"kind":"textbox","id":"sh/xk7qlczu","slide":2,"text":"扩张后还能管住吗? / Can we stay in control as we scale?","textPreview":"扩张后还能管住吗? / Can we stay in control as we scale?","textChars":47,"textLines":1,"bbox":[844,278,350,52]}
{"kind":"textbox","id":"sh/ahwrqhgj","slide":2,"text":"从 30 家到 300 家门店,有效经验能否被低成本、高质量地复制?\nCan proven practices be replicated from 30 to 300 stores, consistently and at low cost?","textPreview":"从 30 家到 300 家门店,有效经验能否被低成本、高质量地复制? | Can proven practices be replicated from 30 to 300 stores, consistently and at low cost?","textChars":122,"textLines":2,"bbox":[844,352,350,140]}
{"kind":"textbox","id":"sh/bip8jmho","slide":2,"text":"不是看更多报表,而是将数据转化为可验证的经营改善。\nThe goal is not more reports, but measurable operating improvement.","textPreview":"不是看更多报表,而是将数据转化为可验证的经营改善。 | The goal is not more reports, but measurable operating improvement.","textChars":93,"textLines":2,"bbox":[42,590,1100,42]}
{"kind":"notes","id":"nt/hwbqtkby","slide":2,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/ofy9wn61","slide":3,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/batgjixs","slide":3,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/cza94vmx","slide":3,"text":"数据很多,利润去向仍然说不清\nPlenty of data, but no clear view of where profit goes.","textPreview":"数据很多,利润去向仍然说不清 | Plenty of data, but no clear view of where profit goes.","textChars":70,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/d0jax03i","slide":3,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/298ryl4v","slide":3,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/3ah8rqlg","slide":3,"bbox":[42,188,360,160]}
{"kind":"shape","id":"sh/obq90bml","slide":3,"bbox":[42,188,7,160]}
{"kind":"textbox","id":"sh/pcjqtg36","slide":3,"text":"营收 / Revenue","textPreview":"营收 / Revenue","textChars":12,"textLines":1,"bbox":[66,210,314,40]}
{"kind":"textbox","id":"sh/m5cra54z","slide":3,"text":"营收增长,利润为何没有同步?\nWhy is profit not keeping pace with revenue?","textPreview":"营收增长,利润为何没有同步? | Why is profit not keeping pace with revenue?","textChars":59,"textLines":2,"bbox":[66,262,314,68]}
{"kind":"shape","id":"sh/n6ls3alk","slide":3,"bbox":[443,188,360,160]}
{"kind":"shape","id":"sh/n2l4fq98","slide":3,"bbox":[443,188,7,160]}
{"kind":"textbox","id":"sh/m1c3mlsn","slide":3,"text":"门店 / Stores","textPreview":"门店 / Stores","textChars":11,"textLines":1,"bbox":[467,210,314,40]}
{"kind":"textbox","id":"sh/943mhgre","slide":3,"text":"哪些门店看似赚钱,实际占用资金?\nWhich stores appear profitable but tie up cash?","textPreview":"哪些门店看似赚钱,实际占用资金? | Which stores appear profitable but tie up cash?","textChars":64,"textLines":2,"bbox":[467,262,314,68]}
{"kind":"shape","id":"sh/83ulovat","slide":3,"bbox":[844,188,360,160]}
{"kind":"shape","id":"sh/v6l4jq94","slide":3,"bbox":[844,188,7,160]}
{"kind":"textbox","id":"sh/a5c3ql8z","slide":3,"text":"促销 / Promotions","textPreview":"促销 / Promotions","textChars":15,"textLines":1,"bbox":[868,210,314,40]}
{"kind":"textbox","id":"sh/x8nml0ra","slide":3,"text":"哪些活动增加订单,却消耗利润?\nWhich campaigns add orders but destroy profit?","textPreview":"哪些活动增加订单,却消耗利润? | Which campaigns add orders but destroy profit?","textChars":62,"textLines":2,"bbox":[868,262,314,68]}
{"kind":"shape","id":"sh/w7ulsvqp","slide":3,"bbox":[42,390,360,160]}
{"kind":"shape","id":"sh/ja54na9g","slide":3,"bbox":[42,390,7,160]}
{"kind":"textbox","id":"sh/i9w3u58v","slide":3,"text":"SKU","textPreview":"SKU","textChars":3,"textLines":1,"bbox":[66,412,314,40]}
{"kind":"textbox","id":"sh/e10f2twf","slide":3,"text":"哪些商品销量不低,却毛利不足?\nWhich products sell well but contribute too little margin?","textPreview":"哪些商品销量不低,却毛利不足? | Which products sell well but contribute too little margin?","textChars":74,"textLines":2,"bbox":[66,464,314,68]}
{"kind":"shape","id":"sh/f29gbyx0","slide":3,"bbox":[443,390,360,160]}
{"kind":"shape","id":"sh/03ix43e5","slide":3,"bbox":[443,390,7,160]}
{"kind":"textbox","id":"sh/14ryd8fq","slide":3,"text":"人力 / Labor","textPreview":"人力 / Labor","textChars":10,"textLines":1,"bbox":[467,412,314,40]}
{"kind":"textbox","id":"sh/6d0fytg3","slide":3,"text":"哪些时段人员闲置,高峰又缺人?\nWhen are teams idle, yet understaffed at peak times?","textPreview":"哪些时段人员闲置,高峰又缺人? | When are teams idle, yet understaffed at peak times?","textChars":68,"textLines":2,"bbox":[467,464,314,68]}
{"kind":"shape","id":"sh/re9g7yxo","slide":3,"bbox":[844,390,360,160]}
{"kind":"shape","id":"sh/sfix03y9","slide":3,"bbox":[844,390,7,160]}
{"kind":"textbox","id":"sh/tgry9ofu","slide":3,"text":"止损 / Loss control","textPreview":"止损 / Loss control","textChars":17,"textLines":1,"bbox":[868,412,314,40]}
{"kind":"textbox","id":"sh/a9kfadwn","slide":3,"text":"哪些门店应整改、迁址、缩编或关停?\nWhich stores should be fixed, relocated, resized or closed?","textPreview":"哪些门店应整改、迁址、缩编或关停? | Which stores should be fixed, relocated, resized or closed?","textChars":77,"textLines":2,"bbox":[868,464,314,68]}
{"kind":"notes","id":"nt/ofy9wn61","slide":3,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/jyx0ra1s","slide":4,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":22}
{"kind":"textbox","id":"sh/knex8j21","slide":4,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1cj2d8b6","slide":4,"text":"把异常处理成有结果的经营行动\nTurn exceptions into actions with measurable outcomes.","textPreview":"把异常处理成有结果的经营行动 | Turn exceptions into actions with measurable outcomes.","textChars":69,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/0ba143al","slide":4,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/rm1k7yt4","slide":4,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/ql8jytsj","slide":4,"bbox":[82,350,1090,0]}
{"kind":"shape","id":"sh/doj29oba","slide":4,"bbox":[54,332,36,36]}
{"kind":"textbox","id":"sh/sna103ap","slide":4,"text":"1","textPreview":"1","textChars":1,"textLines":1,"bbox":[54,337,36,24]}
{"kind":"textbox","id":"sh/3ihk3et8","slide":4,"text":"发现 / Detect","textPreview":"发现 / Detect","textChars":11,"textLines":1,"bbox":[44,235,150,40]}
{"kind":"textbox","id":"sh/ih8ju9sn","slide":4,"text":"利润异常\nProfit exception","textPreview":"利润异常 | Profit exception","textChars":21,"textLines":2,"bbox":[44,400,164,78]}
{"kind":"shape","id":"sh/kbm987y5","slide":4,"bbox":[253,332,36,36]}
{"kind":"textbox","id":"sh/5cva1cfq","slide":4,"text":"2","textPreview":"2","textChars":1,"textLines":1,"bbox":[253,337,36,24]}
{"kind":"textbox","id":"sh/i94r6xgz","slide":4,"text":"穿透 / Drill down","textPreview":"穿透 / Drill down","textChars":15,"textLines":1,"bbox":[243,235,150,40]}
{"kind":"textbox","id":"sh/jadsz2xk","slide":4,"text":"区域·门店·SKU·班次\nRegion · Store · SKU · Shift","textPreview":"区域·门店·SKU·班次 | Region · Store · SKU · Shift","textChars":41,"textLines":2,"bbox":[243,400,164,78]}
{"kind":"shape","id":"sh/w72947yt","slide":4,"bbox":[452,332,36,36]}
{"kind":"textbox","id":"sh/x8vaxsfe","slide":4,"text":"3","textPreview":"3","textChars":1,"textLines":1,"bbox":[452,337,36,24]}
{"kind":"textbox","id":"sh/a5kr2xg3","slide":4,"text":"测算 / Quantify","textPreview":"测算 / Quantify","textChars":13,"textLines":1,"bbox":[442,235,150,40]}
{"kind":"textbox","id":"sh/v6tsv2xo","slide":4,"text":"影响金额与优先级\nFinancial impact and priority","textPreview":"影响金额与优先级 | Financial impact and priority","textChars":38,"textLines":2,"bbox":[442,400,164,78]}
{"kind":"shape","id":"sh/g36tgryd","slide":4,"bbox":[651,332,36,36]}
{"kind":"textbox","id":"sh/h4fa9wfy","slide":4,"text":"4","textPreview":"4","textChars":1,"textLines":1,"bbox":[651,337,36,24]}
{"kind":"textbox","id":"sh/p0batw72","slide":4,"text":"整改 / Act","textPreview":"整改 / Act","textChars":8,"textLines":1,"bbox":[641,235,150,40]}
{"kind":"textbox","id":"sh/oz29krqh","slide":4,"text":"动作·责任人·期限\nAction · Owner · Deadline","textPreview":"动作·责任人·期限 | Action · Owner · Deadline","textChars":35,"textLines":2,"bbox":[641,400,164,78]}
{"kind":"shape","id":"sh/3ytsrmpw","slide":4,"bbox":[850,332,36,36]}
{"kind":"textbox","id":"sh/2xkrih8b","slide":4,"text":"5","textPreview":"5","textChars":1,"textLines":1,"bbox":[850,337,36,24]}
{"kind":"textbox","id":"sh/1wbapc7q","slide":4,"text":"验证 / Verify","textPreview":"验证 / Verify","textChars":11,"textLines":1,"bbox":[840,235,150,40]}
{"kind":"textbox","id":"sh/gv29g7q5","slide":4,"text":"利润是否真正改善\nConfirm real profit improvement","textPreview":"利润是否真正改善 | Confirm real profit improvement","textChars":40,"textLines":2,"bbox":[840,400,164,78]}
{"kind":"shape","id":"sh/fu9sn2p0","slide":4,"bbox":[1049,332,36,36]}
{"kind":"textbox","id":"sh/et0reh8f","slide":4,"text":"6","textPreview":"6","textChars":1,"textLines":1,"bbox":[1049,337,36,24]}
{"kind":"textbox","id":"sh/tsrqlc7u","slide":4,"text":"沉淀 / Codify","textPreview":"沉淀 / Codify","textChars":11,"textLines":1,"bbox":[1039,235,150,40]}
{"kind":"textbox","id":"sh/sri9s7q9","slide":4,"text":"更新企业最佳实践\nUpdate company best practices","textPreview":"更新企业最佳实践 | Update company best practices","textChars":38,"textLines":2,"bbox":[1039,400,164,78]}
{"kind":"shape","id":"sh/ilwf69kv","slide":4,"bbox":[42,552,1196,58]}
{"kind":"textbox","id":"sh/jm5gze1g","slide":4,"text":"关键不是“发现问题”,而是“把问题变成可复制的利润改善”。\nThe value lies in turning issues into repeatable profit improvement.","textPreview":"关键不是“发现问题”,而是“把问题变成可复制的利润改善”。 | The value lies in turning issues into repeatable profit improvement.","textChars":98,"textLines":2,"bbox":[66,568,1148,30]}
{"kind":"notes","id":"nt/jyx0ra1s","slide":4,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/i107q5of","slide":5,"title":"匿名复合案例 · SKU 组合决策 Anonymous composite case · SKU portfolio","textShapes":15}
{"kind":"textbox","id":"sh/fe94nm1w","slide":5,"text":"匿名复合案例 · SKU 组合决策 Anonymous composite case · SKU portfolio","textPreview":"匿名复合案例 · SKU 组合决策 Anonymous composite case · SKU portfolio","textChars":59,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/dgbulwnm","slide":5,"text":"SKU 过多,往往增加的是复杂度和成本\nMore SKUs often mean more cost, not more choice.","textPreview":"SKU 过多,往往增加的是复杂度和成本 | More SKUs often mean more cost, not more choice.","textChars":68,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/cf2tcr61","slide":5,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/z2tcnm5s","slide":5,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/yhkbe1o7","slide":5,"text":"480","textPreview":"480","textChars":3,"textLines":1,"bbox":[42,182,190,72]}
{"kind":"textbox","id":"sh/l4bupwny","slide":5,"text":"在售 SKU / Active SKUs","textPreview":"在售 SKU / Active SKUs","textChars":20,"textLines":1,"bbox":[42,256,190,30]}
{"kind":"textbox","id":"sh/032tgr6d","slide":5,"text":"后 20% SKU 仅贡献约 3% 销售额,却持续占用库存资金。\nThe bottom 20% of SKUs contribute about 3% of sales while continuously tying up inventory cash.","textPreview":"后 20% SKU 仅贡献约 3% 销售额,却持续占用库存资金。 | The bottom 20% of SKUs contribute about 3% of sales while continuously tying up inventory cash.","textChars":128,"textLines":2,"bbox":[262,190,800,76]}
{"kind":"shape","id":"sh/n6dcr65o","slide":5,"bbox":[42,328,270,170]}
{"kind":"textbox","id":"sh/m5kbi1oj","slide":5,"text":"37 个 / 37 items","textPreview":"37 个 / 37 items","textChars":15,"textLines":1,"bbox":[66,354,222,64]}
{"kind":"textbox","id":"sh/w32dkbuh","slide":5,"text":"低销量·低毛利·高损耗\nLow sales · Low margin · High waste","textPreview":"低销量·低毛利·高损耗 | Low sales · Low margin · High waste","textChars":47,"textLines":2,"bbox":[66,434,222,40]}
{"kind":"shape","id":"sh/x4vedgvm","slide":5,"bbox":[341,328,270,170]}
{"kind":"textbox","id":"sh/ahkvi1cb","slide":5,"text":"9 个 / 9 items","textPreview":"9 个 / 9 items","textChars":13,"textLines":1,"bbox":[365,354,222,64]}
{"kind":"textbox","id":"sh/v2twb6dw","slide":5,"text":"高销量但低贡献利润 / High sales but low profit contribution","textPreview":"高销量但低贡献利润 / High sales but low profit contribution","textChars":50,"textLines":1,"bbox":[365,434,222,40]}
{"kind":"shape","id":"sh/k7mxovud","slide":5,"bbox":[640,328,270,170]}
{"kind":"textbox","id":"sh/58vehgvy","slide":5,"text":"16 个 / 16 items","textPreview":"16 个 / 16 items","textChars":15,"textLines":1,"bbox":[664,354,222,64]}
{"kind":"textbox","id":"sh/i54fmlc7","slide":5,"text":"可共享或替换原料 / Shared or substitutable ingredients","textPreview":"可共享或替换原料 / Shared or substitutable ingredients","textChars":46,"textLines":1,"bbox":[664,434,222,40]}
{"kind":"shape","id":"sh/j6dwfqds","slide":5,"bbox":[939,328,270,170]}
{"kind":"textbox","id":"sh/sb6xsvu9","slide":5,"text":"22 个 / 22 items","textPreview":"22 个 / 22 items","textChars":15,"textLines":1,"bbox":[963,354,222,64]}
{"kind":"textbox","id":"sh/tcfel0vu","slide":5,"text":"价格带重叠 / Overlapping price points","textPreview":"价格带重叠 / Overlapping price points","textChars":32,"textLines":1,"bbox":[963,434,222,40]}
{"kind":"shape","id":"sh/hgrmpwj2","slide":5,"bbox":[42,535,1196,85]}
{"kind":"textbox","id":"sh/gfi5grih","slide":5,"text":"模拟测算:释放库存资金约 80 万元 · 年减少报损约 35 万元 · 综合毛利率提升约 0.6 个百分点\nIllustrative estimate: release RMB 0.8m in inventory cash · reduce annual waste by RMB 0.35m · lift gross margin by about 0.6 pp","textPreview":"模拟测算:释放库存资金约 80 万元 · 年减少报损约 35 万元 · 综合毛利率提升约 0.6 个百分点 | Illustrative estimate: release RMB 0.8m in inventory cash · reduce annual waste b...","textChars":182,"textLines":2,"bbox":[68,558,1140,40]}
{"kind":"notes","id":"nt/i107q5of","slide":5,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/x8f69ofe","slide":6,"title":"匿名复合案例 · 门店 A-017 Anonymous composite case · Store A-017","textShapes":10}
{"kind":"textbox","id":"sh/svmt4v6t","slide":6,"text":"匿名复合案例 · 门店 A-017 Anonymous composite case · Store A-017","textPreview":"匿名复合案例 · 门店 A-017 Anonymous composite case · Store A-017","textChars":57,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/yhg7epsj","slide":6,"text":"排班的关键,是工时跟着客流走\nLabor hours should follow demand.","textPreview":"排班的关键,是工时跟着客流走 | Labor hours should follow demand.","textChars":48,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/zi98nu94","slide":6,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/87ipkzal","slide":6,"text":"06","textPreview":"06","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/98rqt4r6","slide":6,"bbox":[42,182,362,314]}
{"kind":"shape","id":"sh/ml07i9sv","slide":6,"bbox":[42,182,7,314]}
{"kind":"textbox","id":"sh/7m98ru9g","slide":6,"text":"发现 / Detect","textPreview":"发现 / Detect","textChars":11,"textLines":1,"bbox":[66,204,316,40]}
{"kind":"textbox","id":"sh/oryp8fah","slide":6,"text":"· 工作日上午存在闲置工时\n· 周五晚高峰经常缺人\n· 班次依据历史习惯\n· 加班集中在少数岗位\nIdle labor on weekday mornings · Understaffed on Friday peaks · Habit-based shifts · Overtime concentrated in a few roles","textPreview":"· 工作日上午存在闲置工时 | · 周五晚高峰经常缺人 | · 班次依据历史习惯 | · 加班集中在少数岗位 | Idle labor on weekday mornings · Understaffed on Friday peaks · Habit-based shif...","textChars":170,"textLines":5,"bbox":[66,256,316,222]}
{"kind":"shape","id":"sh/pc76hkr2","slide":6,"bbox":[458,182,362,314]}
{"kind":"shape","id":"sh/h4bupgn6","slide":6,"bbox":[458,182,7,314]}
{"kind":"textbox","id":"sh/w32twb6l","slide":6,"text":"动作 / Actions","textPreview":"动作 / Actions","textChars":12,"textLines":1,"bbox":[482,204,316,40]}
{"kind":"textbox","id":"sh/v2tcn650","slide":6,"text":"· 按半小时预测工作量\n· 调整早晚班起止时间\n· 高峰增加小时工\n· 备餐前移至客流爬升前\nForecast every 30 minutes · Adjust shift times · Add hourly staff at peaks · Move prep ahead of demand","textPreview":"· 按半小时预测工作量 | · 调整早晚班起止时间 | · 高峰增加小时工 | · 备餐前移至客流爬升前 | Forecast every 30 minutes · Adjust shift times · Add hourly staff at peaks · Move ...","textChars":149,"textLines":5,"bbox":[482,256,316,222]}
{"kind":"shape","id":"sh/u1kbu1ov","slide":6,"bbox":[874,182,364,314]}
{"kind":"shape","id":"sh/5svutgni","slide":6,"bbox":[874,182,7,314]}
{"kind":"textbox","id":"sh/47mt0b6x","slide":6,"text":"验证 / Verify","textPreview":"验证 / Verify","textChars":11,"textLines":1,"bbox":[898,204,318,40]}
{"kind":"textbox","id":"sh/j6dcr65c","slide":6,"text":"同时监控:\n\n· 人工成本\n· 出品时效\n· 顾客满意度\n\n避免单纯压缩人力。\nMonitor labor cost, service speed and customer satisfaction together. Do not simply cut headcount.","textPreview":"同时监控: | | · 人工成本 | · 出品时效 | · 顾客满意度 | | 避免单纯压缩人力。 | Monitor labor cost, service speed and customer satisfaction together. Do not simply...","textChars":138,"textLines":8,"bbox":[898,256,318,222]}
{"kind":"shape","id":"sh/i54bylor","slide":6,"bbox":[42,535,1196,85]}
{"kind":"textbox","id":"sh/twfux0ne","slide":6,"text":"模拟测算:单店每月节约 1.8 万元;复制到 60 家门店,年度改善空间约 1,296 万元。\nIllustrative estimate: RMB 18k saved per store per month; about RMB 12.96m annual upside across 60 stores.","textPreview":"模拟测算:单店每月节约 1.8 万元;复制到 60 家门店,年度改善空间约 1,296 万元。 | Illustrative estimate: RMB 18k saved per store per month; about RMB 12.96m annual upsid...","textChars":154,"textLines":2,"bbox":[66,557,1148,42]}
{"kind":"notes","id":"nt/x8f69ofe","slide":6,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/gnmp4jqx","slide":7,"title":"匿名复合案例 · 营销活动 X Anonymous composite case · Campaign X","textShapes":17}
{"kind":"textbox","id":"sh/s3ml0v61","slide":7,"text":"匿名复合案例 · 营销活动 X Anonymous composite case · Campaign X","textPreview":"匿名复合案例 · 营销活动 X Anonymous composite case · Campaign X","textChars":54,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/cb2tkvap","slide":7,"text":"订单增长,不等于促销赚钱\nMore orders do not always mean a profitable campaign.","textPreview":"订单增长,不等于促销赚钱 | More orders do not always mean a profitable campaign.","textChars":66,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/dcbud0ra","slide":7,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ydkbm5sv","slide":7,"text":"07","textPreview":"07","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/zedcfa9g","slide":7,"bbox":[42,186,350,170]}
{"kind":"textbox","id":"sh/kzmdova1","slide":7,"text":"+23%","textPreview":"+23%","textChars":4,"textLines":1,"bbox":[66,212,302,64]}
{"kind":"textbox","id":"sh/l0vuh0rm","slide":7,"text":"订单增长 / Order growth","textPreview":"订单增长 / Order growth","textChars":19,"textLines":1,"bbox":[66,292,302,40]}
{"kind":"shape","id":"sh/eh0ba1sr","slide":7,"bbox":[42,378,350,170]}
{"kind":"textbox","id":"sh/fi9c369c","slide":7,"text":"负值 / Negative","textPreview":"负值 / Negative","textChars":13,"textLines":1,"bbox":[66,404,302,64]}
{"kind":"textbox","id":"sh/baxkjqlk","slide":7,"text":"穿透成本后的活动贡献利润\nCampaign contribution after full costs","textPreview":"穿透成本后的活动贡献利润 | Campaign contribution after full costs","textChars":51,"textLines":2,"bbox":[66,484,302,40]}
{"kind":"textbox","id":"sh/a9ojq5kz","slide":7,"text":"活动为什么亏钱 / Why the campaign loses money","textPreview":"活动为什么亏钱 / Why the campaign loses money","textChars":38,"textLines":1,"bbox":[454,186,360,40]}
{"kind":"textbox","id":"sh/xcz2l03q","slide":7,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[454,258,42,28]}
{"kind":"textbox","id":"sh/cbq1sv25","slide":7,"text":"低毛利商品占比上升 / More low-margin items in the mix","textPreview":"低毛利商品占比上升 / More low-margin items in the mix","textChars":44,"textLines":1,"bbox":[510,254,650,40]}
{"kind":"shape","id":"sh/n6x0fqlo","slide":7,"bbox":[510,300,650,0]}
{"kind":"textbox","id":"sh/25ojml43","slide":7,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[454,323,42,28]}
{"kind":"textbox","id":"sh/p8fih03e","slide":7,"text":"高价值会员获得无差别优惠\nHigh-value members receive blanket discounts","textPreview":"高价值会员获得无差别优惠 | High-value members receive blanket discounts","textChars":57,"textLines":2,"bbox":[510,319,650,40]}
{"kind":"shape","id":"sh/o761ov2t","slide":7,"bbox":[510,365,650,0]}
{"kind":"textbox","id":"sh/f2d0b6lc","slide":7,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[454,388,42,28]}
{"kind":"textbox","id":"sh/eh4jil4r","slide":7,"text":"促销订单替代了原价订单\nDiscounted orders replace full-price orders","textPreview":"促销订单替代了原价订单 | Discounted orders replace full-price orders","textChars":55,"textLines":2,"bbox":[510,384,650,40]}
{"kind":"shape","id":"sh/id4ju1oz","slide":7,"bbox":[510,430,650,0]}
{"kind":"textbox","id":"sh/jedkn654","slide":7,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[454,453,42,28]}
{"kind":"textbox","id":"sh/4fm1wb6p","slide":7,"text":"只评价订单和营收,没有评价增量利润\nOrders and revenue measured; incremental profit ignored","textPreview":"只评价订单和营收,没有评价增量利润 | Orders and revenue measured; incremental profit ignored","textChars":73,"textLines":2,"bbox":[510,449,650,40]}
{"kind":"shape","id":"sh/50v2pgna","slide":7,"bbox":[510,495,650,0]}
{"kind":"shape","id":"sh/q143ylov","slide":7,"bbox":[454,544,746,67]}
{"kind":"textbox","id":"sh/r2dkrq5g","slide":7,"text":"用“每投入 1 元营销费用增加多少贡献利润”评价活动。\nEvaluate each campaign by contribution profit generated per RMB 1 of marketing spend.","textPreview":"用“每投入 1 元营销费用增加多少贡献利润”评价活动。 | Evaluate each campaign by contribution profit generated per RMB 1 of marketing spend.","textChars":113,"textLines":2,"bbox":[478,562,700,34]}
{"kind":"notes","id":"nt/gnmp4jqx","slide":7,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/fu1gfa1s","slide":8,"title":"匿名复合案例 · 门店 D-006 Anonymous composite case · Store D-006","textShapes":19}
{"kind":"textbox","id":"sh/07atgnmp","slide":8,"text":"匿名复合案例 · 门店 D-006 Anonymous composite case · Store D-006","textPreview":"匿名复合案例 · 门店 D-006 Anonymous composite case · Store D-006","textChars":57,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/18byd4zy","slide":8,"text":"关店前,先把四种选择算清楚\nCompare the options before deciding to close a store.","textPreview":"关店前,先把四种选择算清楚 | Compare the options before deciding to close a store.","textChars":67,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/g72x4zyd","slide":8,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ri9g7uhw","slide":8,"text":"08","textPreview":"08","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/6h0fypgb","slide":8,"bbox":[42,180,340,55]}
{"kind":"textbox","id":"sh/tkby9kzm","slide":8,"text":"方案 / Option","textPreview":"方案 / Option","textChars":11,"textLines":1,"bbox":[60,197,304,26]}
{"kind":"shape","id":"sh/sjix0zy1","slide":8,"bbox":[382,180,378,55]}
{"kind":"textbox","id":"sh/je9g3ahk","slide":8,"text":"12 个月模拟结果 / 12-month scenario","textPreview":"12 个月模拟结果 / 12-month scenario","textChars":29,"textLines":1,"bbox":[400,197,342,26]}
{"kind":"shape","id":"sh/id0fu50z","slide":8,"bbox":[760,180,478,55]}
{"kind":"textbox","id":"sh/o7ydoret","slide":8,"text":"决策建议 / Recommendation","textPreview":"决策建议 / Recommendation","textChars":21,"textLines":1,"bbox":[778,197,442,26]}
{"kind":"shape","id":"sh/98rehwve","slide":8,"bbox":[42,235,340,72]}
{"kind":"textbox","id":"sh/m5gvmhwn","slide":8,"text":"继续经营 / Continue operating","textPreview":"继续经营 / Continue operating","textChars":25,"textLines":1,"bbox":[60,256,304,35]}
{"kind":"shape","id":"sh/n6pwfmd8","slide":8,"bbox":[382,235,378,72]}
{"kind":"textbox","id":"sh/0jydkreh","slide":8,"text":"预计亏损 92 万 / Estimated loss: RMB 0.92m","textPreview":"预计亏损 92 万 / Estimated loss: RMB 0.92m","textChars":37,"textLines":1,"bbox":[400,256,342,35]}
{"kind":"shape","id":"sh/1k7edwv2","slide":8,"bbox":[760,235,478,72]}
{"kind":"textbox","id":"sh/ehgvihwr","slide":8,"text":"不建议 / Not recommended","textPreview":"不建议 / Not recommended","textChars":21,"textLines":1,"bbox":[778,256,442,35]}
{"kind":"shape","id":"sh/zipwbmdc","slide":8,"bbox":[42,307,340,72]}
{"kind":"textbox","id":"sh/kfixwbe1","slide":8,"text":"投入整改 / Invest in a turnaround","textPreview":"投入整改 / Invest in a turnaround","textChars":29,"textLines":1,"bbox":[60,328,304,35]}
{"kind":"shape","id":"sh/lgbepgvm","slide":8,"bbox":[382,307,378,72]}
{"kind":"textbox","id":"sh/tw7e9gnq","slide":8,"text":"预计亏损降至 35 万\nEstimated loss falls to RMB 0.35m","textPreview":"预计亏损降至 35 万 | Estimated loss falls to RMB 0.35m","textChars":45,"textLines":2,"bbox":[400,328,342,35]}
{"kind":"shape","id":"sh/svydgb65","slide":8,"bbox":[760,307,478,72]}
{"kind":"textbox","id":"sh/7u5w765k","slide":8,"text":"高风险,设止损线 / High risk; set a stop-loss","textPreview":"高风险,设止损线 / High risk; set a stop-loss","textChars":37,"textLines":1,"bbox":[778,328,442,35]}
{"kind":"shape","id":"sh/6twve1oz","slide":8,"bbox":[42,379,340,72]}
{"kind":"textbox","id":"sh/5sne5wne","slide":8,"text":"缩小面积 / Reduce footprint","textPreview":"缩小面积 / Reduce footprint","textChars":23,"textLines":1,"bbox":[60,400,304,35]}
{"kind":"shape","id":"sh/kredcr6t","slide":8,"bbox":[382,379,378,72]}
{"kind":"textbox","id":"sh/jq5w365o","slide":8,"text":"预计接近盈亏平衡 / Near break-even","textPreview":"预计接近盈亏平衡 / Near break-even","textChars":26,"textLines":1,"bbox":[400,400,342,35]}
{"kind":"shape","id":"sh/i5wva1o3","slide":8,"bbox":[760,379,478,72]}
{"kind":"textbox","id":"sh/x4ne1wni","slide":8,"text":"租约可重谈时考虑 / Consider if the lease can be renegotiated","textPreview":"租约可重谈时考虑 / Consider if the lease can be renegotiated","textChars":52,"textLines":1,"bbox":[778,400,442,35]}
{"kind":"shape","id":"sh/w3ed8r6x","slide":8,"bbox":[42,451,340,72]}
{"kind":"textbox","id":"sh/m9sb2x4v","slide":8,"text":"关停并迁移会员 / Close and migrate members","textPreview":"关停并迁移会员 / Close and migrate members","textChars":35,"textLines":1,"bbox":[60,472,304,35]}
{"kind":"shape","id":"sh/na1sb2lg","slide":8,"bbox":[382,451,378,72]}
{"kind":"textbox","id":"sh/8bat47ml","slide":8,"text":"预计减少亏损 76 万\nEstimated loss reduction: RMB 0.76m","textPreview":"预计减少亏损 76 万 | Estimated loss reduction: RMB 0.76m","textChars":47,"textLines":2,"bbox":[400,472,342,35]}
{"kind":"shape","id":"sh/9w3uds36","slide":8,"bbox":[760,451,478,72]}
{"kind":"textbox","id":"sh/y5sbed4j","slide":8,"text":"优先建议 / Preferred option","textPreview":"优先建议 / Preferred option","textChars":23,"textLines":1,"bbox":[778,472,442,35]}
{"kind":"textbox","id":"sh/z61s7il4","slide":8,"text":"AI 不替老板关店;它让经验判断具有数据依据、情景测算和退出预案。\nAI does not close stores. It adds evidence, scenario analysis and an exit plan to management judgment.","textPreview":"AI 不替老板关店;它让经验判断具有数据依据、情景测算和退出预案。 | AI does not close stores. It adds evidence, scenario analysis and an exit plan to management judgment.","textChars":136,"textLines":2,"bbox":[42,565,1160,44]}
{"kind":"notes","id":"nt/fu1gfa1s","slide":8,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/udsvah03","slide":9,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/va103ep4","slide":9,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1cfmhgne","slide":9,"text":"四级管理,各自看清该做的事\nOne operating view, four levels of accountability.","textPreview":"四级管理,各自看清该做的事 | One operating view, four levels of accountability.","textChars":64,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/0b65obm9","slide":9,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/nex4jq5k","slide":9,"text":"09","textPreview":"09","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/mdonql4z","slide":9,"bbox":[42,190,265,316]}
{"kind":"textbox","id":"sh/9gzml0nq","slide":9,"text":"老板 / Owner","textPreview":"老板 / Owner","textChars":10,"textLines":1,"bbox":[64,214,220,46]}
{"kind":"textbox","id":"sh/ofq5svm5","slide":9,"text":"看结果 / Review outcomes","textPreview":"看结果 / Review outcomes","textChars":21,"textLines":1,"bbox":[64,296,220,44]}
{"kind":"textbox","id":"sh/bih4na5w","slide":9,"text":"利润·风险·资源投向\nProfit · Risk · Capital allocation","textPreview":"利润·风险·资源投向 | Profit · Risk · Capital allocation","textChars":45,"textLines":2,"bbox":[64,386,220,72]}
{"kind":"textbox","id":"sh/ah8nu54b","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[310,323,30,36]}
{"kind":"shape","id":"sh/oza1gfyh","slide":9,"bbox":[341,190,265,316]}
{"kind":"textbox","id":"sh/p0ji9kf2","slide":9,"text":"总部 / Head office","textPreview":"总部 / Head office","textChars":16,"textLines":1,"bbox":[363,214,220,46]}
{"kind":"textbox","id":"sh/2xsjepgb","slide":9,"text":"找原因 / Find causes","textPreview":"找原因 / Find causes","textChars":17,"textLines":1,"bbox":[363,296,220,44]}
{"kind":"textbox","id":"sh/3y107axw","slide":9,"text":"跨区域对标·政策评估\nCross-region benchmarks · Policy review","textPreview":"跨区域对标·政策评估 | Cross-region benchmarks · Policy review","textChars":50,"textLines":2,"bbox":[363,386,220,72]}
{"kind":"textbox","id":"sh/cnu1kzyd","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[609,323,30,36]}
{"kind":"shape","id":"sh/do3id4fy","slide":9,"bbox":[640,190,265,316]}
{"kind":"textbox","id":"sh/qlcjipgn","slide":9,"text":"区域 / Region","textPreview":"区域 / Region","textChars":11,"textLines":1,"bbox":[662,214,220,46]}
{"kind":"textbox","id":"sh/bml0buxs","slide":9,"text":"推整改 / Drive action","textPreview":"推整改 / Drive action","textChars":18,"textLines":1,"bbox":[662,296,220,44]}
{"kind":"textbox","id":"sh/0ru1ozyp","slide":9,"text":"门店分级·任务·验收\nStore tiers · Tasks · Acceptance","textPreview":"门店分级·任务·验收 | Store tiers · Tasks · Acceptance","textChars":43,"textLines":2,"bbox":[662,386,220,72]}
{"kind":"textbox","id":"sh/lsn2h4fa","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[908,323,30,36]}
{"kind":"shape","id":"sh/98ji147e","slide":9,"bbox":[939,190,265,316]}
{"kind":"textbox","id":"sh/87a18zqt","slide":9,"text":"店长 / Store manager","textPreview":"店长 / Store manager","textChars":18,"textLines":1,"bbox":[961,214,220,46]}
{"kind":"textbox","id":"sh/76h0zup8","slide":9,"text":"做动作 / Execute","textPreview":"做动作 / Execute","textChars":13,"textLines":1,"bbox":[961,296,220,44]}
{"kind":"textbox","id":"sh/ml8j6p8n","slide":9,"text":"日目标·偏差·行动建议\nDaily targets · Gaps · Actions","textPreview":"日目标·偏差·行动建议 | Daily targets · Gaps · Actions","textChars":42,"textLines":2,"bbox":[961,386,220,72]}
{"kind":"shape","id":"sh/hcji5o7a","slide":9,"bbox":[42,550,1196,60]}
{"kind":"textbox","id":"sh/wba1cjqp","slide":9,"text":"结果回到经营大盘:执行不是终点,改善结果才是。\nResults return to the operating view: completion is not the goal; improvement is.","textPreview":"结果回到经营大盘:执行不是终点,改善结果才是。 | Results return to the operating view: completion is not the goal; improvement is.","textChars":105,"textLines":2,"bbox":[66,567,1148,30]}
{"kind":"notes","id":"nt/udsvah03","slide":9,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/m90b6t0r","slide":10,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":7}
{"kind":"textbox","id":"sh/r6pcv6lw","slide":10,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/xc3mho32","slide":10,"text":"AI 给依据,经营决策仍由管理者负责\nAI provides evidence. Management owns the decision.","textPreview":"AI 给依据,经营决策仍由管理者负责 | AI provides evidence. Management owns the decision.","textChars":70,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/cbu58j2h","slide":10,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/zelojyl8","slide":10,"text":"10","textPreview":"10","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/ydcnatkn","slide":10,"bbox":[42,182,560,366]}
{"kind":"shape","id":"sh/l036l83y","slide":10,"bbox":[42,182,7,366]}
{"kind":"textbox","id":"sh/kzu5c32t","slide":10,"text":"AI 可以承担 / AI can support","textPreview":"AI 可以承担 / AI can support","textChars":24,"textLines":1,"bbox":[66,204,514,40]}
{"kind":"textbox","id":"sh/725onyl4","slide":10,"text":"· 理解并关联跨系统数据\n· 持续扫描异常\n· 穿透至门店、SKU、班次和订单\n· 调用行业规则与历史案例\n· 推演方案对利润和现金流的影响\n· 跟踪执行并验证结果","textPreview":"· 理解并关联跨系统数据 | · 持续扫描异常 | · 穿透至门店、SKU、班次和订单 | · 调用行业规则与历史案例 | · 推演方案对利润和现金流的影响 | · 跟踪执行并验证结果","textChars":82,"textLines":6,"bbox":[66,256,514,274]}
{"kind":"shape","id":"sh/m1cnetkj","slide":10,"bbox":[678,182,560,366]}
{"kind":"shape","id":"sh/s7yt4b21","slide":10,"bbox":[678,182,7,366]}
{"kind":"textbox","id":"sh/d87uxg3m","slide":10,"text":"必须由管理者决定 / Management must decide","textPreview":"必须由管理者决定 / Management must decide","textChars":33,"textLines":1,"bbox":[702,204,514,40]}
{"kind":"textbox","id":"sh/q5gb21kb","slide":10,"text":"· 价格调整\n· 人员处置\n· 供应商更换\n· 门店迁址与关停\n· 重大资源投入\n\n所有高影响决策都应留下依据、审批与执行记录。\nPrice changes · Personnel actions · Supplier changes · Store relocation or closure · Major investment\nAll high-impact decisions require evidence, approval and execution records.","textPreview":"· 价格调整 | · 人员处置 | · 供应商更换 | · 门店迁址与关停 | · 重大资源投入 | | 所有高影响决策都应留下依据、审批与执行记录。 | Price changes · Personnel actions · Supplier changes · Sto...","textChars":242,"textLines":9,"bbox":[702,256,514,274]}
{"kind":"notes","id":"nt/m90b6t0r","slide":10,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/jetc3ut0","slide":11,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":24}
{"kind":"textbox","id":"sh/g3qtkj6l","slide":11,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/xcryxg7y","slide":11,"text":"BI 解释过去,玄谋智脑推动下一步\nBI explains the past. Xuanmou drives the next action.","textPreview":"BI 解释过去,玄谋智脑推动下一步 | BI explains the past. Xuanmou drives the next action.","textChars":71,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/wbih4b6d","slide":11,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/n69grmpw","slide":11,"text":"11","textPreview":"11","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/250zy18b","slide":11,"bbox":[42,170,228,50]}
{"kind":"textbox","id":"sh/98rytw72","slide":11,"text":"维度 / Dimension","textPreview":"维度 / Dimension","textChars":14,"textLines":1,"bbox":[58,185,196,25]}
{"kind":"shape","id":"sh/o7ih0r6h","slide":11,"bbox":[270,170,410,50]}
{"kind":"textbox","id":"sh/72t03qp0","slide":11,"text":"普通 BI / Conventional BI","textPreview":"普通 BI / Conventional BI","textChars":23,"textLines":1,"bbox":[286,185,378,25]}
{"kind":"shape","id":"sh/61kzalof","slide":11,"bbox":[680,170,558,50]}
{"kind":"textbox","id":"sh/ofqtgnyt","slide":11,"text":"玄谋智脑 / Xuanmou Intelligence","textPreview":"玄谋智脑 / Xuanmou Intelligence","textChars":27,"textLines":1,"bbox":[696,185,526,25]}
{"kind":"shape","id":"sh/9gza9sze","slide":11,"bbox":[42,220,228,67]}
{"kind":"textbox","id":"sh/mdobedg3","slide":11,"text":"定位 / Role","textPreview":"定位 / Role","textChars":9,"textLines":1,"bbox":[58,238,196,38]}
{"kind":"shape","id":"sh/nehs7iho","slide":11,"bbox":[270,220,410,67]}
{"kind":"textbox","id":"sh/0b6tc3yx","slide":11,"text":"展示报表 / Display reports","textPreview":"展示报表 / Display reports","textChars":22,"textLines":1,"bbox":[286,238,378,38]}
{"kind":"shape","id":"sh/1cfa58zi","slide":11,"bbox":[680,220,558,67]}
{"kind":"textbox","id":"sh/epobatgr","slide":11,"text":"驱动经营决策与改善 / Drive decisions and improvement","textPreview":"驱动经营决策与改善 / Drive decisions and improvement","textChars":43,"textLines":1,"bbox":[696,238,526,38]}
{"kind":"shape","id":"sh/zaxs3yhc","slide":11,"bbox":[42,287,228,67]}
{"kind":"textbox","id":"sh/cn6t83y1","slide":11,"text":"业务语义 / Business context","textPreview":"业务语义 / Business context","textChars":23,"textLines":1,"bbox":[58,305,196,38]}
{"kind":"shape","id":"sh/dofa18z6","slide":11,"bbox":[270,287,410,67]}
{"kind":"textbox","id":"sh/tsnip0ny","slide":11,"text":"字段和指标 / Fields and metrics","textPreview":"字段和指标 / Fields and metrics","textChars":26,"textLines":1,"bbox":[286,305,378,38]}
{"kind":"shape","id":"sh/87ehgv6d","slide":11,"bbox":[680,287,558,67]}
{"kind":"textbox","id":"sh/7650nq5s","slide":11,"text":"门店、商品、人员、会员等行业本体\nIndustry ontology for stores, products, people and members","textPreview":"门店、商品、人员、会员等行业本体 | Industry ontology for stores, products, people and members","textChars":75,"textLines":2,"bbox":[696,305,526,38]}
{"kind":"shape","id":"sh/65wzelo7","slide":11,"bbox":[42,354,228,67]}
{"kind":"textbox","id":"sh/l43ilgn2","slide":11,"text":"问题发现 / Issue detection","textPreview":"问题发现 / Issue detection","textChars":22,"textLines":1,"bbox":[58,372,196,38]}
{"kind":"shape","id":"sh/k3uhcb6h","slide":11,"bbox":[270,354,410,67]}
{"kind":"textbox","id":"sh/j2lgjq5w","slide":11,"text":"人主动看数据 / People search the data","textPreview":"人主动看数据 / People search the data","textChars":31,"textLines":1,"bbox":[286,372,378,38]}
{"kind":"shape","id":"sh/y1czalob","slide":11,"bbox":[680,354,558,67]}
{"kind":"textbox","id":"sh/p07ixkn6","slide":11,"text":"系统持续发现、分级与推送\nSystem detects, prioritizes and alerts continuously","textPreview":"系统持续发现、分级与推送 | System detects, prioritizes and alerts continuously","textChars":64,"textLines":2,"bbox":[696,372,526,38]}
{"kind":"shape","id":"sh/4zyhofml","slide":11,"bbox":[42,421,228,67]}
{"kind":"textbox","id":"sh/m58fih43","slide":11,"text":"问题处理 / Issue resolution","textPreview":"问题处理 / Issue resolution","textChars":23,"textLines":1,"bbox":[58,439,196,38]}
{"kind":"shape","id":"sh/n61wbmlo","slide":11,"bbox":[270,421,410,67]}
{"kind":"textbox","id":"sh/o7axk7m9","slide":11,"text":"报告异常 / Report exceptions","textPreview":"报告异常 / Report exceptions","textChars":24,"textLines":1,"bbox":[286,439,378,38]}
{"kind":"shape","id":"sh/98jedc3u","slide":11,"bbox":[680,421,558,67]}
{"kind":"textbox","id":"sh/eh8fex47","slide":11,"text":"归因、测算、方案和整改任务\nRoot cause, impact, recommendation and action task","textPreview":"归因、测算、方案和整改任务 | Root cause, impact, recommendation and action task","textChars":64,"textLines":2,"bbox":[696,439,526,38]}
{"kind":"shape","id":"sh/z2hw72lc","slide":11,"bbox":[42,488,228,67]}
{"kind":"textbox","id":"sh/03qxg7mx","slide":11,"text":"结果验证 / Outcome validation","textPreview":"结果验证 / Outcome validation","textChars":25,"textLines":1,"bbox":[58,506,196,38]}
{"kind":"shape","id":"sh/14ze9c3i","slide":11,"bbox":[270,488,410,67]}
{"kind":"textbox","id":"sh/ydcfq1kb","slide":11,"text":"通常不跟踪 / Usually not tracked","textPreview":"通常不跟踪 / Usually not tracked","textChars":27,"textLines":1,"bbox":[286,506,378,38]}
{"kind":"shape","id":"sh/jylwj6lw","slide":11,"bbox":[680,488,558,67]}
{"kind":"textbox","id":"sh/3qhsfypc","slide":11,"text":"验证改善并更新最佳实践\nVerify improvement and update best practices","textPreview":"验证改善并更新最佳实践 | Verify improvement and update best practices","textChars":56,"textLines":2,"bbox":[696,506,526,38]}
{"kind":"shape","id":"sh/ip8bmtor","slide":11,"bbox":[42,555,228,67]}
{"kind":"textbox","id":"sh/5sjah872","slide":11,"text":"长期价值 / Long-term value","textPreview":"长期价值 / Long-term value","textChars":22,"textLines":1,"bbox":[58,573,196,38]}
{"kind":"shape","id":"sh/4rato36h","slide":11,"bbox":[270,555,410,67]}
{"kind":"textbox","id":"sh/v2hsbyp0","slide":11,"text":"报表越来越多 / More and more reports","textPreview":"报表越来越多 / More and more reports","textChars":30,"textLines":1,"bbox":[286,573,378,38]}
{"kind":"shape","id":"sh/u18bit8f","slide":11,"bbox":[680,555,558,67]}
{"kind":"textbox","id":"sh/h4zado76","slide":11,"text":"行业模型与企业知识越用越成熟\nIndustry models and company knowledge improve with use","textPreview":"行业模型与企业知识越用越成熟 | Industry models and company knowledge improve with use","textChars":69,"textLines":2,"bbox":[696,573,526,38]}
{"kind":"notes","id":"nt/jetc3ut0","slide":11,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/8f2psfyx","slide":12,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":23}
{"kind":"textbox","id":"sh/alwbitsn","slide":12,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1gbm9s3a","slide":12,"text":"五项基础能力,支撑门店规模化管理\nFive capabilities that support scalable operations.","textPreview":"五项基础能力,支撑门店规模化管理 | Five capabilities that support scalable operations.","textChars":68,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/0f2lgnmp","slide":12,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ra943il8","slide":12,"text":"12","textPreview":"12","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/q903ad4n","slide":12,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,185,54,28]}
{"kind":"textbox","id":"sh/dcbm583y","slide":12,"text":"数据资产化 / Data foundation","textPreview":"数据资产化 / Data foundation","textChars":23,"textLines":1,"bbox":[118,171,250,54]}
{"kind":"textbox","id":"sh/sb2lcnmd","slide":12,"text":"数据通起来 / Connect the data","textPreview":"数据通起来 / Connect the data","textChars":24,"textLines":1,"bbox":[422,171,250,54]}
{"kind":"textbox","id":"sh/b6d4f2lc","slide":12,"text":"一个数字、一个来源 / One number, one source","textPreview":"一个数字、一个来源 / One number, one source","textChars":34,"textLines":1,"bbox":[720,171,450,54]}
{"kind":"shape","id":"sh/a543mx4r","slide":12,"bbox":[118,238,1050,0]}
{"kind":"textbox","id":"sh/wvupgz6t","slide":12,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[42,274,54,28]}
{"kind":"textbox","id":"sh/xw3q94ne","slide":12,"text":"运营指标化 / Operational metrics","textPreview":"运营指标化 / Operational metrics","textChars":27,"textLines":1,"bbox":[118,260,250,54]}
{"kind":"textbox","id":"sh/atc7epon","slide":12,"text":"问题浮出来 / Surface the issues","textPreview":"问题浮出来 / Surface the issues","textChars":26,"textLines":1,"bbox":[422,260,250,54]}
{"kind":"textbox","id":"sh/bulo7u58","slide":12,"text":"异常能穿透到根因 / Trace exceptions to root causes","textPreview":"异常能穿透到根因 / Trace exceptions to root causes","textChars":42,"textLines":1,"bbox":[720,260,450,54]}
{"kind":"shape","id":"sh/orapcf6h","slide":12,"bbox":[118,327,1050,0]}
{"kind":"textbox","id":"sh/9sj65kn2","slide":12,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[42,363,54,28]}
{"kind":"textbox","id":"sh/mps7a5or","slide":12,"text":"战略穿透化 / Strategy execution","textPreview":"战略穿透化 / Strategy execution","textChars":26,"textLines":1,"bbox":[118,349,250,54]}
{"kind":"textbox","id":"sh/nq1o3a5w","slide":12,"text":"目标落下去 / Translate goals into action","textPreview":"目标落下去 / Translate goals into action","textChars":35,"textLines":1,"bbox":[422,349,250,54]}
{"kind":"textbox","id":"sh/0nap8f6l","slide":12,"text":"战略到区域、门店和个人\nFrom strategy to regions, stores and individuals","textPreview":"战略到区域、门店和个人 | From strategy to regions, stores and individuals","textChars":60,"textLines":2,"bbox":[720,349,450,54]}
{"kind":"shape","id":"sh/1oj61kn6","slide":12,"bbox":[118,416,1050,0]}
{"kind":"textbox","id":"sh/hkbm5wzu","slide":12,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[42,452,54,28]}
{"kind":"textbox","id":"sh/gj25cry9","slide":12,"text":"态势感知化 / Risk sensing","textPreview":"态势感知化 / Risk sensing","textChars":20,"textLines":1,"bbox":[118,438,250,54]}
{"kind":"textbox","id":"sh/fit436ho","slide":12,"text":"风险早知道 / See risks earlier","textPreview":"风险早知道 / See risks earlier","textChars":25,"textLines":1,"bbox":[422,438,250,54]}
{"kind":"textbox","id":"sh/uh0na1g3","slide":12,"text":"从事后救火到事前预防 / Move from firefighting to prevention","textPreview":"从事后救火到事前预防 / Move from firefighting to prevention","textChars":49,"textLines":1,"bbox":[720,438,450,54]}
{"kind":"shape","id":"sh/tgrm1wzy","slide":12,"bbox":[118,505,1050,0]}
{"kind":"textbox","id":"sh/sfi58ryd","slide":12,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[42,541,54,28]}
{"kind":"textbox","id":"sh/7u94zmhs","slide":12,"text":"知识沉淀化 / Knowledge capture","textPreview":"知识沉淀化 / Knowledge capture","textChars":25,"textLines":1,"bbox":[118,527,250,54]}
{"kind":"textbox","id":"sh/6t0n6hg7","slide":12,"text":"组织越来越聪明 / Make the organization smarter","textPreview":"组织越来越聪明 / Make the organization smarter","textChars":39,"textLines":1,"bbox":[422,527,250,54]}
{"kind":"textbox","id":"sh/dcv6dgz2","slide":12,"text":"优秀能力不再依赖少数人\nBest practices no longer depend on a few people","textPreview":"优秀能力不再依赖少数人 | Best practices no longer depend on a few people","textChars":59,"textLines":2,"bbox":[720,527,450,54]}
{"kind":"shape","id":"sh/cbm5kbyh","slide":12,"bbox":[118,594,1050,0]}
{"kind":"notes","id":"nt/8f2psfyx","slide":12,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/hgzapcr6","slide":13,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/3yxgbqdg","slide":13,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/q50nydsj","slide":13,"text":"门店越多,复制优秀做法的价值越大\nThe larger the network, the greater the value of replication.","textPreview":"门店越多,复制优秀做法的价值越大 | The larger the network, the greater the value of replication.","textChars":78,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/bq9orito","slide":13,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/o3i5w3ad","slide":13,"text":"13","textPreview":"13","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/p4r6p8by","slide":13,"bbox":[42,182,360,250]}
{"kind":"shape","id":"sh/21gnuts7","slide":13,"bbox":[42,182,7,250]}
{"kind":"textbox","id":"sh/32ponyts","slide":13,"text":"不依赖能人 / Less dependence on star performers","textPreview":"不依赖能人 / Less dependence on star performers","textChars":42,"textLines":1,"bbox":[66,204,314,40]}
{"kind":"textbox","id":"sh/gzy5s3a1","slide":13,"text":"优秀店长的做法沉淀为规则、案例和 SOP。\nTurn strong store-manager practices into rules, cases and SOPs.","textPreview":"优秀店长的做法沉淀为规则、案例和 SOP。 | Turn strong store-manager practices into rules, cases and SOPs.","textChars":85,"textLines":2,"bbox":[66,256,314,158]}
{"kind":"shape","id":"sh/1076lobm","slide":13,"bbox":[443,182,360,250]}
{"kind":"shape","id":"sh/hcfy9k3u","slide":13,"bbox":[443,182,7,250]}
{"kind":"textbox","id":"sh/gb6x0zm9","slide":13,"text":"扩张不失控 / Scale without losing control","textPreview":"扩张不失控 / Scale without losing control","textChars":36,"textLines":1,"bbox":[467,204,314,40]}
{"kind":"textbox","id":"sh/vaxg7ulo","slide":13,"text":"验证有效的改善方案,可按门店特征分类复制。\nReplicate proven actions by store profile.","textPreview":"验证有效的改善方案,可按门店特征分类复制。 | Replicate proven actions by store profile.","textChars":64,"textLines":2,"bbox":[467,256,314,158]}
{"kind":"shape","id":"sh/u9ofyp43","slide":13,"bbox":[844,182,360,250]}
{"kind":"shape","id":"sh/t8fy5k3i","slide":13,"bbox":[844,182,7,250]}
{"kind":"textbox","id":"sh/876xwfmx","slide":13,"text":"能力持续复利 / Capabilities compound","textPreview":"能力持续复利 / Capabilities compound","textChars":30,"textLines":1,"bbox":[868,204,314,40]}
{"kind":"textbox","id":"sh/7mdg3als","slide":13,"text":"场景、模型、AI 建议与决策反馈相互增强。\nScenarios, models, AI recommendations and decision feedback reinforce one another.","textPreview":"场景、模型、AI 建议与决策反馈相互增强。 | Scenarios, models, AI recommendations and decision feedback reinforce one another.","textChars":104,"textLines":2,"bbox":[868,256,314,158]}
{"kind":"shape","id":"sh/6l4fu547","slide":13,"bbox":[120,520,980,0]}
{"kind":"shape","id":"sh/lkvy103m","slide":13,"bbox":[104,502,38,38]}
{"kind":"textbox","id":"sh/kjmxsfm1","slide":13,"text":"30 家 / 30 stores","textPreview":"30 家 / 30 stores","textChars":16,"textLines":1,"bbox":[94,555,150,28]}
{"kind":"textbox","id":"sh/cnqh8fux","slide":13,"text":"靠人盯 / Managed by people","textPreview":"靠人盯 / Managed by people","textChars":23,"textLines":1,"bbox":[94,589,170,24]}
{"kind":"shape","id":"sh/xozyhkbi","slide":13,"bbox":[584,502,38,38]}
{"kind":"textbox","id":"sh/q18f65cr","slide":13,"text":"100 家 / 100 stores","textPreview":"100 家 / 100 stores","textChars":18,"textLines":1,"bbox":[574,555,150,28]}
{"kind":"textbox","id":"sh/bmhgfatc","slide":13,"text":"靠机制 / Managed by process","textPreview":"靠机制 / Managed by process","textChars":24,"textLines":1,"bbox":[574,589,170,24]}
{"kind":"shape","id":"sh/oz6x4vul","slide":13,"bbox":[1064,502,38,38]}
{"kind":"textbox","id":"sh/p0zyd0b6","slide":13,"text":"300 家 / 300 stores","textPreview":"300 家 / 300 stores","textChars":18,"textLines":1,"bbox":[1054,555,150,28]}
{"kind":"textbox","id":"sh/2xof2lcv","slide":13,"text":"靠模型复制 / Scaled through models","textPreview":"靠模型复制 / Scaled through models","textChars":29,"textLines":1,"bbox":[1054,589,170,24]}
{"kind":"notes","id":"nt/hgzapcr6","slide":13,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/6lsnupw7","slide":14,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":8}
{"kind":"textbox","id":"sh/kre1k3y9","slide":14,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/xc7eds76","slide":14,"text":"真正的数据资产,是可追溯的经营能力\nA real data asset is a traceable operating capability.","textPreview":"真正的数据资产,是可追溯的经营能力 | A real data asset is a traceable operating capability.","textChars":72,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/wbydknq1","slide":14,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/jepwf2pc","slide":14,"text":"14","textPreview":"14","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/idgvmx8r","slide":14,"bbox":[42,180,560,365]}
{"kind":"shape","id":"sh/5grehs7i","slide":14,"bbox":[42,180,7,365]}
{"kind":"textbox","id":"sh/kfidonqx","slide":14,"text":"企业数据资产 / Enterprise data assets","textPreview":"企业数据资产 / Enterprise data assets","textChars":31,"textLines":1,"bbox":[66,202,514,40]}
{"kind":"textbox","id":"sh/zi5c3y98","slide":14,"text":"· 统一指标口径与责任关系\n· 门店、商品、人员、会员、供应商本体\n· 行业规则与异常模式\n· 决策、执行与验证结果\n· 最佳实践与风险知识\nCommon metric definitions and accountability · Business ontology · Industry rules · Decisions and validated outcomes · Best-practice knowledge","textPreview":"· 统一指标口径与责任关系 | · 门店、商品、人员、会员、供应商本体 | · 行业规则与异常模式 | · 决策、执行与验证结果 | · 最佳实践与风险知识 | Common metric definitions and accountability · Business ...","textChars":213,"textLines":6,"bbox":[66,254,514,273]}
{"kind":"shape","id":"sh/ehwvat8n","slide":14,"bbox":[678,180,560,365]}
{"kind":"shape","id":"sh/c3e1gjyd","slide":14,"bbox":[678,180,7,365]}
{"kind":"textbox","id":"sh/x4ni9ofy","slide":14,"text":"融资与尽调支持 / Financing and due-diligence support","textPreview":"融资与尽调支持 / Financing and due-diligence support","textChars":45,"textLines":1,"bbox":[702,202,514,40]}
{"kind":"textbox","id":"sh/a1wze9g7","slide":14,"text":"· 门店级损益与现金流\n· 收入稳定性分析\n· 风险预警与整改记录\n· 未来经营预测\n· 更完整、可追溯的经营证明\nStore-level P&L and cash flow · Revenue stability · Risk and remediation records · Forecasts · Traceable operating evidence","textPreview":"· 门店级损益与现金流 | · 收入稳定性分析 | · 风险预警与整改记录 | · 未来经营预测 | · 更完整、可追溯的经营证明 | Store-level P&L and cash flow · Revenue stability · Risk and remediat...","textChars":181,"textLines":6,"bbox":[702,254,514,273]}
{"kind":"textbox","id":"sh/b2507exs","slide":14,"text":"边界:提供数据与分析支持,不承诺银行授信或融资结果。\nScope: data and analytical support only; no promise of bank credit or financing outcomes.","textPreview":"边界:提供数据与分析支持,不承诺银行授信或融资结果。 | Scope: data and analytical support only; no promise of bank credit or financing outcomes.","textChars":116,"textLines":2,"bbox":[42,578,1000,34]}
{"kind":"notes","id":"nt/6lsnupw7","slide":14,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/vaxsvy10","slide":15,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/cbuh8nmh","slide":15,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/547mhg3m","slide":15,"text":"生产数据必须留在清晰的安全边界内\nProduction data must remain within clear security boundaries.","textPreview":"生产数据必须留在清晰的安全边界内 | Production data must remain within clear security boundaries.","textChars":78,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/k3y5ov21","slide":15,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/76p4jqls","slide":15,"text":"15","textPreview":"15","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/65gnqlk7","slide":15,"bbox":[42,180,360,170]}
{"kind":"shape","id":"sh/t87ml0ji","slide":15,"bbox":[42,180,7,170]}
{"kind":"textbox","id":"sh/s7y5sv2x","slide":15,"text":"部署边界 / Deployment boundary","textPreview":"部署边界 / Deployment boundary","textChars":26,"textLines":1,"bbox":[66,202,314,40]}
{"kind":"textbox","id":"sh/na5476l8","slide":15,"text":"不替代现有交易系统,只读或受控对接。\nDoes not replace transaction systems; read-only or controlled integration.","textPreview":"不替代现有交易系统,只读或受控对接。 | Does not replace transaction systems; read-only or controlled integration.","textChars":93,"textLines":2,"bbox":[66,254,314,78]}
{"kind":"shape","id":"sh/m9c3e1kn","slide":15,"bbox":[443,180,360,170]}
{"kind":"shape","id":"sh/wrm9kvep","slide":15,"bbox":[443,180,7,170]}
{"kind":"textbox","id":"sh/hsvat0fa","slide":15,"text":"最小权限 / Least privilege","textPreview":"最小权限 / Least privilege","textChars":22,"textLines":1,"bbox":[467,202,314,40]}
{"kind":"textbox","id":"sh/upkrilwj","slide":15,"text":"老板、总部、区域、门店按职责查看。\nAccess by role across owner, head office, region and store.","textPreview":"老板、总部、区域、门店按职责查看。 | Access by role across owner, head office, region and store.","textChars":77,"textLines":2,"bbox":[467,254,314,78]}
{"kind":"shape","id":"sh/vqdsrqx4","slide":15,"bbox":[844,180,360,170]}
{"kind":"shape","id":"sh/4vm9ovel","slide":15,"bbox":[844,180,7,170]}
{"kind":"textbox","id":"sh/5wvax0f6","slide":15,"text":"敏感保护 / Sensitive-data protection","textPreview":"敏感保护 / Sensitive-data protection","textChars":32,"textLines":1,"bbox":[868,202,314,40]}
{"kind":"textbox","id":"sh/it4rm5wv","slide":15,"text":"会员、薪酬、财务明细分级、脱敏与审计。\nClassify, mask and audit member, payroll and financial details.","textPreview":"会员、薪酬、财务明细分级、脱敏与审计。 | Classify, mask and audit member, payroll and financial details.","textChars":83,"textLines":2,"bbox":[868,254,314,78]}
{"kind":"shape","id":"sh/judsvqxg","slide":15,"bbox":[42,390,360,170]}
{"kind":"shape","id":"sh/0z29cbyh","slide":15,"bbox":[42,390,7,170]}
{"kind":"textbox","id":"sh/l0bqlgf2","slide":15,"text":"AI 可追溯 / Traceable AI","textPreview":"AI 可追溯 / Traceable AI","textChars":21,"textLines":1,"bbox":[66,412,314,40]}
{"kind":"textbox","id":"sh/1kjyt83e","slide":15,"text":"重要结论显示依据、时间、路径和适用边界。\nKey conclusions show evidence, timing, logic and scope.","textPreview":"重要结论显示依据、时间、路径和适用边界。 | Key conclusions show evidence, timing, logic and scope.","textChars":76,"textLines":2,"bbox":[66,464,314,78]}
{"kind":"shape","id":"sh/gjax03m9","slide":15,"bbox":[443,390,360,170]}
{"kind":"shape","id":"sh/fi1grylo","slide":15,"bbox":[443,390,7,170]}
{"kind":"textbox","id":"sh/ehsfyt43","slide":15,"text":"人工审批 / Human approval","textPreview":"人工审批 / Human approval","textChars":21,"textLines":1,"bbox":[467,412,314,40]}
{"kind":"textbox","id":"sh/p8jyx83q","slide":15,"text":"高影响决策必须经有权限的管理者审批。\nHigh-impact decisions require approval by authorized management.","textPreview":"高影响决策必须经有权限的管理者审批。 | High-impact decisions require approval by authorized management.","textChars":83,"textLines":2,"bbox":[467,464,314,78]}
{"kind":"shape","id":"sh/o7ah4nm5","slide":15,"bbox":[844,390,360,170]}
{"kind":"shape","id":"sh/361gvilk","slide":15,"bbox":[844,390,7,170]}
{"kind":"textbox","id":"sh/25sf2d4z","slide":15,"text":"全程留痕 / Full audit trail","textPreview":"全程留痕 / Full audit trail","textChars":23,"textLines":1,"bbox":[868,412,314,40]}
{"kind":"textbox","id":"sh/dc3y1s3m","slide":15,"text":"访问、建议、修改、审批和执行结果均可审计。\nAccess, recommendations, edits, approvals and outcomes are auditable.","textPreview":"访问、建议、修改、审批和执行结果均可审计。 | Access, recommendations, edits, approvals and outcomes are auditable.","textChars":91,"textLines":2,"bbox":[868,464,314,78]}
{"kind":"notes","id":"nt/vaxsvy10","slide":15,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/gny5sjyp","slide":16,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/ih0jedob","slide":16,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/8z2h8bq1","slide":16,"text":"先用 8 周证明价值,再决定扩大范围\nProve the value in eight weeks before scaling.","textPreview":"先用 8 周证明价值,再决定扩大范围 | Prove the value in eight weeks before scaling.","textChars":65,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/9kby1g7m","slide":16,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ytkf2h8j","slide":16,"text":"16","textPreview":"16","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/zutgvm94","slide":16,"bbox":[66,340,1100,0]}
{"kind":"shape","id":"sh/kv2h4rqp","slide":16,"bbox":[54,322,38,38]}
{"kind":"textbox","id":"sh/lwbyxwra","slide":16,"text":"第 1 周 / Week 1","textPreview":"第 1 周 / Week 1","textChars":14,"textLines":1,"bbox":[49,206,200,28]}
{"kind":"textbox","id":"sh/ip4zel83","slide":16,"text":"选定利润专项 / Select a profit initiative","textPreview":"选定利润专项 / Select a profit initiative","textChars":35,"textLines":1,"bbox":[49,250,205,55]}
{"kind":"textbox","id":"sh/3qdg7qpo","slide":16,"text":"基线·口径·责任人\nBaseline · Definition · Owner","textPreview":"基线·口径·责任人 | Baseline · Definition · Owner","textChars":39,"textLines":2,"bbox":[49,394,205,84]}
{"kind":"shape","id":"sh/fm1gzq5o","slide":16,"bbox":[293,322,38,38]}
{"kind":"textbox","id":"sh/e1sf65o3","slide":16,"text":"第 1—2 周 / Weeks 12","textPreview":"第 1—2 周 / Weeks 12","textChars":19,"textLines":1,"bbox":[288,206,200,28]}
{"kind":"textbox","id":"sh/1ojy10ne","slide":16,"text":"连接现有数据 / Connect existing data","textPreview":"连接现有数据 / Connect existing data","textChars":30,"textLines":1,"bbox":[288,250,205,55]}
{"kind":"textbox","id":"sh/gnax8v6t","slide":16,"text":"数据清单·质量·统一口径\nData inventory · Quality · Common definitions","textPreview":"数据清单·质量·统一口径 | Data inventory · Quality · Common definitions","textChars":58,"textLines":2,"bbox":[288,394,205,84]}
{"kind":"shape","id":"sh/nqlg3a5k","slide":16,"bbox":[532,322,38,38]}
{"kind":"textbox","id":"sh/2pcfa5oz","slide":16,"text":"第 3—4 周 / Weeks 34","textPreview":"第 3—4 周 / Weeks 34","textChars":19,"textLines":1,"bbox":[527,206,200,28]}
{"kind":"textbox","id":"sh/ps3y5knq","slide":16,"text":"发现机会与根因 / Find opportunities and causes","textPreview":"发现机会与根因 / Find opportunities and causes","textChars":39,"textLines":1,"bbox":[527,250,205,55]}
{"kind":"textbox","id":"sh/oruhcf65","slide":16,"text":"异常·影响金额·证据\nException · Financial impact · Evidence","textPreview":"异常·影响金额·证据 | Exception · Financial impact · Evidence","textChars":50,"textLines":2,"bbox":[527,394,205,84]}
{"kind":"shape","id":"sh/bulg7u5g","slide":16,"bbox":[771,322,38,38]}
{"kind":"textbox","id":"sh/atczepob","slide":16,"text":"第 5—6 周 / Weeks 56","textPreview":"第 5—6 周 / Weeks 56","textChars":19,"textLines":1,"bbox":[766,206,200,28]}
{"kind":"textbox","id":"sh/mpgj6t8j","slide":16,"text":"推动整改 / Drive corrective action","textPreview":"推动整改 / Drive corrective action","textChars":30,"textLines":1,"bbox":[766,250,205,55]}
{"kind":"textbox","id":"sh/7qp0zepo","slide":16,"text":"任务·期限·执行记录\nTask · Deadline · Execution record","textPreview":"任务·期限·执行记录 | Task · Deadline · Execution record","textChars":45,"textLines":2,"bbox":[766,394,205,84]}
{"kind":"shape","id":"sh/8by18jq9","slide":16,"bbox":[1010,322,38,38]}
{"kind":"textbox","id":"sh/9c7i1o7u","slide":16,"text":"第 7—8 周 / Weeks 78","textPreview":"第 7—8 周 / Weeks 78","textChars":19,"textLines":1,"bbox":[1005,206,200,28]}
{"kind":"textbox","id":"sh/ylwj2987","slide":16,"text":"验证并复制 / Verify and replicate","textPreview":"验证并复制 / Verify and replicate","textChars":28,"textLines":1,"bbox":[1005,250,205,55]}
{"kind":"textbox","id":"sh/zm50veps","slide":16,"text":"改善金额·验收·最佳实践\nImprovement value · Acceptance · Best practice","textPreview":"改善金额·验收·最佳实践 | Improvement value · Acceptance · Best practice","textChars":59,"textLines":2,"bbox":[1005,394,205,84]}
{"kind":"shape","id":"sh/kne14jqd","slide":16,"bbox":[42,550,1196,60]}
{"kind":"textbox","id":"sh/lo7ixo7y","slide":16,"text":"优先选择:数据可获得 · 影响可测算 · 动作可执行 · 八周可验证。\nPrioritize cases with available data, measurable impact, executable actions and results verifiable in eight weeks.","textPreview":"优先选择:数据可获得 · 影响可测算 · 动作可执行 · 八周可验证。 | Prioritize cases with available data, measurable impact, executable actions and results verifiable ...","textChars":150,"textLines":2,"bbox":[66,567,1148,30]}
{"kind":"notes","id":"nt/gny5sjyp","slide":16,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/14bup87q","slide":17,"title":"玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/ytc7a1gv","slide":17,"text":"玄谋智脑 · 连锁企业经营决策\nXuanmou Intelligence · Multi-site Operations","textPreview":"玄谋智脑 · 连锁企业经营决策 | Xuanmou Intelligence · Multi-site Operations","textChars":60,"textLines":2,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1c7e50ni","slide":17,"text":"验收看经营改善,不看功能数量\nMeasure business improvement, not feature count.","textPreview":"验收看经营改善,不看功能数量 | Measure business improvement, not feature count.","textChars":63,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/gbedwfmx","slide":17,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/rm5czq50","slide":17,"text":"17","textPreview":"17","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/6lwvql4v","slide":17,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,188,50,26]}
{"kind":"textbox","id":"sh/t8ne10n6","slide":17,"text":"经营结果 / Business outcomes","textPreview":"经营结果 / Business outcomes","textChars":24,"textLines":1,"bbox":[112,174,230,48]}
{"kind":"textbox","id":"sh/snedsvml","slide":17,"text":"贡献利润·成本·损耗·库存资金\nContribution profit · Cost · Waste · Inventory cash","textPreview":"贡献利润·成本·损耗·库存资金 | Contribution profit · Cost · Waste · Inventory cash","textChars":67,"textLines":2,"bbox":[395,174,760,48]}
{"kind":"shape","id":"sh/jilcvq54","slide":17,"bbox":[112,239,1040,0]}
{"kind":"textbox","id":"sh/ihcvml4j","slide":17,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[42,274,50,26]}
{"kind":"textbox","id":"sh/4by9or6l","slide":17,"text":"问题发现 / Issue detection","textPreview":"问题发现 / Issue detection","textChars":22,"textLines":1,"bbox":[112,260,230,48]}
{"kind":"textbox","id":"sh/pc7qhwn6","slide":17,"text":"发现周期·有效异常率·影响覆盖\nDetection cycle · Valid-exception rate · Impact coverage","textPreview":"发现周期·有效异常率·影响覆盖 | Detection cycle · Valid-exception rate · Impact coverage","textChars":72,"textLines":2,"bbox":[395,260,760,48]}
{"kind":"shape","id":"sh/29grm1of","slide":17,"bbox":[112,325,1040,0]}
{"kind":"textbox","id":"sh/3ap8fm50","slide":17,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[42,360,50,26]}
{"kind":"textbox","id":"sh/gnepkr69","slide":17,"text":"执行闭环 / Execution loop","textPreview":"执行闭环 / Execution loop","textChars":21,"textLines":1,"bbox":[112,346,230,48]}
{"kind":"textbox","id":"sh/honqdwnu","slide":17,"text":"接收率·按期完成率·整改有效率\nAcceptance · On-time completion · Remediation effectiveness","textPreview":"接收率·按期完成率·整改有效率 | Acceptance · On-time completion · Remediation effectiveness","textChars":75,"textLines":2,"bbox":[395,346,760,48]}
{"kind":"shape","id":"sh/ulw7ihoj","slide":17,"bbox":[112,411,1040,0]}
{"kind":"textbox","id":"sh/fm58bm54","slide":17,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[42,446,50,26]}
{"kind":"textbox","id":"sh/0ji9wb6t","slide":17,"text":"组织复制 / Organizational replication","textPreview":"组织复制 / Organizational replication","textChars":33,"textLines":1,"bbox":[112,432,230,48]}
{"kind":"textbox","id":"sh/14rqpgne","slide":17,"text":"复制门店数·成功率·新店导入时间\nStores replicated · Success rate · New-store ramp time","textPreview":"复制门店数·成功率·新店导入时间 | Stores replicated · Success rate · New-store ramp time","textChars":71,"textLines":2,"bbox":[395,432,760,48]}
{"kind":"shape","id":"sh/90nq9gfi","slide":17,"bbox":[112,497,1040,0]}
{"kind":"textbox","id":"sh/8ze9gbyx","slide":17,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[42,532,50,26]}
{"kind":"textbox","id":"sh/ny5876xc","slide":17,"text":"数据质量 / Data quality","textPreview":"数据质量 / Data quality","textChars":19,"textLines":1,"bbox":[112,518,230,48]}
{"kind":"textbox","id":"sh/mxw7e1gr","slide":17,"text":"口径一致·完整·及时·可追溯\nConsistent · Complete · Timely · Traceable","textPreview":"口径一致·完整·及时·可追溯 | Consistent · Complete · Timely · Traceable","textChars":57,"textLines":2,"bbox":[395,518,760,48]}
{"kind":"shape","id":"sh/lwnq5gf6","slide":17,"bbox":[112,583,1040,0]}
{"kind":"shape","id":"sh/0vepcbyl","slide":17,"bbox":[42,612,1196,42]}
{"kind":"textbox","id":"sh/zul836xg","slide":17,"text":"项目启动时即确认基线、口径和外部影响因素,避免将自然波动误认为系统收益。\nAgree the baseline, definitions and external factors at launch so normal variation is not mistaken for system impact.","textPreview":"项目启动时即确认基线、口径和外部影响因素,避免将自然波动误认为系统收益。 | Agree the baseline, definitions and external factors at launch so normal variation is not mistaken...","textChars":154,"textLines":2,"bbox":[64,622,1152,24]}
{"kind":"notes","id":"nt/14bup87q","slide":17,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/y5wne50z","slide":18,"title":"玄谋智脑 / Xuanmou Intelligence","textShapes":4}
{"kind":"textbox","id":"sh/4felwzu5","slide":18,"text":"玄谋智脑 / Xuanmou Intelligence","textPreview":"玄谋智脑 / Xuanmou Intelligence","textChars":27,"textLines":1,"bbox":[42,35,240,30]}
{"kind":"textbox","id":"sh/wrelszu9","slide":18,"text":"先用 8 周,找到第一批可验证的利润机会\nStart with the first measurable profit opportunities.","textPreview":"先用 8 周,找到第一批可验证的利润机会 | Start with the first measurable profit opportunities.","textChars":74,"textLines":2,"bbox":[42,160,1040,210]}
{"kind":"textbox","id":"sh/hsn2l4bu","slide":18,"text":"再决定如何扩大应用范围 Scale only after the value is proven.","textPreview":"再决定如何扩大应用范围 Scale only after the value is proven.","textChars":50,"textLines":1,"bbox":[42,420,850,52]}
{"kind":"shape","id":"sh/itw3upcf","slide":18,"bbox":[42,610,1196,0]}
{"kind":"textbox","id":"sh/je5knut0","slide":18,"text":"让问题更早被发现 · 让整改真正落地 · 让每一次改善复制到更多门店\nFind issues earlier · Make corrective action stick · Replicate every proven improvement","textPreview":"让问题更早被发现 · 让整改真正落地 · 让每一次改善复制到更多门店 | Find issues earlier · Make corrective action stick · Replicate every proven improvement","textChars":122,"textLines":2,"bbox":[42,636,1100,30]}
{"kind":"notes","id":"nt/y5wne50z","slide":18,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates."}
@@ -0,0 +1,456 @@
{"kind":"deck","id":"pr/4a93p5","name":"Deck"}
{"kind":"layout","layoutId":"/ppt/slideMasters/slideMaster1.xml","name":"Master","type":"master"}
{"kind":"layout","layoutId":"/ppt/slideLayouts/slideLayout1.xml","name":"Title Slide","type":"title"}
{"kind":"slide","id":"sl/y90nupkv","slide":1,"title":"Xuanmou Intelligence 玄谋智脑","textShapes":4}
{"kind":"textbox","id":"sh/ts7md4r2","slide":1,"text":"Xuanmou Intelligence 玄谋智脑","textPreview":"Xuanmou Intelligence 玄谋智脑","textChars":26,"textLines":1,"bbox":[42,34,360,36]}
{"kind":"textbox","id":"sh/547294r6","slide":1,"text":"See the profit clearly. Run every store with confidence.\n看清利润,才谈得上管住门店","textPreview":"See the profit clearly. Run every store with confidence. | 看清利润,才谈得上管住门店","textChars":70,"textLines":2,"bbox":[42,180,990,180]}
{"kind":"textbox","id":"sh/k3yl0zql","slide":1,"text":"A decision intelligence layer for multi-site operators\n面向连锁企业的行业数字本体与 AI 经营智脑","textPreview":"A decision intelligence layer for multi-site operators | 面向连锁企业的行业数字本体与 AI 经营智脑","textChars":77,"textLines":2,"bbox":[42,402,870,48]}
{"kind":"shape","id":"sh/7qp4be9c","slide":1,"bbox":[42,615,1196,0]}
{"kind":"textbox","id":"sh/65g3298r","slide":1,"text":"Confidential external edition · Cases and figures are anonymized illustrations 对外保密版 · 案例与金额均为匿名示意","textPreview":"Confidential external edition · Cases and figures are anonymized illustrations 对外保密版 · 案例与金额均为匿名示意","textChars":99,"textLines":1,"bbox":[42,640,620,24]}
{"kind":"notes","id":"nt/y90nupkv","slide":1,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/hwbqtkby","slide":2,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":13}
{"kind":"textbox","id":"sh/cnupgny5","slide":2,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/9072xkry","slide":2,"text":"Three decisions matter most to the owner.\n老板最终要判断三件事","textPreview":"Three decisions matter most to the owner. | 老板最终要判断三件事","textChars":52,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/ozy1ofad","slide":2,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/b29kza94","slide":2,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/a10jqpsj","slide":2,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,190,80,48]}
{"kind":"shape","id":"sh/x4r21kru","slide":2,"bbox":[42,248,350,0]}
{"kind":"textbox","id":"sh/w3i1sfa9","slide":2,"text":"Where are we losing money?\n哪里在亏钱?","textPreview":"Where are we losing money? | 哪里在亏钱?","textChars":33,"textLines":2,"bbox":[42,278,350,52]}
{"kind":"textbox","id":"sh/r65knqtk","slide":2,"text":"Which profit leaks across stores, SKUs, promotions, inventory and labor should be fixed first?\n门店、SKU、促销、库存、人力中,哪些利润漏洞最应该先处理?","textPreview":"Which profit leaks across stores, SKUs, promotions, inventory and labor should be fixed first? | 门店、SKU、促销、库存、人力中,哪些利润漏洞最应该先处理?","textChars":125,"textLines":2,"bbox":[42,352,350,140]}
{"kind":"textbox","id":"sh/q5wjelsz","slide":2,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[443,190,80,48]}
{"kind":"shape","id":"sh/ove9o7yd","slide":2,"bbox":[443,248,350,0]}
{"kind":"textbox","id":"sh/9wnqhczy","slide":2,"text":"Which actions will improve profit?\n哪些动作能增利?","textPreview":"Which actions will improve profit? | 哪些动作能增利?","textChars":43,"textLines":2,"bbox":[443,278,350,52]}
{"kind":"textbox","id":"sh/mtwrmxg7","slide":2,"text":"Quantify the impact, recommend actions, track execution and verify the outcome.\n不只找问题,还要测算影响、给出方案、跟踪执行并验证结果。","textPreview":"Quantify the impact, recommend actions, track execution and verify the outcome. | 不只找问题,还要测算影响、给出方案、跟踪执行并验证结果。","textChars":108,"textLines":2,"bbox":[443,352,350,140]}
{"kind":"textbox","id":"sh/nu58f2hs","slide":2,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[844,190,80,48]}
{"kind":"shape","id":"sh/wjy9sry9","slide":2,"bbox":[844,248,350,0]}
{"kind":"textbox","id":"sh/xk7qlczu","slide":2,"text":"Can we stay in control as we scale?\n扩张后还能管住吗?","textPreview":"Can we stay in control as we scale? | 扩张后还能管住吗?","textChars":45,"textLines":2,"bbox":[844,278,350,52]}
{"kind":"textbox","id":"sh/ahwrqhgj","slide":2,"text":"Can proven practices be replicated from 30 to 300 stores, consistently and at low cost?\n从 30 家到 300 家门店,有效经验能否被低成本、高质量地复制?","textPreview":"Can proven practices be replicated from 30 to 300 stores, consistently and at low cost? | 从 30 家到 300 家门店,有效经验能否被低成本、高质量地复制?","textChars":122,"textLines":2,"bbox":[844,352,350,140]}
{"kind":"textbox","id":"sh/bip8jmho","slide":2,"text":"The goal is not more reports, but measurable operating improvement. 不是看更多报表,而是将数据转化为可验证的经营改善。","textPreview":"The goal is not more reports, but measurable operating improvement. 不是看更多报表,而是将数据转化为可验证的经营改善。","textChars":94,"textLines":1,"bbox":[42,590,1100,42]}
{"kind":"notes","id":"nt/hwbqtkby","slide":2,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/ofy9wn61","slide":3,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/batgjixs","slide":3,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/cza94vmx","slide":3,"text":"Plenty of data, but no clear view of where profit goes.\n数据很多,利润去向仍然说不清","textPreview":"Plenty of data, but no clear view of where profit goes. | 数据很多,利润去向仍然说不清","textChars":70,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/d0jax03i","slide":3,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/298ryl4v","slide":3,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/3ah8rqlg","slide":3,"bbox":[42,188,360,160]}
{"kind":"shape","id":"sh/obq90bml","slide":3,"bbox":[42,188,7,160]}
{"kind":"textbox","id":"sh/pcjqtg36","slide":3,"text":"Revenue 营收","textPreview":"Revenue 营收","textChars":11,"textLines":1,"bbox":[66,210,314,40]}
{"kind":"textbox","id":"sh/m5cra54z","slide":3,"text":"Why is profit not keeping pace with revenue?\n营收增长,利润为何没有同步?","textPreview":"Why is profit not keeping pace with revenue? | 营收增长,利润为何没有同步?","textChars":59,"textLines":2,"bbox":[66,262,314,68]}
{"kind":"shape","id":"sh/n6ls3alk","slide":3,"bbox":[443,188,360,160]}
{"kind":"shape","id":"sh/n2l4fq98","slide":3,"bbox":[443,188,7,160]}
{"kind":"textbox","id":"sh/m1c3mlsn","slide":3,"text":"Stores 门店","textPreview":"Stores 门店","textChars":10,"textLines":1,"bbox":[467,210,314,40]}
{"kind":"textbox","id":"sh/943mhgre","slide":3,"text":"Which stores appear profitable but tie up cash?\n哪些门店看似赚钱,实际占用资金?","textPreview":"Which stores appear profitable but tie up cash? | 哪些门店看似赚钱,实际占用资金?","textChars":64,"textLines":2,"bbox":[467,262,314,68]}
{"kind":"shape","id":"sh/83ulovat","slide":3,"bbox":[844,188,360,160]}
{"kind":"shape","id":"sh/v6l4jq94","slide":3,"bbox":[844,188,7,160]}
{"kind":"textbox","id":"sh/a5c3ql8z","slide":3,"text":"Promotions 促销","textPreview":"Promotions 促销","textChars":14,"textLines":1,"bbox":[868,210,314,40]}
{"kind":"textbox","id":"sh/x8nml0ra","slide":3,"text":"Which campaigns add orders but destroy profit?\n哪些活动增加订单,却消耗利润?","textPreview":"Which campaigns add orders but destroy profit? | 哪些活动增加订单,却消耗利润?","textChars":62,"textLines":2,"bbox":[868,262,314,68]}
{"kind":"shape","id":"sh/w7ulsvqp","slide":3,"bbox":[42,390,360,160]}
{"kind":"shape","id":"sh/ja54na9g","slide":3,"bbox":[42,390,7,160]}
{"kind":"textbox","id":"sh/i9w3u58v","slide":3,"text":"SKU","textPreview":"SKU","textChars":3,"textLines":1,"bbox":[66,412,314,40]}
{"kind":"textbox","id":"sh/e10f2twf","slide":3,"text":"Which products sell well but contribute too little margin?\n哪些商品销量不低,却毛利不足?","textPreview":"Which products sell well but contribute too little margin? | 哪些商品销量不低,却毛利不足?","textChars":74,"textLines":2,"bbox":[66,464,314,68]}
{"kind":"shape","id":"sh/f29gbyx0","slide":3,"bbox":[443,390,360,160]}
{"kind":"shape","id":"sh/03ix43e5","slide":3,"bbox":[443,390,7,160]}
{"kind":"textbox","id":"sh/14ryd8fq","slide":3,"text":"Labor 人力","textPreview":"Labor 人力","textChars":9,"textLines":1,"bbox":[467,412,314,40]}
{"kind":"textbox","id":"sh/6d0fytg3","slide":3,"text":"When are teams idle, yet understaffed at peak times?\n哪些时段人员闲置,高峰又缺人?","textPreview":"When are teams idle, yet understaffed at peak times? | 哪些时段人员闲置,高峰又缺人?","textChars":68,"textLines":2,"bbox":[467,464,314,68]}
{"kind":"shape","id":"sh/re9g7yxo","slide":3,"bbox":[844,390,360,160]}
{"kind":"shape","id":"sh/sfix03y9","slide":3,"bbox":[844,390,7,160]}
{"kind":"textbox","id":"sh/tgry9ofu","slide":3,"text":"Loss control 止损","textPreview":"Loss control 止损","textChars":16,"textLines":1,"bbox":[868,412,314,40]}
{"kind":"textbox","id":"sh/a9kfadwn","slide":3,"text":"Which stores should be fixed, relocated, resized or closed?\n哪些门店应整改、迁址、缩编或关停?","textPreview":"Which stores should be fixed, relocated, resized or closed? | 哪些门店应整改、迁址、缩编或关停?","textChars":77,"textLines":2,"bbox":[868,464,314,68]}
{"kind":"notes","id":"nt/ofy9wn61","slide":3,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/jyx0ra1s","slide":4,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":22}
{"kind":"textbox","id":"sh/knex8j21","slide":4,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1cj2d8b6","slide":4,"text":"Turn exceptions into actions with measurable outcomes.\n把异常处理成有结果的经营行动","textPreview":"Turn exceptions into actions with measurable outcomes. | 把异常处理成有结果的经营行动","textChars":69,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/0ba143al","slide":4,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/rm1k7yt4","slide":4,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/ql8jytsj","slide":4,"bbox":[82,350,1090,0]}
{"kind":"shape","id":"sh/doj29oba","slide":4,"bbox":[54,332,36,36]}
{"kind":"textbox","id":"sh/sna103ap","slide":4,"text":"1","textPreview":"1","textChars":1,"textLines":1,"bbox":[54,337,36,24]}
{"kind":"textbox","id":"sh/3ihk3et8","slide":4,"text":"Detect 发现","textPreview":"Detect 发现","textChars":10,"textLines":1,"bbox":[44,235,150,40]}
{"kind":"textbox","id":"sh/ih8ju9sn","slide":4,"text":"Profit exception\n利润异常","textPreview":"Profit exception | 利润异常","textChars":21,"textLines":2,"bbox":[44,400,164,78]}
{"kind":"shape","id":"sh/kbm987y5","slide":4,"bbox":[253,332,36,36]}
{"kind":"textbox","id":"sh/5cva1cfq","slide":4,"text":"2","textPreview":"2","textChars":1,"textLines":1,"bbox":[253,337,36,24]}
{"kind":"textbox","id":"sh/i94r6xgz","slide":4,"text":"Drill down 穿透","textPreview":"Drill down 穿透","textChars":14,"textLines":1,"bbox":[243,235,150,40]}
{"kind":"textbox","id":"sh/jadsz2xk","slide":4,"text":"Region · Store · SKU · Shift\n区域·门店·SKU·班次","textPreview":"Region · Store · SKU · Shift | 区域·门店·SKU·班次","textChars":41,"textLines":2,"bbox":[243,400,164,78]}
{"kind":"shape","id":"sh/w72947yt","slide":4,"bbox":[452,332,36,36]}
{"kind":"textbox","id":"sh/x8vaxsfe","slide":4,"text":"3","textPreview":"3","textChars":1,"textLines":1,"bbox":[452,337,36,24]}
{"kind":"textbox","id":"sh/a5kr2xg3","slide":4,"text":"Quantify 测算","textPreview":"Quantify 测算","textChars":12,"textLines":1,"bbox":[442,235,150,40]}
{"kind":"textbox","id":"sh/v6tsv2xo","slide":4,"text":"Financial impact and priority\n影响金额与优先级","textPreview":"Financial impact and priority | 影响金额与优先级","textChars":38,"textLines":2,"bbox":[442,400,164,78]}
{"kind":"shape","id":"sh/g36tgryd","slide":4,"bbox":[651,332,36,36]}
{"kind":"textbox","id":"sh/h4fa9wfy","slide":4,"text":"4","textPreview":"4","textChars":1,"textLines":1,"bbox":[651,337,36,24]}
{"kind":"textbox","id":"sh/p0batw72","slide":4,"text":"Act 整改","textPreview":"Act 整改","textChars":7,"textLines":1,"bbox":[641,235,150,40]}
{"kind":"textbox","id":"sh/oz29krqh","slide":4,"text":"Action · Owner · Deadline\n动作·责任人·期限","textPreview":"Action · Owner · Deadline | 动作·责任人·期限","textChars":35,"textLines":2,"bbox":[641,400,164,78]}
{"kind":"shape","id":"sh/3ytsrmpw","slide":4,"bbox":[850,332,36,36]}
{"kind":"textbox","id":"sh/2xkrih8b","slide":4,"text":"5","textPreview":"5","textChars":1,"textLines":1,"bbox":[850,337,36,24]}
{"kind":"textbox","id":"sh/1wbapc7q","slide":4,"text":"Verify 验证","textPreview":"Verify 验证","textChars":10,"textLines":1,"bbox":[840,235,150,40]}
{"kind":"textbox","id":"sh/gv29g7q5","slide":4,"text":"Confirm real profit improvement\n利润是否真正改善","textPreview":"Confirm real profit improvement | 利润是否真正改善","textChars":40,"textLines":2,"bbox":[840,400,164,78]}
{"kind":"shape","id":"sh/fu9sn2p0","slide":4,"bbox":[1049,332,36,36]}
{"kind":"textbox","id":"sh/et0reh8f","slide":4,"text":"6","textPreview":"6","textChars":1,"textLines":1,"bbox":[1049,337,36,24]}
{"kind":"textbox","id":"sh/tsrqlc7u","slide":4,"text":"Codify 沉淀","textPreview":"Codify 沉淀","textChars":10,"textLines":1,"bbox":[1039,235,150,40]}
{"kind":"textbox","id":"sh/sri9s7q9","slide":4,"text":"Update company best practices\n更新企业最佳实践","textPreview":"Update company best practices | 更新企业最佳实践","textChars":38,"textLines":2,"bbox":[1039,400,164,78]}
{"kind":"shape","id":"sh/ilwf69kv","slide":4,"bbox":[42,552,1196,58]}
{"kind":"textbox","id":"sh/jm5gze1g","slide":4,"text":"The value lies in turning issues into repeatable profit improvement. 关键不是“发现问题”,而是“把问题变成可复制的利润改善”。","textPreview":"The value lies in turning issues into repeatable profit improvement. 关键不是“发现问题”,而是“把问题变成可复制的利润改善”。","textChars":99,"textLines":1,"bbox":[66,568,1148,30]}
{"kind":"notes","id":"nt/jyx0ra1s","slide":4,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/i107q5of","slide":5,"title":"Anonymous composite case · SKU portfolio 匿名复合案例 · SKU 组合决策","textShapes":15}
{"kind":"textbox","id":"sh/fe94nm1w","slide":5,"text":"Anonymous composite case · SKU portfolio 匿名复合案例 · SKU 组合决策","textPreview":"Anonymous composite case · SKU portfolio 匿名复合案例 · SKU 组合决策","textChars":59,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/dgbulwnm","slide":5,"text":"More SKUs often mean more cost, not more choice.\nSKU 过多,往往增加的是复杂度和成本","textPreview":"More SKUs often mean more cost, not more choice. | SKU 过多,往往增加的是复杂度和成本","textChars":68,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/cf2tcr61","slide":5,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/z2tcnm5s","slide":5,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/yhkbe1o7","slide":5,"text":"480","textPreview":"480","textChars":3,"textLines":1,"bbox":[42,182,190,72]}
{"kind":"textbox","id":"sh/l4bupwny","slide":5,"text":"Active SKUs 在售 SKU","textPreview":"Active SKUs 在售 SKU","textChars":19,"textLines":1,"bbox":[42,256,190,30]}
{"kind":"textbox","id":"sh/032tgr6d","slide":5,"text":"The bottom 20% of SKUs contribute about 3% of sales while continuously tying up inventory cash.\n后 20% SKU 仅贡献约 3% 销售额,却持续占用库存资金。","textPreview":"The bottom 20% of SKUs contribute about 3% of sales while continuously tying up inventory cash. | 后 20% SKU 仅贡献约 3% 销售额,却持续占用库存资金。","textChars":128,"textLines":2,"bbox":[262,190,800,76]}
{"kind":"shape","id":"sh/n6dcr65o","slide":5,"bbox":[42,328,270,170]}
{"kind":"textbox","id":"sh/m5kbi1oj","slide":5,"text":"37 items\n37 个","textPreview":"37 items | 37 个","textChars":13,"textLines":2,"bbox":[66,354,222,64]}
{"kind":"textbox","id":"sh/w32dkbuh","slide":5,"text":"Low sales · Low margin · High waste 低销量·低毛利·高损耗","textPreview":"Low sales · Low margin · High waste 低销量·低毛利·高损耗","textChars":48,"textLines":1,"bbox":[66,434,222,40]}
{"kind":"shape","id":"sh/x4vedgvm","slide":5,"bbox":[341,328,270,170]}
{"kind":"textbox","id":"sh/ahkvi1cb","slide":5,"text":"9 items\n9 个","textPreview":"9 items | 9 个","textChars":11,"textLines":2,"bbox":[365,354,222,64]}
{"kind":"textbox","id":"sh/v2twb6dw","slide":5,"text":"High sales but low profit contribution 高销量但低贡献利润","textPreview":"High sales but low profit contribution 高销量但低贡献利润","textChars":49,"textLines":1,"bbox":[365,434,222,40]}
{"kind":"shape","id":"sh/k7mxovud","slide":5,"bbox":[640,328,270,170]}
{"kind":"textbox","id":"sh/58vehgvy","slide":5,"text":"16 items\n16 个","textPreview":"16 items | 16 个","textChars":13,"textLines":2,"bbox":[664,354,222,64]}
{"kind":"textbox","id":"sh/i54fmlc7","slide":5,"text":"Shared or substitutable ingredients 可共享或替换原料","textPreview":"Shared or substitutable ingredients 可共享或替换原料","textChars":45,"textLines":1,"bbox":[664,434,222,40]}
{"kind":"shape","id":"sh/j6dwfqds","slide":5,"bbox":[939,328,270,170]}
{"kind":"textbox","id":"sh/sb6xsvu9","slide":5,"text":"22 items\n22 个","textPreview":"22 items | 22 个","textChars":13,"textLines":2,"bbox":[963,354,222,64]}
{"kind":"textbox","id":"sh/tcfel0vu","slide":5,"text":"Overlapping price points 价格带重叠","textPreview":"Overlapping price points 价格带重叠","textChars":31,"textLines":1,"bbox":[963,434,222,40]}
{"kind":"shape","id":"sh/hgrmpwj2","slide":5,"bbox":[42,535,1196,85]}
{"kind":"textbox","id":"sh/gfi5grih","slide":5,"text":"Illustrative estimate: release RMB 0.8m in inventory cash · reduce annual waste by RMB 0.35m · lift gross margin by about 0.6 pp 模拟测算:释放库存资金约 80 万元 · 年减少报损约 35 万元 · 综合毛利率提升约 0.6 个百分点","textPreview":"Illustrative estimate: release RMB 0.8m in inventory cash · reduce annual waste by RMB 0.35m · lift gross margin by about 0.6 pp 模拟测算:释放...","textChars":183,"textLines":1,"bbox":[68,558,1140,40]}
{"kind":"notes","id":"nt/i107q5of","slide":5,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/x8f69ofe","slide":6,"title":"Anonymous composite case · Store A-017 匿名复合案例 · 门店 A-017","textShapes":10}
{"kind":"textbox","id":"sh/svmt4v6t","slide":6,"text":"Anonymous composite case · Store A-017 匿名复合案例 · 门店 A-017","textPreview":"Anonymous composite case · Store A-017 匿名复合案例 · 门店 A-017","textChars":57,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/yhg7epsj","slide":6,"text":"Labor hours should follow demand.\n排班的关键,是工时跟着客流走","textPreview":"Labor hours should follow demand. | 排班的关键,是工时跟着客流走","textChars":48,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/zi98nu94","slide":6,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/87ipkzal","slide":6,"text":"06","textPreview":"06","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/98rqt4r6","slide":6,"bbox":[42,182,362,314]}
{"kind":"shape","id":"sh/ml07i9sv","slide":6,"bbox":[42,182,7,314]}
{"kind":"textbox","id":"sh/7m98ru9g","slide":6,"text":"Detect 发现","textPreview":"Detect 发现","textChars":10,"textLines":1,"bbox":[66,204,316,40]}
{"kind":"textbox","id":"sh/oryp8fah","slide":6,"text":"Idle labor on weekday mornings · Understaffed on Friday peaks · Habit-based shifts · Overtime concentrated in a few roles\n· 工作日上午存在闲置工时\n· 周五晚高峰经常缺人\n· 班次依据历史习惯\n· 加班集中在少数岗位","textPreview":"Idle labor on weekday mornings · Understaffed on Friday peaks · Habit-based shifts · Overtime concentrated in a few roles | · 工作日上午存在闲置工时...","textChars":170,"textLines":5,"bbox":[66,256,316,222]}
{"kind":"shape","id":"sh/pc76hkr2","slide":6,"bbox":[458,182,362,314]}
{"kind":"shape","id":"sh/h4bupgn6","slide":6,"bbox":[458,182,7,314]}
{"kind":"textbox","id":"sh/w32twb6l","slide":6,"text":"Actions 动作","textPreview":"Actions 动作","textChars":11,"textLines":1,"bbox":[482,204,316,40]}
{"kind":"textbox","id":"sh/v2tcn650","slide":6,"text":"Forecast every 30 minutes · Adjust shift times · Add hourly staff at peaks · Move prep ahead of demand\n· 按半小时预测工作量\n· 调整早晚班起止时间\n· 高峰增加小时工\n· 备餐前移至客流爬升前","textPreview":"Forecast every 30 minutes · Adjust shift times · Add hourly staff at peaks · Move prep ahead of demand | · 按半小时预测工作量 | · 调整早晚班起止时间 | · 高峰...","textChars":149,"textLines":5,"bbox":[482,256,316,222]}
{"kind":"shape","id":"sh/u1kbu1ov","slide":6,"bbox":[874,182,364,314]}
{"kind":"shape","id":"sh/5svutgni","slide":6,"bbox":[874,182,7,314]}
{"kind":"textbox","id":"sh/47mt0b6x","slide":6,"text":"Verify 验证","textPreview":"Verify 验证","textChars":10,"textLines":1,"bbox":[898,204,318,40]}
{"kind":"textbox","id":"sh/j6dcr65c","slide":6,"text":"Monitor labor cost, service speed and customer satisfaction together. Do not simply cut headcount.\n同时监控:\n\n· 人工成本\n· 出品时效\n· 顾客满意度\n\n避免单纯压缩人力。","textPreview":"Monitor labor cost, service speed and customer satisfaction together. Do not simply cut headcount. | 同时监控: | | · 人工成本 | · 出品时效 | · 顾客满意度...","textChars":138,"textLines":8,"bbox":[898,256,318,222]}
{"kind":"shape","id":"sh/i54bylor","slide":6,"bbox":[42,535,1196,85]}
{"kind":"textbox","id":"sh/twfux0ne","slide":6,"text":"Illustrative estimate: RMB 18k saved per store per month; about RMB 12.96m annual upside across 60 stores. 模拟测算:单店每月节约 1.8 万元;复制到 60 家门店,年度改善空间约 1,296 万元。","textPreview":"Illustrative estimate: RMB 18k saved per store per month; about RMB 12.96m annual upside across 60 stores. 模拟测算:单店每月节约 1.8 万元;复制到 60 家门店...","textChars":155,"textLines":1,"bbox":[66,557,1148,42]}
{"kind":"notes","id":"nt/x8f69ofe","slide":6,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/gnmp4jqx","slide":7,"title":"Anonymous composite case · Campaign X 匿名复合案例 · 营销活动 X","textShapes":17}
{"kind":"textbox","id":"sh/s3ml0v61","slide":7,"text":"Anonymous composite case · Campaign X 匿名复合案例 · 营销活动 X","textPreview":"Anonymous composite case · Campaign X 匿名复合案例 · 营销活动 X","textChars":54,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/cb2tkvap","slide":7,"text":"More orders do not always mean a profitable campaign.\n订单增长,不等于促销赚钱","textPreview":"More orders do not always mean a profitable campaign. | 订单增长,不等于促销赚钱","textChars":66,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/dcbud0ra","slide":7,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ydkbm5sv","slide":7,"text":"07","textPreview":"07","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/zedcfa9g","slide":7,"bbox":[42,186,350,170]}
{"kind":"textbox","id":"sh/kzmdova1","slide":7,"text":"+23%","textPreview":"+23%","textChars":4,"textLines":1,"bbox":[66,212,302,64]}
{"kind":"textbox","id":"sh/l0vuh0rm","slide":7,"text":"Order growth 订单增长","textPreview":"Order growth 订单增长","textChars":18,"textLines":1,"bbox":[66,292,302,40]}
{"kind":"shape","id":"sh/eh0ba1sr","slide":7,"bbox":[42,378,350,170]}
{"kind":"textbox","id":"sh/fi9c369c","slide":7,"text":"Negative\n负值","textPreview":"Negative | 负值","textChars":11,"textLines":2,"bbox":[66,404,302,64]}
{"kind":"textbox","id":"sh/baxkjqlk","slide":7,"text":"Campaign contribution after full costs 穿透成本后的活动贡献利润","textPreview":"Campaign contribution after full costs 穿透成本后的活动贡献利润","textChars":52,"textLines":1,"bbox":[66,484,302,40]}
{"kind":"textbox","id":"sh/a9ojq5kz","slide":7,"text":"Why the campaign loses money 活动为什么亏钱","textPreview":"Why the campaign loses money 活动为什么亏钱","textChars":37,"textLines":1,"bbox":[454,186,360,40]}
{"kind":"textbox","id":"sh/xcz2l03q","slide":7,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[454,258,42,28]}
{"kind":"textbox","id":"sh/cbq1sv25","slide":7,"text":"More low-margin items in the mix 低毛利商品占比上升","textPreview":"More low-margin items in the mix 低毛利商品占比上升","textChars":43,"textLines":1,"bbox":[510,254,650,40]}
{"kind":"shape","id":"sh/n6x0fqlo","slide":7,"bbox":[510,300,650,0]}
{"kind":"textbox","id":"sh/25ojml43","slide":7,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[454,323,42,28]}
{"kind":"textbox","id":"sh/p8fih03e","slide":7,"text":"High-value members receive blanket discounts 高价值会员获得无差别优惠","textPreview":"High-value members receive blanket discounts 高价值会员获得无差别优惠","textChars":58,"textLines":1,"bbox":[510,319,650,40]}
{"kind":"shape","id":"sh/o761ov2t","slide":7,"bbox":[510,365,650,0]}
{"kind":"textbox","id":"sh/f2d0b6lc","slide":7,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[454,388,42,28]}
{"kind":"textbox","id":"sh/eh4jil4r","slide":7,"text":"Discounted orders replace full-price orders 促销订单替代了原价订单","textPreview":"Discounted orders replace full-price orders 促销订单替代了原价订单","textChars":56,"textLines":1,"bbox":[510,384,650,40]}
{"kind":"shape","id":"sh/id4ju1oz","slide":7,"bbox":[510,430,650,0]}
{"kind":"textbox","id":"sh/jedkn654","slide":7,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[454,453,42,28]}
{"kind":"textbox","id":"sh/4fm1wb6p","slide":7,"text":"Orders and revenue measured; incremental profit ignored 只评价订单和营收,没有评价增量利润","textPreview":"Orders and revenue measured; incremental profit ignored 只评价订单和营收,没有评价增量利润","textChars":74,"textLines":1,"bbox":[510,449,650,40]}
{"kind":"shape","id":"sh/50v2pgna","slide":7,"bbox":[510,495,650,0]}
{"kind":"shape","id":"sh/q143ylov","slide":7,"bbox":[454,544,746,67]}
{"kind":"textbox","id":"sh/r2dkrq5g","slide":7,"text":"Evaluate each campaign by contribution profit generated per RMB 1 of marketing spend. 用“每投入 1 元营销费用增加多少贡献利润”评价活动。","textPreview":"Evaluate each campaign by contribution profit generated per RMB 1 of marketing spend. 用“每投入 1 元营销费用增加多少贡献利润”评价活动。","textChars":114,"textLines":1,"bbox":[478,562,700,34]}
{"kind":"notes","id":"nt/gnmp4jqx","slide":7,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/fu1gfa1s","slide":8,"title":"Anonymous composite case · Store D-006 匿名复合案例 · 门店 D-006","textShapes":19}
{"kind":"textbox","id":"sh/07atgnmp","slide":8,"text":"Anonymous composite case · Store D-006 匿名复合案例 · 门店 D-006","textPreview":"Anonymous composite case · Store D-006 匿名复合案例 · 门店 D-006","textChars":57,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/18byd4zy","slide":8,"text":"Compare the options before deciding to close a store.\n关店前,先把四种选择算清楚","textPreview":"Compare the options before deciding to close a store. | 关店前,先把四种选择算清楚","textChars":67,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/g72x4zyd","slide":8,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ri9g7uhw","slide":8,"text":"08","textPreview":"08","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/6h0fypgb","slide":8,"bbox":[42,180,340,55]}
{"kind":"textbox","id":"sh/tkby9kzm","slide":8,"text":"Option 方案","textPreview":"Option 方案","textChars":10,"textLines":1,"bbox":[60,197,304,26]}
{"kind":"shape","id":"sh/sjix0zy1","slide":8,"bbox":[382,180,378,55]}
{"kind":"textbox","id":"sh/je9g3ahk","slide":8,"text":"12-month scenario 12 个月模拟结果","textPreview":"12-month scenario 12 个月模拟结果","textChars":28,"textLines":1,"bbox":[400,197,342,26]}
{"kind":"shape","id":"sh/id0fu50z","slide":8,"bbox":[760,180,478,55]}
{"kind":"textbox","id":"sh/o7ydoret","slide":8,"text":"Recommendation 决策建议","textPreview":"Recommendation 决策建议","textChars":20,"textLines":1,"bbox":[778,197,442,26]}
{"kind":"shape","id":"sh/98rehwve","slide":8,"bbox":[42,235,340,72]}
{"kind":"textbox","id":"sh/m5gvmhwn","slide":8,"text":"Continue operating 继续经营","textPreview":"Continue operating 继续经营","textChars":24,"textLines":1,"bbox":[60,256,304,35]}
{"kind":"shape","id":"sh/n6pwfmd8","slide":8,"bbox":[382,235,378,72]}
{"kind":"textbox","id":"sh/0jydkreh","slide":8,"text":"Estimated loss: RMB 0.92m 预计亏损 92 万","textPreview":"Estimated loss: RMB 0.92m 预计亏损 92 万","textChars":36,"textLines":1,"bbox":[400,256,342,35]}
{"kind":"shape","id":"sh/1k7edwv2","slide":8,"bbox":[760,235,478,72]}
{"kind":"textbox","id":"sh/ehgvihwr","slide":8,"text":"Not recommended 不建议","textPreview":"Not recommended 不建议","textChars":20,"textLines":1,"bbox":[778,256,442,35]}
{"kind":"shape","id":"sh/zipwbmdc","slide":8,"bbox":[42,307,340,72]}
{"kind":"textbox","id":"sh/kfixwbe1","slide":8,"text":"Invest in a turnaround 投入整改","textPreview":"Invest in a turnaround 投入整改","textChars":28,"textLines":1,"bbox":[60,328,304,35]}
{"kind":"shape","id":"sh/lgbepgvm","slide":8,"bbox":[382,307,378,72]}
{"kind":"textbox","id":"sh/tw7e9gnq","slide":8,"text":"Estimated loss falls to RMB 0.35m 预计亏损降至 35 万","textPreview":"Estimated loss falls to RMB 0.35m 预计亏损降至 35 万","textChars":46,"textLines":1,"bbox":[400,328,342,35]}
{"kind":"shape","id":"sh/svydgb65","slide":8,"bbox":[760,307,478,72]}
{"kind":"textbox","id":"sh/7u5w765k","slide":8,"text":"High risk; set a stop-loss 高风险,设止损线","textPreview":"High risk; set a stop-loss 高风险,设止损线","textChars":36,"textLines":1,"bbox":[778,328,442,35]}
{"kind":"shape","id":"sh/6twve1oz","slide":8,"bbox":[42,379,340,72]}
{"kind":"textbox","id":"sh/5sne5wne","slide":8,"text":"Reduce footprint 缩小面积","textPreview":"Reduce footprint 缩小面积","textChars":22,"textLines":1,"bbox":[60,400,304,35]}
{"kind":"shape","id":"sh/kredcr6t","slide":8,"bbox":[382,379,378,72]}
{"kind":"textbox","id":"sh/jq5w365o","slide":8,"text":"Near break-even 预计接近盈亏平衡","textPreview":"Near break-even 预计接近盈亏平衡","textChars":25,"textLines":1,"bbox":[400,400,342,35]}
{"kind":"shape","id":"sh/i5wva1o3","slide":8,"bbox":[760,379,478,72]}
{"kind":"textbox","id":"sh/x4ne1wni","slide":8,"text":"Consider if the lease can be renegotiated 租约可重谈时考虑","textPreview":"Consider if the lease can be renegotiated 租约可重谈时考虑","textChars":51,"textLines":1,"bbox":[778,400,442,35]}
{"kind":"shape","id":"sh/w3ed8r6x","slide":8,"bbox":[42,451,340,72]}
{"kind":"textbox","id":"sh/m9sb2x4v","slide":8,"text":"Close and migrate members 关停并迁移会员","textPreview":"Close and migrate members 关停并迁移会员","textChars":34,"textLines":1,"bbox":[60,472,304,35]}
{"kind":"shape","id":"sh/na1sb2lg","slide":8,"bbox":[382,451,378,72]}
{"kind":"textbox","id":"sh/8bat47ml","slide":8,"text":"Estimated loss reduction: RMB 0.76m 预计减少亏损 76 万","textPreview":"Estimated loss reduction: RMB 0.76m 预计减少亏损 76 万","textChars":48,"textLines":1,"bbox":[400,472,342,35]}
{"kind":"shape","id":"sh/9w3uds36","slide":8,"bbox":[760,451,478,72]}
{"kind":"textbox","id":"sh/y5sbed4j","slide":8,"text":"Preferred option 优先建议","textPreview":"Preferred option 优先建议","textChars":22,"textLines":1,"bbox":[778,472,442,35]}
{"kind":"textbox","id":"sh/z61s7il4","slide":8,"text":"AI does not close stores. It adds evidence, scenario analysis and an exit plan to management judgment. AI 不替老板关店;它让经验判断具有数据依据、情景测算和退出预案。","textPreview":"AI does not close stores. It adds evidence, scenario analysis and an exit plan to management judgment. AI 不替老板关店;它让经验判断具有数据依据、情景测算和退出预案。","textChars":137,"textLines":1,"bbox":[42,565,1160,44]}
{"kind":"notes","id":"nt/fu1gfa1s","slide":8,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/udsvah03","slide":9,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/va103ep4","slide":9,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1cfmhgne","slide":9,"text":"One operating view, four levels of accountability.\n四级管理,各自看清该做的事","textPreview":"One operating view, four levels of accountability. | 四级管理,各自看清该做的事","textChars":64,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/0b65obm9","slide":9,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/nex4jq5k","slide":9,"text":"09","textPreview":"09","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/mdonql4z","slide":9,"bbox":[42,190,265,316]}
{"kind":"textbox","id":"sh/9gzml0nq","slide":9,"text":"Owner\n老板","textPreview":"Owner | 老板","textChars":8,"textLines":2,"bbox":[64,214,220,46]}
{"kind":"textbox","id":"sh/ofq5svm5","slide":9,"text":"Review outcomes 看结果","textPreview":"Review outcomes 看结果","textChars":20,"textLines":1,"bbox":[64,296,220,44]}
{"kind":"textbox","id":"sh/bih4na5w","slide":9,"text":"Profit · Risk · Capital allocation\n利润·风险·资源投向","textPreview":"Profit · Risk · Capital allocation | 利润·风险·资源投向","textChars":45,"textLines":2,"bbox":[64,386,220,72]}
{"kind":"textbox","id":"sh/ah8nu54b","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[310,323,30,36]}
{"kind":"shape","id":"sh/oza1gfyh","slide":9,"bbox":[341,190,265,316]}
{"kind":"textbox","id":"sh/p0ji9kf2","slide":9,"text":"Head office\n总部","textPreview":"Head office | 总部","textChars":14,"textLines":2,"bbox":[363,214,220,46]}
{"kind":"textbox","id":"sh/2xsjepgb","slide":9,"text":"Find causes 找原因","textPreview":"Find causes 找原因","textChars":16,"textLines":1,"bbox":[363,296,220,44]}
{"kind":"textbox","id":"sh/3y107axw","slide":9,"text":"Cross-region benchmarks · Policy review\n跨区域对标·政策评估","textPreview":"Cross-region benchmarks · Policy review | 跨区域对标·政策评估","textChars":50,"textLines":2,"bbox":[363,386,220,72]}
{"kind":"textbox","id":"sh/cnu1kzyd","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[609,323,30,36]}
{"kind":"shape","id":"sh/do3id4fy","slide":9,"bbox":[640,190,265,316]}
{"kind":"textbox","id":"sh/qlcjipgn","slide":9,"text":"Region\n区域","textPreview":"Region | 区域","textChars":9,"textLines":2,"bbox":[662,214,220,46]}
{"kind":"textbox","id":"sh/bml0buxs","slide":9,"text":"Drive action 推整改","textPreview":"Drive action 推整改","textChars":17,"textLines":1,"bbox":[662,296,220,44]}
{"kind":"textbox","id":"sh/0ru1ozyp","slide":9,"text":"Store tiers · Tasks · Acceptance\n门店分级·任务·验收","textPreview":"Store tiers · Tasks · Acceptance | 门店分级·任务·验收","textChars":43,"textLines":2,"bbox":[662,386,220,72]}
{"kind":"textbox","id":"sh/lsn2h4fa","slide":9,"text":"→","textPreview":"→","textChars":1,"textLines":1,"bbox":[908,323,30,36]}
{"kind":"shape","id":"sh/98ji147e","slide":9,"bbox":[939,190,265,316]}
{"kind":"textbox","id":"sh/87a18zqt","slide":9,"text":"Store manager\n店长","textPreview":"Store manager | 店长","textChars":16,"textLines":2,"bbox":[961,214,220,46]}
{"kind":"textbox","id":"sh/76h0zup8","slide":9,"text":"Execute 做动作","textPreview":"Execute 做动作","textChars":12,"textLines":1,"bbox":[961,296,220,44]}
{"kind":"textbox","id":"sh/ml8j6p8n","slide":9,"text":"Daily targets · Gaps · Actions\n日目标·偏差·行动建议","textPreview":"Daily targets · Gaps · Actions | 日目标·偏差·行动建议","textChars":42,"textLines":2,"bbox":[961,386,220,72]}
{"kind":"shape","id":"sh/hcji5o7a","slide":9,"bbox":[42,550,1196,60]}
{"kind":"textbox","id":"sh/wba1cjqp","slide":9,"text":"Results return to the operating view: completion is not the goal; improvement is. 结果回到经营大盘:执行不是终点,改善结果才是。","textPreview":"Results return to the operating view: completion is not the goal; improvement is. 结果回到经营大盘:执行不是终点,改善结果才是。","textChars":106,"textLines":1,"bbox":[66,567,1148,30]}
{"kind":"notes","id":"nt/udsvah03","slide":9,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/m90b6t0r","slide":10,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":7}
{"kind":"textbox","id":"sh/r6pcv6lw","slide":10,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/xc3mho32","slide":10,"text":"AI provides evidence. Management owns the decision.\nAI 给依据,经营决策仍由管理者负责","textPreview":"AI provides evidence. Management owns the decision. | AI 给依据,经营决策仍由管理者负责","textChars":70,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/cbu58j2h","slide":10,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/zelojyl8","slide":10,"text":"10","textPreview":"10","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/ydcnatkn","slide":10,"bbox":[42,182,560,366]}
{"kind":"shape","id":"sh/l036l83y","slide":10,"bbox":[42,182,7,366]}
{"kind":"textbox","id":"sh/kzu5c32t","slide":10,"text":"AI can support AI 可以承担","textPreview":"AI can support AI 可以承担","textChars":23,"textLines":1,"bbox":[66,204,514,40]}
{"kind":"textbox","id":"sh/725onyl4","slide":10,"text":"· Connect and reconcile data across systems\n· Continuously scan for operating exceptions\n· Drill down to stores, SKUs, shifts and individual orders\n· Apply industry rules and relevant historical cases\n· Model the impact of each option on profit and cash flow\n· Track execution and verify the actual outcome\n· 理解并关联跨系统数据\n· 持续扫描异常\n· 穿透至门店、SKU、班次和订单\n· 调用行业规则与历史案例\n· 推演方案对利润和现金流的影响\n· 跟踪执行并验证结果","textPreview":"· Connect and reconcile data across systems | · Continuously scan for operating exceptions | · Drill down to stores, SKUs, shifts and ind...","textChars":389,"textLines":12,"bbox":[66,256,514,274]}
{"kind":"shape","id":"sh/m1cnetkj","slide":10,"bbox":[678,182,560,366]}
{"kind":"shape","id":"sh/s7yt4b21","slide":10,"bbox":[678,182,7,366]}
{"kind":"textbox","id":"sh/d87uxg3m","slide":10,"text":"Management must decide 必须由管理者决定","textPreview":"Management must decide 必须由管理者决定","textChars":32,"textLines":1,"bbox":[702,204,514,40]}
{"kind":"textbox","id":"sh/q5gb21kb","slide":10,"text":"Price changes · Personnel actions · Supplier changes · Store relocation or closure · Major investment\nAll high-impact decisions require evidence, approval and execution records.\n· 价格调整\n· 人员处置\n· 供应商更换\n· 门店迁址与关停\n· 重大资源投入\n\n所有高影响决策都应留下依据、审批与执行记录。","textPreview":"Price changes · Personnel actions · Supplier changes · Store relocation or closure · Major investment | All high-impact decisions require...","textChars":242,"textLines":9,"bbox":[702,256,514,274]}
{"kind":"notes","id":"nt/m90b6t0r","slide":10,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/jetc3ut0","slide":11,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":24}
{"kind":"textbox","id":"sh/g3qtkj6l","slide":11,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/xcryxg7y","slide":11,"text":"BI explains the past. Xuanmou drives the next action.\nBI 解释过去,玄谋智脑推动下一步","textPreview":"BI explains the past. Xuanmou drives the next action. | BI 解释过去,玄谋智脑推动下一步","textChars":71,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/wbih4b6d","slide":11,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/n69grmpw","slide":11,"text":"11","textPreview":"11","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/250zy18b","slide":11,"bbox":[42,170,228,50]}
{"kind":"textbox","id":"sh/98rytw72","slide":11,"text":"Dimension 维度","textPreview":"Dimension 维度","textChars":13,"textLines":1,"bbox":[58,185,196,25]}
{"kind":"shape","id":"sh/o7ih0r6h","slide":11,"bbox":[270,170,410,50]}
{"kind":"textbox","id":"sh/72t03qp0","slide":11,"text":"Conventional BI 普通 BI","textPreview":"Conventional BI 普通 BI","textChars":22,"textLines":1,"bbox":[286,185,378,25]}
{"kind":"shape","id":"sh/61kzalof","slide":11,"bbox":[680,170,558,50]}
{"kind":"textbox","id":"sh/ofqtgnyt","slide":11,"text":"Xuanmou Intelligence 玄谋智脑","textPreview":"Xuanmou Intelligence 玄谋智脑","textChars":26,"textLines":1,"bbox":[696,185,526,25]}
{"kind":"shape","id":"sh/9gza9sze","slide":11,"bbox":[42,220,228,67]}
{"kind":"textbox","id":"sh/mdobedg3","slide":11,"text":"Role 定位","textPreview":"Role 定位","textChars":8,"textLines":1,"bbox":[58,238,196,38]}
{"kind":"shape","id":"sh/nehs7iho","slide":11,"bbox":[270,220,410,67]}
{"kind":"textbox","id":"sh/0b6tc3yx","slide":11,"text":"Display reports 展示报表","textPreview":"Display reports 展示报表","textChars":21,"textLines":1,"bbox":[286,238,378,38]}
{"kind":"shape","id":"sh/1cfa58zi","slide":11,"bbox":[680,220,558,67]}
{"kind":"textbox","id":"sh/epobatgr","slide":11,"text":"Drive decisions and improvement 驱动经营决策与改善","textPreview":"Drive decisions and improvement 驱动经营决策与改善","textChars":42,"textLines":1,"bbox":[696,238,526,38]}
{"kind":"shape","id":"sh/zaxs3yhc","slide":11,"bbox":[42,287,228,67]}
{"kind":"textbox","id":"sh/cn6t83y1","slide":11,"text":"Business context 业务语义","textPreview":"Business context 业务语义","textChars":22,"textLines":1,"bbox":[58,305,196,38]}
{"kind":"shape","id":"sh/dofa18z6","slide":11,"bbox":[270,287,410,67]}
{"kind":"textbox","id":"sh/tsnip0ny","slide":11,"text":"Fields and metrics 字段和指标","textPreview":"Fields and metrics 字段和指标","textChars":25,"textLines":1,"bbox":[286,305,378,38]}
{"kind":"shape","id":"sh/87ehgv6d","slide":11,"bbox":[680,287,558,67]}
{"kind":"textbox","id":"sh/7650nq5s","slide":11,"text":"Industry ontology for stores, products, people and members 门店、商品、人员、会员等行业本体","textPreview":"Industry ontology for stores, products, people and members 门店、商品、人员、会员等行业本体","textChars":76,"textLines":1,"bbox":[696,305,526,38]}
{"kind":"shape","id":"sh/65wzelo7","slide":11,"bbox":[42,354,228,67]}
{"kind":"textbox","id":"sh/l43ilgn2","slide":11,"text":"Issue detection 问题发现","textPreview":"Issue detection 问题发现","textChars":21,"textLines":1,"bbox":[58,372,196,38]}
{"kind":"shape","id":"sh/k3uhcb6h","slide":11,"bbox":[270,354,410,67]}
{"kind":"textbox","id":"sh/j2lgjq5w","slide":11,"text":"People search the data 人主动看数据","textPreview":"People search the data 人主动看数据","textChars":30,"textLines":1,"bbox":[286,372,378,38]}
{"kind":"shape","id":"sh/y1czalob","slide":11,"bbox":[680,354,558,67]}
{"kind":"textbox","id":"sh/p07ixkn6","slide":11,"text":"System detects, prioritizes and alerts continuously 系统持续发现、分级与推送","textPreview":"System detects, prioritizes and alerts continuously 系统持续发现、分级与推送","textChars":65,"textLines":1,"bbox":[696,372,526,38]}
{"kind":"shape","id":"sh/4zyhofml","slide":11,"bbox":[42,421,228,67]}
{"kind":"textbox","id":"sh/m58fih43","slide":11,"text":"Issue resolution 问题处理","textPreview":"Issue resolution 问题处理","textChars":22,"textLines":1,"bbox":[58,439,196,38]}
{"kind":"shape","id":"sh/n61wbmlo","slide":11,"bbox":[270,421,410,67]}
{"kind":"textbox","id":"sh/o7axk7m9","slide":11,"text":"Report exceptions 报告异常","textPreview":"Report exceptions 报告异常","textChars":23,"textLines":1,"bbox":[286,439,378,38]}
{"kind":"shape","id":"sh/98jedc3u","slide":11,"bbox":[680,421,558,67]}
{"kind":"textbox","id":"sh/eh8fex47","slide":11,"text":"Root cause, impact, recommendation and action task 归因、测算、方案和整改任务","textPreview":"Root cause, impact, recommendation and action task 归因、测算、方案和整改任务","textChars":65,"textLines":1,"bbox":[696,439,526,38]}
{"kind":"shape","id":"sh/z2hw72lc","slide":11,"bbox":[42,488,228,67]}
{"kind":"textbox","id":"sh/03qxg7mx","slide":11,"text":"Outcome validation 结果验证","textPreview":"Outcome validation 结果验证","textChars":24,"textLines":1,"bbox":[58,506,196,38]}
{"kind":"shape","id":"sh/14ze9c3i","slide":11,"bbox":[270,488,410,67]}
{"kind":"textbox","id":"sh/ydcfq1kb","slide":11,"text":"Usually not tracked 通常不跟踪","textPreview":"Usually not tracked 通常不跟踪","textChars":26,"textLines":1,"bbox":[286,506,378,38]}
{"kind":"shape","id":"sh/jylwj6lw","slide":11,"bbox":[680,488,558,67]}
{"kind":"textbox","id":"sh/3qhsfypc","slide":11,"text":"Verify improvement and update best practices 验证改善并更新最佳实践","textPreview":"Verify improvement and update best practices 验证改善并更新最佳实践","textChars":57,"textLines":1,"bbox":[696,506,526,38]}
{"kind":"shape","id":"sh/ip8bmtor","slide":11,"bbox":[42,555,228,67]}
{"kind":"textbox","id":"sh/5sjah872","slide":11,"text":"Long-term value 长期价值","textPreview":"Long-term value 长期价值","textChars":21,"textLines":1,"bbox":[58,573,196,38]}
{"kind":"shape","id":"sh/4rato36h","slide":11,"bbox":[270,555,410,67]}
{"kind":"textbox","id":"sh/v2hsbyp0","slide":11,"text":"More and more reports 报表越来越多","textPreview":"More and more reports 报表越来越多","textChars":29,"textLines":1,"bbox":[286,573,378,38]}
{"kind":"shape","id":"sh/u18bit8f","slide":11,"bbox":[680,555,558,67]}
{"kind":"textbox","id":"sh/h4zado76","slide":11,"text":"Industry models and company knowledge improve with use 行业模型与企业知识越用越成熟","textPreview":"Industry models and company knowledge improve with use 行业模型与企业知识越用越成熟","textChars":70,"textLines":1,"bbox":[696,573,526,38]}
{"kind":"notes","id":"nt/jetc3ut0","slide":11,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/8f2psfyx","slide":12,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":23}
{"kind":"textbox","id":"sh/alwbitsn","slide":12,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1gbm9s3a","slide":12,"text":"Five capabilities that support scalable operations.\n五项基础能力,支撑门店规模化管理","textPreview":"Five capabilities that support scalable operations. | 五项基础能力,支撑门店规模化管理","textChars":68,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/0f2lgnmp","slide":12,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ra943il8","slide":12,"text":"12","textPreview":"12","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/q903ad4n","slide":12,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,185,54,28]}
{"kind":"textbox","id":"sh/dcbm583y","slide":12,"text":"Data foundation\n数据资产化","textPreview":"Data foundation | 数据资产化","textChars":21,"textLines":2,"bbox":[118,171,250,54]}
{"kind":"textbox","id":"sh/sb2lcnmd","slide":12,"text":"Connect the data\n数据通起来","textPreview":"Connect the data | 数据通起来","textChars":22,"textLines":2,"bbox":[422,171,250,54]}
{"kind":"textbox","id":"sh/b6d4f2lc","slide":12,"text":"One number, one source\n一个数字、一个来源","textPreview":"One number, one source | 一个数字、一个来源","textChars":32,"textLines":2,"bbox":[720,171,450,54]}
{"kind":"shape","id":"sh/a543mx4r","slide":12,"bbox":[118,238,1050,0]}
{"kind":"textbox","id":"sh/wvupgz6t","slide":12,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[42,274,54,28]}
{"kind":"textbox","id":"sh/xw3q94ne","slide":12,"text":"Operational metrics\n运营指标化","textPreview":"Operational metrics | 运营指标化","textChars":25,"textLines":2,"bbox":[118,260,250,54]}
{"kind":"textbox","id":"sh/atc7epon","slide":12,"text":"Surface the issues\n问题浮出来","textPreview":"Surface the issues | 问题浮出来","textChars":24,"textLines":2,"bbox":[422,260,250,54]}
{"kind":"textbox","id":"sh/bulo7u58","slide":12,"text":"Trace exceptions to root causes\n异常能穿透到根因","textPreview":"Trace exceptions to root causes | 异常能穿透到根因","textChars":40,"textLines":2,"bbox":[720,260,450,54]}
{"kind":"shape","id":"sh/orapcf6h","slide":12,"bbox":[118,327,1050,0]}
{"kind":"textbox","id":"sh/9sj65kn2","slide":12,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[42,363,54,28]}
{"kind":"textbox","id":"sh/mps7a5or","slide":12,"text":"Strategy execution\n战略穿透化","textPreview":"Strategy execution | 战略穿透化","textChars":24,"textLines":2,"bbox":[118,349,250,54]}
{"kind":"textbox","id":"sh/nq1o3a5w","slide":12,"text":"Translate goals into action\n目标落下去","textPreview":"Translate goals into action | 目标落下去","textChars":33,"textLines":2,"bbox":[422,349,250,54]}
{"kind":"textbox","id":"sh/0nap8f6l","slide":12,"text":"From strategy to regions, stores and individuals\n战略到区域、门店和个人","textPreview":"From strategy to regions, stores and individuals | 战略到区域、门店和个人","textChars":60,"textLines":2,"bbox":[720,349,450,54]}
{"kind":"shape","id":"sh/1oj61kn6","slide":12,"bbox":[118,416,1050,0]}
{"kind":"textbox","id":"sh/hkbm5wzu","slide":12,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[42,452,54,28]}
{"kind":"textbox","id":"sh/gj25cry9","slide":12,"text":"Risk sensing\n态势感知化","textPreview":"Risk sensing | 态势感知化","textChars":18,"textLines":2,"bbox":[118,438,250,54]}
{"kind":"textbox","id":"sh/fit436ho","slide":12,"text":"See risks earlier\n风险早知道","textPreview":"See risks earlier | 风险早知道","textChars":23,"textLines":2,"bbox":[422,438,250,54]}
{"kind":"textbox","id":"sh/uh0na1g3","slide":12,"text":"Move from firefighting to prevention\n从事后救火到事前预防","textPreview":"Move from firefighting to prevention | 从事后救火到事前预防","textChars":47,"textLines":2,"bbox":[720,438,450,54]}
{"kind":"shape","id":"sh/tgrm1wzy","slide":12,"bbox":[118,505,1050,0]}
{"kind":"textbox","id":"sh/sfi58ryd","slide":12,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[42,541,54,28]}
{"kind":"textbox","id":"sh/7u94zmhs","slide":12,"text":"Knowledge capture\n知识沉淀化","textPreview":"Knowledge capture | 知识沉淀化","textChars":23,"textLines":2,"bbox":[118,527,250,54]}
{"kind":"textbox","id":"sh/6t0n6hg7","slide":12,"text":"Make the organization smarter\n组织越来越聪明","textPreview":"Make the organization smarter | 组织越来越聪明","textChars":37,"textLines":2,"bbox":[422,527,250,54]}
{"kind":"textbox","id":"sh/dcv6dgz2","slide":12,"text":"Best practices no longer depend on a few people\n优秀能力不再依赖少数人","textPreview":"Best practices no longer depend on a few people | 优秀能力不再依赖少数人","textChars":59,"textLines":2,"bbox":[720,527,450,54]}
{"kind":"shape","id":"sh/cbm5kbyh","slide":12,"bbox":[118,594,1050,0]}
{"kind":"notes","id":"nt/8f2psfyx","slide":12,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/hgzapcr6","slide":13,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/3yxgbqdg","slide":13,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/q50nydsj","slide":13,"text":"The larger the network, the greater the value of replication.\n门店越多,复制优秀做法的价值越大","textPreview":"The larger the network, the greater the value of replication. | 门店越多,复制优秀做法的价值越大","textChars":78,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/bq9orito","slide":13,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/o3i5w3ad","slide":13,"text":"13","textPreview":"13","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/p4r6p8by","slide":13,"bbox":[42,182,360,250]}
{"kind":"shape","id":"sh/21gnuts7","slide":13,"bbox":[42,182,7,250]}
{"kind":"textbox","id":"sh/32ponyts","slide":13,"text":"Less dependence on star performers 不依赖能人","textPreview":"Less dependence on star performers 不依赖能人","textChars":41,"textLines":1,"bbox":[66,204,314,40]}
{"kind":"textbox","id":"sh/gzy5s3a1","slide":13,"text":"Turn strong store-manager practices into rules, cases and SOPs.\n优秀店长的做法沉淀为规则、案例和 SOP。","textPreview":"Turn strong store-manager practices into rules, cases and SOPs. | 优秀店长的做法沉淀为规则、案例和 SOP。","textChars":85,"textLines":2,"bbox":[66,256,314,158]}
{"kind":"shape","id":"sh/1076lobm","slide":13,"bbox":[443,182,360,250]}
{"kind":"shape","id":"sh/hcfy9k3u","slide":13,"bbox":[443,182,7,250]}
{"kind":"textbox","id":"sh/gb6x0zm9","slide":13,"text":"Scale without losing control 扩张不失控","textPreview":"Scale without losing control 扩张不失控","textChars":35,"textLines":1,"bbox":[467,204,314,40]}
{"kind":"textbox","id":"sh/vaxg7ulo","slide":13,"text":"Replicate proven actions by store profile.\n验证有效的改善方案,可按门店特征分类复制。","textPreview":"Replicate proven actions by store profile. | 验证有效的改善方案,可按门店特征分类复制。","textChars":64,"textLines":2,"bbox":[467,256,314,158]}
{"kind":"shape","id":"sh/u9ofyp43","slide":13,"bbox":[844,182,360,250]}
{"kind":"shape","id":"sh/t8fy5k3i","slide":13,"bbox":[844,182,7,250]}
{"kind":"textbox","id":"sh/876xwfmx","slide":13,"text":"Capabilities compound 能力持续复利","textPreview":"Capabilities compound 能力持续复利","textChars":29,"textLines":1,"bbox":[868,204,314,40]}
{"kind":"textbox","id":"sh/7mdg3als","slide":13,"text":"Scenarios, models, AI recommendations and decision feedback reinforce one another.\n场景、模型、AI 建议与决策反馈相互增强。","textPreview":"Scenarios, models, AI recommendations and decision feedback reinforce one another. | 场景、模型、AI 建议与决策反馈相互增强。","textChars":104,"textLines":2,"bbox":[868,256,314,158]}
{"kind":"shape","id":"sh/6l4fu547","slide":13,"bbox":[120,520,980,0]}
{"kind":"shape","id":"sh/lkvy103m","slide":13,"bbox":[104,502,38,38]}
{"kind":"textbox","id":"sh/kjmxsfm1","slide":13,"text":"30 stores 30 家","textPreview":"30 stores 30 家","textChars":15,"textLines":1,"bbox":[94,555,150,28]}
{"kind":"textbox","id":"sh/cnqh8fux","slide":13,"text":"Managed by people 靠人盯","textPreview":"Managed by people 靠人盯","textChars":22,"textLines":1,"bbox":[94,589,170,24]}
{"kind":"shape","id":"sh/xozyhkbi","slide":13,"bbox":[584,502,38,38]}
{"kind":"textbox","id":"sh/q18f65cr","slide":13,"text":"100 stores 100 家","textPreview":"100 stores 100 家","textChars":17,"textLines":1,"bbox":[574,555,150,28]}
{"kind":"textbox","id":"sh/bmhgfatc","slide":13,"text":"Managed by process 靠机制","textPreview":"Managed by process 靠机制","textChars":23,"textLines":1,"bbox":[574,589,170,24]}
{"kind":"shape","id":"sh/oz6x4vul","slide":13,"bbox":[1064,502,38,38]}
{"kind":"textbox","id":"sh/p0zyd0b6","slide":13,"text":"300 stores 300 家","textPreview":"300 stores 300 家","textChars":17,"textLines":1,"bbox":[1054,555,150,28]}
{"kind":"textbox","id":"sh/2xof2lcv","slide":13,"text":"Scaled through models 靠模型复制","textPreview":"Scaled through models 靠模型复制","textChars":28,"textLines":1,"bbox":[1054,589,170,24]}
{"kind":"notes","id":"nt/hgzapcr6","slide":13,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/6lsnupw7","slide":14,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":8}
{"kind":"textbox","id":"sh/kre1k3y9","slide":14,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/xc7eds76","slide":14,"text":"A real data asset is a traceable operating capability.\n真正的数据资产,是可追溯的经营能力","textPreview":"A real data asset is a traceable operating capability. | 真正的数据资产,是可追溯的经营能力","textChars":72,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/wbydknq1","slide":14,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/jepwf2pc","slide":14,"text":"14","textPreview":"14","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/idgvmx8r","slide":14,"bbox":[42,180,560,365]}
{"kind":"shape","id":"sh/5grehs7i","slide":14,"bbox":[42,180,7,365]}
{"kind":"textbox","id":"sh/kfidonqx","slide":14,"text":"Enterprise data assets 企业数据资产","textPreview":"Enterprise data assets 企业数据资产","textChars":30,"textLines":1,"bbox":[66,202,514,40]}
{"kind":"textbox","id":"sh/zi5c3y98","slide":14,"text":"Common metric definitions and accountability · Business ontology · Industry rules · Decisions and validated outcomes · Best-practice knowledge\n· 统一指标口径与责任关系\n· 门店、商品、人员、会员、供应商本体\n· 行业规则与异常模式\n· 决策、执行与验证结果\n· 最佳实践与风险知识","textPreview":"Common metric definitions and accountability · Business ontology · Industry rules · Decisions and validated outcomes · Best-practice know...","textChars":213,"textLines":6,"bbox":[66,254,514,273]}
{"kind":"shape","id":"sh/ehwvat8n","slide":14,"bbox":[678,180,560,365]}
{"kind":"shape","id":"sh/c3e1gjyd","slide":14,"bbox":[678,180,7,365]}
{"kind":"textbox","id":"sh/x4ni9ofy","slide":14,"text":"Financing and due-diligence support 融资与尽调支持","textPreview":"Financing and due-diligence support 融资与尽调支持","textChars":44,"textLines":1,"bbox":[702,202,514,40]}
{"kind":"textbox","id":"sh/a1wze9g7","slide":14,"text":"Store-level P&L and cash flow · Revenue stability · Risk and remediation records · Forecasts · Traceable operating evidence\n· 门店级损益与现金流\n· 收入稳定性分析\n· 风险预警与整改记录\n· 未来经营预测\n· 更完整、可追溯的经营证明","textPreview":"Store-level P&L and cash flow · Revenue stability · Risk and remediation records · Forecasts · Traceable operating evidence | · 门店级损益与现金流...","textChars":181,"textLines":6,"bbox":[702,254,514,273]}
{"kind":"textbox","id":"sh/b2507exs","slide":14,"text":"Scope: data and analytical support only; no promise of bank credit or financing outcomes. 边界:提供数据与分析支持,不承诺银行授信或融资结果。","textPreview":"Scope: data and analytical support only; no promise of bank credit or financing outcomes. 边界:提供数据与分析支持,不承诺银行授信或融资结果。","textChars":117,"textLines":1,"bbox":[42,578,1000,34]}
{"kind":"notes","id":"nt/6lsnupw7","slide":14,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/vaxsvy10","slide":15,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":15}
{"kind":"textbox","id":"sh/cbuh8nmh","slide":15,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/547mhg3m","slide":15,"text":"Production data must remain within clear security boundaries.\n生产数据必须留在清晰的安全边界内","textPreview":"Production data must remain within clear security boundaries. | 生产数据必须留在清晰的安全边界内","textChars":78,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/k3y5ov21","slide":15,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/76p4jqls","slide":15,"text":"15","textPreview":"15","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/65gnqlk7","slide":15,"bbox":[42,180,360,170]}
{"kind":"shape","id":"sh/t87ml0ji","slide":15,"bbox":[42,180,7,170]}
{"kind":"textbox","id":"sh/s7y5sv2x","slide":15,"text":"Deployment boundary 部署边界","textPreview":"Deployment boundary 部署边界","textChars":25,"textLines":1,"bbox":[66,202,314,40]}
{"kind":"textbox","id":"sh/na5476l8","slide":15,"text":"Does not replace transaction systems; read-only or controlled integration.\n不替代现有交易系统,只读或受控对接。","textPreview":"Does not replace transaction systems; read-only or controlled integration. | 不替代现有交易系统,只读或受控对接。","textChars":93,"textLines":2,"bbox":[66,254,314,78]}
{"kind":"shape","id":"sh/m9c3e1kn","slide":15,"bbox":[443,180,360,170]}
{"kind":"shape","id":"sh/wrm9kvep","slide":15,"bbox":[443,180,7,170]}
{"kind":"textbox","id":"sh/hsvat0fa","slide":15,"text":"Least privilege 最小权限","textPreview":"Least privilege 最小权限","textChars":21,"textLines":1,"bbox":[467,202,314,40]}
{"kind":"textbox","id":"sh/upkrilwj","slide":15,"text":"Access by role across owner, head office, region and store.\n老板、总部、区域、门店按职责查看。","textPreview":"Access by role across owner, head office, region and store. | 老板、总部、区域、门店按职责查看。","textChars":77,"textLines":2,"bbox":[467,254,314,78]}
{"kind":"shape","id":"sh/vqdsrqx4","slide":15,"bbox":[844,180,360,170]}
{"kind":"shape","id":"sh/4vm9ovel","slide":15,"bbox":[844,180,7,170]}
{"kind":"textbox","id":"sh/5wvax0f6","slide":15,"text":"Sensitive-data protection 敏感保护","textPreview":"Sensitive-data protection 敏感保护","textChars":31,"textLines":1,"bbox":[868,202,314,40]}
{"kind":"textbox","id":"sh/it4rm5wv","slide":15,"text":"Classify, mask and audit member, payroll and financial details.\n会员、薪酬、财务明细分级、脱敏与审计。","textPreview":"Classify, mask and audit member, payroll and financial details. | 会员、薪酬、财务明细分级、脱敏与审计。","textChars":83,"textLines":2,"bbox":[868,254,314,78]}
{"kind":"shape","id":"sh/judsvqxg","slide":15,"bbox":[42,390,360,170]}
{"kind":"shape","id":"sh/0z29cbyh","slide":15,"bbox":[42,390,7,170]}
{"kind":"textbox","id":"sh/l0bqlgf2","slide":15,"text":"Traceable AI AI 可追溯","textPreview":"Traceable AI AI 可追溯","textChars":20,"textLines":1,"bbox":[66,412,314,40]}
{"kind":"textbox","id":"sh/1kjyt83e","slide":15,"text":"Key conclusions show evidence, timing, logic and scope.\n重要结论显示依据、时间、路径和适用边界。","textPreview":"Key conclusions show evidence, timing, logic and scope. | 重要结论显示依据、时间、路径和适用边界。","textChars":76,"textLines":2,"bbox":[66,464,314,78]}
{"kind":"shape","id":"sh/gjax03m9","slide":15,"bbox":[443,390,360,170]}
{"kind":"shape","id":"sh/fi1grylo","slide":15,"bbox":[443,390,7,170]}
{"kind":"textbox","id":"sh/ehsfyt43","slide":15,"text":"Human approval 人工审批","textPreview":"Human approval 人工审批","textChars":20,"textLines":1,"bbox":[467,412,314,40]}
{"kind":"textbox","id":"sh/p8jyx83q","slide":15,"text":"High-impact decisions require approval by authorized management.\n高影响决策必须经有权限的管理者审批。","textPreview":"High-impact decisions require approval by authorized management. | 高影响决策必须经有权限的管理者审批。","textChars":83,"textLines":2,"bbox":[467,464,314,78]}
{"kind":"shape","id":"sh/o7ah4nm5","slide":15,"bbox":[844,390,360,170]}
{"kind":"shape","id":"sh/361gvilk","slide":15,"bbox":[844,390,7,170]}
{"kind":"textbox","id":"sh/25sf2d4z","slide":15,"text":"Full audit trail 全程留痕","textPreview":"Full audit trail 全程留痕","textChars":22,"textLines":1,"bbox":[868,412,314,40]}
{"kind":"textbox","id":"sh/dc3y1s3m","slide":15,"text":"Access, recommendations, edits, approvals and outcomes are auditable.\n访问、建议、修改、审批和执行结果均可审计。","textPreview":"Access, recommendations, edits, approvals and outcomes are auditable. | 访问、建议、修改、审批和执行结果均可审计。","textChars":91,"textLines":2,"bbox":[868,464,314,78]}
{"kind":"notes","id":"nt/vaxsvy10","slide":15,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/gny5sjyp","slide":16,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/ih0jedob","slide":16,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/8z2h8bq1","slide":16,"text":"Prove the value in eight weeks before scaling.\n先用 8 周证明价值,再决定扩大范围","textPreview":"Prove the value in eight weeks before scaling. | 先用 8 周证明价值,再决定扩大范围","textChars":65,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/9kby1g7m","slide":16,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/ytkf2h8j","slide":16,"text":"16","textPreview":"16","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"shape","id":"sh/zutgvm94","slide":16,"bbox":[66,340,1100,0]}
{"kind":"shape","id":"sh/kv2h4rqp","slide":16,"bbox":[54,322,38,38]}
{"kind":"textbox","id":"sh/lwbyxwra","slide":16,"text":"Week 1 第 1 周","textPreview":"Week 1 第 1 周","textChars":13,"textLines":1,"bbox":[49,206,200,28]}
{"kind":"textbox","id":"sh/ip4zel83","slide":16,"text":"Select a profit initiative\n选定利润专项","textPreview":"Select a profit initiative | 选定利润专项","textChars":33,"textLines":2,"bbox":[49,250,205,55]}
{"kind":"textbox","id":"sh/3qdg7qpo","slide":16,"text":"Baseline · Definition · Owner\n基线·口径·责任人","textPreview":"Baseline · Definition · Owner | 基线·口径·责任人","textChars":39,"textLines":2,"bbox":[49,394,205,84]}
{"kind":"shape","id":"sh/fm1gzq5o","slide":16,"bbox":[293,322,38,38]}
{"kind":"textbox","id":"sh/e1sf65o3","slide":16,"text":"Weeks 12 第 1—2 周","textPreview":"Weeks 12 第 1—2 周","textChars":18,"textLines":1,"bbox":[288,206,200,28]}
{"kind":"textbox","id":"sh/1ojy10ne","slide":16,"text":"Connect existing data\n连接现有数据","textPreview":"Connect existing data | 连接现有数据","textChars":28,"textLines":2,"bbox":[288,250,205,55]}
{"kind":"textbox","id":"sh/gnax8v6t","slide":16,"text":"Data inventory · Quality · Common definitions\n数据清单·质量·统一口径","textPreview":"Data inventory · Quality · Common definitions | 数据清单·质量·统一口径","textChars":58,"textLines":2,"bbox":[288,394,205,84]}
{"kind":"shape","id":"sh/nqlg3a5k","slide":16,"bbox":[532,322,38,38]}
{"kind":"textbox","id":"sh/2pcfa5oz","slide":16,"text":"Weeks 34 第 3—4 周","textPreview":"Weeks 34 第 3—4 周","textChars":18,"textLines":1,"bbox":[527,206,200,28]}
{"kind":"textbox","id":"sh/ps3y5knq","slide":16,"text":"Find opportunities and causes\n发现机会与根因","textPreview":"Find opportunities and causes | 发现机会与根因","textChars":37,"textLines":2,"bbox":[527,250,205,55]}
{"kind":"textbox","id":"sh/oruhcf65","slide":16,"text":"Exception · Financial impact · Evidence\n异常·影响金额·证据","textPreview":"Exception · Financial impact · Evidence | 异常·影响金额·证据","textChars":50,"textLines":2,"bbox":[527,394,205,84]}
{"kind":"shape","id":"sh/bulg7u5g","slide":16,"bbox":[771,322,38,38]}
{"kind":"textbox","id":"sh/atczepob","slide":16,"text":"Weeks 56 第 5—6 周","textPreview":"Weeks 56 第 5—6 周","textChars":18,"textLines":1,"bbox":[766,206,200,28]}
{"kind":"textbox","id":"sh/mpgj6t8j","slide":16,"text":"Drive corrective action\n推动整改","textPreview":"Drive corrective action | 推动整改","textChars":28,"textLines":2,"bbox":[766,250,205,55]}
{"kind":"textbox","id":"sh/7qp0zepo","slide":16,"text":"Task · Deadline · Execution record\n任务·期限·执行记录","textPreview":"Task · Deadline · Execution record | 任务·期限·执行记录","textChars":45,"textLines":2,"bbox":[766,394,205,84]}
{"kind":"shape","id":"sh/8by18jq9","slide":16,"bbox":[1010,322,38,38]}
{"kind":"textbox","id":"sh/9c7i1o7u","slide":16,"text":"Weeks 78 第 7—8 周","textPreview":"Weeks 78 第 7—8 周","textChars":18,"textLines":1,"bbox":[1005,206,200,28]}
{"kind":"textbox","id":"sh/ylwj2987","slide":16,"text":"Verify and replicate\n验证并复制","textPreview":"Verify and replicate | 验证并复制","textChars":26,"textLines":2,"bbox":[1005,250,205,55]}
{"kind":"textbox","id":"sh/zm50veps","slide":16,"text":"Improvement value · Acceptance · Best practice\n改善金额·验收·最佳实践","textPreview":"Improvement value · Acceptance · Best practice | 改善金额·验收·最佳实践","textChars":59,"textLines":2,"bbox":[1005,394,205,84]}
{"kind":"shape","id":"sh/kne14jqd","slide":16,"bbox":[42,550,1196,60]}
{"kind":"textbox","id":"sh/lo7ixo7y","slide":16,"text":"Prioritize cases with available data, measurable impact, executable actions and results verifiable in eight weeks. 优先选择:数据可获得 · 影响可测算 · 动作可执行 · 八周可验证。","textPreview":"Prioritize cases with available data, measurable impact, executable actions and results verifiable in eight weeks. 优先选择:数据可获得 · 影响可测算 · ...","textChars":151,"textLines":1,"bbox":[66,567,1148,30]}
{"kind":"notes","id":"nt/gny5sjyp","slide":16,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/14bup87q","slide":17,"title":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textShapes":19}
{"kind":"textbox","id":"sh/ytc7a1gv","slide":17,"text":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textPreview":"Xuanmou Intelligence · Multi-site Operations 玄谋智脑 · 连锁企业经营决策","textChars":61,"textLines":1,"bbox":[42,28,820,24]}
{"kind":"textbox","id":"sh/1c7e50ni","slide":17,"text":"Measure business improvement, not feature count.\n验收看经营改善,不看功能数量","textPreview":"Measure business improvement, not feature count. | 验收看经营改善,不看功能数量","textChars":63,"textLines":2,"bbox":[42,62,1160,70]}
{"kind":"shape","id":"sh/gbedwfmx","slide":17,"bbox":[42,139,1196,0]}
{"kind":"textbox","id":"sh/rm5czq50","slide":17,"text":"17","textPreview":"17","textChars":2,"textLines":1,"bbox":[1182,672,56,18]}
{"kind":"textbox","id":"sh/6lwvql4v","slide":17,"text":"01","textPreview":"01","textChars":2,"textLines":1,"bbox":[42,188,50,26]}
{"kind":"textbox","id":"sh/t8ne10n6","slide":17,"text":"Business outcomes\n经营结果","textPreview":"Business outcomes | 经营结果","textChars":22,"textLines":2,"bbox":[112,174,230,48]}
{"kind":"textbox","id":"sh/snedsvml","slide":17,"text":"Contribution profit · Cost · Waste · Inventory cash\n贡献利润·成本·损耗·库存资金","textPreview":"Contribution profit · Cost · Waste · Inventory cash | 贡献利润·成本·损耗·库存资金","textChars":67,"textLines":2,"bbox":[395,174,760,48]}
{"kind":"shape","id":"sh/jilcvq54","slide":17,"bbox":[112,239,1040,0]}
{"kind":"textbox","id":"sh/ihcvml4j","slide":17,"text":"02","textPreview":"02","textChars":2,"textLines":1,"bbox":[42,274,50,26]}
{"kind":"textbox","id":"sh/4by9or6l","slide":17,"text":"Issue detection\n问题发现","textPreview":"Issue detection | 问题发现","textChars":20,"textLines":2,"bbox":[112,260,230,48]}
{"kind":"textbox","id":"sh/pc7qhwn6","slide":17,"text":"Detection cycle · Valid-exception rate · Impact coverage\n发现周期·有效异常率·影响覆盖","textPreview":"Detection cycle · Valid-exception rate · Impact coverage | 发现周期·有效异常率·影响覆盖","textChars":72,"textLines":2,"bbox":[395,260,760,48]}
{"kind":"shape","id":"sh/29grm1of","slide":17,"bbox":[112,325,1040,0]}
{"kind":"textbox","id":"sh/3ap8fm50","slide":17,"text":"03","textPreview":"03","textChars":2,"textLines":1,"bbox":[42,360,50,26]}
{"kind":"textbox","id":"sh/gnepkr69","slide":17,"text":"Execution loop\n执行闭环","textPreview":"Execution loop | 执行闭环","textChars":19,"textLines":2,"bbox":[112,346,230,48]}
{"kind":"textbox","id":"sh/honqdwnu","slide":17,"text":"Acceptance · On-time completion · Remediation effectiveness\n接收率·按期完成率·整改有效率","textPreview":"Acceptance · On-time completion · Remediation effectiveness | 接收率·按期完成率·整改有效率","textChars":75,"textLines":2,"bbox":[395,346,760,48]}
{"kind":"shape","id":"sh/ulw7ihoj","slide":17,"bbox":[112,411,1040,0]}
{"kind":"textbox","id":"sh/fm58bm54","slide":17,"text":"04","textPreview":"04","textChars":2,"textLines":1,"bbox":[42,446,50,26]}
{"kind":"textbox","id":"sh/0ji9wb6t","slide":17,"text":"Organizational replication\n组织复制","textPreview":"Organizational replication | 组织复制","textChars":31,"textLines":2,"bbox":[112,432,230,48]}
{"kind":"textbox","id":"sh/14rqpgne","slide":17,"text":"Stores replicated · Success rate · New-store ramp time\n复制门店数·成功率·新店导入时间","textPreview":"Stores replicated · Success rate · New-store ramp time | 复制门店数·成功率·新店导入时间","textChars":71,"textLines":2,"bbox":[395,432,760,48]}
{"kind":"shape","id":"sh/90nq9gfi","slide":17,"bbox":[112,497,1040,0]}
{"kind":"textbox","id":"sh/8ze9gbyx","slide":17,"text":"05","textPreview":"05","textChars":2,"textLines":1,"bbox":[42,532,50,26]}
{"kind":"textbox","id":"sh/ny5876xc","slide":17,"text":"Data quality\n数据质量","textPreview":"Data quality | 数据质量","textChars":17,"textLines":2,"bbox":[112,518,230,48]}
{"kind":"textbox","id":"sh/mxw7e1gr","slide":17,"text":"Consistent · Complete · Timely · Traceable\n口径一致·完整·及时·可追溯","textPreview":"Consistent · Complete · Timely · Traceable | 口径一致·完整·及时·可追溯","textChars":57,"textLines":2,"bbox":[395,518,760,48]}
{"kind":"shape","id":"sh/lwnq5gf6","slide":17,"bbox":[112,583,1040,0]}
{"kind":"shape","id":"sh/0vepcbyl","slide":17,"bbox":[42,612,1196,42]}
{"kind":"textbox","id":"sh/zul836xg","slide":17,"text":"Agree the baseline, definitions and external factors at launch so normal variation is not mistaken for system impact. 项目启动时即确认基线、口径和外部影响因素,避免将自然波动误认为系统收益。","textPreview":"Agree the baseline, definitions and external factors at launch so normal variation is not mistaken for system impact. 项目启动时即确认基线、口径和外部影响...","textChars":155,"textLines":1,"bbox":[64,622,1152,24]}
{"kind":"notes","id":"nt/14bup87q","slide":17,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
{"kind":"slide","id":"sl/y5wne50z","slide":18,"title":"Xuanmou Intelligence 玄谋智脑","textShapes":4}
{"kind":"textbox","id":"sh/4felwzu5","slide":18,"text":"Xuanmou Intelligence 玄谋智脑","textPreview":"Xuanmou Intelligence 玄谋智脑","textChars":26,"textLines":1,"bbox":[42,35,240,30]}
{"kind":"textbox","id":"sh/wrelszu9","slide":18,"text":"Start with the first measurable profit opportunities.\n先用 8 周,找到第一批可验证的利润机会","textPreview":"Start with the first measurable profit opportunities. | 先用 8 周,找到第一批可验证的利润机会","textChars":74,"textLines":2,"bbox":[42,160,1040,210]}
{"kind":"textbox","id":"sh/hsn2l4bu","slide":18,"text":"Scale only after the value is proven.\n再决定如何扩大应用范围","textPreview":"Scale only after the value is proven. | 再决定如何扩大应用范围","textChars":49,"textLines":2,"bbox":[42,420,850,52]}
{"kind":"shape","id":"sh/itw3upcf","slide":18,"bbox":[42,610,1196,0]}
{"kind":"textbox","id":"sh/je5knut0","slide":18,"text":"Find issues earlier · Make corrective action stick · Replicate every proven improvement 让问题更早被发现 · 让整改真正落地 · 让每一次改善复制到更多门店","textPreview":"Find issues earlier · Make corrective action stick · Replicate every proven improvement 让问题更早被发现 · 让整改真正落地 · 让每一次改善复制到更多门店","textChars":123,"textLines":1,"bbox":[42,636,1100,30]}
{"kind":"notes","id":"nt/y5wne50z","slide":18,"text":"[Sources]\n用户提供文档:《玄谋智脑建设蓝图_老板决策版.md》。案例、指标与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\n中文内容来自用户提供的老板决策版;英文为商务意译。案例与金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。\n\n[Sources]\nAll visible Chinese content is based on the user-supplied owner decision deck. English is a concise business translation. Cases and figures remain anonymous composite examples or illustrative estimates.\n\n[Sources]\nEnglish-primary edition derived from the user-supplied bilingual owner decision deck. English is the primary decision language; Chinese is retained as a secondary reference. Cases and figures remain anonymous composite examples or illustrative estimates."}
@@ -0,0 +1,318 @@
# 玄谋智脑:让老板看清每一分利润,管住每一家门店
> **品牌名称**:玄谋智脑
> **核心定位**:面向连锁企业的行业数字本体与 AI 经营智脑。
> **一句话价值**:不再新建一套孤立系统,而是整合企业现有数据,找到利润漏洞、推动责任人整改、验证改善结果,并将优秀经验复制到每一家门店。
> **保密说明**:本文案中的企业、门店、指标和金额均为匿名复合案例或模拟测算,不代表任何单一客户的生产数据。
---
## 一、老板真正需要回答的三个问题
1. **我现在到底在哪里亏钱?**
2. **哪些动作能够真正提升利润?**
3. **企业从 30 家店扩张到 300 家店后,能否依然看得清、管得住?**
连锁企业通常不缺数据,缺的是将数据转化为经营判断和改善结果的能力。真正的问题不是“有没有报表”,而是:
- 营收增长,为什么利润没有同步增长?
- 哪些门店看起来赚钱,实际正在占用资金和管理资源?
- 哪些促销增加了订单,却消耗了贡献利润?
- 哪些 SKU 销量不低,却毛利不足、损耗过高?
- 哪些班次人员闲置,哪些高峰时段又人手不足?
- 哪些门店应该整改、缩编、迁址甚至关停?
---
## 二、玄谋智脑不是又一套 BI
BI 告诉管理者“发生了什么”;玄谋智脑还要继续回答:
- 为什么发生?
- 影响了多少利润?
- 应该由谁采取什么动作?
- 什么时候完成?
- 执行后是否真的改善?
- 这一次经验能否复制到其他门店?
### 经营改善闭环
```text
发现利润异常
穿透到区域、门店、SKU、班次或订单
测算影响金额与优先级
生成改善方案,明确责任人和期限
跟踪执行过程,验证利润是否改善
将有效做法沉淀为企业最佳实践
```
---
## 三、案例一:从 SKU 数量中找到隐藏成本
> **匿名复合案例·SKU 组合决策**
某区域连锁品牌约有 480 个在售 SKU。其中后 20% 的 SKU 仅贡献约 3% 销售额,却持续占用库存资金,并增加采购、盘点、报损和培训复杂度。
### 玄谋智脑发现
| 问题类型 | 模拟识别结果 | 经营影响 |
|:---|---:|:---|
| 低销量、低毛利、高损耗 SKU | 37 个 | 占用库存并产生报损 |
| 高销量但低贡献利润 SKU | 9 个 | 创造了营收假象 |
| 可共享或替换原料 SKU | 16 个 | 可降低采购与仓储复杂度 |
| 价格带重叠 SKU | 22 个 | 内部分流,增加顾客选择成本 |
### 建议动作
- 下架或区域性停售低效 SKU。
- 调整高销量低利润商品的定价、份量或配方。
- 将可替换 SKU 纳入共享原料体系。
- 保留必要的引流商品,但限制优惠叠加。
### 老板看到的结果
> 模拟测算:释放库存资金约 80 万元,年度减少报损约 35 万元,综合毛利率提升约 0.6 个百分点。
---
## 四、案例二:排班不是人数问题,而是供需匹配问题
> **匿名复合案例·门店 A-017**
某门店月营收排名区域前三,但人效排名倒数。按月度总人数看并不显眼,穿透到半小时粒度后才发现:
- 工作日上午存在大量闲置工时。
- 周五晚高峰又经常缺人。
- 班次主要依据历史习惯,没有匹配客流与订单预测。
- 加班集中在少数岗位,正式工与小时工结构不合理。
### 建议动作
1. 按半小时预测客流、订单量和工作量。
2. 调整早晚班起止时间,减少无效重叠。
3. 高峰增加小时工,低峰减少固定工时。
4. 将备餐任务提前到客流爬升前。
5. 同时监控出品时效和顾客满意度,避免单纯压缩人力。
### 老板看到的结果
> 模拟测算:在不降低服务质量的前提下,单店每月节约人工成本约 1.8 万元;复制到 60 家门店,年度改善空间约 1,296 万元。
---
## 五、案例三:订单增长了,促销却可能正在消耗利润
> **匿名复合案例·营销活动 X**
某促销活动带来约 23% 的订单增长,但穿透计算优惠、平台佣金、商品毛利、新增人工与原价订单替代后,活动贡献利润为负。
### 根因
- 低毛利商品在活动订单中占比大幅上升。
- 高价值会员也领取了无差别优惠。
- 一部分促销订单只是替代原价订单,并非真实增量。
- 原有评价只看订单数和营收,没有看增量贡献利润。
### 改善方案
- 将优惠定向投放给可能流失或需要唤醒的会员。
- 区分拉新券、复购券和唤醒券。
- 限制低毛利商品参与优惠叠加。
- 用“每投入 1 元营销费用增加多少贡献利润”作为核心评价指标。
> **经营结论**:促销不应只为订单增长负责,而应为增量利润负责。
---
## 六、案例四:将门店关停从经验判断变为情景决策
> **匿名复合案例·门店 D-006**
某门店仍有营业收入,因此管理层长期无法决定是否关停。玄谋智脑不只看单月损益,还综合分析:
- 门店贡献利润、现金流与资金占用。
- 租金续约、装修与设备折旧。
- 周边客群、竞争和商圈变化。
- 同品牌门店的订单蚕食与会员迁移可能性。
- 关停、整改、迁址和缩店的一次性成本。
### 十二个月情景测算
| 方案 | 模拟结果 | 决策建议 |
|:---|:---|:---|
| 继续经营 | 预计亏损 92 万元 | 不建议 |
| 投入整改 | 预计亏损降至 35 万元 | 风险较高,设置止损线 |
| 缩小面积 | 预计接近盈亏平衡 | 租约可重谈时考虑 |
| 关停并迁移会员 | 预计减少亏损 76 万元 | 优先建议 |
> 玄谋智脑不替老板做关店决定,而是让难以下决心的经验判断,变成有数据依据、情景测算和退出预案的经营决策。
---
## 七、老板、总部、区域、店长共用一个经营闭环
| 角色 | 需要回答的问题 | 玄谋智脑提供的能力 |
|:---|:---|:---|
| **老板** | 企业是否真正赚钱?风险在哪里?资源应该投向哪里? | 企业经营全景、利润树、风险排名、情景推演 |
| **总部** | 哪些区域和业务需要调整?政策是否有效? | 跨区域对标、异常归因、资源分配与政策评估 |
| **区域** | 哪些门店异常?应该帮助谁、整改谁? | 门店分级、异常排名、整改任务与验收 |
| **店长** | 今天哪里没达标?先做什么? | 日目标卡、偏差提醒、行动建议与进度反馈 |
```text
老板看到结果 → 总部找到原因 → 区域推动整改 → 店长执行动作 → 结果回到经营大盘
```
---
## 八、AI 不是器人顾问,而是经营分析与执行助手
### AI 可以承担
- 自动理解并关联跨系统经营数据。
- 持续扫描人难以长期监控的异常。
- 将问题穿透到区域、门店、SKU、班次和订单。
- 调用行业规则、企业制度和历史案例生成建议。
- 模拟不同方案对营收、利润和现金流的影响。
- 自动形成任务,跟踪执行并验证结果。
- 从成功与失败结果中更新最佳实践。
### 管理边界
> AI 负责发现、归因、测算、建议和跟踪;价格调整、人员处置、供应商更换、门店关停等重要决策,仍由有权限的管理者审批。
---
## 九、为什么玄谋智脑不是普通 BI
| 维度 | 普通 BI | 玄谋智脑 |
|:---|:---|:---|
| 核心定位 | 展示报表 | 驱动经营决策与改善 |
| 数据范围 | 单系统或主题报表 | 关联企业现有多系统数据 |
| 业务语义 | 字段和指标 | 门店、商品、人员、会员等行业本体及关系 |
| 问题发现 | 人主动看数据 | 系统持续发现并分级推送 |
| 问题处理 | 报告异常 | 归因、测算、生成方案和整改任务 |
| 结果验证 | 通常不跟踪 | 验证改善效果并更新经验 |
| 长期价值 | 报表越来越多 | 行业模型和企业知识越用越成熟 |
---
## 十、支撑规模扩张的五层能力
| 能力层 | 作用 | 老板获得的价值 |
|:---|:---|:---|
| **数据资产化** | 连接 POS、ERP、WMS、HR、财务和 Excel,统一口径 | 一个数字、一个来源,减少无效争论 |
| **运营指标化** | 建立战略、运营、执行三级指标和利润关系 | 问题自动浮现,并能穿透到根因 |
| **战略穿透化** | 将年度目标拆解到区域、门店、个人和每日动作 | 战略不再留在 PPT 里 |
| **态势感知化** | 监控异常、预测趋势、推演方案 | 从事后救火转向事前预防 |
| **知识沉淀化** | 将有效动作沉淀为 SOP、规则和案例 | 优秀能力不再依赖少数能人 |
---
## 十一、长期价值:企业越大,复制价值越高
### 1. 从依赖能人到依赖组织能力
优秀店长的动作被验证后,可沉淀为规则、案例和 SOP,降低换人带来的经营波动。
### 2. 扩张不再必然带来管理失控
单店验证有效的 SKU、排班、促销和损耗改善方案,可按门店特征分类复制,不必依靠老板逐店盯导。
### 3. 沉淀可复用的数据资产
玄谋智脑沉淀的不只是原始数据,还包括:
- 统一指标口径和责任关系。
- 门店、商品、人员、会员、供应商等业务本体。
- 行业规则、异常模式和改善方案。
- 决策过程、执行记录和验证结果。
- 企业最佳实践与风险知识。
### 4. 提升融资与尽调的数据可信度
玄谋智脑可为银行授信、融资尽调和经营证明提供更完整、可追溯的数据依据,包括门店级损益、现金流、收入稳定性、风险预警、整改记录与经营预测。
> **边界说明**:玄谋智脑提供数据与分析支持,不承诺银行授信或融资结果。
---
## 十二、数据安全与 AI 使用边界
1. **不改变生产系统主体责任**:现有 POS、ERP、WMS、财务和 HR 系统继续承担业务交易与原始记录职责。
2. **最小权限**:老板、总部、区域和门店按职责获得不同数据范围。
3. **敏感数据保护**:身份、联系方式、薪酬、会员和财务明细等采取分级、脱敏和审计。
4. **AI 输出可追溯**:重要结论应展示依据指标、数据时间、分析路径与适用边界。
5. **人工审批**:高影响决策必须由管理者审批,不允许 AI 直接执行不可逆动作。
6. **全程留痕**:数据访问、模型建议、人工修改、审批和执行结果均可审计。
---
## 十三、八周建设路径:先证明价值,再扩大范围
| 阶段 | 时间 | 建设重点 | 可验收成果 |
|:---|:---|:---|:---|
| **选定利润专项** | 第 1 周 | 选择 1—2 个高价值问题,明确基线与责任人 | 专项范围、基线数据、验收口径 |
| **连接现有数据** | 第 1—2 周 | 对接相关系统和 Excel,统一主体与指标口径 | 数据清单、质量报告、口径确认 |
| **发现机会与根因** | 第 3—4 周 | 建立分析模型,输出优先级机会清单 | 异常清单、影响金额、根因证据 |
| **推动整改** | 第 5—6 周 | 生成任务,由总部、区域和店长执行 | 责任人、时限、执行记录与进度 |
| **验证并复制** | 第 7—8 周 | 对比改善前后,审核因果关系,形成复制方案 | 改善金额、验收结论、最佳实践 |
### 建议首批专项
优先选择“数据可获得、影响可测算、动作可执行、八周可验证”的场景:
- SKU 组合与菜品毛利。
- 门店排班与人效。
- 促销活动的增量贡献利润。
- 库存、损耗与临期商品。
- 低效门店整改与止损。
---
## 十四、投入产出不看“上线了多少功能”
项目验收应围绕经营结果,而不是页面数量、报表数量或 AI 对话次数。
| 验收维度 | 建议指标 |
|:---|:---|
| 经营结果 | 增量贡献利润、成本减少、损耗下降、库存资金释放 |
| 问题发现 | 发现周期、有效异常率、影响金额覆盖率 |
| 执行闭环 | 任务接收率、按期完成率、整改有效率 |
| 组织复制 | 有效方案复制门店数、复制成功率、新店导入时间 |
| 数据质量 | 口径一致率、数据完整率、及时率、可追溯率 |
> 所有收益指标应在项目启动时确认基线、计算口径和外部影响因素,避免将市场、季节或门店自然波动误认为系统收益。
---
## 十五、从单点改善到企业经营复利
```text
更多经营场景
更完整的行业数字本体
更成熟的运营与预测模型
更准确、更符合企业情况的 AI 建议
更高质量的执行与决策反馈
└──────── 持续复利 ────────┘
```
玄谋智脑的长期价值,不是为企业生产更多数据,而是将现有数据、行业知识和管理经验沉淀为一套持续进化的决策能力。
---
## 给决策者的最后一句话
> # 先用 8 周找到第一批可验证的利润改善机会,再决定如何扩大应用范围。
真正值得投入的不是一套功能,而是一项可以让问题更早被发现、让整改真正落地、让每一次改善都能复制到更多门店的经营能力。
Binary file not shown.
@@ -0,0 +1,320 @@
# 01 · 总体框架与八步工作法
## 1. 核心理念
玄谋智脑不是一套技术系统,而是一套**以经营战略为起点、以数据闭环为终点的企业管理方法论**。
### 1.1 借鉴FDE精神,适配中国国情
本框架借鉴 **FDEForward Deployed Engineer,前线部署工程)** 的核心理念,但并非照搬硅谷模式。中国连锁经营企业的现实是:预算有限(十万到百万级,非硅谷六七位数美元)、数字化基础薄弱、人员流动大、利润薄。需要做适配性改造。
> "中国FDE不是照搬硅谷岗位,而是企业在AI落地中,为模型能力与业务结果之间补上的一段责任。" —— 《FDE落地中国白皮书》
**借鉴什么**
- 前线嵌入:深入业务现场,不闭门造车
- 先跑通再优化:两周交付最小可用,而非半年画大饼
- 双向沉淀:面向客户留能力,面向平台留模板
- 结果负责:对业务结果负责,而非对"系统上线"负责
**不照搬什么**
- 硅谷高客单价人海模式(中国连锁经营企业支撑不起)
- 全能FDE单人角色(中国更现实的是"AI+业务人员"组合)
- 重型工程底座(中国连锁经营IT基础设施简单,不需要Kubernetes级部署)
- Palantir式政府/金融级合规要求
### 1.2 中国适配:AI作为"虚拟FDE"
中国连锁经营企业的现实解法——用AI替代部分FDE职能,降低对人力的依赖:
| FDE职能 | 硅谷做法 | 中国适配做法 |
|---------|---------|-------------|
| 场景发现(Echo) | 行业专家驻场数周 | 老板/中层访谈 + AI整理提纲和指标草案 |
| 快速原型(Delta) | 工程师现场写代码 | AI生成SQL/API/前端代码,人审查验证 |
| 数据对接 | FDE手动打通系统 | AI辅助编写导入脚本和映射逻辑 |
| 持续迭代 | FDE长期驻场 | AI协同月度诊断 + 远程迭代 |
| 知识沉淀 | FDE带回经验形成产品 | AI辅助沉淀为文档/模板/Checklist |
**核心思路**:AI承担Delta层80%的代码工作,人聚焦Echo层的业务判断和组织推动。这样即使预算有限,也能实现FDE式的深度交付。
### 1.3 Echo + Delta 双角色模型
借鉴Palantir的FDE实践,将部署团队分为两层角色,但在中国语境下重新定义:
| 角色 | 定位 | 硅谷原版 | 中国适配 |
|------|------|---------|---------|
| **Echo**(该做什么) | 场景发现者、需求翻译者 | 退役军官/行业专家全职驻场 | 老板+中层访谈,AI辅助整理,业务人员兼职 |
| **Delta**(怎么做出来) | 快速构建者、现场交付者 | 工程师现场写代码 | AI生成代码为主,技术人员审查验证为辅 |
**关键原则**:AI让Delta变便宜(代码生成、自动化测试),Echo更稀缺(识别高价值场景、理解行业、推动组织采纳)。在中国连锁经营企业,Echo层的核心是**老板本人的经营智慧和中层的管理经验**,而非外部专家。
### 1.4 总体循环
```
老板战略 → 指标体系 → 数据本体 → 执行闭环 → AI协同构建 → 持续优化
↑ |
└────────────────── 反馈与优化 ←──────────────────────────┘
FDE双向沉淀:
面向客户:业务经验 → AI知识库 → 工作流 → 应用能力
面向平台:行业场景 → 系统接口 → 测试方法 → 产品组件
↕ 共同载体:本体层(结构化业务知识图谱)
```
## 2. 八步工作法
> 每一步都标注FDE角色(Echo/Delta)和沉淀产出(面向客户/面向平台)。
### 步骤一:老板访谈与指挥层构建 `[Echo主导]`
> 从经营战略出发,定义"老板要看什么、管什么、决策什么"
- FDE嵌入现场,访谈老板近期经营战略和目标(带提纲和示例)
- 将模糊战略翻译为可量化指标("我想看门店效率"→"日均产出/坪效/人效"
- 形成智脑指标体系(指挥层)
- **面向客户沉淀**:指标体系文档、老板驾驶舱原型
- **面向平台沉淀**:行业指标模板(可复用于同类连锁经营企业)
### 步骤二:数据现状与本体层构建 `[Echo+Delta]`
> 摸清家底,建立从数据到指标的映射——本体层是FDE双向沉淀的核心载体
- FDE深入客户数据现场,了解现有系统和数据情况
- 针对指标体系的数据要求,盘点数据覆盖度
- 构建智脑本体层(数据模型、物化视图、映射关系)
- **面向客户沉淀**:数据溯源文档、物化视图体系、数据质量报告
- **面向平台沉淀**:本体设计模式(门店-账单-费用-考勤的通用关系模型)
### 步骤三:中层访谈与执行层准备 `[Echo主导]`
> 明确"谁来做、做到什么程度、如何考核"——FDE不只是技术交付,更是组织流程改造
- FDE嵌入中层(区域经理、店长)工作现场,明确职权范围
- 将指标体系拆解到岗位级执行动作
- 准备智脑执行层(任务模板、考核标准、预警规则)
- **面向客户沉淀**:岗位-指标矩阵、任务闭环规则
- **面向平台沉淀**:行业任务模板库(预警→任务→验收的标准流程)
### 步骤四:AI协同模型设计与逻辑闭环验证 `[Echo+Delta]`
> 在写代码前,先用AI验证业务逻辑的完整性——FDE的"先想清楚再动手"
- AI协同设计各层次的数据模型和业务逻辑
- 验证"指标→数据→分析→预警→任务→执行→反馈"闭环
- 发现逻辑断点并修复
- **面向客户沉淀**:模型设计文档、闭环验证报告
- **面向平台沉淀**:闭环验证Checklist(可复用于同类项目)
### 步骤五:AI协同本体层构建 `[Delta主导]`
> AI参与数据层代码编写和验证——Delta层成本被AI大幅压缩
- AI协同编写物化视图SQL
- AI协同编写数据导入脚本
- AI协同验证数据质量
- **面向客户沉淀**:可运行的数据层
- **面向平台沉淀**:物化视图SQL模板、数据校验脚本库
### 步骤六:AI协同后端API构建与验证 `[Delta主导]`
> AI参与API开发,逐个验证——快速交付能用的代码,不追求完美架构
- AI协同编写后端路由和SQL查询
- curl + psql 双向验证每个API
- 修复SQL陷阱(schema、列名、日期格式)
- **面向客户沉淀**:可运行的API层
- **面向平台沉淀**:API路由模板、SQL查询模式库
### 步骤七:AI协同前端UIUX设计与实现 `[Delta主导]`
> AI参与页面设计,参考典型页面模板——先交付能用的,再迭代好用的
- AI协同设计页面布局和交互
- 基于组件规范实现前端页面
- 联调API,处理空状态和加载状态
- **面向客户沉淀**:可用的前端界面
- **面向平台沉淀**:页面组件模板、行业Dashboard布局模板
### 步骤八:数据驱动闭环优化 `[Echo+Delta]`
> 上线不是终点,而是优化的起点——FDE持续驻场,把"不确定的机会"变成"可重复的流程"
```
数据采集 → 分析(基于模型)→ 发现问题 → 改进方案(AI协同)
→ 实施 → 反馈 → 检验 → 优化 → 再循环
```
- 基于模型分析数据,发现经营问题
- AI协同生成改进方案
- 落地实施,跟踪反馈
- 检验效果,优化模型和参数
- **面向客户沉淀**:持续运转的闭环机制、最佳实践库
- **面向平台沉淀**:行业诊断模型、参数调优经验、可复制的改进方案模板
## 3. 三层架构与FDE本体层
```
┌─────────────────────────────────────────┐
│ 指挥层(老板) │
│ - 战略目标 → 指标体系 │
│ - 老板驾驶舱、总部驾驶舱 │
│ - 关注:趋势、风险、机会 │
│ - FDE角色:Echo发现场景、翻译需求 │
├─────────────────────────────────────────┤
│ 本体层(数据+模型) │
│ - 原始数据 → 物化视图 → 指标计算 │
│ - 数据溯源、口径一致性 │
│ - 关注:数据质量、覆盖度、准确性 │
│ - FDE角色:双向沉淀的核心载体 │
│ - 本体 = 结构化业务知识图谱 │
│ 面向客户:业务经验→AI知识库→工作流 │
│ 面向平台:行业场景→产品组件→复用能力 │
├─────────────────────────────────────────┤
│ 执行层(中层+一线) │
│ - 指标 → 任务 → 执行 → 反馈 │
│ - 门店工作台、任务闭环 │
│ - 关注:可执行、可考核、可追踪 │
│ - FDE角色:嵌入现场、改造流程、推动采纳 │
└─────────────────────────────────────────┘
```
### 3.1 本体层的FDE价值
本体层不是简单的数据库设计,而是**从多个客户现场踩坑中提炼出来的通用业务知识结构**:
- 第一个客户:花大量时间理解"门店-账单-费用-考勤"的关系,成本高
- 第二个客户:本体层已稳定,只需适配新字段名和业务规则
- 第十个客户:本体层成为行业模板,交付成本显著下降
> **规模化的核心度量**:如果第一个客户需要10人月,第十个同类客户仍然需要10人月,模式就没有跑通。
### 3.2 中国连锁经营企业的本体层特点
与硅谷FDE面向政府/金融的本体层不同,中国连锁经营企业的本体层有其特殊性:
| 维度 | 硅谷FDE本体 | 中国连锁经营本体 |
|------|-----------|----------------|
| 数据源 | 多系统、高复杂度 | 收银+考勤+薪资+库存,3-5个Excel/CSV |
| 数据质量 | 有ETL管道,相对干净 | 原始数据脏,列名无含义(c001~c200) |
| 变更频率 | 低(制度稳定) | 高(门店开关、商品调整、人员流动) |
| 映射复杂度 | 系统间ID对接 | 门店名不一致("双安店"vs"双安总店" |
| 本体核心 | 权限+流程+合规 | 门店+账单+费用+考勤+库存的关系模型 |
**连锁经营本体的核心资产**(跨品类通用:餐饮/零售/服务/教培):
1. 字段映射文档(c001=门店名,c114=实收...)——这是最宝贵的踩坑沉淀
2. 门店名映射表——每个新客户都要重新建,但模式可复用
3. 物化视图SQL模板——结构相同,表名和字段名适配即可
4. 异常判断规则——"有消费无实收"等行业特定规则
5. **门店-商品-供应链关系模型**——餐饮有BOM,零售有SKU,教培有课包,结构相似
## 4. AI协同模式与FDE角色分工
AI不是替代人,而是全程协同伙伴。FDE模式下,AI让Delta变便宜,Echo更稀缺:
| 阶段 | FDE角色 | AI角色(Delta增强) | 人的角色(Echo主导) | 双向沉淀 |
|------|---------|-------------------|-------------------|---------|
| 老板访谈 | Echo | 整理提纲、记录要点、生成指标体系草案 | 引导访谈、确认战略方向、翻译模糊需求 | 行业指标模板 |
| 数据调研 | Echo+Delta | 分析数据质量、生成溯源文档、编写SQL | 确认数据含义、验证业务逻辑 | 本体设计模式 |
| 中层访谈 | Echo | 设计岗位-指标矩阵、生成任务模板 | 确认职权范围、考核标准、推动组织采纳 | 行业任务模板库 |
| 模型设计 | Echo+Delta | 设计数据模型、验证逻辑闭环 | 审查业务合理性、决策取舍 | 闭环验证Checklist |
| 本体构建 | Delta | 编写SQL和脚本、验证数据 | 审查代码、验证结果 | 物化视图SQL模板 |
| API构建 | Delta | 编写路由和查询、排查错误 | 验证API返回、确认业务逻辑 | API路由模板 |
| 前端实现 | Delta | 编写页面代码、设计交互 | 审查UI/UX、验证用户体验 | 页面组件模板 |
| 闭环优化 | Echo+Delta | 分析数据、生成改进方案 | 决策方案、推动实施、验收结果 | 行业诊断模型 |
### 4.1 "先跑通再优化"原则
```
传统交付:需求分析(1月) → 架构设计(1月) → 开发(3月) → 测试(1月) → 上线
FDE交付:现场嵌入(1周) → 最小可用(2周) → 真实反馈(1周) → 快速迭代(持续)
关键差异:
- 传统:追求完美架构,上线时需求已变
- FDE:先交付能用的,在真实反馈中迭代
- AI加持:Delta层(代码编写)成本大幅压缩,原型可在数小时内生成
```
**中国连锁经营企业的特殊考量**
- 老板耐心有限:两周看不到东西就会失去信任,所以第一版必须快速可见
- 数据基础差:不要等数据完美了再开始,用现有脏数据先跑通,边用边治
- 人员能力参差:第一版必须"傻瓜式"操作,不能要求店长学习复杂流程
- 利润薄:每一步都要能算清ROI,老板才会继续投入
### 4.2 "从最小痛点开始"原则
不要上来做"大一统"方案。选一个最小痛点,两周内跑通:
| 选择标准 | 示例 |
|---------|------|
| 业务痛点足够明确 | "13家门店亏损,不知道为什么亏" |
| 数据虽然不完美但够用 | bill_records有168万条,覆盖94家门店 |
| 效果可以量化 | 亏损门店数从13降到8 |
| 老板关心 | 直接关联L0战略指标 |
| 不依赖组织变革 | 不需要先改考核制度才能跑 |
**中国连锁经营企业的典型最小痛点**
1. **门店亏损诊断**:数据现成(账单+费用),老板最关心,两周可见
2. **成本异动监控**:数据现成(账单+成本),痛点明确,容易量化
3. **异常交易监控**:数据现成(账单/订单),风险可控,见效快
4. **人效分析**:数据现成(考勤+营收),人力成本是连锁经营第二大成本
**不建议作为起点的场景**
- 智能排班(需要考勤数据质量高+店长配合)
- 会员精准营销(需要会员数据积累+营销预算)
- 供应链优化(需要跨系统数据+供应商配合)
跑通一个场景后,再复制到下一个——先铺石子路,再修高速公路。
## 5. 文档体系导航
### 方法论主体(八步)
| 步骤 | 文件 | FDE角色 | 核心输出 | 平台沉淀 |
|------|------|---------|---------|---------|
| 一 | [02-步骤一-老板访谈与指挥层构建.md](02-步骤一-老板访谈与指挥层构建.md) | Echo | 指标体系、驾驶舱原型 | 行业指标模板 |
| 二 | [03-步骤二-数据现状与本体层构建.md](03-步骤二-数据现状与本体层构建.md) | Echo+Delta | 数据溯源、物化视图 | 本体设计模式 |
| 三 | [04-步骤三-中层访谈与执行层准备.md](04-步骤三-中层访谈与执行层准备.md) | Echo | 岗位-指标矩阵、任务模板 | 行业任务模板库 |
| 四 | [05-步骤四-AI协同模型设计与逻辑闭环.md](05-步骤四-AI协同模型设计与逻辑闭环.md) | Echo+Delta | 模型设计、闭环验证 | 闭环验证Checklist |
| 五 | [06-步骤五-AI协同本体层构建.md](06-步骤五-AI协同本体层构建.md) | Delta(AI为主) | 数据层代码 | 物化视图SQL模板 |
| 六 | [07-步骤六-AI协同后端API构建与验证.md](07-步骤六-AI协同后端API构建与验证.md) | Delta(AI为主) | API层代码 | API路由模板 |
| 七 | [08-步骤七-AI协同前端UIUX设计与实现.md](08-步骤七-AI协同前端UIUX设计与实现.md) | Delta(AI为主) | 前端界面 | 页面组件模板 |
| 八 | [09-步骤八-数据驱动闭环优化.md](09-步骤八-数据驱动闭环优化.md) | Echo+Delta | 优化闭环 | 行业诊断模型 |
### 技术参考
| 文件 | 内容 |
|------|------|
| [10-技术参考-项目概述与架构.md](10-技术参考-项目概述与架构.md) | 技术架构、数据流、部署拓扑 |
| [11-技术参考-部署与运维.md](11-技术参考-部署与运维.md) | 部署脚本、FRP隧道、PM2 |
| [12-技术参考-调试排查手册.md](12-技术参考-调试排查手册.md) | 问题分类、排查流程、案例 |
| [13-技术参考-通用方法论与避坑指南.md](13-技术参考-通用方法论与避坑指南.md) | 核心原则、风险清单、Checklist |
| [14-技术参考-数据溯源与API全量清单.md](14-技术参考-数据溯源与API全量清单.md) | 逐页面→API→SQL→字段映射 |
| [15-技术参考-指标口径一致性分析.md](15-技术参考-指标口径一致性分析.md) | 跨页面口径对比、问题清单 |
### 战略外脑扩展
八步工作法负责跑通日/周/月经营闭环;战略外脑扩展负责月/季/年战略决策闭环。两者通过目标、指标、决策、任务和结果对象连接。
| 文件 | 内容 |
|------|------|
| [16-战略外脑实施方法论.md](16-战略外脑实施方法论.md) | 七项能力、十二步工作法、AI与决策治理、成熟度和验收 |
| [17-SBrainCO战略外脑建设对照表.md](17-SBrainCO战略外脑建设对照表.md) | SBrainCO 当前基础、建设缺口、领域模型和产品待办 |
## 6. 规模化度量(中国适配版)
硅谷FDE用"人月成本递减"衡量规模化。中国连锁经营企业更现实的度量方式:
| 指标 | 定义 | 目标 | 中国适配说明 |
|------|------|------|-------------|
| 首次交付周期 | 从访谈到第一个可用版本 | <4周 | 老板耐心有限,超4周信任崩塌 |
| 同类客户交付周期 | 第二个同类客户 | <2周 | 本体层和模板复用后应大幅缩短 |
| AI代码占比 | AI生成的代码占总代码比例 | >70% | 降低对稀缺工程人才的依赖 |
| 客户自助率 | 客户独立完成的数据操作占比 | 逐月提升 | 中国连锁经营IT能力弱,需渐进式 |
| 闭环运转率 | 月度闭环实际执行率 | >80% | 闭环转起来才是真落地 |
| 沉淀复用率 | 可复用资产占项目总产出 | >40% | 没有沉淀就没有规模化 |
### 6.1 中国连锁经营企业的规模化路径
```
阶段一(单店验证):1个客户,4周交付,大量踩坑
↓ 沉淀:字段映射、物化视图SQL、页面模板
阶段二(同品牌复制):同品牌不同月份,1周交付,验证稳定性
↓ 沉淀:数据校验脚本、异常规则库
阶段三(同品类复制):同品类不同品牌(如餐饮A→餐饮B),2周交付,适配字段名和业务规则
↓ 沉淀:品类本体模板、指标体系模板
阶段四(跨品类扩展):不同品类(餐饮→零售→服务→教培),3周交付,适配本体层
↓ 沉淀:连锁经营通用本体设计模式
```
**关键**:每个阶段的沉淀质量决定下一阶段的速度。如果做完一个客户没有沉淀出可复用资产,下一个客户又从头开始,那就是传统外包,不是FDE。
@@ -0,0 +1,147 @@
# 02 · 步骤一:老板访谈与指挥层构建
> 目标:从老板的经营战略出发,定义智脑要呈现什么、预警什么、辅助决策什么。 `[Echo主导]`
>
> FDE角色:这一步是典型的Echo层工作——深入业务现场,把老板模糊的战略意图翻译为可量化的指标体系。AI辅助整理提纲和生成草案,但核心是人的业务判断。
## 1. 访谈准备
### 1.1 访谈提纲
```
一、战略方向
1. 今年最关注哪3个经营目标?(营收/利润/扩张/降本/品牌)
2. 当前最大的经营痛点是什么?
3. 觉得哪些决策缺乏数据支撑?
二、管理范围
4. 您平时看哪些报表?频率?哪些指标最关键?
5. 希望每天/每周/每月自动看到什么?
6. 哪些情况需要立即预警?(如某店连续3天营收下降)
三、组织架构
7. 下面管几层?(总部→区域→门店)
8. 区域经理和店长的核心考核指标是什么?
9. 哪些决策是您亲自做的?哪些授权下去了?
四、数据现状
10. 现在有哪些系统?(收银/考勤/薪资/供应链/会员)
11. 这些系统数据能打通吗?
12. 有没有以前想做但没做成的数据分析?
五、期望与边界
13. 希望智脑帮您做到什么程度?(看数据/给建议/自动执行)
14. 有哪些底线是不能碰的?(如不能自动调价)
15. 对数据安全有什么要求?
```
### 1.2 示例引导
老板可能说:"我就是想看哪家店在亏钱,为什么亏,怎么改"
拆解为:
- **指标**:门店贡献利润、食材成本率、人工费率、费用率
- **预警**:连续亏损、成本率超标、费用率异常
- **决策**:关店/整改/换人/降本
- **执行**:任务派发给区域经理→店长→跟踪反馈
## 2. 指标体系构建
### 2.1 指标分层
```
L0: 战略指标(老板关注)
├── 营收总额、利润总额、门店数、客单价
├── 同比/环比趋势
└── 盈利/亏损门店数
L1: 经营指标(管理层关注)
├── 优惠率、毛利率、会员占比
├── 食材成本率、人工费率、房租费率、水电费率
├── 外卖佣金占比
└── 平台经济性(美团/饿了么/抖音成本率)
L2: 执行指标(门店关注)
├── 日均实收、账单数、客单价
├── 风险评级(红/黄/绿)
├── 异常账单数、零实收数
├── 客流-人力匹配度
└── 任务完成率
```
### 2.2 指标卡设计
基于访谈结果,设计老板驾驶舱的指标卡:
| 指标 | 数据来源 | 展示形式 | 预警阈值 |
|------|---------|---------|---------|
| 营业收入 | bill_fact.consumption | MetricCard (currency) | 环比下降>10% |
| 实收 | bill_fact.received_total | MetricCard (currency) | — |
| 门店贡献利润 | received - food_cost - operating_expense | MetricCard (currency) | <0 标红 |
| 贡献率 | profit / matched_received * 100 | MetricCard (percent) | <5% 标黄 |
| 盈利门店数 | count FILTER(contribution > 0) | MetricCard (number) | — |
| 亏损门店数 | count FILTER(contribution <= 0) | MetricCard (number) | >5 标红 |
| 食材成本率 | food_cost / received * 100 | MetricCard (percent) | >40% 标红 |
| 人工费率 | wage / received * 100 | MetricCard (percent) | >25% 标红 |
### 2.3 预警规则设计
| 预警类型 | 触发条件 | 级别 | 推送对象 |
|---------|---------|------|---------|
| 营收异动 | 日营收环比下降>20% | 红色 | 老板+区域经理 |
| 成本异动 | 食材成本率>45% | 红色 | 老板+区域经理 |
| 人力异动 | 人工费率>30%或客流-人力严重不匹配 | 橙色 | 区域经理 |
| 平台依赖 | 单平台占比>70%且成本率>25% | 橙色 | 老板 |
| 任务逾期 | 整改任务超7天未完成 | 橙色 | 区域经理 |
## 3. 指挥层原型
### 3.1 老板驾驶舱
```
┌─────────────────────────────────────────────────┐
│ 老板驾驶舱 [2026年4月] │
├─────────────────────────────────────────────────┤
│ [营收] [实收] [利润] [贡献率] [盈利/亏损] │
│ 6420万 6369万 698万 10.96% 78家/13家 │
├─────────────────────────────────────────────────┤
│ 📊 利润瀑布图 📊 日度实收趋势 │
│ (实收→食材→人工→房租 (折线图,环比标注) │
│ →水电→佣金→利润) │
├─────────────────────────────────────────────────┤
│ 📊 门店风险分布 📊 P0/P1重点门店 │
│ (红/黄/绿饼图) (表格,含问题组合) │
├─────────────────────────────────────────────────┤
│ 📊 平台成本率TOP15 📊 门店经营象限 │
│ (美团/饿了么/抖音) (散点图:日均实收vs毛利率) │
├─────────────────────────────────────────────────┤
│ 📋 利润机会池 📋 月度趋势 │
│ (可改善空间排序) (实收+账单数双轴) │
└─────────────────────────────────────────────────┘
```
### 3.2 总部驾驶舱
比老板驾驶舱更详细,增加:
- 态势感知预警卡片(5类预警合并)
- 闭环健康度(5项rate指标)
- 同比/环比对比
- 利润趋势(月度贡献利润走势)
## 4. 访谈输出物
| 输出物 | 说明 | 后续步骤使用 |
|--------|------|-------------|
| 战略目标清单 | 老板关注的3-5个核心目标 | 步骤四模型设计的输入 |
| 指标体系文档 | L0/L1/L2分层指标定义 | 步骤二数据覆盖度盘点 |
| 驾驶舱原型 | 页面布局和指标卡设计 | 步骤七前端实现 |
| 预警规则 | 触发条件、级别、推送对象 | 步骤四闭环验证 |
| 管理层级图 | 总部→区域→门店的决策权分布 | 步骤三中层访谈 |
## 5. 关键注意事项
1. **不要一上来谈技术**:先聊经营,再聊数据,最后才聊系统
2. **指标要可量化**:老板说"想看门店效率",要追问"效率具体指什么?人均产出?坪效?"
3. **预警要可执行**:预警必须关联到具体动作,否则只是噪音
4. **分清"看的"和"管的"**:老板看趋势和异常,管理层管过程和整改
5. **留出迭代空间**:第一版不需要完美,先上线核心指标,后续根据反馈迭代
@@ -0,0 +1,109 @@
# 03 · 步骤二:数据现状与本体层构建
> 目标:摸清数据家底,建立从原始数据到指标体系的映射——本体层是FDE双向沉淀的核心载体。 `[Echo+Delta]`
## 1. 原始数据导入
### 1.1 数据源
| 表名 | 数据来源 | 关键字段 | 数据量级 |
|------|---------|---------|---------|
| `bill_records` | 收银系统导出 | c003(门店) c005(账单号) c009(消费) c068(优惠) c114(实收) c175(下单时间) c176(结账时间) c191(收银员) | 千万级/月 |
| `salary_detail_records` | 薪资系统导出 | org_level5(门店) salary_period(薪资周期) actual_attend(实际出勤) actual_hours(实际工时) | 万级/月 |
| `attendance_records` | 考勤系统导出 | department(部门路径) position(岗位) day_01~day_31(每日打卡) | 万级/月 |
### 1.2 导入关键点
- **字段映射**:原始Excel列名(c001~c200)需建立映射文档,明确每列含义
- **日期格式**`salary_period` 格式为中文"2026年4月",非"2026-04",查询时需用 `to_char($1::date, 'YYYY"年"FMMM"月"')`
- **空值处理**:实收字段 c114 可能为空字符串,需 `COALESCE(NULLIF(c114,'')::numeric, 0)`
- **数据去重**:导入时按 record_id + import_id 去重
### 1.3 门店名映射
不同数据源门店名不一致,需维护 `store_name_mapping` 映射表:
```sql
CREATE TABLE public.store_name_mapping (
salary_name TEXT, -- 薪资/考勤系统中的名称
bill_name TEXT -- 账单系统中的名称
);
```
**典型映射**
| salary_name | bill_name |
|-------------|-----------|
| 双安店 | 双安总店 |
| 百子湾店 | 百子湾路店 |
| 安宁庄快手店 | 安宁庄快手 |
| 海淀大街店 | 海淀大街 |
| 哈马尔罕大钟寺店 | 大钟寺店 |
| 阿里疆(温泉路店) | 温泉店 |
**映射查找模式**(代码中复用):
```typescript
// 构建查找表:同时用原名和映射名
const staffLookup: Record<string, any> = {}
for (const [store, data] of Object.entries(staffSummary)) {
staffLookup[store] = data // 原名
const mapped = nameMap[store]
if (mapped && mapped !== store) {
staffLookup[mapped] = data // 映射名
}
}
```
## 2. 物化视图体系
### 2.1 核心物化视图
| 视图名 | Schema | 用途 | 关键字段 |
|--------|--------|------|---------|
| `mv_store_risk_rating_monthly` | analytics | 门店风险评级 | store_code, store_name, risk_level, received, month_start |
| `mv_store_platform_economics_monthly` | analytics | 平台经济性 | store_code, meituan_received, taobao_received, jd_received |
| `mv_bill_hourly` | public | 小时客流 | store_name, hour, bills, avg_guests |
| `mv_risk_anomaly` | public | 异常账单 | store_name, bill_no, consumption, anomaly_reason, month |
| `mv_risk_zero` | public | 零实收 | store_name, bill_no, zero_received_type, month |
| `mv_risk_cashier` | public | 收银员风险 | store_name, cashier, bill_count, anomaly_bills, month |
| `mv_channel_daily` | public | 支付渠道 | business_date, cash, alipay, wechat, meituan, month |
| `mv_time_hourly` | public | 时间维度汇总 | closing_hour, bill_count, received, month |
### 2.2 物化视图管理要点
1. **Schema前缀**:部分视图在 `analytics` schema,部分在 `public` schema,代码中需注意
2. **刷新机制**:物化视图需手动刷新 `REFRESH MATERIALIZED VIEW`,不自动更新
3. **索引**:重建物化视图后需重新创建索引
4. **阈值调优**:异常判断阈值需根据业务调整(如"消费-优惠与实收不平"阈值从0.05元提高到1元)
### 2.3 异常账单阈值设计
```sql
-- 异常类型判断(CASE WHEN顺序重要)
CASE
WHEN consumption > 0 AND received = 0 THEN '有消费无实收'
WHEN discount > consumption THEN '优惠大于消费'
WHEN abs(consumption - discount - received) > 1 THEN '消费-优惠与实收不平'
ELSE NULL
END
```
**关键教训**:阈值0.05元太严格,会将舍入差异标为异常。建议初始阈值设为1元,后续根据数据分布调整。
## 3. 数据质量校验
### 3.1 校验流程
1. **数据范围**`SELECT DISTINCT month FROM bill_records ORDER BY month` 确认最新月份
2. **门店数**`SELECT count(DISTINCT c003) FROM bill_records WHERE month = '2026-04'`
3. **金额一致性**`SELECT sum(c009), sum(c068), sum(c114)` 对比前后端
4. **物化视图刷新状态**:对比物化视图和原始表的记录数
### 3.2 常见数据问题
| 问题 | 症状 | 排查方法 |
|------|------|---------|
| 物化视图stale | API数据与数据库不一致 | 直接查原始表对比物化视图 |
| 月份格式不匹配 | 查询返回0条 | 检查 salary_period 实际格式 |
| 门店名不一致 | 部分门店无数据 | 对比不同表的门店名列表 |
| Schema前缀错误 | `relation does not exist` | 检查 `\dn``pg_matviews` |
| 列不存在 | `column does not exist` | 检查 `information_schema.columns` |
@@ -0,0 +1,176 @@
# 04 · 步骤三:中层访谈与执行层准备
> 目标:将指标体系从"老板看的"落地为"中层和一线执行的",明确谁来做、做到什么程度、如何考核。 `[Echo主导]`
>
> FDE角色:这一步是Echo层在组织中的延伸——不只是技术交付,更是流程改造。需要嵌入中层和一线的工作现场,理解真实痛点,才能设计出可执行的任务闭环。
## 1. 中层访谈准备
### 1.1 访谈对象
| 角色 | 人数 | 关注重点 |
|------|------|---------|
| 区域经理 | 3-5人 | 区域整体经营、门店评级、人员调配 |
| 店长代表 | 5-8人(红/黄/绿各选) | 门店日常运营、成本控制、任务执行 |
| 商品部/供应链 | 1-2人 | 菜品成本、BOM、采购、配送 |
| 财务 | 1人 | 费用归集、成本核算口径 |
### 1.2 访谈提纲
```
一、职权范围
1. 你日常负责哪些门店/区域?核心KPI是什么?
2. 哪些决策你能直接做?哪些需要上报?
3. 你希望看到哪些数据来辅助你的日常决策?
二、执行痛点
4. 总部下发的任务,你觉得哪些好执行、哪些难落地?
5. 你觉得目前哪些指标考核不合理?
6. 如果系统能自动帮你发现一个问题并派发任务,你最希望是什么?
三、数据使用习惯
7. 你现在每天/每周看什么报表?
8. 哪些数据你觉得不准或滞后?
9. 如果有一个"门店工作台",你最希望它包含什么功能?
四、闭环反馈
10. 整改任务从下发到完成,通常需要多久?
11. 执行中最大的阻力是什么?
12. 如何验证整改效果?
```
### 1.3 典型回答与拆解
**区域经理说**:"我最头疼的是有些店长不主动整改,等我去检查才发现问题"
拆解:
- 系统需求:自动预警→自动派发任务→跟踪完成率→逾期上报
- 指标关联:任务生成率、店长执行率、区域周检率
- 执行层设计:预警触发→任务模板→店长接收→限期完成→区域验收
**店长说**:"我不知道自己店在区域排第几,也不知道哪里做得不好"
拆解:
- 系统需求:门店工作台→对标分析→偏差诊断→改进建议
- 指标关联:日均实收、客单价、成本率、风险评级
- 执行层设计:店长打开页面即可看到本店vs区域均值偏差
## 2. 岗位-指标矩阵
### 2.1 矩阵设计
| 指标 | 老板 | 区域经理 | 店长 | 商品部 |
|------|------|---------|------|--------|
| 营收总额 | 👁️ 看 | 👁️ 看 | — | — |
| 门店贡献利润 | 👁️ 看 | 👁️ 看 | 👁️ 看 | — |
| 食材成本率 | 👁️ 看 | 👁️ 看 | 👁️ 看 | 👁️ 看 |
| 人工费率 | — | 👁️ 看 | 👁️ 看 | — |
| 风险评级 | 👁️ 看 | 🔄 管 | 🔄 管 | — |
| 客流-人力匹配 | — | 👁️ 看 | 🔄 管 | — |
| 异常账单 | — | 🔄 管 | 🔄 管 | — |
| 菜品成本方差 | — | — | — | 🔄 管 |
| 任务完成率 | 👁️ 看 | 🔄 管 | 🔄 做 | — |
| BOM准确率 | — | — | — | 🔄 管 |
- 👁️ 看:只看数据,不直接操作
- 🔄 管:负责监督和整改
- 🔄 做:负责执行和反馈
### 2.2 数据权限设计
```typescript
// 后端 getDataScope 实现
interface DataScope {
role: 'hq' | 'regional' | 'store' | 'dept'
store_names: string[] | null // null = 全部门店
region?: string // 区域经理管辖区域
store_code?: string // 店长所属门店
}
```
| 角色 | 可见范围 | 可操作范围 |
|------|---------|-----------|
| 总部管理员 | 全部门店 | 全部 |
| 区域经理 | 本区域门店 | 本区域 |
| 店长 | 本店 | 本店 |
| 商品部 | 全部门店(只读) | 菜品/BOM相关 |
## 3. 执行层设计
### 3.1 任务闭环模型
```
预警触发 → 任务生成 → 店长接收 → 整改执行 →
区域验收 → 效果检验 → 经验沉淀 → 关闭/重开
```
### 3.2 任务模板
| 预警类型 | 任务标题 | 责任人 | 期限 | 验收标准 |
|---------|---------|--------|------|---------|
| 食材成本率>45% | "XX店食材成本率超标,请分析原因并提交整改方案" | 店长 | 7天 | 成本率降至40%以下 |
| 连续亏损 | "XX店连续2月亏损,请制定扭亏方案" | 店长+区域经理 | 14天 | 当月贡献利润转正 |
| 异常账单增多 | "XX店异常账单数异常,请核查收银流程" | 店长 | 3天 | 异常账单数下降50% |
| 客流-人力不匹配 | "XX店高峰人手不足,请调整排班" | 店长 | 3天 | 高峰时段人均产出<15单 |
| 任务逾期 | "XX店有N项整改任务逾期,请督促完成" | 区域经理 | 3天 | 逾期任务清零 |
### 3.3 闭环健康度指标
| 指标 | 计算方式 | 目标值 |
|------|---------|--------|
| 任务生成率 | 已生成任务数 / 应生成预警数 | >80% |
| 店长执行率 | 已完成任务数 / 已接收任务数 | >70% |
| 区域周检率 | 本周已检查门店数 / 本周应检查门店数 | >90% |
| 月度验收率 | 本月已验收任务数 / 本月已完成任务数 | >80% |
| 经验推广率 | 已推广最佳实践数 / 已沉淀最佳实践数 | >50% |
## 4. 门店工作台设计
### 4.1 页面结构
```
┌─────────────────────────────────────────────────┐
│ 门店工作台 - 潘家园店 [2026年4月] │
├─────────────────────────────────────────────────┤
│ [日均实收] [客单价] [优惠率] [毛利率] [风险等级] │
│ 20,144 36.8 20.5% 61.8% 🟢 绿色 │
│ (vs区域均值) (+5%) (-2%) (+1%) (持平) │
├─────────────────────────────────────────────────┤
│ Tab1: 日报卡 Tab2: 风险 Tab3: 成本 │
│ Tab4: 会员 Tab5: 排班 Tab6: 任务 │
├─────────────────────────────────────────────────┤
│ 📋 今日待办任务(3项) │
│ □ 食材成本率超标整改(还剩5天) │
│ □ 异常账单核查(还剩2天) │
│ □ 排班优化(今日截止) │
├─────────────────────────────────────────────────┤
│ 📊 餐段分析(早/午/晚各时段实收vs区域均值) │
│ 📊 品类结构(各品类销售占比) │
│ 📋 异常账单明细 │
└─────────────────────────────────────────────────┘
```
### 4.2 店长视角的核心需求
1. **对标定位**:本店 vs 区域均值,一眼看出哪里偏差大
2. **任务驱动**:打开就有待办,不用自己去翻报表找问题
3. **一键诊断**:点击偏差指标,自动展开原因分析
4. **整改跟踪**:任务有期限、有验收、有效果检验
## 5. 访谈输出物
| 输出物 | 说明 | 后续步骤使用 |
|--------|------|-------------|
| 岗位-指标矩阵 | 每个岗位看什么、管什么、做什么 | 步骤四模型设计、步骤七页面权限 |
| 任务模板库 | 预警→任务→验收的标准流程 | 步骤四闭环验证、步骤六API开发 |
| 门店工作台原型 | 店长页面的布局和功能 | 步骤七前端实现 |
| 数据权限规则 | 各角色的数据可见范围 | 步骤六API的getDataScope |
| 闭环健康度指标 | 5项rate指标定义和目标值 | 步骤六API、步骤七总部驾驶舱 |
## 6. 关键注意事项
1. **不要跳过中层直接到一线**:区域经理是承上启下的关键环节
2. **任务模板要具体**:不能是"请改进",必须是"请将食材成本率从45%降至40%"
3. **考核要联动**:系统指标要与现有KPI考核挂钩,否则没人会用
4. **店长的声音很重要**:选红/黄/绿各色门店的店长,了解不同状态下的痛点
5. **执行层不是管控工具**:是帮中层和一线更好地工作的工具,定位要正确
@@ -0,0 +1,202 @@
# 05 · 步骤四:AI协同模型设计与逻辑闭环验证
> 目标:在写代码前,用AI验证从战略指标到数据执行的全链路逻辑完整性,发现并修复断点。 `[Echo+Delta]`
>
> FDE角色:这是"先想清楚再动手"的关键步骤。Echo层定义业务逻辑闭环,Delta层用AI验证技术可行性。逻辑断点在这一步修复,成本远低于编码后返工。
## 1. 模型设计框架
### 1.1 三层模型映射
```
指挥层模型(战略→指标)
战略目标 → 核心指标 → 展示形式 → 预警规则
本体层模型(数据→指标)
原始表 → 物化视图 → API字段 → 前端变量
执行层模型(指标→任务→闭环)
指标偏差 → 预警触发 → 任务生成 → 执行反馈 → 效果检验
```
### 1.2 AI协同设计流程
```
1. 输入:指标体系 + 数据现状 + 岗位矩阵
2. AI生成:完整的数据模型设计草案
- 每个指标的计算公式
- 数据源映射
- 物化视图设计
- API设计
- 预警规则
- 任务模板
3. 人工审查:业务逻辑是否正确
4. AI验证:逻辑闭环是否完整
5. 输出:可执行的技术方案
```
## 2. 指标计算模型
### 2.1 核心指标公式
| 指标 | 公式 | 数据源 | 注意事项 |
|------|------|--------|---------|
| 营业收入 | `sum(consumption)` | bill_fact.consumption | — |
| 优惠 | `sum(discount_total)` | bill_fact.discount_total | — |
| 实收 | `sum(received_total)` | bill_fact.received_total | — |
| 客单价 | `sum(received) / sum(bill_count)` | bill_fact | 注意:不是avg(received_total) |
| 优惠率 | `avg(discount_total / consumption * 100)` | bill_fact | 逐单计算再平均 |
| 理论毛利率 | `sum(theoretical_profit) / sum(received) * 100` | bill_fact | — |
| 会员占比 | `sum(received) FILTER(member_id非空) / sum(received) * 100` | bill_fact | — |
| 食材成本率 | `sum(actual_food_cost) / sum(matched_received) * 100` | mv_store_operating_expense_monthly | 分母必须用matched口径 |
| 人工费率 | `sum(wage_expense) / sum(matched_received) * 100` | 同上 | 同上 |
| 贡献利润 | `sum(received) FILTER(has_expense) - food_cost - operating_expense` | 多表JOIN | FILTER vs COALESCE口径要统一 |
### 2.2 口径一致性规则
**核心原则**:同一指标在多个页面展示时,必须使用同一数据源和同一计算方式。
```sql
-- 正确:费用率分母统一为matched_received
sum(operating_expense) / sum(received) FILTER(WHERE has_expense) * 100
-- 错误:分母包含无费用门店
sum(operating_expense) / sum(received) * 100
```
**FILTER vs COALESCE**
- `sum(x) FILTER(WHERE has_expense)` — 排除无费用门店的整行
- `sum(COALESCE(x, 0))` — 无费用门店的x视为0,但received仍计入分母
- 两者在计算金额时结果相同,但在计算比率时分母不同
## 3. 物化视图模型
### 3.1 设计原则
1. **预聚合到月度+门店粒度**:原始表千万级,API不能直接查
2. **一个视图服务多个API**:避免为每个API建一个视图
3. **字段命名统一**`received``consumption``bill_count`在各视图中保持一致
4. **刷新机制明确**:每个视图有对应的刷新脚本
### 3.2 核心视图清单
| 视图 | 粒度 | 用途 | 关键字段 |
|------|------|------|---------|
| mv_store_risk_rating_monthly | 月×门店 | 门店评级 | risk_level, received, bill_count |
| mv_store_operating_expense_monthly | 月×门店 | 费用分析 | food_cost, wage, rent, utility |
| mv_store_platform_economics_monthly | 月×门店 | 平台经济性 | meituan_received, eleme_cost_rate |
| mv_bill_hourly | 月×门店×小时 | 客流分析 | bills, avg_guests |
| mv_overview_daily | 日 | 日度概览 | received, bill_count |
| mv_overview_monthly | 月 | 月度概览 | received, bill_count, avg_bill_value |
| mv_risk_anomaly | 月×门店×账单 | 异常账单 | anomaly_reason, consumption |
| mv_risk_cashier | 月×门店×收银员 | 收银员风险 | bill_count, anomaly_bills |
### 3.3 AI协同验证
```
AI Prompt示例:
"请检查以下物化视图设计是否覆盖了指标体系中的所有L0和L1指标。
指标体系:[附上指标体系文档]
物化视图清单:[附上视图清单]
输出:覆盖度矩阵 + 缺失指标 + 建议"
```
## 4. 逻辑闭环验证
### 4.1 闭环图
```
数据采集 → 物化视图 → API查询 → 前端展示 → 人工决策
↑ ↓
效果检验 ← 任务关闭 ← 执行反馈 ← 任务接收 ← 预警触发
```
### 4.2 AI验证清单
| 验证项 | 检查内容 | 方法 |
|--------|---------|------|
| 数据覆盖度 | 每个指标是否有数据源 | 指标→视图→表→字段 逐项追溯 |
| 计算正确性 | 公式是否正确 | 用已知数据验证计算结果 |
| 口径一致性 | 跨页面同一指标是否一致 | 对比不同API的返回值 |
| 预警完整性 | 每个预警是否有触发条件和任务模板 | 逐条检查预警规则 |
| 任务闭环 | 任务从生成到关闭是否有完整流程 | 模拟走一遍流程 |
| 权限正确性 | 各角色是否只看到应有数据 | 模拟不同角色登录验证 |
| 空状态处理 | 无数据时是否优雅降级 | 测试新月份/新门店场景 |
### 4.3 逻辑断点示例
**断点1**:预警"食材成本率>45%"已配置,但没有对应的任务模板
```
修复:添加任务模板"食材成本率超标整改"
```
**断点2**:任务"排班优化"已配置,但系统没有客流-人力匹配数据
```
修复:补充attendance_records解析逻辑,生成客流-人力匹配指标
```
**断点3**:店长能看到本店数据,但无法看到区域均值对标
```
修复:在/stores/:code API中增加区域均值字段
```
**断点4**:利润瀑布图的received包含无费用门店,导致费率偏低
```
修复:received改为FILTER(WHERE has_expense)口径
```
## 5. AI协同设计输出
### 5.1 技术方案文档
```
1. 数据模型设计
- 原始表ER图
- 物化视图清单和SQL
- 门店名映射表
2. API设计
- 路由清单
- 每个API的SQL查询
- 请求参数和响应格式
- 数据权限规则
3. 前端设计
- 页面清单
- 每个页面的组件布局
- 指标卡配置
- 图表配置
4. 预警与任务设计
- 预警规则清单
- 任务模板库
- 闭环健康度指标
```
### 5.2 验证报告
```
1. 覆盖度报告
- 指标覆盖率:X/Y
- 数据覆盖率:哪些指标有数据,哪些缺数据
2. 口径一致性报告
- 跨页面指标对比表
- 不一致项及修复方案
3. 闭环验证报告
- 预警→任务→执行→反馈 全链路测试结果
- 发现的断点及修复方案
4. 性能预估
- 各API预估响应时间
- 物化视图刷新耗时
```
## 6. 关键注意事项
1. **先验证再编码**:这一步的目的是在写代码前发现逻辑问题,避免返工
2. **AI是协同不是替代**AI生成方案,人审查业务合理性
3. **闭环比单点重要**:一个指标算错了是bug,一个闭环断了是系统失效
4. **口径要从一开始统一**:后期修复口径不一致的成本远高于初期统一
5. **留出迭代空间**:第一版不需要覆盖所有指标,先跑通核心闭环
@@ -0,0 +1,192 @@
# 06 · 步骤五:AI协同本体层构建
> 目标:AI参与数据层代码编写——物化视图SQL、导入脚本、数据质量校验,并逐项验证。 `[Delta主导,AI为主]`
>
> FDE角色:这一步是Delta层的核心工作。AI承担80%的代码生成(SQL、脚本),人聚焦审查和验证。本体层的沉淀质量直接决定下一个同类客户的交付速度。
## 1. AI协同模式
### 1.1 工作流程
```
1. 人工提供:数据现状(表结构、样本数据、数据量)
2. AI生成:物化视图SQL草案
3. 人工审查:业务逻辑是否正确
4. AI执行:在数据库上创建视图 + 验证数据
5. 人工确认:抽查数据准确性
6. 迭代:发现问题→AI修复→再验证
```
### 1.2 AI Prompt模式
```
"请基于以下原始表设计物化视图:
- 原始表:bill_records(字段:c003门店, c009消费, c068优惠, c114实收, c175下单时间, c176结账时间, c191收银员)
- 需求:按月×门店×小时聚合账单数、消费、优惠、实收
- 注意:c114可能为空字符串,需COALESCE处理
输出:CREATE MATERIALIZED VIEW SQL + 索引SQL"
```
## 2. 物化视图构建
### 2.1 构建顺序
```
1. 基础视图(不依赖其他视图)
├── mv_bill_hourly(账单小时聚合)
├── mv_overview_daily(日度概览)
└── mv_overview_monthly(月度概览)
2. 门店评级视图(依赖基础视图)
├── mv_store_risk_rating_monthly(门店风险评级)
└── mv_store_benchmark_composite_monthly(门店对标)
3. 费用视图(依赖外部费用数据)
└── mv_store_operating_expense_monthly(门店费用)
4. 风险明细视图(依赖原始表)
├── mv_risk_anomaly(异常账单)
├── mv_risk_zero(零实收)
└── mv_risk_cashier(收银员风险)
5. 平台视图
└── mv_store_platform_economics_monthly(平台经济性)
```
### 2.2 AI协同编写物化视图
**典型交互**
```
人:bill_records中c003是门店名,c114是实收金额,但有些是空字符串
AI:生成SQL
CREATE MATERIALIZED VIEW mv_bill_hourly AS
SELECT
c003 AS store_name,
EXTRACT(HOUR FROM c176::timestamp) AS hour,
to_char(c176::timestamp, 'YYYY-MM') AS month,
count(*) AS bills,
sum(COALESCE(NULLIF(c009,'')::numeric, 0)) AS consumption,
sum(COALESCE(NULLIF(c114,'')::numeric, 0)) AS received
FROM bill_records
WHERE c176 IS NOT NULL
GROUP BY 1, 2, 3;
人:门店名需要和费用表对齐,有些名字不一样
AI:补充映射逻辑,使用store_name_mapping
```
### 2.3 异常账单视图设计
```sql
-- AI协同设计的异常判断逻辑
CASE
WHEN consumption > 0 AND received = 0 THEN '有消费无实收'
WHEN discount > consumption THEN '优惠大于消费'
WHEN abs(consumption - discount - received) > 1 THEN '消费-优惠与实收不平'
ELSE NULL
END
```
**关键教训**:阈值0.05元太严格,会将浮点舍入差异标为异常。AI建议初始阈值设为1元,后续根据数据分布调整。
## 3. 数据导入脚本
### 3.1 AI协同编写导入脚本
```
人:这是4月的薪资Excel,列名是中文,需要导入salary_detail_records
AI:生成Python/SQL导入脚本,包含:
- 列名映射(中文→英文字段名)
- 数据类型转换
- 空值处理
- 去重逻辑
- 进度输出
```
### 3.2 导入关键点
| 数据源 | 关键问题 | 解决方案 |
|--------|---------|---------|
| bill_records | c001~c200列名无含义 | 建立字段映射文档 |
| salary_detail_records | salary_period格式"2026年4月" | 查询时用to_char中文格式 |
| attendance_records | department是路径字符串 | extractStore从后往前找"店" |
| 费用数据 | 门店名与账单系统不一致 | store_name_mapping映射表 |
## 4. 数据质量校验
### 4.1 AI协同校验
```
AI Prompt
"请对以下物化视图进行数据质量校验:
1. 记录数是否合理(与原始表对比)
2. 金额加总是否一致(物化视图 vs 原始表)
3. 是否有NULL或异常值
4. 门店数是否完整
输出:校验SQL + 预期结果 + 实际结果"
```
### 4.2 校验清单
| 校验项 | SQL | 预期 |
|--------|-----|------|
| 门店数 | `SELECT count(DISTINCT store_name) FROM mv_bill_hourly WHERE month='2026-04'` | ~94家 |
| 实收总额 | `SELECT sum(received) FROM mv_bill_hourly WHERE month='2026-04'` | ~6369万 |
| 账单总数 | `SELECT sum(bills) FROM mv_bill_hourly WHERE month='2026-04'` | ~168万 |
| 异常账单占比 | `SELECT count(*) FROM mv_risk_anomaly / SELECT count(*) FROM bill_records` | <5% |
| 物化视图新鲜度 | 对比物化视图和原始表的count | 一致 |
## 5. 门店名映射
### 5.1 映射表构建
```sql
CREATE TABLE public.store_name_mapping (
salary_name TEXT, -- 薪资/考勤系统中的名称
bill_name TEXT -- 账单系统中的名称
);
```
### 5.2 AI协同发现映射
```
AI Prompt
"请对比以下两个数据源的门店名,找出不一致的:
- 账单系统:SELECT DISTINCT store_name FROM mv_bill_hourly
- 考勤系统:SELECT DISTINCT extractStore(department) FROM attendance_records
输出:需要映射的对照表"
```
### 5.3 代码中的映射查找模式
```typescript
// 构建查找表:同时用原名和映射名
const staffLookup: Record<string, any> = {}
for (const [store, data] of Object.entries(staffSummary)) {
staffLookup[store] = data // 原名
const mapped = nameMap[store]
if (mapped && mapped !== store) {
staffLookup[mapped] = data // 映射名
}
}
```
## 6. 输出物
| 输出物 | 说明 | 验证方式 |
|--------|------|---------|
| 物化视图SQL | 所有视图的CREATE语句 | psql执行成功 |
| 索引SQL | 每个视图的索引 | 查询性能达标 |
| 导入脚本 | 各数据源的导入脚本 | 导入后数据量正确 |
| 映射表 | store_name_mapping | 所有门店能匹配 |
| 数据质量报告 | 校验结果汇总 | 人工抽查确认 |
| 刷新脚本 | 物化视图刷新流程 | 执行后数据更新 |
## 7. 关键注意事项
1. **先查数据再写SQL**:AI生成SQL前,先让它查实际表结构和样本数据
2. **物化视图必须建索引**:无索引的物化视图查询比原始表还慢
3. **刷新脚本要完整**:遗漏任何一个视图的刷新都会导致数据不一致
4. **映射表要持续维护**:新开门店时需要补充映射
5. **AI生成的SQL必须人工审查**:AI可能忽略业务约束(如空值处理、日期格式)
@@ -0,0 +1,213 @@
# 07 · 步骤六:AI协同后端API构建与验证
> 目标:AI参与API开发,逐个验证——快速交付能用的代码,不追求完美架构。 `[Delta主导,AI为主]`
## 1. 指标分层设计
```
L0: 原始数据层 (bill_records, salary_detail_records, attendance_records)
L1: 预聚合层 (物化视图 mv_*)
L2: API层 (后端路由,SQL查询 + 业务逻辑)
L3: 展示层 (前端页面,图表 + 表格)
```
## 2. 页面与API总览
| 页面 | 文件 | 调用的 API |
|------|------|-----------|
| 总部驾驶舱 | DashboardPage.tsx | /overview, /overview/daily, /stores/risk, /stores/priority, /tasks/loop-health, /stores/quadrant, /platform/economics, /situational-awareness/alerts, /store-expense/overview, /overview/yoy, /overview/mom, /overview/trend, /overview/profit-trend |
| 老板驾驶舱 | BossPage.tsx | /overview, /overview/daily, /store-expense/overview, /overview/profit-waterfall, /stores/risk, /stores/priority, /cost-analysis/store-overview, /store-expense/expense-structure, /overview/store-profit-ranking, /overview/profit-opportunity |
| 门店工作台 | StorePage.tsx | /stores/risk, /stores/priority, /tasks/stores/:code/daily-card, /tasks, /stores/:code/daily, /tasks/followup, /sku/attach, /sku/abc, /stores/:code, /situational-awareness/health-score, /stores/:code/meal-period, /stores/:code/category-mix, /stores/:code/cost, /stores/:code/member, /stores/:code/anomalies, /stores/:code/staffing |
| 成本分析 | CostPage.tsx | /cost/comparison, /cost/inventory, /cost/category-benchmark |
| 成本分析(Tab) | cost-analysis/*.tsx | /cost-analysis/overview, /category-comparison, /margin-deviation, /variance-top, /menu-engineering, /profitability, /pricing, /store-overview, /store-ranking, /bom-*, /packaging-*, /material-*, /data-quality, /unmatched-* |
| 费用分析(Tab) | store-expense/*.tsx | /store-expense/overview, /expense-structure, /store-ranking, /store-contribution, /break-even, /loss-diagnosis, /delivery-commission, /rent-risk, /fixed-variable, /efficiency, /store-evaluation |
| 风险监控 | RiskPage.tsx | /risk/anomaly, /risk/zero-received, /risk/cashier |
| 态势感知 | SituationalAwarenessPage.tsx | /situational-awareness/health-score, /alerts, /correlation, /forecast |
| 会员复购 | MemberPage.tsx | /member/comparison, /member/repeat |
| SKU分析 | SKUPage.tsx | /sku/abc, /sku/category |
| 菜单工程 | MenuEngineeringPage.tsx | /analytics-enhanced/menu-engineering/actions |
| 产品生命周期 | ProductLifecyclePage.tsx | /product/products, /product/reviews/overview, /product/reviews |
| BOM穿透 | BomPenetrationPage.tsx | /central-kitchen/bom-penetration |
| 分销对账 | DistributionReconciliationPage.tsx | /distribution/reconciliation |
| 生产计划 | ProductionPlanPage.tsx | /sales-driven/production-plan |
| 任务闭环 | TasksPage.tsx | /tasks |
| 数据导入 | DataImportPage.tsx | /product/import-logs, /product/quality-rules |
| 本体浏览 | OntologyPage.tsx | /tasks/ontology/* |
> 详细的逐页面→API→SQL→数据源字段映射,见 [08-数据溯源与API全量清单.md](08-数据溯源与API全量清单.md)
## 3. 后端API规范
### 3.1 路由组织
```
server/src/routes/
├── data.ts # 核心数据API(概览、门店、风险明细等)
├── situational-awareness.ts # 态势感知(健康度、预警、关联分析)
├── smart-scheduling.ts # 智能排班
├── cost-analysis.ts # 成本分析
├── store-expense.ts # 门店费用
├── analytics-enhanced.ts # 增强分析
├── admin.ts # 管理
└── tts.ts # 语音
```
### 2.2 通用模式
```typescript
// 月份参数解析
const month = parseMonth(req) // 从 query 参数获取,默认 '2026-04'
// 分页
const { page, pageSize, offset } = parsePagination(req)
// 数据权限
const scope = getDataScope(req) // 返回 store_names 数组或 null(全部)
// 响应格式
sendSuccess(res, data, meta?) // { success: true, data, meta }
sendError(res, message) // { success: false, error: message }
```
### 2.3 SQL查询模式
**安全参数化**
```typescript
// 正确:参数化查询
const result = await query(`SELECT * FROM mv_risk_anomaly WHERE month = to_char($1::date, 'YYYY-MM')`, [month])
// 错误:字符串拼接
const result = await query(`SELECT * FROM mv_risk_anomaly WHERE month = '${month}'`)
```
**动态条件构建**
```typescript
const conditions: string[] = [`month = to_char($1::date, 'YYYY-MM')`]
const params: any[] = [month]
let paramIdx = 2
if (storeName) {
conditions.push(`store_name = $${paramIdx}`)
params.push(storeName)
paramIdx++
}
const whereClause = conditions.join(' AND ')
```
**聚合汇总+分页**
```typescript
// 先查总数和汇总
const countResult = await query(`SELECT count(*) AS total, sum(consumption) AS sum_consumption FROM mv_risk_anomaly WHERE ${whereClause}`, params)
// 再查明细
const result = await query(`SELECT * FROM mv_risk_anomaly WHERE ${whereClause} ORDER BY ${sortCol} ${order} LIMIT $${paramIdx} OFFSET $${paramIdx + 1}`, [...params, pageSize, offset])
```
## 3. 常见SQL陷阱与修复
### 3.1 Schema前缀错误
**症状**`relation "analytics.mv_channel_daily" does not exist`
**排查**
```sql
SELECT schemaname, matviewname FROM pg_matviews WHERE matviewname LIKE '%channel%';
```
**修复**:确认实际schema,移除或修正前缀
```typescript
// 错误:FROM analytics.mv_channel_daily
// 正确:FROM mv_channel_daily (实际在public schema)
```
### 3.2 列名不存在
**症状**`column "risk_score" does not exist`
**排查**
```sql
SELECT column_name FROM information_schema.columns WHERE table_name = 'mv_store_risk_rating_monthly';
```
**修复策略**
- 策略A:改用 `SELECT *`(当不需要特定列名时)
- 策略B:用 `0 AS column_name` 替代不存在的列(当前端期望该字段时)
- 策略C:修正为正确的列名
### 3.3 日期格式不匹配
**症状**:薪资相关查询返回0条
**排查**
```sql
SELECT DISTINCT salary_period FROM salary_detail_records ORDER BY 1 DESC LIMIT 5;
-- 结果:2026年4月(非2026-04
```
**修复**
```typescript
// 错误:s.salary_month = to_char($1::date, 'YYYY-MM')
// 正确:s.salary_period = to_char($1::date, 'YYYY"年"FMMM"月"')
```
### 3.4 物化视图stale
**症状**API返回数据与直接查原始表不一致
**排查**:对比物化视图和原始表的count
```sql
SELECT count(*) FROM mv_risk_anomaly WHERE month = '2026-04';
SELECT count(*) FROM bill_records WHERE to_char(c176::timestamp, 'YYYY-MM') = '2026-04' AND ...;
```
**修复**:重建物化视图
```sql
DROP MATERIALIZED VIEW mv_risk_anomaly;
CREATE MATERIALIZED VIEW mv_risk_anomaly AS ...;
CREATE INDEX idx_mv_risk_anomaly_month ON mv_risk_anomaly(month);
```
## 4. 考勤打卡数据解析
### 4.1 department路径解析门店名
```
北京西部马华餐饮有限公司/西部马华品牌门店/胡庆鹏区/HQP2区/双安店/前厅/服务组
```
**提取逻辑**(从后往前找以"店"结尾的层级):
```typescript
function extractStore(dept: string): string {
const parts = dept.split('/')
for (let i = parts.length - 1; i >= 0; i--) {
if (parts[i].endsWith('店')) return parts[i]
}
return ''
}
```
### 4.2 打卡时间解析
格式:`08:43(考勤机:指纹)\n21:23(考勤机:指纹)`
```typescript
function parseClockTimes(raw: string): { start: number; end: number } | null {
const times = raw.match(/(\d{1,2}):(\d{2})/g)
if (!times || times.length < 2) return null
const startHour = parseInt(times[0].match(/(\d{1,2}):/)[1])
let endHour = parseInt(times[times.length - 1].match(/(\d{1,2}):/)[1])
if (endHour < startHour) endHour = 23 // 跨天
return { start: startHour, end: endHour }
}
```
### 4.3 日均在岗人数估算
```typescript
// 每个员工每天打卡算1人在岗,按小时累计
// 月度汇总后除以30天得到日均同时在岗人数
staffSummary[store][hour] = Math.round(totalPersonHours[store][hour] / 30)
```
**关键点**:客流数据 `mv_bill_hourly.bills` 也是月度汇总,展示时需除以30天对齐。
@@ -0,0 +1,137 @@
# 08 · 步骤七:AI协同前端UIUX设计与实现
> 目标:AI参与页面设计,参考典型页面模板——先交付能用的,再迭代好用的。 `[Delta主导,AI为主]`
## 1. 技术栈
- React 18 + TypeScript
- Vite 构建
- @tanstack/react-query 数据请求
- Recharts 图表
- 自研UI组件库(无第三方UI框架)
## 2. 组件规范
### 2.1 核心组件
| 组件 | 用途 | 关键Props |
|------|------|-----------|
| `MetricCard` | 指标卡 | `label`, `value`, `format: 'number'\|'percent'\|'currency'` |
| `FilterableTable` | 可筛选排序表格 | `columns`, `filterKey`, `sortOptions`, `data` |
| `CollapsibleSection` | 可折叠区域 | `title`, `subtitle`, `defaultOpen` |
| `MonthPicker` | 月份选择器 | `month`, `onChange` |
| `LoadingSpinner` | 加载动画 | `text` |
### 2.2 页面结构模板
```tsx
export default function XxxPage() {
const { month, setMonth } = useMonthParam()
return (
<div className="space-y-6">
{/* 1. 顶部标题 + MonthPicker */}
<div className="flex items-center justify-between">
<h1 className="text-2xl font-bold"></h1>
<MonthPicker month={month} onChange={setMonth} />
</div>
{/* 2. MetricCard 概览行 */}
<div className="grid grid-cols-4 gap-4">
<MetricCard label="指标1" value={data?.metric1} format="currency" />
<MetricCard label="指标2" value={data?.metric2} format="number" />
</div>
{/* 3. CollapsibleSection 包裹图表 */}
<CollapsibleSection title="图表区" defaultOpen>
<ResponsiveContainer width="100%" height={300}>
<BarChart data={data?.chart}>
<XAxis dataKey="name" />
<YAxis />
<Bar dataKey="value" />
</BarChart>
</ResponsiveContainer>
</CollapsibleSection>
{/* 4. FilterableTable 展示明细 */}
<FilterableTable
columns={columns}
data={data?.list || []}
filterKey="store_name"
sortOptions={[{ key: 'received', label: '按实收' }]}
/>
</div>
)
}
```
## 3. 月份参数管理
### 3.1 统一Hook
```typescript
// client/src/lib/useMonthParam.ts
export const DEFAULT_MONTH = '2026-04'
export function useMonthParam() {
const [month, setMonth] = useState(DEFAULT_MONTH)
// 同步URL参数
useEffect(() => {
const params = new URLSearchParams(location.search)
const m = params.get('month')
if (m) setMonth(m)
}, [])
return { month, setMonth }
}
```
### 3.2 关键原则
- **所有页面统一使用 `useMonthParam`**,不各自 `new Date().toISOString().slice(0,7)`
- **默认月份设为有数据的最新月份**,避免空白页面
- 修改默认月份只需改 `DEFAULT_MONTH` 一处
## 4. 数据请求模式
```typescript
const { data, isLoading } = useQuery({
queryKey: ['xxx-data', month],
queryFn: () => api.get('/api/xxx', { params: { month } }),
staleTime: 5 * 60 * 1000, // 5分钟缓存
})
```
## 5. 数据展示约定
### 5.1 日期格式
后端返回ISO格式 `2026-04-29T16:00:00.000Z`,前端必须截取:
```typescript
{new Date(item.business_date).toISOString().substring(0, 10)}
```
### 5.2 金额格式化
```typescript
formatCurrency(1234567.89) // ¥1,234,567.89
formatNumber(12345) // 12,345
formatPercent(85.5) // 85.5%
```
### 5.3 空状态处理
```tsx
{isLoading ? <LoadingSpinner text="加载中..." /> :
data?.length === 0 ? <div className="text-center py-8 text-gray-400"></div> :
<FilterableTable data={data} ... />}
```
## 6. 典型参考页面
| 页面 | 文件 | 特点 |
|------|------|------|
| 老板驾驶舱 | `BossPage.tsx` | 多Tab + MetricCard + 图表组合 |
| 会员复购 | `MemberPage.tsx` | FilterableTable + BarChart + PieChart |
| 店长工作台 | `StorePage.tsx` | 多Tab + FilterableTable + 图表 |
| SKU分析 | `SKUPage.tsx` | ABC分类 + 可展开详情 |
| 态势感知 | `SituationalAwarenessPage.tsx` | 多Tab + 预警卡片 + 关联分析 |
@@ -0,0 +1,230 @@
# 09 · 步骤八:数据驱动闭环优化
> 目标:上线不是终点,而是持续优化的起点。建立"数据→分析→问题→方案→实施→反馈→检验→优化"的循环。 `[Echo+Delta]`
>
> FDE角色:这一步体现FDE"把不确定的机会变成可重复的流程"的核心理念。Echo层判断改进方向,Delta层用AI生成方案。闭环转起来才是真落地,否则只是交付了一个系统。
## 1. 闭环模型
```
┌─────────────────────────────────────────────────────┐
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 数据采集 │───→│ 分析诊断 │───→│ 发现问题 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ↑ │ │
│ │ ↓ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 优化模型 │←──│ 检验效果 │←──│ 实施改进 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ↑ │ │
│ │ ↓ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 参数调优 │←─────────────────│ AI协同方案 │ │
│ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────┘
```
## 2. 各阶段详解
### 2.1 数据采集
| 数据源 | 频率 | 内容 | 质量要求 |
|--------|------|------|---------|
| 收银系统 | 日 | 账单明细 | 完整性>99% |
| 考勤系统 | 月 | 打卡记录 | 覆盖率>95% |
| 薪资系统 | 月 | 薪资明细 | 准确性100% |
| 费用系统 | 月 | 门店费用 | 及时性<5日 |
| 用户行为 | 实时 | 页面访问、任务执行 | — |
### 2.2 分析诊断
**AI协同分析模式**
```
输入:本月数据 + 上月数据 + 同比数据
AI输出:
1. 整体经营诊断(营收/利润/成本趋势)
2. 异常门店清单(附原因分析)
3. 改善机会排序(按预期收益)
4. 风险预警(下月可能恶化的门店)
```
**分析维度**
- 趋势分析:月度环比、同比、近6月走势
- 结构分析:品类占比、时段占比、平台占比
- 对标分析:门店vs区域均值、vs标杆店
- 归因分析:利润下降→成本率上升→食材成本上升→哪类菜品
### 2.3 发现问题
**问题分类**
| 类别 | 典型问题 | 发现方式 | 严重度 |
|------|---------|---------|--------|
| 经营异常 | 门店连续亏损 | 月度贡献利润<0 | 高 |
| 成本失控 | 食材成本率>45% | 月度成本分析 | 高 |
| 人力浪费 | 低谷时段人员冗余 | 客流-人力匹配 | 中 |
| 风险事件 | 异常账单激增 | 异常账单监控 | 高 |
| 执行不力 | 整改任务逾期 | 任务闭环跟踪 | 中 |
| 数据质量 | 物化视图stale | 数据校验脚本 | 低 |
### 2.4 AI协同改进方案
**AI生成方案模板**
```
问题:XX店食材成本率45%(超标5pp)
AI分析:
1. 原因诊断:
- 牛肉类菜品成本率58%(高于均值12pp)
- 损耗率8%(高于均值3pp)
- 采购单价上涨15%
2. 改进建议:
- 调整牛肉类菜品BOM(预计降本3pp)
- 加强损耗管理(预计降本1pp)
- 评估替代供应商(预计降本1pp)
3. 预期效果:成本率降至40%
4. 跟踪指标:下周成本率、损耗率
```
### 2.5 实施改进
| 改进类型 | 责任人 | 期限 | 跟踪方式 |
|---------|--------|------|---------|
| BOM调整 | 商品部+店长 | 7天 | 下月成本率 |
| 排班优化 | 店长 | 3天 | 客流-人力匹配度 |
| 收银规范 | 店长 | 3天 | 异常账单数 |
| 供应商切换 | 商品部 | 14天 | 采购单价 |
| 人员调整 | 区域经理 | 30天 | 人工费率 |
### 2.6 反馈与检验
**检验方式**
1. **定量对比**:改进前后指标值对比
2. **趋势验证**:连续2-3周数据是否持续改善
3. **对标验证**:与区域均值/标杆店对比是否缩小差距
4. **副作用检查**:改进某指标是否导致其他指标恶化
**反馈机制**
- 改进有效 → 沉淀为最佳实践 → 推广到其他门店
- 改进无效 → 重新分析原因 → 调整方案
- 改进有副作用 → 权衡取舍 → 优化方案
### 2.7 优化模型与参数
**需要持续优化的参数**
| 参数 | 初始值 | 优化依据 | 影响范围 |
|------|--------|---------|---------|
| 异常账单阈值 | 1元 | 误报率<5% | 异常账单数 |
| 高峰人手不足阈值 | 15单/人 | 业务峰值评估 | 客流-人力匹配 |
| 低谷冗余阈值 | 3人 | 门店规模调整 | 客流-人力匹配 |
| 风险评级阈值 | 红/黄/绿规则 | 管理层确认 | 门店评级 |
| 预警触发条件 | 各类规则 | 误报率/漏报率 | 预警数量 |
| 任务期限 | 3/7/14天 | 历史完成率 | 任务逾期率 |
## 3. 闭环运转机制
### 3.1 日循环
```
每日:
- 收银数据自动入库
- 日度概览自动更新
- 营收异动预警检查
- 店长查看日报卡
- 当日任务执行与反馈
```
### 3.2 周循环
```
每周:
- 区域经理周检
- 周度趋势分析
- 任务完成率统计
- 预警处理情况汇总
- AI协同生成周报
```
### 3.3 月循环
```
每月:
- 月度数据导入(考勤/薪资/费用)
- 物化视图刷新
- 月度经营分析(老板驾驶舱)
- 门店评级更新
- 任务闭环健康度评估
- AI协同生成月度诊断报告
- 参数调优评审
- 最佳经验沉淀与推广
```
## 4. AI协同优化模式
### 4.1 AI角色
| 阶段 | AI能力 | 人的角色 |
|------|--------|---------|
| 分析诊断 | 自动生成诊断报告 | 审查判断 |
| 发现问题 | 异常检测、趋势预警 | 确认严重度 |
| 改进方案 | 生成方案草案 | 决策取舍 |
| 效果检验 | 对比分析、副作用检测 | 确认结论 |
| 经验沉淀 | 提炼最佳实践 | 确认可推广性 |
### 4.2 AI Prompt示例
```
"基于以下月度数据,请生成经营诊断报告:
- 本月营收6420万,环比下降3%
- 13家门店亏损,比上月增加2家
- 食材成本率35.3%,上升1.2pp
- 人工费率18.5%,上升0.5pp
- 异常账单3.2万笔,占比1.9%
请输出:
1. 整体诊断(3-5个关键发现)
2. 重点关注门店(附原因)
3. 改进建议(按预期收益排序)
4. 下月风险预警"
```
## 5. 持续优化的关键指标
### 5.1 系统健康度
| 指标 | 目标 | 监控频率 |
|------|------|---------|
| API平均响应时间 | <500ms | 实时 |
| 物化视图刷新耗时 | <5min | 月度 |
| 数据质量校验通过率 | >99% | 月度 |
| 页面加载时间 | <3s | 实时 |
### 5.2 业务价值度
| 指标 | 目标 | 监控频率 |
|------|------|---------|
| 老板驾驶舱月活 | >20次/月 | 月度 |
| 店长工作台日活 | >80%店长 | 日度 |
| 预警处理率 | >90% | 月度 |
| 任务完成率 | >70% | 月度 |
| 整改有效率 | >60% | 月度 |
### 5.3 闭环成熟度
| 等级 | 特征 | 目标 |
|------|------|------|
| L1 起步 | 有数据、无分析 | — |
| L2 可视 | 有Dashboard、无预警 | 本项目已达到 |
| L3 预警 | 有预警、有任务 | 目标状态 |
| L4 闭环 | 任务→执行→反馈→检验 | 持续优化中 |
| L5 智能 | AI自动诊断+推荐方案 | 长期目标 |
## 6. 关键注意事项
1. **闭环不是一次性项目**:是持续运转的管理机制,需要组织保障
2. **数据质量是生命线**:垃圾数据进→垃圾结论出→错误决策→失去信任
3. **不要追求完美模型**:先跑通闭环,再逐步优化参数
4. **人的参与不可少**AI辅助决策,人做最终判断
5. **经验沉淀最重要**:每次改进的有效经验要沉淀为可复制的最佳实践
6. **定期回顾参数**:业务变化后,预警阈值和评级规则需要调整
@@ -0,0 +1,71 @@
# 10 · 技术参考:项目概述与架构
## 1. 项目背景
为连锁经营企业(西部马华,100+门店)构建数据分析智脑平台,覆盖:
- **老板驾驶舱**:门店风险评级、营收概览、平台经济性
- **门店分级**:红/黄/绿三色风险评级与明细
- **态势感知**:健康度评分、自动化预警、跨模块关联分析、趋势预测
- **风险明细**:异常账单、零实收、收银员风险
- **智能排班**:客流热力图、排班匹配度、人效对标、考勤预警
- **成本分析**:理论成本vs实际成本、成本方差、菜品级分析
- **会员复购**:会员占比、复购率、营销方案效果
- **SKU分析**:ABC分类、菜品销售结构
## 2. 技术架构
```
┌─────────────────────────────────────────────────┐
│ 前端 (React + TypeScript + Vite) │
│ - Recharts 图表库 │
│ - @tanstack/react-query 数据请求 │
│ - 自研组件: MetricCard / FilterableTable / │
│ CollapsibleSection / MonthPicker │
│ - 部署到 Nginx 静态文件 │
├─────────────────────────────────────────────────┤
│ 后端 (Express + TypeScript) │
│ - 路由按模块拆分: data.ts / situational- │
│ awareness.ts / smart-scheduling.ts / │
│ cost-analysis.ts / store-expense.ts │
│ - pg 库直连 PostgreSQL │
│ - JWT 认证 + 数据权限 (getDataScope) │
│ - PM2 进程管理 │
├─────────────────────────────────────────────────┤
│ 数据库 (PostgreSQL 15) │
│ - bill_query: 业务数据 (原始表 + 物化视图) │
│ - sbrain_admin: 平台管理 (租户/用户/配置) │
│ - FRP 隧道: 本地5432 → 服务器15432 │
└─────────────────────────────────────────────────┘
```
## 3. 数据流
```
原始Excel/CSV → 导入脚本 → bill_records / salary_detail_records / attendance_records
物化视图层 (mv_*)
┌─────────────┼─────────────┐
↓ ↓ ↓
mv_bill_hourly mv_risk_* mv_store_*_monthly
↓ ↓ ↓
后端API (SQL查询)
前端Dashboard
```
## 4. 部署拓扑
| 组件 | 位置 | 说明 |
|------|------|------|
| 前端 | 服务器 Nginx | `/var/www/dm.all8ai.top` 静态文件 |
| 后端 | 服务器 PM2 | `sbrain-server` 进程,端口9333 |
| 数据库 | 本地 PostgreSQL | 通过FRP隧道暴露到服务器15432 |
| 域名 | dm.all8ai.top | Nginx反向代理 `/api/` → 后端 |
## 5. 关键设计决策
1. **物化视图而非实时查询**:原始表千万级,物化视图预聚合保证API响应速度
2. **FRP隧道而非云数据库**:数据安全要求高,数据库留在本地,通过隧道供服务器访问
3. **多租户SaaS架构**`sbrain_admin` 管理租户配置,`tenant_configs` 表驱动数据源连接
4. **数据权限分层**:总部看全部门店、区域经理看本区域、店长看本店
5. **默认月份参数**:前端统一使用 `DEFAULT_MONTH` 常量,避免新月份无数据时空白
@@ -0,0 +1,124 @@
# 11 · 技术参考:部署与运维
## 1. 部署脚本
### 1.1 deploy.sh
```bash
# 后端部署
bash deploy.sh server
# → rsync 同步代码到服务器
# → npm install
# → pm2 restart sbrain-server
# 前端部署
bash deploy.sh front
# → npm run build
# → scp dist/* 到服务器 /var/www/dm.all8ai.top
```
### 1.2 服务器环境
| 配置项 | 值 |
|--------|-----|
| 服务器IP | 152.136.182.184 |
| SSH用户 | ubuntu |
| 后端目录 | /opt/sbrain-server |
| 前端目录 | /var/www/dm.all8ai.top |
| 后端端口 | 9333 |
| PM2进程名 | sbrain-server |
| Node版本 | 20+ |
## 2. 数据库连接
### 2.1 连接配置
| 用途 | 地址 | 端口 | 数据库 | 用户 | 密码 |
|------|------|------|--------|------|------|
| 业务数据 | 127.0.0.1 (FRP) | 15432 | bill_query | freedak | (空) |
| 平台管理 | 127.0.0.1 | 5432 | sbrain_admin | sbrain_admin | sbrain2026 |
### 2.2 FRP隧道
```toml
[[proxies]]
name = "dm-db"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5432
remotePort = 15432
```
- macOS launchd 系统级服务,开机自启
- 管理命令:
- 启动:`launchctl load ~/Library/LaunchAgents/com.frp.client.plist`
- 停止:`launchctl bootout gui/$(id -u)/com.frp.client`
- 日志:`tail -f ~/Library/Logs/frpc.log`
### 2.3 远程数据库操作
```bash
# 通过FRP隧道查询
ssh ubuntu@152.136.182.184 "PGPASSWORD= psql -h 127.0.0.1 -p 15432 -U freedak -d bill_query -c \"SQL\""
# 本地直接查询
psql -h 127.0.0.1 -p 5432 -U freedak -d bill_query -c "SQL"
```
## 3. 数据库备份
```bash
# 本地备份
pg_dump -h 127.0.0.1 -p 5432 -U freedak bill_query > backups/bill_query_$(date +%Y%m%d).sql
# 恢复
psql -h 127.0.0.1 -p 5432 -U freedak -d bill_query < backups/bill_query_YYYYMMDD.sql
```
## 4. PM2 进程管理
```bash
# 查看状态
ssh ubuntu@152.136.182.184 "pm2 status"
# 查看日志
ssh ubuntu@152.136.182.184 "pm2 logs sbrain-server --lines 50"
# 重启
ssh ubuntu@152.136.182.184 "pm2 restart sbrain-server"
# 保存进程列表
ssh ubuntu@152.136.182.184 "pm2 save"
```
## 5. 部署前检查清单
- [ ] 数据库已备份
- [ ] 代码已 commit + push
- [ ] FRP隧道正常运行(`pgrep -l frpc`
- [ ] 后端本地可正常启动
- [ ] 前端本地可正常构建
- [ ] 部署后API健康检查(`curl -s https://dm.all8ai.top/api/health`
## 6. 常用运维命令
```bash
# API健康检查
curl -s https://dm.all8ai.top/api/health
# 登录获取Token
TOKEN=$(curl -s 'https://dm.all8ai.top/api/auth/login' \
-H 'Content-Type: application/json' \
-d '{"username":"总部管理员","password":"123"}' \
| python3 -c "import sys,json;print(json.load(sys.stdin)['data']['token'])")
# 测试API
curl -s "https://dm.all8ai.top/api/xxx?month=2026-04" \
-H "Authorization: Bearer $TOKEN" | python3 -m json.tool
# 查看物化视图列表
ssh ubuntu@152.136.182.184 "PGPASSWORD= psql -h 127.0.0.1 -p 15432 -U freedak -d bill_query -c \"SELECT schemaname, matviewname FROM pg_matviews ORDER BY 1,2\""
# 查看表结构
ssh ubuntu@152.136.182.184 "PGPASSWORD= psql -h 127.0.0.1 -p 15432 -U freedak -d bill_query -c \"SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'xxx' ORDER BY ordinal_position\""
```

Some files were not shown because too many files have changed in this diff Show More