181 lines
8.5 KiB
Python
Executable File
181 lines
8.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""NFC药品检索脚本 - 通过NFC芯片ID查询对应药品信息"""
|
||
|
||
import argparse
|
||
import json
|
||
import sys
|
||
|
||
# NFC ID 与药品对应表
|
||
NFC_MEDICINE_DB = {
|
||
"1DCDC90D0D1080": {
|
||
"name": "阿莫西林胶囊",
|
||
"category": "抗生素",
|
||
"description": "用于治疗细菌感染,如呼吸道感染、泌尿道感染、皮肤软组织感染等。",
|
||
"dosage": "成人一次0.5g(1粒),每6-8小时一次,一日3-4次。饭后服用,用温水整粒吞服。",
|
||
"caution": "对青霉素过敏者禁用。需按疗程服用,不要自行停药。"
|
||
},
|
||
"1DC8C90D0D1080": {
|
||
"name": "硝苯地平控释片",
|
||
"category": "降压药",
|
||
"description": "用于治疗高血压,帮助控制血压,预防心脑血管意外。",
|
||
"dosage": "成人一次30mg(1片),一日1次。每天固定时间服用,整片吞服,不可掰开或嚼碎。",
|
||
"caution": "不可突然停药,需遵医嘱逐渐减量。服药期间避免吃柚子。"
|
||
},
|
||
"1DC9C90D0D1080": {
|
||
"name": "二甲双胍片",
|
||
"category": "降糖药",
|
||
"description": "用于治疗2型糖尿病,帮助控制血糖水平。",
|
||
"dosage": "成人起始剂量一次0.25g(1片),一日2-3次,随餐服用。可根据血糖情况遵医嘱调整用量。",
|
||
"caution": "肾功能不全者慎用。服药期间需定期监测血糖。"
|
||
},
|
||
"1DCCC90D0D1080": {
|
||
"name": "阿司匹林肠溶片",
|
||
"category": "抗血小板药",
|
||
"description": "用于预防心脑血管血栓形成,降低心梗和脑梗的风险。",
|
||
"dosage": "成人一次100mg(1片),一日1次。每天固定时间服用,饭前用温水整片吞服,不可嚼碎。",
|
||
"caution": "有胃溃疡病史者慎用。服药期间如有异常出血请及时就医。"
|
||
},
|
||
"1DC7C90D0D1080": {
|
||
"name": "辛伐他汀片",
|
||
"category": "降脂药",
|
||
"description": "用于降低血液中的胆固醇,预防动脉硬化和心血管疾病。",
|
||
"dosage": "成人一次20mg(1片),一日1次,晚间服用效果最佳。",
|
||
"caution": "服药期间避免大量饮用柚子汁。如出现肌肉疼痛请及时就医。"
|
||
},
|
||
"100005": {
|
||
"name": "氨氯地平片",
|
||
"category": "降压药",
|
||
"description": "用于治疗高血压和心绞痛,帮助平稳降低血压。",
|
||
"dosage": "成人一次5mg(1片),一日1次。每天同一时间服用即可,不受进食影响。",
|
||
"caution": "首次服用可能出现头晕,起身时请缓慢。不可突然停药。"
|
||
},
|
||
"100006": {
|
||
"name": "美托洛尔缓释片",
|
||
"category": "降压药/心率控制",
|
||
"description": "用于治疗高血压、心绞痛和心律不齐,帮助减慢心率、降低血压。",
|
||
"dosage": "成人一次47.5mg(1片),一日1次,早晨服用。整片吞服,不可掰开或嚼碎。",
|
||
"caution": "不可突然停药,需遵医嘱逐渐减量。心率过慢时请咨询医生。"
|
||
},
|
||
"100007": {
|
||
"name": "奥美拉唑肠溶胶囊",
|
||
"category": "胃药",
|
||
"description": "用于治疗胃酸过多、胃溃疡、反流性食管炎,保护胃黏膜。",
|
||
"dosage": "成人一次20mg(1粒),一日1次,早晨饭前服用。整粒吞服,不可打开胶囊。",
|
||
"caution": "不宜长期服用,一般疗程4-8周。长期使用需定期复查。"
|
||
},
|
||
"100008": {
|
||
"name": "氯吡格雷片",
|
||
"category": "抗血小板药",
|
||
"description": "用于预防血栓形成,常用于放过支架或有心梗脑梗风险的患者。",
|
||
"dosage": "成人一次75mg(1片),一日1次。每天固定时间服用,不受进食影响。",
|
||
"caution": "服药期间注意观察有无异常出血。手术前需提前告知医生正在服用此药。"
|
||
},
|
||
"100009": {
|
||
"name": "螺内酯片",
|
||
"category": "利尿药",
|
||
"description": "用于治疗水肿和高血压,帮助排出体内多余水分,减轻心脏负担。",
|
||
"dosage": "成人一次20mg(1片),一日1-2次,早晨服用为宜。",
|
||
"caution": "服药期间需注意监测血钾,避免食用过多含钾高的食物如香蕉、橙子。"
|
||
},
|
||
"100010": {
|
||
"name": "复方丹参滴丸",
|
||
"category": "心血管中成药",
|
||
"description": "用于活血化瘀,理气止痛。常用于冠心病、心绞痛的日常预防和缓解。",
|
||
"dosage": "一次10丸,一日3次。舌下含服效果更好,也可用温水吞服。",
|
||
"caution": "孕妇禁用。如胸痛持续不缓解,请立即就医。"
|
||
},
|
||
"100011": {
|
||
"name": "蒙脱石散",
|
||
"category": "止泻药",
|
||
"description": "用于治疗腹泻,保护肠道黏膜,吸附肠道内的毒素和细菌。",
|
||
"dosage": "成人一次1袋(3g),一日3次。倒入半杯温水中搅匀后服用,建议空腹服用。",
|
||
"caution": "服用后可能引起便秘,症状缓解后可停药。与其他药物需间隔2小时服用。"
|
||
},
|
||
"B55CB052": {
|
||
"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.5mg(1片),一日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()
|