refactor(api): 重构数据库访问为SQLAlchemy绑定的session

- 统一移除手动创建的数据库session,统一使用models模块中的db.session
- 修正项目创建接口,增加开始和结束日期的格式验证与处理
- 更新导入项目接口,使用枚举类型校验项目类型并优化异常处理
- 更新统计接口,避免多次查询假期数据,优化日期字符串处理
- 删除回滚前多余的session关闭调用,改为使用db.session.rollback()
- app.py中重构数据库初始化:统一配置SQLAlchemy,动态创建数据库路径和表
- 项目模型新增开始日期和结束日期字段支持
- 添加导入批次历史记录模型支持
- 优化工具函数中日期类型提示,移除无用导入
- 更新requirements.txt依赖版本回退,确保兼容性
- 前端菜单添加导入历史导航入口,实现页面访问路由绑定
This commit is contained in:
2025-09-04 18:12:24 +08:00
parent ef9432f6da
commit 8938ce2708
29 changed files with 3490 additions and 150 deletions

View File

@@ -1,31 +1,22 @@
from flask import Blueprint, request, jsonify
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine, and_
from backend.models.models import TimeRecord, Project, Holiday
from backend.models.utils import *
from sqlalchemy import and_
from models.models import db, TimeRecord, Project, Holiday
from models.utils import *
from datetime import datetime, date
import json
timerecords_bp = Blueprint('timerecords', __name__)
def get_db_session():
"""获取数据库会话"""
engine = create_engine('sqlite:///data/timetrack.db')
Session = sessionmaker(bind=engine)
return Session()
@timerecords_bp.route('/api/timerecords', methods=['GET'])
def get_timerecords():
"""获取工时记录列表"""
try:
session = get_db_session()
# 获取查询参数
start_date = request.args.get('start_date')
end_date = request.args.get('end_date')
project_id = request.args.get('project_id')
query = session.query(TimeRecord)
query = db.session.query(TimeRecord).options(db.joinedload(TimeRecord.project))
# 应用筛选条件
if start_date:
@@ -45,7 +36,6 @@ def get_timerecords():
record_dict['day_of_week'] = get_day_of_week_chinese(record.date)
result.append(record_dict)
session.close()
return jsonify({'success': True, 'data': result})
except Exception as e:
@@ -56,7 +46,6 @@ def create_timerecord():
"""创建工时记录"""
try:
data = request.json
session = get_db_session()
# 验证必填字段
if not data.get('date'):
@@ -65,7 +54,7 @@ def create_timerecord():
record_date = datetime.strptime(data['date'], '%Y-%m-%d').date()
# 检查是否为休息日
holidays = session.query(Holiday).all()
holidays = db.session.query(Holiday).all()
holiday_info = is_holiday(record_date, holidays)
# 计算工时
@@ -93,18 +82,17 @@ def create_timerecord():
week_info=week_info
)
session.add(record)
session.commit()
db.session.add(record)
db.session.commit()
result = record.to_dict()
if record.date:
result['day_of_week'] = get_day_of_week_chinese(record.date)
session.close()
return jsonify({'success': True, 'data': result})
except Exception as e:
db.session.rollback()
return jsonify({'success': False, 'error': str(e)}), 500
@timerecords_bp.route('/api/timerecords/<int:record_id>', methods=['PUT'])
@@ -112,11 +100,9 @@ def update_timerecord(record_id):
"""更新工时记录"""
try:
data = request.json
session = get_db_session()
record = session.query(TimeRecord).get(record_id)
record = db.session.query(TimeRecord).get(record_id)
if not record:
session.close()
return jsonify({'success': False, 'error': '记录不存在'}), 404
# 更新字段
@@ -144,47 +130,41 @@ def update_timerecord(record_id):
# 更新工作日状态
record.is_working_on_holiday = record.is_holiday and record.hours not in ['-', '0:00']
session.commit()
db.session.commit()
result = record.to_dict()
if record.date:
result['day_of_week'] = get_day_of_week_chinese(record.date)
session.close()
return jsonify({'success': True, 'data': result})
except Exception as e:
db.session.rollback()
return jsonify({'success': False, 'error': str(e)}), 500
@timerecords_bp.route('/api/timerecords/<int:record_id>', methods=['DELETE'])
def delete_timerecord(record_id):
"""删除工时记录"""
try:
session = get_db_session()
record = session.query(TimeRecord).get(record_id)
record = db.session.query(TimeRecord).get(record_id)
if not record:
session.close()
return jsonify({'success': False, 'error': '记录不存在'}), 404
session.delete(record)
session.commit()
session.close()
db.session.delete(record)
db.session.commit()
return jsonify({'success': True, 'message': '记录已删除'})
except Exception as e:
db.session.rollback()
return jsonify({'success': False, 'error': str(e)}), 500
@timerecords_bp.route('/api/timerecords/check_holiday/<string:date_str>', methods=['GET'])
def check_holiday(date_str):
"""检查指定日期是否为休息日"""
try:
session = get_db_session()
check_date = datetime.strptime(date_str, '%Y-%m-%d').date()
holidays = session.query(Holiday).all()
holidays = db.session.query(Holiday).all()
holiday_info = is_holiday(check_date, holidays)
result = {
@@ -196,7 +176,6 @@ def check_holiday(date_str):
'week_info': get_week_info(check_date)
}
session.close()
return jsonify({'success': True, 'data': result})
except Exception as e: