Skill: chaoliuzhu/delonix-pl-analysis (version 3.0.0)

# P&L.skill — 酒店投资与经营分析工具 v3.0 > **版本：v3.0 · 德胧集团官方版** > 适用：店总自检 / 项目立项 / 经营复盘 / 竞品对标 > 数据源：开元名庭动态模型202603 + 集团实测数据 --- ## 核心能力速查 | 能力 | 触发词 | 输出 | |------|--------|------| | 快速P&L分析 | 「分析P&L」「本月经营分析」 | 完整损益表+关键指标 | | 投资回报测算 | 「投资回报」「回本周期」 | IRR/NPVRR/回本周期 | | 多店对标 | 「对标分析」「横向对比」 | 多店排名+差距分析 | | 成本异常诊断 | 「成本预警」「成本异常」 | 超支项+改进建议 | | 保本点分析 | 「保本点」「盈亏平衡」 | 安全边际+压力测试 | | 敏感性分析 | 「敏感性」「压力测试」 | 多场景矩阵 | | 偏差校准 | 「偏差分析」「实际vs预测」 | 根因溯源+参数修正 | | 竞品SWOT | 「竞品分析」「SWOT」 | 四维分析+策略建议 | --- ## A类 · 基础参数合规校验 ### 通用参数校验 | 参数 | 德胧标准 | 异常阈值 | |------|---------|---------| | 物理房量 | 120间（±50%） | 超±50% | | 单房造价 | 13.69万/间 | 超±15% | | 物业租金 | 85元/㎡/月（含税） | 超±20% | | 加盟费 | 60万（品牌30+技术20+保证金10） | 偏离 | | 人房比（虫洞后） | ≤0.175 | >0.20 | ### 城市基准ADR | 城市 | 基准ADR | 备注 | |------|---------|------| | 深圳 | 630-710元 | 七大城市第一 | | 上海 | 480元 | — | | 广州 | 530元 | — | | 杭州 | 330-420元 | — | | 北京 | 580-790元 | — | | 成都 | 450-540元 | — | | 重庆 | 340-430元 | — | --- ## B类 · 经营预测合理性 ### 收入预测标准公式 ``` 年客房收入 = 365 × 房量 × OCC × ADR RevPAR = ADR × OCC 客源收入 = Σ(渠道占比 × 渠道ADR × 已售间夜) ``` ### 客源结构标准 | 渠道 | 标准占比 | ADR系数 | 佣金率 | |------|---------|---------|--------| | 百达屋 | 60% | ×0.85 | 8% | | OTA | 30% | ×0.90 | 12% | | 线下 | 10% | ×0.70 | 3% | --- ## C类 · 成本结构健康度 ### 人力成本（最大单项） | 检查项 | 标准 | 预警线 | |--------|------|--------| | 人房比 | ≤0.175 | >0.20 | | 人力成本占营收比 | 25-35% | >40% | | 外包比例 | ≤20% | >30% | | 人均工资 | 5524元/月 | 超±30% | ### 变动成本标准（每间夜） | 成本项 | 标准值 | 实际参考 | |--------|--------|---------| | 早餐 | 19.13元 | 11-34元 | | 易耗品 | 7.39元 | 2-17元 | | 布草洗涤 | 9.95元 | 7-10元 | | 能耗（高OCC） | 12-15元/㎡ | — | | 能耗（低OCC） | 8-10元/㎡ | — | ### 管理费 | 费用项 | 比例 | |--------|------| | 基本管理费 | 营收×2.7% | | 品牌营销费 | 营收×1.8% | | 系统使用费 | 首年4.8万，第二年起1.5万/年 | --- ## D类 · 偏差校准分析 ### 偏差溯源框架 ``` 实际 vs 预测偏差 └─ 收入偏差 ├─ OCC拖累 → 市场/竞品/季节问题 └─ ADR拖累 → 定价/渠道结构问题 └─ 成本偏差 ├─ 人力超支 → 招聘失控/薪资偏高 ├─ 能耗超支 → 设备/管控问题 └─ 易耗品超支 → 浪费/管理缺失 ``` ### 偏差预警标准 | 类型 | 可接受 | 预警 | |------|--------|------| | 收入偏差 | ±5% | >±10% | | 成本偏差 | ±5% | >±10% | | OCC偏差 | ±3pct | >±5pct | | ADR偏差 | ±5% | >±10% | --- ## E类 · 投资回报测算 ### 核心指标达标线 | 指标 | 达标 | 优秀 | |------|------|------| | 静态回本周期 | ≤8年 | ≤5年 | | IRR（5年） | ≥15% | ≥25% | | GOP率 | ≥35% | ≥45% | | EBITDA率 | ≥20% | ≥30% | ### 敏感性矩阵 ``` 场景 OCC ADR 年收入 净利润 回本周期 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 乐观 +5pct +10% +18% 翻倍 缩短40% 基准 85% 550元 3102万 717万 3.6年 保守 -10pct -15% -22% -45% 延长60% 极端 -20pct -25% -38% 亏损 临界点 ``` ### 保本公式 ``` 保本OCC = (固定成本+租金) / (ADR×房量×365×贡献边际率) 安全边际 = 实际OCC - 保本OCC ``` --- ## 使用示例 ### 示例1：快速分析 ``` 用户：帮我分析深圳蛇口店1月的P&L AI：请提供1月实际数据： - OCC：83% - ADR：实际值？ - 总营收：203万 用户：OCC 83%，ADR 550元，收入203万 AI：分析中... ``` ### 示例2：偏差诊断 ``` 用户：为什么我们1月成本超支了？ AI：对比预测vs实际： - 成本偏差：+54%（124万 vs 预测81万） - 主因：人力成本+92%（57万 vs 29万） - 底薪超标：+129% - 建议：检查1月是否新入职员工过多 ``` ### 示例3：多店对标 ``` 用户：对比奉化、大连、蛇口三店的效率 AI：横向对标结果： ┌────────┬──────┬──────┬──────┐ │ 门店 │ 人房比│ GOP率│ RevPAR│ ├────────┼──────┼──────┼──────┤ │ 蛇口 │ 0.18 │ 36% │ 395元 │ │ 奉化 │ 0.36 │ 15% │ 120元 │ │ 大连 │ 0.48 │ -5% │ 85元 │ └────────┴──────┴──────┴──────┘ ``` --- ## 真实数据参考（来自集团财务模型） ### 深圳蛇口店（2026年1月实际） - 房量：189间，OCC 83%（预测85%，偏差-2%） - 收入：203万（预测224万，偏差-9%） - 成本：125万（预测81万，偏差+54%） - 人力成本：57万（预测30万，偏差+92%）⚠️ - 结论：1月成本失控，主因新员工入职+外包增加 ### 奉化店（2025年11月-2026年1月） - 房量：153间，淡季OCC 42-64%，ADR 206-228元 - 问题：OCC远低于基准85%，人房比0.36（标准0.175） ### 大连店（同期） - 房量：166间，淡季OCC 32-43%，ADR 169-185元 - 问题：人房比0.48-0.56（严重超标），接近亏损 --- *v3.0 · 2026-04-23 · 基于德胧实测数据 + 集团财务模型*

path: DESIGN.md
content: # P&L Skill 设计说明书

> 版本：v1.0
> 设计日期：2026年4月23日
> 设计目标：打造可交互、可迭代、可个性化的酒店P&L分析工具

---

## 一、设计理念

### 1.1 核心原则

| 原则 | 说明 | 实现方式 |
|------|------|----------|
| **数据动态化** | 不硬编码任何数值，全部从用户输入或配置文件读取 | 参数化设计 + 交互式输入 |
| **分析科学化** | 采用财务分析标准方法论，参考行业最佳实践 | 财务模型框架 + 学术研究方法 |
| **工具模块化** | 每个分析模块独立可调用，支持灵活组合 | 模块化架构 |
| **配置个性化** | 每家酒店可配置自己的基准数据和参数 | 配置文件 + 记忆系统 |
| **迭代可持续** | 分析结果可反馈优化，形成闭环 | 学习机制 + 参数调优 |

### 1.2 设计哲学

```
"授人以鱼不如授人以渔"

不是给店总一个固定答案，而是提供一套分析框架：
- 教会店总理解P&L逻辑
- 让店总能自己调整参数
- 支持店总持续迭代优化
```

---

## 二、技术架构

### 2.1 整体架构图

```
┌─────────────────────────────────────────────────────────────┐
│                    P&L Skill 架构                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  用户交互层  │  │  配置管理层  │  │  记忆学习层  │         │
│  │             │  │             │  │             │         │
│  │ - 对话输入  │  │ - 酒店参数  │  │ - 历史数据  │         │
│  │ - 分步引导  │  │ - 行业基准  │  │ - 偏好设置  │         │
│  │ - 智能补全  │  │ - 竞品信息  │  │ - 分析记录  │         │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘         │
│         │                │                │                 │
│         └────────────────┼────────────────┘                 │
│                          ▼                                  │
│  ┌───────────────────────────────────────────────────────┐  │
│  │                    分析引擎层                          │  │
│  │                                                       │  │
│  │  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐     │  │
│  │  │收入分析 │ │成本分析 │ │利润分析 │ │保本分析 │     │  │
│  │  │ 模块   │ │ 模块   │ │ 模块   │ │ 模块   │     │  │
│  │  └─────────┘ └─────────┘ └─────────┘ └─────────┘     │  │
│  │                                                       │  │
│  │  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐     │  │
│  │  │季节预测 │ │人员优化 │ │竞品对标 │ │敏感性   │     │  │
│  │  │ 模块   │ │ 模块   │ │ 模块   │ │分析模块 │     │  │
│  │  └─────────┘ └─────────┘ └─────────┘ └─────────┘     │  │
│  └───────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ▼                                  │
│  ┌───────────────────────────────────────────────────────┐  │
│  │                    输出呈现层                          │  │
│  │                                                       │  │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐             │  │
│  │  │ 分析报告 │ │ 可视图表 │ │ 行动建议 │             │  │
│  │  │ 生成    │ │ 生成    │ │ 生成    │             │  │
│  │  └──────────┘ └──────────┘ └──────────┘             │  │
│  └───────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘
```

### 2.2 技术栈

