order.dart 10 KB

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