细节修改
This commit is contained in:
8
app.py
8
app.py
@@ -4,7 +4,7 @@ Flask 主应用
|
|||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from flask import Flask, render_template
|
from flask import Flask, render_template, Response
|
||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
from apscheduler.schedulers.background import BackgroundScheduler
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||||||
import pytz
|
import pytz
|
||||||
@@ -43,6 +43,12 @@ def index():
|
|||||||
return render_template('index.html')
|
return render_template('index.html')
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/favicon.ico')
|
||||||
|
def favicon():
|
||||||
|
"""网站图标(返回空响应避免404)"""
|
||||||
|
return Response(status=204)
|
||||||
|
|
||||||
|
|
||||||
# ==================== 定时任务 ====================
|
# ==================== 定时任务 ====================
|
||||||
|
|
||||||
def scheduled_job():
|
def scheduled_job():
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ def get_connection():
|
|||||||
conn = pymysql.connect(**DB_CONFIG)
|
conn = pymysql.connect(**DB_CONFIG)
|
||||||
yield conn
|
yield conn
|
||||||
except pymysql.Error as e:
|
except pymysql.Error as e:
|
||||||
log_error(f'数据库连接失败: {e}', 'db')
|
log_error(f'数据库连接失败: {e}', 'db', exc_info=True)
|
||||||
raise
|
raise
|
||||||
finally:
|
finally:
|
||||||
try:
|
try:
|
||||||
@@ -46,7 +46,7 @@ def execute_query(sql, params=None):
|
|||||||
result = cursor.fetchall()
|
result = cursor.fetchall()
|
||||||
return result
|
return result
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log_error(f'查询失败: {e}\nSQL: {sql}\nParams: {params}', 'db')
|
log_error(f'查询失败: {e}\nSQL: {sql}\nParams: {params}', 'db', exc_info=True)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ def execute_update(sql, params=None):
|
|||||||
affected = cursor.execute(sql, params)
|
affected = cursor.execute(sql, params)
|
||||||
return cursor.rowcount
|
return cursor.rowcount
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log_error(f'更新失败: {e}\nSQL: {sql}\nParams: {params}', 'db')
|
log_error(f'更新失败: {e}\nSQL: {sql}\nParams: {params}', 'db', exc_info=True)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
@@ -71,5 +71,5 @@ def execute_insert(sql, params=None):
|
|||||||
last_id = cursor.lastrowid
|
last_id = cursor.lastrowid
|
||||||
return last_id
|
return last_id
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log_error(f'插入失败: {e}\nSQL: {sql}\nParams: {params}', 'db')
|
log_error(f'插入失败: {e}\nSQL: {sql}\nParams: {params}', 'db', exc_info=True)
|
||||||
raise
|
raise
|
||||||
@@ -34,6 +34,11 @@ def _add_column_if_not_exists(table_name, column_def_sql, column_name):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def _set_table_comment(table_name, comment):
|
||||||
|
"""设置表备注(Doris暂不支持通过SQL修改表注释,预留函数)"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def init_database_tables():
|
def init_database_tables():
|
||||||
"""初始化所有数据库表(应用启动时自动调用)"""
|
"""初始化所有数据库表(应用启动时自动调用)"""
|
||||||
try:
|
try:
|
||||||
@@ -64,6 +69,7 @@ def init_database_tables():
|
|||||||
PROPERTIES("replication_num" = "1")
|
PROPERTIES("replication_num" = "1")
|
||||||
"""
|
"""
|
||||||
execute_update(create_config_table)
|
execute_update(create_config_table)
|
||||||
|
_set_table_comment('t_daily_report_config', '日报配置表')
|
||||||
log_info("[数据库] t_daily_report_config 表已就绪", 'db_init')
|
log_info("[数据库] t_daily_report_config 表已就绪", 'db_init')
|
||||||
|
|
||||||
# 创建历史表
|
# 创建历史表
|
||||||
@@ -90,6 +96,7 @@ def init_database_tables():
|
|||||||
PROPERTIES("replication_num" = "1")
|
PROPERTIES("replication_num" = "1")
|
||||||
"""
|
"""
|
||||||
execute_update(create_history_table)
|
execute_update(create_history_table)
|
||||||
|
_set_table_comment('t_daily_report_history', '日报生成历史记录表')
|
||||||
log_info("[数据库] t_daily_report_history 表已就绪", 'db_init')
|
log_info("[数据库] t_daily_report_history 表已就绪", 'db_init')
|
||||||
|
|
||||||
# 为已存在的表添加 config_name 字段(如果不存在)
|
# 为已存在的表添加 config_name 字段(如果不存在)
|
||||||
@@ -124,6 +131,7 @@ def init_database_tables():
|
|||||||
PROPERTIES("replication_num" = "1")
|
PROPERTIES("replication_num" = "1")
|
||||||
"""
|
"""
|
||||||
execute_update(create_sum_data_table)
|
execute_update(create_sum_data_table)
|
||||||
|
_set_table_comment('t_daily_report_sum_data', '日报求和数据采集表')
|
||||||
log_info("[数据库] t_daily_report_sum_data 表已就绪", 'db_init')
|
log_info("[数据库] t_daily_report_sum_data 表已就绪", 'db_init')
|
||||||
|
|
||||||
# 给配置表增加 show_monthly_total 字段
|
# 给配置表增加 show_monthly_total 字段
|
||||||
@@ -176,5 +184,5 @@ def init_database_tables():
|
|||||||
log_info("[数据库] 初始化完成", 'db_init')
|
log_info("[数据库] 初始化完成", 'db_init')
|
||||||
return True
|
return True
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log_error(f"[数据库] 初始化失败: {e}", 'db_init')
|
log_error(f"[数据库] 初始化失败: {e}", 'db_init', exc_info=True)
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import logging
|
import logging
|
||||||
from logging.handlers import RotatingFileHandler
|
from logging.handlers import RotatingFileHandler
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@@ -68,11 +69,21 @@ def log_info(message, module='app'):
|
|||||||
get_logger(module).info(message)
|
get_logger(module).info(message)
|
||||||
|
|
||||||
|
|
||||||
def log_error(message, module='app'):
|
def log_error(message, module='app', exc_info=True):
|
||||||
"""记录错误日志"""
|
"""记录错误日志
|
||||||
get_logger(module).error(message)
|
|
||||||
import traceback
|
Args:
|
||||||
get_logger(module).error(traceback.format_exc())
|
message: 错误信息
|
||||||
|
module: 模块名
|
||||||
|
exc_info: 是否包含异常堆栈(默认True,在except块中调用时自动打印堆栈)
|
||||||
|
"""
|
||||||
|
logger = get_logger(module)
|
||||||
|
logger.error(message)
|
||||||
|
if exc_info:
|
||||||
|
import traceback
|
||||||
|
tb = traceback.format_exc()
|
||||||
|
if 'NoneType: None' not in tb:
|
||||||
|
logger.error(tb)
|
||||||
|
|
||||||
|
|
||||||
def log_warning(message, module='app'):
|
def log_warning(message, module='app'):
|
||||||
|
|||||||
@@ -591,7 +591,7 @@ def generate_excel(orders, selected_fields, sum_fields, sum_results,
|
|||||||
reports_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'public', 'reports')
|
reports_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'public', 'reports')
|
||||||
os.makedirs(reports_dir, exist_ok=True)
|
os.makedirs(reports_dir, exist_ok=True)
|
||||||
|
|
||||||
# 生成文件名 - 格式:序号_配置名称_几月几日消费记录.xlsx
|
# 生成文件名 - 格式:配置名称_几月几日消费记录.xlsx
|
||||||
# 从 start_time 提取日期(报表数据对应的是开始时间那天的数据)
|
# 从 start_time 提取日期(报表数据对应的是开始时间那天的数据)
|
||||||
try:
|
try:
|
||||||
start_dt = datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S')
|
start_dt = datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S')
|
||||||
@@ -602,12 +602,7 @@ def generate_excel(orders, selected_fields, sum_fields, sum_results,
|
|||||||
# 如果有补单,添加标记
|
# 如果有补单,添加标记
|
||||||
supplement_suffix = '_有补单' if has_supplement else ''
|
supplement_suffix = '_有补单' if has_supplement else ''
|
||||||
|
|
||||||
# 顺序号前缀(两位数字,不足补零)
|
filename = f'{config_name}_{date_str}消费记录{supplement_suffix}.xlsx'
|
||||||
sort_prefix = ''
|
|
||||||
if sort_order:
|
|
||||||
sort_prefix = f'{sort_order:02d}_'
|
|
||||||
|
|
||||||
filename = f'{sort_prefix}{config_name}_{date_str}消费记录{supplement_suffix}.xlsx'
|
|
||||||
file_path = os.path.join(reports_dir, filename)
|
file_path = os.path.join(reports_dir, filename)
|
||||||
|
|
||||||
# 创建工作簿
|
# 创建工作簿
|
||||||
|
|||||||
@@ -176,7 +176,11 @@
|
|||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h2 id="modal-title">创建配置</h2>
|
<h2 id="modal-title">创建配置</h2>
|
||||||
<button class="close-btn" onclick="closeModal()">×</button>
|
<div style="display: flex; align-items: center; gap: 10px;">
|
||||||
|
<button class="btn btn-sm" onclick="closeModal()">取消</button>
|
||||||
|
<button class="btn btn-sm btn-primary" onclick="saveConfig()">保存</button>
|
||||||
|
<button class="close-btn" onclick="closeModal()">×</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<input type="hidden" id="config-id">
|
<input type="hidden" id="config-id">
|
||||||
|
|||||||
Reference in New Issue
Block a user