ShopTRAINING/.codelf/architecture.md

411 lines
10 KiB
Markdown

# 药店销售预测系统 - 架构详情
## 🏗️ 系统架构图
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端界面 │────│ API网关 │────│ 数据存储层 │
│ (Vue3 UI) │ │ (Flask API) │ │ (SQLite + JSON)│
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
┌────────────┐ ┌─────────────┐ ┌─────────────┐
│ ECharts图表│ │ 模型引擎 │ │ 文件系统 │
│ Element UI │ │ (PyTorch) │ │ (预测结果) │
└────────────┘ └─────────────┘ └─────────────┘
```
## 🎯 核心API详细说明
### 📊 数据管理API
#### GET /api/products
**功能**: 获取所有产品列表
**返回**:
```json
{
"status": "success",
"data": [
{
"product_id": "P001",
"product_name": "阿莫西林胶囊",
"category": "抗生素",
"price": 12.5
}
]
}
```
#### GET /api/products/{product_id}/sales
**功能**: 获取指定产品销售数据
**参数**:
- `product_id`: 产品ID
- `start_date`: 开始日期 (可选)
- `end_date`: 结束日期 (可选)
#### POST /api/data/upload
**功能**: 上传Excel销售数据
**请求体**: multipart/form-data
**文件格式**:
```
日期 | 产品ID | 产品名称 | 销量 | 价格
2024-01-01 | P001 | 阿莫西林 | 120 | 12.5
```
### 🏋️ 模型训练API
#### POST /api/training
**功能**: 启动模型训练任务
**请求体**:
```json
{
"product_id": "P001",
"model_type": "mlstm",
"hyperparameters": {
"epochs": 100,
"batch_size": 32,
"learning_rate": 0.001
}
}
```
#### GET /api/training/{task_id}
**功能**: 查询训练任务状态
**返回**:
```json
{
"status": "success",
"data": {
"task_id": "train_123",
"status": "running|completed|failed",
"progress": 75,
"current_epoch": 75,
"total_epochs": 100,
"loss": 0.0245,
"model_path": "saved_models/P001_mlstm_model.pt"
}
}
```
### 🔮 预测分析API
#### POST /api/prediction
**功能**: 执行销售预测
**请求体**:
```json
{
"product_id": "P001",
"model_type": "mlstm",
"model_id": "P001_mlstm_20241201",
"start_date": "2024-12-15",
"future_days": 7
}
```
**响应**:
```json
{
"status": "success",
"meta": {
"product_name": "阿莫西林胶囊",
"model_type": "mLSTM",
"start_date": "2024-12-15",
"created_at": "2024-12-14T10:30:00"
},
"data": {
"prediction_data": [
{"date": "2024-12-15", "predicted_sales": 125, "type": "预测销量"},
{"date": "2024-12-16", "predicted_sales": 118, "type": "预测销量"}
],
"history_data": [
{"date": "2024-12-13", "actual_sales": 120, "type": "历史销量"},
{"date": "2024-12-14", "actual_sales": 115, "type": "历史销量"}
],
"data": [
{"date": "2024-12-13", "sales": 120, "type": "历史销量"},
{"date": "2024-12-15", "sales": 125, "type": "预测销量"}
]
},
"analysis": {
"total_predicted": 861,
"average_daily": 123,
"trend": "stable",
"confidence": 0.85
},
"chart_data": {
"dates": ["2024-12-13", "2024-12-14", "2024-12-15"],
"history_sales": [120, 115, null],
"predicted_sales": [null, null, 125]
}
}
```
#### GET /api/prediction/history
**功能**: 获取历史预测记录
**参数**:
- `page`: 页码 (默认1)
- `size`: 每页数量 (默认10)
- `product_id`: 产品ID过滤 (可选)
- `model_type`: 模型类型过滤 (可选)
#### GET /api/prediction/history/{prediction_id}
**功能**: 获取预测详情
**返回**: 与POST /api/prediction相同格式
### 🎛️ 模型管理API
#### GET /api/models
**功能**: 获取模型列表
**返回**:
```json
{
"status": "success",
"data": [
{
"model_id": "P001_mlstm_20241201",
"product_id": "P001",
"product_name": "阿莫西林胶囊",
"model_type": "mLSTM",
"created_at": "2024-12-01T15:30:00",
"accuracy": 0.92,
"file_size": "2.5MB",
"training_epochs": 100
}
]
}
```
#### DELETE /api/models/{model_id}
**功能**: 删除模型文件
## 🎨 前端组件详细架构
### DataView.vue - 数据管理页面
**核心功能**:
- Excel文件上传和解析
- 数据预览和验证
- 产品销售数据查看
- 数据统计图表展示
**关键组件**:
```vue
<template>
<div class="data-view">
<el-upload :on-success="handleUploadSuccess" />
<el-table :data="salesData" />
<div ref="chartContainer" class="chart-container" />
</div>
</template>
```
### TrainingView.vue - 模型训练页面
**核心功能**:
- 选择产品和模型类型
- 配置训练超参数
- 实时监控训练进度
- 训练日志展示
**状态管理**:
```javascript
const trainingState = reactive({
isTraining: false,
progress: 0,
currentEpoch: 0,
totalEpochs: 100,
loss: 0
});
```
### PredictionView.vue - 预测分析页面
**核心功能**:
- 选择产品和已训练模型
- 设置预测参数
- 执行预测分析
- 结果可视化展示
**图表配置**:
```javascript
const chartOption = {
title: { text: '销售预测分析' },
xAxis: { data: dates },
yAxis: { name: '销量' },
series: [
{ name: '历史销量', type: 'line', data: historyData },
{ name: '预测销量', type: 'line', data: predictedData }
]
};
```
### HistoryView.vue - 历史查看页面
**核心功能**:
- 分页展示历史预测
- 预测详情查看
- 结果对比分析
- 数据导出功能
**数据处理**:
```javascript
const viewDetails = async (id) => {
const response = await api.get(`/api/prediction/history/${id}`);
currentPrediction.value = response.data;
// 安全属性访问
productName.value = response.data.meta?.product_name || '未知产品';
};
```
### ManagementView.vue - 模型管理页面
**核心功能**:
- 模型列表展示
- 模型性能监控
- 模型删除和备份
- 存储空间管理
## 🗄️ 数据存储架构
### SQLite数据库
**表结构**:
```sql
-- 产品信息表
CREATE TABLE products (
product_id TEXT PRIMARY KEY,
product_name TEXT NOT NULL,
category TEXT,
price REAL
);
-- 销售数据表
CREATE TABLE sales_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_id TEXT,
date DATE,
sales_volume INTEGER,
revenue REAL,
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
-- 预测历史表
CREATE TABLE prediction_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_id TEXT,
product_name TEXT,
model_type TEXT,
model_id TEXT,
start_date DATE,
future_days INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
file_path TEXT,
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
```
### 文件存储结构
```
server/
├── static/
│ ├── csv/ # CSV数据文件
│ ├── plots/ # 生成的图表
│ └── predictions/ # 预测结果JSON
│ ├── compare/ # 对比分析
│ └── {model_type}/ # 按模型分类
├── saved_models/ # 训练好的模型
│ ├── {product_id}_{model_type}_{timestamp}.pt
└── predictions/ # 预测结果
├── history/ # 历史记录JSON
└── {model_type}/ # 按模型分类
└── {product_id}/ # 按产品分类
```
## 🔄 数据流程详解
### 1. 数据上传流程
```
Excel文件 → 后端解析 → 数据验证 → 存储到SQLite → 返回结果
```
### 2. 模型训练流程
```
选择参数 → 创建训练任务 → 异步训练 → 保存模型 → 更新状态
```
### 3. 预测执行流程
```
选择模型 → 加载数据 → 执行预测 → 生成图表 → 保存结果 → 返回JSON
```
### 4. 历史查看流程
```
查询数据库 → 读取JSON文件 → 合并数据 → 构建响应 → 前端展示
```
## 🛠️ 核心工具类
### 后端工具类
```python
# server/utils/data_utils.py
class DataProcessor:
def preprocess_sales_data(self, data: pd.DataFrame) -> pd.DataFrame
def split_train_test(self, data: pd.DataFrame, test_size: float = 0.2)
def normalize_data(self, data: np.ndarray) -> np.ndarray
# server/utils/visualization.py
class ChartGenerator:
def create_prediction_chart(self, history_data, prediction_data)
def save_chart_image(self, chart_data, file_path: str)
```
### 前端工具类
```javascript
// UI/src/utils/chart.js
export const createPredictionChart = (historyData, predictedData) => {
return {
title: { text: '销售预测分析' },
// ... 图表配置
};
};
// UI/src/utils/api.js
export const api = {
get: (url) => axios.get(url),
post: (url, data) => axios.post(url, data),
// ... API封装
};
```
## 🚨 错误处理机制
### 后端错误处理
```python
@app.errorhandler(Exception)
def handle_error(error):
return jsonify({
'status': 'error',
'message': str(error),
'error_type': type(error).__name__
}), 500
```
### 前端错误处理
```javascript
// 全局错误处理
const handleApiError = (error) => {
const message = error.response?.data?.message || '操作失败';
ElMessage.error(message);
console.error('API Error:', error);
};
```
## 🔧 性能优化策略
### 后端优化
- **异步训练**: 使用线程池执行训练任务
- **模型缓存**: 内存中缓存常用模型
- **数据分页**: 大数据集分页返回
- **文件压缩**: JSON结果gzip压缩
### 前端优化
- **懒加载**: 图表数据按需加载
- **虚拟滚动**: 大列表性能优化
- **组件缓存**: keep-alive缓存页面状态
- **防抖节流**: 频繁API调用优化
---
*🏗️ 此文档提供系统架构的详细信息,帮助理解项目的整体设计和实现*