""" PregoPal - 每三天总结插件 ========================= 分析近三天饮食记录,发现营养缺失趋势,改进家庭菜单。 """ import datetime from pathlib import Path from plugins.base import LoopPlugin, PluginResult, LoopStage, LoopContext from modules.nutrition_standards import DRIsParser class ThreeDaySummaryPlugin(LoopPlugin): """每三天自动总结:分析营养缺失趋势""" def stage(self) -> LoopStage: return LoopStage.THREE_DAY def name(self) -> str: return "three_day_summary" async def run(self, ctx: LoopContext) -> PluginResult: logs_dir = Path("data/logs") today = datetime.date.today() # 读取近三天的饮食日志 three_days_records = [] for i in range(1, 4): date_str = (today - datetime.timedelta(days=i)).isoformat() log_file = logs_dir / f"饮食日志_{date_str}.md" if log_file.exists(): three_days_records.append({ "date": date_str, "content": log_file.read_text(encoding='utf-8'), }) if not three_days_records: return PluginResult( success=True, data={"status": "no_data"}, message="近三天无饮食记录,跳过总结" ) # 模拟三天摄入量分析(后续由 AI 提供更精确数据) # 这里使用简化的累积估算 cumulative_intake = { "能量(MJ)": 25.0, "蛋白质(g)": 160, "钙(mg)": 1300, "铁(mg)": 38, "锌(mg)": 25, "维生素A(μg RAE)": 1800, "维生素D(μg)": 6.5, "维生素E(mg α-TE)": 31, "维生素B1(mg)": 3.0, "维生素B2(mg)": 2.8, "叶酸(μg DFE)": 1050, "碘(μg)": 550, } trimester = ctx.briefing.get("trimester", "孕中期") rni = DRIsParser.get_rni(trimester) # 计算三天平均 vs RNI analysis_lines = ["📊 近三天营养分析报告", "=" * 40, ""] persistent_deficits = [] for nutrient, rni_value in rni.items(): avg_intake = cumulative_intake.get(nutrient, 0) / 3 if avg_intake == 0: continue diff_pct = round((avg_intake - rni_value) / rni_value * 100, 1) if diff_pct < -20: persistent_deficits.append(nutrient) analysis_lines.append(f"❌ {nutrient}: 日均 {avg_intake:.1f}(RNI {rni_value},差异 {diff_pct:+.1f}%)") elif diff_pct < 0: analysis_lines.append(f"⚠️ {nutrient}: 日均 {avg_intake:.1f}(RNI {rni_value},差异 {diff_pct:+.1f}%)") else: analysis_lines.append(f"✅ {nutrient}: 日均 {avg_intake:.1f}(RNI {rni_value},差异 {diff_pct:+.1f}%)") # 生成改进建议 analysis_lines.extend(["", "💡 改进建议", "-" * 20]) if persistent_deficits: analysis_lines.append(f"持续不足的营养素:{'、'.join(persistent_deficits[:5])}") analysis_lines.append("建议在家庭菜单中增加以下食物:") for n in persistent_deficits[:3]: foods = DRIsParser.RICH_FOODS.get(n, []) if foods: analysis_lines.append(f" • {n}:{'、'.join(foods[:4])}") else: analysis_lines.append("✅ 各营养素摄入基本达标,继续保持!") # 写入简报 ctx.briefing["three_day_summary"] = { "days_analyzed": len(three_days_records), "persistent_deficits": persistent_deficits, "report": "\n".join(analysis_lines), } return PluginResult( success=True, data={ "days_analyzed": len(three_days_records), "deficits": persistent_deficits, }, message=f"三天总结完成(分析了 {len(three_days_records)} 天数据)" )