| 层级 | 技术选型 | 说明 |
|------|----------|------|
| 用户交互 | 对话式AI + 引导式输入 | 自然语言理解 + 结构化采集 |
| 配置管理 | JSON配置文件 + 记忆系统 | 支持个性化参数持久化 |
| 分析引擎 | Python计算引擎 + Skill调用 | 模块化分析能力 |
| 可视化 | ECharts图表库 | 动态交互式图表 |
| 输出报告 | Markdown生成 + PDF导出 | 多格式输出 |

---

## 三、财务逻辑框架

### 3.1 财务模型理论基础

#### 收入模型

```
总收入 = RevPAR × 房间数 × 经营天数

其中：
RevPAR = ADR × OCC

客源收入结构：
总客房收入 = Σ(各渠道占比 × 渠道ADR × 已售间夜数)
```

**理论依据**：
- **收益管理理论**（Revenue Management）：源于航空业，核心是"在正确的时间以正确的价格卖给正确的客户"
- **价格歧视策略**：不同渠道差异化定价，最大化收益
- **需求预测模型**：基于历史数据的季节性分析

#### 成本模型

```
总成本 = 固定成本 + 变动成本

固定成本：
- 租金/折旧
- 基础人工成本
- 基础能耗

变动成本：
- 随OCC变化的成本（客房易耗品、布草洗涤、部分人工）
- 渠道佣金（随收入变化）
```

**理论依据**：
- **成本性态分析**（Cost Behavior Analysis）：区分固定/变动成本
- **作业成本法**（Activity-Based Costing）：成本动因分析
- **本量利分析**（CVP Analysis）：保本点测算

#### 利润模型

```
GOP = 总收入 - 运营成本
GOP Margin = GOP / 总收入

EBITDA = GOP - 固定成本摊销
EBITDA Margin = EBITDA / 总收入
```

**理论依据**：
- **杜邦分析法**（DuPont Analysis）：利润率分解
- **经济增加值**（EVA）：考虑资本成本的真实盈利能力

### 3.2 保本点分析模型

#### 基本公式

```
盈亏平衡点（BEP）= 固定成本 / 贡献边际率

其中：
贡献边际 = 单位售价 - 单位变动成本
贡献边际率 = 贡献边际 / 单位售价
```

#### 酒店行业应用

```
保本OCC = 固定成本 / (ADR × 房间数 × 经营天数 × 贡献边际率)

安全边际 = 实际OCC - 保本OCC
安全边际率 = 安全边际 / 实际OCC
```

**理论依据**：
- **本量利分析**（Cost-Volume-Profit Analysis）
- **敏感性分析**：参数变化对结果的影响程度
- **情景分析**：不同假设条件下的多情景预测

### 3.3 敏感性分析方法

#### 单因素敏感性分析

```python
def sensitivity_analysis(base_value, param_name, change_range):
    """
    单因素敏感性分析
    
    参数：
    - base_value: 基准值
    - param_name: 参数名称（如ADR、OCC、人工成本率）
    - change_range: 变化范围（如[-20%, -10%, 0%, +10%, +20%]）
    
    输出：
    - 每个变化幅度对应的利润变化
    - 敏感性系数 = (利润变化率) / (参数变化率)
    """
    results = []
    for change in change_range:
        new_value = base_value * (1 + change)
        new_profit = calculate_profit(new_value)
        profit_change = (new_profit - base_profit) / base_profit
        sensitivity = profit_change / change
        results.append({
            'param_change': change,
            'profit_change': profit_change,
            'sensitivity': sensitivity
        })
    return results
```

#### 多因素交叉分析

```
场景矩阵：
         ADR-10%  ADR 0%  ADR+10%
OCC-10%    场景1    场景2    场景3
OCC 0%     场景4    场景5    场景6
OCC+10%    场景7    场景8    场景9

输出：9种场景下的利润预测
```

---

## 四、引用的优秀Skill与工具

### 4.1 已集成技能

| 技能名称 | 用途 | 调用方式 |
|----------|------|----------|
| `sector-hotness-analysis` | 市场热度分析、板块分析 | 竞品对标时调用 |
| `echart` | 数据可视化图表生成 | 报告输出时调用 |
| `excel_master` | Excel数据处理 | 数据导入导出时调用 |
| `data-ml-analysis` | 数据分析与机器学习 | 趋势预测、异常检测 |

### 4.2 推荐引入的外部Skill

| Skill名称 | 来源 | 用途 | 优先级 |
|-----------|------|------|--------|
| Financial Modeling | 国际标准 | 财务模型构建 | 🔴 高 |
| Break-Even Analysis | 学术研究 | 保本点测算 | 🔴 高 |
| Hotel Performance Analysis | STR Global | 行业对标分析 | 🟡 中 |
| Revenue Management | 康奈尔大学 | 收益管理优化 | 🟡 中 |
| SWOT Analysis | 战略管理 | 竞争态势分析 | 🟢 低 |

### 4.3 核心参考文档

| 文档 | 来源 | 说明 |
|------|------|------|
| USALI（酒店业统一会计制度） | 美国酒店协会 | 行业标准会计科目 |
| STR Global Report | STR | 全球酒店业基准数据 |
| HVS Hotel Valuation | HVS | 酒店估值方法论 |
| Cornell Hospitality Report | 康奈尔大学 | 学术研究成果 |

---

## 五、分析科学研究方法

### 5.1 分析框架

```
┌─────────────────────────────────────────────────────────┐
│                   分析科学方法论                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│   1. 问题定义                                           │
│      └─ 明确分析目标、范围、约束条件                    │
│                                                         │
│   2. 数据收集                                           │
│      └─ 用户输入 + 历史数据 + 外部基准                  │
│                                                         │
│   3. 数据清洗                                           │
│      └─ 异常值检测、缺失值处理、数据校验                │
│                                                         │
│   4. 分析建模                                           │
│      └─ 选择合适的财务模型和分析方法                    │
│                                                         │
│   5. 结果呈现                                           │
│      └─ 可视化 + 报告 + 洞察                            │
│                                                         │
│   6. 结论建议                                           │
│      └─ 可落地的行动建议                                │
│                                                         │
│   7. 反馈迭代                                           │
│      └─ 用户反馈 → 模型优化 → 参数调整                  │
│                                                         │
└─────────────────────────────────────────────────────────┘
```

### 5.2 数据校验规则

| 数据项 | 校验规则 | 异常处理 |
|--------|----------|----------|
| OCC | 0% ≤ OCC ≤ 100% | 提示重新输入 |
| ADR | 根据城市基准±50%范围 | 标记异常并提示 |
| 人工成本率 | 15% ≤ 人工成本率 ≤ 50% | 预警提示 |
| 能耗占比 | 1% ≤ 能耗占比 ≤ 10% | 预警提示 |
| GOP Margin | -50% ≤ GOP Margin ≤ 80% | 异常分析 |

### 5.3 异常检测算法

```python
def detect_anomaly(value, historical_data, threshold=2):
    """
    基于Z-Score的异常检测
    
    参数：
    - value: 当前值
    - historical_data: 历史数据序列
    - threshold: Z-Score阈值（默认2，即95%置信区间）
    
    返回：
    - is_anomaly: 是否异常
    - z_score: Z分数
    """
    mean = np.mean(historical_data)
    std = np.std(historical_data)
    z_score = (value - mean) / std
    
    is_anomaly = abs(z_score) > threshold
    
    return {
        'is_anomaly': is_anomaly,
        'z_score': z_score,
        'deviation': f"{abs(z_score):.2f}倍标准差"
    }
```

### 5.4 趋势预测方法

| 方法 | 适用场景 | 准确度 | 复杂度 |
|------|----------|--------|--------|
| 移动平均法 | 短期预测、平稳数据 | 中 | 低 |
| 指数平滑法 | 短期预测、有趋势 | 中高 | 低 |
| 季节分解法 | 季节性数据 | 高 | 中 |
| ARIMA | 时间序列预测 | 高 | 高 |
| 机器学习（LSTM） | 复杂模式 | 最高 | 最高 |

---

## 六、个性化配置设计

### 6.1 酒店配置文件结构

```json
{
  "hotel_config": {
    "basic_info": {
      "hotel_name": "深圳蛇口开元名庭",
      "brand": "开元名庭",
      "city": "深圳",
      "star_rating": "中高端",
      "room_count": 189,
      "building_area": 8971.54,
      "opening_date": "2024-01-01"
    },
    
    "financial_params": {
      "base_occ": 0.85,
      "base_adr": 630,
      "gop_target": 0.35,
      "ebitda_target": 0.25
    },
    
    "seasonal_params": {
      "peak_months": [4, 7, 8, 10, 11, 12],
      "shoulder_months": [1, 2, 3, 5],
      "off_months": [6, 9],
      "occ_coefficient": {
        "peak": 1.1,
        "shoulder": 1.0,
        "off": 0.9
      },
      "adr_coefficient": {
        "peak": 1.05,
        "shoulder": 1.0,
        "off": 0.95
      }
    },
    
    "channel_mix": {
      "betterwood": {
        "ratio": 0.6,
        "adr_multiplier": 0.85,
        "commission_rate": 0.08
      },
      "ota": {
        "ratio": 0.3,
        "adr_multiplier": 0.9,
        "commission_rate": 0.12
      },
      "offline": {
        "ratio": 0.1,
        "adr_multiplier": 0.7,
        "commission_rate": 0.03
      }
    },
    
    "cost_structure": {
      "labor": {
        "fixed_monthly": 250000,
        "variable_rate": 0.02,
        "staff_ratio": 0.175
      },
      "energy": {
        "fixed_monthly": 30000,
        "variable_rate": 0.03
      },
      "maintenance": {
        "fixed_monthly": 20000,
        "variable_rate": 0.01
      }
    },
    
    "competitors": [
      {
        "name": "竞品A酒店",
        "brand": "某某品牌",
        "adr_range": [580, 650],
        "occ_range": [0.75, 0.85]
      }
    ],
    
    "benchmarks": {
      "industry": {
        "labor_cost_ratio": [0.25, 0.35],
        "energy_ratio": [0.03, 0.06],
        "gop_margin": [0.30, 0.40]
      },
      "group": {
        "labor_cost_ratio": [0.25, 0.30],
        "gop_margin": [0.32, 0.38]
      }
    }
  }
}
```

### 6.2 参数动态获取流程

