源码
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"); }
|
该合约完整实现了患者档案管理、挂号预约、电子病历三大核心功能,构建了医疗数据上链的基础框架。