diff --git a/src/schedule/monthly_plan_manager.py b/src/schedule/monthly_plan_manager.py index 1e25cdf11..bc55544d2 100644 --- a/src/schedule/monthly_plan_manager.py +++ b/src/schedule/monthly_plan_manager.py @@ -77,7 +77,7 @@ class MonthlyPlanManager: if len(plans) > max_plans: logger.warning(f"当前月度计划数量 ({len(plans)}) 超出上限 ({max_plans}),将自动删除多余的计划。") # 按创建时间升序排序(旧的在前),然后删除超出上限的部分(新的) - plans_to_delete = sorted(plans, key=lambda p: p.created_at)[max_plans:] + plans_to_delete = sorted(plans, key=lambda p: p.created_at, reverse=True)[:len(plans)-max_plans] delete_ids = [p.id for p in plans_to_delete] delete_plans_by_ids(delete_ids) # 重新获取计划列表 @@ -138,6 +138,14 @@ class MonthlyPlanManager: finally: self.generation_running = False + def trigger_generate_monthly_plans(self, target_month: Optional[str] = None): + """ + 以非阻塞的方式启动月度计划生成任务。 + 这允许其他模块(如ScheduleManager)触发计划生成,而无需等待其完成。 + """ + logger.info(f"已触发 {target_month or '当前月份'} 的非阻塞月度计划生成任务。") + asyncio.create_task(self.generate_monthly_plans(target_month)) + def _get_previous_month(self, current_month: str) -> str: """获取上个月的月份字符串""" try: diff --git a/src/schedule/schedule_manager.py b/src/schedule/schedule_manager.py index 2834d159a..f8685e161 100644 --- a/src/schedule/schedule_manager.py +++ b/src/schedule/schedule_manager.py @@ -231,17 +231,15 @@ class ScheduleManager: # 如果计划耗尽,则触发补充生成 if not sampled_plans: - logger.info("可用的月度计划已耗尽或不足,尝试进行补充生成...") + logger.info("可用的月度计划已耗尽或不足,触发后台补充生成...") from mmc.src.schedule.monthly_plan_manager import monthly_plan_manager - - success = await monthly_plan_manager.generate_monthly_plans(current_month_str) - if success: - logger.info("补充生成完成,重新抽取月度计划...") - sampled_plans = get_smart_plans_for_daily_schedule( - current_month_str, max_count=3, avoid_days=avoid_days - ) - else: - logger.warning("月度计划补充生成失败。") + + # 以非阻塞方式触发月度计划生成 + monthly_plan_manager.trigger_generate_monthly_plans(current_month_str) + + # 注意:这里不再等待生成结果,因此后续代码不会立即获得新计划。 + # 日程将基于当前可用的信息生成,新计划将在下一次日程生成时可用。 + logger.info("月度计划的后台生成任务已启动,本次日程将不包含新计划。") if sampled_plans: plan_texts = "\n".join([f"- {plan.plan_text}" for plan in sampled_plans])