```
用户请求分析
    │
    ▼
检查是否有历史配置 ──否──→ 启动配置引导
    │                        │
   是                        ▼
    │                   分步采集数据
    │                        │
    │                        ▼
    │                   校验数据合理性
    │                        │
    │                        ▼
    │                   保存配置文件
    │                        │
    ▼                        │
读取配置参数 ◄───────────────┘
    │
    ▼
执行分析计算
    │
    ▼
输出结果 + 更新配置建议
```

### 6.3 交互式参数采集

**场景1：新酒店首次使用**

```
AI：欢迎使用P&L分析工具！检测到您是首次使用，
    我需要了解一些基本信息来为您定制分析模型。
    
    请问您的酒店名称是？

店总：深圳蛇口开元名庭

AI：收到。请问：
    1. 房间数量是多少？
    2. 所在城市是？（如已从名称识别会自动确认）

店总：189间，深圳

AI：好的，深圳属于一线城市。
    根据德胧基准，深圳开元名庭的ADR基准是630-710元。
    
    请问您目前：
    - 平均房价(ADR)大约是多少？
    - 出租率(OCC)大约是多少？

店总：ADR 550，OCC 85%

AI：收到数据：
    - ADR：550元（低于深圳基准，后续会给出提升建议）
    - OCC：85%（符合基准）
    
    接下来需要采集成本数据。请问：
    - 月度人工成本大约多少？
    - 月度能耗费用大约多少？
    
    如果不确定，可以说"估算"，我会根据基准帮您估算。

店总：人工30万，能耗7万

AI：好的，数据已记录。我来生成您的专属配置文件...
    
    ✅ 配置完成！现在您可以：
    1. 说"分析本月P&L"开始分析
    2. 说"修改配置"调整参数
    3. 说"查看基准"了解德胧标准
```

**场景2：已有配置，增量更新**

```
店总：更新一下我们的ADR，最近涨到580了

AI：好的，已更新ADR为580元。
    
    这比之前的550元提升了5.5%，预计：
    - 月收入增加约6.7万元
    - RevPAR提升至493元
    
    需要重新分析本月的P&L吗？

店总：好的，帮我分析一下

AI：正在基于新参数进行分析...
```

---

## 七、迭代优化机制

### 7.1 学习闭环

```
┌─────────────────────────────────────────────────────┐
│                   学习闭环机制                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│    ┌─────────┐                                     │
│    │ 用户输入 │                                     │
│    └────┬────┘                                     │
│         │                                          │
│         ▼                                          │
│    ┌─────────┐    ┌─────────┐                     │
│    │ 分析执行 │───→│ 结果输出 │                     │
│    └────┬────┘    └────┬────┘                     │
│         │              │                          │
│         │              ▼                          │
│         │        ┌─────────┐                     │
│         │        │ 用户反馈 │                     │
│         │        └────┬────┘                     │
│         │              │                          │
│         ▼              ▼                          │
│    ┌─────────────────────────┐                   │
│    │     参数优化调整         │                   │
│    │  - 基准值修正           │                   │
│    │  - 预测模型优化         │                   │
│    │  - 预警阈值调整         │                   │
│    └───────────┬─────────────┘                   │
│                │                                  │
│                ▼                                  │
│         ┌─────────┐                              │
│         │ 记忆存储 │                              │
│         └─────────┘                              │
│                                                     │
└─────────────────────────────────────────────────────┘
```

### 7.2 参数自优化算法

```python
def optimize_parameters(historical_results, target_metric='gop_margin'):
    """
    参数自优化算法
    
    原理：基于历史预测结果与实际结果的偏差，
         自动调整预测模型参数
    
    参数：
    - historical_results: 历史预测与实际数据
    - target_metric: 优化目标指标
    
    返回：
    - optimized_params: 优化后的参数
    """
    
    # 计算预测误差
    errors = []
    for record in historical_results:
        predicted = record['predicted']
        actual = record['actual']
        error = (predicted - actual) / actual
        errors.append(error)
    
    # 计算系统性偏差
    systematic_bias = np.mean(errors)
    
    # 调整参数
    if systematic_bias > 0.05:
        # 预测系统性偏高，下调系数
        adjustment = 1 - systematic_bias * 0.5
    elif systematic_bias < -0.05:
        # 预测系统性偏低，上调系数
        adjustment = 1 - systematic_bias * 0.5
    else:
        adjustment = 1
    
    optimized_params = {
        'coefficient_adjustment': adjustment,
        'confidence_level': 1 - np.std(errors)
    }
    
    return optimized_params
```

### 7.3 持续改进机制

| 改进类型 | 触发条件 | 改进动作 |
|----------|----------|----------|
| 基准值更新 | 连续3个月偏差>10% | 重新校准基准值 |
| 模型优化 | 预测准确率<70% | 切换预测模型 |
| 预警调整 | 误报率>30% | 调整预警阈值 |
| 新增功能 | 用户反馈需求 | 功能迭代开发 |

---

## 八、质量保证

### 8.1 分析结果质量标准

| 维度 | 标准 | 验证方法 |
|------|------|----------|
| 准确性 | 预测误差<10% | 历史数据回测 |
| 完整性 | 覆盖所有关键指标 | 检查清单 |
| 可理解性 | 店总能理解并应用 | 用户反馈 |
| 可操作性 | 给出具体行动建议 | 专家评审 |

### 8.2 数据安全与隐私

- 所有数据仅存储在用户私有空间
- 不传输到外部服务器
- 支持数据导出和删除
- 符合数据安全合规要求

---

## 九、后续规划

### 9.1 短期迭代（1-2周）

- [ ] 完善参数动态采集流程
- [ ] 实现配置文件持久化
- [ ] 添加更多财务模型

### 9.2 中期规划（1-2月）

- [ ] 引入机器学习预测模型
- [ ] 支持多酒店对比分析
- [ ] 移动端适配优化

### 9.3 长期愿景

- 打造德胧集团标准化的财务分析工具
- 形成"数据-分析-决策-反馈"闭环
- 支持AI驱动的智能经营决策

---

**文档版本**：v1.0
**最后更新**：2026年4月23日
**维护者**：P&L Skill设计团队


path: references/data_template.md
content: # 酒店P&L数据分析模板

## 一、基础数据表

### 酒店基本信息
```
酒店名称：_________________
品牌：_________________
城市：_________________
开业时间：_________________
房间数：_________________
餐厅餐位：_________________
会议室数量/面积：_________________
```

### 当月经营数据

| 项目 | 本月 | 去年同期 | 环比 | 预算 | 差异 |
|------|------|----------|------|------|------|
| 可售客房夜次 | | | | | |
| 已售客房夜次 | | | | | |
| 出租率(OCC) | | | | | |
| 平均房价(ADR) | | | | | |
| RevPAR | | | | | |
| 客房收入 | | | | | |
| 餐饮收入 | | | | | |
| - 早餐 | | | | | |
| - 中餐 | | | | | |
| - 晚餐 | | | | | |
| - 宴会 | | | | | |
| - 其他 | | | | | |
| 其他收入 | | | | | |
| **总收入** | | | | | |

## 二、成本数据表

| 成本项目 | 本月 | 去年同期 | 预算 | 占营收比 |
|----------|------|----------|------|----------|
| **客房部成本** | | | | |
| 人工成本 | | | | |
| 客房消耗品 | | | | |
| 洗涤费 | | | | |
| 维保费 | | | | |
| 其他 | | | | |
| **客房部小计** | | | | |
| **餐饮部成本** | | | | |
| 食品成本 | | | | |
| 酒水成本 | | | | |
| 人工成本 | | | | |
| 洗涤费 | | | | |
| 能源费 | | | | |
| 其他 | | | | |
| **餐饮部小计** | | | | |
| **未分配运营费用** | | | | |
| 市场营销费 | | | | |
| 能源动力费 | | | | |
| 行政管理费 | | | | |
| 保险费 | | | | |
| 税费 | | | | |
| 其他 | | | | |
| **未分配小计** | | | | |
| **运营总成本** | | | | |

## 三、利润计算表

| 指标 | 本月 | 预算 | 差异 |
|------|------|------|------|
| 总收入 | | | |
| 部门直接成本 | | | |
| 客房部利润 | | | |
| 餐饮部利润 | | | |
| 其他部门利润 | | | |
| **GOP (毛利润)** | | | |
| GOP Margin | | | |
| 未分配运营费用 | | | |
| **NOI (净经营利润)** | | | |
| 管理费 | | | |
| **EBITDA** | | | |
| 固定资产折旧 | | | |
| 利息支出 | | | |
| **净利润** | | | |

## 四、KPI仪表盘

### 核心KPI达成

| KPI | 实际 | 预算 | 达成率 | 趋势 |
|-----|------|------|--------|------|
| 出租率 | | | | ↑/↓/→ |
| ADR | | | | ↑/↓/→ |
| RevPAR | | | | ↑/↓/→ |
| GOP | | | | ↑/↓/→ |
| GOP Margin | | | | ↑/↓/→ |
| 人工成本率 | | | | ↑/↓/→ |

### 部门绩效

| 部门 | 收入 | 成本 | 利润 | 利润率 |
|------|------|------|------|--------|
| 客房部 | | | | |
| 餐饮部 | | | | |
| 宴会部 | | | | |
| 其他 | | | | |

## 五、客源结构分析

| 渠道 | 房间夜次 | 占比 | ADR | 收入 |
|------|----------|------|-----|------|
| 会员直销 | | | | |
| 企业协议 | | | | |
| OTA | | | | |
| 团队 | | | | |
| 散客 | | | | |
| 其他 | | | | |

## 六、保本分析

| 项目 | 数值 |
|------|------|
| 固定成本总额 | |
| 变动成本率 | |
| 贡献边际率 | |
| 保本收入 | |
| 保本出租率 | |
| 实际出租率 | |
| 安全边际 | |

## 七、竞品对标

| 指标 | 本店 | 竞品A | 竞品B |
|------|------|-------|-------|
| OCC | | | |
| ADR | | | |
| RevPAR | | | |
| GOP Margin | | | |
| 市场份额 | | | |

## 八、趋势图表数据

### 月度趋势（近12个月）

| 月份 | OCC | ADR | RevPAR | GOP | GOP% |
|------|-----|-----|--------|-----|------|
| 1月 | | | | | |
| 2月 | | | | | |
| ... | | | | | |
| 12月 | | | | | |

