以太坊溯源合约

pragma solidity ^0.4.13;
pragma experimental ABIEncoderV2;
contract Trace {

    enum State { Provider, Seller, Received}
    
    bool lock = false;    //合约锁
    bool close = false;    //合约状态
    uint number ;
    uint productNum;

    //事件
    event NewProduct(uint productType, uint productMode,address owner,string ownerName,uint productNum,string placeOfOrigin);
    event NewProductProvider(address owner,uint provideNum,string ownerName,string providerName,string phoneNum,uint productNum,uint date); 
    event NewLogistics(address owner,string transportationMode,string driverCompany,uint productNum,string logisticsPeopleName,string logisticsPhone,string trafficToolsNum);
    // event NewQualityTesting(string qualityName,uint productNum,string qualityPeopleName,string qualityPhone,string qualityReportURL,uint qualityDate,string qualityResult);
    event NewSeller(address owner,string sellerType,uint productNum, string sellerNum, string sellerStoreName, string sellerAddress, string sellerName, string sellerPhone );

    struct Product {
       uint productType;  //产品类型
       uint productMode;  //产品生产方式
       address owner;    //添加商品溯源者地址
       string ownerName; //商品溯源者姓名
       uint productNum;  //商品编号
       string name;      //商品名称
       uint price;       //商品价格
       uint weight;      //商品重量
       string placeOfOrigin; //商品产地
       string photoURL;      //商品的照片
    }
    
    struct Provider { //供应商结构体数据
        address owner;  //供应商钱包地址 
        uint provideNum;     //供应商编号
        string ownerName;   //供应商负责人
        string providerName;// 供应商的名称
        string phoneNum;    //供应商电话号码
        uint productNum;    //供应商供应的商品编号
        uint date;        // 商品供应上链时间
    }

    struct Logistics {
        address owner;   //物流运输者钱包地址
        string transportationMode; //运输方式
        string driverCompany; //物流公司名称
        uint productNum;    //运输的商品编号   
        string logisticsPeopleName; //运输负责人姓名
        string logisticsPhone;   //运输人电话
        string trafficToolsNum; //运输工具编号
        string origin;            //装货地
        string destination;       //卸货地
        uint date;              //装货时间
        State state;            //物流状态
        uint endOfDate;         //卸货时间       
    }

    // struct QualityTesting { //质检部门数据结构
    //     string qualityName; //质检部门名称 
    //     uint productNum;    //质检的商品编号
    //     string qualityPeopleName; //质检人负责人姓名
    //     string qualityPhone;      //质检负责人电话号码
    //     string qualityReportURL; //质检过程图片
    //     uint qualityDate;      //质检具体时间
    //     string qualityResult;    //商品质检结果
    // }

     struct Seller {  //销售商结构体数据
         address owner; //销售商钱包地址 
         string sellerType;     //销售商类型
         uint productNum;      //溯源的商品编号
         string productName;   //商品名称
         string sellerNum;     //销售商编号
         string sellerStoreName; //销售商店铺名称
         string sellerAddress;   //销售商地址
         string sellerName;   //销售商负责人姓名
         string sellerPhone;  //销售商负责人电话号码
    }

        mapping (uint => Seller) seller;
        mapping (uint => Seller[]) sellerDatas;
        mapping (uint => Product) product;
        mapping (uint => Logistics) logistics;
        mapping (uint => Logistics[]) logisticsDatas;
        // mapping (uint => QualityTesting) quality; 
        // mapping (uint =>QualityTesting[] ) qualityTestingDatas;
        mapping (uint => Provider) provider;

    //构造函数  
     constructor() public {
        number=0;
        productNum=0;
    }

   //添加商品数据上链
	function addProduct(uint _productType, uint _productMode, string _ownerName, string _name, uint _price, uint _weight, string _placeOfOrigin, string _photoURL)  
    public returns (uint){
		require(_price>0, "The price is too low!");
		productNum += 1;
		Product memory product1 = Product( _productType, _productMode, msg.sender, _ownerName, productNum, _name, _price, _weight, _placeOfOrigin, _photoURL);
		product[productNum] = product1;	
        emit NewProduct(_productType, _productMode, msg.sender, _ownerName, productNum, _placeOfOrigin);	
        return productNum;
	}

    //增加商品提供商数据上链
    function addProductProvider ( uint _providerNum, string _ownerName, string _providerName, string _phoneNum, uint _productNum, uint _date ) public {
          Provider memory pro = Provider({
            owner: msg.sender,
            provideNum: _providerNum,
            ownerName: _ownerName,
            providerName: _providerName,
            phoneNum: _phoneNum,
            productNum: _productNum,
            date: _date
        });
        provider[_productNum] = pro;
        emit  NewProductProvider(msg.sender,_providerNum,_ownerName,_providerName,_phoneNum,_productNum,_date);

    }
    
    //增加物流中转运输信息
    function addLogistics(string _transportationMode,string _driverCompany, uint _productNum, string _logisticsPeopleName,
      string _logisticsPhone,string _trafficToolsNum,string _origin, string _destination, uint _date, State _state, uint _endOfDate) public {
        if(close == false){
        Logistics memory log= Logistics(msg.sender, _transportationMode, _driverCompany, _productNum, _logisticsPeopleName, _logisticsPhone, _trafficToolsNum, _origin, _destination, _date, _state, _endOfDate);
        logisticsDatas[_productNum].push(log);
        number = number + 1;
        emit NewLogistics(msg.sender, _transportationMode, _driverCompany, _productNum, _logisticsPeopleName, _logisticsPhone, _trafficToolsNum);
        lock= true;
        }
        if (_state==State.Received){
          close=true;
        }
    }

    // //增加质检相关数据上链
    // function addQualityTesting (string _qualityName, uint _productNum, string _qualityPeopleName, string _qualityPhone,string _qualityReportURL,uint _qualityDate,string _qualityResult) public {
    //     QualityTesting memory qua = QualityTesting(_qualityName,_productNum,_qualityPeopleName,_qualityPhone,_qualityReportURL,_qualityDate,_qualityResult);
    //     qualityTestingDatas[_productNum].push(qua);
    //     emit NewQualityTesting(_qualityName,_productNum,_qualityPeopleName,_qualityPhone,_qualityReportURL,_qualityDate,_qualityResult);
    // }

        //增加零售商数据上链
    function addSeller (string _sellerType, uint _productNum, string _productName, string _sellerNum, string _sellerStoreName, string _sellerAddress, string _sellerName,string _sellerPhone) public {
        Seller memory sel = Seller(msg.sender,_sellerType, _productNum, _productName, _sellerNum, _sellerStoreName, _sellerAddress, _sellerName, _sellerPhone);
        sellerDatas[_productNum].push(sel);
        emit NewSeller(msg.sender,_sellerType,_productNum,_sellerNum,_sellerStoreName,_sellerAddress,_sellerName,_sellerPhone);
    }

    // //根据商品的编号获取质检信息
    // function getQualityTesting(uint _productNum) public view returns( QualityTesting[]) {
    //     require(_productNum>0,"The parameter must be greater than 0!");
    //     QualityTesting[] memory qua =  qualityTestingDatas[_productNum]; 
    //     return qua;
    // }
    
    //根据商品的编号获取零售商数据
    function getSeller(uint _productNum) public view returns(Seller[]) {
        require(_productNum>0,"The parameter must be greater than 0!");
        Seller[] memory sel =  sellerDatas[_productNum]; 
        return sel;
    }

    //通过商品的编号获得物流相关信息
    function getLogistics(uint _number) public view returns(Logistics[]) {
        require(_number>0,"The parameter must be greater than 0!");
        Logistics[] memory node = logisticsDatas[_number];
        return node;
    }

     //根据商品的编号获取提供商信息
    function getProvider(uint _productNum) public view returns(address, uint, string, string, string,uint,uint) {
        require(_productNum>0,"The parameter must be greater than 0!");
        Provider memory pro =  provider[_productNum]; 
        return (pro.owner, pro.provideNum, pro.ownerName, pro.providerName, pro.phoneNum, _productNum, pro.date);
    }
    
    //获取物流中转中站数量
    function getLogisticsCount(uint _productNum) public view returns(uint) {
        return logisticsDatas[_productNum].length;
    }

    //获取商品溯源信息根据溯源码编号
    function getProductData(uint _productId) public view returns(address,uint, uint, string,string, uint,uint,string,string){
        require(_productId>0,"The parameter must be greater than 0!");
        Product memory pro = product[_productId];
		return (pro.owner, pro.productType, pro.productMode, pro.ownerName, pro.name, pro.price, pro.weight, pro.placeOfOrigin, pro.photoURL);
    }

    // //获取商品溯源信息根据溯源码编号
    // function getProductTraceInfor(uint _productId) public view returns (Product, Provider, Logistics[], QualityTesting[] ,Seller[]) {
    //   return (product[_productId], provider[_productId], logisticsDatas[_productId], qualityTestingDatas[_productId], sellerDatas[_productId]);
    // }

      //获取商品溯源信息根据溯源码编号
    function getProductTraceInfor(uint _productId) public view returns (Product, Provider, Logistics[] ,Seller[]) {
      return (product[_productId], provider[_productId], logisticsDatas[_productId], sellerDatas[_productId]);
    }
    
}




posted @ 2022-09-06 15:54  要买CT5的小曹  阅读(23)  评论(0)    收藏  举报  来源