using Api.Framework.Model; using Cps.Framework; using Cps.Framework.Tb; using CsharpHttpHelper; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using CsharpHttpHelper; using Easy4net.Context; using System.Text.RegularExpressions; using Api.Framework.Enums; using Api.Framework.Tools; using System.Data; using Api.Framework.Events; using Cps.Framework.Entitys; using Api.Framework.Utils; namespace Api.Framework.Threading { class Update_AlimamaOrders : IThread { public bool IsRunning { get; set; } public RegisteredWaitHandle RegisterdHandler { get; set; } public WaitHandle WaitHandler { get; set; } public void Dispose() { } public void Run(object time, bool timeout) { if (this.IsRunning) return; } private void UpdateOrder(fl_order_pinduoduo db_order, Session session, List notice) { this.IsRunning = true; DateTime stt_time = DateTime.Now.AddDays(-30); DateTime end_time = DateTime.Now; var spa_time = end_time - stt_time; int row_count = 20; int count = (int)spa_time.TotalMinutes / row_count; if (spa_time.TotalMinutes % row_count != 0) count++; int sum_order = 0; TaskTool task = new TaskTool(); //var session = ApiClient.GetSession();//获得一个Session int thread_count = 6000; try { session.BeginTransaction(); List noticeEvents = new List(); foreach (var item in CPSClient.AlimamaUsers) { if (item.IsLoginApi) { bool is_run = true; for (int i = 1; i <= count; i++) { //临时时间 var _time = end_time.AddMinutes(-(i * row_count)); task.AddTask(delegate { try { HttpHelper http = new HttpHelper(); int page = 1; do { if (!is_run) return; var url = item.GetAlimamaorderURL(_time, page, ApiDownorderType.订单结算, ApiDownorderSort.结算时间);//获得下载URL Dictionary dic = null; int number = 0; Next: try { number++; var _item = http.GetItem(url); var _html = http.GetHtml(_item).Html; dic = HttpExtend.JsonToDictionary(_html); if (dic == null) throw new Exception(_html); if (dic.ContainsKey("error_response")) throw new Exception(_html); dic = dic["tbk_sc_order_get_response"] as Dictionary; dic = dic["results"] as Dictionary; if (dic == null || dic.Count == 0) return; } catch (Exception ex) { if (number <= 20 && Regex.Match(ex.Message, @"(""error_response"":{""code"":15,""msg"":""Remote service error"",""sub_code"":""0"")|(无法连接)|(操作超时)|(基础连接已经关闭)|(远程服务调用超时)|(淘宝客API服务不可用)|(HSF执行错误)").Success) { Thread.Sleep(2000); goto Next; } else { IsRunning = false; Console.WriteLine("下载订单异常:" + ex.Message + ex.StackTrace); throw ex; } } var list = dic["n_tbk_order"] as ArrayList; foreach (Dictionary order in list) { try { var status = int.Parse(order["tk_status"].ToString()); var db_order = session.Find("trade_id=@trade_id and trade_parent_id=@trade_parent_id", new { trade_id = order["trade_id"].ToString(), trade_parent_id = order["trade_parent_id"].ToString() }).FirstOrDefault(); if (db_order != null) //跳过相同状态 { if (db_order.IsFinish()) continue;//是否完成 if (db_order.db_status == status) continue;//跳过相同状态 } //自动填充实例 if (db_order == null) db_order = order.ConvertToObj(); else { db_order.tk_status = status; } sum_order++; //查询是否绑定 if (db_order.db_userid == 0) { var bind = session.FindBindCache(db_order.trade_parent_id); if (bind != null) { db_order.db_userid = bind.db_userid;//根据绑定记录识别 db_order.msg_robotid = bind.db_robotid; db_order.msg_groupid = bind.groupid; } } //自动识别绑定 if (db_order.db_userid == 0) { var query = session.FindTable("select userid,count(*) count from fl_query_hist itemid=@itemid and crt_time>@time group userid ", new { itemid = db_order.item_num, time = DateTime.Now.AddMinutes(-24).ToString("yyyy-MM-dd HH:mm:ss") }); if (query.Rows.Count > 0) { if (query.Rows.Count == 1) db_order.db_userid = long.Parse(query.Rows[0]["userid"].ToString());//根据查询记录认领 else { var end_number = db_order.trade_parent_id.Substring(db_order.trade_parent_id.Length - 6); var lasts = session.Find("number=@number", new { number = end_number }); if (lasts.Count > 0) { //是否存在、尾号相同,并且查询过宝贝(优先识别) Dictionary last_num = new Dictionary(); foreach (DataRow q in query.Rows) { var info = lasts.FirstOrDefault(f => f.userid == long.Parse(q["userid"].ToString())); if (info != null) last_num[info.userid] = info; } if (last_num.Count == 1) { var last_item = last_num.FirstOrDefault().Value; db_order.db_userid = last_item.userid; var query_item = session.Find("itemid=@itemid and userid=@userid", new { itemid = db_order.item_num, userid = db_order.db_userid }).FirstOrDefault(); if (query_item != null) { db_order.msg_robotid = query_item.robotid; db_order.msg_groupid = query_item.groupid; } } else { //尾号相同、并且均查询过该宝贝 } } else { //未找到尾号相同订单 } } } } var member = db_order.db_userid != 0 ? session.Find("id=@id", new { id = db_order.db_userid }).FirstOrDefault() : null; if (string.IsNullOrEmpty(db_order.db_point)) { var itempoint = session.FindItemPoint(member, db_order.total_commission_fee, CpsType.淘宝); if (itempoint != null) db_order.db_point = HttpHelper.ObjectToJson(itempoint); } switch (status) { case (int)ApiDownorderType.订单结算: { db_order.db_status = (int)OrderStatus.订单完结; if (!string.IsNullOrEmpty(db_order.db_point) && member != null) { var point = HttpHelper.JsonToObject(db_order.db_point) as ItemPoint; if (point != null) { //用户自身加积分 session.ChangePoint(PointType.消费补贴, point.UserPoint, member.id, $"购买:{db_order.item_title}({db_order.trade_parent_id})"); noticeEvents.Add(new OrderNoticeEvent(CpsType.淘宝, member, db_order)); //多级提成计算 if (point.AwardOne > 0 && member.inviter_id > 0) { var flag = session.ChangePoint(PointType.提成奖励, point.AwardOne, member.inviter_id, $"{member.nick_name},淘宝购物1级提成!"); if (flag != null) { noticeEvents.Add(new OrderNoticeEvent(CpsType.淘宝, flag, db_order)); if (point.AwardTwo > 0 && flag.inviter_id != 0) { flag = session.ChangePoint(PointType.提成奖励, point.AwardOne, flag.inviter_id, $"{member.nick_name},淘宝购物2级提成!"); if (flag != null) noticeEvents.Add(new OrderNoticeEvent(CpsType.淘宝, flag, db_order)); } } } //创建人计算 if (point.AwardCreate > 0 && string.IsNullOrEmpty(db_order.msg_groupid) && db_order.db_robotid != 0) { var robot = session.FindRobotInfo(db_order.db_robotid); if (robot != null) { var create = session.FindCreateInfo(db_order.msg_groupid, robot.GetRobotType()); if (create != null) { var flag = session.ChangePoint(PointType.提成奖励, create.userid, create.userid, $"{member.nick_name},维护提成!"); if (flag != null) noticeEvents.Add(new OrderNoticeEvent(CpsType.淘宝, flag, db_order)); } } } } } break; } case (int)ApiDownorderType.订单付款: db_order.db_status = (int)OrderStatus.订单付款; break; case (int)ApiDownorderType.订单失效: db_order.db_status = (int)OrderStatus.订单失效; break; case (int)ApiDownorderType.订单成功: db_order.db_status = (int)OrderStatus.商家未结算; break; } if (db_order.id == 0) session.Insert(db_order);//订单逻辑处理 else session.Update(db_order); if (member != null) ApiClient.GetThread().Add(new Events.OrderNoticeEvent(CpsType.淘宝, member, db_order)); } catch (Exception ex) { Console.WriteLine(string.Format("更新AlimamaOrder:{0}{1}异常:{2}", order["trade_parent_id"].ToString(), order["trade_id"].ToString(), ex.Message)); } } if (list == null || list.Count < 100) break; page++; } while (true); } catch (Exception ex) { Console.WriteLine("下载订单异常:" + ex.Message + ex.StackTrace); } }); } } } task.Start(thread_count, null); int s = (int)(DateTime.Now - end_time).TotalSeconds; session.Commit(); if (noticeEvents.Count > 0) ApiClient.GetThread().Add(noticeEvents); Console.WriteLine(string.Format("同步历史:{4}天、耗时:{0}秒、允许最大并行:{1}、任务总数:{2}、平均每秒更新:{3}/个订单", s, thread_count, task.Tasks.Count, sum_order / s, (int)spa_time.TotalDays)); } catch (Exception) { session.Rollback(); } Console.WriteLine(); } } }