区块链智能合约教程-医疗

源码

Main.sol

以下是智能合约代码的逐段解析,按功能模块分类说明:


1. 患者信息管理

结构体定义

1
2
3
4
5
6
7
struct Sick {
address accountAddress; // 患者钱包地址
string name; // 姓名
string sex; // 性别
uint256 age; // 年龄
uint256 id; // 身份证号(主键)
}

数据存储

1
2
mapping(uint256 => Sick) public sicks;  // 身份证号→患者信息的映射
uint256[] public sickIds; // 所有患者身份证号列表

核心功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 创建患者档案 (需校验参数有效性)
function createSick(...) public {
// 参数校验...
sicks[identityNumber] = Sick(...); // 存储信息
sickIds.push(identityNumber); // 记录ID
emit SickCreated(...); // 触发事件
}

// 按身份证查询患者
function getSickByIdentityNumber(...) public view returns (...) {
require(sick.accountAddress != address(0)); // 校验存在性
return (sick.accountAddress, ...);
}

// 按钱包地址查询患者
function getSickByAccountAddress(...) public view returns (...) {
uint256 sickID = findSickIDByAccountAddress(accountAddr); // 内部遍历查找
return (sick.name, ...);
}

// 辅助函数:地址→ID映射
function findSickIDByAccountAddress(...) internal view returns (...) {
for (uint256 i = 0; i < sickIds.length; i++) {
if (sicks[sickID].accountAddress == accountAddr) return sickID;
}
return 0;
}

// 检查患者是否存在
function isSickExist(uint256 sickID) public view returns (bool) {
return sicks[sickID].accountAddress != address(0);
}

// 获取所有患者ID列表
function getSicksList() public view returns (uint256[] memory) {
return sickIds;
}

2. 预约挂号系统

结构体定义

1
2
3
4
struct Appointment {
string hospitalName; // 医院名称
string department; // 科室名称
}

数据存储

1
mapping(uint256 => Appointment) public sickAppointment; // 患者ID→预约信息

核心功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 创建预约
function createAppointment(...) public {
require(isSickExist(sickID)); // 患者必须存在
sickAppointment[sickID] = Appointment(...); // 存储预约
emit AppointmentCreated(...); // 触发事件
}

// 查询预约
function getSickAppointment(...) public view returns (...) {
require(bytes(appointment.hospitalName).length > 0); // 校验存在性
return (appointment.hospitalName, ...);
}

// 删除预约
function deleteSickAppointment(uint256 sickID) public {
delete sickAppointment[sickID]; // 清除预约记录
}

3. 电子病历管理

结构体定义

1
2
3
4
5
6
7
8
9
10
struct MedicalRecord {
uint256 sickID; // 患者ID
string hospitalName; // 医院
string department; // 科室
string doctorName; // 医生姓名
string registrationInfo; // 挂号信息
string pastMedicalHistory; // 既往病史
string currentMedicalHistory; // 现病史
string isFilled; // 是否完成("Yes"/"No")
}

数据存储

1
mapping(uint256 => MedicalRecord) public sickMedicalRecords; // 患者ID→病历

核心功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 创建空白病历
function createMedicalRecord(...) public {
sickMedicalRecords[sickID] = MedicalRecord(...);
emit MedicalRecordCreated(...);
}

// 授权医生访问病历
function authorizeDoctor(...) public {
if (病历不存在) createMedicalRecord(...); // 自动创建空病历
sickMedicalRecords[sickID].doctorName = doctorName; // 设置医生
}

// 更新病历内容
function updateMedicalRecord(...) public {
medicalRecord.hospitalName = hospitalName;
medicalRecord.pastMedicalHistory = pastMedicalHistory; // 更新病史等
emit MedicalRecordUpdated(...);
}

// 查询完整病历
function getMedicalRecordByIdentityNumber(...) public view returns (...) {
return (medicalRecord.hospitalName, ...); // 返回所有病历字段
}

// 查询特定科室的既往病史
function getPastMedicalHistory(...) public view returns (...) {
require(keccak256(科室)==keccak256(目标科室)); // 严格科室匹配
return medicalRecord.pastMedicalHistory;
}

// 标记病历完成状态
function endMedicalConsultation(...) public {
medicalRecord.isFilled = mrtype; // 设置"Yes"/"No"
}

// 检查病历是否完成
function isMedicalRecordFilled(...) public view returns (bool) {
return keccak256(medicalRecord.isFilled) == keccak256("Yes");
}

该合约完整实现了患者档案管理、挂号预约、电子病历三大核心功能,构建了医疗数据上链的基础框架。


区块链智能合约教程-医疗
https://www.zhengcookie.site/2025/07/12/区块链智能合约教程-医疗/
作者
zhengcookie
发布于
2025年7月12日
许可协议