Spaces:
Runtime error
Runtime error
| """ | |
| 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)} 天数据)" | |
| ) | |