qwen_agent/skills_developing/nfc-medicine-lookup/scripts/nfc_medicine_lookup.py
2026-04-03 21:10:19 +08:00

181 lines
8.4 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""NFC药品检索脚本 - 通过NFC芯片ID查询对应药品信息"""
import argparse
import json
import sys
# NFC ID 与药品对应表
NFC_MEDICINE_DB = {
"100000": {
"name": "阿莫西林胶囊",
"category": "抗生素",
"description": "用于治疗细菌感染,如呼吸道感染、泌尿道感染、皮肤软组织感染等。",
"dosage": "成人一次0.5g1粒每6-8小时一次一日3-4次。饭后服用用温水整粒吞服。",
"caution": "对青霉素过敏者禁用。需按疗程服用,不要自行停药。"
},
"100001": {
"name": "硝苯地平控释片",
"category": "降压药",
"description": "用于治疗高血压,帮助控制血压,预防心脑血管意外。",
"dosage": "成人一次30mg1片一日1次。每天固定时间服用整片吞服不可掰开或嚼碎。",
"caution": "不可突然停药,需遵医嘱逐渐减量。服药期间避免吃柚子。"
},
"100002": {
"name": "二甲双胍片",
"category": "降糖药",
"description": "用于治疗2型糖尿病帮助控制血糖水平。",
"dosage": "成人起始剂量一次0.25g1片一日2-3次随餐服用。可根据血糖情况遵医嘱调整用量。",
"caution": "肾功能不全者慎用。服药期间需定期监测血糖。"
},
"100003": {
"name": "阿司匹林肠溶片",
"category": "抗血小板药",
"description": "用于预防心脑血管血栓形成,降低心梗和脑梗的风险。",
"dosage": "成人一次100mg1片一日1次。每天固定时间服用饭前用温水整片吞服不可嚼碎。",
"caution": "有胃溃疡病史者慎用。服药期间如有异常出血请及时就医。"
},
"100004": {
"name": "辛伐他汀片",
"category": "降脂药",
"description": "用于降低血液中的胆固醇,预防动脉硬化和心血管疾病。",
"dosage": "成人一次20mg1片一日1次晚间服用效果最佳。",
"caution": "服药期间避免大量饮用柚子汁。如出现肌肉疼痛请及时就医。"
},
"100005": {
"name": "氨氯地平片",
"category": "降压药",
"description": "用于治疗高血压和心绞痛,帮助平稳降低血压。",
"dosage": "成人一次5mg1片一日1次。每天同一时间服用即可不受进食影响。",
"caution": "首次服用可能出现头晕,起身时请缓慢。不可突然停药。"
},
"100006": {
"name": "美托洛尔缓释片",
"category": "降压药/心率控制",
"description": "用于治疗高血压、心绞痛和心律不齐,帮助减慢心率、降低血压。",
"dosage": "成人一次47.5mg1片一日1次早晨服用。整片吞服不可掰开或嚼碎。",
"caution": "不可突然停药,需遵医嘱逐渐减量。心率过慢时请咨询医生。"
},
"100007": {
"name": "奥美拉唑肠溶胶囊",
"category": "胃药",
"description": "用于治疗胃酸过多、胃溃疡、反流性食管炎,保护胃黏膜。",
"dosage": "成人一次20mg1粒一日1次早晨饭前服用。整粒吞服不可打开胶囊。",
"caution": "不宜长期服用一般疗程4-8周。长期使用需定期复查。"
},
"100008": {
"name": "氯吡格雷片",
"category": "抗血小板药",
"description": "用于预防血栓形成,常用于放过支架或有心梗脑梗风险的患者。",
"dosage": "成人一次75mg1片一日1次。每天固定时间服用不受进食影响。",
"caution": "服药期间注意观察有无异常出血。手术前需提前告知医生正在服用此药。"
},
"100009": {
"name": "螺内酯片",
"category": "利尿药",
"description": "用于治疗水肿和高血压,帮助排出体内多余水分,减轻心脏负担。",
"dosage": "成人一次20mg1片一日1-2次早晨服用为宜。",
"caution": "服药期间需注意监测血钾,避免食用过多含钾高的食物如香蕉、橙子。"
},
"100010": {
"name": "复方丹参滴丸",
"category": "心血管中成药",
"description": "用于活血化瘀,理气止痛。常用于冠心病、心绞痛的日常预防和缓解。",
"dosage": "一次10丸一日3次。舌下含服效果更好也可用温水吞服。",
"caution": "孕妇禁用。如胸痛持续不缓解,请立即就医。"
},
"100011": {
"name": "蒙脱石散",
"category": "止泻药",
"description": "用于治疗腹泻,保护肠道黏膜,吸附肠道内的毒素和细菌。",
"dosage": "成人一次1袋3g一日3次。倒入半杯温水中搅匀后服用建议空腹服用。",
"caution": "服用后可能引起便秘症状缓解后可停药。与其他药物需间隔2小时服用。"
},
"100012": {
"name": "布洛芬缓释胶囊",
"category": "解热镇痛药",
"description": "用于缓解头痛、牙痛、关节痛、肌肉痛以及感冒引起的发热。",
"dosage": "成人一次1粒300mg一日2次早晚各一次。饭后服用用温水整粒吞服。",
"caution": "有胃溃疡病史者慎用。连续使用不超过5天如疼痛持续请就医。"
},
"100013": {
"name": "碳酸钙D3片",
"category": "补钙药",
"description": "用于补充钙质和维生素D预防和治疗骨质疏松。",
"dosage": "成人一次1片一日1-2次。嚼碎后吞服或整片吞服均可建议随餐服用。",
"caution": "肾结石患者慎用。每日补钙不宜超过医生建议量。"
},
"100014": {
"name": "甲钴胺片",
"category": "营养神经药",
"description": "用于治疗周围神经病变,如手脚麻木、刺痛,常见于糖尿病引起的神经损伤。",
"dosage": "成人一次0.5mg1片一日3次饭后服用。",
"caution": "避光保存。如服用一个月后症状无改善,请咨询医生。"
},
}
def lookup_by_nfc_id(nfc_id: str) -> dict | None:
"""通过NFC ID查询药品信息"""
return NFC_MEDICINE_DB.get(nfc_id)
def lookup_by_name(name: str) -> list[dict]:
"""通过药品名称模糊查询返回匹配的药品列表含nfc_id"""
results = []
for nfc_id, medicine in NFC_MEDICINE_DB.items():
if name in medicine["name"]:
results.append({"nfc_id": nfc_id, **medicine})
return results
def format_voice_response(medicine: dict, nfc_id: str | None = None) -> str:
"""格式化为语音助手风格的回复"""
lines = [
f"## 药品识别结果\n",
]
if nfc_id:
lines.append(f"**NFC ID**{nfc_id}\n")
lines.extend([
f"**药品名称**{medicine['name']}\n",
f"**药品类别**{medicine['category']}\n",
f"### 这个药是做什么的\n",
f"{medicine['description']}\n",
f"### 用法用量\n",
f"{medicine['dosage']}\n",
f"### 注意事项\n",
f"{medicine['caution']}",
])
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="NFC药品检索 - 通过NFC芯片ID或药品名称查询药品信息")
parser.add_argument("--nfc-id", "-n", help="NFC芯片ID")
parser.add_argument("--name", "-m", help="药品名称(支持模糊匹配)")
args = parser.parse_args()
if not args.nfc_id and not args.name:
print("错误:请提供 --nfc-id 或 --name 参数。")
sys.exit(1)
if args.nfc_id:
medicine = lookup_by_nfc_id(args.nfc_id)
if medicine is None:
print(f"NOT_FOUND: 未找到NFC ID为 {args.nfc_id} 对应的药品记录。")
sys.exit(1)
print(format_voice_response(medicine, nfc_id=args.nfc_id))
else:
results = lookup_by_name(args.name)
if not results:
print(f"NOT_FOUND: 本地药品库中未找到包含「{args.name}」的药品。")
sys.exit(1)
for r in results:
nfc_id = r.pop("nfc_id")
print(format_voice_response(r, nfc_id=nfc_id))
print("\n---\n")
if __name__ == "__main__":
main()