fix: 创建强制修复脚本,解决file_path为null的问题
问题定位:API返回的file_path字段为null,导致前端没有显示下载按钮。 解决方案: 1. 新增 force_rebuild.py 强制修复脚本: - 删除旧的配置表和历史表 - 重新创建表结构(确保file_path字段正确) - 验证表结构是否完整 - 显示file_path字段的类型 2. 新增 问题已定位.md 文档: - 详细的问题分析 - 5个修复步骤 - 4种验证方法 - 手动测试SQL语句 - 需要提供的信息清单 使用步骤: 1. 运行 python force_rebuild.py 2. 重启服务 python app.py 3. 重新创建配置 4. 生成日报 5. 查看历史记录(应该有下载按钮) 注意:修复会删除所有配置和历史记录,需要重新创建配置。 Coze-Commit-Type: user Coze-User-ID: 3722323274763196 Coze-Conversation-ID: 9894087
This commit is contained in:
BIN
assets/image_20260709131944679.png
Normal file
BIN
assets/image_20260709131944679.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
114
force_rebuild.py
Normal file
114
force_rebuild.py
Normal file
@@ -0,0 +1,114 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
强制修复脚本:删除并重建表,确保file_path字段正确
|
||||
"""
|
||||
|
||||
import sys
|
||||
from lib.db import get_connection
|
||||
|
||||
def force_rebuild():
|
||||
"""强制重建表"""
|
||||
print("="*60)
|
||||
print("强制修复数据库表")
|
||||
print("="*60)
|
||||
|
||||
conn = None
|
||||
try:
|
||||
conn = get_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# 1. 删除旧表
|
||||
print("\n1. 删除旧表...")
|
||||
cursor.execute("DROP TABLE IF EXISTS t_daily_report_history")
|
||||
cursor.execute("DROP TABLE IF EXISTS t_daily_report_config")
|
||||
conn.commit()
|
||||
print(" ✓ 旧表已删除")
|
||||
|
||||
# 2. 重建配置表
|
||||
print("\n2. 重建配置表...")
|
||||
create_config_table = """
|
||||
CREATE TABLE t_daily_report_config (
|
||||
id BIGINT NOT NULL COMMENT '配置ID',
|
||||
config_name VARCHAR(100) NOT NULL COMMENT '配置名称',
|
||||
split_type VARCHAR(20) NOT NULL COMMENT '拆分方式',
|
||||
split_value VARCHAR(100) NOT NULL COMMENT '拆分值',
|
||||
split_name VARCHAR(200) NULL COMMENT '拆分显示名称',
|
||||
selected_fields VARCHAR(3000) NOT NULL COMMENT '选择的字段列表',
|
||||
sum_fields VARCHAR(3000) NULL COMMENT '求和字段列表',
|
||||
is_active TINYINT NULL COMMENT '是否启用',
|
||||
sort_order INT NULL COMMENT '排序顺序',
|
||||
create_time DATETIME NULL COMMENT '创建时间',
|
||||
update_time DATETIME NULL COMMENT '更新时间'
|
||||
)
|
||||
UNIQUE KEY(id)
|
||||
DISTRIBUTED BY HASH(id) BUCKETS 1
|
||||
PROPERTIES("replication_num" = "1")
|
||||
"""
|
||||
cursor.execute(create_config_table)
|
||||
conn.commit()
|
||||
print(" ✓ 配置表已创建")
|
||||
|
||||
# 3. 重建历史表
|
||||
print("\n3. 重建历史表...")
|
||||
create_history_table = """
|
||||
CREATE TABLE t_daily_report_history (
|
||||
id BIGINT NOT NULL COMMENT '历史ID',
|
||||
report_date VARCHAR(20) NULL COMMENT '报表日期',
|
||||
start_time VARCHAR(50) NULL COMMENT '开始时间',
|
||||
end_time VARCHAR(50) NULL COMMENT '结束时间',
|
||||
split_type VARCHAR(20) NULL COMMENT '拆分方式',
|
||||
split_value VARCHAR(100) NULL COMMENT '拆分值',
|
||||
split_name VARCHAR(200) NULL COMMENT '拆分显示名称',
|
||||
config_id BIGINT NULL COMMENT '配置ID',
|
||||
total_orders INT NULL COMMENT '订单总数',
|
||||
total_amount DECIMAL(10,2) NULL COMMENT '总金额',
|
||||
sum_results VARCHAR(2000) NULL COMMENT '求和结果',
|
||||
file_path VARCHAR(500) NULL COMMENT '文件路径',
|
||||
status TINYINT NULL COMMENT '状态',
|
||||
create_time DATETIME NULL COMMENT '创建时间'
|
||||
)
|
||||
UNIQUE KEY(id)
|
||||
DISTRIBUTED BY HASH(id) BUCKETS 1
|
||||
PROPERTIES("replication_num" = "1")
|
||||
"""
|
||||
cursor.execute(create_history_table)
|
||||
conn.commit()
|
||||
print(" ✓ 历史表已创建")
|
||||
|
||||
# 4. 验证表结构
|
||||
print("\n4. 验证表结构...")
|
||||
cursor.execute("DESCRIBE t_daily_report_history")
|
||||
columns = cursor.fetchall()
|
||||
print(" 历史表字段:")
|
||||
for col in columns:
|
||||
print(f" - {col[0]}: {col[1]}")
|
||||
|
||||
# 检查file_path字段
|
||||
file_path_col = [c for c in columns if c[0] == 'file_path']
|
||||
if file_path_col:
|
||||
print(f"\n ✓ file_path 字段存在: {file_path_col[0][1]}")
|
||||
else:
|
||||
print("\n ❌ file_path 字段不存在!")
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("✓ 修复完成!")
|
||||
print("="*60)
|
||||
print("\n下一步:")
|
||||
print("1. 重启服务: python app.py")
|
||||
print("2. 创建配置")
|
||||
print("3. 生成日报")
|
||||
print("4. 查看历史记录(应该有下载按钮)")
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n❌ 修复失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
if conn:
|
||||
conn.close()
|
||||
|
||||
input("\n按回车键退出...")
|
||||
|
||||
if __name__ == '__main__':
|
||||
force_rebuild()
|
||||
145
问题已定位.md
Normal file
145
问题已定位.md
Normal file
@@ -0,0 +1,145 @@
|
||||
# 问题已定位:file_path 为 null
|
||||
|
||||
## 问题原因
|
||||
|
||||
从API返回的数据可以看到:
|
||||
```json
|
||||
{
|
||||
"id": 1752038179055,
|
||||
"status": 1,
|
||||
"file_path": null, // ❌ 这里是 null!
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
**file_path 是 null**,所以前端没有显示下载按钮。
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 步骤1:运行强制修复脚本
|
||||
|
||||
```bash
|
||||
python force_rebuild.py
|
||||
```
|
||||
|
||||
这个脚本会:
|
||||
1. 删除旧的配置表和历史表
|
||||
2. 重新创建表结构
|
||||
3. 验证 file_path 字段是否存在
|
||||
|
||||
### 步骤2:重启服务
|
||||
|
||||
```bash
|
||||
python app.py
|
||||
```
|
||||
|
||||
### 步骤3:重新创建配置
|
||||
|
||||
由于旧表被删除,需要重新创建配置:
|
||||
1. 访问 http://localhost:5000
|
||||
2. 切换到"配置管理"标签
|
||||
3. 创建新的配置
|
||||
|
||||
### 步骤4:生成日报
|
||||
|
||||
1. 切换到"日报生成"标签
|
||||
2. 选择配置和时间范围
|
||||
3. 点击"生成日报"
|
||||
4. **查看服务器控制台的日志**
|
||||
|
||||
应该看到:
|
||||
```
|
||||
[日报生成] Excel文件已生成: /reports/daily_report_xxx.xlsx
|
||||
[日报生成] 准备保存历史记录,file_path=/reports/daily_report_xxx.xlsx
|
||||
[保存历史] 准备保存历史记录
|
||||
ID: xxx
|
||||
file_path: '/reports/daily_report_xxx.xlsx'
|
||||
status: 1
|
||||
[保存历史] 执行SQL插入...
|
||||
[保存历史] 插入完成,返回ID: xxx
|
||||
```
|
||||
|
||||
### 步骤5:验证修复
|
||||
|
||||
#### 方法1:查看API返回
|
||||
|
||||
在浏览器中访问:
|
||||
```
|
||||
http://localhost:5000/api/report/history
|
||||
```
|
||||
|
||||
检查 `file_path` 字段是否有值(不是 null)。
|
||||
|
||||
#### 方法2:查看前端页面
|
||||
|
||||
1. 切换到"历史记录"标签
|
||||
2. 应该能看到下载按钮
|
||||
3. 点击"下载"按钮应该能下载Excel文件
|
||||
|
||||
## 如果还是不行
|
||||
|
||||
### 检查1:查看服务器日志
|
||||
|
||||
在运行 `python app.py` 的窗口中,查看完整的日志输出。
|
||||
|
||||
**请复制完整的日志**,特别是:
|
||||
- `[日报生成]` 开头的日志
|
||||
- `[保存历史]` 开头的日志
|
||||
|
||||
### 检查2:检查文件是否存在
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
dir public\reports\*.xlsx
|
||||
```
|
||||
|
||||
确认 Excel 文件是否真的生成了。
|
||||
|
||||
### 检查3:手动测试插入
|
||||
|
||||
如果有MySQL客户端,可以手动测试插入:
|
||||
|
||||
```sql
|
||||
-- 连接到数据库
|
||||
mysql -h haoslm2.xicp.net -P 10216 -u root -p
|
||||
|
||||
-- 手动插入测试数据
|
||||
INSERT INTO t_daily_report_history
|
||||
(id, report_date, start_time, end_time, split_type, split_value, split_name,
|
||||
config_id, total_orders, total_amount, sum_results, file_path, status, create_time)
|
||||
VALUES
|
||||
(9999999999, '2025-01-08', '2025-01-07 08:00:00', '2025-01-08 08:00:00',
|
||||
'company_id', '123', '测试企业', 1234567890, 10, 100.00, '{}',
|
||||
'/reports/test.xlsx', 1, NOW());
|
||||
|
||||
-- 查询是否成功
|
||||
SELECT id, file_path, status FROM t_daily_report_history WHERE id = 9999999999;
|
||||
|
||||
-- 如果file_path有值,说明表结构没问题
|
||||
-- 如果file_path是null,说明数据库有问题
|
||||
```
|
||||
|
||||
### 检查4:检查Doris数据库特性
|
||||
|
||||
由于使用的是 Apache Doris 数据库,可能有特殊的存储行为。
|
||||
|
||||
检查表是否真的创建成功:
|
||||
```sql
|
||||
DESCRIBE t_daily_report_history;
|
||||
```
|
||||
|
||||
确认 `file_path` 字段的类型是 `VARCHAR(500)`。
|
||||
|
||||
## 请提供以下信息
|
||||
|
||||
如果问题仍然存在,请提供:
|
||||
|
||||
1. **force_rebuild.py 的完整输出**
|
||||
2. **服务器控制台的日志**(从生成到查看历史)
|
||||
3. **API返回的JSON数据**(刷新后重新获取)
|
||||
4. **public/reports/ 目录的文件列表**
|
||||
5. **截图**:历史记录页面的截图
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2025-01-08
|
||||
Reference in New Issue
Block a user