鸿蒙电子病历查看(历史就诊记录/处方药提醒)详解
【摘要】 一、引言在医疗健康领域,电子病历(Electronic Medical Record, EMR)是患者诊疗信息的核心载体,包含历史就诊记录、检查检验结果、处方用药等关键数据。随着鸿蒙操作系统(HarmonyOS)在智能终端(如手机、平板、车机、智能手表)的普及,用户对 跨设备便捷查看电子病历 的需求日益增长——例如,在手机上快速查阅近期就诊记录,在车机上接收处方药的服药提醒,在平板上...
一、引言
二、技术背景
1. 鸿蒙分布式技术核心能力
-
分布式软总线:实现不同鸿蒙设备(手机、平板、车机、智能穿戴)之间的 低延迟、高带宽通信,无需依赖Wi-Fi直连或蓝牙配对,自动发现并连接周边设备。 -
分布式数据库:提供 跨设备数据同步 能力,通过统一的分布式数据服务(Distributed Data Service, DDS),将电子病历等关键数据存储在云端或本地分布式节点,多设备实时共享最新状态。 -
分布式任务调度:支持跨设备运行同一应用的不同组件(如手机发起查询,车机显示提醒),实现业务逻辑的无缝迁移。 -
原子化服务:电子病历查看功能可封装为 鸿蒙原子化服务卡片,用户通过负一屏、桌面快捷入口快速访问,无需打开完整APP。
2. 电子病历数据特点与挑战
-
数据安全与隐私保护:通过鸿蒙的 分布式安全框架(如数据加密、设备认证、权限管控),确保只有授权设备(如用户本人的手机、车机)可访问病历数据。 -
跨设备数据一致性:当患者在手机端更新就诊记录(如新增检查报告),车机、平板等设备需通过分布式数据库实时同步最新数据。 -
处方药提醒的精准触发:结合鸿蒙的 定时任务能力(如AlarmManager)和分布式数据监听,当处方药的服药时间到达时,自动在车机屏幕或智能手表上推送提醒通知。
三、应用使用场景
1. 历史就诊记录查询(多设备便捷查阅)
2. 处方药提醒(精准用药通知)
3. 跨设备病历共享(医患协同)
四、不同场景下详细代码实现
场景 1:历史就诊记录查询(手机端)
1.1 核心代码实现(HistoryRecords.ets)
// src/main/ets/pages/HistoryRecords.ets
import { DistributedDataManager } from '../utils/DistributedManager.ets';
@Entry
@Component
struct HistoryRecords {
@State private distributedManager: DistributedDataManager = new DistributedDataManager(this.context);
@State private records: Array<VisitRecord> = []; // 就诊记录列表
// 就诊记录数据结构
interface VisitRecord {
id: string;
visitDate: string; // 就诊日期(格式:YYYY-MM-DD)
hospitalName: string; // 医院名称
department: string; // 科室
mainDiagnosis: string; // 主要诊断
}
aboutToAppear() {
this.loadHistoryRecords();
}
// 加载历史就诊记录(从分布式数据库获取)
private loadHistoryRecords() {
this.distributedManager.getHistoryRecords().then((fetchedRecords) => {
this.records = fetchedRecords || []; // 若无数据则显示空列表
}).catch((error) => {
console.error('加载就诊记录失败:', error);
this.records = []; // 错误时清空列表
});
}
build() {
Column() {
Text('历史就诊记录')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 20 });
if (this.records.length === 0) {
Text('暂无就诊记录')
.fontSize(16)
.fontColor('#999')
.margin({ top: 50 });
} else {
List() {
ForEach(this.records, (record: VisitRecord) => {
ListItem() {
Column() {
Text(`日期: ${record.visitDate}`)
.fontSize(16)
.fontWeight(FontWeight.Medium)
.margin({ bottom: 5 });
Text(`医院: ${record.hospitalName}`)
.fontSize(14)
.fontColor('#666')
.margin({ bottom: 3 });
Text(`科室: ${record.department}`)
.fontSize(14)
.fontColor('#666')
.margin({ bottom: 3 });
Text(`诊断: ${record.mainDiagnosis}`)
.fontSize(14)
.fontColor('#333')
.margin({ bottom: 10 });
}
.width('100%')
.padding(15)
.backgroundColor('#f8f8f8')
.borderRadius(8)
.margin({ bottom: 10 });
}
});
}
.layoutWeight(1)
.padding(10);
}
}
.width('100%')
.height('100%')
.padding(20);
}
}
1.2 分布式数据管理工具类(DistributedManager.ets)
// src/main/ets/utils/DistributedManager.ets
import distributedData from '@ohos.data.distributedData';
import { BusinessError } from '@ohos.base';
export class DistributedDataManager {
private context: any; // 鸿蒙上下文(通过构造函数传入)
constructor(context: any) {
this.context = context;
}
// 获取历史就诊记录(从分布式数据库)
public async getHistoryRecords(): Promise<Array<HistoryRecords.ets['VisitRecord']>> {
try {
// 打开或创建分布式数据库(数据标识符为 'EMR_HistoryRecords')
const preferences = await distributedData.getPreferences(this.context, 'EMR_HistoryRecords');
// 读取存储的就诊记录(JSON 格式字符串)
const recordsJson = await preferences.get('records', '[]');
// 解析 JSON 为对象数组
const records: Array<HistoryRecords.ets['VisitRecord']> = JSON.parse(recordsJson);
return records;
} catch (error) {
const err = error as BusinessError;
console.error(`获取就诊记录失败,错误码: ${err.code}, 消息: ${err.message}`);
throw new Error('分布式数据库读取失败');
}
}
// 保存历史就诊记录(同步到分布式数据库,其他设备自动同步)
public async saveHistoryRecords(records: Array<HistoryRecords.ets['VisitRecord']>) {
try {
const preferences = await distributedData.getPreferences(this.context, 'EMR_HistoryRecords');
// 将记录转换为 JSON 字符串存储
await preferences.put('records', JSON.stringify(records));
await preferences.flush(); // 确保数据写入磁盘并同步到分布式节点
} catch (error) {
const err = error as BusinessError;
console.error(`保存就诊记录失败,错误码: ${err.code}, 消息: ${err.message}`);
throw new Error('分布式数据库写入失败');
}
}
}
-
用户打开“历史就诊记录”页面后,自动从分布式数据库加载就诊记录列表(如最近3次就诊信息),展示医院名称、科室、诊断等关键信息; -
若无历史记录,显示“暂无就诊记录”提示; -
当患者在其他设备(如平板)新增就诊记录时,手机端通过分布式数据库自动同步更新列表。
场景 2:处方药提醒(车机端)
2.1 核心代码实现(MedicationReminder.ets)
// src/main/ets/pages/MedicationReminder.ets
import { DistributedDataManager } from '../utils/DistributedManager.ets';
import timer from '@ohos.timers';
@Entry
@Component
struct MedicationReminder {
@State private distributedManager: DistributedDataManager = new DistributedDataManager(this.context);
@State private medications: Array<Medication> = []; // 处方药列表
// 处方药数据结构
interface Medication {
id: string;
drugName: string; // 药品名称
dosage: string; // 单次剂量(如“1片”)
frequency: Array<{ time: string; period: string }>; // 服用时间(如 [{time: '09:00', period: '早餐后'}, {time: '19:00', period: '晚餐后'}])
startDate: string; // 开始日期(格式:YYYY-MM-DD)
durationDays: number; // 疗程天数
}
aboutToAppear() {
this.loadMedications();
this.startMedicationReminders();
}
// 加载处方药信息(从分布式数据库)
private loadMedications() {
this.distributedManager.getMedications().then((fetchedMeds) => {
this.medications = fetchedMeds || [];
}).catch((error) => {
console.error('加载处方药信息失败:', error);
this.medications = [];
});
}
// 启动处方药提醒(定时检查服药时间)
private startMedicationReminders() {
// 每分钟检查一次当前时间是否匹配服药时间
timer.setInterval(() => {
const now = new Date();
const currentTime = `${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
this.medications.forEach((med) => {
med.frequency.forEach((schedule) => {
if (currentTime === schedule.time) {
this.showMedicationNotification(med, schedule);
}
});
});
}, 60 * 1000); // 每60秒检查一次
}
// 显示服药提醒通知(车机端通过弹窗或语音播报)
private showMedicationNotification(med: Medication, schedule: { time: string; period: string }) {
// 实际项目中可调用鸿蒙的通知API(如 notification.requestPermission() + notification.createNotification())
console.log(`【服药提醒】${schedule.period}请服用 ${med.drugName},剂量:${med.dosage}`);
// 示例:车机屏幕弹窗提示(简化实现)
alert(`【服药提醒】${schedule.period}请服用 ${med.drugName},剂量:${med.dosage}`);
}
build() {
Column() {
Text('处方药提醒')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 20 });
if (this.medications.length === 0) {
Text('暂无处方药提醒')
.fontSize(16)
.fontColor('#999')
.margin({ top: 50 });
} else {
List() {
ForEach(this.medications, (med: Medication) => {
ListItem() {
Column() {
Text(`药品: ${med.drugName}`)
.fontSize(16)
.fontWeight(FontWeight.Medium)
.margin({ bottom: 5 });
Text(`剂量: ${med.dosage}`)
.fontSize(14)
.fontColor('#666')
.margin({ bottom: 5 });
Text(`服用时间: ${med.frequency.map(f => `${f.period}(${f.time})`).join(', ')}`)
.fontSize(14)
.fontColor('#666')
.margin({ bottom: 5 });
Text(`疗程: ${med.durationDays}天(开始于${med.startDate})`)
.fontSize(14)
.fontColor('#666');
}
.width('100%')
.padding(15)
.backgroundColor('#fff3cd')
.borderRadius(8)
.margin({ bottom: 10 });
}
});
}
.layoutWeight(1)
.padding(10);
}
}
.width('100%')
.height('100%')
.padding(20);
}
}
2.2 分布式数据管理工具类(扩展)
// 在 DistributedManager.ets 中扩展处方药相关方法
// ...(其他代码同历史记录管理)
// 获取处方药信息(从分布式数据库)
public async getMedications(): Promise<Array<MedicationReminder.ets['Medication']>> {
try {
const preferences = await distributedData.getPreferences(this.context, 'EMR_Medications');
const medsJson = await preferences.get('medications', '[]');
const medications: Array<MedicationReminder.ets['Medication']> = JSON.parse(medsJson);
return medications;
} catch (error) {
const err = error as BusinessError;
console.error(`获取处方药信息失败,错误码: ${err.code}, 消息: ${err.message}`);
throw new Error('分布式数据库读取处方药失败');
}
}
// 保存处方药信息(同步到分布式数据库)
public async saveMedications(medications: Array<MedicationReminder.ets['Medication']>) {
try {
const preferences = await distributedData.getPreferences(this.context, 'EMR_Medications');
await preferences.put('medications', JSON.stringify(medications));
await preferences.flush();
} catch (error) {
const err = error as BusinessError;
console.error(`保存处方药信息失败,错误码: ${err.code}, 消息: ${err.message}`);
throw new Error('分布式数据库写入处方药失败');
}
}
-
车机端应用启动后,自动加载处方药信息(如“阿莫西林胶囊,每日2次,早晚餐后服用”),并在每天9:00和19:00通过弹窗或语音播报提醒用户服药; -
若用户在其他设备(如手机)新增或修改处方药信息,车机端通过分布式数据库实时同步更新提醒规则。
五、原理解释
1. 鸿蒙电子病历查看的核心流程
-
数据存储与同步: -
电子病历数据(历史就诊记录、处方药信息)通过 分布式数据库(Distributed Data Service) 存储,数据标识符(如 EMR_HistoryRecords
、EMR_Medications
)唯一标识不同类型的数据集合。 -
当患者在某一设备(如手机)新增或修改就诊记录/处方药信息时,数据会通过分布式软总线自动同步到其他已授权的鸿蒙设备(如车机、平板),确保多端数据一致性。
-
-
历史就诊记录查询: -
用户在手机端打开“历史就诊记录”页面,组件通过调用 DistributedDataManager.getHistoryRecords()
方法,从分布式数据库读取存储的就诊记录(JSON 格式字符串解析为对象数组),并展示在列表中。 -
分布式数据库的 getPreferences()
方法用于获取指定标识符的数据节点,flush()
方法确保数据写入磁盘并同步到分布式网络。
-
-
处方药提醒: -
处方药信息(药品名称、服用时间、疗程)同样存储在分布式数据库中,车机端应用启动时通过 DistributedDataManager.getMedications()
加载数据。 -
通过鸿蒙的 定时任务(timer.setInterval) 每分钟检查当前时间是否匹配处方药的服用时间(如 09:00
或19:00
),若匹配则调用showMedicationNotification()
方法推送提醒(实际项目中可集成鸿蒙的通知API实现弹窗或语音提醒)。
-
-
跨设备协同: -
分布式软总线自动发现周边鸿蒙设备(如手机与车机处于同一Wi-Fi网络或蓝牙范围内),建立安全连接通道,实现电子病历数据的低延迟同步。 -
用户在不同设备上登录同一鸿蒙账号(或通过设备认证授权),确保只有授权设备可访问敏感的病历数据。
-
2. 关键技术点
-
分布式数据服务(DDS):提供跨设备的键值对存储(Preferences)和关系型数据存储(RelationalStore),本文使用 Preferences 存储结构化的就诊记录和处方药信息(JSON 格式),适合小规模数据的快速读写。 -
数据安全与隐私:通过鸿蒙的 分布式安全框架,对分布式数据库的数据进行加密存储(AES-256),并对访问设备进行身份认证(基于设备ID和用户账号),防止未授权设备获取病历信息。 -
定时任务与状态监听:处方药提醒通过定时任务轮询当前时间,实际项目中可优化为基于系统闹钟(AlarmManager)的精准触发(如只在服药时间点唤醒应用推送通知)。 -
原子化服务集成:电子病历查看功能可封装为鸿蒙原子化服务卡片,用户通过负一屏或桌面快捷入口快速查看最近就诊记录或待服药提醒,提升使用便捷性。
六、核心特性
|
|
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
七、原理流程图及原理解释
原理流程图(电子病历查看与提醒的整体流程)
+-----------------------+ +-----------------------+ +-----------------------+
| 用户操作(手机/车机)| | 分布式数据库(DDS) | | 其他鸿蒙设备(同步) |
| (查询记录/设置提醒)| ----> | (存储就诊记录/处方药)| ----> | (自动接收最新数据) |
+-----------------------+ +-----------------------+ +-----------------------+
| | |
| 读取/写入数据请求 | 数据持久化与同步 |
|--------------------------->| |
| | 通过分布式软总线广播 | 其他设备监听并更新本地缓存
| 返回数据(JSON解析后展示)| |
| | 确保多端数据一致性 |
原理解释
-
数据存储:用户的就诊记录和处方药信息通过分布式数据库(Preferences)以 JSON 格式存储,数据标识符(如 EMR_HistoryRecords
)唯一标识不同类型的数据集合。 -
数据同步:当患者在某一设备(如手机)新增或修改数据时,分布式数据库通过分布式软总线将变更推送到其他已连接的鸿蒙设备(如车机、平板),其他设备自动更新本地缓存,实现多端数据一致性。 -
查询与展示:用户在手机或车机上打开电子病历应用时,组件通过调用分布式数据管理工具类( DistributedDataManager
),从分布式数据库读取对应的数据(如历史就诊记录或处方药信息),解析后展示在页面列表中。 -
提醒触发:车机端通过定时任务(或系统闹钟)每分钟检查当前时间是否匹配处方药的服用时间,若匹配则调用提醒方法(如弹窗或语音播报),确保用户按时服药。
八、环境准备
1. 开发环境
-
操作系统:Windows 10/11 或 macOS(推荐)。 -
开发工具:DevEco Studio(鸿蒙官方IDE,版本 ≥ 3.1)。 -
SDK:HarmonyOS SDK(版本 ≥ 3.2),包含分布式软总线、分布式数据库等相关模块。 -
设备:支持鸿蒙操作系统的手机(如华为P50)、车机(如问界M5)、平板(如MatePad)(用于真机测试)。
2. 项目创建
# 通过 DevEco Studio 创建鸿蒙应用项目
- 选择模板:Empty Ability(空能力模板)
- 设备类型:支持 Phone、Car、Tablet(多设备适配)
- HarmonyOS SDK 版本:≥ 3.2
3. 权限配置(config.json)
src/main/resources/base/profile/config.json
中添加分布式数据访问和通知权限:{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.DISTRIBUTED_DATASYNC" // 分布式数据同步权限
},
{
"name": "ohos.permission.NOTIFICATION" // 通知权限(用于处方药提醒)
}
]
}
}
九、实际详细应用代码示例实现
完整示例:历史就诊记录 + 处方药提醒组合
9.1 项目结构
src/
├── main/
│ ├── ets/
│ │ ├── pages/
│ │ │ ├── HistoryRecords.ets // 历史就诊记录页面
│ │ │ └── MedicationReminder.ets // 处方药提醒页面
│ │ └── utils/
│ │ └── DistributedManager.ets // 分布式数据管理工具类
│ └── resources/
│ └── base/
│ └── profile/
│ └── config.json // 权限配置
└── entry/
└── src/
└── main/
└── ets/
└── abilities/
└── MainAbility.ets // 应用入口(路由配置)
-
手机端打开“历史就诊记录”页面,显示近期的就诊信息(如“2024-01-15,北京协和医院,内科,高血压复诊”); -
车机端打开“处方药提醒”页面,显示当前疗程的药品信息(如“阿莫西林胶囊,每日2次,早晚餐后服用”),并在每天9:00和19:00推送服药提醒; -
当患者在手机端新增就诊记录或修改处方药信息时,车机端自动同步更新。
十、运行结果
-
场景 1(历史就诊记录):手机端页面加载后,展示近期的就诊记录列表(包含日期、医院、诊断等关键信息),数据通过分布式数据库同步自云端或其他设备。 -
场景 2(处方药提醒):车机端在指定服药时间(如9:00和19:00)自动弹出提醒通知(包含药品名称和剂量),确保用户按时用药。 -
跨设备协同:在手机端新增一条就诊记录后,车机端刷新页面即可看到最新数据,验证了分布式同步的有效性。
十一、测试步骤及详细代码
测试场景 1:历史就诊记录查询
-
初始状态:手机端“历史就诊记录”页面为空(或显示默认提示)。 -
模拟数据写入:通过分布式数据库工具(或代码模拟)向 EMR_HistoryRecords
写入一条就诊记录(如{id: '1', visitDate: '2024-01-15', hospitalName: '北京协和医院', department: '内科', mainDiagnosis: '高血压复诊'}
)。 -
验证展示:手机端刷新页面,确认显示新增的就诊
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)