基于鸿蒙OS开发静脉输液智能监控系统(9)-药物数据库与配伍禁忌检测

目录

  1. 静脉注射药物数据库概述
  2. IVDrugDatabase设计
  3. DrugDatabase配伍禁忌检测
  4. MedicinePage中的药物管理
  5. 与CostService的联动
  6. 扩展与未来规划

1. 静脉注射药物数据库概述

1.1 为什么需要内置药物数据库

在临床输液场景中,药物信息的即时可获取性直接关系到患者安全。IVGuard 作为一款面向护士和患者的智能输液监护应用,其核心价值之一便是为药物添加和费用计算环节提供准确的药品参考数据。将药物数据库内置于应用中,而非依赖网络远程查询,是基于以下关键考量:

离线可用性:医院病区的网络环境往往不稳定。部分老旧病区 Wi-Fi 覆盖存在盲区,地下室输液室信号更是难以保证。在这些场景下,护士需要立即查询药物的配伍禁忌或参考价格,任何因网络延迟或断连导致的信息不可用都是不可接受的。内置数据库确保无论网络状态如何,药物信息均可在毫秒级别完成检索并呈现,为临床决策提供即时支持。

即时响应体验:远程 API 调用涉及网络请求、数据序列化、传输、反序列化等多个环节,即使在良好网络条件下,响应时间也通常在 200ms 以上。而本地内存数据库的查询延迟在微秒级别,用户输入搜索关键词后立即获得结果,这种零延迟的交互体验对于高频使用的临床工具至关重要。IVDrugDatabase 采用内存数组存储 + 线性扫描的搜索策略,在 50 条药物记录的规模下,搜索性能完全满足实时响应的需求。

不依赖外部服务:医疗应用对服务可用性有着极高的要求。依赖远程 API 意味着需要面对服务器故障、API 变更、认证失效等一系列不可控因素。内置数据库将数据的所有权完全掌握在应用自身,避免了因第三方服务中断而导致功能不可用的风险。同时,这也简化了部署和维护的复杂度——无需搭建和维护后端服务器,无需处理 API 版本兼容性问题。

患者隐私保护:药物查询本身可能间接反映患者的用药情况。如果将查询请求发送至远程服务器,即使是匿名的搜索关键词,也可能存在信息泄露的风险。本地数据库使查询完全在设备端完成,不产生任何网络流量,从架构层面杜绝了数据外泄的可能性。这在医疗数据合规方面具有先天优势——数据不出设备,便不存在传输过程中的泄露风险。

结果的确定性与一致性:内置数据库的版本与应用版本绑定,数据内容是确定且可复验的。每次应用更新时,药物数据库随之一同更新,确保所有用户使用的始终是同一版本的数据。这避免了远程 API 因缓存、灰度发布等原因导致不同用户看到不同数据的不一致问题。在医疗场景中,数据的一致性至关重要——不同护士在同一设备上查询同一药物,应该获得完全一致的结果。

1.2 数据来源与准确性

IVGuard 药物数据库中的药品信息主要来源于以下权威渠道:

国家基本医疗保险药品目录:药物数据库中的 insuranceCategory(医保分类)字段严格依据国家医保局发布的《国家基本医疗保险、工伤保险和生育保险药品目录》进行标注。甲类药品(class_a)为临床必需、使用广泛、疗效确切、同类药品中价格较低的品种,全额纳入医保报销基数;乙类药品(class_b)为可供临床治疗选择使用、疗效确切、同类药品中比甲类药品价格或治疗费用更高的品种,部分纳入医保报销基数。

药品说明书与国家药典:药物通用名(genericName)、商品名(brandName)、规格(specification)、剂型(dosageForm)等基础信息均来源于国家药品监督管理局(NMPA)批准的药品说明书和《中华人民共和国药典》的记载。通用名遵循中国药品通用名称(CADN)命名规范,商品名标注原研药企注册品牌。

参考价格referencePrice 字段为单价/单瓶的参考价格,综合了各省集中采购中标价和公立医院采购价的加权平均值。由于药品价格受集中采购政策、地区差异、供应情况等多种因素影响,实际价格可能与参考价格存在偏差。参考价格仅作为费用估算的基准值,不作为实际收费依据。

准确性声明:IVGuard 药物数据库中的所有信息均仅供参考,不构成医疗建议。临床用药必须以医嘱和药师审核为准,药物相互作用检测结果为辅助提示工具,不能替代专业药师的配伍审核。参考价格不作为实际收费依据,实际费用以医院收费系统为准。

1.3 数据库规模与覆盖范围

当前 MVP(最小可行产品)版本的药物数据库包含 50 种静脉注射相关药物条目,覆盖了临床输液中最常见的药品类别。

1.3.1 分类详表
药品类别 数量 代表药物
抗生素类 11 头孢呋辛钠、头孢曲松钠、青霉素钠、阿莫西林克拉维酸钾、左氧氟沙星、庆大霉素、万古霉素、亚胺培南西司他丁、甲硝唑、替硝唑
抗病毒药物 3 阿昔洛韦、更昔洛韦、利巴韦林
消化系统药物 1 奥美拉唑
呼吸系统药物 3 氨溴索、布地奈德、异丙托溴铵
糖皮质激素 2 地塞米松磷酸钠、甲泼尼龙
电解质与维生素 5 氯化钾、葡萄糖酸钙、维生素C、维生素B6、氨茶碱
输液基础液 7 葡萄糖5%、葡萄糖10%、氯化钠0.9%、葡萄糖氯化钠、乳酸林格液、右旋糖酐40
肠外营养 3 脂肪乳(C14-24)、复方氨基酸(18AA)、人血白蛋白
内分泌药物 2 胰岛素、螺内酯
心血管药物 6 呋塞米、多巴胺、去甲肾上腺素、地高辛、硝普钠、硝酸甘油
抗肿瘤药物 4 环磷酰胺、顺铂、紫杉醇、奥沙利铂
抗凝血药物 2 低分子肝素钠、那屈肝素钙
中药注射剂 3 七叶皂苷钠、丹参酮IIA磺酸钠、参麦注射液
抗真菌药物 1 氟康唑

这 50 种药物基本涵盖了二级及以上医院输液室最常用的药品品种,在日常输液监控场景中能够提供较为完整的参考支持。

1.3.2 剂型分布
剂型 数量 占比 说明
粉针 14 28% 冻干粉针剂,需溶媒溶解后注射
水针 17 34% 水溶液注射剂,直接注射或加入输液
大输液 12 24% 大容量注射液(≥100ml),直接静脉滴注
预充针 2 4% 预充式注射器,直接注射
片剂 1 2% 口服片剂(仅螺内酯,作为联合用药参考收录)

水针剂型占比最高,反映了静脉注射药物中即用型注射液的广泛应用。粉针剂型排名第二,这类药物在使用前需要用溶媒溶解,配制过程本身也是配伍禁忌检测的重要场景——粉针溶解所用的溶媒(如0.9%氯化钠或5%葡萄糖)是否与药物相容,是护士配药时必须确认的。大输液剂型虽然数量不多,但使用频率极高——几乎所有输液治疗都需要基础液作为载体。

1.3.3 医保分类分布
医保分类 编码值 数量 占比
甲类 class_a 30 60%
乙类 class_b 20 40%
自费 self_pay 0 0%

甲类药品占 60%,这与临床实际相符——输液室最常用的基础输液、常规抗生素和电解质补充剂均属甲类。乙类药品虽然数量较少(20种),但价格显著高于甲类药品,在费用计算中的权重不容忽视。当前 MVP 版本未收录自费药品,后续版本可根据临床需求扩充。

1.3.4 价格区间分布
价格区间 甲类品种数 乙类品种数 代表药物
0-5元 12 0 螺内酯(0.5)、呋塞米(2.0)、青霉素钠(2.8)、维生素B6(2.5)
5-15元 7 0 多巴胺(5.5)、甲硝唑(8.0)、利巴韦林(12.0)、地高辛(12.0)
15-30元 5 1 氨溴索(15.5)、头孢呋辛钠(28.5)、异丙托溴铵(28.0)
30-50元 3 3 左氧氟沙星(45.0)、低分子肝素钠(46.0)、那屈肝素钙(42.0)
50-100元 0 5 胰岛素(56.0)、七叶皂苷钠(58.0)、氟康唑(78.0)、更昔洛韦(95.0)
100-200元 0 2 万古霉素(128.0)、亚胺培南(185.0)
200元以上 0 2 紫杉醇(298.0)、人血白蛋白(380.0)、奥沙利铂(520.0)

关键发现:

  1. 甲类药品价格天花板:甲类药品最高价为左氧氟沙星 45.0 元,无一超过 50 元。这与甲类药品"同类药品中价格较低"的定义完全吻合。
  2. 乙类药品价格跨度极大:乙类药品最低价替硝唑 22.0 元,最高价奥沙利铂 520.0 元,跨度达 23.6 倍。这反映了乙类药品涵盖从"价格略高于甲类"到"高价专科用药"的广泛范围。
  3. 50元分界线:50 元是甲类与乙类药品的天然价格分界线——甲类几乎全部在 50 元以下,而乙类中低于 50 元的仅有 3 种(替硝唑 22.0、异丙托溴铵 28.0、那屈肝素钙 42.0)。这一分界线为 CostService 中的医保报销计算提供了清晰的数据边界。
  4. 抗肿瘤药物价格突出:4种抗肿瘤药物中有2种超过200元,奥沙利铂以520元位居数据库首位。一次化疗可能需要多支,药物费用显著。

2. IVDrugDatabase设计

2.1 类结构与设计模式

IVDrugDatabase 采用静态类(Static Class)模式实现,这是 ArkTS/TypeScript 中实现单例数据访问的常见方式。整个类仅 99 行代码,结构精炼而功能完整:

` ypescript
import { IVDrugInfo } from ‘./DataModels’

export class IVDrugDatabase {
private static drugs: IVDrugInfo[] = []
private static loaded: boolean = false

static init(): void {
if (IVDrugDatabase.loaded) {
return
}
IVDrugDatabase.loaded = true
// … 药物数据加载
IVDrugDatabase.drugs = list
}

static search(keyword: string): IVDrugInfo[] { … }
static getById(id: string): IVDrugInfo | undefined { … }
static getAll(): IVDrugInfo[] { … }
}
`

静态类模式的选择理由:药物数据库在整个应用生命周期中只需要一个实例,且需要在多个页面(MedicinePage、CostPage 等)和多个服务(CostService、AIService 等)中共享访问。静态类模式天然保证了全局唯一性和无实例化开销的访问方式。调用方无需持有数据库对象的引用,直接通过 IVDrugDatabase.search()IVDrugDatabase.getById() 等静态方法即可获取数据,这种零成本的访问方式在医疗应用的高频查询场景中尤为重要。

与其他设计模式的对比

设计模式 优势 劣势 适用场景
静态类 全局唯一、零实例化开销、调用简洁 不可多态、难以Mock测试 只读数据、全局共享
单例模式(Singleton) 延迟初始化、可多态、可Mock 实例获取需额外调用、代码稍冗 需要多态或延迟初始化
依赖注入(DI) 可测试性最佳、解耦彻底 架构复杂度高、需DI框架 大型应用、多模块协作
模块级变量 最简洁 无封装、全局可修改 工具函数库

IVGuard 当前阶段选择静态类模式是务实之举:药物数据库为纯只读数据源,不存在多态需求;静态方法的调用方式最简洁,降低了使用门槛;对于 MVP 阶段,测试的便利性让位于开发的效率。后续版本如果需要引入依赖注入以提升可测试性,可以平滑演进——将静态方法委托给注入的实例方法,保持外部接口不变。

私有静态字段drugsloaded 均声明为 private static,对外部完全隐藏了内部实现细节。drugs 数组存储所有药物条目,loaded 标志位防止重复加载。这种封装保证了数据的一致性——外部代码无法直接篡改 drugs 数组的内容,只能通过类提供的公共方法进行只读访问。

2.2 懒加载机制

