# 菜品调整指导与验证体系 > 核心目标:从"看数据"升级为"调什么 → 怎么调 → 调完验证 → 持续优化"的闭环 --- ## 一、问题分析 当前系统已具备**分析能力**(成本差异、毛利排名、BOM复杂度等),但缺少: 1. **决策指导**:分析结果出来后,具体应该调什么?调价?改配方?下架? 2. **调整记录**:谁在什么时候对哪个菜品做了什么调整? 3. **效果验证**:调整后效果如何?毛利提升了吗?成本下降了吗? 4. **持续迭代**:验证结果反馈到下一轮分析,形成闭环 数据限制:销售明细仅覆盖2026年4月(552万行),5月仅少量数据。菜品成本报表无月份字段。因此**验证阶段需要按周/旬对比**,而非按月。 --- ## 二、整体架构 ``` 分析诊断 → 调整建议 → 决策记录 → 执行跟踪 → 效果验证 → 反馈迭代 ↑ | └──────────────────────────────────────────────────────────────┘ ``` ### 闭环流程 ``` 1. 系统自动生成菜品诊断报告(每周/每月) → 识别问题菜品:低毛利、高超耗、配方复杂、独有原料 2. 系统生成调整建议(按优先级排序) → 调价 / 改配方 / 减份量 / 下架 / 保持 3. 商品部/运营部在系统中确认调整方案 → 记录:菜品、调整类型、调整前值、调整后值、执行日期、负责人 4. 执行后系统自动跟踪关键指标 → 对比调整前后7天/14天/30天的销量、毛利、成本差异 5. 系统生成效果验证报告 → 达标 / 未达标 / 需继续观察 6. 验证结果反馈到下一轮诊断 → 未达标 → 重新分析原因 → 新一轮调整 ``` --- ## 三、新增数据表 ### 3.1 菜品调整记录表 ```sql CREATE TABLE public.dish_adjustment_log ( id SERIAL PRIMARY KEY, dish_code TEXT NOT NULL, -- 菜品编码 dish_name TEXT NOT NULL, -- 菜品名称 adjustment_type TEXT NOT NULL, -- 调整类型:price/recipe/portion/delisting/relaunch -- 调整前快照 before_price NUMERIC, before_theoretical_cost NUMERIC, before_theoretical_margin NUMERIC, before_sales_avg_daily NUMERIC, -- 调整前日均销量 before_cost_variance NUMERIC, -- 调整前成本差异 -- 调整后目标 after_price NUMERIC, after_theoretical_cost NUMERIC, after_target_margin NUMERIC, -- 目标毛利率 target_cost_reduction NUMERIC, -- 目标成本降幅 -- 执行信息 effective_date DATE NOT NULL, -- 执行日期 decided_by TEXT, -- 决策人 reason TEXT, -- 调整原因 diagnosis_id INTEGER, -- 关联诊断报告ID status TEXT DEFAULT 'planned', -- planned/executing/completed/cancelled created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now() ); ``` ### 3.2 调整效果验证表 ```sql CREATE TABLE public.dish_adjustment_result ( id SERIAL PRIMARY KEY, adjustment_id INTEGER NOT NULL REFERENCES public.dish_adjustment_log(id), -- 验证周期 period_type TEXT NOT NULL, -- 7d/14d/30d period_start DATE NOT NULL, period_end DATE NOT NULL, -- 调整后实际值 actual_sales_avg_daily NUMERIC, -- 实际日均销量 actual_sales_change_pct NUMERIC, -- 销量变化率 actual_margin NUMERIC, -- 实际毛利率 actual_margin_change NUMERIC, -- 毛利率变化(百分点) actual_cost_variance NUMERIC, -- 实际成本差异 actual_cost_change_pct NUMERIC, -- 成本变化率 -- 评估 target_achieved BOOLEAN, -- 是否达标 assessment TEXT, -- 达标/未达标/需继续观察 notes TEXT, -- 备注 created_at TIMESTAMPTZ DEFAULT now() ); ``` ### 3.3 菜品诊断快照表 ```sql CREATE TABLE public.dish_diagnosis_snapshot ( id SERIAL PRIMARY KEY, diagnosis_date DATE NOT NULL, dish_code TEXT NOT NULL, dish_name TEXT NOT NULL, -- 诊断指标快照 category_l1 TEXT, sales_amount NUMERIC, sales_quantity NUMERIC, theoretical_margin_pct NUMERIC, actual_margin_pct NUMERIC, cost_variance_amount NUMERIC, cost_tier TEXT, -- 正常/关注/整改/紧急/数据异常 bom_complexity_score NUMERIC, unique_material_count INTEGER, waste_rate_avg NUMERIC, -- 诊断结论 diagnosis_type TEXT, -- low_margin/high_variance/over_complex/data_anomaly/unique_material_risk diagnosis_detail TEXT, -- 详细诊断描述 suggested_action TEXT, -- 建议动作:price_up/price_down/recipe_optimize/portion_reduce/delist/fix_data/monitor priority TEXT, -- P0/P1/P2/P3 created_at TIMESTAMPTZ DEFAULT now() ); ``` --- ## 四、调整建议引擎 ### 4.1 自动诊断规则 系统根据分析数据自动生成诊断和建议: | 诊断类型 | 触发条件 | 建议动作 | 优先级 | |---------|---------|---------|--------| | **低毛利-定价偏低** | 理论毛利率 < 30% 且实际毛利率 > 理论 | 涨价(上调10-20%) | P1 | | **低毛利-成本偏高** | 理论毛利率 < 50% 且实际 < 理论 | 优化BOM/换供应商 | P1 | | **高超耗-份量超标** | 成本差异 > 0 且损耗率 > 20% | 减份量/加强操作规范 | P0 | | **高超耗-物料分摊** | 成本差异 > 0 且损耗率 > 100% | 先修复数据分摊 | P0 | | **配方复杂-低销量** | 物料数 > 15 且日销 < 5份 | 简化配方或下架 | P2 | | **独有原料-低收入** | 独有原料数 > 3 且月收入 < 5000 | 评估下架 | P2 | | **数据异常-成本率>100%** | 实际毛利率 < 0 | 先修复BOM/单位/分摊 | P0 | | **负毛利菜品** | 理论毛利率 < 0 | 重新核算成本或涨价 | P0 | | **正常但可优化** | 实际超理论 0-10% | 监控,暂不调整 | P3 | ### 4.2 调整建议模板 每种建议动作对应一个模板: **涨价建议**: ``` 菜品:{dish_name} 当前售价:{price}元 → 建议售价:{price * 1.15}元 当前理论毛利率:{margin}% → 预期毛利率:{expected_margin}% 预计月增收:{(new_price - old_price) * monthly_sales}元 风险:销量可能下降5-15% 建议:先在3-5家门店试调,观察2周销量变化 ``` **减份量建议**: ``` 菜品:{dish_name} 超标原料:{material_name} 理论用量:{theoretical_qty} → 建议标准用量:{reduced_qty} 当前损耗率:{waste_rate}% → 预期损耗率:{target_waste_rate}% 预计月节省:{savings}元 风险:顾客感知,需同步调整售价或保持不变 建议:先在1-2家门店试调,收集顾客反馈 ``` **下架建议**: ``` 菜品:{dish_name} 月销售额:{sales}元(排名 bottom 10%) 独有原料:{unique_materials}种 下架后可释放:{releasable_materials}种物料 月收入影响:{sales}元 月毛利影响:{profit}元(可能为正,因为亏损菜品) 库存处置:需处理{inventory_value}元独有原料库存 建议:先评估是否有替代菜品可消化独有原料 ``` --- ## 五、验证方法 ### 5.1 对比维度 | 维度 | 调整前 | 调整后 | 对比方法 | |------|--------|--------|---------| | 日均销量 | 调整前7天均值 | 调整后7天/14天均值 | 变化率 = (后-前)/前 | | 毛利率 | 调整前理论/实际毛利率 | 调整后理论/实际毛利率 | 变化 = 后 - 前(百分点) | | 成本差异 | 调整前成本差异额 | 调整后成本差异额 | 变化率 = (后-前)/前 | | 物料损耗率 | 调整前损耗率 | 调整后损耗率 | 变化 = 后 - 前 | | 顾客反馈 | — | 差评/投诉数 | 定性评估 | ### 5.2 验证周期 | 周期 | 适用场景 | 说明 | |------|---------|------| | 7天 | 涨价/减份量 | 快速验证销量变化 | | 14天 | 配方优化 | 验证成本差异变化 | | 30天 | 下架/上新 | 验证整体收入影响 | ### 5.3 达标标准 | 调整类型 | 达标标准 | |---------|---------| | 涨价 | 销量下降 < 15% 且毛利额增加 | | 减份量 | 成本差异下降 > 30% 且无顾客投诉 | | 配方优化 | 实际成本率下降 > 3个百分点 | | 下架 | 独有原料库存清理完成且总收入影响 < 预期 | | 数据修复 | 成本率回归合理区间(0-80%) | ### 5.4 数据来源 | 指标 | 数据来源 | 频率 | |------|---------|------| | 销量/销售额 | `dish_sales_details` | 每日 | | 理论/实际成本 | `dish_cost_analysis_summary`(需多次导入) | 每月 | | 物料损耗 | `dish_cost_analysis_material_detail`(需多次导入) | 每月 | | 成本差异 | `v_store_theoretical_actual_cost_april` | 每月 | > **关键限制**:菜品成本报表目前为单次导入,无月份维度。要实现持续验证,需要**每月定期导入新的成本报表**,并打上月份标签。 --- ## 六、前端展现 ### 新增Tab:调整管理 在菜品成本分析页面新增第10个Tab: ``` ┌─────────────────────────────────────────────────────────┐ │ 调整管理 │ ├─────────────────────────────────────────────────────────┤ │ [子Tab] 待处理建议 | 执行中 | 已完成 | 效果验证 │ ├─────────────────────────────────────────────────────────┤ │ │ │ ── 待处理建议 ── │ │ [MetricCard] P0紧急 [MetricCard] P1重点 │ │ [MetricCard] P2改善 [MetricCard] P3监控 │ │ │ │ DataTable: 菜品 | 诊断类型 | 建议动作 | 优先级(Badge) │ │ | 当前毛利率 | 预期效果 | [确认调整] [忽略] │ │ │ │ 点击"确认调整" → 弹出调整表单: │ │ 调整类型: [下拉] 涨价/减份量/改配方/下架 │ │ 调整前值: (自动填充) │ │ 调整后值: [输入] │ │ 执行日期: [日期选择] │ │ 负责人: [输入] │ │ 备注: [文本框] │ │ [提交] → 保存到 dish_adjustment_log │ │ │ │ ── 执行中 ── │ │ DataTable: 菜品 | 调整类型 | 执行日期 | 已执行天数 │ │ | 调整前销量 | 当前销量 | 变化率 │ │ | [查看详情] [标记完成] │ │ │ │ ── 已完成 ── │ │ DataTable: 菜品 | 调整类型 | 执行日期 | 完成日期 │ │ | 调整前毛利率 | 调整后毛利率 | 变化 │ │ | 达标状态(Badge) | [查看验证报告] │ │ │ │ ── 效果验证 ── │ │ 选中菜品后展示: │ │ ┌──────────────────────────────────────────┐ │ │ │ LineChart: X轴=日期, Y轴=日均销量 │ │ │ │ 竖线标注: 调整执行日期 │ │ │ │ 双线: 销量 + 毛利率 │ │ │ └──────────────────────────────────────────┘ │ │ [MetricCard] 销量变化 [MetricCard] 毛利变化 │ │ [MetricCard] 成本差异变化 [MetricCard] 达标状态 │ │ DataTable: 验证周期 | 销量 | 毛利率 | 成本差异 | 评估 │ └─────────────────────────────────────────────────────────┘ ``` ### 新增API端点 | 端点 | 方法 | 说明 | |------|------|------| | `/api/cost-analysis/diagnosis` | GET | 获取最新诊断建议列表 | | `/api/cost-analysis/diagnosis/generate` | POST | 触发生成诊断快照 | | `/api/cost-analysis/adjustment` | GET | 获取调整记录列表 | | `/api/cost-analysis/adjustment` | POST | 创建调整记录 | | `/api/cost-analysis/adjustment/:id` | PUT | 更新调整状态 | | `/api/cost-analysis/adjustment/:id/verify` | GET | 获取验证数据 | | `/api/cost-analysis/adjustment/:id/result` | POST | 提交验证结果 | --- ## 七、完整闭环示例 ### 示例:酱烧琵琶鸡腿饭(实际毛利率-246.50%) ``` 第1步:诊断 → 系统识别:实际毛利率-246.50%,成本差异+33.6万 → 诊断类型:data_anomaly(成本率异常) → 建议动作:fix_data(先修复BOM/单位/分摊) → 优先级:P0 第2步:排查 → 商品部核查发现:物料分摊错误,鸡腿用量归属到米饭而非鸡腿饭 → 修复BOM:调整物料归属 第3步:记录调整 → 调整类型:recipe(配方修复) → 执行日期:2026-08-01 → 调整前:实际毛利率-246.50%,成本差异+33.6万 → 目标:实际毛利率回归50-70% 第4步:验证(2026-08-08,7天后) → 对比8月1-7日 vs 7月25-31日销量 → 等待8月成本报表导入后对比毛利率 → 验证结果:待数据 第5步:反馈 → 如果毛利率回归正常 → 标记达标 → 闭环结束 → 如果仍然异常 → 重新诊断 → 新一轮调整 ``` ### 示例:草原游牧羔羊肉串(超耗33.1万) ``` 第1步:诊断 → 系统识别:实际毛利率51.10% vs 理论61.12%,成本差异+33.1万 → 诊断类型:high_variance(高超耗) → 建议动作:recipe_optimize(优化BOM/加强操作规范) → 优先级:P0 第2步:分析原料差异 → 拆解:羔羊肉理论用量 vs 实际用量 → 发现:实际用量超理论15%,损耗率-15% → 原因:份量超标或切割损耗大 第3步:调整方案 → 方案A:加强操作规范,标准份量控制在±5% → 方案B:更换供应商,降低采购规格偏差 → 选择方案A,先在TOP10超耗门店试执行 第4步:记录调整 → 调整类型:portion(份量控制) → 执行日期:2026-08-01 → 调整前:成本差异+33.1万/月 → 目标:成本差异降至+10万/月以内 第5步:验证(2026-08-15,14天后) → 对比8月1-14日 vs 7月18-31日 → 销量变化:观察是否因份量控制影响顾客体验 → 成本变化:等待8月成本报表导入 第6步:反馈 → 达标 → 推广到全部门店 → 未达标 → 升级为方案B(换供应商) ``` --- ## 八、数据补充需求 要实现持续验证闭环,需要补充以下数据: | 数据 | 当前状态 | 需要做什么 | 优先级 | |------|---------|-----------|--------| | 菜品成本报表(按月) | 仅4月1次 | 每月定期导入,增加月份字段 | 最高 | | 物料采购单价 | 无 | 导入采购系统数据 | 高 | | 门店级菜品成本 | 无 | 菜品成本报表增加门店维度 | 高 | | BOM版本变更历史 | 仅v1.0 | 每次BOM修改记录版本 | 中 | | 顾客反馈/差评 | 无 | 对接评价系统 | 中 | | 促销活动记录 | 无 | 记录促销菜品/时间/力度 | 低 | ### 最小可行闭环(MVP) 仅基于现有数据可实现的闭环: ``` 诊断(现有数据) → 生成建议(规则引擎) → 人工确认调整(调整记录表) → 销量验证(dish_sales_details,按周对比) → 等待下月成本报表导入后验证成本 ``` **销量验证可以立即做**,成本验证需要等下次成本报表导入。 --- ## 九、落地计划 | 阶段 | 内容 | 依赖 | |------|------|------| | **阶段1** | 创建3张表 + 诊断规则引擎 + 诊断API | 无 | | **阶段2** | 调整记录CRUD + 前端调整管理Tab | 阶段1 | | **阶段3** | 销量验证(基于dish_sales_details按周对比) | 阶段2 | | **阶段4** | 成本验证(需多次导入成本报表) | 成本报表按月导入 | | **阶段5** | 自动化反馈迭代 | 阶段3+4 |