本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、这是一个医疗理赔项目,直接上合约代码
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
//医疗保险理赔合约
contract InsuranceContract {
//医院EOA
address private hospital ;
//保险公司EOA
address private insuranceCorp ;
//病历信息
struct MedicalRecord {
string symptom; //症状
string cause; //病因
uint day; //住院天数
uint money; //住院花费
bool exist;
}
//病人信息
struct Patient {
string name; //姓名
string addr; //家庭地址
uint recordCnt; //病历总量
mapping(uint => MedicalRecord ) records; //病历
bool exist;
}
//储存患者账户
address[] patientAddress;
//医院信息
struct hospitalInformation {
string hospital_name; //医院名字
string addr; //医院地址
string level; //医院等级
string synopsis; //简介
}
//地址映射到医院信息
mapping(address=>hospitalInformation ) public hospitalInfor ;
//保险公司信息
struct insuranceCorpInformation {
string insuranceCorp_name;//保险公司名字
string addr; //保险公司地址
string synopsis;//简介
}
//地址映射到保险公司信息
mapping(address=>insuranceCorpInformation ) public insuranceCorpInfor ;
//存储所有病人基本信息
mapping( address => Patient ) private patientData;
//记录合约主持人(保险公司)
constructor () {
insuranceCorp = msg.sender;
}
//只有保险公司才可执行
modifier onlyInsuranceCorp () {
require(msg.sender == insuranceCorp ,
"only insuranceCorp can do this");
_;
}
//只有医院才可执行
modifier onlyHospital () {
require(msg.sender == hospital ,
"only hospital can do this");
_;
}
//只有医院和保险公司才可执行
modifier onlyHospitalAndInsuranceCorp () {
require(msg.sender == hospital || msg.sender == insuranceCorp ,
"only hospital and insuranceCorp can do this");
_;
}
//设置医院EOA
function setHospital(address _hospital) public onlyInsuranceCorp {
hospital = _hospital;
}
//查询医院账户
function getHospital() public view returns(address) {
return hospital ;
}
//添加保险公司信息
function isinsuranceCorpInfor(address insuranceAddr,string memory insuranceCorp_name, string memory addr, string memory synopsis)public onlyInsuranceCorp {
insuranceCorpInfor [insuranceAddr]=insuranceCorpInformation (insuranceCorp_name,addr,synopsis);
}
//查询保险公司名字
function queryInsuranceName(address insuranceAddr)public view returns(string memory){
return insuranceCorpInfor [insuranceAddr].insuranceCorp_name;
}
//查询保险公司地址
function queryInsuranceAddr(address insuranceAddr)public view returns(string memory){
return insuranceCorpInfor [insuranceAddr].addr;
}
//查询保险公司简介
function queryInsurancesynopsis(address insuranceAddr)public view returns(string memory){
return insuranceCorpInfor [insuranceAddr].synopsis;
}
//添加医院信息
function ishospitalInfor(address hospitalAdd, string memory hospitalname,string memory addr, string memory level,string memory synopsis)
public onlyHospital {
hospitalInfor [hospitalAdd]=hospitalInformation (hospitalname,addr,level,synopsis);
}
//查询医院名字
function queryHospitalName(address hospitalAddr) public view returns(string memory) {
return hospitalInfor [hospitalAddr].hospital_name;
}
//查询医院地址
function queryHospitalAddr(address hospitalAddr) public view returns(string memory) {
return hospitalInfor [hospitalAddr].addr;
}
//查询医院等级
function queryHospitalLevel(address hospitalAddr) public view returns(string memory) {
return hospitalInfor [hospitalAddr].level;
}
//查询医院简介
function queryHospitalSynopsis(address hospitalAddr) public view returns(string memory) {
return hospitalInfor [hospitalAddr].synopsis;
}
//添加一笔病人信息
function isinsPatient(address patientAddr, string memory name,string memory addr) public onlyHospital {
require(!queryPatientExist(patientAddr), "patient data already exist");
patientData[patientAddr].name = name;
patientData[patientAddr].addr = addr;
patientData[patientAddr].recordCnt = 0;
patientData[patientAddr].exist = true;
emit InsPatientEvnt ("insPatient", patientAddr);
}
//查询病人信息是否存在
function queryPatientExist(address patientAddr) public view returns(bool) {
return patientData[patientAddr].exist;
}
//添加病人事件
event InsPatientEvnt (string indexed eventType, address patientAddr);
//添加一笔离院申请
function insRecord(address patientAddr, string memory symptom, string memory cause, uint day, uint money) public onlyHospital returns(uint){
require(queryPatientExist(patientAddr),
"patient data not exist");
//病历序号加1
patientData[patientAddr].recordCnt+=1;
uint inx = patientData[patientAddr].recordCnt;
//新离院信息
MedicalRecord memory record = MedicalRecord ({
symptom: symptom, //症状
cause: cause, //病因
day: day, //住院天数
money: money, //住院花费
exist: true //确认信息存在
});
//添加病历到病人记录中
patientData[patientAddr].records[inx] = record;
//触发离院事件
emit InsRecordEvnt ("insRecord", patientAddr, inx, day, money);
//返回病历序号
return inx;
}
//储存患者账户
function DepoPatientAc(address _patientAddr)public onlyHospital {
patientAddress.push(_patientAddr);
}
//返回患者地址
function showPatient()public view returns( address[] memory){
return patientAddress;
}
//离院申请事件
event InsRecordEvnt (string indexed eventType, address patientAddr, uint recordID, uint day, uint money);
//查询离院申请信息——病因
function queryRecordCause(address patientAddr, uint recordID) public onlyHospitalAndInsuranceCorp view returns(string memory){
require(queryPatientExist(patientAddr),
"patient data not exist");
require(patientData[patientAddr].records[recordID].exist,
"medical record not exist");
return patientData[patientAddr].records[recordID].cause;
}
//查询离院申请信息——住院天数
function queryRecordDays(address patientAddr, uint recordID) public onlyHospitalAndInsuranceCorp view returns(uint){
require(queryPatientExist(patientAddr),
"patient data not exist");
require(patientData[patientAddr].records[recordID].exist,
"medical record not exist");
return patientData[patientAddr].records[recordID].day;
}
//查询离院申请信息——住院费用
function queryRecordMoney(address patientAddr, uint recordID) public onlyHospitalAndInsuranceCorp view returns(uint){
require(queryPatientExist(patientAddr),
"patient data not exist");
require(patientData[patientAddr].records[recordID].exist,
"medical record not exist");
return patientData[patientAddr].records[recordID].money;
}
//查询病例号
function inxnum(address patientAddr) public view returns(uint) {
return patientData[patientAddr].recordCnt;
}
//查询离院申请信息——症状
function queryRecordsymptom(address patientAddr, uint recordID) public onlyHospitalAndInsuranceCorp view returns(string memory){
require(queryPatientExist(patientAddr),
"patient data not exist");
require(patientData[patientAddr].records[recordID].exist,
"medical record not exist");
return patientData[patientAddr].records[recordID].symptom;
}
//保险公司给患者转账
function yuanshuotransfer (address payable _patientaddr) public payable onlyInsuranceCorp {
_patientaddr.transfer(msg.value);
}
//患者给医院转账
function tranferMedicine(address payable hospitalAcc)public payable {
hospitalAcc.transfer(msg.value);
}
}
// contract token {
// function transfer(address receiver, uint amount)pure public{
// receiver;
// amount;
// }
// }
//transfer方法的接口说明
// contract TokenTransfer {
// token public wowToken;
// function TokenTransfer ()public {
// wowToken = token (msg.sender); //实例化一个token
// }
// function tokenTransfer(address payable _patientaddr, uint _amt) view public{
// wowToken.transfer(_patientaddr,_amt); //调用token的transfer方法
// }
// }
// contract Insurance Token is ERC20 {
// address private insuranceCorp ;
// //修饰语限制其他账户
// modifier onlyInsuranceCorp () {
// require(msg.sender == insuranceCorp ,
// "only insuranceCorp can do this");
// _;
// }
// constructor(string memory name, string memory symbol) ERC20(name, symbol) onlyInsuranceCorp {
// require(msg.sender==insuranceCorp );
// _mint(msg.sender, 100 * 10**uint(decimals()));
// }
// }