order.dart 8.8 KB

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