import 'dart:convert'; import 'package:convert/convert.dart'; import 'package:crypto/crypto.dart' as crypto; import 'package:crypto/crypto.dart'; var tmpPaodekuai2 = '''{{#source#-跑得快 房号: #orderNo# 局数: #dump# 结束时间: #orderTime# #person_1#: #amount_1# #person_2#: #amount_2#}}'''; var orderPaodekuai2 = '''四川游戏家园-跑得快 房号: 108700 局数: 10局 结束时间: 2020-04-19 15:05:31 阿帝888: -100 婚礼婚礼: 100'''; var orderPaodekuai2_1 = '''四川游戏家园-跑得快 房号: 379170 局数: 10局 结束时间: 2020-11-18 17:39:05 狂文颓废: -100 张三: 100'''; var orderPaodekuai2_2 = '''四川游戏家园-跑得快 房号: 416189 局数: 10局 结束时间: 2020-11-20 21:02:55 时光流逝话藏: -80 沉沦、: 80'''; var order2 = '''ㄣ熊猫四川麻将ㄣ 2020-10-17 22:01 二人一房 局8/8 回老家了看看 玩家小刀(ゅ≈房主≈ゅ)ID:3211739【78】 玩家人之初 ???? ?ID:400932310【-78】'''; var tmp2 = '''{{ㄣ#source#ㄣ #orderTime# #dump# 玩家#person_1#ID:#id_1#【#amount_1#】 玩家#person_2#ID:#id_2#【#amount_2#】}}'''; var orderDuangouqia2 = '''四川游戏家园-二人断勾卡 房号: 599792 局数: 8局 结束时间: 2020-11-18 18:56 微笑_MF: +15 芬芳_Fw: -15'''; var tmpDuangouqia2 = '''{{#source#-二人断勾卡 房号: #orderNo# 局数: #dump# 结束时间: #orderTime# #person_1#: #amount_1# #person_2#: #amount_2#}}'''; var orderDoushisi2 = '''四川游戏家园-斗十四 房号: 801673 局数: 8局 结束时间: 2020-11-18 17:54 红霞_3m: +1880 乐永林13880806281邑雪农业: -1880'''; var tmpDoushisi2 = '''{{#source#-斗十四 房号: #orderNo# 局数: #dump# 结束时间: #orderTime# #person_1#: #amount_1# #person_2#: #amount_2#>0.1}}'''; var orderDuangouqiaXuezhanMajiang3 = '''四川游戏家园-断勾卡血战麻将 房号: 421617 局数: 8局 结束时间: 2020-11-18 19:19 无可不可: +80 模棱两可: +20 小鱼儿_RT: -100'''; var tmpDuangouqiaXuezhanMajiang3 = '''{{#source#-断勾卡血战麻将 房号: #orderNo# 局数: #dump# 结束时间: #orderTime# #person_1#: #amount_1# #person_2#: #amount_2# #person_3#: #amount_3#}}'''; var orderPaodekuai3 = '''四川游戏家园-跑得快 房号: 910618 局数: 10局 结束时间: 2020-11-18 19:21:33 小鱼儿_RT: -10 模棱两可: 16 无可不可: -6'''; var tmpPaodekuai3 = '''{{#source#-跑得快 房号: #orderNo# 局数: #dump# 结束时间: #orderTime# #person_1#: #amount_1# #person_2#: #amount_2# #person_3#: #amount_3#}}'''; var orderDoushisi3 = '''四川游戏家园-斗十四 房号: 666541 局数: 8局 结束时间: 2020-11-18 19:23 张三: +22400 无可不可: -11200 模棱两可: -11200'''; var tmpDoushisi3 = '''{{#source#-斗十四 房号: #orderNo# 局数: #dump# 结束时间: #orderTime# #person_1#: #amount_1# #person_2#: #amount_2# #person_3#: #amount_3#>0.01}}'''; var tmpDuangouqia2_2 = '''{{#source#-二人断勾卡 房号:#orderNo# 底分:#dump1# 类型:#dump2# 结束时间:#orderTime# 玩家1:#person_1#(#id_1#) #amount_1# 玩家2:#person_2#(#id_2#) #amount_2#}}'''; var orderDuangouqia2_2 = '''四川游戏家园-二人断勾卡 房号:812784 底分:13 类型:8局 结束时间:2020-11-24 10:27 玩家1:Ly_eu(20852233) +338 玩家2:无可不可(22199143) -338'''; void main() { var info = parseString2(tmpDuangouqia2_2, orderDuangouqia2_2); print(info); var orders = parse2(info); print(orders); } class OrderStakeHolder2 { String name; int id; var amount; OrderStakeHolder2(String name, int id, int amount) { this.name = name; this.amount = amount; this.id = id; } @override String toString() { return '{\"name\": \"$name\", \"id\":$id,\"amount\": $amount}'; } } class OrderInfo2 { String source; //订单来源 String no; // 原订单号 String time; //原下单时间 OrderStakeHolder2 payer; //付款人 OrderStakeHolder2 seller; //赢家 double factor; @override String toString() { return '{\"source\": \"$source\", \"no\": \"$no\", \"time\": \"$time\", \"payer\": $payer, \"seller\": $seller, \"factor\": $factor}'; } } Map parseString2(String tmpl, String msg) { var counter = 0; tmpl = tmpl.replaceAll('\n', '\n '); msg = msg.replaceAll('\n', '\n '); while (tmpl.indexOf(' ', 0) > 0) { tmpl = tmpl.replaceAll(' ', ' '); } while (msg.indexOf(' ', 0) > 0) { msg = msg.replaceAll(' ', ' '); } var res = Map(); var keyStart = false; var searchingKey = false; String key; String val; var i = 0; var j = 0; while (i < tmpl.length) { counter++; if (counter > 2000) { return null; } if (tmpl[i] == '{') { i++; continue; } else if (!searchingKey && tmpl[i] == '}') { res[key] = val; return res; } if (!searchingKey && tmpl[i] == '>') { res[key] = val; val = tmpl.substring(i + 1, tmpl.length - 2); res['factor'] = val; i = tmpl.length - 2; return res; } if (tmpl[i] == '#') { i++; if (!keyStart) { keyStart = true; searchingKey = true; key = ''; val = ''; continue; } else { keyStart = false; continue; } } if (keyStart) { key = key + tmpl[i]; i++; continue; } if (searchingKey) { for (; j < msg.length; j++) { counter++; if (counter > 2000) { return null; } if (msg[j] != tmpl[i]) { val = val + msg[j]; } else { searchingKey = false; res[key] = val; i++; j++; break; } if (searchingKey) { searchingKey = false; } } } else { if (msg[j] == tmpl[i]) { j++; i++; } else { return null; } } } return null; } List parse2(Map info) { String orderSource; String orderTime; String orderNo; double factor; var balance = 0; if (info['source'] != null) { orderSource = info['source']; } if (info['orderNo'] != null) { orderNo = info['orderNo']; } if (info['factor'] != null) { factor = double.parse(info['factor']); } else { factor = 1; } if (info['orderTime'] == null) { var t = DateTime.now(); orderTime = "${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')}"; } else { if (info['orderTime'].length <= 16) { orderTime = info['orderTime'] + ':00'; } else { orderTime = info['orderTime']; } } var sellers = List(); var payers = List(); var ks = info.keys.toList(); for (var p in ks) { var i = p.indexOf('person'); if (i >= 0) { var name = info[p]; var pno = p.substring(i + 'person_'.length); var val = int.parse(info['amount_' + pno]); var id; id = 0; if (info['id_' + pno] != null) { id = int.parse(info['id_' + pno]); } if (!(val is int)) { return null; } balance += val; if (val > 0) { sellers.add(OrderStakeHolder2(name, id, val)); } else if (val == 0) { continue; } else { payers.add(OrderStakeHolder2(name, id, -val)); } } else { continue; } } if (balance != 0) { return null; } sellers.sort((left, right) => left.amount.compareTo(right.amount)); payers.sort((left, right) => right.amount.compareTo(left.amount)); var orders = List(); for (var p in payers) { var left = p.amount; var settled = List(); var i = 0; while (left > 0) { var seller = sellers[i]; if (seller.amount <= left) { var o = OrderInfo2(); o.source = orderSource; o.time = orderTime; o.no = orderNo; o.payer = OrderStakeHolder2(p.name, p.id, seller.amount); o.seller = OrderStakeHolder2(seller.name, seller.id, seller.amount); o.factor = factor; orders.add(o); left = left - seller.amount; settled.add(seller); } else { var o = OrderInfo2(); o.source = orderSource; o.time = orderTime; o.no = orderNo; o.payer = OrderStakeHolder2(p.name, p.id, left); o.seller = OrderStakeHolder2(seller.name, seller.id, left); o.factor = factor; orders.add(o); seller.amount -= left; left = 0; } i++; } for (var s in settled) { sellers.remove(s); } } return orders; } // String computeOrderHash(Map order) { // // order.remove("dump"); // // order.remove('orderTime'); // // var sortedKeys = order.keys.toList()..sort(); // // List values = new List(); // // sortedKeys.forEach((key) { // // values.add(order[key]); // // }); // // values.sort(); // // print( generateMd5(values.toString())); // // // // return generateMd5(values.toString()); // // } // // // // // // String generateMd5(String data) { // // var content = new Utf8Encoder().convert(data); // // var md5 = crypto.md5; // // var digest = md5.convert(content); // // return hex.encode(digest.bytes); // // } String computeOrderHash(Map order) { order.remove("dump"); order.remove('orderTime'); var sortedKeys = order.keys.toList()..sort(); List values = new List(); sortedKeys.forEach((key) { values.add(order[key]); }); print('515151515151515${values.toString()}'); values.sort(); print('515151515151515${values.toString()}'); var md5 = generateMd5(values.toString()); print(md5); return md5; } String generateMd5(String data) { var content = new Utf8Encoder().convert(data); // var md5 = crypto.md5; var digest = md5.convert(content); return hex.encode(digest.bytes); }