---

*使用说明：将数据填入对应表格，Skill会自动计算指标并生成分析报告*


path: references/delonix_model.md
content: # 德胧集团经营模型分析报告

> 基于公开信息整理 | 仅供参考

## 一、德胧集团概况

### 1.1 集团简介
- **成立时间**：2022年
- **创始人**：郑南雁（7天连锁酒店创始人）
- **定位**：亚太领先的国际酒店和体验消费集团
- **核心理念**："重塑体验消费"（Reshaping Consumer Experience）

### 1.2 核心业务

| 业务板块 | 品牌/内容 |
|----------|----------|
| 高端酒店 | 开元名都、开元名庭 |
| 中高端酒店 | 观堂、芳草地度假酒店、方外 |
| 商旅酒店 | 曼居/Model J |
| 日本市场 | Hotel MONday |
| 会员体系 | 德胧百达屋（以入住时长积分） |

### 1.3 规模数据（2024-2025）

| 指标 | 数值 |
|------|------|
| 签约管理酒店 | 1,600+家 |
| 客房总数 | 245,000+间 |
| 品牌数量 | 15个 |
| 会员规模 | 3,000万+ |
| 全球排名 | 第14位（Hotels杂志） |

## 二、德胧经营模型核心要素

### 2.1 "品牌先行"方法论

**品牌建构六要素：**
1. 市场需求洞察
2. 价值主张提炼
3. 客户特性分析
4. 品牌口号设计
5. 卖点体系构建
6. 产品服务设计

**代表品牌：**

| 品牌 | 定位 | 特色 |
|------|------|------|
| 开元名都 | 东方豪华商务 | "晨间盛食"、在地餐饮文化 |
| 开元名庭 | 唐风美学 | 奉茶礼、元气朝食、大唐芙蓉香 |
| 观堂 | 心灵旅行 | 沉浸式文化体验 |
| 芳草地 | 自然度假 | 小木屋、船屋特色住宿 |

### 2.2 两大竞争力系统

#### 系统一：百达屋会员体系
- **创新点**：以"入住时长"计算积分（颠覆传统按消费金额积分）
- **规模**：3,000万+会员
- **优势**：降低OTA依赖，提升复购率

#### 系统二：AIHIT虫洞服务体系
- **定位**：基于AI的数字化运营系统
- **核心功能**：
  - "神灯AI"智能服务管家
  - 全链路服务追踪
  - 人与AI协同扁平化组织

### 2.3 "天干地支"体验焕新模型

**天干**：集团统一年度体验主题
**地支**：门店分批次低成本焕新

**特点：**
- 模块化装配，工期30-60天
- 全程不中断经营
- 边经营、边升级、边收益

## 三、酒店财务模型分析

### 3.1 收入结构模型

```
总营收 = 客房收入 + 餐饮收入 + 其他收入

客房收入 = 可售客房夜次 × 出租率 × 平均房价
         = 可售客房夜次 × RevPAR
```

**德胧酒店典型收入结构：**

| 收入类别 | 占比 | 说明 |
|----------|------|------|
| 客房收入 | 55-65% | 核心收入来源 |
| 餐饮收入 | 25-35% | 早餐、会议、散餐、宴会 |
| 其他收入 | 5-15% | 康乐、洗衣、商务服务等 |

### 3.2 成本结构模型

```
总成本 = 变动成本 + 固定成本

变动成本：
- 客房变动成本（一次性用品、布草、洗涤）
- 餐饮变动成本（食材、酒水）
- 与出租率相关的能耗

固定成本：
- 固定人工（管理人员、基本配置员工）
- 租金/折旧
- 保险
- 市场营销（基础部分）
```

**德胧酒店典型成本结构（占营收比）：**

| 成本类别 | 占比 | 备注 |
|----------|------|------|
| 人工成本 | 25-32% | 酒店最大成本项 |
| 能耗成本 | 3-5% | 有节能优化空间 |
| 餐饮成本 | 28-35% | 食材+酒水成本率 |
| 市场营销费 | 3-5% | 含OTA佣金 |
| 行政管理费 | 2-4% | 办公、差旅等 |
| 维修维护费 | 2-3% | 设备维护摊销 |

### 3.3 利润层级模型

```
营业收入
- 营业成本（餐饮原料等）
= 部门毛利润
  客房部毛利润
  餐饮部毛利润
  其他部门毛利润
- 未分配运营费用（人工、能耗、市场、行政等）
= GOP（毛利润/经营利润）
  ※ 核心运营指标，不含固定费用
- 固定费用（租金、折旧、利息）
= NOI（净经营利润）
- 所得税
= 净利润
```

### 3.4 关键财务指标参考

**开元名都（豪华酒店）**
| 指标 | 参考值 |
|------|--------|
| ADR | 600-900元 |
| OCC | 55-70% |
| RevPAR | 350-600元 |
| GOP Margin | 30-38% |

**开元名庭（中高端）**
| 指标 | 参考值 |
|------|--------|
| ADR | 350-550元 |
| OCC | 60-75% |
| RevPAR | 250-400元 |
| GOP Margin | 28-35% |

**曼居/Model J（商旅）**
| 指标 | 参考值 |
|------|--------|
| ADR | 200-350元 |
| OCC | 65-80% |
| RevPAR | 150-280元 |
| GOP Margin | 35-45% |

## 四、保本点分析模型

### 4.1 保本点计算公式

```
保本出租率 = 固定成本 / (ADR × 可售客房夜次 × GOP率)
```

### 4.2 贡献边际分析

```
单位贡献边际 = ADR - 单位变动成本
贡献边际率 = 贡献边际 / ADR
```

### 4.3 敏感性分析

| 变量变化 | 对保本点的影响 |
|----------|----------------|
| ADR +10% | 保本点下降约9% |
| ADR -10% | 保本点上升约11% |
| 固定成本 -10% | 保本点下降10% |
| 变动成本率 -5% | 保本点下降约5-8% |

## 五、万豪合作财务模型

### 5.1 "双品牌"模式
- **合作方**：万豪国际集团
- **品牌**：臻品之选（Tribute Portfolio）
- **模式**：特许经营+品牌联名

### 5.2 财务特点

| 项目 | 说明 |
|------|------|
| 品牌使用费 | 按营收一定比例 |
| 管理费 | 基本管理费+激励管理费 |
| 渠道共享 | 接入万豪Bonvoy会员体系 |
| OTA佣金 | 可能获得更低佣金率 |

### 5.3 收益提升案例
- 杭州博奥开元名都臻品之选：ADR上涨30%
- 富春芳草地臻品之选：RevPAR翻倍

## 六、数字化运营价值

### 6.1 神灯AI价值测算

| 优化项 | 预期效果 |
|--------|----------|
| 服务响应时间 | 缩短50%+ |
| 人工协调成本 | 降低30% |
| 客户满意度 | 提升10-15% |
| 复购率 | 提升5-8% |

### 6.2 数据驱动决策

通过百达屋会员数据：
- 精准客群画像
- 个性化定价策略
- 动态库存管理

## 七、SWOT分析框架

### Strengths（优势）
- 强大的会员体系（3000万+）
- 多元品牌矩阵覆盖各细分市场
- 创始团队丰富的酒店运营经验
- 数字化技术应用领先

### Weaknesses（劣势）
- 部分品牌知名度不如国际品牌
- 高端市场与国际巨头仍有差距
- 私有化后财务透明度降低

### Opportunities（机会）
- 国内消费升级持续
- 出境游复苏带动海外布局
- AI技术重塑服务体验
- 存量酒店改造市场

### Threats（威胁）
- 国际酒店集团加速下沉
- OTA平台议价能力增强
- 经济波动影响商旅需求
- 人工成本持续上涨

---

*注：本报告基于德胧集团公开信息整理，数据截止2025年，部分财务数据为推算，仅供参考。*


path: references/delonix_real_model.md
content: # 德胧集团开元名庭经营模型（真实数据）

> 数据来源：德胧集团经营模型文件（2026年4月）

---

## 一、基本信息模板

| 项目 | 数值 | 单位 | 说明 |
|------|------|------|------|
| 城市 | - | - | 7大重点城市：北京、上海、广州、深圳、杭州、成都、重庆 |
| 项目评级 | X | - | 根据城市、路段、商圈、物业状况等级综合评定 |
| 物理房量 | 120 | 间 | 标准单店规模 |
| 单房面积（含公区） | 45 | ㎡/间 | - |
| 单房面积（套内） | 26 | ㎡/间 | - |
| 得房率 | 57.78% | - | 26/45 |
| 总建筑面积 | 5,400 | ㎡ | - |
| 物业房租 | 85 | 元/㎡/月(含税) | - |
| 年租金 | 550.8万 | 元/年（含税） | - |
| 租赁期 | 15 | 年 | - |
| 工程费 | 1,642.75万 | 元 | - |
| 单房造价（含公区） | 13.69万 | 元 | - |

### 前期加盟费（2026年商务政策）

| 项目 | 金额 | 说明 |
|------|------|------|
| 品牌使用费 | 30万 | - |
| 技术服务费 | 20万 | - |
| 保证金 | 10万 | 可退 |
| **合计** | **169.28万** | 不含保证金 |

---

## 二、动态参数设置

### 淡旺季系数

| 参数 | 数值 | 说明 |
|------|------|------|
| 淡季OCC系数 | 0.9 | 淡季出租率基准×0.9 |
| 旺季OCC系数 | 1.1 | 旺季出租率基准×1.1 |
| 淡季ADR系数 | 0.95 | 淡季房价基准×0.95 |
| 旺季ADR系数 | 1.05 | 旺季房价基准×1.05 |
| 灵活用工比例 | 20% | 高峰期可临时增加的比例 |

### 经营基准值

| 参数 | 数值 | 说明 |
|------|------|------|
| 基准OCC | 85% | X类酒店投资OCC平均为85% |
| 基准ADR | 550元 | 与客源结构有关 |

---

## 三、七大城市淡旺季划分

### 深圳
| 类型 | 月数 | 月份 |
|------|------|------|
| 旺季 | 6个月 | 4月、7月、8月、10月、11月、12月 |
| 淡季 | 2个月 | 6月、9月 |
| 平季 | 4个月 | 1月、2月、3月、5月 |

