Commit f2dc03fd authored by pengjun's avatar pengjun

#627 add user balance query api

parent 749115d7
......@@ -360,6 +360,38 @@ func CollateralizeQueryPrice(cmd *cobra.Command, args []string) {
ctx.Run()
}
func CollateralizeQueryUserBalanceCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "balance",
Short: "Query user balance",
Run: CollateralizeQueryUserBalance,
}
addCollateralizeQueryBalanceFlags(cmd)
return cmd
}
func addCollateralizeQueryBalanceFlags(cmd *cobra.Command) {
cmd.Flags().StringP("address", "a", "", "address")
cmd.MarkFlagRequired("address")
}
func CollateralizeQueryUserBalance(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
addr, _ := cmd.Flags().GetString("address")
var params rpctypes.Query4Jrpc
params.Execer = pkt.CollateralizeX
params.FuncName = "CollateralizeUserBalance"
req := &pkt.ReqCollateralizeRecordByAddr{
Addr: addr,
}
params.Payload = types.MustPBToJSON(req)
var res pkt.RepCollateralizeUserBalance
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run()
}
// CollateralizeQueryCmd 查询命令行
func CollateralizeQueryCmd() *cobra.Command {
cmd := &cobra.Command{
......@@ -371,6 +403,7 @@ func CollateralizeQueryCmd() *cobra.Command {
cmd.AddCommand(
CollateralizeQueryCfgCmd(),
CollateralizeQueryPriceCmd(),
CollateralizeQueryUserBalanceCmd(),
)
return cmd
}
......
......@@ -314,6 +314,11 @@ func TestCollateralize(t *testing.T) {
types.Encode(&pkt.ReqCollateralizeRecordByAddr{Addr: string(Nodes[1]), Status: 1}))
assert.Nil(t, err)
assert.NotNil(t, res)
// query collateralize user balance
res, err = exec.Query("CollateralizeUserBalance",
types.Encode(&pkt.ReqCollateralizeRecordByAddr{Addr: string(Nodes[1]), Status: 1}))
assert.Nil(t, err)
assert.Equal(t, int64(100), res.(*pkt.RepCollateralizeUserBalance).Balance)
// collateralize append
p5 := &pkt.CollateralizeAppendTx{
......@@ -406,6 +411,11 @@ func TestCollateralize(t *testing.T) {
types.Encode(&pkt.ReqCollateralizeRecordByAddr{Addr: string(Nodes[1]), Status: 6}))
assert.Nil(t, err)
assert.NotNil(t, res)
// query collateralize user balance
res, err = exec.Query("CollateralizeUserBalance",
types.Encode(&pkt.ReqCollateralizeRecordByAddr{Addr: string(Nodes[1]), Status: 1}))
assert.Nil(t, err)
assert.Equal(t, int64(0), res.(*pkt.RepCollateralizeUserBalance).Balance)
// collateralize liquidate
p7 := &pkt.CollateralizeBorrowTx{
......
......@@ -21,7 +21,7 @@ import (
const (
ListDESC = int32(0) // list降序
ListASC = int32(1) // list升序
DefultCount = int32(20) // 默认一次取多少条记录
DefaultCount = int32(20) // 默认一次取多少条记录
MaxCount = int32(100) // 最多取100条
)
......@@ -1172,7 +1172,7 @@ func queryCollateralizeByStatus(localdb dbm.KVDB, status int32, collID string) (
CollateralizeId: collID,
Status: status,
}
rows, err := query.List("status", data, primary, DefultCount, ListDESC)
rows, err := query.List("status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizeByStatus.List", "error", err)
return nil, err
......@@ -1201,13 +1201,13 @@ func queryCollateralizeByAddr(localdb dbm.KVDB, addr string, status int32, collI
var rows []*table.Row
var err error
if status == 0 {
rows, err = query.List("addr", data, primary, DefultCount, ListDESC)
rows, err = query.List("addr", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizeByAddr.List", "index", "addr", "error", err)
return nil, err
}
} else {
rows, err = query.List("addr_status", data, primary, DefultCount, ListDESC)
rows, err = query.List("addr_status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizeByAddr.List", "index", "addr_status", "error", err)
return nil, err
......@@ -1260,19 +1260,19 @@ func queryCollateralizeRecordByAddr(db dbm.KV, localdb dbm.KVDB, addr string, st
var rows []*table.Row
var err error
if len(collID) != 0 {
rows, err = query.List("id_addr", data, primary, DefultCount, ListDESC)
rows, err = query.List("id_addr", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizeRecordByAddr.List", "index", "id_addr", "error", err)
return nil, err
}
} else if status != 0 {
rows, err = query.List("addr_status", data, primary, DefultCount, ListDESC)
rows, err = query.List("addr_status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizeRecordByAddr.List", "index", "addr_status", "error", err)
return nil, err
}
} else {
rows, err = query.List("addr", data, primary, DefultCount, ListDESC)
rows, err = query.List("addr", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizeRecordByAddr.List", "index", "addr", "error", err)
return nil, err
......@@ -1307,13 +1307,13 @@ func queryCollateralizeRecordByStatus(db dbm.KV, localdb dbm.KVDB, status int32,
var rows []*table.Row
var err error
if len(collID) == 0 {
rows, err = query.List("status", data, primary, DefultCount, ListDESC)
rows, err = query.List("status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizeRecordByStatus.List", "index", "status", "error", err)
return nil, err
}
} else {
rows, err = query.List("id_status", data, primary, DefultCount, ListDESC)
rows, err = query.List("id_status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizeRecordByStatus.List", "index", "id_status", "error", err)
return nil, err
......@@ -1332,3 +1332,67 @@ func queryCollateralizeRecordByStatus(db dbm.KV, localdb dbm.KVDB, status int32,
return records, nil
}
func queryCollateralizeUserBalanceStatus(db dbm.KV, localdb dbm.KVDB, addr string, status int32) (int64, error) {
var totalBalance int64
query := pty.NewRecordTable(localdb).GetQuery(localdb)
var primary []byte
var data = &pty.ReceiptCollateralize{
AccountAddr: addr,
Status: status,
}
var rows []*table.Row
var err error
for {
rows, err = query.List("addr_status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizeRecordByAddr.List", "index", "addr", "error", err)
return -1, err
}
for _, row := range rows {
record, err := queryCollateralizeRecordByID(db, row.Data.(*pty.ReceiptCollateralize).CollateralizeId, row.Data.(*pty.ReceiptCollateralize).RecordId)
if err != nil {
clog.Debug("queryCollateralizeRecordByStatus.queryCollateralizeRecordByID", "error", err)
continue
}
totalBalance += record.DebtValue
}
if len(rows) < int(DefaultCount) {
break
}
primary = []byte(rows[DefaultCount-1].Data.(*pty.ReceiptCollateralize).RecordId)
}
return totalBalance,nil
}
func queryCollateralizeUserBalance(db dbm.KV, localdb dbm.KVDB, addr string) (int64, error) {
var totalBalance int64
balance, err := queryCollateralizeUserBalanceStatus(db, localdb, addr, pty.CollateralizeUserStatusCreate)
if err != nil {
clog.Error("queryCollateralizeUserBalance", "err", err)
} else {
totalBalance += balance
}
balance, err = queryCollateralizeUserBalanceStatus(db, localdb, addr, pty.CollateralizeUserStatusWarning)
if err != nil {
clog.Error("queryCollateralizeUserBalance", "err", err)
} else {
totalBalance += balance
}
balance, err = queryCollateralizeUserBalanceStatus(db, localdb, addr, pty.CollateralizeUserStatusExpire)
if err != nil {
clog.Error("queryCollateralizeUserBalance", "err", err)
} else {
totalBalance += balance
}
return totalBalance, nil
}
\ No newline at end of file
......@@ -167,3 +167,13 @@ func (c *Collateralize) Query_CollateralizePrice(req *pty.ReqCollateralizeRecord
return &pty.RepCollateralizePrice{Price: price}, nil
}
func (c *Collateralize) Query_CollateralizeUserBalance(req *pty.ReqCollateralizeRecordByAddr) (types.Message, error) {
balance, err := queryCollateralizeUserBalance(c.GetStateDB(), c.GetLocalDB(), req.Addr)
if err != nil {
clog.Error("Query_CollateralizeRecordByAddr", "get collateralize record error", err)
return nil, err
}
return &pty.RepCollateralizeUserBalance{Balance:balance}, nil
}
......@@ -215,3 +215,8 @@ message RepCollateralizeConfig {
message RepCollateralizePrice {
int64 price = 1; //当前抵押物最新价格
}
// 返回用户借贷总额
message RepCollateralizeUserBalance {
int64 balance = 1; //返回用户借贷总额
}
\ No newline at end of file
......@@ -291,6 +291,38 @@ func IssuanceQueryPrice(cmd *cobra.Command, args []string) {
ctx.Run()
}
func IssuanceQueryUserBalanceCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "balance",
Short: "Query user balance",
Run: IssuanceQueryUserBalance,
}
addIssuanceQueryBalanceFlags(cmd)
return cmd
}
func addIssuanceQueryBalanceFlags(cmd *cobra.Command) {
cmd.Flags().StringP("address", "a", "", "address")
cmd.MarkFlagRequired("address")
}
func IssuanceQueryUserBalance(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
addr, _ := cmd.Flags().GetString("address")
var params rpctypes.Query4Jrpc
params.Execer = pkt.IssuanceX
params.FuncName = "IssuanceUserBalance"
req := &pkt.ReqIssuanceRecords{
Addr: addr,
}
params.Payload = types.MustPBToJSON(req)
var res pkt.RepIssuanceUserBalance
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run()
}
// IssuanceQueryCmd 查询命令行
func IssuanceQueryCmd() *cobra.Command {
cmd := &cobra.Command{
......@@ -301,6 +333,7 @@ func IssuanceQueryCmd() *cobra.Command {
addIssuanceQueryFlags(cmd)
cmd.AddCommand(
IssuacneQueryPriceCmd(),
IssuanceQueryUserBalanceCmd(),
)
return cmd
}
......@@ -319,21 +352,11 @@ func IssuanceQuery(cmd *cobra.Command, args []string) {
issuanceID, _ := cmd.Flags().GetString("issuanceID")
address, _ := cmd.Flags().GetString("address")
statusStr, _ := cmd.Flags().GetString("status")
// indexstr, _ := cmd.Flags().GetString("index")
issuanceIDs, _ := cmd.Flags().GetString("issuanceIDs")
debtID, _ := cmd.Flags().GetString("debtID")
var params rpctypes.Query4Jrpc
params.Execer = pkt.IssuanceX
//if indexstr != "" {
// index, err := strconv.ParseInt(indexstr, 10, 64)
// if err != nil {
// fmt.Println(err)
// cmd.Help()
// return
// }
// req.Index = index
//}
var status int64
var err error
......
......@@ -291,6 +291,11 @@ func TestIssuance(t *testing.T) {
types.Encode(&pkt.ReqIssuanceRecords{Addr: string(Nodes[1]), Status: 1}))
assert.Nil(t, err)
assert.NotNil(t, res)
// query issuance user balance
res, err = exec.Query("IssuanceUserBalance",
types.Encode(&pkt.ReqIssuanceRecords{Addr: string(Nodes[1]), Status: 1}))
assert.Nil(t, err)
assert.Equal(t, 100 * types.Coin, res.(*pkt.RepIssuanceUserBalance).Balance)
// issuance repay
p5 := &pkt.IssuanceRepayTx{
......@@ -336,6 +341,11 @@ func TestIssuance(t *testing.T) {
types.Encode(&pkt.ReqIssuanceRecords{Addr: string(Nodes[1]), Status: 6}))
assert.Nil(t, err)
assert.NotNil(t, res)
// query issuance user balance
res, err = exec.Query("IssuanceUserBalance",
types.Encode(&pkt.ReqIssuanceRecords{Addr: string(Nodes[1]), Status: 1}))
assert.Nil(t, err)
assert.Equal(t, int64(0), res.(*pkt.RepIssuanceUserBalance).Balance)
// issuance liquidate
p6 := &pkt.IssuanceDebtTx{
......
......@@ -19,7 +19,7 @@ import (
const (
ListDESC = int32(0) // list降序
ListASC = int32(1) // list升序
DefultCount = int32(20) // 默认一次取多少条记录
DefaultCount = int32(20) // 默认一次取多少条记录
MaxCount = int32(100) // 最多取100条
)
......@@ -973,7 +973,7 @@ func queryIssuanceByStatus(localdb dbm.KVDB, status int32, issuanceID string) ([
IssuanceId: issuanceID,
Status: status,
}
rows, err := query.List("status", data, primary, DefultCount, ListDESC)
rows, err := query.List("status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Error("queryIssuanceByStatus.List", "error", err)
return nil, err
......@@ -1021,7 +1021,7 @@ func queryIssuanceRecordsByStatus(db dbm.KV, localdb dbm.KVDB, status int32, deb
var data = &pty.ReceiptIssuance{
Status: status,
}
rows, err := query.List("status", data, primary, DefultCount, ListDESC)
rows, err := query.List("status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Error("queryIssuanceRecordsByStatus.List", "index", "status", "error", err)
return nil, err
......@@ -1056,13 +1056,13 @@ func queryIssuanceRecordByAddr(db dbm.KV, localdb dbm.KVDB, addr string, status
var rows []*table.Row
var err error
if status == 0 {
rows, err = query.List("addr", data, primary, DefultCount, ListDESC)
rows, err = query.List("addr", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Error("queryIssuanceRecordByAddr.List", "index", "addr", "error", err)
return nil, err
}
} else {
rows, err = query.List("addr_status", data, primary, DefultCount, ListDESC)
rows, err = query.List("addr_status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Error("queryIssuanceRecordByAddr.List", "index", "addr_status", "error", err)
return nil, err
......@@ -1081,3 +1081,67 @@ func queryIssuanceRecordByAddr(db dbm.KV, localdb dbm.KVDB, addr string, status
return records, nil
}
func queryIssuanceUserBalanceStatus(db dbm.KV, localdb dbm.KVDB, addr string, status int32) (int64, error) {
var totalBalance int64
query := pty.NewRecordTable(localdb).GetQuery(localdb)
var primary []byte
var data = &pty.ReceiptIssuance{
AccountAddr: addr,
Status: status,
}
var rows []*table.Row
var err error
for {
rows, err = query.List("addr_status", data, primary, DefaultCount, ListDESC)
if err != nil {
clog.Debug("queryIssuanceRecordByAddr.List", "index", "addr", "error", err)
return -1, err
}
for _, row := range rows {
record, err := queryIssuanceRecordByID(db, row.Data.(*pty.ReceiptIssuance).IssuanceId, row.Data.(*pty.ReceiptIssuance).DebtId)
if err != nil {
clog.Debug("queryIssuanceRecordByStatus.queryIssuanceRecordByID", "error", err)
continue
}
totalBalance += record.DebtValue
}
if len(rows) < int(DefaultCount) {
break
}
primary = []byte(rows[DefaultCount-1].Data.(*pty.ReceiptIssuance).DebtId)
}
return totalBalance,nil
}
func queryIssuanceUserBalance(db dbm.KV, localdb dbm.KVDB, addr string) (int64, error) {
var totalBalance int64
balance, err := queryIssuanceUserBalanceStatus(db, localdb, addr, pty.IssuanceUserStatusCreate)
if err != nil {
clog.Error("queryIssuanceUserBalance", "err", err)
} else {
totalBalance += balance
}
balance, err = queryIssuanceUserBalanceStatus(db, localdb, addr, pty.IssuanceUserStatusWarning)
if err != nil {
clog.Error("queryIssuanceUserBalance", "err", err)
} else {
totalBalance += balance
}
balance, err = queryIssuanceUserBalanceStatus(db, localdb, addr, pty.IssuanceUserStatusExpire)
if err != nil {
clog.Error("queryIssuanceUserBalance", "err", err)
} else {
totalBalance += balance
}
return totalBalance, nil
}
\ No newline at end of file
......@@ -116,9 +116,19 @@ func (c *Issuance) Query_IssuanceRecordsByStatus(req *pty.ReqIssuanceRecords) (t
func (c *Issuance) Query_IssuancePrice(req *pty.ReqIssuanceRecords) (types.Message, error) {
price, err := getLatestPrice(c.GetStateDB())
if err != nil {
clog.Error("Query_CollateralizePrice", "error", err)
clog.Error("Query_IssuancePrice", "error", err)
return nil, err
}
return &pty.RepIssuancePrice{Price: price}, nil
}
func (c *Issuance) Query_IssuanceUserBalance(req *pty.ReqIssuanceRecords) (types.Message, error) {
balance, err := queryIssuanceUserBalance(c.GetStateDB(), c.GetLocalDB(), req.Addr)
if err != nil {
clog.Error("Query_IssuanceRecordByAddr", "get issuance record error", err)
return nil, err
}
return &pty.RepIssuanceUserBalance{Balance:balance}, nil
}
\ No newline at end of file
......@@ -173,3 +173,8 @@ message RepIssuanceDebtInfo {
message RepIssuancePrice {
int64 price = 1; //当前抵押物最新价格
}
// 返回用户发行总额
message RepIssuanceUserBalance {
int64 balance = 1; //返回用户发行总额
}
\ No newline at end of file
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment