export_balance.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. use std::collections::{BTreeMap};
  2. use std::str::FromStr;
  3. use chrono::NaiveDateTime;
  4. use rust_decimal::Decimal;
  5. use tracing::info;
  6. use crate::{export_template};
  7. use crate::swap_gate::gate_swap_rest_utils::GateSwapRest;
  8. use crate::utils::utils::BalanceConfigInfo;
  9. pub async fn export_balance(config_info: BalanceConfigInfo) {
  10. let config_info_clone = config_info.clone();
  11. let start_time = NaiveDateTime::parse_from_str(&config_info.range_time[0].clone(), "%Y-%m-%d %H:%M:%S").unwrap().timestamp() - 8 * 3600;
  12. let end_time = NaiveDateTime::parse_from_str(&config_info.range_time[1].clone(), "%Y-%m-%d %H:%M:%S").unwrap().timestamp() - 8 * 3600;
  13. let count_start_time = NaiveDateTime::parse_from_str(&config_info.count_range_time[0].clone(), "%Y-%m-%d %H:%M:%S").unwrap().timestamp() - 8 * 3600;
  14. let count_end_time = NaiveDateTime::parse_from_str(&config_info.count_range_time[1].clone(), "%Y-%m-%d %H:%M:%S").unwrap().timestamp() - 8 * 3600;
  15. //获取不同账号的数据
  16. let mut acc_all_data: BTreeMap<String, Vec<Vec<String>>> = BTreeMap::new();
  17. let mut account_name_list: Vec<String> = vec![];
  18. loop {
  19. if config_info_clone.account_list.len() == 0 {
  20. info!("没有账号信息");
  21. return;
  22. }
  23. for account in config_info_clone.account_list.clone() {
  24. let mut account_info: BTreeMap<String, String> = BTreeMap::new();
  25. account_info.insert("account_name".to_string(), account[0].clone());
  26. account_info.insert("access_key".to_string(), account[1].clone());
  27. account_info.insert("secret_key".to_string(), account[2].clone());
  28. let mut gate_exc = GateSwapRest::new(false, account_info.clone());
  29. let data = gate_exc.account_book("usdt".to_string()).await;
  30. // info!("请求完成{:?}",data.clone());
  31. if data.code.as_str() == "200" {
  32. let account_name = account_info.get("account_name").unwrap();
  33. account_name_list.push(account_name.clone());
  34. //账号
  35. let json_value: serde_json::Value = serde_json::from_str(&data.data).unwrap();
  36. if let serde_json::Value::Array(array) = json_value {
  37. let mut name_data_all: Vec<Vec<String>> = vec![];
  38. let mut times = 0;
  39. for item in array {
  40. let time = item["time"].as_i64().unwrap();//秒级
  41. if time == times { continue; }
  42. times = time;
  43. let change = item["change"].as_str().unwrap();
  44. let balance = item["balance"].as_str().unwrap();
  45. let type_str = match item["type"].as_str().unwrap() {
  46. "dnw" => { "转入转出" }
  47. "pnl" => { "减仓盈亏" }
  48. "fee" => {
  49. "交易手续费";
  50. continue;
  51. }
  52. "refr" => {
  53. "推荐人返佣";
  54. continue;
  55. }
  56. "fund" => {
  57. "资金费用";
  58. continue;
  59. }
  60. "point_dnw" => {
  61. "点卡转入转出";
  62. continue;
  63. }
  64. "point_fee" => {
  65. "点卡交易手续费";
  66. continue;
  67. }
  68. "point_refr" => {
  69. "点卡推荐人返佣";
  70. continue;
  71. }
  72. _ => {
  73. "未知-变更类型";
  74. continue;
  75. }
  76. };
  77. let text = item["text"].as_str().unwrap();
  78. let contract = item["contract"].as_str().unwrap();
  79. let trade_id = item["trade_id"].as_str().unwrap();
  80. let mut name_data_array: Vec<String> = vec![];
  81. name_data_array.push(time.to_string());
  82. name_data_array.push(trade_id.to_string());
  83. name_data_array.push(change.to_string());
  84. name_data_array.push(balance.to_string());
  85. name_data_array.push(type_str.to_string());
  86. name_data_array.push(contract.to_string());
  87. name_data_array.push(text.to_string());
  88. name_data_all.push(name_data_array.clone());
  89. }
  90. acc_all_data.insert(account_name.clone(), name_data_all.clone());
  91. } else {
  92. info!("不是数组 检查数据");
  93. }
  94. }
  95. // break;
  96. }
  97. break;//这里是为了 代码收纳,用了loop来放置代码
  98. }
  99. // 根据账户变动填充
  100. let mut count_time_list = vec![];
  101. for (_account_name, account_info) in acc_all_data.clone() {
  102. for value in account_info {
  103. let time = value[0].clone().parse::<i64>().unwrap();
  104. if !count_time_list.contains(&time) && time > count_start_time && time < count_end_time {
  105. count_time_list.push(time)
  106. }
  107. }
  108. };
  109. count_time_list.sort_by(|a, b| a.cmp(&b));
  110. let mut bbbbbb = supply_balance(acc_all_data.clone(), count_time_list.clone());
  111. let aaaaa: Vec<Vec<String>> = bbbbbb.clone().into_iter().filter(|value| {
  112. let t = value[1].clone().parse::<i64>().unwrap();
  113. t >= start_time && t <= end_time
  114. }).collect();
  115. bbbbbb = aaaaa;
  116. // 按小时取时间片
  117. let mut last_timestamp: i64 = -1;
  118. let mut export_time_list: Vec<i64> = vec![];
  119. for item in start_time..end_time {
  120. if item / 3600 != last_timestamp / 3600 {
  121. last_timestamp = item;
  122. export_time_list.push(last_timestamp);
  123. }
  124. }
  125. export_time_list.push(end_time);
  126. let mut data_array_all: Vec<Vec<String>> = supply_balance(acc_all_data.clone(), export_time_list.clone());
  127. //2. 数据根据时间片 补全数据
  128. let data_array_all_array: Vec<Vec<String>> = data_array_all.clone().into_iter().filter(|value| {
  129. let t = value[1].clone().parse::<i64>().unwrap();
  130. t >= start_time && t <= end_time
  131. }).collect();
  132. data_array_all = data_array_all_array;
  133. //生成 html
  134. account_name_list.push("sum_acc".to_string());
  135. export_template::template_balance::export_html(config_info_clone.clone(), &account_name_list, &count_time_list, &bbbbbb);
  136. }
  137. pub fn supply_balance(source_balance_info: BTreeMap<String, Vec<Vec<String>>>, time_slicer: Vec<i64>) -> Vec<Vec<String>> {
  138. let mut balance_info_list: Vec<Vec<String>> = vec![];
  139. for time in time_slicer.clone() {
  140. // 根据时间片去拿数据 ,如果有添加没有,手动添加
  141. let mut total_price = Decimal::ZERO;
  142. for (key, value) in source_balance_info.clone() {
  143. let mut balance_info = value.clone();
  144. balance_info.sort_by(|a, b| a[0].cmp(&b[0]));
  145. let mut new_info: Option<Vec<String>> = None;
  146. for mut info in balance_info.clone() {
  147. let info_time = info[0].parse::<i64>().unwrap();
  148. if info_time == time {
  149. info.insert(0, key.clone());
  150. new_info = Option::from(info.clone());
  151. break;
  152. }
  153. }
  154. match new_info {
  155. None => {
  156. let balance_info_filter: Vec<Vec<String>> = balance_info.iter().filter(|item| {
  157. item[0].parse::<i64>().unwrap() < time
  158. }).cloned().collect();
  159. let mut last_balance_info = balance_info_filter[balance_info_filter.len() - 1].clone();
  160. last_balance_info.insert(0, key.clone());
  161. total_price += Decimal::from_str(&last_balance_info[4]).unwrap();
  162. balance_info_list.push(last_balance_info);
  163. }
  164. Some(info) => {
  165. }
  166. }
  167. // //如果匹配到时间片,直接使用,没有则创建
  168. // let new_d: Vec<String> = match da {
  169. // None => {
  170. // let mut row: Vec<String> = vec![];
  171. // let filter_arrya: Vec<Vec<String>> = value.clone().into_iter().filter(|s| {
  172. // // info!("读取time:{:?}",s);
  173. // let time_v = s[0].clone().parse::<i64>().unwrap();
  174. // time_v < time.clone()
  175. // }).collect();
  176. // // info!("计算filter_arrya:---{:?}",filter_arrya.clone());
  177. // let acc_name = key.clone().to_string();
  178. // let acc_time = time.to_string();
  179. // let acc_o_id = "填补数据类型".to_string();
  180. // let mut acc_change = "0".to_string();
  181. // let mut acc_balance = "0".to_string();
  182. // let acc_type = "填补数据类型".to_string();
  183. // let mut acc_contract = "填补数据类型".to_string();
  184. //
  185. // if filter_arrya.len() > 0 {
  186. // // info!("{:?}--{}--{:?}",acc_name, time, filter_arrya[filter_arrya.len() - 1].clone());
  187. // let zj_v = filter_arrya[filter_arrya.len() - 1].clone();
  188. //
  189. // acc_change = zj_v[2].clone();
  190. // acc_balance = zj_v[3].clone();
  191. // acc_contract = zj_v[5].clone();
  192. // }
  193. //
  194. // let acc_balance_round = Decimal::from_str(&acc_balance).unwrap().round_dp(2);
  195. //
  196. // row.push(acc_name);
  197. // row.push(acc_time);
  198. // row.push(acc_o_id);
  199. // row.push(acc_change);
  200. // row.push(acc_balance_round.to_string());
  201. // row.push(acc_type);
  202. // row.push(acc_contract);
  203. // row
  204. // }
  205. // Some(d) => {
  206. // let mut row: Vec<String> = vec![];
  207. // row.push(key.clone());
  208. // row.extend(d.clone());
  209. // row
  210. // }
  211. // };
  212. // total_price = total_price + Decimal::from_str(&new_d[4]).unwrap();
  213. // data_array_all.push(new_d);
  214. }
  215. let mut sum_row: Vec<String> = vec![];
  216. sum_row.push("sum_acc".to_string());
  217. sum_row.push(time.clone().to_string());
  218. sum_row.push("".to_string());
  219. sum_row.push("0".to_string());
  220. sum_row.push(total_price.to_string());
  221. sum_row.push("".to_string());
  222. sum_row.push("".to_string());
  223. sum_row.push("".to_string());
  224. balance_info_list.push(sum_row.clone());
  225. };
  226. println!("------------------{:?}", balance_info_list);
  227. balance_info_list
  228. }