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]);
}
}