Files
smart-project-pricing/规划文档/03_数据库设计.md
2026-01-31 21:33:06 +08:00

836 lines
37 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 智能项目定价模型 - 数据库设计
> **版本**v1.0
> **创建日期**2026-01-19
> **最后更新**2026-01-19
> **负责人**:待定
---
## 1. 数据库规范
遵循《瑞小美系统技术栈标准与字符标准》:
| 项目 | 标准 |
|------|------|
| **数据库** | MySQL 8.0 |
| **字符集** | utf8mb4 |
| **排序规则** | utf8mb4_unicode_ci |
| **时区** | Asia/Shanghai (UTC+8) |
| **日期格式** | ISO 8601 (YYYY-MM-DDTHH:mm:ss) |
### 命名规范
| 类型 | 规范 | 示例 |
|------|------|------|
| 表名 | 小写,下划线分隔,复数形式 | `projects`, `cost_items` |
| 字段名 | 小写,下划线分隔 | `project_name`, `created_at` |
| 主键 | `id`,自增整数或 UUID | `id BIGINT AUTO_INCREMENT` |
| 外键 | `{关联表}_id` | `project_id` |
| 时间戳 | `created_at`, `updated_at` | - |
| 布尔值 | `is_``has_` 前缀 | `is_active`, `has_discount` |
| 金额 | DECIMAL(12, 2) | `unit_price DECIMAL(12, 2)` |
| 百分比 | DECIMAL(5, 2) | `discount_rate DECIMAL(5, 2)` |
---
## 2. ER 图
```
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 成本核算模块 │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ projects │ │ materials │ │ equipments │ │
│ │ 服务项目 │ │ 耗材 │ │ 设备 │ │
│ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │
│ │ │ │ │
│ │ 1:N │ M:N │ M:N │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ project_cost_items │ │
│ │ 项目成本明细 │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ │ ┌─────────────────┐ │
│ │ │ staff_levels │ │
│ │ │ 人员级别 │ │
│ │ └────────┬────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ project_labor_costs │ │
│ │ 项目人工成本 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────┐ │
│ │ fixed_costs │ ────────────────────────────────────────────────────────────► │
│ │ 固定成本 │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 市场行情模块 │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ competitors │ ─────1:N────► │ competitor_prices│ │
│ │ 竞品机构 │ │ 竞品价格 │ │
│ └─────────────────┘ └────────┬────────┘ │
│ │ │
│ │ N:1 │
│ ▼ │
│ ┌─────────────────┐ │
│ │ projects │ │
│ └─────────────────┘ │
│ │
│ ┌─────────────────┐ │
│ │ benchmark_prices│ 标杆价格参考 │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 定价与模拟模块 │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ pricing_plans │ ─────1:N────► │profit_simulations│ │
│ │ 定价方案 │ │ 利润模拟 │ │
│ └────────┬────────┘ └─────────────────┘ │
│ │ │
│ │ N:1 │
│ ▼ │
│ ┌─────────────────┐ │
│ │ projects │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 3. 表结构设计
### 3.1 基础模块
#### 3.1.1 projects服务项目
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| project_code | VARCHAR(50) | UNIQUE, NOT NULL | 项目编码 |
| project_name | VARCHAR(100) | NOT NULL | 项目名称 |
| category_id | BIGINT | FK → categories.id | 项目分类 |
| description | TEXT | - | 项目描述 |
| duration_minutes | INT | NOT NULL, DEFAULT 0 | 操作时长(分钟)|
| is_active | TINYINT(1) | NOT NULL, DEFAULT 1 | 是否启用 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
| created_by | BIGINT | FK → users.id | 创建人 |
**索引**
- `idx_project_code` (project_code)
- `idx_category_id` (category_id)
- `idx_is_active` (is_active)
```sql
CREATE TABLE projects (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_code VARCHAR(50) NOT NULL UNIQUE,
project_name VARCHAR(100) NOT NULL,
category_id BIGINT,
description TEXT,
duration_minutes INT NOT NULL DEFAULT 0,
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_by BIGINT,
INDEX idx_project_code (project_code),
INDEX idx_category_id (category_id),
INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.1.2 categories项目分类
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| category_name | VARCHAR(50) | NOT NULL | 分类名称 |
| parent_id | BIGINT | FK → categories.id | 父分类 |
| sort_order | INT | NOT NULL, DEFAULT 0 | 排序 |
| is_active | TINYINT(1) | NOT NULL, DEFAULT 1 | 是否启用 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE categories (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(50) NOT NULL,
parent_id BIGINT,
sort_order INT NOT NULL DEFAULT 0,
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_parent_id (parent_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
---
### 3.2 成本核算模块
#### 3.2.1 materials耗材
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| material_code | VARCHAR(50) | UNIQUE, NOT NULL | 耗材编码 |
| material_name | VARCHAR(100) | NOT NULL | 耗材名称 |
| unit | VARCHAR(20) | NOT NULL | 单位(支/ml/个)|
| unit_price | DECIMAL(12,2) | NOT NULL | 单价 |
| supplier | VARCHAR(100) | - | 供应商 |
| material_type | VARCHAR(20) | NOT NULL | 类型consumable/injectable/product |
| is_active | TINYINT(1) | NOT NULL, DEFAULT 1 | 是否启用 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE materials (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
material_code VARCHAR(50) NOT NULL UNIQUE,
material_name VARCHAR(100) NOT NULL,
unit VARCHAR(20) NOT NULL,
unit_price DECIMAL(12,2) NOT NULL,
supplier VARCHAR(100),
material_type VARCHAR(20) NOT NULL COMMENT 'consumable-耗材, injectable-针剂, product-产品',
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_material_code (material_code),
INDEX idx_material_type (material_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.2.2 equipments设备
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| equipment_code | VARCHAR(50) | UNIQUE, NOT NULL | 设备编码 |
| equipment_name | VARCHAR(100) | NOT NULL | 设备名称 |
| original_value | DECIMAL(12,2) | NOT NULL | 设备原值 |
| residual_rate | DECIMAL(5,2) | NOT NULL, DEFAULT 5.00 | 残值率(%) |
| service_years | INT | NOT NULL | 预计使用年限 |
| estimated_uses | INT | NOT NULL | 预计使用次数 |
| depreciation_per_use | DECIMAL(12,4) | NOT NULL | 单次折旧成本(计算字段)|
| purchase_date | DATE | - | 购入日期 |
| is_active | TINYINT(1) | NOT NULL, DEFAULT 1 | 是否启用 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE equipments (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
equipment_code VARCHAR(50) NOT NULL UNIQUE,
equipment_name VARCHAR(100) NOT NULL,
original_value DECIMAL(12,2) NOT NULL,
residual_rate DECIMAL(5,2) NOT NULL DEFAULT 5.00,
service_years INT NOT NULL,
estimated_uses INT NOT NULL,
depreciation_per_use DECIMAL(12,4) NOT NULL COMMENT '单次折旧 = (原值 - 残值) / 总次数',
purchase_date DATE,
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_equipment_code (equipment_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.2.3 staff_levels人员级别
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| level_code | VARCHAR(20) | UNIQUE, NOT NULL | 级别编码 |
| level_name | VARCHAR(50) | NOT NULL | 级别名称 |
| hourly_rate | DECIMAL(10,2) | NOT NULL | 时薪(元/小时)|
| is_active | TINYINT(1) | NOT NULL, DEFAULT 1 | 是否启用 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE staff_levels (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
level_code VARCHAR(20) NOT NULL UNIQUE,
level_name VARCHAR(50) NOT NULL,
hourly_rate DECIMAL(10,2) NOT NULL COMMENT '元/小时',
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.2.4 project_cost_items项目成本明细-耗材设备)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| project_id | BIGINT | FK, NOT NULL | 项目ID |
| item_type | VARCHAR(20) | NOT NULL | 类型material/equipment |
| item_id | BIGINT | NOT NULL | 耗材/设备ID |
| quantity | DECIMAL(10,4) | NOT NULL | 用量 |
| unit_cost | DECIMAL(12,4) | NOT NULL | 单位成本 |
| total_cost | DECIMAL(12,2) | NOT NULL | 总成本(计算)|
| remark | VARCHAR(200) | - | 备注 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE project_cost_items (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id BIGINT NOT NULL,
item_type VARCHAR(20) NOT NULL COMMENT 'material-耗材, equipment-设备',
item_id BIGINT NOT NULL,
quantity DECIMAL(10,4) NOT NULL,
unit_cost DECIMAL(12,4) NOT NULL,
total_cost DECIMAL(12,2) NOT NULL COMMENT '= quantity * unit_cost',
remark VARCHAR(200),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_project_id (project_id),
INDEX idx_item_type (item_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.2.5 project_labor_costs项目人工成本
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| project_id | BIGINT | FK, NOT NULL | 项目ID |
| staff_level_id | BIGINT | FK, NOT NULL | 人员级别ID |
| duration_minutes | INT | NOT NULL | 操作时长(分钟)|
| hourly_rate | DECIMAL(10,2) | NOT NULL | 时薪(记录时快照)|
| labor_cost | DECIMAL(12,2) | NOT NULL | 人工成本(计算)|
| remark | VARCHAR(200) | - | 备注 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE project_labor_costs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id BIGINT NOT NULL,
staff_level_id BIGINT NOT NULL,
duration_minutes INT NOT NULL,
hourly_rate DECIMAL(10,2) NOT NULL COMMENT '记录时的时薪快照',
labor_cost DECIMAL(12,2) NOT NULL COMMENT '= duration/60 * hourly_rate',
remark VARCHAR(200),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_project_id (project_id),
INDEX idx_staff_level_id (staff_level_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.2.6 fixed_costs固定成本
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| cost_name | VARCHAR(100) | NOT NULL | 成本名称 |
| cost_type | VARCHAR(20) | NOT NULL | 类型rent/utilities/property/other |
| monthly_amount | DECIMAL(12,2) | NOT NULL | 月度金额 |
| year_month | VARCHAR(7) | NOT NULL | 年月2026-01 |
| allocation_method | VARCHAR(20) | NOT NULL, DEFAULT 'count' | 分摊方式count/revenue/duration |
| is_active | TINYINT(1) | NOT NULL, DEFAULT 1 | 是否启用 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE fixed_costs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
cost_name VARCHAR(100) NOT NULL,
cost_type VARCHAR(20) NOT NULL COMMENT 'rent-房租, utilities-水电, property-物业, other-其他',
monthly_amount DECIMAL(12,2) NOT NULL,
year_month VARCHAR(7) NOT NULL COMMENT '格式2026-01',
allocation_method VARCHAR(20) NOT NULL DEFAULT 'count' COMMENT 'count-按项目数, revenue-按营收, duration-按时长',
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_year_month (year_month)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.2.7 project_cost_summaries项目成本汇总-视图或表)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT | 主键 |
| project_id | BIGINT | 项目ID |
| material_cost | DECIMAL(12,2) | 耗材成本 |
| equipment_cost | DECIMAL(12,2) | 设备折旧成本 |
| labor_cost | DECIMAL(12,2) | 人工成本 |
| fixed_cost_allocation | DECIMAL(12,2) | 固定成本分摊 |
| total_cost | DECIMAL(12,2) | 总成本(最低成本线)|
| calculated_at | DATETIME | 计算时间 |
```sql
CREATE TABLE project_cost_summaries (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id BIGINT NOT NULL UNIQUE,
material_cost DECIMAL(12,2) NOT NULL DEFAULT 0.00,
equipment_cost DECIMAL(12,2) NOT NULL DEFAULT 0.00,
labor_cost DECIMAL(12,2) NOT NULL DEFAULT 0.00,
fixed_cost_allocation DECIMAL(12,2) NOT NULL DEFAULT 0.00,
total_cost DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '最低成本线',
calculated_at DATETIME NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_project_id (project_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
---
### 3.3 市场行情模块
#### 3.3.1 competitors竞品机构
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| competitor_name | VARCHAR(100) | NOT NULL | 机构名称 |
| address | VARCHAR(200) | - | 地址 |
| distance_km | DECIMAL(5,2) | - | 距离(公里)|
| positioning | VARCHAR(20) | NOT NULL | 定位high/medium/budget |
| contact | VARCHAR(50) | - | 联系方式 |
| is_key_competitor | TINYINT(1) | NOT NULL, DEFAULT 0 | 是否重点关注 |
| is_active | TINYINT(1) | NOT NULL, DEFAULT 1 | 是否启用 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE competitors (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
competitor_name VARCHAR(100) NOT NULL,
address VARCHAR(200),
distance_km DECIMAL(5,2),
positioning VARCHAR(20) NOT NULL COMMENT 'high-高端, medium-中端, budget-大众',
contact VARCHAR(50),
is_key_competitor TINYINT(1) NOT NULL DEFAULT 0,
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_positioning (positioning),
INDEX idx_is_key (is_key_competitor)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.3.2 competitor_prices竞品价格
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| competitor_id | BIGINT | FK, NOT NULL | 竞品机构ID |
| project_id | BIGINT | FK | 关联本店项目ID可空|
| project_name | VARCHAR(100) | NOT NULL | 竞品项目名称 |
| original_price | DECIMAL(12,2) | NOT NULL | 原价 |
| promo_price | DECIMAL(12,2) | - | 促销价 |
| member_price | DECIMAL(12,2) | - | 会员价 |
| price_source | VARCHAR(20) | NOT NULL | 来源official/meituan/dianping/survey |
| collected_at | DATE | NOT NULL | 采集日期 |
| remark | VARCHAR(200) | - | 备注 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE competitor_prices (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
competitor_id BIGINT NOT NULL,
project_id BIGINT COMMENT '关联本店项目',
project_name VARCHAR(100) NOT NULL COMMENT '竞品项目名称',
original_price DECIMAL(12,2) NOT NULL,
promo_price DECIMAL(12,2),
member_price DECIMAL(12,2),
price_source VARCHAR(20) NOT NULL COMMENT 'official-官网, meituan-美团, dianping-大众点评, survey-实地调研',
collected_at DATE NOT NULL,
remark VARCHAR(200),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_competitor_id (competitor_id),
INDEX idx_project_id (project_id),
INDEX idx_collected_at (collected_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.3.3 benchmark_prices标杆价格
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| benchmark_name | VARCHAR(100) | NOT NULL | 标杆机构名称 |
| category_id | BIGINT | FK | 项目分类ID |
| min_price | DECIMAL(12,2) | NOT NULL | 最低价 |
| max_price | DECIMAL(12,2) | NOT NULL | 最高价 |
| avg_price | DECIMAL(12,2) | NOT NULL | 均价 |
| price_tier | VARCHAR(20) | NOT NULL | 价格带low/medium/high/premium |
| effective_date | DATE | NOT NULL | 生效日期 |
| remark | VARCHAR(200) | - | 备注 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE benchmark_prices (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
benchmark_name VARCHAR(100) NOT NULL,
category_id BIGINT,
min_price DECIMAL(12,2) NOT NULL,
max_price DECIMAL(12,2) NOT NULL,
avg_price DECIMAL(12,2) NOT NULL,
price_tier VARCHAR(20) NOT NULL COMMENT 'low-低端, medium-中端, high-高端, premium-奢华',
effective_date DATE NOT NULL,
remark VARCHAR(200),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_category_id (category_id),
INDEX idx_effective_date (effective_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.3.4 market_analysis_results市场分析结果
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| project_id | BIGINT | FK, NOT NULL | 项目ID |
| analysis_date | DATE | NOT NULL | 分析日期 |
| competitor_count | INT | NOT NULL | 样本竞品数量 |
| market_min_price | DECIMAL(12,2) | NOT NULL | 市场最低价 |
| market_max_price | DECIMAL(12,2) | NOT NULL | 市场最高价 |
| market_avg_price | DECIMAL(12,2) | NOT NULL | 市场均价 |
| market_median_price | DECIMAL(12,2) | NOT NULL | 市场中位价 |
| suggested_range_min | DECIMAL(12,2) | NOT NULL | 建议区间下限 |
| suggested_range_max | DECIMAL(12,2) | NOT NULL | 建议区间上限 |
| created_at | DATETIME | NOT NULL | 创建时间 |
```sql
CREATE TABLE market_analysis_results (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id BIGINT NOT NULL,
analysis_date DATE NOT NULL,
competitor_count INT NOT NULL,
market_min_price DECIMAL(12,2) NOT NULL,
market_max_price DECIMAL(12,2) NOT NULL,
market_avg_price DECIMAL(12,2) NOT NULL,
market_median_price DECIMAL(12,2) NOT NULL,
suggested_range_min DECIMAL(12,2) NOT NULL,
suggested_range_max DECIMAL(12,2) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_project_id (project_id),
INDEX idx_analysis_date (analysis_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
---
### 3.4 定价与模拟模块
#### 3.4.1 pricing_plans定价方案
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| project_id | BIGINT | FK, NOT NULL | 项目ID |
| plan_name | VARCHAR(100) | NOT NULL | 方案名称 |
| strategy_type | VARCHAR(20) | NOT NULL | 策略traffic/profit/premium |
| base_cost | DECIMAL(12,2) | NOT NULL | 基础成本 |
| target_margin | DECIMAL(5,2) | NOT NULL | 目标毛利率(%) |
| suggested_price | DECIMAL(12,2) | NOT NULL | 建议价格 |
| final_price | DECIMAL(12,2) | - | 最终定价 |
| ai_advice | TEXT | - | AI 建议内容 |
| is_active | TINYINT(1) | NOT NULL, DEFAULT 1 | 是否启用 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
| created_by | BIGINT | FK → users.id | 创建人 |
```sql
CREATE TABLE pricing_plans (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id BIGINT NOT NULL,
plan_name VARCHAR(100) NOT NULL,
strategy_type VARCHAR(20) NOT NULL COMMENT 'traffic-引流款, profit-利润款, premium-高端款',
base_cost DECIMAL(12,2) NOT NULL,
target_margin DECIMAL(5,2) NOT NULL,
suggested_price DECIMAL(12,2) NOT NULL,
final_price DECIMAL(12,2),
ai_advice TEXT,
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_by BIGINT,
INDEX idx_project_id (project_id),
INDEX idx_strategy_type (strategy_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.4.2 profit_simulations利润模拟
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| pricing_plan_id | BIGINT | FK, NOT NULL | 定价方案ID |
| simulation_name | VARCHAR(100) | NOT NULL | 模拟名称 |
| price | DECIMAL(12,2) | NOT NULL | 模拟价格 |
| estimated_volume | INT | NOT NULL | 预估客量 |
| period_type | VARCHAR(20) | NOT NULL | 周期daily/weekly/monthly |
| estimated_revenue | DECIMAL(14,2) | NOT NULL | 预估收入 |
| estimated_cost | DECIMAL(14,2) | NOT NULL | 预估成本 |
| estimated_profit | DECIMAL(14,2) | NOT NULL | 预估利润 |
| profit_margin | DECIMAL(5,2) | NOT NULL | 利润率(%) |
| breakeven_volume | INT | NOT NULL | 盈亏平衡客量 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| created_by | BIGINT | FK → users.id | 创建人 |
```sql
CREATE TABLE profit_simulations (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
pricing_plan_id BIGINT NOT NULL,
simulation_name VARCHAR(100) NOT NULL,
price DECIMAL(12,2) NOT NULL,
estimated_volume INT NOT NULL,
period_type VARCHAR(20) NOT NULL COMMENT 'daily-日, weekly-周, monthly-月',
estimated_revenue DECIMAL(14,2) NOT NULL,
estimated_cost DECIMAL(14,2) NOT NULL,
estimated_profit DECIMAL(14,2) NOT NULL,
profit_margin DECIMAL(5,2) NOT NULL,
breakeven_volume INT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_by BIGINT,
INDEX idx_pricing_plan_id (pricing_plan_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.4.3 sensitivity_analyses敏感性分析
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| simulation_id | BIGINT | FK, NOT NULL | 模拟ID |
| price_change_rate | DECIMAL(5,2) | NOT NULL | 价格变动率(%)-20,-15,-10,-5,0,5,10,15,20 |
| adjusted_price | DECIMAL(12,2) | NOT NULL | 调整后价格 |
| adjusted_profit | DECIMAL(14,2) | NOT NULL | 调整后利润 |
| profit_change_rate | DECIMAL(5,2) | NOT NULL | 利润变动率(%) |
| created_at | DATETIME | NOT NULL | 创建时间 |
```sql
CREATE TABLE sensitivity_analyses (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
simulation_id BIGINT NOT NULL,
price_change_rate DECIMAL(5,2) NOT NULL COMMENT '如 -20, -10, 0, 10, 20',
adjusted_price DECIMAL(12,2) NOT NULL,
adjusted_profit DECIMAL(14,2) NOT NULL,
profit_change_rate DECIMAL(5,2) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_simulation_id (simulation_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
---
### 3.5 系统模块
#### 3.5.1 users用户-与门户系统关联)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| portal_user_id | BIGINT | UNIQUE, NOT NULL | 门户用户ID |
| username | VARCHAR(50) | NOT NULL | 用户名 |
| role | VARCHAR(20) | NOT NULL | 角色admin/manager/operator |
| is_active | TINYINT(1) | NOT NULL, DEFAULT 1 | 是否启用 |
| created_at | DATETIME | NOT NULL | 创建时间 |
| updated_at | DATETIME | NOT NULL | 更新时间 |
```sql
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
portal_user_id BIGINT NOT NULL UNIQUE,
username VARCHAR(50) NOT NULL,
role VARCHAR(20) NOT NULL COMMENT 'admin-管理员, manager-经理, operator-操作员',
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_portal_user_id (portal_user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
#### 3.5.2 operation_logs操作日志
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| user_id | BIGINT | FK | 用户ID |
| module | VARCHAR(50) | NOT NULL | 模块cost/market/pricing/profit |
| action | VARCHAR(50) | NOT NULL | 操作create/update/delete/export |
| target_type | VARCHAR(50) | NOT NULL | 对象类型 |
| target_id | BIGINT | - | 对象ID |
| detail | JSON | - | 详情 |
| ip_address | VARCHAR(45) | - | IP地址 |
| created_at | DATETIME | NOT NULL | 操作时间 |
```sql
CREATE TABLE operation_logs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT,
module VARCHAR(50) NOT NULL,
action VARCHAR(50) NOT NULL,
target_type VARCHAR(50) NOT NULL,
target_id BIGINT,
detail JSON,
ip_address VARCHAR(45),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_module (module),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
---
## 4. 数据字典
### 4.1 枚举值定义
#### material_type耗材类型
| 值 | 说明 |
|---|------|
| consumable | 一般耗材 |
| injectable | 针剂 |
| product | 产品 |
#### allocation_method分摊方式
| 值 | 说明 |
|---|------|
| count | 按项目数量平均分摊 |
| revenue | 按项目营收占比分摊 |
| duration | 按项目时长占比分摊 |
#### positioning机构定位
| 值 | 说明 |
|---|------|
| high | 高端 |
| medium | 中端 |
| budget | 大众 |
#### price_source价格来源
| 值 | 说明 |
|---|------|
| official | 官网 |
| meituan | 美团 |
| dianping | 大众点评 |
| survey | 实地调研 |
#### strategy_type定价策略
| 值 | 说明 |
|---|------|
| traffic | 引流款 |
| profit | 利润款 |
| premium | 高端款 |
#### period_type周期类型
| 值 | 说明 |
|---|------|
| daily | 日 |
| weekly | 周 |
| monthly | 月 |
---
## 5. 索引设计原则
1. **主键**:所有表使用 `id BIGINT AUTO_INCREMENT` 作为主键
2. **外键索引**:所有外键字段建立索引
3. **查询优化**:高频查询字段建立索引
4. **联合索引**:多条件查询使用联合索引,遵循最左前缀原则
5. **避免过度索引**:权衡查询性能与写入性能
---
## 6. 数据迁移
### 6.1 初始化脚本
```sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS pricing_model
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
USE pricing_model;
-- 按依赖顺序创建表
-- 1. 基础表(无依赖)
-- categories, materials, equipments, staff_levels, fixed_costs, competitors
-- 2. 依赖基础表
-- projects, benchmark_prices
-- 3. 依赖项目表
-- project_cost_items, project_labor_costs, project_cost_summaries
-- competitor_prices, market_analysis_results
-- pricing_plans
-- 4. 依赖定价方案
-- profit_simulations
-- 5. 依赖模拟
-- sensitivity_analyses
-- 6. 系统表
-- users, operation_logs
```
### 6.2 初始数据
```sql
-- 人员级别初始数据
INSERT INTO staff_levels (level_code, level_name, hourly_rate) VALUES
('L1', '初级美容师', 30.00),
('L2', '中级美容师', 50.00),
('L3', '高级美容师', 80.00),
('L4', '资深美容师', 120.00),
('D1', '主治医师', 200.00),
('D2', '副主任医师', 350.00),
('D3', '主任医师', 500.00);
-- 项目分类初始数据
INSERT INTO categories (category_name, parent_id, sort_order) VALUES
('皮肤管理', NULL, 1),
('注射类', NULL, 2),
('光电类', NULL, 3),
('手术类', NULL, 4);
```
---
## 7. 附录
### 7.1 参考文档
- 《瑞小美系统技术栈标准与字符标准》
- MySQL 8.0 官方文档
---
*瑞小美技术团队 · 2026-01-19*