xlsx_test.rs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. use std::collections::{BTreeMap, HashSet};
  2. use chrono::{DateTime, FixedOffset, NaiveDateTime, TimeZone, Utc};
  3. use tracing::{trace};
  4. use exchanges::gate_swap_rest::GateSwapRest;
  5. use exchanges::xlsx_utils::creation_xlsx;
  6. //ws-订阅公共频道信息
  7. #[tokio::test(flavor = "multi_thread", worker_threads = 1)]
  8. async fn test_gate_creation_xlsx() {
  9. global::log_utils::init_log_with_trace();
  10. //获取不同账号的数据
  11. let mut acc_array: Vec<BTreeMap<String, String>> = vec![];
  12. let mut acc_all_data: BTreeMap<String, Vec<Vec<String>>> = BTreeMap::new();
  13. let mut acc_all_data_clone: BTreeMap<String, Vec<Vec<String>>> = BTreeMap::new();
  14. let mut data_array_all: Vec<Vec<String>> = vec![];
  15. let mut time_all: Vec<i64> = vec![];
  16. loop {
  17. let mut gate60: BTreeMap<String, String> = BTreeMap::new();
  18. gate60.insert("acc_name".to_string(), String::from("gate60"));
  19. gate60.insert("access_key".to_string(), String::from("61e3a1b12c44c8ccfce1f32782b9922f"));
  20. gate60.insert("secret_key".to_string(), String::from("f3f533fa685cbae44b3017f73b71e90eaa9aa8d4922a39426744721e4824a527"));
  21. acc_array.push(gate60);
  22. let mut gate59: BTreeMap<String, String> = BTreeMap::new();
  23. gate59.insert("acc_name".to_string(), String::from("gate59"));
  24. gate59.insert("access_key".to_string(), String::from("c691d4fcc5a5a98af459f993a3a0c653"));
  25. gate59.insert("secret_key".to_string(), String::from("05e7f8640bffeacc146b6f9f08512955d00d89bbdb051c9427f31adf96adeb2f"));
  26. acc_array.push(gate59);
  27. let mut gate58: BTreeMap<String, String> = BTreeMap::new();
  28. gate58.insert("acc_name".to_string(), String::from("gate58"));
  29. gate58.insert("access_key".to_string(), String::from("dfdc30687ac71daefa2fb39c706b8afa"));
  30. gate58.insert("secret_key".to_string(), String::from("31e8999f85d38f5dd174f8919d9a1611c24d4e35b4d6319d6b160005871bf8b6"));
  31. acc_array.push(gate58);
  32. let mut gate57: BTreeMap<String, String> = BTreeMap::new();
  33. gate57.insert("acc_name".to_string(), String::from("gate57"));
  34. gate57.insert("access_key".to_string(), String::from("ba11ea511f343763db7c92c685f20c12"));
  35. gate57.insert("secret_key".to_string(), String::from("272d1d38ac4f0af3e6ed96e6a9a2c59dd905c3d7ad730507008604bba14edb3d"));
  36. acc_array.push(gate57);
  37. let mut gate56: BTreeMap<String, String> = BTreeMap::new();
  38. gate56.insert("acc_name".to_string(), String::from("gate56"));
  39. gate56.insert("access_key".to_string(), String::from("72f0c351a83b04808baad625f6085599"));
  40. gate56.insert("secret_key".to_string(), String::from("8a8d482bcc31f184cce350531cb40ca70564f9c466698d025e16d8943257dc0f"));
  41. acc_array.push(gate56);
  42. let mut gate55: BTreeMap<String, String> = BTreeMap::new();
  43. gate55.insert("acc_name".to_string(), String::from("gate55"));
  44. gate55.insert("access_key".to_string(), String::from("036408d5cbd8ddf1c6e0baab61ee641a"));
  45. gate55.insert("secret_key".to_string(), String::from("940414a37711e59848011e99e223fa11b0e69f8badd35347301e3f8e41957a60"));
  46. acc_array.push(gate55);
  47. let mut gate54: BTreeMap<String, String> = BTreeMap::new();
  48. gate54.insert("acc_name".to_string(), String::from("gate54"));
  49. gate54.insert("access_key".to_string(), String::from("fbe564e8bd4efaa0c3c023ca8c057b36"));
  50. gate54.insert("secret_key".to_string(), String::from("0be3c0223fd021fdacacc03f183f467e988ceee6eb1b0e09ca96bb1eebd45f39"));
  51. acc_array.push(gate54);
  52. let mut gate53: BTreeMap<String, String> = BTreeMap::new();
  53. gate53.insert("acc_name".to_string(), String::from("gate53"));
  54. gate53.insert("access_key".to_string(), String::from("16d91ba0a3d79a2925d16ea01a615fa1"));
  55. gate53.insert("secret_key".to_string(), String::from("607b07cf240466656c00beb0c6fff252839467583fd3f8b14782eb007b3d99ce"));
  56. acc_array.push(gate53);
  57. let mut gate52: BTreeMap<String, String> = BTreeMap::new();
  58. gate52.insert("acc_name".to_string(), String::from("gate52"));
  59. gate52.insert("access_key".to_string(), String::from("31054006c457a80a027e961cf3e5e3a4"));
  60. gate52.insert("secret_key".to_string(), String::from("a43f8f5672b49bfcc304d0731100610de1c55e7d2b6c00199b267993f0b189d1"));
  61. acc_array.push(gate52);
  62. let mut gate51: BTreeMap<String, String> = BTreeMap::new();
  63. gate51.insert("acc_name".to_string(), String::from("gate51"));
  64. gate51.insert("access_key".to_string(), String::from("edcedefe7830dd5722c2c37704ae700f"));
  65. gate51.insert("secret_key".to_string(), String::from("41db86a8463ac7c66023a8505e5fddd3448e551a11a52141bf57ca8478e2149b"));
  66. acc_array.push(gate51);
  67. for acc in acc_array {
  68. let mut gate_exc = GateSwapRest::new(false, acc.clone());
  69. let data = gate_exc.account_book("usdt".to_string()).await;
  70. // trace!("data???????:{:?}",data.clone());
  71. if data.code.as_str() == "200" {
  72. let acc_name = acc.get("acc_name").clone();
  73. //账号
  74. let json_value: serde_json::Value = serde_json::from_str(&data.data).unwrap();
  75. if let serde_json::Value::Array(array) = json_value {
  76. let mut name_data_all: Vec<Vec<String>> = vec![];
  77. let mut name_data_all_clone: Vec<Vec<String>> = vec![];
  78. for item in array {
  79. let time = item["time"].as_i64().unwrap();//秒级
  80. // 使用秒构建一个DateTime<Utc>对象
  81. // let datetime: DateTime<Utc> = Utc.timestamp(time, 0);
  82. //2023-12-10 00:00:00
  83. if 1702051200 > time {
  84. continue;
  85. }
  86. time_all.push(time);
  87. let time_str = NaiveDateTime::from_timestamp_millis((time + 8 * 3600) * 1000).unwrap().format("%Y-%m-%d %H:%M:%S%.3f").to_string();
  88. trace!("数据时间解析:{:?}---{:?}",time,time_str);
  89. let change = item["change"].as_str().unwrap();
  90. let balance = item["balance"].as_str().unwrap();
  91. let type_str = match item["type"].as_str().unwrap() {
  92. "dnw" => { "转入转出" }
  93. "pnl" => { "减仓盈亏" }
  94. "fee" => { "交易手续费" }
  95. "refr" => { "推荐人返佣" }
  96. "fund" => { "资金费用" }
  97. "point_dnw" => { "点卡转入转出" }
  98. "point_fee" => { "点卡交易手续费" }
  99. "point_refr" => { "点卡推荐人返佣" }
  100. _ => {
  101. "未知-变更类型"
  102. }
  103. };
  104. let text = item["text"].as_str().unwrap();
  105. let contract = item["contract"].as_str().unwrap();
  106. let trade_id = item["trade_id"].as_str().unwrap();
  107. let mut name_data_array: Vec<String> = vec![];
  108. name_data_array.push(time_str.to_string());
  109. name_data_array.push(trade_id.to_string());
  110. name_data_array.push(change.to_string());
  111. name_data_array.push(balance.to_string());
  112. name_data_array.push(type_str.to_string());
  113. name_data_array.push(contract.to_string());
  114. name_data_array.push(text.to_string());
  115. let mut name_data_array_clone: Vec<String> = vec![];
  116. name_data_array_clone.push(time.to_string());
  117. name_data_array_clone.push(trade_id.to_string());
  118. name_data_array_clone.push(change.to_string());
  119. name_data_array_clone.push(balance.to_string());
  120. name_data_array_clone.push(type_str.to_string());
  121. name_data_array_clone.push(contract.to_string());
  122. name_data_array_clone.push(text.to_string());
  123. name_data_all.push(name_data_array.clone());
  124. name_data_all_clone.push(name_data_array_clone.clone());
  125. let mut cp = name_data_array.clone();
  126. cp.push(acc_name.clone().unwrap().to_string());
  127. data_array_all.push(cp);
  128. }
  129. acc_all_data.insert(acc_name.clone().unwrap().to_string(), name_data_all.clone());
  130. acc_all_data_clone.insert(acc_name.clone().unwrap().to_string(), name_data_all_clone.clone());
  131. } else {
  132. trace!("不是数组 检查数据");
  133. }
  134. }
  135. // break;
  136. }
  137. break;//这里是为了 代码收纳,用了loop来放置代码
  138. }
  139. trace!("数据如下:{:?}",acc_all_data);
  140. //汇总
  141. //1. 生成时间片
  142. let mut unique = HashSet::new();
  143. time_all.retain(|e| unique.insert(*e));
  144. trace!("时间片:{:?}",time_all);
  145. //2. 根据时间片 去求每个时间片的 总余额,
  146. let mut sum_data_array_all: Vec<Vec<String>> = vec![];
  147. for time in time_all.clone() {
  148. let mut sum_data_array: Vec<String> = vec![];
  149. let mut sum_balance: f64 = 0 as f64;
  150. for (key, value) in acc_all_data_clone.clone() {
  151. let acc_key = key;
  152. trace!("读取value:{:?}",value);
  153. let filter_arrya: Vec<Vec<String>> = value.clone().into_iter().filter(|s| {
  154. trace!("读取time:{:?}",s);
  155. let time_v = s[0].clone();
  156. time_v < (time - 1).to_string()
  157. }).collect();
  158. let balance: f64 = if filter_arrya.len() > 0 {
  159. let row = filter_arrya[filter_arrya.len() - 1].clone();
  160. trace!("读取balance:{:?}",row);
  161. let balance_clone = row[3].clone();
  162. balance_clone.parse::<f64>().unwrap()
  163. } else {
  164. 0 as f64
  165. };
  166. sum_balance = balance + sum_balance;
  167. }
  168. // 使用秒构建一个DateTime<Utc>对象
  169. let time_str = NaiveDateTime::from_timestamp_millis((time + 8 * 3600) * 1000).unwrap().format("%Y-%m-%d %H:%M:%S%.3f").to_string();
  170. sum_data_array.push(time_str.to_string());
  171. sum_data_array.push("".to_string());
  172. sum_data_array.push("".to_string());
  173. sum_data_array.push(sum_balance.to_string());
  174. sum_data_array.push("".to_string());
  175. sum_data_array.push("".to_string());
  176. sum_data_array.push("".to_string());
  177. sum_data_array_all.push(sum_data_array);
  178. }
  179. if sum_data_array_all.len() > 0 {
  180. acc_all_data.insert("total".to_string(), sum_data_array_all);
  181. }
  182. if data_array_all.len() > 0{
  183. acc_all_data.insert("gather".to_string(), data_array_all);
  184. }
  185. //数据组装.
  186. let noe_row_name = vec!["时间", "成交Id", "变更金额", "变更后余额", "变更类型", "合约标识", "注释"];
  187. //创建表格
  188. //提示。涉及到 需要转换的数据,请提前自行转换,工具只负责写入生成
  189. // after - 之后的,时间戳> after 才是有效数据
  190. match creation_xlsx(&noe_row_name, &acc_all_data,
  191. "okx".to_string(),
  192. ) {
  193. Ok(d) => {
  194. trace!("完成");
  195. }
  196. Err(z) => {
  197. eprint!("{:?}", z);
  198. trace!("失败");
  199. }
  200. }
  201. }