order.dart 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. import 'dart:convert';
  2. import 'package:convert/convert.dart';
  3. import 'package:crypto/crypto.dart' as crypto;
  4. import 'package:crypto/crypto.dart';
  5. var tmpPaodekuai2 = '''{{#source#-跑得快
  6. 房号: #orderNo# 局数: #dump#
  7. 结束时间: #orderTime#
  8. #person_1#: #amount_1#
  9. #person_2#: #amount_2#}}''';
  10. var orderPaodekuai2 = '''四川游戏家园-跑得快
  11. 房号: 108700 局数: 10局
  12. 结束时间: 2020-04-19 15:05:31
  13. 阿帝888: -100
  14. 婚礼婚礼: 100''';
  15. var orderPaodekuai2_1 = '''四川游戏家园-跑得快
  16. 房号: 379170 局数: 10局
  17. 结束时间: 2020-11-18 17:39:05
  18. 狂文颓废: -100
  19. 张三: 100''';
  20. var orderPaodekuai2_2 = '''四川游戏家园-跑得快
  21. 房号: 416189 局数: 10局
  22. 结束时间: 2020-11-20 21:02:55
  23. 时光流逝话藏: -80
  24. 沉沦、: 80''';
  25. var order2 = '''ㄣ熊猫四川麻将ㄣ 2020-10-17 22:01
  26. 二人一房 局8/8 回老家了看看
  27. 玩家小刀(ゅ≈房主≈ゅ)ID:3211739【78】
  28. 玩家人之初 ???? ?ID:400932310【-78】''';
  29. var tmp2 = '''{{ㄣ#source#ㄣ #orderTime#
  30. #dump#
  31. 玩家#person_1#ID:#id_1#【#amount_1#】
  32. 玩家#person_2#ID:#id_2#【#amount_2#】}}''';
  33. var orderDuangouqia2 = '''四川游戏家园-二人断勾卡
  34. 房号: 599792 局数: 8局
  35. 结束时间: 2020-11-18 18:56
  36. 微笑_MF: +15
  37. 芬芳_Fw: -15''';
  38. var tmpDuangouqia2 = '''{{#source#-二人断勾卡
  39. 房号: #orderNo# 局数: #dump#
  40. 结束时间: #orderTime#
  41. #person_1#: #amount_1#
  42. #person_2#: #amount_2#}}''';
  43. var orderDoushisi2 = '''四川游戏家园-斗十四
  44. 房号: 801673 局数: 8局
  45. 结束时间: 2020-11-18 17:54
  46. 红霞_3m: +1880
  47. 乐永林13880806281邑雪农业: -1880''';
  48. var tmpDoushisi2 = '''{{#source#-斗十四
  49. 房号: #orderNo# 局数: #dump#
  50. 结束时间: #orderTime#
  51. #person_1#: #amount_1#
  52. #person_2#: #amount_2#>0.1}}''';
  53. var orderDuangouqiaXuezhanMajiang3 = '''四川游戏家园-断勾卡血战麻将
  54. 房号: 421617 局数: 8局
  55. 结束时间: 2020-11-18 19:19
  56. 无可不可: +80
  57. 模棱两可: +20
  58. 小鱼儿_RT: -100''';
  59. var tmpDuangouqiaXuezhanMajiang3 = '''{{#source#-断勾卡血战麻将
  60. 房号: #orderNo# 局数: #dump#
  61. 结束时间: #orderTime#
  62. #person_1#: #amount_1#
  63. #person_2#: #amount_2#
  64. #person_3#: #amount_3#}}''';
  65. var orderPaodekuai3 = '''四川游戏家园-跑得快
  66. 房号: 910618 局数: 10局
  67. 结束时间: 2020-11-18 19:21:33
  68. 小鱼儿_RT: -10
  69. 模棱两可: 16
  70. 无可不可: -6''';
  71. var tmpPaodekuai3 = '''{{#source#-跑得快
  72. 房号: #orderNo# 局数: #dump#
  73. 结束时间: #orderTime#
  74. #person_1#: #amount_1#
  75. #person_2#: #amount_2#
  76. #person_3#: #amount_3#}}''';
  77. var orderDoushisi3 = '''四川游戏家园-斗十四
  78. 房号: 666541 局数: 8局
  79. 结束时间: 2020-11-18 19:23
  80. 张三: +22400
  81. 无可不可: -11200
  82. 模棱两可: -11200''';
  83. var tmpDoushisi3 = '''{{#source#-斗十四
  84. 房号: #orderNo# 局数: #dump#
  85. 结束时间: #orderTime#
  86. #person_1#: #amount_1#
  87. #person_2#: #amount_2#
  88. #person_3#: #amount_3#>0.01}}''';
  89. var tmpDuangouqia2_2 = '''{{#source#-二人断勾卡
  90. 房号:#orderNo#
  91. 底分:#dump1#
  92. 类型:#dump2#
  93. 结束时间:#orderTime#
  94. 玩家1:#person_1#(#id_1#) #amount_1#
  95. 玩家2:#person_2#(#id_2#) #amount_2#}}''';
  96. var orderDuangouqia2_2 = '''四川游戏家园-二人断勾卡
  97. 房号:812784
  98. 底分:13
  99. 类型:8局
  100. 结束时间:2020-11-24 10:27
  101. 玩家1:Ly_eu(20852233) +338
  102. 玩家2:无可不可(22199143) -338''';
  103. void main() {
  104. var info = parseString2(tmpDuangouqia2_2, orderDuangouqia2_2);
  105. print(info);
  106. var orders = parse2(info);
  107. print(orders);
  108. }
  109. class OrderStakeHolder2 {
  110. String name;
  111. int id;
  112. var amount;
  113. OrderStakeHolder2(String name, int id, int amount) {
  114. this.name = name;
  115. this.amount = amount;
  116. this.id = id;
  117. }
  118. @override
  119. String toString() {
  120. return '{\"name\": \"$name\", \"id\":$id,\"amount\": $amount}';
  121. }
  122. }
  123. class OrderInfo2 {
  124. String source; //订单来源
  125. String no; // 原订单号
  126. String time; //原下单时间
  127. OrderStakeHolder2 payer; //付款人
  128. OrderStakeHolder2 seller; //赢家
  129. double factor;
  130. @override
  131. String toString() {
  132. return '{\"source\": \"$source\", \"no\": \"$no\", \"time\": \"$time\", \"payer\": $payer, \"seller\": $seller, \"factor\": $factor}';
  133. }
  134. }
  135. Map<String, String> parseString2(String tmpl, String msg) {
  136. var counter = 0;
  137. tmpl = tmpl.replaceAll('\n', '\n ');
  138. msg = msg.replaceAll('\n', '\n ');
  139. while (tmpl.indexOf(' ', 0) > 0) {
  140. tmpl = tmpl.replaceAll(' ', ' ');
  141. }
  142. while (msg.indexOf(' ', 0) > 0) {
  143. msg = msg.replaceAll(' ', ' ');
  144. }
  145. var res = Map<String, String>();
  146. var keyStart = false;
  147. var searchingKey = false;
  148. String key;
  149. String val;
  150. var i = 0;
  151. var j = 0;
  152. while (i < tmpl.length) {
  153. counter++;
  154. if (counter > 2000) {
  155. return null;
  156. }
  157. if (tmpl[i] == '{') {
  158. i++;
  159. continue;
  160. } else if (!searchingKey && tmpl[i] == '}') {
  161. res[key] = val;
  162. return res;
  163. }
  164. if (!searchingKey && tmpl[i] == '>') {
  165. res[key] = val;
  166. val = tmpl.substring(i + 1, tmpl.length - 2);
  167. res['factor'] = val;
  168. i = tmpl.length - 2;
  169. return res;
  170. }
  171. if (tmpl[i] == '#') {
  172. i++;
  173. if (!keyStart) {
  174. keyStart = true;
  175. searchingKey = true;
  176. key = '';
  177. val = '';
  178. continue;
  179. } else {
  180. keyStart = false;
  181. continue;
  182. }
  183. }
  184. if (keyStart) {
  185. key = key + tmpl[i];
  186. i++;
  187. continue;
  188. }
  189. if (searchingKey) {
  190. for (; j < msg.length; j++) {
  191. counter++;
  192. if (counter > 2000) {
  193. return null;
  194. }
  195. if (msg[j] != tmpl[i]) {
  196. val = val + msg[j];
  197. } else {
  198. searchingKey = false;
  199. res[key] = val;
  200. i++;
  201. j++;
  202. break;
  203. }
  204. if (searchingKey) {
  205. searchingKey = false;
  206. }
  207. }
  208. } else {
  209. if (msg[j] == tmpl[i]) {
  210. j++;
  211. i++;
  212. } else {
  213. return null;
  214. }
  215. }
  216. }
  217. return null;
  218. }
  219. List<OrderInfo2> parse2(Map<String, String> info) {
  220. String orderSource;
  221. String orderTime;
  222. String orderNo;
  223. double factor;
  224. var balance = 0;
  225. if (info['source'] != null) {
  226. orderSource = info['source'];
  227. }
  228. if (info['orderNo'] != null) {
  229. orderNo = info['orderNo'];
  230. }
  231. if (info['factor'] != null) {
  232. factor = double.parse(info['factor']);
  233. } else {
  234. factor = 1;
  235. }
  236. if (info['orderTime'] == null) {
  237. var t = DateTime.now();
  238. orderTime =
  239. "${t.year.toString()}-${t.month.toString().padLeft(2, '0')}-${t.day.toString().padLeft(2, '0')} ${t.hour.toString().padLeft(2, '0')}:${t.minute.toString().padLeft(2, '0')}:${t.second.toString().padLeft(2, '0')}";
  240. } else {
  241. if (info['orderTime'].length <= 16) {
  242. orderTime = info['orderTime'] + ':00';
  243. } else {
  244. orderTime = info['orderTime'];
  245. }
  246. }
  247. var sellers = List<OrderStakeHolder2>();
  248. var payers = List<OrderStakeHolder2>();
  249. var ks = info.keys.toList();
  250. for (var p in ks) {
  251. var i = p.indexOf('person');
  252. if (i >= 0) {
  253. var name = info[p];
  254. var pno = p.substring(i + 'person_'.length);
  255. var val = int.parse(info['amount_' + pno]);
  256. var id;
  257. id = 0;
  258. if (info['id_' + pno] != null) {
  259. id = int.parse(info['id_' + pno]);
  260. }
  261. if (!(val is int)) {
  262. return null;
  263. }
  264. balance += val;
  265. if (val > 0) {
  266. sellers.add(OrderStakeHolder2(name, id, val));
  267. } else if (val == 0) {
  268. continue;
  269. } else {
  270. payers.add(OrderStakeHolder2(name, id, -val));
  271. }
  272. } else {
  273. continue;
  274. }
  275. }
  276. if (balance != 0) {
  277. return null;
  278. }
  279. sellers.sort((left, right) => left.amount.compareTo(right.amount));
  280. payers.sort((left, right) => right.amount.compareTo(left.amount));
  281. var orders = List<OrderInfo2>();
  282. for (var p in payers) {
  283. var left = p.amount;
  284. var settled = List<OrderStakeHolder2>();
  285. var i = 0;
  286. while (left > 0) {
  287. var seller = sellers[i];
  288. if (seller.amount <= left) {
  289. var o = OrderInfo2();
  290. o.source = orderSource;
  291. o.time = orderTime;
  292. o.no = orderNo;
  293. o.payer = OrderStakeHolder2(p.name, p.id, seller.amount);
  294. o.seller = OrderStakeHolder2(seller.name, seller.id, seller.amount);
  295. o.factor = factor;
  296. orders.add(o);
  297. left = left - seller.amount;
  298. settled.add(seller);
  299. } else {
  300. var o = OrderInfo2();
  301. o.source = orderSource;
  302. o.time = orderTime;
  303. o.no = orderNo;
  304. o.payer = OrderStakeHolder2(p.name, p.id, left);
  305. o.seller = OrderStakeHolder2(seller.name, seller.id, left);
  306. o.factor = factor;
  307. orders.add(o);
  308. seller.amount -= left;
  309. left = 0;
  310. }
  311. i++;
  312. }
  313. for (var s in settled) {
  314. sellers.remove(s);
  315. }
  316. }
  317. return orders;
  318. }
  319. // String computeOrderHash(Map<String, String> order) {
  320. // // order.remove("dump");
  321. // // order.remove('orderTime');
  322. // // var sortedKeys = order.keys.toList()..sort();
  323. // // List values = new List();
  324. // // sortedKeys.forEach((key) {
  325. // // values.add(order[key]);
  326. // // });
  327. // // values.sort();
  328. // // print( generateMd5(values.toString()));
  329. // //
  330. // // return generateMd5(values.toString());
  331. // // }
  332. // //
  333. // //
  334. // // String generateMd5(String data) {
  335. // // var content = new Utf8Encoder().convert(data);
  336. // // var md5 = crypto.md5;
  337. // // var digest = md5.convert(content);
  338. // // return hex.encode(digest.bytes);
  339. // // }
  340. String computeOrderHash(Map<String, String> order) {
  341. order.remove("dump");
  342. order.remove('orderTime');
  343. var sortedKeys = order.keys.toList()..sort();
  344. List values = new List();
  345. sortedKeys.forEach((key) {
  346. values.add(order[key]);
  347. });
  348. print('515151515151515${values.toString()}');
  349. values.sort();
  350. print('515151515151515${values.toString()}');
  351. var md5 = generateMd5(values.toString());
  352. print(md5);
  353. return md5;
  354. }
  355. String generateMd5(String data) {
  356. var content = new Utf8Encoder().convert(data);
  357. // var md5 = crypto.md5;
  358. var digest = md5.convert(content);
  359. return hex.encode(digest.bytes);
  360. }