Explorar el Código

feat(kb): P3 JSON→MD 视图派生工具链(单一事实源收口)

- render_kb_md.py: 从 JSON 生成 5 张视图 MD(supplements/clinical_indicators/exercises/interactions/protocols)
- --check 模式: 与现有视图比对,不一致退出码 1(阻断提交,强制只改 JSON)
- validate_kb.sh: 结构校验 + 视图同步校验统一入口(pre-commit 自动执行)
- 生成 docs/参考资料/知识库/views/*.md 初始视图;protocols 视图解析补剂 id 为名称
Xiaogang Liao hace 1 semana
padre
commit
6cf843834c

+ 181 - 0
docs/scripts/render_kb_md.py

@@ -0,0 +1,181 @@
+#!/usr/bin/env python3
+"""派生 MD 视图:以知识库 JSON 为唯一事实源,生成 Markdown 表格视图。
+
+用法:
+    python3 render_kb_md.py [知识库目录] [输出目录]
+    python3 render_kb_md.py --check [知识库目录] [输出目录]
+
+输出:<输出目录>/views/{supplements,clinical_indicators,exercises,interactions,protocols}.md
+约定:JSON 为单一事实源,MD 为派生视图;改动数据只改 JSON,随后重跑本脚本。
+--check 模式:重生成到临时目录并与现视图对比,不一致退出码 1(供 CI/提交流程)。
+"""
+import json
+import sys
+import tempfile
+from pathlib import Path
+
+DEFAULT_KB = "docs/参考资料/知识库"
+
+
+def load(path: Path):
+    return json.loads(path.read_text(encoding="utf-8"))
+
+
+def md_table(headers, rows):
+    out = ["| " + " | ".join(headers) + " |", "| " + " | ".join(["---"] * len(headers)) + " |"]
+    for r in rows:
+        cells = [str(c).replace("|", "\\|").replace("\n", " ") for c in r]
+        out.append("| " + " | ".join(cells) + " |")
+    return "\n".join(out)
+
+
+def render_supplements(doc):
+    rows = []
+    for s in doc["supplements"]:
+        ings = ", ".join(f"{i['name']} {i['amount']}" for i in s["key_ingredients"])
+        rows.append([s["id"], s["name"], s.get("brand") or "—", s["category"], s["form"],
+                     ings, s["dose_reference"], s["timing"], s.get("interaction_notes") or "—",
+                     s.get("contraindications") or "—", s.get("evidence_level", "—"),
+                     "✔" if s.get("enabled", True) else "✘"])
+    return ("# 补充剂库(视图)\n\n> 由 supplements.json 派生,勿手工编辑。\n\n"
+            + md_table(["id", "名称", "品牌", "类别", "剂型", "关键成分", "参考剂量", "时段",
+                        "相互作用注意", "禁忌", "证据", "启用"], rows))
+
+
+def render_indicators(doc):
+    rows = []
+    for ind in doc["indicators"]:
+        nr = ind.get("normal_range", {})
+        lo, hi = nr.get("low"), nr.get("high")
+        rng = f"{lo}~{hi}" if lo is not None and hi is not None else (str(lo or hi))
+        rt = ind.get("risk_thresholds", {})
+        warn = "; ".join(x for x in [f"低<{rt['low_warn']}" if rt.get("low_warn") else "",
+                                     f"高>{rt['high_warn']}" if rt.get("high_warn") else "",
+                                     rt.get("note") or ""] if x)
+        rows.append([ind["id"], ind["name"], ind.get("english_name", ""), ind["unit"], rng,
+                     warn, ind.get("monitoring_frequency_hint") or "—",
+                     ind.get("related_condition") or "—", ind.get("population_note") or "—"])
+    return ("# 临床监测指标参考库(视图)\n\n> 由 clinical_indicators.json 派生,勿手工编辑。\n\n"
+            + md_table(["id", "指标", "英文", "单位", "参考范围", "干预阈值", "复查频率",
+                        "相关疾病", "人群差异"], rows))
+
+
+def render_exercises(doc):
+    rows = []
+    for e in doc["exercises"]:
+        rows.append([e["id"], e["name"], "/".join(e.get("aliases", [])), e["type"], e["intensity"],
+                     e["duration_min"], e["frequency"], e.get("timing_pref") or "—",
+                     e.get("suitable_population") or "—", e.get("safety_notes") or "—"])
+    return ("# 运动处方库(视图)\n\n> 由 exercises.json 派生,勿手工编辑。\n\n"
+            + md_table(["id", "名称", "别名", "类型", "强度", "时长(分)", "频率", "时段偏好",
+                        "适宜人群", "安全注意"], rows))
+
+
+def render_interactions(doc):
+    def subj(s):
+        return s.get("supplement_id") or s.get("substance", "")
+    rows = []
+    for ix in doc["interactions"]:
+        rows.append([ix["id"], ix["type"], subj(ix["subjects_a"]), subj(ix["subjects_b"]),
+                     ix["rule"], ix["detail"], ix["severity"], ix.get("source") or "—"])
+    return ("# 补剂相互作用库(视图)\n\n> 由 interactions.json 派生,勿手工编辑。\n\n"
+            + md_table(["id", "类型", "主体A", "主体B", "规则", "说明", "等级", "来源"], rows))
+
+
+def render_protocols(docs, supplement_names):
+    out = ["# 干预方案库(视图)\n", "> 由 protocols/*.json 派生,勿手工编辑。\n"]
+    for doc in docs:
+        out.append(f"\n## {doc['name']}(`{doc['id']}`)\n")
+        out.append(f"> 来源文档:{doc.get('source_doc', '—')}\n")
+        cycles = {c["id"]: c for c in doc.get("cycles", [])}
+        out.append(md_table(["周期", "阶段", "起", "止"], [[cid, c.get("name"), c.get("start"), c.get("end")]
+                        for cid, c in cycles.items()]))
+        for member in doc.get("members", []):
+            out.append(f"\n### 成员:{member['name']}(family {member['family_id']},user {member['user_id']},手机 {member['phone']})\n")
+            for phase in member.get("phases", []):
+                cyc = cycles.get(phase["cycle_id"], {})
+                out.append(f"\n#### {cyc.get('name', phase['cycle_id'])} 补剂\n")
+                rows = []
+                for slot in phase.get("time_slots", []):
+                    names = "、".join(supplement_names.get(sid, sid) for sid in slot.get("supplement_ids", []))
+                    rows.append([slot["time"], slot["label"], names, slot.get("dose", ""), slot.get("notes", "")])
+                out.append(md_table(["时段", "标签", "补剂", "剂量", "备注"], rows))
+            dm = member.get("daily_monitoring", [])
+            if dm:
+                out.append("\n#### 每日监测\n")
+                out.append(md_table(["时间", "内容", "类型"],
+                                    [[d["time"], d["name"], d.get("kind", "")] for d in dm]))
+            wm = member.get("weekly_monitoring", [])
+            if wm:
+                out.append("\n#### 每周监测\n")
+                out.append(md_table(["周期", "内容", "关联指标"],
+                                    [[w["weekday"], w["name"], "、".join(w.get("indicator_ids", []))] for w in wm]))
+            fu = member.get("followups", [])
+            if fu:
+                out.append("\n#### 复查节点\n")
+                out.append(md_table(["周期", "项目", "关联指标", "说明"],
+                                    [[f["week"], f["name"], "、".join(f.get("indicator_ids", [])), f.get("note", "")] for f in fu]))
+            ex = member.get("exercises", [])
+            if ex:
+                out.append("\n#### 运动\n")
+                out.append("、".join(ex) + "\n")
+    return "\n".join(out)
+
+
+def main():
+    argv = sys.argv[1:]
+    check = False
+    if argv and argv[0] == "--check":
+        check = True
+        argv = argv[1:]
+    kb_dir = Path(argv[0]) if argv else Path(DEFAULT_KB)
+    out_dir = Path(argv[1]) if len(argv) > 1 else kb_dir
+
+    supplements = load(kb_dir / "supplements.json")
+    indicators = load(kb_dir / "clinical_indicators.json")
+    exercises = load(kb_dir / "exercises.json")
+    interactions = load(kb_dir / "interactions.json")
+    protocols = [load(p) for p in sorted((kb_dir / "protocols").glob("*.json"))]
+    names = {s["id"]: s["name"] for s in supplements["supplements"]}
+
+    rendered = {
+        "supplements.md": render_supplements(supplements),
+        "clinical_indicators.md": render_indicators(indicators),
+        "exercises.md": render_exercises(exercises),
+        "interactions.md": render_interactions(interactions),
+        "protocols.md": render_protocols(protocols, names),
+    }
+
+    target = out_dir / "views"
+    if check:
+        with tempfile.TemporaryDirectory() as tmp:
+            tmp_dir = Path(tmp) / "views"
+            tmp_dir.mkdir(parents=True, exist_ok=True)
+            for name, text in rendered.items():
+                (tmp_dir / name).write_text(text + "\n", encoding="utf-8")
+            diff_count = 0
+            for name in rendered:
+                existing = target / name
+                if not existing.exists():
+                    print(f"[DIFF] {name} 缺失")
+                    diff_count += 1
+                    continue
+                a = (tmp_dir / name).read_text(encoding="utf-8").splitlines()
+                b = existing.read_text(encoding="utf-8").splitlines()
+                if a != b:
+                    diffs = list(difflib.unified_diff(b, a, fromfile=name, tofile=name, lineterm=""))
+                    print(f"[DIFF] {name}: {len(diffs)} 行差异(JSON 与视图不同步)")
+                    print("\n".join(diffs[:20]))
+                    diff_count += 1
+            print("RESULT:", "FAIL" if diff_count else "PASS")
+            sys.exit(1 if diff_count else 0)
+    else:
+        target.mkdir(parents=True, exist_ok=True)
+        for name, text in rendered.items():
+            (target / name).write_text(text + "\n", encoding="utf-8")
+            print(f"wrote {target / name}")
+        print("RESULT: PASS")
+
+
+if __name__ == "__main__":
+    main()

+ 4 - 3
docs/scripts/validate_kb.sh

@@ -1,13 +1,14 @@
 #!/usr/bin/env bash
-# 知识库质量校验统一入口(CI 与本地通用)。
+# 知识库质量统一入口:JSON Schema 结构校验 + 视图同步校验(CI 与提交流程共用)。
 # 用法:
 #   docs/scripts/validate_kb.sh            # 校验默认知识库目录
 #   docs/scripts/validate_kb.sh <目录>     # 校验指定目录
-# 退出码:0=PASS,1=FAIL(供 CI/提交流程阻断)。
+# 退出码:0=PASS,1=FAIL。
 set -euo pipefail
 
 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
 KB_DIR="${1:-"$ROOT/docs/参考资料/知识库"}"
 
-python3 "$ROOT/docs/scripts/validate_kb.py" "$KB_DIR"
+python3 "$ROOT/docs/scripts/validate_kb.py" "$KB_DIR"
+python3 "$ROOT/docs/scripts/render_kb_md.py" --check "$KB_DIR"

+ 21 - 0
docs/参考资料/知识库/views/clinical_indicators.md

@@ -0,0 +1,21 @@
+# 临床监测指标参考库(视图)
+
+> 由 clinical_indicators.json 派生,勿手工编辑。
+
+| id | 指标 | 英文 | 单位 | 参考范围 | 干预阈值 | 复查频率 | 相关疾病 | 人群差异 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| ind-fpg | 空腹血糖 | Fasting Plasma Glucose (FPG) | mmol/L | 3.9~6.1 | 低<3.9; 高>7.0; 3.9-6.1 正常;6.1-7.0 空腹血糖受损(糖尿病前期);≥7.0 提示糖尿病 | 每周监测(空腹+餐后2h) | II型糖尿病 | — |
+| ind-pg2h | 餐后2小时血糖 | 2-hour Postprandial Glucose (2hPG) | mmol/L | 7.8 | 高>11.1; <7.8 正常;7.8-11.1 糖耐量受损;≥11.1 提示糖尿病 | 每周监测 | II型糖尿病 | — |
+| ind-hba1c | 糖化血红蛋白 | Hemoglobin A1c (HbA1c) | % | 4.0~6.0 | 高>7.5; ≥6.5% 提示糖尿病;老年糖尿病者控制目标建议<7.5% | 12周复查 | II型糖尿病 | 老年患者放宽控制目标,避免低血糖 |
+| ind-hb | 血红蛋白 | Hemoglobin (Hb) | g/L | 115~175 | 低<120; <120(男)/<110(女)提示贫血;本干预以改善铁缺乏性贫血为目标 | 4周复查 | 缺铁性贫血 | 男 130-175,女 115-150 |
+| ind-ferritin | 血清铁蛋白 | Serum Ferritin (SF) | ng/mL | 15~400 | 低<30; <30 提示缺铁;储存铁不足评估首选指标;>400 需排查慢性炎症 | 8-12周复查 | 缺铁性贫血 | 男 30-400,女 15-200 |
+| ind-tc | 总胆固醇 | Total Cholesterol (TC) | mmol/L | 5.2 | 高>6.2; >6.2 高胆固醇血症 | 12周复查 | 血脂异常 | — |
+| ind-tg | 甘油三酯 | Triglyceride (TG) | mmol/L | 1.7 | 高>2.3; >2.3 升高,≥5.6 高甘油三酯血症(胰腺炎风险) | 12周复查 | 血脂异常 | — |
+| ind-ldlc | 低密度脂蛋白胆固醇 | LDL-C | mmol/L | 3.4 | 高>4.1; >4.1 显著升高;高危人群目标<2.6 | 12周复查 | 血脂异常 | — |
+| ind-hdlc | 高密度脂蛋白胆固醇 | HDL-C | mmol/L | 1.0 | 低<1.0; 男<1.0、女<1.3 提示降低(心血管风险升高) | 12周复查 | 血脂异常 | 男>1.0,女>1.3 |
+| ind-alt | 丙氨酸氨基转移酶 | Alanine Transaminase (ALT) | U/L | 40 | 高>80; >80 明显升高,提示肝细胞损伤 | 12周复查 | 肝病 | 男<50,女<40 |
+| ind-ast | 天门冬氨酸氨基转移酶 | Aspartate Transaminase (AST) | U/L | 40 | 高>80; 与ALT联用评估肝损伤;AST/ALT比值提示肝损类型 | 12周复查 | 肝病 | 男<45,女<40 |
+| ind-bun | 尿素 | Blood Urea Nitrogen (BUN) | mmol/L | 2.9~8.2 | 高>14.3; >14.3 提示肾功能下降或高蛋白摄入;<2.9 提示营养不良 | 12周复查 | 肾病 | — |
+| ind-cre | 肌酐 | Creatinine (Cr) | μmol/L | 41~111 | 高>133; >133 提示肾功能不全 | 12周复查 | 肾病 | 男 57-111,女 41-81 |
+| ind-egfr | 肾小球滤过率 | eGFR | mL/min/1.73m² | 90 | 低<60; <60 提示慢性肾脏病(G3 期起);60-90 正常高值,需结合肌酐 | 12周复查 | 肾病 | 老年人偏低可接受,需纵向对比 |
+| ind-ua | 尿酸 | Uric Acid (UA) | μmol/L | 420 | 高>480; 男>420、女>360 提示高尿酸血症 | 12周复查 | 痛风 | 男<420,女<360 |

+ 10 - 0
docs/参考资料/知识库/views/exercises.md

@@ -0,0 +1,10 @@
+# 运动处方库(视图)
+
+> 由 exercises.json 派生,勿手工编辑。
+
+| id | 名称 | 别名 | 类型 | 强度 | 时长(分) | 频率 | 时段偏好 | 适宜人群 | 安全注意 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| ex-walk | 餐后散步 | 步行/散步15-20分钟 | 有氧 | 低 | 15 | 三餐后 | 早/午/晚餐后15-20分钟(助控餐后血糖) | 老年患者、糖尿病患者降餐后血糖首选 | 血糖<3.9 或 >16.7 mmol/L 时避免剧烈活动;空腹不散步;餐后30分钟以上为宜(本方案提前至餐后15分钟,视体力调整) |
+| ex-toe-stand | 足尖俯卧撑 | 提踵/提踵训练 | 抗阻 | 中低 | 5 | 每日 | 与散步穿插,或餐后完成 | 下肢力量训练/防跌倒,可与有氧交替 | 20-30次×2-3组;膝踝关节不稳者减量 |
+| ex-baduanjin | 八段锦 | 八段锦/太极 | 柔韧 | 低 | 20 | 每日或每周5次 | 晨起空腹后30分钟或晚餐前30分钟 | 老年人、心血管患者低强度运动首选 | 动作放缓,避免颈部快速转动 |
+| ex-abdominal-massage | 腹部顺时针按摩 | 腹部按摩 | 其他 | 低 | 5 | 每日2次 | 睡前或晨起空腹后 | 便秘/腹胀人群促肠道蠕动 | 饭后1小时内避免;力度适中 |

+ 16 - 0
docs/参考资料/知识库/views/interactions.md

@@ -0,0 +1,16 @@
+# 补剂相互作用库(视图)
+
+> 由 interactions.json 派生,勿手工编辑。
+
+| id | 类型 | 主体A | 主体B | 规则 | 说明 | 等级 | 来源 |
+| --- | --- | --- | --- | --- | --- | --- | --- |
+| ix-iron-vitc | 协同 | sup-lifeineng-iron | sup-vitamin-c | 同服促吸收 | 维生素C可将三价铁还原为二价铁,提高铁吸收率;铁剂配100mg维C同服 | 提示 | 双人肠道菌群联合干预方案 |
+| ix-iron-turmeric | 拮抗 | sup-lifeineng-iron | sup-turmeric | 错开2小时以上 | 姜黄(素)影响铁吸收;本方案姜黄暂不建议,先补铁 | 提示 | 双人肠道菌群联合干预方案 |
+| ix-iron-calcium | 拮抗 | sup-lifeineng-iron | 钙片/高钙食物 | 错开2小时以上 | 钙与铁竞争吸收通道,同服降低铁吸收率 | 提示 | 双人肠道菌群联合干预方案 |
+| ix-iron-tea-coffee | 拮抗 | sup-lifeineng-iron | 茶/咖啡(鞣酸/多酚) | 错开2小时以上 | 鞣酸/多酚与铁形成不溶性络合物,显著抑制铁吸收 | 提示 | 双人肠道菌群联合干预方案 |
+| ix-probiotic-antibiotic | 时序禁忌 | sup-lelichang50 | 抗生素 | 间隔2小时以上 | 抗生素杀灭益生菌;与所有益生菌制剂间隔至少2小时 | 警示 | 双人肠道菌群联合干预方案 |
+| ix-akk-iron | 时序禁忌 | sup-akkermansia | sup-lifeineng-iron | 错开2小时 | Akk菌与铁剂错开2小时,避免互相影响吸收 | 提示 | 双人肠道菌群联合干预方案 |
+| ix-tryptophan-ssri | 安全警示 | sup-tryptophan | SSRI/SNRI/MAOI 类抗抑郁药 | 咨询医生后使用 | 色氨酸为5-HT前体,与5-HT再摄取抑制类药物合用存在5-羟色胺综合征风险 | 禁忌 | 临床用药共识 |
+| ix-fishoil-anticoagulant | 安全警示 | sup-fish-oil | 抗凝药(华法林等) | 咨询医生后使用 | 高剂量EPA/DHA可增强抗凝效应,增加出血风险;监测凝血功能 | 警示 | 临床用药共识 |
+| ix-turmeric-anticoagulant | 安全警示 | sup-turmeric | 抗凝/抗血小板药(阿司匹林/华法林等) | 咨询医生后使用 | 姜黄素具抗血小板作用,与抗凝药合用增加出血风险 | 警示 | 临床用药共识 |
+| ix-probiotic-high-temp | 时序禁忌 | sup-lelichang50 | 高温(≥40℃水/热饮) | 温水(≤40℃)冲服 | 高温灭活活菌;冲服水温不超过40℃,避免与热食同服 | 提示 | 双人肠道菌群联合干预方案 |

+ 118 - 0
docs/参考资料/知识库/views/protocols.md

@@ -0,0 +1,118 @@
+# 干预方案库(视图)
+
+> 由 protocols/*.json 派生,勿手工编辑。
+
+
+## 双人肠道菌群联合干预方案(`protocol-gut-joint-intervention-v1`)
+
+> 来源文档:docs/参考资料/方案/双人肠道菌群联合干预方案.md (1).docx
+
+| 周期 | 阶段 | 起 | 止 |
+| --- | --- | --- | --- |
+| cycle-2 | 第二阶段 | 2026-10-13 | 2026-11-09 |
+| cycle-3 | 第三阶段 | 2026-11-10 | 2026-12-07 |
+
+### 成员:王卫东(family 87,user 76,手机 15604130166)
+
+
+#### 第二阶段 补剂
+
+| 时段 | 标签 | 补剂 | 剂量 | 备注 |
+| --- | --- | --- | --- | --- |
+| 06:00 | 晨起空腹 | 乐力畅50+益生菌(无糖) | 乐力畅50+益生菌(无糖)1袋 | 温水冲服;0蔗糖0脂肪,重建菌群主力 |
+| 07:00 | 早餐后 | 力蜚能多糖铁复合物胶囊、维生素C、乐力畅50+益生菌(无糖)、Enagic Kangen Ukon 姜黄胶囊(姜黄素)、Akk菌(嗜黏蛋白阿克曼菌,灭活+菊粉) | 铁剂+维C / 乐力畅50+1袋 / 姜黄1-2粒 / Akk菌半粒~1粒 | 力蜚能铁与姜黄错开2h;Akk从半粒起步防胀气;监测血糖 |
+| 12:30 | 午餐后 | L-谷氨酰胺、康比特BCAA支链氨基酸粉(无糖)、低聚半乳糖GOS | 谷氨酰胺2.5g + BCAA 2.5g + GOS 2.5~5g | 温水冲服;GOS从2.5g起步观察腹胀与血糖 |
+| 17:30 | 晚餐后 | 和安复方氨基酸胶囊(8-11)、迪辅乐布拉氏酵母菌滴剂 | 和安氨基酸1粒 + 迪辅乐布拉氏酵母5滴 | 和安早晚各1粒;迪辅乐巩固抗菌,逐步减量 |
+| 19:30 | 睡前 | L-色氨酸、L-组氨酸 | 色氨酸半粒~1粒 + 组氨酸500mg | 温水送服;监测夜间血糖,白天嗜睡则减量 |
+
+#### 第三阶段 补剂
+
+| 时段 | 标签 | 补剂 | 剂量 | 备注 |
+| --- | --- | --- | --- | --- |
+| 06:00 | 晨起空腹 | 乐力畅50+益生菌(无糖) | 乐力畅50+益生菌(无糖)1袋 | 长期维持量,温水冲服 |
+| 07:00 | 早餐后 | 力蜚能多糖铁复合物胶囊、维生素C、Enagic Kangen Ukon 姜黄胶囊(姜黄素)、Akk菌(嗜黏蛋白阿克曼菌,灭活+菊粉)、深海鱼油 | 铁剂1粒(或隔日)+维C / 姜黄1粒 / Akk菌1粒 / 深海鱼油1粒 | 鱼油第9周起,选80%+高纯度;监测凝血与血糖 |
+| 12:30 | 午餐后 | L-谷氨酰胺、康比特BCAA支链氨基酸粉(无糖)、低聚半乳糖GOS | 谷氨酰胺2-3g + BCAA 5g + GOS 5g | 温水冲服;长期低剂量维持 |
+| 17:30 | 晚餐后 | 和安复方氨基酸胶囊(8-11) | 和安氨基酸1粒 | 饮食氨基酸充足可减为每日1粒 |
+| 19:30 | 睡前 | L-色氨酸、L-组氨酸 | 色氨酸1粒(或隔日) + 组氨酸500mg(或减量) | 温水送服;睡眠改善后减量 |
+
+#### 每日监测
+
+| 时间 | 内容 | 类型 |
+| --- | --- | --- |
+| 19:00 | 每日记录:排便情况(次数/性状/颜色) | self_report |
+| 19:00 | 每日记录:腹部症状(腹痛/腹泻/胀气) | self_report |
+| 19:00 | 每日足部护理(温水洗脚+检查足部) | physical |
+
+#### 每周监测
+
+| 周期 | 内容 | 关联指标 |
+| --- | --- | --- |
+| 周一 | 每周评估:食欲与食量(与血糖关系) |  |
+| 周一 | 每周测体重1次并记录 |  |
+| 周三 | 本周测血糖2-3次(空腹+餐后2h) | ind-fpg、ind-pg2h |
+
+#### 复查节点
+
+| 周期 | 项目 | 关联指标 | 说明 |
+| --- | --- | --- | --- |
+| 4周 | 复查血常规(血红蛋白,评估铁缺乏改善) | ind-hb | 4周后查血常规 |
+| 8-12周 | 复查血清铁蛋白(评估储存铁恢复) | ind-ferritin | 8-12周查血清铁蛋白 |
+| 12周 | 复查糖化血红蛋白 HbA1c | ind-hba1c | 每3个月查一次 |
+| 12周 | 复查血脂 | ind-tc、ind-tg、ind-ldlc、ind-hdlc | 12周查,评估心脑血管风险 |
+| 12周 | 复查肝肾功能 | ind-alt、ind-ast、ind-bun、ind-cre、ind-egfr、ind-ua | 12周查,评估补充剂安全性 |
+
+#### 运动
+
+ex-walk、ex-toe-stand
+
+
+### 成员:闫德波(family 90,user 79,手机 13841386977)
+
+
+#### 第二阶段 补剂
+
+| 时段 | 标签 | 补剂 | 剂量 | 备注 |
+| --- | --- | --- | --- | --- |
+| 06:00 | 晨起空腹 | 乐力畅50+益生菌(无糖) | 乐力畅50+中老年益生菌 1-2袋 | 温水冲服或干吃;主力补双歧+提升多样性 |
+| 07:00 | 早餐后 | 力蜚能多糖铁复合物胶囊、维生素C、和安复方氨基酸胶囊(8-11) | 力蜚能铁1粒+维C / 和安氨基酸1粒 | 铁剂餐后+维C;和安早晚各1粒 |
+| 12:30 | 午餐后 | 康比特BCAA支链氨基酸粉(无糖)、低聚果糖FOS | BCAA 2.5g + 低聚果糖FOS 5-10g | 温水冲服;益生元维持量,根据耐受调整 |
+| 17:30 | 晚餐后 | 混合益生元(FOS+菊粉+抗性糊精)、和安复方氨基酸胶囊(8-11) | 混合益生元(FOS+菊粉+抗性糊精)10-15g + 和安氨基酸1粒 | 午+晚各半量;喂养内源产丁酸菌 |
+| 19:30 | 睡前 | L-色氨酸 | 色氨酸半粒~1粒(500mg) | 温水送服;改善睡眠,白天嗜睡则减量 |
+
+#### 第三阶段 补剂
+
+| 时段 | 标签 | 补剂 | 剂量 | 备注 |
+| --- | --- | --- | --- | --- |
+| 06:00 | 晨起空腹 | 乐力畅50+益生菌(无糖) | 乐力畅50+益生菌 1袋 | 长期维持量 |
+| 07:00 | 早餐后 | 力蜚能多糖铁复合物胶囊、维生素C、和安复方氨基酸胶囊(8-11) | 力蜚能铁1粒(或隔日)+维C / 和安氨基酸1粒 | 根据复查铁蛋白结果调整 |
+| 12:30 | 午餐后 | 康比特BCAA支链氨基酸粉(无糖)、低聚果糖FOS | BCAA 5g + FOS 5g | 可与BCAA一起吃 |
+| 17:30 | 晚餐后 | 混合益生元(FOS+菊粉+抗性糊精) | 混合益生元 5-10g | 长期低剂量维持安全 |
+| 19:30 | 睡前 | L-色氨酸 | 色氨酸1粒(睡眠改善可隔日) | 温水送服 |
+
+#### 每日监测
+
+| 时间 | 内容 | 类型 |
+| --- | --- | --- |
+| 19:00 | 每日记录:排便情况(次数/性状/颜色) | self_report |
+| 19:00 | 每日记录:腹部症状(腹胀/腹痛/胀气) | self_report |
+
+#### 每周监测
+
+| 周期 | 内容 | 关联指标 |
+| --- | --- | --- |
+| 周一 | 每周评估:食欲与食量 |  |
+| 周一 | 每周测体重1次并记录 |  |
+
+#### 复查节点
+
+| 周期 | 项目 | 关联指标 | 说明 |
+| --- | --- | --- | --- |
+| 4周 | 复查血常规(血红蛋白,评估铁缺乏改善) | ind-hb | 4周后查血常规 |
+| 8-12周 | 复查血清铁蛋白(评估储存铁恢复) | ind-ferritin | 8-12周查血清铁蛋白 |
+| 12周 | 复查血脂 | ind-tc、ind-tg、ind-ldlc、ind-hdlc | 12周查 |
+| 12周 | 复查肝肾功能 | ind-alt、ind-ast、ind-bun、ind-cre、ind-egfr、ind-ua | 12周查,补充剂安全性评估 |
+
+#### 运动
+
+ex-walk、ex-toe-stand
+

+ 23 - 0
docs/参考资料/知识库/views/supplements.md

@@ -0,0 +1,23 @@
+# 补充剂库(视图)
+
+> 由 supplements.json 派生,勿手工编辑。
+
+| id | 名称 | 品牌 | 类别 | 剂型 | 关键成分 | 参考剂量 | 时段 | 相互作用注意 | 禁忌 | 证据 | 启用 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| sup-lelichang50 | 乐力畅50+益生菌(无糖) | 乐力畅 | 益生菌 | 粉剂 | 复合益生菌 ≥50亿CFU/袋 | 晨起空腹 1袋;第一周半袋起步,无胀气再加到1袋;维持期1-2袋/日 | 晨起空腹 | 与抗生素间隔2小时以上 | — | 3 | ✔ |
+| sup-lifeineng-iron | 力蜚能多糖铁复合物胶囊 | 力蜚能 | 矿物质 | 胶囊 | 多糖铁复合物 1粒(约150mg铁) | 早餐后1粒,需长期补铁者隔日1粒;与维C同服促吸收 | 早餐后 | 与姜黄/钙片/茶/咖啡错开2小时以上(抑制铁吸收) | — | 3 | ✔ |
+| sup-vitamin-c | 维生素C | — | 维生素 | 片剂 | 维生素C 100mg/片 | 早餐后1片,与铁剂同服促铁吸收 | 早餐后 | — | — | 3 | ✔ |
+| sup-bcaa | 康比特BCAA支链氨基酸粉(无糖) | 康比特 | 氨基酸 | 粉剂 | 支链氨基酸(亮氨酸/异亮氨酸/缬氨酸) 2.5g起,第三阶段5g | 午餐后2.5g(阶段二)→ 5g(阶段三);可与低聚半乳糖同服 | 午餐后 | — | — | 2 | ✔ |
+| sup-glutamine | L-谷氨酰胺 | — | 氨基酸 | 粉剂 | L-谷氨酰胺 2.5g起,第三阶段2-3g | 午餐后2.5g(阶段二)→ 2-3g(阶段三) | 午餐后 | — | — | 2 | ✔ |
+| sup-gos | 低聚半乳糖GOS | — | 益生元 | 粉剂 | 低聚半乳糖 2.5-5g | 午餐后2.5-5g(阶段二)→ 5g(阶段三);与少量菊粉合用喂养双歧/乳杆菌 | 午餐后 | 胀气者从半量起步、逐步增量 | — | 2 | ✔ |
+| sup-fos | 低聚果糖FOS | — | 益生元 | 粉剂 | 低聚果糖 5-10g | 午餐后/晚餐后5-10g,从半量(2.5-5g)起步,第二周逐步加到全量 | 可选 | — | — | 3 | ✔ |
+| sup-inulin | 菊粉 | — | 益生元 | 粉剂 | 菊粉型果聚糖 2.5-5g | 作为混合益生元组分之一,与FOS/抗性糊精搭配;从半量起步防胀气 | 可选 | 胀气者从半粒/半量起步 | — | 3 | ✔ |
+| sup-resistant-dextrin | 抗性糊精 | — | 益生元 | 粉剂 | 抗性糊精 2.5-5g | 与低聚果糖合计益生元10g/日起步,第二周加到各5g/日(合计10-15g/日) | 可选 | — | — | 2 | ✔ |
+| sup-mixed-prebiotic | 混合益生元(FOS+菊粉+抗性糊精) | — | 益生元 | 粉剂 | 低聚果糖FOS 5-10g, 菊粉 2.5-5g, 抗性糊精 2.5-5g | 晚餐后10-15g,全面喂养内源有益菌(特别是产丁酸菌) | 晚餐后 | — | — | 3 | ✔ |
+| sup-hean-amino | 和安复方氨基酸胶囊(8-11) | 和安 | 氨基酸 | 胶囊 | 复方氨基酸+维生素B1等 1粒 | 晚餐后1粒 | 晚餐后 | — | — | 1 | ✔ |
+| sup-difler-boulardii | 迪辅乐布拉氏酵母菌滴剂 | 迪辅乐 | 益生菌 | 滴剂 | 布拉氏酵母菌 5滴 | 晚餐后5滴 | 晚餐后 | — | — | 2 | ✔ |
+| sup-akkermansia | Akk菌(嗜黏蛋白阿克曼菌,灭活+菊粉) | — | 益生菌 | 胶囊 | Akkermansia muciniphila(巴氏灭活) 半粒~1粒 | 早餐后半粒起步(带菊粉款式),无胀气再加到1粒 | 早餐后 | 与铁剂错开2小时 | 炎症水平高/免疫抑制者慎用 | 2 | ✔ |
+| sup-tryptophan | L-色氨酸 | — | 氨基酸 | 胶囊 | L-色氨酸 500mg/粒 | 睡前半粒起步,观察睡眠改善;白天嗜睡则减量,无嗜睡再加到1粒 | 睡前 | 与SSRI类抗抑郁药同服需谨慎(5-HT综合征风险) | 正在服用SSRI/单胺氧化酶抑制剂者须咨询医生 | 2 | ✔ |
+| sup-histidine | L-组氨酸 | — | 氨基酸 | 胶囊 | L-组氨酸 500mg/粒 | 睡前500mg(可选) | 睡前 | — | — | 1 | ✔ |
+| sup-fish-oil | 深海鱼油 | — | 脂肪酸 | 胶囊 | DHA+EPA 1粒 | 早餐后1粒(第三阶段加入) | 早餐后 | 与抗凝药物(华法林等)同服需谨慎 | 服用抗凝药者咨询医生 | 2 | ✔ |
+| sup-turmeric | Enagic Kangen Ukon 姜黄胶囊(姜黄素) | Kangen Ukon | 植物提取物 | 胶囊 | 姜黄素 1-2粒 | 早餐后1-2粒(阶段二);阶段三减为1粒 | 早餐后 | 影响铁吸收,与铁剂错开2小时以上 | 正在服用抗凝药者慎用(抗血小板作用) | 2 | ✘ |