|
@@ -89,7 +89,7 @@ pub async fn export_balance(config_info: BalanceConfigInfo) {
|
|
|
for item in array {
|
|
for item in array {
|
|
|
// info!("数据{:?}",item.clone().to_string());
|
|
// info!("数据{:?}",item.clone().to_string());
|
|
|
|
|
|
|
|
- let time = item["time"].as_i64().unwrap();//秒级
|
|
|
|
|
|
|
+ let time = item["time"].as_i64().unwrap(); //秒级
|
|
|
if time == times { continue; }
|
|
if time == times { continue; }
|
|
|
times = time;
|
|
times = time;
|
|
|
|
|
|
|
@@ -179,7 +179,7 @@ pub async fn export_balance(config_info: BalanceConfigInfo) {
|
|
|
count_time_list.sort_by(|a, b| a.cmp(&b));
|
|
count_time_list.sort_by(|a, b| a.cmp(&b));
|
|
|
count_time_list.insert(0, count_start_time);
|
|
count_time_list.insert(0, count_start_time);
|
|
|
count_time_list.push(count_end_time);
|
|
count_time_list.push(count_end_time);
|
|
|
- count_balance_info = supply_balance(all_account_balance_info.clone(), count_time_list.clone());
|
|
|
|
|
|
|
+ count_balance_info = supply_balance(all_account_balance_info.clone(), count_time_list.clone(), history_balance.clone());
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
let save_start_time = if history_start_time == 0 { start_time } else { history_start_time };
|
|
let save_start_time = if history_start_time == 0 { start_time } else { history_start_time };
|
|
@@ -306,13 +306,14 @@ pub fn statistic_balance(balance_info: BTreeMap<String, Vec<Vec<String>>>, count
|
|
|
format!("{}到{},总收益约为{}%,最大回撤约为{}%,其中单个账号最大回撤约为{}%。<br/><br/>余额{}", start_time, end_time, total_income, max_total_withdrawal, max_withdrawal, total_balance)
|
|
format!("{}到{},总收益约为{}%,最大回撤约为{}%,其中单个账号最大回撤约为{}%。<br/><br/>余额{}", start_time, end_time, total_income, max_total_withdrawal, max_withdrawal, total_balance)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-pub fn supply_balance(source_balance_info: BTreeMap<String, Vec<Vec<String>>>, time_slicer: Vec<i64>) -> Vec<Vec<String>> {
|
|
|
|
|
|
|
+pub fn supply_balance(source_balance_info: BTreeMap<String, Vec<Vec<String>>>, time_slicer: Vec<i64>, history_balance: serde_json::Value) -> Vec<Vec<String>> {
|
|
|
let mut balance_info_list: Vec<Vec<String>> = vec![];
|
|
let mut balance_info_list: Vec<Vec<String>> = vec![];
|
|
|
for time in time_slicer.clone() {
|
|
for time in time_slicer.clone() {
|
|
|
// 根据时间片去拿数据 ,如果有添加没有,手动添加
|
|
// 根据时间片去拿数据 ,如果有添加没有,手动添加
|
|
|
let mut total_price = Decimal::ZERO;
|
|
let mut total_price = Decimal::ZERO;
|
|
|
let mut total_status = "profit".to_string();
|
|
let mut total_status = "profit".to_string();
|
|
|
for (key, value) in source_balance_info.clone() {
|
|
for (key, value) in source_balance_info.clone() {
|
|
|
|
|
+ let last_history = history_balance["balance_list"][key.clone()].as_array().unwrap().last().unwrap();
|
|
|
let mut balance_info = value.clone();
|
|
let mut balance_info = value.clone();
|
|
|
balance_info.sort_by(|a, b| a[0].cmp(&b[0]));
|
|
balance_info.sort_by(|a, b| a[0].cmp(&b[0]));
|
|
|
|
|
|
|
@@ -323,12 +324,12 @@ pub fn supply_balance(source_balance_info: BTreeMap<String, Vec<Vec<String>>>, t
|
|
|
match new_info {
|
|
match new_info {
|
|
|
None => {
|
|
None => {
|
|
|
info.insert(0, key.clone());
|
|
info.insert(0, key.clone());
|
|
|
- new_info = Option::from(info);//记录当前实际
|
|
|
|
|
|
|
+ new_info = Option::from(info); //记录当前实际
|
|
|
}
|
|
}
|
|
|
Some(ref value) => {
|
|
Some(ref value) => {
|
|
|
if value[1] < info[1] {
|
|
if value[1] < info[1] {
|
|
|
info.insert(0, key.clone());
|
|
info.insert(0, key.clone());
|
|
|
- new_info = Option::from(info);//记录当前实际
|
|
|
|
|
|
|
+ new_info = Option::from(info); //记录当前实际
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -339,12 +340,15 @@ pub fn supply_balance(source_balance_info: BTreeMap<String, Vec<Vec<String>>>, t
|
|
|
|
|
|
|
|
match new_info {
|
|
match new_info {
|
|
|
None => {
|
|
None => {
|
|
|
|
|
+ let mut last_history_array: Vec<String> = last_history.as_array().unwrap().iter().map(|value| value.as_str().unwrap().to_string()).collect();
|
|
|
|
|
+ last_history_array.remove(0);
|
|
|
|
|
+
|
|
|
let balance_info_filter: Vec<Vec<String>> = balance_info.iter().filter(|item| {
|
|
let balance_info_filter: Vec<Vec<String>> = balance_info.iter().filter(|item| {
|
|
|
item[0].parse::<i64>().unwrap() < time
|
|
item[0].parse::<i64>().unwrap() < time
|
|
|
}).cloned().collect();
|
|
}).cloned().collect();
|
|
|
let mut last_balance_info;
|
|
let mut last_balance_info;
|
|
|
if balance_info_filter.len() == 0 {
|
|
if balance_info_filter.len() == 0 {
|
|
|
- let mut first = balance_info[0].clone();
|
|
|
|
|
|
|
+ let mut first = if balance_info.len() > 0 { balance_info[0].clone() } else { last_history_array.clone() };
|
|
|
if first[4] == "transfer" {
|
|
if first[4] == "transfer" {
|
|
|
let first_change = Decimal::from_str(&first[2]).unwrap();
|
|
let first_change = Decimal::from_str(&first[2]).unwrap();
|
|
|
let first_balance = Decimal::from_str(&first[3]).unwrap();
|
|
let first_balance = Decimal::from_str(&first[3]).unwrap();
|