ypescript static init(): void { if (IVDrugDatabase.loaded) { return } IVDrugDatabase.loaded = true const list: IVDrugInfo[] = [] let idx = 1 list.push(IVDrugInfo.create(String(idx++), '头孢呋辛钠', '西力欣', '0.75g/支', '粉针', 28.5, 'class_a', '2-3支/日')) // ... 逐条 push 药物数据 IVDrugDatabase.drugs = list }

init() 方法采用懒加载(Lazy Initialization)模式,具有以下设计要点:

2.2.1 双重保障初始化策略

IVDrugDatabase 与 DrugDatabase 采用了不同的初始化守卫策略,这是一个值得深入分析的设计差异:

IVDrugDatabase 的布尔标志守卫

` ypescript
private static loaded: boolean = false

static init(): void {
if (IVDrugDatabase.loaded) {
return
}
IVDrugDatabase.loaded = true
// … 加载数据
IVDrugDatabase.drugs = list
}
`

DrugDatabase 的数组长度守卫

` ypescript
private static interactions: DrugInteraction[] = []

static init(): void {
if (DrugDatabase.interactions.length > 0) {
return
}
// … 加载数据
DrugDatabase.interactions = data
}
`

两种策略的差异在于守卫条件的判定依据:

策略 守卫条件 优势 劣势
布尔标志 loaded === true 语义清晰、首次检测即返回 需额外字段、需在加载前设置
数组长度 length > 0 无需额外字段、自包含 空数据集无法区分、语义模糊

IVDrugDatabase 选择布尔标志的原因:语义更加明确——loaded = true 直接表达"数据已加载"的含义,而 length > 0 间接推断"非空即已加载"。布尔标志还在加载前即被设为 true(先于数据加载执行),这意味着即使数据加载过程中发生异常,后续调用也不会重复执行加载逻辑,避免了部分加载的不一致状态。

DrugDatabase 选择数组长度守卫的原因:配伍规则数据库不可能为空(至少有1条规则),因此 length > 0 作为守卫条件是充分且可靠的。省略 loaded 字段简化了类结构,对于仅含 12 条规则的小型数据集,这种简洁性更为可取。

2.2.2 懒加载时序分析

应用启动 | +-- EntryAbility.onCreate() | +-- DataStore.init(context) | +-- 初始化 Preferences | +-- IVDrugDatabase 尚未初始化 | +-- MedicinePage.aboutToAppear() | +-- DataStore.loadMedicines() | +-- AIService.checkDrugInteractions() | +-- DrugDatabase.checkInteractions() | +-- DrugDatabase.init() <-- 首次触发 | +-- 加载 12 条配伍规则 | +-- MedicineDetailPage (搜索药品) | +-- IVDrugDatabase.search(value) <-- 首次触发 | +-- IVDrugDatabase.init() <-- 加载 50 条药物数据 | +-- CostPage (费用计算) +-- CostService.calculateSummary() +-- IVDrugDatabase.getById() <-- 已初始化,直接返回

首次调用时加载:药物数据并非在应用启动时立即加载,而是在第一次实际需要访问药物数据时才触发初始化。这种延迟加载策略避免了应用冷启动时不必要的内存分配和 CPU 开销,对 50 条药物记录虽然影响微乎其微,但这种设计习惯在更大规模数据场景中价值显著。

每个公共方法的隐式初始化:所有公共访问方法(search()getById()getAll())在执行查询前都会先调用 init(),确保在使用前数据已完成加载。这种"使用即初始化"的模式使得调用方无需关心数据库是否已初始化,简化了使用方式:

` ypescript
static search(keyword: string): IVDrugInfo[] {
IVDrugDatabase.init() // 保证数据已加载
// … 执行搜索
}

static getById(id: string): IVDrugInfo | undefined {
IVDrugDatabase.init() // 保证数据已加载
// … 执行查询
}

static getAll(): IVDrugInfo[] {
IVDrugDatabase.init() // 保证数据已加载
return IVDrugDatabase.drugs
}
`

线程安全考量:在 HarmonyOS 的 ArkTS 运行时中,UI 主线程是单线程执行的,init() 方法不存在并发竞争条件。如果未来数据库需要从异步数据源加载(如 rawfile JSON),则需要考虑使用 Promise 和异步机制保证加载的安全性。

2.3 IVDrugInfo数据模型

每条药物记录对应一个 IVDrugInfo 实例,其字段定义如下:

` ypescript
export class IVDrugInfo {
id: string = ‘’ // 唯一标识,自增序号字符串
genericName: string = ‘’ // 通用名(如"头孢呋辛钠")
brandName: string = ‘’ // 商品名(如"西力欣"),可能为空
specification: string = ‘’ // 规格(如"0.75g/支")
dosageForm: string = ‘’ // 剂型(粉针/水针/大输液/片剂/预充针)
referencePrice: number = 0 // 参考单价(元)
insuranceCategory: string = ‘’ // 医保分类(class_a/class_b/self_pay)
dailyDosage: string = ‘’ // 日用剂量参考

static create(id: string, genericName: string, brandName: string, spec: string,
form: string, price: number, category: string, daily: string): IVDrugInfo {
const d = new IVDrugInfo()
d.id = id
d.genericName = genericName
d.brandName = brandName
d.specification = spec
d.dosageForm = form
d.referencePrice = price
d.insuranceCategory = category
d.dailyDosage = daily
return d
}
}
`

2.3.1 字段设计的技术考量

id 字段:采用自增序号的字符串形式(“1"至"50”),简洁且保证唯一性。使用字符串类型而非数字类型,是为了与项目中其他数据模型的 ID 字段保持一致的类型体系——Medicine、MonitorSession 等模型的 ID 均为字符串类型。同时,字符串 ID 为未来可能的 UUID 迁移预留了兼容空间。

genericName 字段:药物的通用名称,这是药物最核心的标识字段,也是搜索匹配和相互作用检测的主要依据。通用名遵循中国药品通用名称(CADN)命名规范。在配伍禁忌检测中,DrugDatabase 的规则以通用名作为匹配键,因此通用名的准确性直接决定了检测结果的可靠性。

brandName 字段:商品名为空字符串表示该药物无特定商品名或为通用名直接销售的品种。商品名是搜索的辅助匹配字段,用户输入"西力欣"可以找到"头孢呋辛钠",输入"洛赛克"可以找到"奥美拉唑"。在 50 种药物中,有 12 种具有商品名(占比 24%),其余 38 种商品名为空。具有商品名的药物通常是原研药或知名品牌产品,价格往往高于同类通用名药品。

specification 字段:规格描述了单支/单瓶的含量,如"0.75g/支"表示每支含 0.75 克药物。规格信息对药物剂量计算和费用计算都有参考价值——护士可以根据规格和日用剂量计算所需支数,CostService 可以据此估算单次输液费用。部分药物使用特殊计量单位:青霉素钠和庆大霉素以"万U"(单位)计量,胰岛素以"IU"(国际单位)计量。

dosageForm 字段:剂型分类是静脉注射药物的重要属性。IVGuard 中收录的剂型包括:

剂型 数量 特点 配伍关注点
粉针 14 冻干粉针剂,需溶媒溶解 溶媒选择(NS或D5W)是配伍禁忌高发环节
水针 17 即用型注射液 可直接加入输液或推注,需关注与其他药物的混合禁忌
大输液 12 大容量注射液(≥100ml) 作为药物载体,其与粉针/水针的相容性需确认
预充针 2 预充式注射器 直接皮下注射,配伍风险相对较低
片剂 1 口服片剂(螺内酯) 不直接参与输液配伍,但联合用药仍需关注

referencePrice 字段:参考价格为数值类型,便于进行费用计算和排序比较。价格范围从 0.5 元(螺内酯)到 520.0 元(奥沙利铂),跨度超过 1000 倍。这种巨大的价格差异直接影响患者的自付费用,也是 IVGuard 费用估算功能的核心数据输入。

insuranceCategory 字段:医保分类字段使用 class_aclass_bself_pay 三个编码值,与 CostService 中的报销计算逻辑直接关联。字符串常量而非枚举的选择遵循了项目的一致性约定,确保序列化友好和跨线程安全。

dailyDosage 字段:日用剂量参考为字符串类型,因为不同药物的用量表达方式差异较大——有的给出明确数量范围(如"2-3支/日"),有的按需使用(“按需”),化疗药物则按方案确定(“按方案”),泵入药物标注"按需泵入"。这种异构的表达方式不适合用数值类型统一表示,字符串类型提供了最大的灵活性。

2.3.2 工厂方法模式

IVDrugInfo.create() 采用工厂方法而非直接构造函数,这是因为 ArkTS 的类实例化需要通过 new 关键字创建对象后逐字段赋值。工厂方法将 8 个参数的赋值过程封装为一个调用,减少了调用方的代码量,也降低了字段遗漏赋值的风险。

Medicine.create() 只需 3 个参数不同,IVDrugInfo.create() 需要 8 个参数。这是因为 IVDrugInfo 作为参考数据库条目,其所有字段在创建时就必须完整填写——数据库条目不允许存在"部分填充"的中间状态。参数顺序遵循"标识→描述→财务→用法"的逻辑组织:先是 id 和名称,然后是规格和剂型,接着是价格和医保,最后是日用剂量。

2.4 50种药物条目详解

IVDrugDatabase.init() 中按序号逐一加载 50 种药物条目。以下按治疗类别分组,对每种药物的数据库记录进行逐一解析。

2.4.1 抗生素类(序号1-6, 13-15, 18-19)

抗生素是静脉输液中最常用的药物类别,也是药物相互作用风险较高的领域。IVGuard 收录了 11 种代表性抗生素。

1. 头孢呋辛钠(Cefuroxime Sodium)

ypescript list.push(IVDrugInfo.create(String(idx++), '头孢呋辛钠', '西力欣', '0.75g/支', '粉针', 28.5, 'class_a', '2-3支/日'))

  • 通用名:头孢呋辛钠——第二代头孢菌素类抗生素,对革兰阳性和革兰阴性菌均有良好抗菌活性
  • 商品名:西力欣(Zinacef),葛兰素史克研发
  • 规格:0.75g/支,每支含头孢呋辛钠 0.75 克
  • 剂型:粉针——冻干粉针剂,使用前需注射用水或0.9%氯化钠注射液溶解
  • 参考价格:28.5 元/支——甲类医保,价格适中
  • 日用剂量:2-3支/日——常规剂量为每日 2.25g-4.5g,分 2-3 次给药
  • 临床要点:头孢呋辛钠与氨基糖苷类(如庆大霉素)合用增加肾毒性,这是 IVGuard 相互作用检测中的一条 danger 级别规则

2. 头孢曲松钠(Ceftriaxone Sodium)

ypescript list.push(IVDrugInfo.create(String(idx++), '头孢曲松钠', '罗氏芬', '1g/支', '粉针', 35.0, 'class_a', '1-2支/日'))

  • 通用名:头孢曲松钠——第三代头孢菌素,半衰期长,每日一次给药即可维持有效血药浓度
  • 商品名:罗氏芬(Rocephin),罗氏公司原研产品
  • 规格:1g/支
  • 参考价格:35.0 元/支——甲类,是头孢类中价格较高的品种
  • 临床要点:头孢曲松钠与含钙输液配伍可形成头孢曲松钙沉淀,这一配伍禁忌在新生儿和婴幼儿中尤其危险,FDA 曾就此发布安全通告。IVGuard 将此列为 danger 级别相互作用

3. 青霉素钠(Penicillin Sodium)

ypescript list.push(IVDrugInfo.create(String(idx++), '青霉素钠', '', '80万U/支', '粉针', 2.8, 'class_a', '2-4支/日'))

  • 通用名:青霉素钠——最早发现的beta-内酰胺类抗生素,至今仍是治疗敏感菌感染的首选药物
  • 商品名:为空——青霉素钠为经典老药,无特定商品名
  • 规格:80万U/支——以单位(Unit)计量的特殊规格表示方式
  • 参考价格:2.8 元/支——是数据库中价格最低的抗生素,也是所有甲类药品中价格最低的品种之一
  • 临床要点:青霉素与庆大霉素有协同抗菌作用,但需分开给药(青霉素的beta-内酰胺环可使氨基糖苷类灭活),IVGuard 将此标记为 warning 级别

4. 阿莫西林克拉维酸钾(Amoxicillin-Clavulanate Potassium)

ypescript list.push(IVDrugInfo.create(String(idx++), '阿莫西林克拉维酸钾', '安灭菌', '1.2g/支', '粉针', 32.0, 'class_a', '2-3支/日'))

  • 通用名:阿莫西林克拉维酸钾——beta-内酰胺类/beta-内酰胺酶抑制剂复方制剂,克拉维酸保护阿莫西林不被beta-内酰胺酶水解
  • 商品名:安灭菌(Augmentin)
  • 规格:1.2g/支(含阿莫西林 1g + 克拉维酸 0.2g)
  • 参考价格:32.0 元/支
  • 临床要点:阿莫西林与甲氨蝶呤的相互作用为 danger 级别——青霉素类可减少甲氨蝶呤的肾脏清除,显著增加甲氨蝶呤的血液浓度和毒性

5. 左氧氟沙星(Levofloxacin)

ypescript list.push(IVDrugInfo.create(String(idx++), '左氧氟沙星', '可乐必妥', '0.5g/100ml', '大输液', 45.0, 'class_a', '1瓶/日'))

  • 通用名:左氧氟沙星——喹诺酮类抗菌药物,抗菌谱广,组织渗透性强
  • 商品名:可乐必妥(Cravit),第一三共株式会社产品
  • 规格:0.5g/100ml——为大输液剂型,直接静脉滴注
  • 剂型:大输液——区别于其他抗生素的粉针剂型,左氧氟沙星为即用型输液制剂
  • 参考价格:45.0 元/支——甲类中价格偏高的品种
  • 日用剂量:1瓶/日——得益于较长的半衰期,每日只需 0.5g 即可
  • 临床要点:喹诺酮类与非甾体抗炎药(NSAIDs)合用增加癫痫发作风险,IVGuard 将此标记为 warning 级别

6. 庆大霉素(Gentamicin)

ypescript list.push(IVDrugInfo.create(String(idx++), '庆大霉素', '', '8万U/2ml', '水针', 1.8, 'class_a', '2-3支/日'))

  • 通用名:庆大霉素——氨基糖苷类抗生素,对革兰阴性杆菌有强大杀菌作用
  • 商品名:为空
  • 规格:8万U/2ml——以单位计量
  • 参考价格:1.8 元/支——数据库中价格最低的抗生素,但肾毒性和耳毒性风险使其在相互作用检测中频繁出现
  • 临床要点:庆大霉素是数据库中涉及相互作用最多的药物之一,与头孢呋辛钠、青霉素钠、万古霉素均有配伍关联

抗生素类价格分析:6 种主要抗生素的参考价格从 1.8 元(庆大霉素)到 45.0 元(左氧氟沙星),跨越数量级。青霉素钠 2.8 元/支是经典老药低价的代表,头孢类(28.5-35.0 元)居中,左氧氟沙星的大输液剂型因含输液溶媒而价格较高。总体而言,甲类抗生素的价格区间在 1.8-45.0 元,属于医保报销范围内最常使用的抗菌药物品种。

14. 万古霉素(Vancomycin)

ypescript list.push(IVDrugInfo.create(String(idx++), '万古霉素', '稳可信', '0.5g/支', '粉针', 128.0, 'class_b', '2支/日'))

万古霉素是糖肽类抗生素,被誉为"抗生素最后一道防线",用于耐甲氧西林金黄色葡萄球菌(MRSA)感染。商品名"稳可信"(Vancocin),礼来公司产品。128.0 元/支,乙类医保。万古霉素与庆大霉素合用可增加肾毒性和耳毒性,这是 danger 级别相互作用。万古霉素的输液速度也需要严格控制——快速输注可致"红人综合征",这也是 IVGuard 流速监测的一个重要应用场景。

15. 亚胺培南西司他丁(Imipenem-Cilastatin)

ypescript list.push(IVDrugInfo.create(String(idx++), '亚胺培南西司他丁', '泰能', '0.5g/支', '粉针', 185.0, 'class_b', '2-3支/日'))

亚胺培南西司他丁是碳青霉烯类抗生素,商品名"泰能"(Tienam),默沙东产品。185.0 元/支,乙类医保,是抗生素中价格最高的品种,仅次于抗肿瘤药物。西司他丁本身无抗菌活性,但可抑制肾脱氢肽酶对亚胺培南的降解,两者联合使用。

18. 甲硝唑(Metronidazole)

ypescript list.push(IVDrugInfo.create(String(idx++), '甲硝唑', '', '0.5g/100ml', '大输液', 8.0, 'class_a', '2瓶/日'))

甲硝唑是抗厌氧菌药物,8.0 元/瓶,甲类医保,价格亲民。为大输液剂型,直接静脉滴注。

19. 替硝唑(Tinidazole)

ypescript list.push(IVDrugInfo.create(String(idx++), '替硝唑', '', '0.4g/100ml', '大输液', 22.0, 'class_b', '1-2瓶/日'))

替硝唑是甲硝唑的换代产品,半衰期更长,给药频率更低。22.0 元/瓶,乙类医保,价格是甲硝唑的 2.75 倍。

2.4.2 消化系统药物(序号6)

6. 奥美拉唑(Omeprazole)

ypescript list.push(IVDrugInfo.create(String(idx++), '奥美拉唑', '洛赛克', '40mg/支', '粉针', 68.0, 'class_b', '1-2支/日'))

  • 通用名:奥美拉唑——质子泵抑制剂(PPI),是消化性溃疡和应激性溃疡预防的首选静脉用药
  • 商品名:洛赛克(Losec),阿斯利康原研产品
  • 规格:40mg/支
  • 剂型:粉针——注射用奥美拉唑钠为冻干粉针剂,需用溶媒溶解后立即使用,配制后稳定性有限
  • 参考价格:68.0 元/支——乙类医保,是数据库中价格较高的非抗生素类注射剂
  • 医保分类:乙类(class_b)——仅部分纳入报销基数,患者需先自付一定比例
  • 临床要点:奥美拉唑与氯吡格雷的相互作用为 warning 级别——PPI 可通过抑制 CYP2C19 酶而减少氯吡格雷的活性代谢物生成,降低其抗血小板效果。虽然 IVGuard 当前 MVP 版本未收录氯吡格雷(其为口服片剂),但此相互作用规则作为重要临床提示予以收录
2.4.3 呼吸系统药物(序号7, 40-41)

呼吸系统药物收录了 3 种,覆盖了祛痰、吸入性皮质激素和抗胆碱能药物三个类别。

7. 氨溴索(Ambroxol)

ypescript list.push(IVDrugInfo.create(String(idx++), '氨溴索', '沐舒坦', '30mg/2ml', '水针', 15.5, 'class_a', '2-3支/日'))

氨溴索是黏液溶解剂,促进呼吸道黏稠痰液的排出。商品名"沐舒坦"(Mucosolvan),勃林格殷格翰产品。15.5 元/支,甲类医保,价格亲民。氨溴索与抗生素的协同作用为 info 级别——氨溴索可促进抗生素向肺组织渗透,提高呼吸道感染的治疗效果。这是数据库中为数不多的"有益"相互作用提示。

40. 布地奈德(Budesonide)

ypescript list.push(IVDrugInfo.create(String(idx++), '布地奈德', '普米克令舒', '1mg/2ml', '水针', 32.0, 'class_b', '1-2支/日'))

布地奈德是吸入性皮质激素,主要通过射流雾化器或超声波雾化器进行雾化吸入给药,而非直接静脉注射。这一收录体现了 IVGuard 对"输液关联药物"的广义覆盖——与输液同时使用的雾化药物同样纳入监控范围。

41. 异丙托溴铵(Ipratropium Bromide)

ypescript list.push(IVDrugInfo.create(String(idx++), '异丙托溴铵', '爱全乐', '0.5mg/2ml', '水针', 28.0, 'class_b', '1-3支/日'))

异丙托溴铵是抗胆碱能支气管扩张剂,常与布地奈德联合雾化使用。商品名"爱全乐"(Atrovent),勃林格殷格翰产品。28.0 元/支,乙类医保。

2.4.4 电解质、维生素与输液基础液(序号9-12, 24-32)

这是数据库中数量最多、覆盖最广的药物类别,可细分为三个子类:电解质补充剂、输液基础液、胶体与营养支持。

9. 氯化钾(Potassium Chloride)

ypescript list.push(IVDrugInfo.create(String(idx++), '氯化钾', '', '1g/10ml', '水针', 5.0, 'class_a', '按需'))

氯化钾是临床最常用的电解质补充剂,低钾血症的纠正不可或缺。1g/10ml 的高浓度制剂必须稀释后缓慢静脉滴注,严禁直接静脉推注。日用剂量标注"按需",因为补钾量需根据血钾检测结果个体化调整。氯化钾与螺内酯(保钾利尿剂)合用可致高钾血症,为 danger 级别相互作用。

10. 葡萄糖酸钙(Calcium Gluconate)

ypescript list.push(IVDrugInfo.create(String(idx++), '葡萄糖酸钙', '', '1g/10ml', '水针', 4.5, 'class_a', '1支/次'))

葡萄糖酸钙用于低钙血症的纠正和镁中毒的解救。与地高辛合用时,钙剂可增强洋地黄类的心脏毒性,这是 danger 级别相互作用。同时,葡萄糖酸钙是头孢曲松钠配伍禁忌中的"钙剂"一方。

11-12. 维生素C与维生素B6

ypescript list.push(IVDrugInfo.create(String(idx++), '维生素C', '', '1g/5ml', '水针', 3.8, 'class_a', '1-2支/日')) list.push(IVDrugInfo.create(String(idx++), '维生素B6', '', '100mg/2ml', '水针', 2.5, 'class_a', '1支/日'))

维生素C注射液常作为辅助治疗药物与输液一同使用。大剂量维生素C可破坏维生素B12,此为 info 级别提示。维生素B6常用于止吐和营养支持,2.5 元/支是甲类药品中价格最低的品种之一。

24-28. 输液基础液

ypescript list.push(IVDrugInfo.create(String(idx++), '葡萄糖5%', '', '250ml/瓶', '大输液', 4.5, 'class_a', '按需')) list.push(IVDrugInfo.create(String(idx++), '葡萄糖10%', '', '250ml/瓶', '大输液', 5.0, 'class_a', '按需')) list.push(IVDrugInfo.create(String(idx++), '氯化钠0.9%', '', '250ml/瓶', '大输液', 4.0, 'class_a', '按需')) list.push(IVDrugInfo.create(String(idx++), '葡萄糖氯化钠', '', '250ml/瓶', '大输液', 5.5, 'class_a', '按需')) list.push(IVDrugInfo.create(String(idx++), '乳酸林格液', '', '500ml/瓶', '大输液', 6.0, 'class_a', '按需'))

5种基础输液是静脉输液治疗的载体,几乎所有药物都需要溶解或稀释于基础液中输注。0.9%氯化钠注射液(生理盐水)4.0 元/瓶是基础液中价格最低的,乳酸林格液6.0 元/瓶是价格最高的。值得注意的是,乳酸林格液含有钙离子,属于头孢曲松钠配伍禁忌中"含钙输液"的范畴——这是当前 DrugDatabase 中"钙剂"规则无法直接匹配的已知局限。

29. 右旋糖酐40(Dextran 40)

ypescript list.push(IVDrugInfo.create(String(idx++), '右旋糖酐40', '', '500ml/瓶', '大输液', 18.0, 'class_a', '按需'))

右旋糖酐40为低分子右旋糖酐,具有扩充血容量和改善微循环的作用,是人血浆代用品。18.0 元/瓶,甲类医保。

30-32. 肠外营养

ypescript list.push(IVDrugInfo.create(String(idx++), '脂肪乳(C14-24)', '英脱利匹特', '250ml/瓶', '大输液', 85.0, 'class_b', '1瓶/日')) list.push(IVDrugInfo.create(String(idx++), '复方氨基酸(18AA)', '乐凡命', '250ml/瓶', '大输液', 65.0, 'class_b', '1瓶/日')) list.push(IVDrugInfo.create(String(idx++), '人血白蛋白', '', '10g/50ml', '水针', 380.0, 'class_b', '按需'))

脂肪乳和复方氨基酸是肠外营养的两大支柱,分别为患者提供必需脂肪酸/能量和氨基酸/蛋白质合成原料。人血白蛋白 380.0 元/支是数据库中价格最高的乙类药品,作为血容量扩充剂和低白蛋白血症的纠正药物,在重症患者中广泛使用。其高昂的价格和乙类医保分类意味着患者需要承担较高比例的自付费用。

2.4.5 心血管药物(序号33-38)

心血管药物是 ICU 和急诊输液的核心品类,价格区间从 2.0 元到 25.0 元。

33. 呋塞米(Furosemide)

ypescript list.push(IVDrugInfo.create(String(idx++), '呋塞米', '速尿', '20mg/2ml', '水针', 2.0, 'class_a', '按需'))

呋塞米是强效襻利尿剂,商品名"速尿"广为人知。2.0 元/支是数据库中价格最低的心血管药物,也是所有甲类药品中价格最低的品种。日用剂量为"按需",因为利尿剂的剂量需根据尿量和水肿情况个体化调整。

34-35. 血管活性药物

ypescript list.push(IVDrugInfo.create(String(idx++), '多巴胺', '', '20mg/2ml', '水针', 5.5, 'class_a', '按需泵入')) list.push(IVDrugInfo.create(String(idx++), '去甲肾上腺素', '', '2mg/1ml', '水针', 8.0, 'class_a', '按需泵入'))

多巴胺和去甲肾上腺素是最常用的静脉升压药,"按需泵入"意味着需要使用微量泵精确控制输注速率。这两种药物的高精度流速控制需求与 IVGuard 的流速监测功能高度契合——流速异常可能导致血压剧烈波动,是 IVGuard 监测异常流速的核心应用场景之一。

36. 地高辛(Digoxin)

ypescript list.push(IVDrugInfo.create(String(idx++), '地高辛', '', '0.5mg/2ml', '水针', 12.0, 'class_a', '1支/日'))

地高辛是洋地黄类强心苷,治疗窗窄,需监测血药浓度。与钙剂合用可增强洋地黄毒性,这是 danger 级别相互作用。

37-38. 硝普钠与硝酸甘油

ypescript list.push(IVDrugInfo.create(String(idx++), '硝普钠', '', '50mg/支', '粉针', 25.0, 'class_a', '按需泵入')) list.push(IVDrugInfo.create(String(idx++), '硝酸甘油', '', '5mg/1ml', '水针', 15.0, 'class_a', '按需泵入'))

硝普钠是强效静脉降压药,需避光使用且持续监测血压。25.0 元/支是心血管药中价格最高的甲类品种。硝酸甘油静脉制剂用于急性冠脉综合征和急性心力衰竭,同样需微量泵控制输注。15.0 元/支。

心血管药物价格分析:6 种心血管药物均为甲类医保,价格范围 2.0-25.0 元。呋塞米最便宜(2.0 元),硝普钠最贵(25.0 元)。三种泵入药物(多巴胺、去甲肾上腺素、硝普钠)的共同特征是"按需泵入",这与 IVGuard 的输液监控功能高度吻合——这些药物需要精确的流速控制,是 IVGuard 监测异常流速的核心应用场景。

2.4.6 激素与免疫药物(序号8, 42)

8. 地塞米松磷酸钠(Dexamethasone Sodium Phosphate)

ypescript list.push(IVDrugInfo.create(String(idx++), '地塞米松磷酸钠', '', '5mg/1ml', '水针', 3.2, 'class_a', '1-2支/日'))

地塞米松是长效糖皮质激素,3.2 元/支价格极低。与胰岛素的相互作用为 warning 级别——糖皮质激素可升高血糖,拮抗胰岛素的降糖作用,糖尿病患者同时使用时需密切监测血糖。

42. 甲泼尼龙(Methylprednisolone)

ypescript list.push(IVDrugInfo.create(String(idx++), '甲泼尼龙', '甲强龙', '40mg/支', '粉针', 52.0, 'class_b', '按需'))

甲泼尼龙是中效糖皮质激素,商品名"甲强龙"(Solu-Medrol),法玛西亚/辉瑞产品。52.0 元/支为乙类医保,是地塞米松价格的 16 倍以上。这种巨大价差反映了不同糖皮质激素在抗炎强度、盐皮质激素活性和临床适应症上的差异——甲泼尼龙在大剂量冲击治疗(如自身免疫性疾病、器官移植排异)中具有不可替代地位。

2.4.7 抗肿瘤药物(序号43-46)

抗肿瘤药物是数据库中价格最高的药物类别,包含两种甲类和两种乙类品种。

43. 环磷酰胺(Cyclophosphamide)

ypescript list.push(IVDrugInfo.create(String(idx++), '环磷酰胺', '', '0.2g/支', '粉针', 35.0, 'class_a', '按方案'))

环磷酰胺是烷化剂类抗肿瘤药,广泛用于多种恶性肿瘤和自身免疫性疾病。35.0 元/支,甲类医保,价格相对较低。"按方案"意味着用量取决于化疗方案的具体安排。

44. 顺铂(Cisplatin)

ypescript list.push(IVDrugInfo.create(String(idx++), '顺铂', '', '10mg/支', '水针', 28.0, 'class_a', '按方案'))

顺铂是含铂类抗肿瘤药,对多种实体瘤有效。28.0 元/支,甲类医保,但需警惕其显著的肾毒性和耳毒性,使用时需要充分水化。

45. 紫杉醇(Paclitaxel)

ypescript list.push(IVDrugInfo.create(String(idx++), '紫杉醇', '泰素', '30mg/支', '水针', 298.0, 'class_b', '按方案'))

紫杉醇是天然来源的抗肿瘤药,从红豆杉树皮中提取。商品名"泰素"(Taxol),百时美施贵宝产品。298.0 元/支,乙类医保,价格是甲类抗肿瘤药的 8-10 倍。一次化疗可能需要多支紫杉醇,费用负担显著。

46. 奥沙利铂(Oxaliplatin)

ypescript list.push(IVDrugInfo.create(String(idx++), '奥沙利铂', '乐沙定', '50mg/支', '粉针', 520.0, 'class_b', '按方案'))

奥沙利铂是数据库中价格最贵的药品:520.0 元/支。商品名"乐沙定"(Eloxatin),赛诺菲产品。作为第三代铂类抗肿瘤药,奥沙利铂主要用于结直肠癌的 FOLFOX 方案。一次标准剂量(130mg/m²)需要 3-4 支,单次药物费用超过 1500 元,是 IVGuard 费用估算功能的重要测试场景。

抗肿瘤药物价格分析:甲类抗肿瘤药(环磷酰胺 35 元、顺铂 28 元)与乙类抗肿瘤药(紫杉醇 298 元、奥沙利铂 520 元)之间存在约 10-20 倍的价格差异。这种差异直接影响患者的自付费用——以奥沙利铂为例,即使乙类医保按 80% 的比例纳入报销基数,患者仍需先自付 10-20% 的乙类先行自付,再经起付线和比例报销后,实际自付金额仍然较高。

2.4.8 抗凝血药物(序号47-48)

47-48. 低分子肝素

ypescript list.push(IVDrugInfo.create(String(idx++), '低分子肝素钠', '克赛', '0.4ml/支', '预充针', 46.0, 'class_b', '1-2支/日')) list.push(IVDrugInfo.create(String(idx++), '那屈肝素钙', '速碧林', '0.4ml/支', '预充针', 42.0, 'class_b', '1-2支/日'))

两种低分子肝素的收录体现了数据库对同类不同品种药物的覆盖——临床中具体使用哪种低分子肝素取决于医院采购和医生偏好,IVGuard 同时收录两者,确保无论使用哪种都能被搜索和识别。剂型为"预充针"——预充式注射器,无需额外配液,直接皮下注射使用。

2.4.9 抗真菌与抗病毒药物(序号20-23)

20. 氟康唑(Fluconazole)

ypescript list.push(IVDrugInfo.create(String(idx++), '氟康唑', '大扶康', '0.2g/100ml', '大输液', 78.0, 'class_b', '1瓶/日'))

氟康唑是三唑类抗真菌药,商品名"大扶康"(Diflucan),辉瑞产品。78.0 元/瓶,乙类医保,为大输液剂型。

21. 阿昔洛韦(Acyclovir)

ypescript list.push(IVDrugInfo.create(String(idx++), '阿昔洛韦', '', '0.25g/支', '粉针', 18.0, 'class_a', '3支/日'))

阿昔洛韦是抗疱疹病毒药物,18.0 元/支,甲类医保。日用剂量 3 支/日,是抗病毒药物中使用频次最高的品种。

22. 更昔洛韦(Ganciclovir)

ypescript list.push(IVDrugInfo.create(String(idx++), '更昔洛韦', '', '0.25g/支', '粉针', 95.0, 'class_b', '2支/日'))

更昔洛韦主要用于巨细胞病毒感染,价格(95.0 元)是阿昔洛韦的 5 倍以上,乙类医保。

23. 利巴韦林(Ribavirin)

ypescript list.push(IVDrugInfo.create(String(idx++), '利巴韦林', '', '0.5g/100ml', '大输液', 12.0, 'class_a', '2瓶/日'))

利巴韦林是广谱抗病毒药,12.0 元/瓶,甲类医保,价格亲民。

2.4.10 中药注射剂(序号49-50及参麦注射液)

中药注射剂是中国临床特有的药物类别,在辅助治疗中广泛使用。

49. 七叶皂苷钠(Sodium Aescinate)

ypescript list.push(IVDrugInfo.create(String(idx++), '七叶皂苷钠', '麦通纳', '10mg/支', '粉针', 58.0, 'class_b', '1-2支/日'))

七叶皂苷钠具有抗渗出、消肿作用,常用于脑水肿和创伤后肿胀。商品名"麦通纳",58.0 元/支,乙类医保。

50. 丹参酮IIA磺酸钠

ypescript list.push(IVDrugInfo.create(String(idx++), '丹参酮IIA磺酸钠', '', '10mg/2ml', '水针', 22.0, 'class_a', '2-4支/日'))

丹参酮IIA磺酸钠是从丹参中提取的有效成分,具有心血管保护作用。22.0 元/支,甲类医保,是中药注射剂中价格较低的品种。

参麦注射液

ypescript list.push(IVDrugInfo.create(String(idx++), '参麦注射液', '', '50ml/瓶', '大输液', 35.0, 'class_a', '1-2瓶/日'))

参麦注射液由红参、麦冬提取物组成,用于气阴两虚证。35.0 元/瓶,甲类医保。50ml/瓶的规格为大输液剂型。

2.4.11 其他收录药物

16. 胰岛素(Insulin)

ypescript list.push(IVDrugInfo.create(String(idx++), '胰岛素', '诺和灵R', '400IU/10ml', '水针', 56.0, 'class_a', '按需'))

胰岛素是糖尿病治疗的核心药物。商品名"诺和灵R"(Novolin R),诺和诺德产品,为短效胰岛素。56.0 元/支,甲类医保。胰岛素"按需"用量反映了个体化剂量调整的特征——剂量根据血糖监测结果随时调整。与地塞米松的相互作用(warning 级别)提示临床需关注糖皮质激素对血糖的影响。

17. 螺内酯(Spironolactone)

ypescript list.push(IVDrugInfo.create(String(idx++), '螺内酯', '', '20mg/片', '片剂', 0.5, 'class_a', '1-3片/日'))

螺内酯是数据库中唯一收录的口服片剂,0.5 元/片也是数据库中价格最低的品种。其收录目的是支持氯化钾与螺内酯的 danger 级别相互作用检测——虽然螺内酯本身不通过静脉给药,但与静脉补钾同时使用时的配伍风险必须被监测。

39. 氨茶碱(Aminophylline)

ypescript list.push(IVDrugInfo.create(String(idx++), '氨茶碱', '', '0.25g/10ml', '水针', 4.2, 'class_a', '1-2支/日'))

氨茶碱是支气管扩张剂,也是呼吸系统常用静脉药物。4.2 元/支,甲类医保。

2.5 数据加载的代码实现细节

IVDrugDatabase.init() 的完整实现采用以下编码策略:

ypescript static init(): void { if (IVDrugDatabase.loaded) { return } IVDrugDatabase.loaded = true const list: IVDrugInfo[] = [] let idx = 1 list.push(IVDrugInfo.create(String(idx++), '头孢呋辛钠', '西力欣', '0.75g/支', '粉针', 28.5, 'class_a', '2-3支/日')) list.push(IVDrugInfo.create(String(idx++), '头孢曲松钠', '罗氏芬', '1g/支', '粉针', 35.0, 'class_a', '1-2支/日')) // ... 至第 50 条 IVDrugDatabase.drugs = list }

自增序号的实现:使用 let idx = 1 配合 String(idx++) 实现自增 ID 的自动编号。idx++ 是后缀自增运算符,先返回当前值再自增,因此第一条记录的 ID 为"1",第二条为"2",依次递增。使用 String() 将数字转换为字符串类型,确保与 IVDrugInfo.id 字段的类型一致。这种自增模式避免了手动编写序号可能导致的跳号或重复错误。

数组构建方式:使用 const list: IVDrugInfo[] = [] 创建局部数组,通过 push() 方法逐条添加药物记录,最后将整个数组赋值给 IVDrugDatabase.drugs。这种"先构建后赋值"的方式比直接操作 IVDrugDatabase.drugs 更高效——避免了每次 push 时触发对静态字段的访问,也使得赋值操作是原子性的。

代码行数:init() 方法中 50 条药物记录各占一行 push 语句,加上首尾的控制逻辑,方法体约 55 行。整个类 99 行,其中数据定义占约 60%,体现了"数据驱动"的设计特征——类的核心价值在于其携带的数据,而非算法逻辑。

2.4 搜索算法

2.4.1 线性扫描实现

ypescript static search(keyword: string): IVDrugInfo[] { IVDrugDatabase.init() if (keyword.length === 0) { return IVDrugDatabase.drugs } const lower = keyword.toLowerCase() const results: IVDrugInfo[] = [] for (let i = 0; i < IVDrugDatabase.drugs.length; i++) { const d = IVDrugDatabase.drugs[i] if (d.genericName.toLowerCase().indexOf(lower) >= 0 || d.brandName.toLowerCase().indexOf(lower) >= 0) { results.push(d) } } return results }

算法流程

  1. 初始化保障:调用 init() 确保数据已加载
  2. 空关键词处理keyword.length === 0 时返回全部药物,即空搜索等同于浏览全数据库
  3. 大小写归一化:使用 toLowerCase() 将关键词和药物名称统一转换为小写,实现大小写不敏感的匹配
  4. 双向字段匹配:同时对 genericName(通用名)和 brandName(商品名)进行子串匹配
  5. 子串匹配:使用 indexOf() 方法实现子串包含检测——indexOf(lower) >= 0 表示目标字符串中包含搜索关键词
2.4.2 复杂度分析

时间复杂度:O(n × m),其中 n 为药物记录数(50),m 为药物名称字符串的平均长度。indexOf() 的内部实现为 O(m) 的字符串扫描。总体时间复杂度为 O(n × m),在 n=50 的规模下,即使 m 较长,总运算量也极小。

空间复杂度:O(k),其中 k 为匹配结果的数量。每次搜索创建一个新的结果数组,不修改原始数据库。

实际性能估算:假设药物名称平均长度为 10 个字符,50 条记录的扫描总操作数约为 50 × 10 = 500 次字符比较。在现代移动处理器上,单次字符比较耗时约 1 纳秒,总耗时约 500 纳秒,远低于用户可感知的 100 毫秒阈值。

2.4.3 搜索场景示例
输入关键词 匹配字段 匹配药物
“头孢” genericName 头孢呋辛钠、头孢曲松钠
“西力欣” brandName 头孢呋辛钠
“钠” genericName/brandName 头孢呋辛钠、头孢曲松钠、青霉素钠…
“葡萄糖” genericName 葡萄糖5%、葡萄糖10%、葡萄糖氯化钠、葡萄糖酸钙
“洛赛克” brandName 奥美拉唑
“” (空) - 返回全部 50 种药物
2.4.4 为什么不用更高效的数据结构

面对 50 条记录,线性扫描已足够高效。但即使考虑未来扩展到数百甚至上千条药物记录,是否应该使用更高效的数据结构?答案取决于具体的搜索需求和数据规模:

数据结构 查找复杂度 构建复杂度 适用场景
线性数组 O(n×m) O(1) 小规模、低频搜索
哈希表 O(1) 精确匹配 O(n) 精确查找,不支持模糊搜索
Trie 树 O(m) 前缀匹配 O(n×m) 自动补全、前缀搜索
倒排索引 O(m) 子串匹配 O(n×m²) 全文检索、大规模数据

当前 IVGuard 的搜索需求是子串包含匹配(而非前缀匹配或精确匹配),这使得哈希表和 Trie 树都不适用。倒排索引虽然支持子串匹配,但构建和维护复杂度较高,在 50 条记录的规模下属于过度工程。

线性扫描的隐藏优势

  1. 搜索逻辑简单:一个 for 循环 + indexOf 调用,代码可读性极高
  2. 无额外内存开销:不需要维护索引数据结构
  3. 搜索结果天然有序:结果按数据库中的排列顺序返回,而数据库按治疗类别排列,具有临床逻辑
  4. 扩展字段方便:未来如需搜索 specification 字段,只需在循环中添加一个 || 条件,无需修改索引

2.5 数据库访问接口总览

IVDrugDatabase 提供三个公共访问方法,覆盖了所有数据访问场景:

方法 返回类型 功能 调用场景
search(keyword) IVDrugInfo[] 关键词搜索,空关键词返回全部 MedicineDetailPage 搜索框、CostPage 药品选择
getById(id) IVDrugInfo | undefined 按ID精确查找 CostService 费用计算时查询药品医保分类
getAll() IVDrugInfo[] 返回全部药物 浏览全库、批量导出

getById() 方法详解

ypescript static getById(id: string): IVDrugInfo | undefined { IVDrugDatabase.init() for (let i = 0; i < IVDrugDatabase.drugs.length; i++) { if (IVDrugDatabase.drugs[i].id === id) { return IVDrugDatabase.drugs[i] } } return undefined }

返回类型为 IVDrugInfo | undefined,当指定 ID 不存在时返回 undefined。调用方必须处理 undefined 的情况,这在 CostService 中体现为:

ypescript const drugInfo: IVDrugInfo | undefined = IVDrugDatabase.getById(item.drugId) if (drugInfo !== undefined) { // 使用 drugInfo 的医保分类 } else { // drugId 无效,归入自费药品 }

这种 undefined 返回值的设计遵循了 ArkTS 的空值安全原则——不存在的记录返回 undefined 而非 null 或空对象,调用方通过类型系统就能感知到"可能不存在"的情况,避免遗漏空值检查。


3. DrugDatabase配伍禁忌检测

3.1 配伍禁忌的临床意义

3.1.1 配伍禁忌的定义

配伍禁忌(Drug Incompatibility / Drug Interaction)是指两种或两种以上药物联合使用时,在体外(物理化学配伍禁忌)或体内(药理学配伍禁忌)产生的不良相互作用。在静脉输液场景中,配伍禁忌尤为重要,因为静脉给药直接进入血液循环,药物间相互作用的速度和强度远超口服给药。

配伍禁忌可分为两大类:

体外配伍禁忌(物理化学配伍禁忌):药物在混合时发生的物理或化学变化,导致药效降低或产生有害物质。典型例子包括:

  • 沉淀反应:头孢曲松钠与含钙输液混合形成头孢曲松钙沉淀,可能堵塞输液管或导致微粒栓塞
  • 氧化还原反应:维生素C(还原剂)破坏维生素B12(含钴复合物)
  • 酸碱中和:碱性药物与酸性药物混合导致 pH 值变化,可能使药物降解

体内配伍禁忌(药理学配伍禁忌):药物在体内产生的药效学或药代动力学相互作用,导致疗效减弱或毒性增强。典型例子包括:

  • 毒性叠加:万古霉素和庆大霉素均有肾毒性,合用时肾损伤风险显著增加
  • 药效拮抗:地塞米松升高血糖,抵消胰岛素的降糖作用
  • 代谢抑制:奥美拉唑抑制CYP2C19酶,减少氯吡格雷活性代谢物生成
3.1.2 静脉输液场景的特殊性

静脉输液场景的配伍禁忌检测有其独特的挑战和紧迫性:

  1. 直接入血:静脉给药绕过了胃肠道的屏障作用和肝脏的首过效应,药物 100% 进入血液循环。任何配伍禁忌产生的不良反应都会迅速且强烈地表现出来。

  2. 混合给药普遍:临床常将多种药物加入同一瓶输液中,或通过同一输液管路先后滴注。药物之间的物理接触和化学反应在输液袋和输液管中直接发生。

  3. 不可逆性:一旦配伍禁忌反应发生(如沉淀形成),已经注入患者体内的药物无法撤回。这与口服给药不同——口服药物尚可通过催吐或洗胃减少吸收。

  4. 高危人群:需要静脉输液的患者通常病情较重,生理代偿能力差,对药物不良反应的耐受性低。新生儿、老年人和肾功能不全患者更是配伍禁忌的高危人群。

  5. 时间紧迫:急诊输液场景下,护士需要在极短时间内完成药物配制和给药,配伍禁忌检测必须即时完成,不能有延迟。

3.1.3 在临床工作流程中的位置

配伍禁忌检测在 IVGuard 的临床工作流程中处于关键的安全关口位置:

医嘱开具 -> 药师审核 -> 护士取药 -> 【配伍禁忌检测】 -> 药物配制 -> 开始输液 -> 持续监控 ^ IVGuard 检测点

IVGuard 的配伍禁忌检测发生在护士取药之后、药物配制之前,是对药师审核的二次安全确认。在以下场景中尤为重要:

  • 非工作时间:夜间和节假日药师可能不在岗,护士需要自行判断药物配伍安全性
  • 急诊场景:时间紧迫,药师审核流程可能被简化
  • 多药联用:当同时使用3种以上静脉药物时,配伍组合数量急剧增加,人工判断容易遗漏

3.2 三级严重度体系

DrugDatabase 的配伍规则采用三级严重度体系(dangerwarninginfo),这一设计遵循了临床药学中对药物相互作用严重程度的标准分级方法。

3.2.1 分级设计
级别 编码值 语义 临床含义 UI 呈现 护士应采取的行动
危险 danger 禁止合用 严重不良反应风险,可能导致患者伤害或死亡 红色警告卡片,顶部显著位置 立即停止,联系医生调整医嘱
警告 warning 需谨慎合用 可能产生不良反应,需特殊监测或调整给药方案 橙色提示卡片 注意观察,必要时调整给药顺序/间隔
信息 info 需关注 存在药效学相互作用,但不一定有害,可能有益 蓝色通知卡片 了解即可,一般无需特殊处理
3.2.2 临床依据

danger(危险)级别的判定标准

  • 合用可能导致严重、不可逆的不良反应
  • 已有明确的临床不良事件报告
  • 药品说明书明确标注为禁忌
  • 监管机构(FDA、NMPA等)已发布安全警告

典型例子:头孢曲松钠与钙剂合用可形成致死性沉淀,FDA 于 2007 年发布安全警告,明确规定头孢曲松不得与含钙输液同时使用,尤其在新生儿中曾导致死亡案例。

warning(警告)级别的判定标准

  • 合用可能增加不良反应风险,但通过调整给药方案可降低风险
  • 有临床研究证据支持,但结果存在争议
  • 需要额外的临床监测(如血药浓度监测、肾功能监测)

典型例子:青霉素与庆大霉素合用有协同抗菌作用(这是有益的),但青霉素的beta-内酰胺环可使氨基糖苷类灭活,因此需分开给药。这不是绝对禁忌,但需要调整给药方式。

info(信息)级别的判定标准

  • 存在药效学或药代动力学相互作用
  • 相互作用可能有益(协同作用)或轻微有害
  • 一般不需要改变给药方案,但临床工作者应知晓

典型例子:氨溴索可促进抗生素向肺组织渗透,这是一种有益的协同作用,无需改变给药方案,但临床药师应了解这一相互作用。

3.3 12条配伍规则详解

DrugDatabase 内置了 12 条药物相互作用记录,其中 danger 级别 6 条、warning 级别 4 条、info 级别 2 条。每条规则包含药物A、药物B、严重程度和描述四个字段。以下逐一详解每条规则的机制、后果和处理建议。

3.3.1 danger 级别规则(6条)

规则1:头孢呋辛钠 + 庆大霉素

ypescript DrugInteraction.create('头孢呋辛钠', '庆大霉素', 'danger', '头孢类与氨基糖苷类合用增加肾毒性')

  • 机制:头孢菌素类(尤其是第一、二代)和氨基糖苷类均具有肾毒性。两者合用时,肾毒性产生协同效应——头孢菌素可加重氨基糖苷类对近端肾小管的损伤,而氨基糖苷类也可增强头孢菌素对肾间质的损害。这种协同效应使得合用时的肾损伤风险远高于单独使用任一药物。
  • 后果:急性肾小管坏死、急性肾功能衰竭,尤其在高剂量、长疗程、老年患者和脱水状态下风险更高。血肌酐升高、少尿或无尿是早期预警信号。
  • 处理建议:避免合用。如必须联合抗感染,可考虑:①使用无肾毒性的抗生素替代;②降低两药剂量;③延长给药间隔;④密切监测肾功能(每48小时查血肌酐)。

规则2:头孢曲松钠 + 钙剂

ypescript DrugInteraction.create('头孢曲松钠', '钙剂', 'danger', '头孢曲松与含钙输液配伍可形成沉淀')

  • 机制:头孢曲松钠在体外可与钙离子形成不溶性的头孢曲松钙沉淀。这一反应的化学原理是头孢曲松分子中的羧基与钙离子的螯合反应。沉淀可在输液袋、输液管或患者血管内形成,导致致命性的微栓塞。
  • 后果:新生儿和婴幼儿中曾有致死案例报告(2007年FDA安全通讯)。沉淀可在肺、肾等器官形成微栓塞,导致器官功能障碍。在成人中虽然风险相对较低,但仍应避免配伍。
  • 处理建议:绝对禁止在同一输液袋或同一输液管路中同时使用头孢曲松和含钙制剂。如需序贯使用,应先用一种药物输注完毕,用0.9%氯化钠冲管后再使用另一种。葡萄糖酸钙(数据库中收录)和乳酸林格液(含钙)均属于"钙剂"范畴。

规则3:氯化钾 + 螺内酯

ypescript DrugInteraction.create('氯化钾', '螺内酯', 'danger', '保钾利尿剂与钾盐合用可致高钾血症')

  • 机制:螺内酯是保钾利尿剂,通过拮抗醛固酮的作用减少钾的排泄。氯化钾是钾盐补充剂,直接增加体内钾离子浓度。两者合用导致钾的"入口增加、出口减少",血钾浓度可迅速升高至危险水平。
  • 后果:高钾血症可导致心脏传导异常——心电图出现T波高尖、QRS波增宽,严重时可致心室颤动和心脏骤停。血钾 > 6.5 mmol/L 为急症,需立即处理。
  • 处理建议:禁止合用。如患者确需补钾,应改用排钾利尿剂(如呋塞米),或在使用螺内酯期间通过饮食补钾而非药物补钾,并密切监测血钾水平。

规则4:万古霉素 + 庆大霉素

ypescript DrugInteraction.create('万古霉素', '庆大霉素', 'danger', '两者合用增加肾毒性和耳毒性')

  • 机制:万古霉素和庆大霉素分别通过不同的机制损伤肾脏和内耳。万古霉素主要引起肾小管间质性肾炎,庆大霉素主要损伤近端肾小管上皮细胞。两者合用时,肾毒性和耳毒性均产生协同效应。耳毒性的机制是两药均可损伤内耳毛细胞,且损伤不可逆。
  • 后果:急性肾功能衰竭(发生率可达 20-30%),不可逆性听力丧失(尤其在高频段)。这种联合毒性使得两者合用的风险-收益比极差。
  • 处理建议:避免合用。如必须联合使用(如耐药菌感染),应:①监测血药浓度(万古霉素谷浓度 15-20 μg/mL,庆大霉素峰浓度和谷浓度);②每日监测血肌酐;③疗程尽量缩短;④告知患者听力损害风险。

规则5:葡萄糖酸钙 + 地高辛

ypescript DrugInteraction.create('葡萄糖酸钙', '地高辛', 'danger', '钙剂可增强洋地黄类心脏毒性')

  • 机制:地高辛是洋地黄类强心苷,通过抑制 Na⁺/K⁺-ATP 酶发挥正性肌力作用。钙离子与洋地黄在心肌细胞内具有协同效应——细胞内钙浓度升高可增强洋地黄的正性肌力作用,但同时也增加心律失常的发生风险。静脉注射钙剂可迅速升高血钙浓度,在洋地黄化患者中诱发致命性心律失常。
  • 后果:室性心动过速、心室颤动、心脏骤停。这种相互作用是静脉注射配伍中最为危险的之一——钙剂注射后数分钟内即可诱发心律失常。
  • 处理建议:禁止在洋地黄化患者中静脉注射钙剂。如确需补钙,应:①缓慢口服补钙而非静脉注射;②如必须静脉补钙,应极缓慢滴注并在心电监护下进行;③监测血钙和地高辛血药浓度。

规则6:阿莫西林 + 甲氨蝶呤

ypescript DrugInteraction.create('阿莫西林', '甲氨蝶呤', 'danger', '青霉素类可减少甲氨蝶呤清除,增加毒性')

  • 机制:甲氨蝶呤(MTX)主要通过肾脏排泄,约 70-90% 以原形从尿中排出。青霉素类(如阿莫西林)可竞争性抑制甲氨蝶呤在肾小管的分泌转运,减少其肾脏清除率。此外,青霉素还可与甲氨蝶呤竞争血浆蛋白结合位点,增加游离甲氨蝶呤浓度。
  • 后果:甲氨蝶呤血药浓度显著升高,导致骨髓抑制(白细胞减少、血小板减少)、黏膜溃疡、肝功能损害。在大剂量甲氨蝶呤化疗方案中,这种相互作用可能致命。
  • 处理建议:避免合用。如患者在甲氨蝶呤治疗期间需要抗生素,应选择非青霉素类(如大环内酯类、四环素类)。如必须使用青霉素,应减少甲氨蝶呤剂量并密切监测血药浓度和血常规。
3.3.2 warning 级别规则(4条)

规则7:青霉素钠 + 庆大霉素

ypescript DrugInteraction.create('青霉素钠', '庆大霉素', 'warning', '青霉素与氨基糖苷类有协同作用但需分开给药')

  • 机制:青霉素和庆大霉素在体外混合时,青霉素的beta-内酰胺环可与氨基糖苷类的氨基发生酰化反应,使氨基糖苷类灭活。这种化学灭活在体内同样可以发生——如果在同一输液瓶中混合两种药物。
  • 后果:如果在同一输液瓶中混合给药,庆大霉素的抗菌活性可降低 50% 以上。但分开给药时,两药在体内具有协同抗菌作用(青霉素破坏细胞壁,促进氨基糖苷类进入菌体内),这是有益的药效学相互作用。
  • 处理建议:分开给药。两药应分别配制于不同的输液瓶中,间隔至少 1 小时输注。不可在同一输液瓶或同一输液管路中混合。

规则8:左氧氟沙星 + NSAIDs

ypescript DrugInteraction.create('左氧氟沙星', 'NSAIDs', 'warning', '喹诺酮类与非甾体抗炎药合用增加癫痫风险')

  • 机制:喹诺酮类抗生素(如左氧氟沙星)可拮抗中枢神经系统的 GABA 受体,降低癫痫发作阈值。非甾体抗炎药(NSAIDs)同样可影响中枢神经系统的前列腺素代谢,间接降低癫痫阈值。两者合用时,癫痫风险产生叠加效应。
  • 后果:癫痫发作风险增加,尤其在有癫痫病史、严重肾功能不全或老年患者中。虽然总体发生率不高(<1%),但一旦发生可能危及生命。
  • 处理建议:有癫痫病史者避免合用。如必须合用,应选择癫痫风险较低的喹诺酮,避免使用高剂量 NSAIDs,并告知患者癫痫发作的先兆症状。

规则9:奥美拉唑 + 氯吡格雷

ypescript DrugInteraction.create('奥美拉唑', '氯吡格雷', 'warning', '质子泵抑制剂可能降低氯吡格雷抗血小板效果')

  • 机制:氯吡格雷是前体药物,需经肝脏 CYP2C19 酶代谢为活性产物才能发挥抗血小板作用。奥美拉唑是 CYP2C19 的强抑制剂,可显著减少氯吡格雷活性代谢物的生成,降低其抗血小板效果约 30-50%。这一相互作用在临床上极具争议性——虽然药代动力学证据明确,但临床结局研究结果不一致。
  • 后果:氯吡格雷抗血小板效果减弱,可能增加心血管事件(支架血栓、心肌梗死)风险。对于冠脉支架植入术后的患者,这一相互作用的临床意义最为重大。
  • 处理建议:如需合用质子泵抑制剂,优先选择对 CYP2C19 抑制作用较弱的泮托拉唑或雷贝拉唑。或者改用 H₂受体拮抗剂替代 PPI 进行胃保护。IVGuard 当前未收录氯吡格雷(其为口服片剂),但此规则作为重要临床提示予以收录。

规则10:地塞米松 + 胰岛素

ypescript DrugInteraction.create('地塞米松', '胰岛素', 'warning', '糖皮质激素可升高血糖,拮抗胰岛素作用')

  • 机制:糖皮质激素(地塞米松)通过多个途径升高血糖:①促进肝糖原分解和糖异生;②抑制外周组织对葡萄糖的摄取和利用;③降低胰岛素受体的敏感性。胰岛素则通过促进葡萄糖利用和抑制糖异生来降低血糖。两者在血糖调节上产生拮抗效应。
  • 后果:糖尿病患者使用糖皮质激素时血糖控制困难,胰岛素需要量可能增加 2-3 倍。非糖尿病患者可能出现类固醇性糖尿病。在输液场景中,地塞米松加入胰岛素输液中可能导致血糖波动,增加监测频率的需求。
  • 处理建议:糖尿病患者使用糖皮质激素期间应增加血糖监测频率(每4-6小时一次),必要时增加胰岛素剂量。对于静脉输液中同时含地塞米松和胰岛素的情况,护士应特别关注血糖变化趋势。
3.3.3 info 级别规则(2条)

规则11:氨溴索 + 抗生素

ypescript DrugInteraction.create('氨溴索', '抗生素', 'info', '氨溴索与抗生素有协同作用,促进抗生素向肺组织渗透')

  • 机制:氨溴索可改变呼吸道黏膜的物理化学性质,降低痰液黏稠度,改善气道通气。更重要的是,氨溴索可增加抗生素(如阿莫西林、头孢呋辛、左氧氟沙星)在肺组织和呼吸道分泌物中的浓度,提高感染部位的药物暴露量。其机制与氨溴索促进肺泡表面活性物质分泌、改善肺泡-毛细血管屏障通透性有关。
  • 后果:这是一种有益的药效学协同作用,可提高呼吸道感染的治疗效果,缩短抗生素疗程。
  • 处理建议:无需特殊处理。了解这一协同作用即可,在制定抗感染方案时可加以利用。临床实践中,氨溴索与抗生素联合使用已成为呼吸道感染的常规治疗方案。

规则12:维生素C + 维生素B12

ypescript DrugInteraction.create('维生素C', '维生素B12', 'info', '大剂量维生素C可破坏维生素B12')

  • 机制:大剂量维生素C(抗坏血酸)是强还原剂,在体外和体内均可破坏维生素B12(氰钴胺)的分子结构。维生素B12分子中心的钴离子可被维生素C还原,导致钴胺辅酶失活。这种破坏作用在体外混合时更为明显,在体内由于存在多种保护机制,影响相对较小。
  • 后果:长期大剂量维生素C(>1g/日)可能影响维生素B12的营养状况,但短期静脉注射常规剂量维生素C通常不会产生显著影响。对于维生素B12缺乏的患者,需注意避免大剂量维生素C。
  • 处理建议:一般无需特殊处理。对于已知维生素B12缺乏的患者,应避免大剂量维生素C与维生素B12在同一输液瓶中混合,可先后间隔使用。
3.3.4 规则覆盖率分析

12 条配伍规则覆盖了 50 种药物中的部分品种。以下分析规则的覆盖范围:

涉及规则的药物品种

药物 涉及规则数 规则级别
庆大霉素 3 danger×2, warning×1
钙剂(葡萄糖酸钙/乳酸林格液) 2 danger×2
头孢呋辛钠 1 danger
头孢曲松钠 1 danger
氯化钾 1 danger
螺内酯 1 danger
万古霉素 1 danger
地高辛 1 danger
阿莫西林 1 danger
青霉素钠 1 warning
左氧氟沙星 1 warning
奥美拉唑 1 warning
地塞米松 1 warning
胰岛素 1 warning
氨溴索 1 info
维生素C 1 info

覆盖率统计

  • 50 种药物中,有 15 种被至少 1 条规则覆盖(30%)
  • 庆大霉素是涉及规则最多的药物(3条),反映了氨基糖苷类抗生素在配伍禁忌中的高风险地位
  • 6 条 danger 规则涉及 9 种药物,其中 7 种在数据库中有收录
  • 规则中存在两个"虚拟"药物条目:钙剂NSAIDs——它们不是数据库中的具体药物名,而是类别名。这意味着当前搜索匹配逻辑无法将"葡萄糖酸钙"匹配到"钙剂"规则。这是 MVP 版本的已知局限,后续版本需要引入类别映射机制。

未覆盖的高风险药物:数据库中收录但未涉及任何配伍规则的药物中,部分也存在已知的配伍禁忌,如亚胺培南西司他丁与丙磺舒的相互作用、硝普钠的特殊配伍要求等。这些未覆盖的配伍禁忌将在后续版本中逐步补充。

3.4 组合检测算法

3.4.1 算法原理

DrugDatabase 的 checkInteractions() 方法实现了对药物组合的配伍禁忌检测,算法采用三重嵌套循环遍历所有药物对和所有规则:

ypescript static checkInteractions(drugNames: string[]): DrugInteraction[] { DrugDatabase.init() const results: DrugInteraction[] = [] for (let i = 0; i < drugNames.length; i++) { for (let j = i + 1; j < drugNames.length; j++) { const nameA = drugNames[i] const nameB = drugNames[j] for (let k = 0; k < DrugDatabase.interactions.length; k++) { const inter = DrugDatabase.interactions[k] if ((inter.drugA === nameA && inter.drugB === nameB) || (inter.drugA === nameB && inter.drugB === nameA)) { results.push(inter) } } } } return results }

3.4.2 双向匹配

算法的核心匹配条件是双向匹配:

ypescript if ((inter.drugA === nameA && inter.drugB === nameB) || (inter.drugA === nameB && inter.drugB === nameA))

这意味着无论规则中药物A和药物B的顺序如何,都能被正确匹配。例如,规则定义为 DrugInteraction.create('头孢呋辛钠', '庆大霉素', 'danger', ...) ,当输入药物列表为 ['庆大霉素', '头孢呋辛钠'] 时,第二个条件 inter.drugA === nameB && inter.drugB === nameA 成立,规则被正确匹配。

这一设计的必要性在于:用户添加药物的顺序是随机的,不能假设规则中 drugA 一定先于 drugB 被添加。双向匹配消除了顺序依赖,使得规则的编写和维护更加灵活。

外层循环的 j = i + 1 优化

ypescript for (let i = 0; i < drugNames.length; i++) { for (let j = i + 1; j < drugNames.length; j++) {

j = i + 1 确保每对药物只比较一次,避免了 (A, B) 和 (B, A) 的重复比较。对于 n 种药物,需要比较的药物对数量为 C(n, 2) = n × (n-1) / 2,而非 n × (n-1)。例如,5 种药物只需比较 10 对,而非 20 对。

3.4.3 复杂度分析

时间复杂度:O(n² × m),其中 n 为输入药物数量,m 为配伍规则数量(当前为 12)。

具体运算量分析:

药物数量 n 药物对数 C(n,2) 规则数 m 比较操作数
2 1 12 12
3 3 12 36
5 10 12 120
10 45 12 540
20 190 12 2280

在典型的输液场景中,同时使用的药物通常不超过 5 种,比较操作数仅为 120,性能完全不是瓶颈。即使考虑极端场景(20 种药物同时使用),2280 次字符串比较也只需微秒级别。

空间复杂度:O®,其中 r 为匹配的相互作用数量。在最坏情况下(所有药物对都匹配到规则),r = C(n, 2) = n × (n-1) / 2。实际上,配伍规则的匹配率极低,r 通常为 0-2。

3.4.4 优化方向

当前算法虽然简单有效,但存在几个已知的局限性,后续版本可以考虑以下优化方向:

1. 药物类别匹配:当前规则使用精确字符串匹配,无法识别药物类别。例如,“葡萄糖酸钙"无法匹配到规则中的"钙剂”。解决方案是引入类别映射表:

ypescript const categoryMap: Record<string, string[]> = { '钙剂': ['葡萄糖酸钙', '氯化钙'], 'NSAIDs': ['布洛芬', '双氯芬酸钠', '吲哚美辛'], '抗生素': ['头孢呋辛钠', '头孢曲松钠', '青霉素钠', '阿莫西林克拉维酸钾'] }

2. 药名模糊匹配:当前规则要求药物名称完全一致。“阿莫西林克拉维酸钾"无法匹配规则中的"阿莫西林”。解决方案是引入药名标准化映射,或在规则中使用成分名匹配。

3. 三药联合检测:当前算法仅检测两两组合。某些三药联合可能产生间接的配伍禁忌(如A和B可合用,B和C可合用,但A+B+C存在风险),当前算法无法检测。

4. 结果去重:当前算法不处理规则重复的情况。如果规则库中存在 (A, B) 和 (B, A) 两条规则,匹配结果会出现重复。

3.5 DrugInteraction数据模型

` ypescript
export class DrugInteraction {
drugA: string = ‘’
drugB: string = ‘’
severity: string = ‘warning’
description: string = ‘’

static create(drugA: string, drugB: string, severity: string, desc: string): DrugInteraction {
const d = new DrugInteraction()
d.drugA = drugA
d.drugB = drugB
d.severity = severity
d.description = desc
return d
}
}
`

字段设计

  • drugAdrugB:使用药物通用名作为匹配键,而非药物ID。这一选择使得规则与具体数据库条目解耦——规则可以在药物未被收录的情况下仍然存在(如"NSAIDs"和"钙剂"不在药物数据库中,但规则需要引用这些类别)。通用名匹配也更符合临床思维——护士凭药物名称即可理解规则含义,无需额外的ID映射。

  • severity:默认值为 'warning',这是"最安全"的默认级别——如果因某种原因 severity 字段未被正确赋值,规则至少以 warning 级别呈现,不会因为遗漏而将 danger 级别的规则降级显示。

  • description:简洁描述相互作用的机制和后果,作为护士的快速参考信息。描述采用"原因+后果"的句式结构,如"头孢类与氨基糖苷类合用增加肾毒性"——前半句说明机制,后半句说明后果。

为什么没有 id 字段

DrugInteraction 是只读的参考数据,不涉及持久化存储和独立检索。它总是作为 DrugDatabase 的内部数据批量加载和查询,不需要唯一标识。其唯一性由 (drugA, drugB) 组合隐式确定——同一对药物不应有多条规则。

与 IVDrugInfo 的关系

DrugInteraction 中的 drugA/drugB 字段与 IVDrugInfo 中的 genericName 字段存在逻辑关联,但在代码层面没有强制的外键约束。这意味着:

  1. 规则中的药物名可能与数据库中的通用名不完全匹配(如"阿莫西林" vs “阿莫西林克拉维酸钾”)
  2. 规则可能引用数据库中不存在的药物(如"NSAIDs"、“钙剂”、“氯吡格雷”)
  3. 数据库中可能有药物未被任何规则覆盖

这种松耦合设计在 MVP 阶段是合理的——规则和药物数据库可以独立迭代,不受对方约束。后续版本可通过药名标准化映射来增强两者的关联精度。


3.6 AIService中的配伍检测桥接

DrugDatabase 的配伍检测能力通过 AIService 桥接到 UI 层。AIService 在药物数据和配伍规则之间充当了适配器的角色:

` ypescript
import { DrugInteraction, Medicine } from ‘…/model/DataModels’
import { DrugDatabase } from ‘…/model/DrugDatabase’

export class AIService {
static checkDrugInteractions(medicines: Medicine[]): DrugInteraction[] {
const names: string[] = []
for (let i = 0; i < medicines.length; i++) {
names.push(medicines[i].name)
}
return DrugDatabase.checkInteractions(names)
}
// … 其他 AI 分析方法
}
`

适配器模式的体现

AIService 的 checkDrugInteractions() 方法完成了从 Medicine[]string[] 的类型转换——将 Medicine 对象列表提取为药物名称列表,再传递给 DrugDatabase 进行检测。这一层转换看似简单,实则承担了重要的架构职责:

  1. 解耦 UI 与数据层:MedicinePage 和 MedicineDetailPage 只依赖 AIService,不直接依赖 DrugDatabase。如果未来 DrugDatabase 的接口变更(如改为异步),只需修改 AIService 的适配逻辑,UI 层无需变动。

  2. 统一的 AI 服务入口:AIService 是 IVGuard 中所有智能分析功能的统一入口,包括配伍检测、流速异常检测和输液完成预估。将配伍检测归入 AIService 使得 UI 层只需调用一个服务即可获取所有智能分析结果,简化了调用方式。

  3. 预留扩展空间:AIService 的方法签名接收 Medicine[] 而非 string[],这意味着未来可以在检测逻辑中利用 Medicine 对象的更多属性(如 dosage、volume、drugDbId 等)进行更精细的检测,而无需修改调用方代码。

数据流转链路

用户添加药物 | v MedicinePage.addMedicine() | +-- Medicine.create() --> medicines: Medicine[] | +-- DataStore.saveMedicines(medicines) | +-- AIService.checkDrugInteractions(medicines) | +-- 提取 medicines[i].name --> names: string[] | +-- DrugDatabase.checkInteractions(names) | +-- DrugDatabase.init() // 懒加载12条规则 | +-- 三重循环匹配 | +-- 返回 DrugInteraction[] | +-- 返回 DrugInteraction[] | v this.interactions = results | v UI 自动刷新(@State 响应式)

性能特征:在典型输液场景(2-5种药物)中,AIService.checkDrugInteractions() 的总执行时间包括:

步骤 耗时估算 说明
Medicine[] → string[] <1μs 简单的 for 循环提取
DrugDatabase.init() <10μs 首次调用时加载12条规则,后续调用直接返回
checkInteractions() <10μs 5种药物×12条规则=120次比较
总计 <25μs 远低于用户可感知的阈值

3.7 配伍检测的局限性声明

IVGuard 的配伍禁忌检测功能存在以下局限性,用户和临床工作者必须充分了解:

规则库不完整:12 条规则仅覆盖了极小部分的已知药物相互作用。据 Micromedex 数据库统计,临床有意义的药物相互作用超过 2000 组,IVGuard 当前仅覆盖了约 0.6%。未检测到配伍禁忌并不意味着药物组合是安全的。

精确匹配的限制:当前算法使用精确字符串匹配,无法识别以下情况:

  • 同一药物的不同命名(“地塞米松” vs “地塞米松磷酸钠”)
  • 药物类别名称(“钙剂"无法匹配"葡萄糖酸钙”)
  • 缩写和简称(“NSAIDs"无法匹配"布洛芬”)

不检测体外配伍:当前规则侧重于体内药理学相互作用,未涵盖体外物理化学配伍禁忌(如同一输液瓶中的沉淀反应、pH 值变化等)。这些体外配伍禁忌在临床输液操作中同样重要。

不考虑患者个体因素:当前检测不考虑患者的肾功能、年龄、体重、过敏史等个体因素,而这些因素可能显著影响相互作用的严重程度。

不提供剂量依赖性分析:许多药物相互作用的严重程度取决于剂量。当前规则是"定性"的(danger/warning/info),未提供剂量-效应关系的定量分析。

建议的免责表述:在 MedicinePage 的配伍禁忌显示区域,应增加以下免责声明:

药物相互作用检测仅供参考,检测结果不构成医疗建议。临床用药必须以医嘱和药师审核为准。未检测到相互作用不代表药物组合安全。

—## 4. MedicinePage中的药物管理

4.1 药物添加/删除/搜索交互

MedicinePage 是护士端药物管理的核心页面,提供了药物列表展示、添加、搜索和配伍禁忌检测的完整交互流程。

ypescript @Entry @Component struct MedicinePage { @State medicines: Medicine[] = [] @State interactions: DrugInteraction[] = [] @State searchKeyword: string = '' @State showAddDialog: boolean = false @State newMedName: string = '' @State newMedDosage: string = '' @State newMedVolume: string = '500' // ... }

4.1.1 状态管理

MedicinePage 使用 7 个 @State 装饰器管理页面状态:

状态变量 类型 用途 初始值
medicines Medicine[] 当前输液使用的药物列表 []
interactions DrugInteraction[] 当前检测到的配伍禁忌 []
searchKeyword string 搜索关键词 ''
showAddDialog boolean 添加药物弹窗显示状态 false
newMedName string 新药物名称 ''
newMedDosage string 新药物剂量 ''
newMedVolume string 新药物总量(ml) '500'

medicinesinteractions 是页面的核心数据状态,它们之间存在联动关系:每当 medicines 变化时,interactions 需要重新计算。这一联动在 addMedicine() 方法中体现。

newMedVolume 的初始值为字符串 '500' 而非数字 500,这是因为 TextInput 组件的 text 参数和 onChange 回调均为字符串类型。将数值存储为字符串简化了输入处理,仅在需要计算时通过 parseInt() 转换。

4.1.2 搜索流程

MedicinePage 本身不提供药物数据库搜索功能(搜索功能在 MedicineDetailPage 中提供),但通过 searchKeyword 状态预留了搜索入口。实际搜索流程发生在 MedicineDetailPage 中:

MedicineDetailPage | +-- TextInput.onChange | +-- IVDrugDatabase.search(value) | +-- 返回 IVDrugInfo[] | +-- 取前5条结果 | +-- 提取 genericName | +-- 更新 searchResults: string[] | +-- 搜索结果列表 +-- 用户点击某项 +-- medicine.name = name +-- 清空搜索框和结果

搜索在用户每次输入时实时触发(onChange 回调),结果限制为最多 5 条,避免列表过长影响界面布局。这种"边输边搜"的交互模式充分利用了本地数据库的即时查询能力,不需要搜索按钮或防抖延迟。

4.1.3 添加流程

药物添加流程涉及 MedicinePage 和 MedicineDetailPage 的协作:

MedicinePage 的快速添加

ypescript private addMedicine(): void { const vol = parseInt(this.newMedVolume) || 500 const med = Medicine.create(this.newMedName, this.newMedDosage, vol) this.medicines.push(med) DataStore.saveMedicines(this.medicines) this.interactions = AIService.checkDrugInteractions(this.medicines) this.showAddDialog = false this.newMedName = '' this.newMedDosage = '' this.newMedVolume = '500' }

快速添加流程的关键步骤:

  1. 解析容量parseInt(this.newMedVolume) || 500 将字符串转换为整数,解析失败时默认 500ml
  2. 创建 Medicine 实例:调用 Medicine.create() 工厂方法,自动生成 id 和 addedAt
  3. 追加到列表this.medicines.push(med) 将新药物添加到状态数组
  4. 持久化DataStore.saveMedicines() 将更新后的药物列表写入 Preferences
  5. 触发配伍检测AIService.checkDrugInteractions() 重新计算配伍禁忌
  6. 重置表单:清空所有输入字段,关闭弹窗

MedicineDetailPage 的详细添加

MedicineDetailPage 提供了更完整的药物添加入口,集成了 IVDrugDatabase 搜索、NFC 配对和保存功能。搜索框直接调用 IVDrugDatabase.search() 实现实时搜索,用户可以从搜索结果中选择药物名称自动填充。

4.1.4 检测触发时机

配伍禁忌检测在以下时机触发:

触发时机 代码位置 检测范围
页面加载 aboutToAppear()loadData() 当前所有已添加的药物
添加药物 addMedicine() 更新后的全部药物列表
删除药物 MedicineDetailPage 保存后返回 更新后的全部药物列表

值得注意的是,检测始终针对全部药物列表而非仅新增药物。这是因为配伍禁忌是药物间的两两关系,新增一种药物可能与已存在的所有药物产生相互作用,因此必须对完整列表重新检测。

4.2 配伍禁忌实时检测与UI展示

4.2.1 分类展示

MedicinePage 将检测到的配伍禁忌按严重程度分类展示在页面顶部:

ypescript if (this.interactions.length > 0) { Column() { ForEach(this.interactions, (inter: DrugInteraction) => { Row() { Text(inter.severity === 'danger' ? '!! ' : '! ') .fontColor(inter.severity === 'danger' ? '#F44336' : '#FF9800') .fontSize(14) Text(inter.description) .fontSize(12) .fontColor(inter.severity === 'danger' ? '#F44336' : '#FF9800') .layoutWeight(1) } .width('100%') .padding(8) }, (inter: DrugInteraction) => inter.drugA + inter.drugB) } .width('92%') .padding(12) .borderRadius(10) .backgroundColor('#FFF3E0') .margin({ bottom: 8 }) }

UI设计分析

设计要素 danger warning info
前缀标记 !! ! !
文字颜色 #F44336(红色) #FF9800(橙色) #FF9800(橙色)
容器背景 #FFF3E0(浅橙色) #FFF3E0(浅橙色) #FFF3E0(浅橙色)

当前实现中,danger 和 warning/info 的视觉区分主要体现在前缀标记(双感叹号 vs 单感叹号)和文字颜色(红色 vs 橙色),但容器背景色统一为浅橙色。这意味着 danger 级别的视觉冲击力还可以进一步增强——建议为 danger 级别使用 #FFEBEE(浅红色)背景,与 warning 的橙色背景形成更明确的区分。

ForEach 的 key 生成

ypescript (inter: DrugInteraction) => inter.drugA + inter.drugB

使用 drugA + drugB 拼接作为 ForEach 的 key,确保每条规则有唯一标识。由于 DrugInteraction 没有 id 字段,这种拼接方式是生成唯一 key 的简便方法。潜在风险:如果存在 (A, B) 和 (B, A) 两条规则(虽然当前数据不存在),它们会产生相同的 key,导致 ForEach 渲染异常。

4.2.2 卡片设计

每条药物记录使用 MedicineCard 组件渲染,该组件显示药物名称、剂量和容量,以及配伍禁忌警告标记:

ypescript MedicineCard({ medicine: med, hasInteraction: this.hasInteraction(med.name), onCardClick: () => { this.getUIContext().getRouter().pushUrl({ url: 'pages/MedicineDetailPage' }) } })

hasInteraction 方法检查某药物是否涉及任何配伍禁忌:

ypescript private hasInteraction(name: string): boolean { for (let i = 0; i < this.interactions.length; i++) { if (this.interactions[i].drugA === name || this.interactions[i].drugB === name) { return true } } return false }

MedicineCard 中,当 hasInteraction 为 true 时,在卡片底部显示"药物相互作用警告"红色标记:

ypescript if (this.hasInteraction) { Row() { Text('药物相互作用警告') .fontSize(12) .fontColor('#F44336') .padding({ left: 8, right: 8, top: 4, bottom: 4 }) .borderRadius(8) .backgroundColor('#FFEBEE') } .width('100%') .margin({ top: 8 }) }

这种双层提示设计——页面顶部的配伍禁忌详情 + 卡片上的警告标记——确保护士不会遗漏任何配伍问题。

4.2.3 即时反馈

配伍禁忌检测的即时性体现在两个层面:

  1. 添加即检测:每次添加药物后,AIService.checkDrugInteractions() 立即执行,结果实时更新到 interactions 状态变量。由于 @State 的响应式机制,UI 自动刷新,无需手动操作。

  2. 检测即展示interactions.length > 0 条件判断确保只有在存在配伍禁忌时才显示警告区域。当所有药物组合安全时,警告区域不占用任何界面空间。

4.3 药物详情页

MedicineDetailPage 提供了药物信息的详细编辑界面,集成了 IVDrugDatabase 搜索和 NFC 配对功能。

4.3.1 数据库搜索集成

ypescript TextInput({ placeholder: '搜索药品数据库', text: this.searchKeyword }) .width('100%') .onChange((value: string) => { this.searchKeyword = value this.searchResults = [] const results = IVDrugDatabase.search(value) for (let i = 0; i < results.length && i < 5; i++) { this.searchResults.push(results[i].genericName) } })

搜索结果展示为下拉列表,用户点击某项后自动填充药物名称:

ypescript ForEach(this.searchResults, (name: string) => { Row() { Text(name) .fontSize(14) .padding(8) .width('100%') .onClick(() => { this.medicine.name = name this.searchKeyword = '' this.searchResults = [] }) } .borderWidth({ bottom: 1 }) .borderColor('#EEEEEE') }, (name: string, index: number) => _)

搜索结果限制为 5 条,避免列表过长。点击搜索结果后,清空搜索框和结果列表,将选中的通用名填入药物名称字段。

4.3.2 保存与删除

MedicineDetailPage 的保存逻辑处理新建和编辑两种场景:

ypescript Button('保存') .onClick(() => { const medicines = DataStore.loadMedicines() if (this.medicine.id.length === 0) { this.medicine = Medicine.create(this.medicine.name, this.medicine.dosage, this.medicine.volume) medicines.push(this.medicine) } else { for (let i = 0; i < medicines.length; i++) { if (medicines[i].id === this.medicine.id) { medicines[i] = this.medicine break } } } DataStore.saveMedicines(medicines) this.getUIContext().getRouter().back() })

通过 medicine.id.length === 0 判断是新建还是编辑:新建时 id 为空字符串,调用 Medicine.create() 生成新实例;编辑时 id 已有值,在列表中找到对应记录并替换。


4.4 数据加载与生命周期

MedicinePage 的数据加载遵循以下生命周期流程:

` ypescript
aboutToAppear(): void {
const context = getContext(this) as common.UIAbilityContext
DataStore.init(context).then(() => {
this.loadData()
})
}

private loadData(): void {
this.medicines = DataStore.loadMedicines()
this.interactions = AIService.checkDrugInteractions(this.medicines)
}
`

异步初始化时序

MedicinePage.aboutToAppear() | +-- DataStore.init(context) // 返回 Promise | | | +-- Preferences 初始化 | | | +-- .then(() => { | this.loadData() | | | +-- DataStore.loadMedicines() // 同步读取 | | | | | +-- 返回 Medicine[] | | | +-- AIService.checkDrugInteractions() | | | +-- DrugDatabase.checkInteractions() | | | +-- DrugDatabase.init() // 首次触发 | | | +-- 返回 DrugInteraction[] })

DataStore.init() 是异步操作(返回 Promise),因为 Preferences 的初始化涉及文件 I/O。DataStore 初始化完成后,loadData() 才能安全地读取持久化数据。这种"先初始化再加载"的模式确保了数据访问的安全性。

DrugDatabase 的初始化时机:DrugDatabase.init() 在 AIService.checkDrugInteractions() 调用链中被首次触发。由于 DrugDatabase 采用数组长度守卫(interactions.length > 0),首次调用时加载 12 条配伍规则,后续调用直接跳过加载。这意味着配伍规则的加载发生在 MedicinePage 的 aboutToAppear 生命周期中,但延迟到实际需要检测时才执行。

4.5 添加药物弹窗设计

MedicinePage 的添加药物弹窗(addDialog)是一个模态对话框,提供三个输入字段:

` ypescript
@Builder
addDialog() {
Column({ space: 12 }) {
Text(‘添加药物’)
.fontSize(18)
.fontWeight(FontWeight.Bold)

TextInput({ placeholder: '药品名称', text: this.newMedName })
  .width('100%')
  .onChange((value: string) => {
    this.newMedName = value
  })

TextInput({ placeholder: '剂量(如:0.75g/支)', text: this.newMedDosage })
  .width('100%')
  .onChange((value: string) => {
    this.newMedDosage = value
  })

TextInput({ placeholder: '总量(ml)', text: this.newMedVolume })
  .width('100%')
  .type(InputType.Number)
  .onChange((value: string) => {
    this.newMedVolume = value
  })

Row({ space: 12 }) {
  Button('取消')
    .layoutWeight(1)
    .backgroundColor('#EEEEEE')
    .fontColor('#333333')
    .onClick(() => {
      this.showAddDialog = false
    })

  Button('添加')
    .layoutWeight(1)
    .backgroundColor('#2196F3')
    .onClick(() => {
      this.addMedicine()
    })
}
.width('100%')

}
.width(‘85%’)
.padding(20)
.borderRadius(16)
.backgroundColor(‘#FFFFFF’)
.position({ x: ‘7.5%’, y: ‘30%’ })
.shadow({ radius: 20, color: ‘#33000000’, offsetX: 0, offsetY: 4 })
}
`

弹窗的设计特点

  1. @Builder 装饰器:使用 @Builder 而非独立的 @Component,因为弹窗与 MedicinePage 共享状态变量,内联定义更简洁。

  2. 条件渲染:弹窗通过 if (this.showAddDialog) 条件渲染,显示时覆盖在页面内容之上(通过 position 定位),不显示时不占用任何布局空间。

  3. 输入类型控制:总量字段使用 InputType.Number 限制只能输入数字,减少输入错误。药品名称和剂量字段为默认文本输入。

  4. 阴影效果shadow({ radius: 20, color: '#33000000', offsetX: 0, offsetY: 4 }) 为弹窗添加柔和阴影,增强视觉层次感。#33000000 中前两位"33"表示约 20% 透明度的黑色。

  5. 位置定位position({ x: '7.5%', y: '30%' }) 将弹窗定位在页面中部偏上位置,水平居中((100% - 85%) / 2 = 7.5%)。

弹窗的局限性

当前弹窗仅支持手动输入药品信息,未集成 IVDrugDatabase 搜索功能。用户需要自行输入药品名称,可能出现拼写错误或名称不一致的情况,导致配伍禁忌检测无法匹配。建议在后续版本中将 MedicineDetailPage 的搜索功能集成到添加弹窗中,实现边输入边搜索的交互体验。

4.6 删除药物与状态更新

药物删除功能在 MedicineDetailPage 中实现:

ypescript Button('删除') .width('100%') .backgroundColor('#F44336') .onClick(() => { if (this.medicine.id.length > 0) { const medicines = DataStore.loadMedicines() const filtered = medicines.filter((m: Medicine): boolean => m.id !== this.medicine.id) DataStore.saveMedicines(filtered) } this.getUIContext().getRouter().back() })

删除流程的关键步骤:

  1. 验证 IDthis.medicine.id.length > 0 确保只删除已持久化的药物(有有效 ID)
  2. 重新加载列表:从 DataStore 加载最新的药物列表,避免基于过期数据操作
  3. 过滤删除:使用 filter() 创建不包含目标药物的新数组,而非直接修改原数组
  4. 持久化更新:将过滤后的数组保存回 DataStore
  5. 返回上一页:调用 router.back() 返回 MedicinePage

删除后的配伍检测更新:当用户从 MedicineDetailPage 删除药物并返回 MedicinePage 时,MedicinePage 的 aboutToAppear() 会重新执行(如果使用了 onPageShow),或者需要手动刷新数据。当前实现中,删除药物后返回 MedicinePage 时,配伍禁忌列表可能不会立即更新——这是一个已知的局限,建议在后续版本中使用 onPageShow 生命周期方法刷新数据。

—## 5. 与CostService的联动

5.1 参考价格在费用计算中的应用

IVDrugDatabase 为 CostService 提供了两个关键数据:参考价格(referencePrice)和医保分类(insuranceCategory)。这两个字段在费用计算流程中扮演着不可或缺的角色。

5.1.1 费用计算模型

CostService 的 calculateSummary() 方法是费用计算的核心,它从 IVDrugDatabase 获取药物信息以完成以下计算:

` ypescript
static calculateSummary(items: CostItem[], policy: InsurancePolicy): CostSummary {
const summary = CostSummary.create()
IVDrugDatabase.init()

for (let i = 0; i < items.length; i++) {
const item = items[i]
summary.totalCost += item.totalPrice

if (item.isDrug) {
  summary.drugCost += item.totalPrice
  const drugInfo: IVDrugInfo | undefined = IVDrugDatabase.getById(item.drugId)
  if (drugInfo !== undefined) {
    if (drugInfo.insuranceCategory === 'class_a') {
      summary.classADrugCost += item.totalPrice
    } else if (drugInfo.insuranceCategory === 'class_b') {
      summary.classBDrugCost += item.totalPrice
    } else {
      summary.selfPayDrugCost += item.totalPrice
    }
  } else {
    summary.selfPayDrugCost += item.totalPrice
  }
} else {
  summary.otherCost += item.totalPrice
}

}
// … 报销计算
}
`

费用分类流程

`
CostItem (isDrug=true)
|
±- drugId 非空?
| |
| ±- IVDrugDatabase.getById(drugId)
| |
| ±- 找到? --> 按 insuranceCategory 分类
| | class_a --> classADrugCost
| | class_b --> classBDrugCost
| | 其他 --> selfPayDrugCost
| |
| ±- 未找到? --> selfPayDrugCost
|
±- drugId 为空? --> selfPayDrugCost

CostItem (isDrug=false)
|
±- otherCost
`

5.1.2 价格可靠性

参考价格的可靠性直接影响费用估算的准确性。IVGuard 的参考价格存在以下局限:

价格时效性:药品价格受集中采购政策影响波动较大。以头孢呋辛钠为例,在"4+7"带量采购政策实施后,其中标价从约 28.5 元/支降至约 16.5 元/支,降幅超过 40%。参考价格可能未能及时反映最新的采购价格。

地区差异:不同省份的集中采购中标价不同。例如,同一品种在北京的中标价可能与在云南的中标价相差 20-30%。参考价格为加权平均值,可能与特定地区的实际价格存在偏差。

医院加成:公立医院在药品采购价基础上可能有不超过 15% 的加成(虽然大部分省份已取消药品加成,但部分特殊药品仍有例外)。参考价格不包含医院加成。

处理策略:IVGuard 在 CostPage 底部明确标注"费用估算仅供参考,以医院实际收费为准",以免责声明的形式提醒用户参考价格的局限性。

5.1.3 医保报销计算

医保报销计算的核心逻辑依赖 IVDrugDatabase 提供的医保分类字段:

` ypescript
const classAReimbursable = summary.classADrugCost * policy.classARate / 100
const classBReimbursable = summary.classBDrugCost * policy.classBRate / 100
const otherReimbursableRate = CostService.getOtherReimbursableRate(policy)
const otherReimbursable = summary.otherCost * otherReimbursableRate / 100

let totalReimbursable = classAReimbursable + classBReimbursable + otherReimbursable
totalReimbursable = totalReimbursable - policy.deductible
if (totalReimbursable < 0) {
totalReimbursable = 0
}
if (totalReimbursable > policy.ceiling) {
totalReimbursable = policy.ceiling
}
`

报销计算示例

假设某患者使用以下药物:奥沙利铂(520元/支 × 3支 = 1560元,乙类)和氯化钠0.9%(4.0元/瓶 × 3瓶 = 12元,甲类),职工医保三级医院报销比例为甲类85%、乙类80%:

费用项 金额 分类 报销比例 可报销额
奥沙利铂 1560元 乙类 80% 1248.00元
氯化钠0.9% 12元 甲类 85% 10.20元
合计 1572元 - - 1258.20元

扣除起付线(假设1300元)后,实际报销额 = 1258.20 - 1300 = -41.80 → 0元(低于起付线不予报销)。

这个例子说明,在单次输液费用较低的场景下,起付线的存在使得医保报销的实际效益有限。但当累计费用超过起付线后,甲乙类报销比例的差异将直接影响患者的经济负担。

5.2 数据流转路径

IVDrugDatabase 的数据在 IVGuard 系统中的流转路径如下:

`
IVDrugDatabase (50条药物记录)
|
±- search() --> MedicineDetailPage (搜索结果展示)
| |
| ±- 用户选择 --> Medicine.name
| Medicine.drugDbId
|
±- getById() --> CostService (医保分类查询)
| |
| ±- insuranceCategory --> CostSummary
| .classADrugCost
| .classBDrugCost
| .selfPayDrugCost
|
±- getAll() --> CostPage (药品浏览选择)
|
±- referencePrice --> CostItem.unitPrice (费用项创建)

DrugDatabase (12条配伍规则)
|
±- checkInteractions() --> AIService.checkDrugInteractions()
|
±- MedicinePage.interactions (UI展示)
±- MedicineCard.hasInteraction (标记显示)
`

关键数据流

  1. 药物识别流:用户搜索 → IVDrugDatabase.search() → 选择药物 → Medicine.name + drugDbId → 持久化
  2. 配伍检测流:Medicine[] → AIService.checkDrugInteractions() → DrugDatabase.checkInteractions() → DrugInteraction[] → UI 展示
  3. 费用计算流:CostItem.drugId → IVDrugDatabase.getById() → insuranceCategory → CostSummary 分类汇总 → 报销计算

5.3 跨模块数据一致性

IVDrugDatabase 与 DrugDatabase 是两个独立的数据源,它们之间通过药物通用名建立松耦合关联。这种设计带来了灵活性,但也引入了一致性维护的挑战。

名称一致性:DrugDatabase 规则中的药物名称必须与 IVDrugDatabase 中的 genericName 字段一致,否则配伍检测将无法匹配。当前存在的不一致包括:

规则中的名称 数据库中的名称 问题
地塞米松 地塞米松磷酸钠 精确匹配失败
阿莫西林 阿莫西林克拉维酸钾 精确匹配失败
钙剂 葡萄糖酸钙 类别名 vs 具体名
NSAIDs (未收录) 类别名无法匹配

解决策略

  1. 短期:在规则中使用与 IVDrugDatabase 完全一致的通用名。例如将"地塞米松"改为"地塞米松磷酸钠"。
  2. 中期:引入同义词映射表,将规则中的简称映射到数据库中的全称。
  3. 长期:采用国家药品编码作为统一标识,规则和数据库均通过编码关联,彻底消除名称不一致问题。

数据版本一致性:IVDrugDatabase 和 DrugDatabase 均随应用版本发布,不存在独立更新的场景。这保证了两个数据库之间的版本一致性——同一个应用版本中,药物数据库和配伍规则数据库始终匹配。


5.4 数据完整性校验

IVDrugDatabase 和 DrugDatabase 作为应用内置的参考数据源,其数据完整性对系统功能的正确性至关重要。以下分析两个数据库的完整性约束和校验机制。

5.4.1 IVDrugDatabase 完整性约束
约束项 规则 校验方式
ID 唯一性 1-50 连续无缺漏 代码审查 + 自增编号机制保证
通用名唯一性 无重复通用名 代码审查
医保分类合法性 class_a/class_b CostService 的 if-else 分支隐式校验
参考价格非负 所有 price > 0 代码审查
剂型合法性 粉针/水针/大输液/预充针/片剂 代码审查
商品名可空 允许空字符串 TypeScript 类型系统天然支持

当前完整性校验依赖代码审查和人工验证,这在 50 条记录的规模下是可行的。当数据规模扩大或引入外部数据源时,需要建立自动化校验机制。

5.4.2 DrugDatabase 完整性约束
约束项 规则 当前状态
药物对不重复 同一对药物不应有多条规则 满足(12条无重复)
严重度合法性 仅 danger/warning/info 满足
描述非空 每条规则有有意义的描述 满足
双向对称 无需对称(A→B 和 B→A 算同一对) 满足(无重复对)
5.4.3 跨数据库一致性

IVDrugDatabase 与 DrugDatabase 之间通过药物通用名建立隐式关联。两者独立定义、独立加载,确保了各自的独立性,但也带来了名称一致性的维护成本。

建议的改进方向

  1. 统一药物编码体系:采用国家药品编码(YPID)作为两个数据库的关联键,彻底消除名称不一致问题。
  2. 自动化一致性检测:在构建流程中增加数据校验步骤,自动检测 DrugDatabase 中的药物名是否在 IVDrugDatabase 中存在对应条目。
  3. 版本化数据管理:为两个数据库引入版本号,确保同一应用版本中的数据始终匹配。

5.5 参考价格与实际价格的差异管理

参考价格作为费用估算的基准值,其与实际价格的差异管理是 IVGuard 费用功能的核心挑战之一。

5.5.1 价格差异的来源
差异来源 影响程度 说明
集中采购降价 "4+7"带量采购可使药价下降 40-90%
地区差价 不同省份中标价差异 20-30%
医院级别差价 三级 vs 二级医院采购价差异 5-15%
药品加成 大部分省份已取消药品加成
供应短缺溢价 不可预测 短缺药品可能溢价数倍
5.5.2 IVGuard 的价格策略

IVGuard 采取了务实而审慎的价格策略:

  1. 参考价格标注:所有价格均明确标注为"参考价格",不暗示与实际价格一致
  2. 免责声明:CostPage 底部标注"费用估算仅供参考,以医院实际收费为准"
  3. 价格区间提示:对于价格波动较大的药品(如带量采购品种),可在详情页显示价格区间而非单一价格
  4. 定期更新:随应用版本更新调整参考价格,保持与最新集中采购价格的同步
5.5.3 未来改进方向

医院级价格定制:允许医院药剂科导入本医院的实际采购价格,替换 IVGuard 的默认参考价格。这需要在应用中增加价格管理入口和数据导入接口。

价格区间显示:对于参与集中采购的品种,同时显示"全国最低中标价"和"全国最高中标价",让用户了解价格的可能范围。

实时价格查询:远期可通过云端接口获取最新的药品价格数据,但这需要解决数据来源的权威性和更新及时性问题。

—## 6. 扩展与未来规划

6.1 数据扩充

6.1.1 药物数据库扩充

当前 50 种药物的覆盖范围在 MVP 阶段已能满足基本需求,但距离临床完整覆盖仍有较大差距。扩充方向包括:

优先级1(高频使用品种)

  • 第二/三代头菌素的更多品种(头孢他啶、头孢哌酮舒巴坦)
  • 更多喹诺酮类(环丙沙星、莫西沙星)
  • 常用抗凝药物的口服制剂(华法林、利伐沙班)
  • 常用镇痛药物(芬太尼、吗啡、地佐辛)

优先级2(特殊场景品种)

  • 儿科专用药物(按体重计算剂量)
  • ICU 常用药物(血管活性药物的更多品种)
  • 肿瘤科常用方案药物组合
  • 中药注射剂的更多品种(目前仅3种)

优先级3(完整性补充)

  • 抗癫痫药物
  • 免疫抑制剂
  • 血液制品的更多品种
  • 诊断用造影剂

扩充至 200 种药物后,数据库的内存占用预计从当前的约 20KB 增加到约 80KB,仍在移动设备的可承受范围内。搜索算法的性能在 200 条记录下仍可保持毫秒级响应。

6.1.2 配伍规则扩充

12 条配伍规则仅覆盖了最基本的高危配伍禁忌。扩充方向包括:

短期目标(50条规则)

  • 覆盖数据库中所有 50 种药物的已知配伍禁忌
  • 增加体外配伍禁忌(沉淀、变色、降解)的规则
  • 增加与输液基础液(NS、D5W、LR)的相容性规则
  • 增加 Y 型管同时滴注的配伍规则

中期目标(200条规则)

  • 覆盖扩展后的 200 种药物
  • 增加三药联合的配伍禁忌规则
  • 增加与患者因素相关的条件性配伍禁忌(如肾功能不全时需调整)
  • 增加药物与食物的相互作用(虽然对静脉输液场景影响较小)

规则质量提升

  • 为每条规则增加循证医学证据等级(A/B/C/D)
  • 为每条规则增加参考文献来源
  • 为每条规则增加替代方案建议
  • 为每条规则增加监测指标建议

6.2 架构演进

6.2.1 静态类 → 依赖注入

当前静态类模式在 MVP 阶段足够简洁,但在以下场景中将暴露局限:

  • 单元测试:静态方法无法 Mock,测试中无法替换为测试数据
  • 多实例需求:不同医院可能需要不同的药物数据库
  • 动态更新:静态数据无法在运行时替换

演进路径:

` ypescript
// 定义接口
interface IDrugDatabase {
search(keyword: string): IVDrugInfo[]
getById(id: string): IVDrugInfo | undefined
getAll(): IVDrugInfo[]
}

// 静态类委托给注入的实例
export class IVDrugDatabase {
private static impl: IDrugDatabase = new DefaultDrugDatabase()

static setImpl(impl: IDrugDatabase): void {
IVDrugDatabase.impl = impl
}

static search(keyword: string): IVDrugInfo[] {
return IVDrugDatabase.impl.search(keyword)
}
}
`

这种"静态方法委托"模式保持了外部接口不变,内部可以灵活替换实现。测试时注入 Mock 实现,生产环境注入真实实现。

6.2.2 内存数组 → 持久化存储

当前药物数据以代码字面量形式硬编码在 init() 方法中,这种方式的局限在于:

  • 每次更新药物数据需要修改源代码并重新发布应用
  • 数据无法在应用运行时动态更新
  • 大规模数据(500+条)会导致代码文件臃肿

演进路径分三个阶段:

近期:rawfile JSON

将药物数据从代码中提取到 JSON 文件,放置在 resources/rawfile/ 目录下:

json { "version": "2.0.0", "lastUpdate": "2026-01-15", "drugs": [ { "id": "1", "genericName": "头孢呋辛钠", "brandName": "西力欣", "specification": "0.75g/支", "dosageForm": "粉针", "referencePrice": 28.5, "insuranceCategory": "class_a", "dailyDosage": "2-3支/日" } ] }

需要解决的技术问题:

  1. 异步加载适配resourceManager.getRawFile() 返回 Promise,init() 需改为 async 方法
  2. 加载状态管理:异步加载意味着数据尚未加载完成时,搜索和查询方法不可用,需要引入加载状态机制(loading/loaded/error)
  3. 数据校验:JSON 文件可能损坏或格式错误,需要在加载后进行数据完整性校验

中期:SQLite 关系数据库

当药物数据达到 500+ 条时,引入关系数据库可以获得更好的查询性能和数据管理能力:

  • 使用 HarmonyOS 的 relationalStore API
  • 建立药物表、配伍规则表、类别映射表
  • 支持索引加速查询
  • 支持事务保证数据一致性

远期:云端数据库同步

远期:云端数据库 -> 增量同步 -> 本地缓存(rawfile/SQLite) -> IVDrugDatabase

核心能力包括药物数据实时更新、医院级别定制配置、药物相互作用规则在线推送、价格数据实时同步。

6.2.3 搜索能力增强

当前 50 条记录的线性扫描搜索足以满足需求,但随着药物数据库规模扩大(中期 200+ 种、远期 1000+ 种),搜索能力需要增强:

拼音搜索:支持拼音首字母搜索,输入"tf"匹配"头孢",输入"xlx"匹配"西力欣"。

同义词映射:建立药品别名映射表,“安灭菌” → “阿莫西林克拉维酸钾”,“速尿” → “呋塞米”。

分页加载:对于超大规模数据库(1000+种),采用分页加载策略,每次只显示 20-30 条搜索结果,配合 LazyForEach 降低渲染开销。

多字段搜索:当前搜索仅覆盖 genericName 和 brandName,未来可扩展到 specification、dosageForm 等字段。

6.3 配伍检测增强

6.3.1 三药联合检测

当前算法仅检测两两组合,但临床实际中三药甚至四药联合使用的场景并不少见。三药联合检测的挑战在于:

  • 三药组合数量为 C(n, 3) = n × (n-1) × (n-2) / 6,5 种药物即有 10 种三药组合
  • 三药联合的配伍禁忌可能不表现在任何两两组合中(A+B安全,B+C安全,A+C安全,但A+B+C危险)
  • 三药联合的规则数据极度匮乏,临床研究远少于两两相互作用

实现思路:

ypescript // 概念设计 static checkTripleInteractions(drugNames: string[]): DrugInteraction[] { const results: DrugInteraction[] = [] for (let i = 0; i < drugNames.length; i++) { for (let j = i + 1; j < drugNames.length; j++) { for (let k = j + 1; k < drugNames.length; k++) { // 检查三药联合规则 const triple = drugNames[i] + '+' + drugNames[j] + '+' + drugNames[k] const match = DrugDatabase.tripleInteractions.find(t => t.matches(triple)) if (match) results.push(match) } } } return results }

6.3.2 个体化检测

当前配伍检测是"一刀切"的——不考虑患者个体因素。实际上,许多配伍禁忌的严重程度取决于患者状态:

  • 肾功能:肾毒性药物的相互作用在肾功能不全患者中更为严重
  • 年龄:老年人和新生儿对药物不良反应更敏感
  • 合并疾病:心脏病患者对洋地黄-钙剂相互作用更敏感
  • 体重:儿童用药需按体重计算剂量,剂量不同相互作用程度不同

个体化检测需要在配伍规则中引入条件因子:

ypescript // 概念设计 export class ConditionalInteraction { drugA: string = '' drugB: string = '' baseSeverity: string = '' conditions: InteractionCondition[] = [] // 如:肾功能不全时 danger 升级,老年患者 warning 升级 }

6.3.3 知识图谱

远期可以构建药物知识图谱,将药物信息、配伍规则、药理机制、患者因素等组织为图结构:

头孢呋辛钠 --[属于]--> 头孢菌素类 头孢呋辛钠 --[机制]--> 肾毒性 庆大霉素 --[属于]--> 氨基糖苷类 庆大霉素 --[机制]--> 肾毒性 头孢菌素类 --[与]--> 氨基糖苷类 --[协同]--> 肾毒性(危险)

知识图谱的优势在于可以推导出规则库中未显式收录的配伍禁忌——如果 A 类药物和 B 类药物都有肾毒性,且已知某 A 类药物与某 B 类药物合用增加肾毒性,那么其他 A 类药物与其他 B 类药物的合用也可能存在类似风险。

6.4 合规与安全

6.4.1 医疗器械认证

IVGuard 作为医疗辅助应用,在正式商用前需要通过医疗器械认证。根据中国国家药品监督管理局的分类,药物数据库与配伍禁忌检测功能可能将 IVGuard 归类为第二类医疗器械(医用软件),需要完成注册检验和临床评价。

配伍禁忌检测功能的合规要点:

  • 检测结果必须明确标注"仅供参考",不构成医疗建议
  • 必须保留完整的规则来源记录和更新日志
  • 需要建立规则审核机制,由临床药师定期审核规则库
  • 需要建立不良事件报告机制,用户反馈漏报或误报时能够及时处理
6.4.2 数据安全

药物数据库虽然不直接包含患者信息,但仍需关注以下安全事项:

数据完整性:药物数据库的数据必须防止被篡改。如果有人恶意修改药物价格或配伍规则,可能导致错误的费用计算或漏报危险配伍。当前静态类模式天然防止了运行时篡改,但如果未来引入 JSON 文件或 SQLite 存储,需要增加数据签名校验机制。

查询隐私:虽然当前查询完全在本地完成,不产生网络流量,但如果未来引入云端数据库同步,查询日志可能间接反映患者用药情况。需要对查询日志进行匿名化处理,或采用本地缓存优先的策略减少云端查询。

数据备份与恢复:药物数据库作为应用内置数据,随应用卸载而删除。配伍检测的历史记录(如有)应通过 DataStore 持久化,并在应用重装后能够恢复。


6.5 配伍禁忌检测的临床安全策略

配伍禁忌检测功能的临床安全策略是 IVGuard 产品设计中最需要审慎对待的部分。检测结果的呈现方式直接影响护士的临床决策,过度警示会导致"警报疲劳",不足警示则可能遗漏真正危险的配伍。

6.5.1 警报疲劳的防范

警报疲劳(Alert Fatigue)是医疗信息化领域公认的严重问题。研究表明,当临床预警系统的假阳性率过高时,医护人员会逐渐忽视所有警报,包括真正危险的警报。美国ECRI研究所将"警报疲劳"列为年度十大医疗技术危害之一。

IVGuard 防范警报疲劳的策略:

  1. 分级呈现:三级严重度体系(danger/warning/info)确保不同严重程度的配伍禁忌获得差异化的视觉呈现,避免所有警报看起来一样
  2. 精准规则:每条规则都基于明确的临床证据,避免过度宽泛的规则(如"所有抗生素不能与X合用")
  3. 上下文相关:info 级别的提示不阻断操作,仅作为信息参考;danger 级别的提示才要求用户高度关注
  4. 简洁描述:每条规则的描述控制在 20 字以内,避免长篇大论稀释关键信息
6.5.2 漏报风险的缓解

漏报(False Negative)比误报(False Positive)更危险——漏报意味着真正的危险配伍未被发现,可能导致患者伤害。IVGuard 缓解漏报风险的策略:

  1. 明确声明检测范围:在 UI 中清晰告知用户当前仅覆盖 12 组配伍规则,未检测到配伍禁忌不代表安全
  2. 高敏感度优先:宁可增加 warning 级别的误报,也不遗漏潜在的 danger 级别配伍
  3. 定期规则审查:由临床药师定期审查规则库,补充新发现的配伍禁忌,删除过时的规则
  4. 用户反馈机制:允许护士报告疑似漏报,经药师确认后补充到规则库
6.5.3 误报处理策略

误报(False Positive)虽然不如漏报危险,但会影响用户对系统的信任度和使用意愿。IVGuard 的误报处理策略:

  1. warning 级别的适度呈现:橙色提示而非红色警告,明确告知"需谨慎"而非"禁止"
  2. info 级别的低干扰:蓝色通知,不占据页面显著位置,不产生声音或振动提醒
  3. 上下文说明:每条规则的描述包含简短的原因说明,帮助护士判断警报是否适用于当前患者
  4. 药师确认机制:对于频繁触发的 warning 规则,由药师评估是否需要调整级别或添加排除条件

6.6 数据驱动的规则优化

随着 IVGuard 的使用积累,可以基于实际使用数据对配伍规则进行优化:

规则触发频率统计:记录每条规则的触发次数和频率,识别高频触发的规则。高频 warning 规则可能是正常临床实践(如青霉素+庆大霉素的协同用药),应考虑降低其提示级别或添加上下文条件。

用户操作跟踪:记录护士对 danger 级别警报的响应行为——是否取消了某药物的添加?是否调整了给药方案?这些行为数据可以帮助评估规则的实际影响力。

漏报反馈收集:建立漏报反馈渠道,允许护士上报"系统未检测到但我发现存在配伍问题"的案例,经药师确认后补充到规则库。

规则A/B测试:对于争议性规则(如奥美拉唑+氯吡格雷),可以设置不同级别的提示强度,比较不同级别对临床决策的影响,用数据驱动规则级别的最终确定。


6.7 与其他IVGuard子系统的集成展望

药物数据库与配伍禁忌检测功能与 IVGuard 的其他子系统存在广泛的集成机会:

与VisionService的集成:当视觉识别系统识别到输液瓶上的药物标签时,可以自动从 IVDrugDatabase 查询药物信息,包括配伍禁忌。这实现了从视觉识别到安全检测的自动化流水线:

视觉识别标签 → 提取药物名 → IVDrugDatabase.search() → 获取药物信息 ↓ DrugDatabase.checkInteractions() → 配伍禁忌检测

与NotificationService的集成:当检测到 danger 级别的配伍禁忌时,可以自动触发紧急通知,通知护士站和相关医生:

配伍检测 → danger 级别 → NotificationService.sendUrgentAlert() → SpeechService.playDangerAlert() → 振动提醒

与WatchService的集成:当检测到配伍禁忌时,可以通过智能手表推送提醒,确保护士即使在离开患者床旁时也能收到警告:

配伍检测 → 任意级别 → WatchService.sendNotification()

与CostService的深度集成:当前 CostService 仅使用 IVDrugDatabase 的 referencePrice 和 insuranceCategory 字段。未来可以进一步利用药物信息实现:

  • 基于日用剂量的费用预估(当前仅基于单价)
  • 基于配伍禁忌的替代药物推荐和费用对比
  • 医保报销方案的优化建议(如选择甲类替代乙类)

设计总结

IVGuard 的药物数据库与配伍禁忌检测子系统是整个应用中最核心的安全功能之一。它通过两个互补的数据源——IVDrugDatabase(50种药物信息)和 DrugDatabase(12条配伍规则)——为护士和患者提供了即时的药物参考和配伍安全检测。

核心设计决策回顾

决策 选择 理由
数据存储方式 代码内硬编码 MVP阶段最简洁可靠,零外部依赖
类设计模式 静态类 全局唯一、零实例化开销、调用简洁
初始化策略 懒加载 + 隐式初始化 避免冷启动开销,调用方无需关心初始化
搜索算法 线性扫描 50条记录下性能充足,代码简洁
配伍检测算法 三重循环O(n²×m) 典型场景下性能完全满足,逻辑清晰
严重度分级 三级(danger/warning/info) 临床标准分级,差异化UI呈现
数据关联方式 通用名松耦合 灵活独立迭代,后续可通过标准化增强
价格策略 参考价格 + 免责声明 审慎务实,明确标注仅供参考

系统架构关系图

┌────────────────────────────────────────────────────────────┐ │ IVGuard 应用层 │ │ ┌──────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │ │MedicinePage│ │MedicineDetail│ │ CostPage │ │ │ │ 药物管理 │ │ 药物详情 │ │ 费用计算 │ │ │ └─────┬─────┘ └──────┬───────┘ └──────────┬───────────┘ │ │ │ │ │ │ │ ┌─────┴─────┐ ┌──────┴───────┐ ┌──────────┴───────────┐ │ │ │ AIService │ │ IVDrugDatabase│ │ CostService │ │ │ │ 配伍检测桥接│ │ 药物数据库 │ │ 费用计算服务 │ │ │ └─────┬─────┘ └──────────────┘ └──────────┬───────────┘ │ │ │ │ │ │ ┌─────┴─────┐ ┌──────┴──────────┐ │ │ │DrugDatabase│ │ InsurancePolicy │ │ │ │配伍规则库 │ │ 医保政策 │ │ │ └───────────┘ └─────────────────┘ │ └────────────────────────────────────────────────────────────┘ │ │ │ v v v ┌────────────────────────────────────────────────────────────┐ │ 数据持久层 │ │ ┌──────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │ │ DataStore │ │ Preferences │ │ Medicine[] 持久化 │ │ │ └──────────┘ └──────────────┘ └──────────────────────┘ │ └────────────────────────────────────────────────────────────┘

药物数据库和配伍禁忌检测功能的成功实现,为 IVGuard 的用药安全监控奠定了坚实的基础。随着数据规模的扩大和检测算法的增强,这一子系统将在 IVGuard 的整体安全体系中发挥越来越重要的作用。

—## 附录 A:IVDrugDatabase 完整源码(99行)

` ypescript
import { IVDrugInfo } from ‘./DataModels’

export class IVDrugDatabase {
private static drugs: IVDrugInfo[] = []
private static loaded: boolean = false

static init(): void {
if (IVDrugDatabase.loaded) {
return
}
IVDrugDatabase.loaded = true
const list: IVDrugInfo[] = []
let idx = 1
list.push(IVDrugInfo.create(String(idx++), ‘头孢呋辛钠’, ‘西力欣’, ‘0.75g/支’, ‘粉针’, 28.5, ‘class_a’, ‘2-3支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘头孢曲松钠’, ‘罗氏芬’, ‘1g/支’, ‘粉针’, 35.0, ‘class_a’, ‘1-2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘青霉素钠’, ‘’, ‘80万U/支’, ‘粉针’, 2.8, ‘class_a’, ‘2-4支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘阿莫西林克拉维酸钾’, ‘安灭菌’, ‘1.2g/支’, ‘粉针’, 32.0, ‘class_a’, ‘2-3支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘左氧氟沙星’, ‘可乐必妥’, ‘0.5g/100ml’, ‘大输液’, 45.0, ‘class_a’, ‘1瓶/日’))
list.push(IVDrugInfo.create(String(idx++), ‘奥美拉唑’, ‘洛赛克’, ‘40mg/支’, ‘粉针’, 68.0, ‘class_b’, ‘1-2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘氨溴索’, ‘沐舒坦’, ‘30mg/2ml’, ‘水针’, 15.5, ‘class_a’, ‘2-3支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘地塞米松磷酸钠’, ‘’, ‘5mg/1ml’, ‘水针’, 3.2, ‘class_a’, ‘1-2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘氯化钾’, ‘’, ‘1g/10ml’, ‘水针’, 5.0, ‘class_a’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘葡萄糖酸钙’, ‘’, ‘1g/10ml’, ‘水针’, 4.5, ‘class_a’, ‘1支/次’))
list.push(IVDrugInfo.create(String(idx++), ‘维生素C’, ‘’, ‘1g/5ml’, ‘水针’, 3.8, ‘class_a’, ‘1-2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘维生素B6’, ‘’, ‘100mg/2ml’, ‘水针’, 2.5, ‘class_a’, ‘1支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘庆大霉素’, ‘’, ‘8万U/2ml’, ‘水针’, 1.8, ‘class_a’, ‘2-3支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘万古霉素’, ‘稳可信’, ‘0.5g/支’, ‘粉针’, 128.0, ‘class_b’, ‘2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘亚胺培南西司他丁’, ‘泰能’, ‘0.5g/支’, ‘粉针’, 185.0, ‘class_b’, ‘2-3支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘胰岛素’, ‘诺和灵R’, ‘400IU/10ml’, ‘水针’, 56.0, ‘class_a’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘螺内酯’, ‘’, ‘20mg/片’, ‘片剂’, 0.5, ‘class_a’, ‘1-3片/日’))
list.push(IVDrugInfo.create(String(idx++), ‘甲硝唑’, ‘’, ‘0.5g/100ml’, ‘大输液’, 8.0, ‘class_a’, ‘2瓶/日’))
list.push(IVDrugInfo.create(String(idx++), ‘替硝唑’, ‘’, ‘0.4g/100ml’, ‘大输液’, 22.0, ‘class_b’, ‘1-2瓶/日’))
list.push(IVDrugInfo.create(String(idx++), ‘氟康唑’, ‘大扶康’, ‘0.2g/100ml’, ‘大输液’, 78.0, ‘class_b’, ‘1瓶/日’))
list.push(IVDrugInfo.create(String(idx++), ‘阿昔洛韦’, ‘’, ‘0.25g/支’, ‘粉针’, 18.0, ‘class_a’, ‘3支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘更昔洛韦’, ‘’, ‘0.25g/支’, ‘粉针’, 95.0, ‘class_b’, ‘2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘利巴韦林’, ‘’, ‘0.5g/100ml’, ‘大输液’, 12.0, ‘class_a’, ‘2瓶/日’))
list.push(IVDrugInfo.create(String(idx++), ‘葡萄糖5%’, ‘’, ‘250ml/瓶’, ‘大输液’, 4.5, ‘class_a’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘葡萄糖10%’, ‘’, ‘250ml/瓶’, ‘大输液’, 5.0, ‘class_a’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘氯化钠0.9%’, ‘’, ‘250ml/瓶’, ‘大输液’, 4.0, ‘class_a’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘葡萄糖氯化钠’, ‘’, ‘250ml/瓶’, ‘大输液’, 5.5, ‘class_a’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘乳酸林格液’, ‘’, ‘500ml/瓶’, ‘大输液’, 6.0, ‘class_a’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘右旋糖酐40’, ‘’, ‘500ml/瓶’, ‘大输液’, 18.0, ‘class_a’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘脂肪乳(C14-24)’, ‘英脱利匹特’, ‘250ml/瓶’, ‘大输液’, 85.0, ‘class_b’, ‘1瓶/日’))
list.push(IVDrugInfo.create(String(idx++), ‘复方氨基酸(18AA)’, ‘乐凡命’, ‘250ml/瓶’, ‘大输液’, 65.0, ‘class_b’, ‘1瓶/日’))
list.push(IVDrugInfo.create(String(idx++), ‘人血白蛋白’, ‘’, ‘10g/50ml’, ‘水针’, 380.0, ‘class_b’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘呋塞米’, ‘速尿’, ‘20mg/2ml’, ‘水针’, 2.0, ‘class_a’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘多巴胺’, ‘’, ‘20mg/2ml’, ‘水针’, 5.5, ‘class_a’, ‘按需泵入’))
list.push(IVDrugInfo.create(String(idx++), ‘去甲肾上腺素’, ‘’, ‘2mg/1ml’, ‘水针’, 8.0, ‘class_a’, ‘按需泵入’))
list.push(IVDrugInfo.create(String(idx++), ‘地高辛’, ‘’, ‘0.5mg/2ml’, ‘水针’, 12.0, ‘class_a’, ‘1支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘硝普钠’, ‘’, ‘50mg/支’, ‘粉针’, 25.0, ‘class_a’, ‘按需泵入’))
list.push(IVDrugInfo.create(String(idx++), ‘硝酸甘油’, ‘’, ‘5mg/1ml’, ‘水针’, 15.0, ‘class_a’, ‘按需泵入’))
list.push(IVDrugInfo.create(String(idx++), ‘氨茶碱’, ‘’, ‘0.25g/10ml’, ‘水针’, 4.2, ‘class_a’, ‘1-2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘布地奈德’, ‘普米克令舒’, ‘1mg/2ml’, ‘水针’, 32.0, ‘class_b’, ‘1-2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘异丙托溴铵’, ‘爱全乐’, ‘0.5mg/2ml’, ‘水针’, 28.0, ‘class_b’, ‘1-3支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘甲泼尼龙’, ‘甲强龙’, ‘40mg/支’, ‘粉针’, 52.0, ‘class_b’, ‘按需’))
list.push(IVDrugInfo.create(String(idx++), ‘环磷酰胺’, ‘’, ‘0.2g/支’, ‘粉针’, 35.0, ‘class_a’, ‘按方案’))
list.push(IVDrugInfo.create(String(idx++), ‘顺铂’, ‘’, ‘10mg/支’, ‘水针’, 28.0, ‘class_a’, ‘按方案’))
list.push(IVDrugInfo.create(String(idx++), ‘紫杉醇’, ‘泰素’, ‘30mg/支’, ‘水针’, 298.0, ‘class_b’, ‘按方案’))
list.push(IVDrugInfo.create(String(idx++), ‘奥沙利铂’, ‘乐沙定’, ‘50mg/支’, ‘粉针’, 520.0, ‘class_b’, ‘按方案’))
list.push(IVDrugInfo.create(String(idx++), ‘低分子肝素钠’, ‘克赛’, ‘0.4ml/支’, ‘预充针’, 46.0, ‘class_b’, ‘1-2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘那屈肝素钙’, ‘速碧林’, ‘0.4ml/支’, ‘预充针’, 42.0, ‘class_b’, ‘1-2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘七叶皂苷钠’, ‘麦通纳’, ‘10mg/支’, ‘粉针’, 58.0, ‘class_b’, ‘1-2支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘丹参酮IIA磺酸钠’, ‘’, ‘10mg/2ml’, ‘水针’, 22.0, ‘class_a’, ‘2-4支/日’))
list.push(IVDrugInfo.create(String(idx++), ‘参麦注射液’, ‘’, ‘50ml/瓶’, ‘大输液’, 35.0, ‘class_a’, ‘1-2瓶/日’))
IVDrugDatabase.drugs = list
}

static search(keyword: string): IVDrugInfo[] {
IVDrugDatabase.init()
if (keyword.length === 0) {
return IVDrugDatabase.drugs
}
const lower = keyword.toLowerCase()
const results: IVDrugInfo[] = []
for (let i = 0; i < IVDrugDatabase.drugs.length; i++) {
const d = IVDrugDatabase.drugs[i]
if (d.genericName.toLowerCase().indexOf(lower) >= 0 ||
d.brandName.toLowerCase().indexOf(lower) >= 0) {
results.push(d)
}
}
return results
}

static getById(id: string): IVDrugInfo | undefined {
IVDrugDatabase.init()
for (let i = 0; i < IVDrugDatabase.drugs.length; i++) {
if (IVDrugDatabase.drugs[i].id === id) {
return IVDrugDatabase.drugs[i]
}
}
return undefined
}

static getAll(): IVDrugInfo[] {
IVDrugDatabase.init()
return IVDrugDatabase.drugs
}
}
`

附录 B:DrugDatabase 完整源码(44行)

` ypescript
import { DrugInteraction } from ‘./DataModels’

export class DrugDatabase {
private static interactions: DrugInteraction[] = []

static init(): void {
if (DrugDatabase.interactions.length > 0) {
return
}
const data: DrugInteraction[] = []
data.push(DrugInteraction.create(‘头孢呋辛钠’, ‘庆大霉素’, ‘danger’, ‘头孢类与氨基糖苷类合用增加肾毒性’))
data.push(DrugInteraction.create(‘头孢曲松钠’, ‘钙剂’, ‘danger’, ‘头孢曲松与含钙输液配伍可形成沉淀’))
data.push(DrugInteraction.create(‘青霉素钠’, ‘庆大霉素’, ‘warning’, ‘青霉素与氨基糖苷类有协同作用但需分开给药’))
data.push(DrugInteraction.create(‘左氧氟沙星’, ‘NSAIDs’, ‘warning’, ‘喹诺酮类与非甾体抗炎药合用增加癫痫风险’))
data.push(DrugInteraction.create(‘奥美拉唑’, ‘氯吡格雷’, ‘warning’, ‘质子泵抑制剂可能降低氯吡格雷抗血小板效果’))
data.push(DrugInteraction.create(‘氨溴索’, ‘抗生素’, ‘info’, ‘氨溴索与抗生素有协同作用,促进抗生素向肺组织渗透’))
data.push(DrugInteraction.create(‘地塞米松’, ‘胰岛素’, ‘warning’, ‘糖皮质激素可升高血糖,拮抗胰岛素作用’))
data.push(DrugInteraction.create(‘氯化钾’, ‘螺内酯’, ‘danger’, ‘保钾利尿剂与钾盐合用可致高钾血症’))
data.push(DrugInteraction.create(‘阿莫西林’, ‘甲氨蝶呤’, ‘danger’, ‘青霉素类可减少甲氨蝶呤清除,增加毒性’))
data.push(DrugInteraction.create(‘万古霉素’, ‘庆大霉素’, ‘danger’, ‘两者合用增加肾毒性和耳毒性’))
data.push(DrugInteraction.create(‘维生素C’, ‘维生素B12’, ‘info’, ‘大剂量维生素C可破坏维生素B12’))
data.push(DrugInteraction.create(‘葡萄糖酸钙’, ‘地高辛’, ‘danger’, ‘钙剂可增强洋地黄类心脏毒性’))
DrugDatabase.interactions = data
}

static checkInteractions(drugNames: string[]): DrugInteraction[] {
DrugDatabase.init()
const results: DrugInteraction[] = []
for (let i = 0; i < drugNames.length; i++) {
for (let j = i + 1; j < drugNames.length; j++) {
const nameA = drugNames[i]
const nameB = drugNames[j]
for (let k = 0; k < DrugDatabase.interactions.length; k++) {
const inter = DrugDatabase.interactions[k]
if ((inter.drugA === nameA && inter.drugB === nameB) ||
(inter.drugA === nameB && inter.drugB === nameA)) {
results.push(inter)
}
}
}
}
return results
}
}
`

附录 E:配伍禁忌检测场景演示

场景1:安全组合

护士为患者添加两种药物:葡萄糖5%和氯化钠0.9%。

`
输入:drugNames = [‘葡萄糖5%’, ‘氯化钠0.9%’]

checkInteractions 执行过程:
i=0, j=1: nameA=‘葡萄糖5%’, nameB=‘氯化钠0.9%’
k=0: ‘头孢呋辛钠’=‘葡萄糖5%’? No → 跳过
k=1: ‘头孢曲松钠’
=‘葡萄糖5%’? No → 跳过
… k=11: 均不匹配

输出:results = [] (空数组,无配伍禁忌)
`

UI 展示:配伍禁忌警告区域不显示,MedicineCard 上无警告标记。

场景2:danger级别配伍

护士为患者添加两种药物:头孢曲松钠和葡萄糖酸钙。

`
输入:drugNames = [‘头孢曲松钠’, ‘葡萄糖酸钙’]

checkInteractions 执行过程:
i=0, j=1: nameA=‘头孢曲松钠’, nameB=‘葡萄糖酸钙’
k=0: ‘头孢呋辛钠’=‘头孢曲松钠’? No → 跳过
k=1: ‘头孢曲松钠’
=‘头孢曲松钠’ && ‘钙剂’===‘葡萄糖酸钙’?
→ 精确匹配失败!(‘钙剂’ ≠ ‘葡萄糖酸钙’)
k=2-11: 均不匹配

输出:results = [] (空数组,漏报!)
`

问题分析:由于规则中 drugB 为"钙剂"(类别名)而非"葡萄糖酸钙"(具体名),精确匹配失败,导致 danger 级别的配伍禁忌被漏报。这是当前算法的已知局限,需通过类别映射机制解决。

场景3:warning级别配伍

护士为患者添加两种药物:青霉素钠和庆大霉素。

`
输入:drugNames = [‘青霉素钠’, ‘庆大霉素’]

checkInteractions 执行过程:
i=0, j=1: nameA=‘青霉素钠’, nameB=‘庆大霉素’
k=0: ‘头孢呋辛钠’=‘青霉素钠’? No
k=1: ‘头孢曲松钠’
=‘青霉素钠’? No
k=2: ‘青霉素钠’=‘青霉素钠’ && ‘庆大霉素’=‘庆大霉素’?
→ Yes!匹配成功!

输出:results = [DrugInteraction {
drugA: ‘青霉素钠’,
drugB: ‘庆大霉素’,
severity: ‘warning’,
description: ‘青霉素与氨基糖苷类有协同作用但需分开给药’
}]
`

UI 展示:页面顶部橙色警告区域显示"! 青霉素与氨基糖苷类有协同作用但需分开给药",两个 MedicineCard 均显示红色"药物相互作用警告"标记。

场景4:多药联用检测

护士为患者同时使用4种药物:头孢呋辛钠、庆大霉素、氯化钾和螺内酯。

`
输入:drugNames = [‘头孢呋辛钠’, ‘庆大霉素’, ‘氯化钾’, ‘螺内酯’]

药物对数:C(4,2) = 6 对
(头孢呋辛钠, 庆大霉素) → 匹配 danger 规则1
(头孢呋辛钠, 氯化钾) → 无匹配
(头孢呋辛钠, 螺内酯) → 无匹配
(庆大霉素, 氯化钾) → 无匹配
(庆大霉素, 螺内酯) → 无匹配
(氯化钾, 螺内酯) → 匹配 danger 规则8

输出:results = [
DrugInteraction { drugA:‘头孢呋辛钠’, drugB:‘庆大霉素’, severity:‘danger’, … },
DrugInteraction { drugA:‘氯化钾’, drugB:‘螺内酯’, severity:‘danger’, … }
]
`

UI 展示:页面顶部橙色警告区域显示两条 danger 级别配伍禁忌,均以红色文字和双感叹号前缀呈现。所有4个 MedicineCard 均显示红色警告标记(因为每种药物都至少涉及一条配伍禁忌)。

这个场景说明了一个重要的临床问题:当同时使用4种药物时,6种两两组合中可能有2种存在配伍禁忌,这对人工判断已构成挑战。IVGuard 的即时检测为护士提供了关键的决策支持。


附录 C:50种药物速查表

ID 通用名 商品名 规格 剂型 价格(元) 医保 用量
1 头孢呋辛钠 西力欣 0.75g/支 粉针 28.5 甲类 2-3支/日
2 头孢曲松钠 罗氏芬 1g/支 粉针 35.0 甲类 1-2支/日
3 青霉素钠 80万U/支 粉针 2.8 甲类 2-4支/日
4 阿莫西林克拉维酸钾 安灭菌 1.2g/支 粉针 32.0 甲类 2-3支/日
5 左氧氟沙星 可乐必妥 0.5g/100ml 大输液 45.0 甲类 1瓶/日
6 奥美拉唑 洛赛克 40mg/支 粉针 68.0 乙类 1-2支/日
7 氨溴索 沐舒坦 30mg/2ml 水针 15.5 甲类 2-3支/日
8 地塞米松磷酸钠 5mg/1ml 水针 3.2 甲类 1-2支/日
9 氯化钾 1g/10ml 水针 5.0 甲类 按需
10 葡萄糖酸钙 1g/10ml 水针 4.5 甲类 1支/次
11 维生素C 1g/5ml 水针 3.8 甲类 1-2支/日
12 维生素B6 100mg/2ml 水针 2.5 甲类 1支/日
13 庆大霉素 8万U/2ml 水针 1.8 甲类 2-3支/日
14 万古霉素 稳可信 0.5g/支 粉针 128.0 乙类 2支/日
15 亚胺培南西司他丁 泰能 0.5g/支 粉针 185.0 乙类 2-3支/日
16 胰岛素 诺和灵R 400IU/10ml 水针 56.0 甲类 按需
17 螺内酯 20mg/片 片剂 0.5 甲类 1-3片/日
18 甲硝唑 0.5g/100ml 大输液 8.0 甲类 2瓶/日
19 替硝唑 0.4g/100ml 大输液 22.0 乙类 1-2瓶/日
20 氟康唑 大扶康 0.2g/100ml 大输液 78.0 乙类 1瓶/日
21 阿昔洛韦 0.25g/支 粉针 18.0 甲类 3支/日
22 更昔洛韦 0.25g/支 粉针 95.0 乙类 2支/日
23 利巴韦林 0.5g/100ml 大输液 12.0 甲类 2瓶/日
24 葡萄糖5% 250ml/瓶 大输液 4.5 甲类 按需
25 葡萄糖10% 250ml/瓶 大输液 5.0 甲类 按需
26 氯化钠0.9% 250ml/瓶 大输液 4.0 甲类 按需
27 葡萄糖氯化钠 250ml/瓶 大输液 5.5 甲类 按需
28 乳酸林格液 500ml/瓶 大输液 6.0 甲类 按需
29 右旋糖酐40 500ml/瓶 大输液 18.0 甲类 按需
30 脂肪乳(C14-24) 英脱利匹特 250ml/瓶 大输液 85.0 乙类 1瓶/日
31 复方氨基酸(18AA) 乐凡命 250ml/瓶 大输液 65.0 乙类 1瓶/日
32 人血白蛋白 10g/50ml 水针 380.0 乙类 按需
33 呋塞米 速尿 20mg/2ml 水针 2.0 甲类 按需
34 多巴胺 20mg/2ml 水针 5.5 甲类 按需泵入
35 去甲肾上腺素 2mg/1ml 水针 8.0 甲类 按需泵入
36 地高辛 0.5mg/2ml 水针 12.0 甲类 1支/日
37 硝普钠 50mg/支 粉针 25.0 甲类 按需泵入
38 硝酸甘油 5mg/1ml 水针 15.0 甲类 按需泵入
39 氨茶碱 0.25g/10ml 水针 4.2 甲类 1-2支/日
40 布地奈德 普米克令舒 1mg/2ml 水针 32.0 乙类 1-2支/日
41 异丙托溴铵 爱全乐 0.5mg/2ml 水针 28.0 乙类 1-3支/日
42 甲泼尼龙 甲强龙 40mg/支 粉针 52.0 乙类 按需
43 环磷酰胺 0.2g/支 粉针 35.0 甲类 按方案
44 顺铂 10mg/支 水针 28.0 甲类 按方案
45 紫杉醇 泰素 30mg/支 水针 298.0 乙类 按方案
46 奥沙利铂 乐沙定 50mg/支 粉针 520.0 乙类 按方案
47 低分子肝素钠 克赛 0.4ml/支 预充针 46.0 乙类 1-2支/日
48 那屈肝素钙 速碧林 0.4ml/支 预充针 42.0 乙类 1-2支/日
49 七叶皂苷钠 麦通纳 10mg/支 粉针 58.0 乙类 1-2支/日
50 丹参酮IIA磺酸钠 10mg/2ml 水针 22.0 甲类 2-4支/日

附录 D:12组相互作用规则速查表

序号 药物A 药物B 严重程度 描述
1 头孢呋辛钠 庆大霉素 danger 头孢类与氨基糖苷类合用增加肾毒性
2 头孢曲松钠 钙剂 danger 头孢曲松与含钙输液配伍可形成沉淀
3 青霉素钠 庆大霉素 warning 青霉素与氨基糖苷类有协同作用但需分开给药
4 左氧氟沙星 NSAIDs warning 喹诺酮类与非甾体抗炎药合用增加癫痫风险
5 奥美拉唑 氯吡格雷 warning 质子泵抑制剂可能降低氯吡格雷抗血小板效果
6 氨溴索 抗生素 info 氨溴索与抗生素有协同作用,促进抗生素向肺组织渗透
7 地塞米松 胰岛素 warning 糖皮质激素可升高血糖,拮抗胰岛素作用
8 氯化钾 螺内酯 danger 保钾利尿剂与钾盐合用可致高钾血症
9 阿莫西林 甲氨蝶呤 danger 青霉素类可减少甲氨蝶呤清除,增加毒性
10 万古霉素 庆大霉素 danger 两者合用增加肾毒性和耳毒性
11 维生素C 维生素B12 info 大剂量维生素C可破坏维生素B12
12 葡萄糖酸钙 地高辛 danger 钙剂可增强洋地黄类心脏毒性
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