PregoPal / plugins /three_day_summary.py
J.B-Lin
chore: save current version before UI improvements (i18n + font fix)
ec90eae
Raw
History Blame Contribute Delete
4.11 kB
"""
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)} 天数据)"
)