# 订单日报系统 数据库变更与部署文档

## 一、数据库变更说明

### 1.1 新增表：t_daily_report_global_config

**表结构**：

```sql
CREATE TABLE IF NOT EXISTS t_daily_report_global_config (
    id BIGINT NOT NULL DEFAULT 1 COMMENT '主键（固定为1）',
    sum_data_fields VARCHAR(1000) NULL COMMENT '求和数据采集和显示字段列表(JSON格式)',
    create_time DATETIME NULL COMMENT '创建时间',
    update_time DATETIME NULL COMMENT '更新时间'
)
UNIQUE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES("replication_num" = "1")
```

**字段说明**：

| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | BIGINT | 主键，固定为1（全局配置只有一条记录） |
| sum_data_fields | VARCHAR(1000) | 求和数据采集和显示字段列表，JSON格式 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |

**数据示例**：

```sql
INSERT INTO t_daily_report_global_config (id, sum_data_fields, create_time, update_time) 
VALUES (1, '["sharp_electricity","peak_electricity","flat_electricity","valley_electricity"]', NOW(), NOW());
```

### 1.2 自动初始化

系统启动时会自动执行以下操作：

1. 检查表是否存在，不存在则创建
2. 检查ID=1的记录是否存在，不存在则初始化一条空记录

