|
@@ -123,12 +123,12 @@ impl Platform for GateSwap {
|
|
|
// 获取持仓信息
|
|
// 获取持仓信息
|
|
|
async fn get_position(&mut self) -> Result<Vec<Position>, Error> {
|
|
async fn get_position(&mut self) -> Result<Vec<Position>, Error> {
|
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
|
- let amount_size = self.market.amount_size;
|
|
|
|
|
|
|
+ let ct_val = self.market.ct_val;
|
|
|
let res_data = self.request.get_position(symbol_array[1].to_string().to_lowercase(), self.symbol.clone()).await;
|
|
let res_data = self.request.get_position(symbol_array[1].to_string().to_lowercase(), self.symbol.clone()).await;
|
|
|
if res_data.code == "200" {
|
|
if res_data.code == "200" {
|
|
|
let res_data_str = &res_data.data;
|
|
let res_data_str = &res_data.data;
|
|
|
let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
|
|
let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
|
|
|
- let result = res_data_json.iter().map(|item| { format_position_item(item, amount_size) }).collect();
|
|
|
|
|
|
|
+ let result = res_data_json.iter().map(|item| { format_position_item(item, ct_val) }).collect();
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
} else {
|
|
} else {
|
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
@@ -137,12 +137,12 @@ impl Platform for GateSwap {
|
|
|
// 获取所有持仓
|
|
// 获取所有持仓
|
|
|
async fn get_positions(&mut self) -> Result<Vec<Position>, Error> {
|
|
async fn get_positions(&mut self) -> Result<Vec<Position>, Error> {
|
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
|
- let amount_size = self.market.amount_size;
|
|
|
|
|
|
|
+ let ct_val = self.market.ct_val;
|
|
|
let res_data = self.request.get_user_position(symbol_array[1].to_string().to_lowercase()).await;
|
|
let res_data = self.request.get_user_position(symbol_array[1].to_string().to_lowercase()).await;
|
|
|
if res_data.code == "200" {
|
|
if res_data.code == "200" {
|
|
|
let res_data_str = &res_data.data;
|
|
let res_data_str = &res_data.data;
|
|
|
let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
|
|
let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
|
|
|
- let result = res_data_json.iter().map(|item| { format_position_item(item, amount_size) }).collect();
|
|
|
|
|
|
|
+ let result = res_data_json.iter().map(|item| { format_position_item(item, ct_val) }).collect();
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
} else {
|
|
} else {
|
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
@@ -225,23 +225,23 @@ impl Platform for GateSwap {
|
|
|
let name = value["name"].as_str().unwrap();
|
|
let name = value["name"].as_str().unwrap();
|
|
|
let name_array: Vec<&str> = name.split("_").collect();
|
|
let name_array: Vec<&str> = name.split("_").collect();
|
|
|
let tick_size = Decimal::from_str(value["order_price_round"].as_str().unwrap()).unwrap();
|
|
let tick_size = Decimal::from_str(value["order_price_round"].as_str().unwrap()).unwrap();
|
|
|
- let amount_size = Decimal::from_str(value["quanto_multiplier"].as_str().unwrap()).unwrap();
|
|
|
|
|
|
|
+ let ct_val = Decimal::from_str(value["quanto_multiplier"].as_str().unwrap()).unwrap();
|
|
|
let price_precision = Decimal::from_u32(tick_size.scale()).unwrap();
|
|
let price_precision = Decimal::from_u32(tick_size.scale()).unwrap();
|
|
|
- let amount_precision = Decimal::from_u32(amount_size.scale()).unwrap();
|
|
|
|
|
|
|
+ let amount_precision = Decimal::from_u32(ct_val.scale()).unwrap();
|
|
|
|
|
|
|
|
let result = Market {
|
|
let result = Market {
|
|
|
symbol: name.to_string(),
|
|
symbol: name.to_string(),
|
|
|
base_asset: name_array[0].to_string(),
|
|
base_asset: name_array[0].to_string(),
|
|
|
quote_asset: name_array[1].to_string(),
|
|
quote_asset: name_array[1].to_string(),
|
|
|
tick_size,
|
|
tick_size,
|
|
|
- amount_size,
|
|
|
|
|
|
|
+ amount_size: Default::default(),
|
|
|
|
|
+ ct_val,
|
|
|
price_precision,
|
|
price_precision,
|
|
|
amount_precision,
|
|
amount_precision,
|
|
|
min_qty: Decimal::from_str(&value["order_size_min"].to_string()).unwrap(),
|
|
min_qty: Decimal::from_str(&value["order_size_min"].to_string()).unwrap(),
|
|
|
max_qty: Decimal::from_str(&value["order_size_max"].to_string()).unwrap(),
|
|
max_qty: Decimal::from_str(&value["order_size_max"].to_string()).unwrap(),
|
|
|
min_notional: Default::default(),
|
|
min_notional: Default::default(),
|
|
|
max_notional: Default::default(),
|
|
max_notional: Default::default(),
|
|
|
- ct_val: Default::default(),
|
|
|
|
|
};
|
|
};
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
}
|
|
}
|
|
@@ -267,23 +267,23 @@ impl Platform for GateSwap {
|
|
|
let name = value["name"].as_str().unwrap();
|
|
let name = value["name"].as_str().unwrap();
|
|
|
let name_array: Vec<&str> = name.split("_").collect();
|
|
let name_array: Vec<&str> = name.split("_").collect();
|
|
|
let tick_size = Decimal::from_str(value["order_price_round"].as_str().unwrap()).unwrap();
|
|
let tick_size = Decimal::from_str(value["order_price_round"].as_str().unwrap()).unwrap();
|
|
|
- let amount_size = Decimal::from_str(value["quanto_multiplier"].as_str().unwrap()).unwrap();
|
|
|
|
|
|
|
+ let ct_val = Decimal::from_str(value["quanto_multiplier"].as_str().unwrap()).unwrap();
|
|
|
let price_precision = Decimal::from_u32(tick_size.scale()).unwrap();
|
|
let price_precision = Decimal::from_u32(tick_size.scale()).unwrap();
|
|
|
- let amount_precision = Decimal::from_u32(amount_size.scale()).unwrap();
|
|
|
|
|
|
|
+ let amount_precision = Decimal::from_u32(ct_val.scale()).unwrap();
|
|
|
|
|
|
|
|
let result = Market {
|
|
let result = Market {
|
|
|
symbol: name.to_string(),
|
|
symbol: name.to_string(),
|
|
|
base_asset: name_array[0].to_string(),
|
|
base_asset: name_array[0].to_string(),
|
|
|
quote_asset: name_array[1].to_string(),
|
|
quote_asset: name_array[1].to_string(),
|
|
|
tick_size,
|
|
tick_size,
|
|
|
- amount_size,
|
|
|
|
|
|
|
+ amount_size: Default::default(),
|
|
|
|
|
+ ct_val,
|
|
|
price_precision,
|
|
price_precision,
|
|
|
amount_precision,
|
|
amount_precision,
|
|
|
min_qty: Decimal::from_str(&value["order_size_min"].to_string()).unwrap(),
|
|
min_qty: Decimal::from_str(&value["order_size_min"].to_string()).unwrap(),
|
|
|
max_qty: Decimal::from_str(&value["order_size_max"].to_string()).unwrap(),
|
|
max_qty: Decimal::from_str(&value["order_size_max"].to_string()).unwrap(),
|
|
|
min_notional: Default::default(),
|
|
min_notional: Default::default(),
|
|
|
max_notional: Default::default(),
|
|
max_notional: Default::default(),
|
|
|
- ct_val: Default::default(),
|
|
|
|
|
};
|
|
};
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
}
|
|
}
|
|
@@ -296,13 +296,13 @@ impl Platform for GateSwap {
|
|
|
// 获取订单详情
|
|
// 获取订单详情
|
|
|
async fn get_order_detail(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error> {
|
|
async fn get_order_detail(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error> {
|
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
|
- let amount_size = self.market.amount_size;
|
|
|
|
|
|
|
+ let ct_val = self.market.ct_val;
|
|
|
let id = if order_id.eq("") { format!("t-my-custom-id_{}", custom_id) } else { order_id.to_string() };
|
|
let id = if order_id.eq("") { format!("t-my-custom-id_{}", custom_id) } else { order_id.to_string() };
|
|
|
let res_data = self.request.get_order_details(symbol_array[1].to_string().to_lowercase(), id).await;
|
|
let res_data = self.request.get_order_details(symbol_array[1].to_string().to_lowercase(), id).await;
|
|
|
if res_data.code == "200" {
|
|
if res_data.code == "200" {
|
|
|
let res_data_str = &res_data.data;
|
|
let res_data_str = &res_data.data;
|
|
|
let res_data_json: serde_json::Value = serde_json::from_str(res_data_str).unwrap();
|
|
let res_data_json: serde_json::Value = serde_json::from_str(res_data_str).unwrap();
|
|
|
- let result = format_order_item(res_data_json, amount_size);
|
|
|
|
|
|
|
+ let result = format_order_item(res_data_json, ct_val);
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
} else {
|
|
} else {
|
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
@@ -311,13 +311,13 @@ impl Platform for GateSwap {
|
|
|
// 获取订单列表
|
|
// 获取订单列表
|
|
|
async fn get_orders_list(&mut self, status: &str) -> Result<Vec<Order>, Error> {
|
|
async fn get_orders_list(&mut self, status: &str) -> Result<Vec<Order>, Error> {
|
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
|
- let amount_size = self.market.amount_size;
|
|
|
|
|
|
|
+ let ct_val = self.market.ct_val;
|
|
|
let res_data = self.request.get_orders(symbol_array[1].to_string().to_lowercase(), status.to_string()).await;
|
|
let res_data = self.request.get_orders(symbol_array[1].to_string().to_lowercase(), status.to_string()).await;
|
|
|
if res_data.code == "200" {
|
|
if res_data.code == "200" {
|
|
|
let res_data_str = &res_data.data;
|
|
let res_data_str = &res_data.data;
|
|
|
let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
|
|
let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
|
|
|
let order_info: Vec<_> = res_data_json.iter().filter(|item| item["contract"].as_str().unwrap_or("") == self.symbol).collect();
|
|
let order_info: Vec<_> = res_data_json.iter().filter(|item| item["contract"].as_str().unwrap_or("") == self.symbol).collect();
|
|
|
- let result = order_info.iter().map(|&item| format_order_item(item.clone(), amount_size)).collect();
|
|
|
|
|
|
|
+ let result = order_info.iter().map(|&item| format_order_item(item.clone(), ct_val)).collect();
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
} else {
|
|
} else {
|
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
@@ -326,13 +326,13 @@ impl Platform for GateSwap {
|
|
|
// 下单接口
|
|
// 下单接口
|
|
|
async fn take_order(&mut self, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
|
|
async fn take_order(&mut self, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
|
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
|
- let amount_size = self.market.amount_size;
|
|
|
|
|
|
|
+ let ct_val = self.market.ct_val;
|
|
|
let mut params = json!({
|
|
let mut params = json!({
|
|
|
"text": format!("t-my-custom-id_{}", custom_id),
|
|
"text": format!("t-my-custom-id_{}", custom_id),
|
|
|
"contract": self.symbol.to_string(),
|
|
"contract": self.symbol.to_string(),
|
|
|
"price": price.to_string(),
|
|
"price": price.to_string(),
|
|
|
});
|
|
});
|
|
|
- let size = (amount / amount_size).floor();
|
|
|
|
|
|
|
+ let size = (amount / ct_val).floor();
|
|
|
if price.eq(&dec!(0)) {
|
|
if price.eq(&dec!(0)) {
|
|
|
params["tif"] = json!("ioc".to_string());
|
|
params["tif"] = json!("ioc".to_string());
|
|
|
}
|
|
}
|
|
@@ -359,7 +359,7 @@ impl Platform for GateSwap {
|
|
|
if res_data.code == "200" {
|
|
if res_data.code == "200" {
|
|
|
let res_data_str = &res_data.data;
|
|
let res_data_str = &res_data.data;
|
|
|
let res_data_json: serde_json::Value = serde_json::from_str(res_data_str).unwrap();
|
|
let res_data_json: serde_json::Value = serde_json::from_str(res_data_str).unwrap();
|
|
|
- let result = format_order_item(res_data_json, amount_size);
|
|
|
|
|
|
|
+ let result = format_order_item(res_data_json, ct_val);
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
} else {
|
|
} else {
|
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
@@ -368,13 +368,13 @@ impl Platform for GateSwap {
|
|
|
|
|
|
|
|
async fn take_order_symbol(&mut self, symbol: String, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
|
|
async fn take_order_symbol(&mut self, symbol: String, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
|
|
|
let symbol_array: Vec<&str> = symbol.split("_").collect();
|
|
let symbol_array: Vec<&str> = symbol.split("_").collect();
|
|
|
- let amount_size = self.market.amount_size;
|
|
|
|
|
|
|
+ let ct_val = self.market.ct_val;
|
|
|
let mut params = json!({
|
|
let mut params = json!({
|
|
|
"text": format!("t-my-custom-id_{}", custom_id),
|
|
"text": format!("t-my-custom-id_{}", custom_id),
|
|
|
"contract": self.symbol.to_string(),
|
|
"contract": self.symbol.to_string(),
|
|
|
"price": price.to_string(),
|
|
"price": price.to_string(),
|
|
|
});
|
|
});
|
|
|
- let size = (amount / amount_size).floor();
|
|
|
|
|
|
|
+ let size = (amount / ct_val).floor();
|
|
|
if price.eq(&dec!(0)) {
|
|
if price.eq(&dec!(0)) {
|
|
|
params["tif"] = json!("ioc".to_string());
|
|
params["tif"] = json!("ioc".to_string());
|
|
|
}
|
|
}
|
|
@@ -401,7 +401,7 @@ impl Platform for GateSwap {
|
|
|
if res_data.code == "200" {
|
|
if res_data.code == "200" {
|
|
|
let res_data_str = &res_data.data;
|
|
let res_data_str = &res_data.data;
|
|
|
let res_data_json: serde_json::Value = serde_json::from_str(res_data_str).unwrap();
|
|
let res_data_json: serde_json::Value = serde_json::from_str(res_data_str).unwrap();
|
|
|
- let result = format_order_item(res_data_json, amount_size);
|
|
|
|
|
|
|
+ let result = format_order_item(res_data_json, ct_val);
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
} else {
|
|
} else {
|
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
@@ -411,14 +411,14 @@ impl Platform for GateSwap {
|
|
|
// 撤销订单
|
|
// 撤销订单
|
|
|
async fn cancel_order(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error> {
|
|
async fn cancel_order(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error> {
|
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
|
- let amount_size = self.market.amount_size;
|
|
|
|
|
|
|
+ let ct_val = self.market.ct_val;
|
|
|
let settle = symbol_array[1].to_string().to_lowercase();
|
|
let settle = symbol_array[1].to_string().to_lowercase();
|
|
|
let id = if order_id.eq("") { format!("t-my-custom-id_{}", custom_id) } else { order_id.to_string() };
|
|
let id = if order_id.eq("") { format!("t-my-custom-id_{}", custom_id) } else { order_id.to_string() };
|
|
|
let res_data = self.request.cancel_order(settle, id.to_string()).await;
|
|
let res_data = self.request.cancel_order(settle, id.to_string()).await;
|
|
|
if res_data.code == "200" {
|
|
if res_data.code == "200" {
|
|
|
let res_data_str = &res_data.data;
|
|
let res_data_str = &res_data.data;
|
|
|
let res_data_json: serde_json::Value = serde_json::from_str(res_data_str).unwrap();
|
|
let res_data_json: serde_json::Value = serde_json::from_str(res_data_str).unwrap();
|
|
|
- let result = format_order_item(res_data_json, amount_size);
|
|
|
|
|
|
|
+ let result = format_order_item(res_data_json, ct_val);
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
} else {
|
|
} else {
|
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
@@ -427,12 +427,12 @@ impl Platform for GateSwap {
|
|
|
// 批量撤销订单
|
|
// 批量撤销订单
|
|
|
async fn cancel_orders(&mut self) -> Result<Vec<Order>, Error> {
|
|
async fn cancel_orders(&mut self) -> Result<Vec<Order>, Error> {
|
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
let symbol_array: Vec<&str> = self.symbol.split("_").collect();
|
|
|
- let amount_size = self.market.tick_size;
|
|
|
|
|
|
|
+ let ct_val = self.market.tick_size;
|
|
|
let res_data = self.request.cancel_orders(symbol_array[1].to_string().to_lowercase(), self.symbol.to_string()).await;
|
|
let res_data = self.request.cancel_orders(symbol_array[1].to_string().to_lowercase(), self.symbol.to_string()).await;
|
|
|
if res_data.code == "200" {
|
|
if res_data.code == "200" {
|
|
|
let res_data_str = &res_data.data;
|
|
let res_data_str = &res_data.data;
|
|
|
let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
|
|
let res_data_json: Vec<serde_json::Value> = serde_json::from_str(res_data_str).unwrap();
|
|
|
- let result = res_data_json.iter().map(|item| format_order_item(item.clone(), amount_size)).collect();
|
|
|
|
|
|
|
+ let result = res_data_json.iter().map(|item| format_order_item(item.clone(), ct_val)).collect();
|
|
|
Ok(result)
|
|
Ok(result)
|
|
|
} else {
|
|
} else {
|
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
Err(Error::new(ErrorKind::Other, res_data.to_string()))
|
|
@@ -587,7 +587,7 @@ impl Platform for GateSwap {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-pub fn format_position_item(position: &serde_json::Value, amount_size: Decimal) -> Position {
|
|
|
|
|
|
|
+pub fn format_position_item(position: &serde_json::Value, ct_val: Decimal) -> Position {
|
|
|
let mut position_mode = match position["mode"].as_str().unwrap_or("") {
|
|
let mut position_mode = match position["mode"].as_str().unwrap_or("") {
|
|
|
"single" => PositionModeEnum::Both,
|
|
"single" => PositionModeEnum::Both,
|
|
|
"dual_long" => PositionModeEnum::Long,
|
|
"dual_long" => PositionModeEnum::Long,
|
|
@@ -598,7 +598,7 @@ pub fn format_position_item(position: &serde_json::Value, amount_size: Decimal)
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
let size = Decimal::from_str(&position["size"].to_string()).unwrap();
|
|
let size = Decimal::from_str(&position["size"].to_string()).unwrap();
|
|
|
- let amount = size * amount_size;
|
|
|
|
|
|
|
+ let amount = size * ct_val;
|
|
|
match position_mode {
|
|
match position_mode {
|
|
|
PositionModeEnum::Both => {
|
|
PositionModeEnum::Both => {
|
|
|
position_mode = match amount {
|
|
position_mode = match amount {
|
|
@@ -621,7 +621,7 @@ pub fn format_position_item(position: &serde_json::Value, amount_size: Decimal)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-pub fn format_order_item(order: serde_json::Value, amount_size: Decimal) -> Order {
|
|
|
|
|
|
|
+pub fn format_order_item(order: serde_json::Value, ct_val: Decimal) -> Order {
|
|
|
debug!("format-order-start, gate_swap");
|
|
debug!("format-order-start, gate_swap");
|
|
|
debug!(?order);
|
|
debug!(?order);
|
|
|
let status = order["status"].as_str().unwrap_or("");
|
|
let status = order["status"].as_str().unwrap_or("");
|
|
@@ -629,8 +629,8 @@ pub fn format_order_item(order: serde_json::Value, amount_size: Decimal) -> Orde
|
|
|
let size = Decimal::from_str(&order["size"].to_string()).unwrap();
|
|
let size = Decimal::from_str(&order["size"].to_string()).unwrap();
|
|
|
let left = Decimal::from_str(&order["left"].to_string()).unwrap();
|
|
let left = Decimal::from_str(&order["left"].to_string()).unwrap();
|
|
|
|
|
|
|
|
- let amount = size * amount_size;
|
|
|
|
|
- let deal_amount = (size - left) * amount_size;
|
|
|
|
|
|
|
+ let amount = size * ct_val;
|
|
|
|
|
+ let deal_amount = (size - left) * ct_val;
|
|
|
let custom_status = if status == "finished" { "REMOVE".to_string() } else if status == "open" { "NEW".to_string() } else {
|
|
let custom_status = if status == "finished" { "REMOVE".to_string() } else if status == "open" { "NEW".to_string() } else {
|
|
|
error!("Gate:格式化订单状态错误!\nformat_order_item:status={:?}", status);
|
|
error!("Gate:格式化订单状态错误!\nformat_order_item:status={:?}", status);
|
|
|
panic!("Gate:格式化订单状态错误!\nformat_order_item:status={:?}", status)
|
|
panic!("Gate:格式化订单状态错误!\nformat_order_item:status={:?}", status)
|