第一次提交
This commit is contained in:
181
app/utils/background_tasks.py
Normal file
181
app/utils/background_tasks.py
Normal file
@@ -0,0 +1,181 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
后台任务模块
|
||||
用于执行定时任务,如更新过期卡密状态
|
||||
"""
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from app import db
|
||||
from app.models import License
|
||||
from flask import current_app
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def update_expired_licenses():
|
||||
"""
|
||||
更新过期卡密状态
|
||||
将所有已激活但已过期的卡密状态更新为2(已过期)
|
||||
"""
|
||||
try:
|
||||
logger.info("开始检查过期卡密...")
|
||||
|
||||
# 查找所有已激活但已过期的卡密
|
||||
# 条件:status=1(已激活)且expire_time < 当前时间
|
||||
expired_licenses = License.query.filter(
|
||||
License.status == 1,
|
||||
License.expire_time.isnot(None),
|
||||
License.expire_time < datetime.utcnow()
|
||||
).all()
|
||||
|
||||
if not expired_licenses:
|
||||
logger.info("没有发现过期卡密")
|
||||
return {
|
||||
'success': True,
|
||||
'message': '没有发现过期卡密',
|
||||
'updated_count': 0
|
||||
}
|
||||
|
||||
# 更新过期卡密状态
|
||||
updated_count = 0
|
||||
for license_obj in expired_licenses:
|
||||
old_status = license_obj.status
|
||||
license_obj.status = 2 # 更新为已过期
|
||||
updated_count += 1
|
||||
logger.info(
|
||||
f"更新卡密 {license_obj.license_key} 状态: {old_status} -> {license_obj.status}"
|
||||
)
|
||||
|
||||
# 提交事务
|
||||
db.session.commit()
|
||||
|
||||
logger.info(f"成功更新 {updated_count} 个过期卡密状态")
|
||||
|
||||
return {
|
||||
'success': True,
|
||||
'message': f'成功更新 {updated_count} 个过期卡密状态',
|
||||
'updated_count': updated_count
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
# 回滚事务
|
||||
db.session.rollback()
|
||||
logger.error(f"更新过期卡密失败: {str(e)}", exc_info=True)
|
||||
return {
|
||||
'success': False,
|
||||
'message': f'更新过期卡密失败: {str(e)}',
|
||||
'updated_count': 0
|
||||
}
|
||||
|
||||
|
||||
def check_licenses_batch():
|
||||
"""
|
||||
批量检查所有卡密状态
|
||||
包括:
|
||||
1. 已激活但过期的 -> 更新为已过期
|
||||
2. 已过期但状态未更新的 -> 更新状态
|
||||
"""
|
||||
try:
|
||||
logger.info("开始批量检查卡密状态...")
|
||||
|
||||
# 检查1:已激活但过期的卡密
|
||||
active_but_expired = License.query.filter(
|
||||
License.status == 1, # 已激活
|
||||
License.expire_time.isnot(None),
|
||||
License.expire_time < datetime.utcnow()
|
||||
).count()
|
||||
|
||||
# 检查2:已过期但状态正确的卡密
|
||||
expired_and_marked = License.query.filter(
|
||||
License.status == 2, # 已过期
|
||||
License.expire_time.isnot(None),
|
||||
License.expire_time < datetime.utcnow()
|
||||
).count()
|
||||
|
||||
# 检查3:已激活且未过期的卡密
|
||||
active_and_valid = License.query.filter(
|
||||
License.status == 1, # 已激活
|
||||
db.or_(
|
||||
License.expire_time.is_(None), # 永久卡
|
||||
License.expire_time >= datetime.utcnow() # 未过期
|
||||
)
|
||||
).count()
|
||||
|
||||
# 检查4:未激活的卡密
|
||||
inactive = License.query.filter(
|
||||
License.status == 0 # 未激活
|
||||
).count()
|
||||
|
||||
# 检查5:已禁用的卡密
|
||||
disabled = License.query.filter(
|
||||
License.status == 3 # 已禁用
|
||||
).count()
|
||||
|
||||
logger.info(
|
||||
f"卡密状态统计:\n"
|
||||
f" 已激活但过期: {active_but_expired}\n"
|
||||
f" 已过期且已标记: {expired_and_marked}\n"
|
||||
f" 已激活且有效: {active_and_valid}\n"
|
||||
f" 未激活: {inactive}\n"
|
||||
f" 已禁用: {disabled}"
|
||||
)
|
||||
|
||||
# 执行更新
|
||||
update_result = update_expired_licenses()
|
||||
|
||||
return {
|
||||
'success': True,
|
||||
'message': '批量检查完成',
|
||||
'statistics': {
|
||||
'active_but_expired': active_but_expired,
|
||||
'expired_and_marked': expired_and_marked,
|
||||
'active_and_valid': active_and_valid,
|
||||
'inactive': inactive,
|
||||
'disabled': disabled
|
||||
},
|
||||
'update_result': update_result
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"批量检查卡密失败: {str(e)}", exc_info=True)
|
||||
return {
|
||||
'success': False,
|
||||
'message': f'批量检查卡密失败: {str(e)}'
|
||||
}
|
||||
|
||||
|
||||
def cleanup_old_license_logs():
|
||||
"""
|
||||
清理旧的卡密验证日志
|
||||
保留最近30天的记录
|
||||
"""
|
||||
try:
|
||||
from app.models import AuditLog
|
||||
|
||||
# 保留最近30天的记录
|
||||
cutoff_date = datetime.utcnow() - timedelta(days=30)
|
||||
|
||||
# 删除过期的审计日志
|
||||
deleted_count = AuditLog.query.filter(
|
||||
AuditLog.create_time < cutoff_date
|
||||
).delete(synchronize_session=False)
|
||||
|
||||
db.session.commit()
|
||||
|
||||
logger.info(f"卡密日志清理完成,删除了 {deleted_count} 条记录")
|
||||
|
||||
return {
|
||||
'success': True,
|
||||
'message': f'日志清理完成,删除了 {deleted_count} 条记录',
|
||||
'deleted_count': deleted_count,
|
||||
'cutoff_date': cutoff_date
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
logger.error(f"清理日志失败: {str(e)}", exc_info=True)
|
||||
return {
|
||||
'success': False,
|
||||
'message': f'清理日志失败: {str(e)}'
|
||||
}
|
||||
Reference in New Issue
Block a user