### 北京
| 类型 | 月数 | 月份 |
|------|------|------|
| 旺季 | 4个月 | 6月、7月、8月、10月 |
| 淡季 | 5个月 | 1月、2月、3月、11月、12月 |
| 平季 | 3个月 | 4月、5月、9月 |

### 杭州
| 类型 | 月数 | 月份 |
|------|------|------|
| 旺季 | 4个月 | 4月、5月、7月、8月、10月 |
| 淡季 | 5个月 | 1月、6月、12月 |
| 平季 | 3个月 | 3月、9月、11月 |

### 七大城市ADR基准

| 城市 | ADR下限 | ADR上限 |
|------|---------|---------|
| 北京 | 580元 | 790元 |
| 上海 | 480元 | 480元 |
| 广州 | 530元 | 530元 |
| 深圳 | 630元 | 710元 |
| 杭州 | 330元 | 420元 |
| 重庆 | 340元 | 430元 |
| 成都 | 450元 | 540元 |
| **一线城市平均** | **555元** | **627.5元** |
| **七大城市平均** | **477元** | **557元** |

---

## 四、客源结构

| 渠道 | 占比 | ADR计算 | ADR值 | 佣金率 |
|------|------|---------|-------|--------|
| 百达屋 | 60% | 基准ADR×0.85 | 467.5元 | 8% |
| 集团合作渠道(OTA) | 30% | 基准ADR×0.9 | 495元 | 12% |
| 线下销售客户 | 10% | 基准ADR×0.7 | 385元 | 3% |
| **合计** | **100%** | - | **467.5元** | - |

### 会员时光值
- 占客房收入比例：3%
- 按德胧百达屋房费收入的3%计算

---

## 五、管理公司收费

| 项目 | 比例 | 说明 |
|------|------|------|
| 基本管理费 | 2.7% | 营业收入占比 |
| 品牌营销及使用费 | 1.8% | 营业收入占比 |

### 系统使用费（不含餐饮）

| 年份 | 费用 |
|------|------|
| 首年 | 4.8万元 |
| 第二年及以后 | 1.5万元/年 |

---

## 六、人员编制（引入虫洞后）

### 标准编制
- **人房比：0.175**
- **门店总人数：21人**

### 岗位编制明细

| 岗位类型 | 固定编制 | 淡季/平季人数 | 旺季人数 | 底薪 | 浮动奖金 | 福利 | 合计 | 月工资总额 |
|----------|----------|---------------|----------|------|----------|------|------|------------|
| 综合支持岗-无指定技能要求 | 14 | 14 | 15 | 4,500 | 2,500 | 1,673 | 8,673 | 121,425元 |
| 综合支持岗-有指定技能要求 | 5 | 5 | 5 | 5,600 | 0 | 1,673 | 7,273 | 36,366元 |
| 总经理助理 | 1 | 1 | 1 | 10,000 | 0 | 1,673 | 11,673 | 11,673元 |
| 店总 | 1 | 1 | 1 | 15,000 | 7,167 | 6,732 | 28,898 | 28,898元 |
| **合计** | **21** | **21** | **22** | - | - | - | - | **198,363元** |

### 人均人力成本
- 剔除店总后人均：8,473元/月
- 人均工资（不含单位社保）：5,524元/月

### 福利构成
- 社保公积金
- 住宿补贴：500元/人/月
- 员工餐费：15元/人/天×26天

---

## 七、成本结构

### 变动运营成本（单房/天）

| 成本项目 | 成本（元/间夜） | 说明 |
|----------|-----------------|------|
| 早餐成本 | 13.0 | 已售间夜×85%×标准单房早餐成本18元 |
| 客房易耗品 | 10.2 | 标准单房客房易耗品成本12元左右 |
| 布草洗涤 | 8.5 | 标准单房布草洗涤成本10元左右 |
| 能耗 | 15.3 | 标准单房能耗成本18元左右 |
| **合计** | **47元** | - |

### 能耗明细（月度示例）

| 项目 | 月度费用 | 单房/天 | 占比 |
|------|----------|---------|------|
| 电费 | 56,676元 | 9.67元 | 3.23% |
| 水费 | 15,400元 | 2.63元 | - |
| 天燃气 | 0 | 0 | - |
| **能耗占收入比例** | - | - | **3.2%** |

### 渠道佣金

| 渠道 | 佣金率 | 说明 |
|------|--------|------|
| 百达屋佣金 | 8% | 百达屋房费收入的8% |
| 集团合作渠道(OTA)佣金 | 12% | OTA房费收入的12%(平均) |
| 企业协议客户 | 3% | 线下房费收入的3% |

---

## 八、收入预测示例（深圳蛇口店）

### 1月（平季）经营数据

| 指标 | 数值 |
|------|------|
| 经营天数 | 31天 |
| 物理房量 | 189间 |
| 累计物理房量 | 5,859 |
| 累计已售间夜 | 4,980 |
| OCC | 85% |
| ADR | 550元 |

### 收入结构

| 渠道 | 收入（元） | 单房/天 |
|------|------------|---------|
| 百达屋 | 1,317,860 | 224.93 |
| 集团合作渠道(OTA) | 697,691 | 119.08 |
| 线下 | 180,883 | 30.87 |
| **收入合计（不含税）** | **2,196,434** | **374.88** |
| 会员时光值收入 | 39,536 | 6.75 |
| **客房收入总计** | **2,235,970** | **381.63** |

### 成本结构（月度）

| 成本项目 | 金额（元） | 单房/天 |
|----------|------------|---------|
| 总营业成本 | 811,922 | 138.58 |
| 职工薪酬合计 | 298,241 | 50.90 |
| 能耗 | 72,076 | 12.30 |
| 销售及推广/渠道佣金 | 194,578 | 33.21 |
| 其他 | 25,285 | 4.32 |

---

## 九、关键财务指标

### 投资回报指标
- 预估投资额：1,702.75万元
- 回本期限：以EBITDA计算

### 运营效率指标
- 总收入（月度）：223.6万元
- 总营业成本（月度）：81.2万元
- 成本占收入比：36.3%

---

## 十、模型特色功能

### 1. 动态人员编制
- 根据OCC浮动调整人力成本
- 旺季可增加外包人员
- 灵活用工比例20%

### 2. 季节性收入预测
- 引入淡旺季OCC/ADR系数
- 七大城市差异化淡旺季划分
- 精准预测月度收入

### 3. 客源结构优化
- 百达屋直销占比60%，降低OTA依赖
- 差异化ADR策略
- 会员时光值增加收入

### 4. 虫洞系统赋能
- 人房比优化至0.175
- 扁平化组织架构
- AI驱动的服务效率提升

---

**最后更新时间：2026年4月23日**


path: references/glossary.md
content: # 酒店P&L分析术语表

## 收入类指标

### 客房收入指标
| 术语 | 英文 | 定义 | 计算公式 |
|------|------|------|----------|
| 出租率 | OCC / Occupancy | 已售客房占总可售客房的比例 | 已售客房夜次 / 可售客房夜次 × 100% |
| 平均房价 | ADR / Average Daily Rate | 每间已售客房的平均收入 | 客房收入 / 已售客房夜次 |
| 每可售房收入 | RevPAR / Revenue Per Available Room | 每间可售客房的收入产出 | ADR × OCC 或 客房收入 / 可售客房夜次 |
| 双人入住率 | double occupancy | 双人入住房间占总入住房间比例 | 双人房数 / 总入住房数 |
| 客源结构 | Mix | 不同客源渠道占比 | 各渠道房间夜次 / 总房间夜次 |

### 餐饮收入指标
| 术语 | 英文 | 定义 |
|------|------|------|
| 餐饮收入 | F&B Revenue | 餐厅、酒吧、宴会收入总和 |
| 人均消费 | Average Spend Per Cover | 每位顾客平均消费额 |
| 上座率 | Seat Turnover | 座位使用效率 |
| 翻台率 | Table Turnover | 餐桌重复使用次数 |
| 食品成本率 | Food Cost % | 食材成本占总食品收入比例 |
| 酒水成本率 | Beverage Cost % | 酒水成本占总酒水收入比例 |

## 成本类指标

### 运营成本
| 术语 | 英文 | 说明 |
|------|------|------|
| 人工成本 | Labor Cost | 工资、社保、奖金等人员费用 |
| 能耗成本 | Utility Cost | 水、电、气、暖等能源费用 |
| 客房消耗品 | Rooms Supplies | 客房一次性用品、布草洗涤等 |
| 市场营销费 | Marketing Expense | 广告、促销、佣金等 |
| 行政管理费 | Admin Expense | 办公、差旅、专业服务等 |
| 维修维护费 | Maintenance | 设备维护、装修摊销等 |

### 成本率基准
| 成本项 | 全服务酒店 | 有限服务酒店 |
|--------|------------|--------------|
| 人工成本率 | 28-35% | 25-30% |
| 能耗占比 | 4-6% | 3-5% |
| 市场营销费 | 3-5% | 4-6% |
| 行政管理费 | 3-5% | 2-4% |
| 维修维护费 | 2-4% | 2-3% |

## 利润类指标

### GOP (Gross Operating Profit)
**营业经营利润**

```
GOP = 总营收 - 运营部门直接成本 - 未分配运营费用
```

- 反映酒店核心运营能力
- 不含固定费用（租金、折旧、利息）
- 是评估运营效率的核心指标

### GOP Margin
**GOP利润率**

```
GOP Margin = GOP / 总营收 × 100%
```

行业参考：
- 全服务酒店：25-35%
- 有限服务酒店：35-45%
- 豪华酒店：35-50%

### EBITDA
**息税折旧摊销前利润**

```
EBITDA = 净利润 + 利息 + 所得税 + 折旧 + 摊销
```

- 用于评估酒店整体盈利能力
- 便于不同酒店间横向比较
- 投资者关注的核心指标

### NOI / NOP
**净经营利润**

```
NOI = EBITDA - 管理费
```

## 保本分析指标

### 盈亏平衡出租率
```
保本OCC = 固定成本总额 / (ADR × 可售客房夜次 × GOP率)
```

### 贡献边际
```
单位贡献边际 = ADR - 变动成本/间夜
贡献边际率 = 贡献边际 / ADR
```

### 安全边际
```
安全边际率 = (实际OCC - 保本OCC) / 实际OCC × 100%
```

## 投资分析指标

### Cap Rate (资本化率)
```
Cap Rate = NOI / 资产估值 × 100%
```

城市参考区间：
| 城市级别 | Cap Rate范围 |
|----------|--------------|
| 一线核心 | 4-6% |
| 一线非核心 | 6-8% |
| 二线核心 | 7-9% |
| 三四线城市 | 9-12%+ |

### ROI / ROA
```
投资回报率 = 年度净利润 / 总投资 × 100%
资产回报率 = 净利润 / 平均总资产 × 100%
```

## 行业标准体系

### USALI (Uniform System of Accounts for the Lodging Industry)
美国酒店业统一会计科目体系

**特点：**
- 按部门划分收入和成本
- 区分运营部门和未分配部门
- 便于部门绩效评估

### 中国酒店业参考标准
- 文华酒店会计科目
- 旅游饭店业协会统计口径

## 渠道术语

| 术语 | 说明 |
|------|------|
| Direct | 直销渠道（官网、APP、电话） |
| OTA | 在线旅行社（携程、美团、飞猪） |
| GDS | 全球分销系统 |
| Walk-in | 无预订散客 |
| Corporate | 企业协议客户 |
| Group | 团队客 |
| MICE | 会议会展客群 |

---

*本术语表基于酒店行业通用标准及德胧集团实际情况整理*


path: scripts/chart_generator.py
content: #!/usr/bin/env python3
"""
酒店P&L数据可视化脚本
使用ECharts生成交互式图表

依赖：pip install pyecharts
"""

import json
from datetime import datetime
from typing import Dict, List, Optional

# 尝试导入pyecharts，如果不可用则使用替代方案
try:
    from pyecharts.charts import Bar, Line, Pie, Gauge, Radar
    from pyecharts import options as opts
    from pyecharts.globals import ThemeType
    HAS_PYECHARTS = True
except ImportError:
    HAS_PYECHARTS = False
    print("提示：pyecharts未安装，将生成JSON数据供前端渲染")


class HotelPLVisualizer:
    """酒店P&L数据可视化类"""
    
    def __init__(self, title: str = "酒店P&L分析"):
        self.title = title
        self.data = {}
    
    def add_revenue_data(self, data: Dict):
        """添加收入数据"""
        self.data['revenue'] = data
    
    def add_cost_data(self, data: Dict):
        """添加成本数据"""
        self.data['cost'] = data
    
    def add_profit_data(self, data: Dict):
        """添加利润数据"""
        self.data['profit'] = data
    
    def generate_kpi_dashboard(self) -> str:
        """生成KPI仪表盘JSON数据"""
        if 'revenue' not in self.data or 'profit' not in self.data:
            return "{}"
        
        # 提取关键指标
        total_revenue = self.data['revenue'].get('total', 0)
        gop = self.data['profit'].get('gop', 0)
        gop_margin = self.data['profit'].get('gop_margin', 0)
        occ = self.data['revenue'].get('occ', 0)
        adr = self.data['revenue'].get('adr', 0)
        revpar = self.data['revenue'].get('revpar', 0)
        
        # 生成ECharts配置
        chart_config = {
            "title": {
                "text": self.title,
                "subtext": datetime.now().strftime("%Y年%m月"),
                "left": "center"
            },
            "tooltip": {
                "trigger": "item",
                "formatter": "{b}: {c} ({d}%)"
            },
            "series": [
                {
                    "name": "GOP率仪表",
                    "type": "gauge",
                    "radius": "60%",
                    "center": ["25%", "50%"],
                    "startAngle": 180,
                    "endAngle": 0,
                    "min": 0,
                    "max": 50,
                    "splitNumber": 5,
                    "itemStyle": {
                        "color": "#5470C6"
                    },
                    "progress": {
                        "show": True,
                        "width": 18
                    },
                    "pointer": {
                        "show": True,
                        "length": "60%",
                        "width": 6
                    },
                    "axisLine": {
                        "lineStyle": {
                            "width": 18
                        }
                    },
                    "axisTick": {
                        "distance": -20,
                        "length": 5,
                        "lineStyle": {
                            "color": "auto",
                            "width": 1
                        }
                    },
                    "splitLine": {
                        "distance": -20,
                        "length": 14,
                        "lineStyle": {
                            "color": "auto",
                            "width": 2
                        }
                    },
                    "axisLabel": {
                        "distance": -40,
                        "color": "#999",
                        "fontSize": 10
                    },
                    "detail": {
                        "valueAnimation": True,
                        "formatter": "{value}%",
                        "color": "auto",
                        "fontSize": 20,
                        "offsetCenter": [0, "40%"]
                    },
                    "data": [{"value": round(gop_margin, 1), "name": "GOP率"}]
                },
                {
                    "name": "出租率仪表",
                    "type": "gauge",
                    "radius": "60%",
                    "center": ["75%", "50%"],
                    "startAngle": 180,
                    "endAngle": 0,
                    "min": 0,
                    "max": 100,
                    "splitNumber": 5,
                    "itemStyle": {
                        "color": "#91CC75"
                    },
                    "progress": {
                        "show": True,
                        "width": 18
                    },
                    "pointer": {
                        "show": True,
                        "length": "60%",
                        "width": 6
                    },
                    "axisLine": {
                        "lineStyle": {
                            "width": 18
                        }
                    },
                    "axisTick": {
                        "distance": -20,
                        "length": 5,
                        "lineStyle": {
                            "color": "auto",
                            "width": 1
                        }
                    },
                    "splitLine": {
                        "distance": -20,
                        "length": 14,
                        "lineStyle": {
                            "color": "auto",
                            "width": 2
                        }
                    },
                    "axisLabel": {
                        "distance": -40,
                        "color": "#999",
                        "fontSize": 10
                    },
                    "detail": {
                        "valueAnimation": True,
                        "formatter": "{value}%",
                        "color": "auto",
                        "fontSize": 20,
                        "offsetCenter": [0, "40%"]
                    },
                    "data": [{"value": round(occ, 1), "name": "出租率"}]
                }
            ]
        }
        
        return json.dumps(chart_config, ensure_ascii=False, indent=2)
    
    def generate_revenue_chart(self) -> str:
        """生成收入结构饼图"""
        if 'revenue' not in self.data:
            return "{}"
        
        revenue_data = self.data['revenue']
        
        chart_config = {
            "title": {
                "text": "收入结构分析",
                "left": "center"
            },
            "tooltip": {
                "trigger": "item",
                "formatter": "{b}: ¥{c}万 ({d}%)"
            },
            "legend": {
                "orient": "vertical",
                "left": "left"
            },
            "series": [
                {
                    "name": "收入构成",
                    "type": "pie",
                    "radius": ["40%", "70%"],
                    "avoidLabelOverlap": False,
                    "itemStyle": {
                        "borderRadius": 10,
                        "borderColor": "#fff",
                        "borderWidth": 2
                    },
                    "label": {
                        "show": True,
                        "formatter": "{b}\n¥{c}万\n{d}%"
                    },
                    "emphasis": {
                        "label": {
                            "show": True,
                            "fontSize": 16,
                            "fontWeight": "bold"
                        }
                    },
                    "data": [
                        {"value": revenue_data.get('room', 0), "name": "客房收入", "itemStyle": {"color": "#5470C6"}},
                        {"value": revenue_data.get('fb', 0), "name": "餐饮收入", "itemStyle": {"color": "#91CC75"}},
                        {"value": revenue_data.get('other', 0), "name": "其他收入", "itemStyle": {"color": "#FAC858"}}
                    ]
                }
            ]
        }
        
        return json.dumps(chart_config, ensure_ascii=False, indent=2)
    
    def generate_cost_trend(self, monthly_data: List[Dict]) -> str:
        """生成成本趋势图"""
        months = [d.get('month', '') for d in monthly_data]
        labor_costs = [d.get('labor', 0) for d in monthly_data]
        utility_costs = [d.get('utility', 0) for d in monthly_data]
        marketing_costs = [d.get('marketing', 0) for d in monthly_data]
        
        chart_config = {
            "title": {
                "text": "成本趋势分析",
                "left": "center"
            },
            "tooltip": {
                "trigger": "axis",
                "axisPointer": {"type": "shadow"}
            },
            "legend": {
                "data": ["人工成本", "能耗成本", "市场营销费"],
                "bottom": 0
            },
            "grid": {
                "left": "3%",
                "right": "4%",
                "bottom": "15%",
                "containLabel": True
            },
            "xAxis": {
                "type": "category",
                "data": months
            },
            "yAxis": {
                "type": "value",
                "axisLabel": {"formatter": "¥{value}万"}
            },
            "series": [
                {
                    "name": "人工成本",
                    "type": "bar",
                    "stack": "total",
                    "data": labor_costs,
                    "itemStyle": {"color": "#5470C6"}
                },
                {
                    "name": "能耗成本",
                    "type": "bar",
                    "stack": "total",
                    "data": utility_costs,
                    "itemStyle": {"color": "#91CC75"}
                },
                {
                    "name": "市场营销费",
                    "type": "bar",
                    "stack": "total",
                    "data": marketing_costs,
                    "itemStyle": {"color": "#FAC858"}
                }
            ]
        }
        
        return json.dumps(chart_config, ensure_ascii=False, indent=2)
    
    def generate_profit_analysis(self) -> str:
        """生成利润分析瀑布图数据"""
        if 'profit' not in self.data:
            return "{}"
        
        profit_data = self.data['profit']
        
        # 瀑布图数据
        waterfall_data = [
            {"name": "营业收入", "value": profit_data.get('total_revenue', 0)},
            {"name": "人工成本", "value": -abs(profit_data.get('labor', 0))},
            {"name": "能耗成本", "value": -abs(profit_data.get('utility', 0))},
            {"name": "营销成本", "value": -abs(profit_data.get('marketing', 0))},
            {"name": "管理费用", "value": -abs(profit_data.get('admin', 0))},
            {"name": "其他费用", "value": -abs(profit_data.get('other', 0))},
            {"name": "GOP", "value": profit_data.get('gop', 0)},
        ]
        
        chart_config = {
            "title": {
                "text": "利润形成分析",
                "left": "center"
            },
            "tooltip": {
                "trigger": "axis",
                "axisPointer": {"type": "shadow"},
                "formatter": "{b}: ¥{c}万"
            },
            "grid": {
                "left": "3%",
                "right": "4%",
                "bottom": "10%",
                "containLabel": True
            },
            "xAxis": {
                "type": "category",
                "data": [d['name'] for d in waterfall_data],
                "axisLabel": {"rotate": 15}
            },
            "yAxis": {
                "type": "value",
                "axisLabel": {"formatter": "¥{value}万"}
            },
            "series": [
                {
                    "type": "bar",
                    "data": [d['value'] for d in waterfall_data],
                    "itemStyle": {
                        "color": lambda params: "#5470C6" if params.value >= 0 else "#EE6666"
                    },
                    "label": {
                        "show": True,
                        "position": "top",
                        "formatter": lambda params: f"¥{params.value:,.0f}万"
                    }
                }
            ]
        }
        
        return json.dumps(chart_config, ensure_ascii=False, indent=2)
    
    def generate_breakeven_chart(self, 
                                  breakeven_occ: float,
                                  current_occ: float,
                                  adr: float) -> str:
        """生成保本点分析图"""
        chart_config = {
            "title": {
                "text": "保本点分析",
                "subtext": f"保本出租率: {breakeven_occ:.1f}% | 当前: {current_occ:.1f}%",
                "left": "center"
            },
            "tooltip": {
                "trigger": "axis",
                "axisPointer": {"type": "shadow"}
            },
            "legend": {
                "data": ["收入线", "成本线", "当前点"],
                "bottom": 0
            },
            "grid": {
                "left": "3%",
                "right": "4%",
                "bottom": "15%",
                "containLabel": True
            },
            "xAxis": {
                "type": "category",
                "data": ["0%", "20%", "40%", "60%", "80%", "100%"],
                "name": "出租率"
            },
            "yAxis": {
                "type": "value",
                "axisLabel": {"formatter": "¥{value}万"},
                "name": "金额"
            },
            "series": [
                {
                    "name": "收入线",
                    "type": "line",
                    "data": [0, 200, 400, 600, 800, 1000],
                    "itemStyle": {"color": "#5470C6"},
                    "areaStyle": {"color": "rgba(84, 112, 198, 0.2)"}
                },
                {
                    "name": "成本线",
                    "type": "line",
                    "data": [350, 350, 350, 350, 350, 350],
                    "itemStyle": {"color": "#EE6666"},
                    "linestyle": {"type": "dashed"}
                },
                {
                    "name": "当前点",
                    "type": "scatter",
                    "data": [[f"{current_occ:.1f}%", current_occ * 10]],
                    "symbolSize": 20,
                    "itemStyle": {"color": "#91CC75"}
                }
            ]
        }
        
        return json.dumps(chart_config, ensure_ascii=False, indent=2)
    
    def export_all_charts(self, output_dir: str = "./charts"):
        """导出所有图表配置为JSON文件"""
        import os
        os.makedirs(output_dir, exist_ok=True)
        
        files = {
            "kpi_dashboard.json": self.generate_kpi_dashboard(),
            "revenue_chart.json": self.generate_revenue_chart(),
            "profit_analysis.json": self.generate_profit_analysis(),
        }
        
        for filename, content in files.items():
            filepath = os.path.join(output_dir, filename)
            with open(filepath, 'w', encoding='utf-8') as f:
                f.write(content)
            print(f"已生成: {filepath}")
        
        return list(files.keys())