**相关代码**：[db_init.py](file:///d:/py/code/ylt_power_diy/ylt_diy/lib/db_init.py#L186-L211)

## 二、部署步骤

### 2.1 开发环境部署

**前置条件**：

- Python 3.12+
- MySQL/Apache Doris 数据库
- Git

**步骤**：

1. **克隆代码**

```bash
git clone <仓库地址>
cd ylt_diy
```

2. **安装依赖**

```bash
pip install -r requirements.txt
```

3. **配置环境变量**（可选）

```bash
# 设置数据库连接（默认值见下文）
export DB_HOST=haoslm2.xicp.net
export DB_PORT=10216
export DB_USER=root
export DB_PASSWORD=your_password
export DB_DATABASE=ylt_power_diy
export DEPLOY_RUN_PORT=5000
```

4. **启动开发服务器**

```bash
python app.py
```

5. **访问系统**

打开浏览器访问：http://localhost:5000

### 2.2 生产环境部署

**前置条件**：

- Linux 服务器（推荐 CentOS 7+）
- Python 3.12+
- MySQL/Apache Doris 数据库
- Nginx（可选，用于反向代理）

**步骤**：

1. **克隆代码**

```bash
git clone <仓库地址>
cd ylt_diy
```

2. **安装依赖**

```bash
pip install -r requirements.txt
```

3. **配置环境变量**

创建 `.env` 文件：

```bash
DEPLOY_RUN_PORT=5000
DB_HOST=haoslm2.xicp.net
DB_PORT=10216
DB_USER=root
DB_PASSWORD=your_password
DB_DATABASE=ylt_power_diy
```

4. **创建服务配置**

创建 `/etc/systemd/system/ylt_daily_report.service`：

```ini
[Unit]
Description=订单日报系统
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/path/to/ylt_diy
Environment="DEPLOY_RUN_PORT=5000"
Environment="DB_HOST=haoslm2.xicp.net"
Environment="DB_PORT=10216"
Environment="DB_USER=root"
Environment="DB_PASSWORD=your_password"
Environment="DB_DATABASE=ylt_power_diy"
ExecStart=/usr/bin/python3 app.py
Restart=always

[Install]
WantedBy=multi-user.target
```

5. **启动服务**

```bash
systemctl daemon-reload
systemctl start ylt_daily_report
systemctl enable ylt_daily_report
```

6. **配置 Nginx 反向代理**（可选）

创建 `/etc/nginx/conf.d/ylt_daily_report.conf`：

```nginx
server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /public/ {
        root /path/to/ylt_diy;
        expires 30d;
    }
}
```

7. **重启 Nginx**

```bash
nginx -t
systemctl restart nginx
```

### 2.3 数据库配置

**默认配置**：

| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| DB_HOST | haoslm2.xicp.net | 数据库主机地址 |
| DB_PORT | 10216 | 数据库端口 |
| DB_USER | root | 数据库用户名 |
| DB_PASSWORD | （空） | 数据库密码 |
| DB_DATABASE | ylt_power_diy | 数据库名 |

**连接方式**：

系统使用 PyMySQL 连接数据库，支持 MySQL 和 Apache Doris（MySQL 协议兼容）。

**相关代码**：[db.py](file:///d:/py/code/ylt_power_diy/ylt_diy/lib/db.py)

## 三、版本升级

### 3.1 升级步骤

1. **拉取最新代码**

```bash
cd /path/to/ylt_diy
git pull
```

2. **安装新依赖**（如果有）

```bash
pip install -r requirements.txt
```

3. **重启服务**

```bash
systemctl restart ylt_daily_report
```

### 3.2 数据库自动迁移

系统启动时会自动执行数据库初始化，包括：

1. 创建缺失的表
2. 添加缺失的字段
3. 初始化全局配置记录

**注意**：如果出现数据库迁移失败，请检查数据库连接和权限。

## 四、备份与恢复

### 4.1 数据库备份

```bash
# 使用 mysqldump 备份
mysqldump -h haoslm2.xicp.net -P 10216 -u root -p ylt_power_diy > backup.sql

# 使用 Doris 备份命令（如果使用 Doris）
curl -X POST http://doris-be:8030/api/bootstrap -d '{"type":"backup","backup_name":"daily_report_backup","storage":"hdfs://your-hdfs/path"}'
```

### 4.2 数据库恢复

```bash
# 使用 mysql 命令恢复
mysql -h haoslm2.xicp.net -P 10216 -u root -p ylt_power_diy < backup.sql
```

### 4.3 文件备份

```bash
# 备份报表文件
tar -czvf reports_backup.tar.gz public/reports/

# 备份配置文件
tar -czvf config_backup.tar.gz lib/
```

## 五、常见部署问题

### 5.1 数据库连接失败

**问题**：系统启动时提示数据库连接失败

**解决**：

- 检查数据库主机和端口是否正确
- 确认数据库服务正常运行
- 检查数据库用户名和密码
- 确认网络连通性（ping 数据库主机）

### 5.2 端口被占用

**问题**：启动时提示端口 5000 被占用

**解决**：

```bash
# 查看占用进程
lsof -i :5000

# 杀死占用进程
kill -9 <PID>

# 或修改端口
export DEPLOY_RUN_PORT=5001
```

### 5.3 静态文件加载失败

**问题**：页面样式和脚本无法加载

**解决**：

- 检查 `public/static/` 目录是否存在
- 确认 Flask 应用的 `static_folder` 配置正确
- 清除浏览器缓存（Ctrl + Shift + R）

### 5.4 定时任务不执行

**问题**：每天 08:01 的定时任务没有执行

**解决**：

- 确认服务正常运行（`systemctl status ylt_daily_report`）
- 检查日志文件（`/app/work/logs/bypass/`）
- 确认系统时间正确
- 检查配置是否启用（`is_active = 1`）

### 5.5 内存不足

**问题**：服务运行一段时间后崩溃

**解决**：

- 增加服务器内存
- 优化查询语句，减少内存使用
- 配置定时清理任务

## 六、日志管理

### 6.1 日志位置

- 应用日志：`/app/work/logs/bypass/`
- 系统日志：`/var/log/syslog`（Linux）

### 6.2 日志级别

- INFO：普通信息
- WARNING：警告信息
- ERROR：错误信息

### 6.3 查看日志

```bash
# 查看应用日志
tail -f /app/work/logs/bypass/app.log

# 查看系统日志
journalctl -u ylt_daily_report -f
```

## 七、安全建议

### 7.1 数据库安全

- 使用强密码
- 限制数据库访问 IP
- 定期备份数据库

### 7.2 应用安全

- 使用 HTTPS
- 定期更新依赖
- 关闭调试模式（生产环境）
- 配置防火墙

### 7.3 服务器安全

- 禁用 SSH 密码登录（使用密钥）
- 定期更新系统
- 禁用不必要的服务