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 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 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 => 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 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 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[] ,Seller[]) {
return (product[_productId], provider[_productId], logisticsDatas[_productId], sellerDatas[_productId]);
}
}