def demo():
    """演示示例"""
    visualizer = HotelPLVisualizer("杭州开元名都大酒店")
    
    # 添加收入数据
    visualizer.add_revenue_data({
        'total': 2185,
        'room': 1420,
        'fb': 580,
        'other': 185,
        'occ': 72.5,
        'adr': 658,
        'revpar': 477
    })
    
    # 添加成本数据
    visualizer.add_cost_data({
        'labor': 612,
        'utility': 87,
        'marketing': 98,
        'admin': 65,
        'maintenance': 44,
        'other': 98,
        'total': 1004
    })
    
    # 添加利润数据
    visualizer.add_profit_data({
        'total_revenue': 2185,
        'labor': 612,
        'utility': 87,
        'marketing': 98,
        'admin': 65,
        'other': 98,
        'gop': 728,
        'gop_margin': 33.3
    })
    
    # 生成KPI仪表盘
    print("=== KPI仪表盘 ===")
    print(visualizer.generate_kpi_dashboard())
    
    # 导出图表
    print("\n=== 导出图表 ===")
    files = visualizer.export_all_charts()
    print(f"已生成 {len(files)} 个图表配置")


if __name__ == "__main__":
    demo()


path: scripts/pl_calculator.py
content: #!/usr/bin/env python3
"""
酒店P&L分析计算器
Hotel P&L Analysis Calculator

功能：
- 财务指标计算
- 保本点分析
- 敏感性分析
- 行业对标
"""

import json
from typing import Dict, List, Optional, Tuple

class HotelPLCalculator:
    """酒店P&L计算器"""
    
    def __init__(self, 
                 rooms: int = 0,
                 occ: float = 0.0,
                 adr: float = 0.0,
                 total_revenue: float = 0.0,
                 room_revenue: float = 0.0,
                 fB_revenue: float = 0.0,
                 other_revenue: float = 0.0,
                 labor_cost: float = 0.0,
                 utility_cost: float = 0.0,
                 marketing_cost: float = 0.0,
                 admin_cost: float = 0.0,
                 maintenance_cost: float = 0.0,
                 other_cost: float = 0.0,
                 fixed_cost: float = 0.0,
                 fB_cost: float = 0.0):
        """
        初始化酒店P&L计算器
        
        Args:
            rooms: 房间数
            occ: 出租率 (0-1)
            adr: 平均房价
            total_revenue: 总营收
            room_revenue: 客房收入
            fB_revenue: 餐饮收入
            other_revenue: 其他收入
            labor_cost: 人工成本
            utility_cost: 能耗成本
            marketing_cost: 市场营销费
            admin_cost: 行政管理费
            maintenance_cost: 维修维护费
            other_cost: 其他费用
            fixed_cost: 固定费用(租金/折旧/利息)
            fB_cost: 餐饮成本
        """
        self.rooms = rooms
        self.occ = occ
        self.adr = adr
        self.total_revenue = total_revenue
        self.room_revenue = room_revenue
        self.fB_revenue = fB_revenue
        self.other_revenue = other_revenue
        self.labor_cost = labor_cost
        self.utility_cost = utility_cost
        self.marketing_cost = marketing_cost
        self.admin_cost = admin_cost
        self.maintenance_cost = maintenance_cost
        self.other_cost = other_cost
        self.fixed_cost = fixed_cost
        self.fB_cost = fB_cost
        
        # 计算衍生指标
        self._calculate_derived_metrics()
    
    def _calculate_derived_metrics(self):
        """计算衍生指标"""
        # 出租率转为百分比
        self.occ_pct = self.occ * 100 if self.occ <= 1 else self.occ
        
        # 如果没有直接提供总营收，则计算
        if self.total_revenue == 0:
            self.total_revenue = self.room_revenue + self.fB_revenue + self.other_revenue
        
        # RevPAR
        self.revpar = self.adr * (self.occ / 100) if self.occ > 1 else self.adr * self.occ
        
        # 可售客房夜次 (假设30天)
        self.available_room_nights = self.rooms * 30
        
        # 已售客房夜次
        self.sold_room_nights = self.available_room_nights * (self.occ / 100) if self.occ > 1 else self.available_room_nights * self.occ
        
    def calculate_revenue_metrics(self) -> Dict:
        """计算收入相关指标"""
        return {
            "总收入": f"¥{self.total_revenue:,.0f}",
            "客房收入": f"¥{self.room_revenue:,.0f}",
            "客房收入占比": f"{self.room_revenue/self.total_revenue*100:.1f}%" if self.total_revenue else "N/A",
            "餐饮收入": f"¥{self.fB_revenue:,.0f}",
            "餐饮收入占比": f"{self.fB_revenue/self.total_revenue*100:.1f}%" if self.total_revenue else "N/A",
            "其他收入": f"¥{self.other_revenue:,.0f}",
            "RevPAR": f"¥{self.revpar:,.0f}",
            "已售客房夜次": f"{self.sold_room_nights:,.0f}",
        }
    
    def calculate_cost_metrics(self) -> Dict:
        """计算成本相关指标"""
        total_cost = (self.labor_cost + self.utility_cost + self.marketing_cost + 
                     self.admin_cost + self.maintenance_cost + self.other_cost)
        
        return {
            "总成本": f"¥{total_cost:,.0f}",
            "总成本率": f"{total_cost/self.total_revenue*100:.1f}%" if self.total_revenue else "N/A",
            "人工成本": f"¥{self.labor_cost:,.0f}",
            "人工成本率": f"{self.labor_cost/self.total_revenue*100:.1f}%" if self.total_revenue else "N/A",
            "能耗成本": f"¥{self.utility_cost:,.0f}",
            "能耗占比": f"{self.utility_cost/self.total_revenue*100:.1f}%" if self.total_revenue else "N/A",
            "市场营销费": f"¥{self.marketing_cost:,.0f}",
            "营销费用率": f"{self.marketing_cost/self.total_revenue*100:.1f}%" if self.total_revenue else "N/A",
            "餐饮成本": f"¥{self.fB_cost:,.0f}",
            "餐饮成本率": f"{self.fB_cost/self.fB_revenue*100:.1f}%" if self.fB_revenue else "N/A",
        }
    
    def calculate_profit_metrics(self) -> Dict:
        """计算利润相关指标"""
        # GOP计算
        total_cost = (self.labor_cost + self.utility_cost + self.marketing_cost + 
                     self.admin_cost + self.maintenance_cost + self.other_cost)
        gop = self.total_revenue - total_cost
        
        # 餐饮部利润
        fB_profit = self.fB_revenue - self.fB_cost
        
        # 客房部利润 (假设客房成本主要是人工和客房消耗品)
        room_cost = self.labor_cost * 0.4  # 假设40%人工用于客房
        room_profit = self.room_revenue - room_cost
        
        # NOI
        noi = gop - self.fixed_cost
        
        # 净利润
        net_profit = noi * 0.8  # 假设税率20%
        
        return {
            "GOP": f"¥{gop:,.0f}",
            "GOP Margin": f"{gop/self.total_revenue*100:.1f}%" if self.total_revenue else "N/A",
            "客房部利润": f"¥{room_profit:,.0f}",
            "客房利润率": f"{room_profit/self.room_revenue*100:.1f}%" if self.room_revenue else "N/A",
            "餐饮部利润": f"¥{fB_profit:,.0f}",
            "餐饮利润率": f"{fB_profit/self.fB_revenue*100:.1f}%" if self.fB_revenue else "N/A",
            "NOI": f"¥{noi:,.0f}",
            "NOI Margin": f"{noi/self.total_revenue*100:.1f}%" if self.total_revenue else "N/A",
            "净利润": f"¥{net_profit:,.0f}",
            "净利润率": f"{net_profit/self.total_revenue*100:.1f}%" if self.total_revenue else "N/A",
        }
    
    def calculate_breakeven(self, days: int = 30) -> Dict:
        """计算保本点"""
        # 变动成本
        variable_cost = (self.utility_cost + self.marketing_cost + 
                        self.maintenance_cost + self.other_cost)
        
        # 固定成本 = 人工成本 + 行政管理费 + 固定费用
        fixed_cost_total = (self.labor_cost + self.admin_cost + self.fixed_cost)
        
        # 贡献边际
        contribution_margin = self.adr - (variable_cost / self.sold_room_nights) if self.sold_room_nights > 0 else 0
        
        # 保本出租率
        available_nights = self.rooms * days
        breakeven_occ = fixed_cost_total / (self.adr * available_nights * 0.33) if self.adr > 0 else 0
        
        # 安全边际
        current_occ = self.occ / 100 if self.occ > 1 else self.occ
        safety_margin = (current_occ - breakeven_occ) * 100
        
        return {
            "固定成本总额": f"¥{fixed_cost_total:,.0f}",
            "变动成本/间夜": f"¥{variable_cost/self.sold_room_nights:,.0f}" if self.sold_room_nights > 0 else "N/A",
            "贡献边际/间夜": f"¥{contribution_margin:,.0f}",
            "贡献边际率": f"{contribution_margin/self.adr*100:.1f}%" if self.adr > 0 else "N/A",
            "保本出租率": f"{breakeven_occ*100:.1f}%",
            "当前出租率": f"{self.occ_pct:.1f}%",
            "安全边际": f"{safety_margin:.1f}pp",
        }
    
    def sensitivity_analysis(self) -> List[Dict]:
        """敏感性分析"""
        scenarios = []
        
        # ADR变化分析
        for adr_change in [-10, 10]:
            new_adr = self.adr * (1 + adr_change/100)
            new_revpar = new_adr * (self.occ / 100) if self.occ > 1 else new_adr * self.occ
            scenarios.append({
                "情景": f"ADR {adr_change:+d}%",
                "新ADR": f"¥{new_adr:,.0f}",
                "新RevPAR": f"¥{new_revpar:,.0f}",
                "收入变化": f"¥{self.total_revenue * adr_change/100:+,,.0f}",
            })
        
        # 出租率变化分析
        for occ_change in [-5, 5]:
            new_occ = self.occ_pct + occ_change
            new_sold = self.available_room_nights * new_occ/100
            new_revenue = new_sold * self.adr
            scenarios.append({
                "情景": f"OCC {occ_change:+d}pp",
                "新出租率": f"{new_occ:.1f}%",
                "新增收入": f"¥{new_revenue - self.total_revenue * 0.65:+,,.0f}",
            })
        
        return scenarios
    
    def get_full_report(self) -> str:
        """生成完整报告"""
        report = []
        report.append("=" * 50)
        report.append("        酒店P&L分析报告")
        report.append("=" * 50)
        
        report.append("\n【一、收入分析】")
        for k, v in self.calculate_revenue_metrics().items():
            report.append(f"  {k}: {v}")
        
        report.append("\n【二、成本分析】")
        for k, v in self.calculate_cost_metrics().items():
            report.append(f"  {k}: {v}")
        
        report.append("\n【三、利润分析】")
        for k, v in self.calculate_profit_metrics().items():
            report.append(f"  {k}: {v}")
        
        report.append("\n【四、保本点分析】")
        for k, v in self.calculate_breakeven().items():
            report.append(f"  {k}: {v}")
        
        report.append("\n【五、敏感性分析】")
        for s in self.sensitivity_analysis():
            report.append(f"  {s['情景']}: {s.get('新ADR', s.get('新出租率', ''))}")
        
        report.append("\n" + "=" * 50)
        return "\n".join(report)


