truffle-solidity-web3.js之合约代码篇

276 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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()));
//     }
   
// }