diff --git a/chaincode/controller/stats/stats_controller.go b/chaincode/controller/stats/stats_controller.go index 335d88d5d3ea37bb8adfc8883baa66df3fa3e2c4..e0c531af5805b7cd2ebbe3a1707e4d42f8b057db 100644 --- a/chaincode/controller/stats/stats_controller.go +++ b/chaincode/controller/stats/stats_controller.go @@ -33,7 +33,7 @@ func GetStatsOperation(stub shared.LedgerBuildrStubInterface, request shared.Led if err != nil { return api.NewApiResponsePtr(fnName, err, nil).SendResponse() } - ret.GlobalStats = *globalStat + ret.GlobalStats = *model.RefineStats(globalStat) if len(*orgs) > 0 { ret.PerCompany = make(map[string]model.Stats) @@ -44,7 +44,7 @@ func GetStatsOperation(stub shared.LedgerBuildrStubInterface, request shared.Led if err != nil { return api.NewApiResponsePtr(fnName, err, nil).SendResponse() } - ret.PerCompany[org] = *orgStat + ret.PerCompany[org] = *model.RefineStats(orgStat) } return api.NewAPIGenericResponsePtr(fnName, nil, ret).SendResponse() diff --git a/chaincode/controller/stats/stub.go b/chaincode/controller/stats/stub.go index f3763d4a79b41c55712878c36193e65b4c78348d..94b2ee45307cc90d3bca9d3b35839d8e1ba88be9 100644 --- a/chaincode/controller/stats/stub.go +++ b/chaincode/controller/stats/stub.go @@ -19,10 +19,10 @@ const ORG_LIST_KEY = "org_list" type OrgList []string -func GetStats(stub shared.LedgerBuildrStubInterface, key string) (st *model.Stats, err error) { +func GetStats(stub shared.LedgerBuildrStubInterface, key string) (st *model.RawStats, err error) { value, err := stub.GetState(key) if err != nil || len(value) == 0 { - st = new(model.Stats) + st = new(model.RawStats) } else { err = json.Unmarshal(value, &st) if err != nil { @@ -33,7 +33,7 @@ func GetStats(stub shared.LedgerBuildrStubInterface, key string) (st *model.Stat return st, nil } -func PutStats(stub shared.LedgerBuildrStubInterface, key string, stats *model.Stats) (error) { +func PutStats(stub shared.LedgerBuildrStubInterface, key string, stats *model.RawStats) (error) { serialized, err := json.Marshal(stats) if err != nil { return err diff --git a/chaincode/middleware/stats.go b/chaincode/middleware/stats.go index d012f692cf75cf88c9ec98a7254a2956406552b4..5dc9fb84896f6867ab262c30fdd029117a5ba0f1 100644 --- a/chaincode/middleware/stats.go +++ b/chaincode/middleware/stats.go @@ -18,7 +18,7 @@ var ( ) -func _retrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.Stats, *model.Stats, error) { +func _retrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.RawStats, *model.RawStats, error) { org, err := stub.GetOrganization() if err != nil { return nil, nil, err @@ -37,7 +37,7 @@ func _retrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.Stats return globalStats, customStats, nil } -func _upgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.Stats, customStats *model.Stats) (error) { +func _upgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.RawStats, customStats *model.RawStats) (error) { org, err := stub.GetOrganization() if err != nil { return err diff --git a/chaincode/model/stats.go b/chaincode/model/stats.go index d6d1f362086d945ab7f9eaea427c026bb0aac0e0..ec9739fc36f86171c00a017bc5dedb95ead241d6 100644 --- a/chaincode/model/stats.go +++ b/chaincode/model/stats.go @@ -6,12 +6,57 @@ package model +type PercentageMetric struct { + Total float64 `json:"total"` // in tons + Percentage float64 `json:"percentage,omitempty"` // in % +} + +type PriceMetric struct { + Minimum float64 `json:"min"` + Maximum float64 `json:"max"` + Average float64 `json:"avg"` +} + // Total or per company +// Refined stats which will be returned type Stats struct { + TotalSlag float64 `json:"total"` // in tons + Reused PercentageMetric `json:"reused"` + Discarded PercentageMetric `json:"discarded"` + Price PriceMetric `json:"price"` +} + +// Total or per company +// Raw stored stats +type RawStats struct { TotalSlag float64 `json:"total"` // in tons SlagReused float64 `json:"reused"` // in tons SlagDiscarded float64 `json:"discarded"` // in tons - TotalPrice float64 `json:"price"` // in € + TotalPrice float64 `json:"totalPrice"` // in € + BidAmount uint32 `json:"bidAmount"` // in units MinPrice float64 `json:"minPrice"` // in € MaxPrice float64 `json:"maxPrice"` // in € } + +func RefineStats(raw *RawStats) (*Stats) { + ret := new(Stats) + ret.TotalSlag = raw.TotalSlag + + ret.Reused.Total = raw.SlagReused + if ret.TotalSlag > 0 && ret.Reused.Total > 0 { + ret.Reused.Percentage = ret.Reused.Total / ret.TotalSlag + } + + ret.Discarded.Total = raw.SlagDiscarded + if ret.TotalSlag > 0 && ret.Discarded.Total > 0 { + ret.Discarded.Percentage = ret.Discarded.Total / ret.TotalSlag + } + + ret.Price.Minimum = raw.MinPrice + ret.Price.Maximum = raw.MaxPrice + if raw.BidAmount > 0 { + ret.Price.Average = raw.TotalPrice / float64(raw.BidAmount) + } + + return ret +}