def demo():
    """演示示例"""
    # 创建示例酒店数据 (300间客房的中高端酒店)
    hotel = HotelPLCalculator(
        rooms=300,
        occ=72.5,
        adr=658,
        total_revenue=21850000,
        room_revenue=14200000,
        fB_revenue=5800000,
        other_revenue=1850000,
        labor_cost=6120000,
        utility_cost=870000,
        marketing_cost=980000,
        admin_cost=650000,
        maintenance_cost=440000,
        other_cost=980000,
        fixed_cost=3800000,
        fB_cost=2030000,
    )
    
    print(hotel.get_full_report())
    
    return hotel


if __name__ == "__main__":
    demo()


path: scripts/sample_data.json
content: {
  "hotel_info": {
    "name": "杭州开元名都大酒店",
    "brand": "开元名都",
    "city": "杭州",
    "rooms": 300,
    "open_date": "2018-01-01",
    "star_rating": "五星"
  },
  "monthly_data": {
    "current_month": {
      "month": "2026年1月",
      "available_room_nights": 9300,
      "sold_room_nights": 6743,
      "occ": 72.5,
      "adr": 658,
      "revpar": 477,
      "revenue": {
        "total": 2185,
        "room": 1420,
        "fb": 580,
        "fb_breakdown": {
          "breakfast": 125,
          "lunch": 210,
          "dinner": 155,
          "banquet": 90
        },
        "other": 185,
        "channel_mix": {
          "direct": {"rooms": 2697, "pct": 40, "adr": 695, "revenue": 568},
          "corporate": {"rooms": 1886, "pct": 28, "adr": 638, "revenue": 429},
          "ota": {"rooms": 1349, "pct": 20, "adr": 612, "revenue": 350},
          "group": {"rooms": 472, "pct": 7, "adr": 520, "revenue": 49},
          "walkin": {"rooms": 339, "pct": 5, "adr": 720, "revenue": 24}
        }
      },
      "cost": {
        "total": 1207,
        "labor": 612,
        "labor_rate": 28.0,
        "utility": 87,
        "utility_rate": 4.0,
        "marketing": 98,
        "marketing_rate": 4.5,
        "admin": 65,
        "admin_rate": 3.0,
        "maintenance": 44,
        "maintenance_rate": 2.0,
        "other": 98,
        "other_rate": 4.5,
        "fb_cost": 203,
        "fb_cost_rate": 35.0
      },
      "profit": {
        "gop": 728,
        "gop_margin": 33.3,
        "noi": 348,
        "noi_margin": 15.9,
        "net_profit": 278,
        "net_margin": 12.7
      }
    },
    "budget": {
      "occ": 70,
      "adr": 680,
      "revpar": 476,
      "total_revenue": 2150,
      "gop": 710,
      "gop_margin": 33.0
    },
    "last_year": {
      "occ": 69.3,
      "adr": 672,
      "revpar": 466,
      "total_revenue": 2075,
      "gop": 673,
      "gop_margin": 32.4
    }
  },
  "breakeven": {
    "fixed_cost": 634,
    "variable_cost_per_night": 58,
    "contribution_margin": 165,
    "contribution_margin_rate": 33.0,
    "breakeven_occ": 59.5,
    "safety_margin": 13.0
  },
  "competitors": [
    {
      "name": "竞品A-开元名都",
      "occ": 70.2,
      "adr": 620,
      "revpar": 435,
      "gop_margin": 31.8
    },
    {
      "name": "竞品B-国际五星",
      "occ": 68.5,
      "adr": 880,
      "revpar": 603,
      "gop_margin": 36.5
    }
  ],
  "industry_benchmark": {
    "full_service_hotel": {
      "occ_range": [55, 70],
      "adr_range": [450, 800],
      "revpar_range": [300, 500],
      "gop_margin_range": [30, 40],
      "labor_cost_rate": [25, 35]
    },
    "delonix_standards": {
      "kaiyuan_mingdu": {
        "occ_target": 65,
        "adr_target": 650,
        "gop_margin_target": 33
      },
      "kaiyuan_mingting": {
        "occ_target": 70,
        "adr_target": 480,
        "gop_margin_target": 30
      }
    }
  },
  "trend_12_months": [
    {"month": "2025年2月", "occ": 68.2, "adr": 620, "revpar": 423, "gop": 680, "gop_margin": 32.5},
    {"month": "2025年3月", "occ": 71.5, "adr": 635, "revpar": 454, "gop": 715, "gop_margin": 33.2},
    {"month": "2025年4月", "occ": 73.8, "adr": 650, "revpar": 480, "gop": 745, "gop_margin": 33.8},
    {"month": "2025年5月", "occ": 75.2, "adr": 668, "revpar": 502, "gop": 765, "gop_margin": 34.1},
    {"month": "2025年6月", "occ": 72.0, "adr": 655, "revpar": 472, "gop": 730, "gop_margin": 33.5},
    {"month": "2025年7月", "occ": 78.5, "adr": 680, "revpar": 534, "gop": 790, "gop_margin": 34.5},
    {"month": "2025年8月", "occ": 80.2, "adr": 695, "revpar": 557, "gop": 820, "gop_margin": 35.0},
    {"month": "2025年9月", "occ": 74.5, "adr": 660, "revpar": 492, "gop": 750, "gop_margin": 33.8},
    {"month": "2025年10月", "occ": 76.8, "adr": 675, "revpar": 518, "gop": 780, "gop_margin": 34.2},
    {"month": "2025年11月", "occ": 71.2, "adr": 645, "revpar": 459, "gop": 710, "gop_margin": 33.2},
    {"month": "2025年12月", "occ": 69.8, "adr": 635, "revpar": 443, "gop": 695, "gop_margin": 32.8},
    {"month": "2026年1月", "occ": 72.5, "adr": 658, "revpar": 477, "gop": 728, "gop_margin": 33.3}
  ]
}


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)