feat(monthly_plan): 增加月度计划数量上限并自动清理

style: 优化月度计划相关日志输出

- 在数据库模块中新增物理删除月度计划的函数 `delete_plans_by_ids`
- 在月度计划管理器中引入 `max_plans_per_month` 配置,用于限制每月计划数量
- 当检测到计划数量超出上限时,自动按创建时间删除最旧的计划以维持数量限制
- 优化了标记计划完成和删除计划时的日志记录,使其输出更详细的计划内容
- 调整了检查现有计划时的日志信息,使其更清晰
This commit is contained in:
tt-P607
2025-08-27 23:13:55 +08:00
parent 35157a1521
commit 29e18c2db7
2 changed files with 59 additions and 3 deletions

View File

@@ -80,16 +80,54 @@ def mark_plans_completed(plan_ids: List[int]):
with get_db_session() as session:
try:
plans_to_mark = session.query(MonthlyPlan).filter(MonthlyPlan.id.in_(plan_ids)).all()
if not plans_to_mark:
logger.info("没有需要标记为完成的月度计划。")
return
plan_details = "\n".join([f" {i+1}. {plan.plan_text}" for i, plan in enumerate(plans_to_mark)])
logger.info(f"以下 {len(plans_to_mark)} 条月度计划将被标记为已完成:\n{plan_details}")
session.query(MonthlyPlan).filter(
MonthlyPlan.id.in_(plan_ids)
).update({"status": "completed"}, synchronize_session=False)
session.commit()
logger.info(f"成功将 {len(plan_ids)} 条月度计划标记为已完成。")
except Exception as e:
logger.error(f"标记月度计划为完成时发生错误: {e}")
session.rollback()
raise
def delete_plans_by_ids(plan_ids: List[int]):
"""
根据ID列表从数据库中物理删除月度计划。
:param plan_ids: 需要删除的计划ID列表。
"""
if not plan_ids:
return
with get_db_session() as session:
try:
# 先查询要删除的计划,用于日志记录
plans_to_delete = session.query(MonthlyPlan).filter(MonthlyPlan.id.in_(plan_ids)).all()
if not plans_to_delete:
logger.info("没有找到需要删除的月度计划。")
return
plan_details = "\n".join([f" {i+1}. {plan.plan_text}" for i, plan in enumerate(plans_to_delete)])
logger.info(f"检测到月度计划超额,将删除以下 {len(plans_to_delete)} 条计划:\n{plan_details}")
# 执行删除
session.query(MonthlyPlan).filter(
MonthlyPlan.id.in_(plan_ids)
).delete(synchronize_session=False)
session.commit()
except Exception as e:
logger.error(f"删除月度计划时发生错误: {e}")
session.rollback()
raise
def soft_delete_plans(plan_ids: List[int]):
"""
将指定ID的计划标记为软删除兼容旧接口