/// <summary> /// 获取退货单的详细信息并保存到数据库 /// </summary> /// <param name="tradeRefundList"></param> /// <param name="refundIDList"></param> public void GetNewRefundDetail(string session, List <Alading.Entity.TradeRefund> tradeRefundList, List <string> refundIDList) { //存放数据库中不存在的退货详细信息 List <Alading.Entity.TradeRefund> newRefundList = new List <Alading.Entity.TradeRefund>(); List <Alading.Entity.TradeRefund> oldRefundList = TradeRefundService.GetTradeRefund(refundIDList); foreach (Alading.Entity.TradeRefund tradeRefund in tradeRefundList) { Alading.Entity.TradeRefund oldRefund = oldRefundList.Find(c => c.refund_id == tradeRefund.refund_id); if (oldRefund != null)//数据库中已存在此数据 { continue; } else//不存在则取淘宝网获取 { TradeRsp tradeRsp = TopService.RefundGet(session, tradeRefund.refund_id); /*未获取到数据*/ if (tradeRsp == null) { continue; } oldRefund = new TradeRefund(); oldRefund.modified = tradeRefund.modified; oldRefund.order_status = tradeRefund.order_status; TradeRefundCopyData(oldRefund, tradeRsp.Refund); newRefundList.Add(oldRefund); } } TradeRefundService.AddTradeRefund(newRefundList); }
/// <summary> /// 从淘宝获取最新数据 /// </summary> /// <param name="pageno"></param> /// <param name="pageSize"></param> /// <param name="totalResults"></param> /// <param name="tradeRefundList"></param> public void GetNewTradeRefund(string session, int pageno, int pageSize, out int totalResults , List <Alading.Entity.TradeRefund> tradeRefundList, List <string> refundIDList) { TradeReq tradeReq = new TradeReq(); tradeReq.PageNo = pageno; //页数 tradeReq.PageSize = pageSize; //每页的数量 string fields = "refund_id,order_status,modified"; //API参数 TradeRsp tradeRsp = TopService.RefundsReceiveGet(session, fields, tradeReq); /*未获取到数据*/ if (tradeRsp == null || tradeRsp.TotalResults == 0) { totalResults = 0; return; } totalResults = tradeRsp.TotalResults; foreach (Alading.Taobao.Entity.Refund refund in tradeRsp.Refunds.Refund) { Alading.Entity.TradeRefund newTradeRefund = new Alading.Entity.TradeRefund(); newTradeRefund.refund_id = refund.Rid; //退货单号 newTradeRefund.order_status = refund.OrderStatus == null ? string.Empty : refund.OrderStatus; //退款对应的订单交易状态 newTradeRefund.modified = DateTime.Parse(refund.Modified); //对象修改时间 tradeRefundList.Add(newTradeRefund); refundIDList.Add(refund.Rid); } }
void mainWorker_DoWork(object sender, DoWorkEventArgs e) { try { BackgroundWorker worker = sender as BackgroundWorker; //threadCount = Convert.ToInt32(spinEditThreadCount.Value);//这里不必要了,在点击按钮时已经赋值 int pageSize = 40; for (int k = 0; k < downShopList.Count; k++) { var shop = downShopList[k]; if (worker.CancellationPending) { e.Cancel = true; return; } ReportState state = new ReportState() { Current = k + 1, Total = downShopList.Count, Message = string.Format("正在同步店铺 {0} 的客户...", shop.title), }; worker.ReportProgress(1, state); #region initialize query time DateTime begin = DateTime.Now; DateTime end = DateTime.Now; switch (typeIndex) { // 15 days case 0: begin = DateTime.Now.AddDays(-15); break; // customize case 1: begin = this.dateEditBegin.DateTime; end = this.dateEditEnd.DateTime; break; // since shop created case 2: begin = shop.created; break; } #endregion #region Get total trade count TradeReq request = new TradeReq(); request.Status = null; request.PageSize = pageSize; request.PageNo = 1; request.StartCreated = begin.ToString("yyyy-MM-dd HH:mm:ss"); request.EndCreated = end.ToString("yyyy-MM-dd HH:mm:ss"); string sessionkey = SystemHelper.GetSessionKey(shop.nick); TradeRsp response = TopService.TradesSoldGet(sessionkey, request); sub_done = 0; sub_total = response.TotalResults; #endregion if (sub_total == 0) { continue; } #region Dispatch task to thread threadList.Clear(); if (sub_total <= pageSize) { #region total count < page size SycTaskArgs task = new SycTaskArgs { ShopNick = shop.nick, PageSize = pageSize, QueryBeginTime = begin, QueryEndTime = end, }; task.PageNoList.Add(1); BackgroundWorker w = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true, }; w.RunWorkerCompleted += new RunWorkerCompletedEventHandler(w_RunWorkerCompleted); w.ProgressChanged += new ProgressChangedEventHandler(w_ProgressChanged); w.DoWork += new DoWorkEventHandler(w_DoWork); taskList.Add(task); threadList.Add(w); threadCount = 1; #endregion } else { int pageCount = (sub_total % pageSize == 0) ? (sub_total / pageSize) : (sub_total / pageSize + 1); if (threadCount < pageCount) { #region page count < thread count threadCount = pageCount; for (int i = 0; i < threadCount; i++) { SycTaskArgs task = new SycTaskArgs { ShopNick = shop.nick, PageSize = 40, QueryBeginTime = begin, QueryEndTime = end, }; task.PageNoList.Add(i + 1); BackgroundWorker w = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true, }; w.RunWorkerCompleted += new RunWorkerCompletedEventHandler(w_RunWorkerCompleted); w.ProgressChanged += new ProgressChangedEventHandler(w_ProgressChanged); w.DoWork += new DoWorkEventHandler(w_DoWork); taskList.Add(task); threadList.Add(w); } #endregion } else { #region page count > thread count for (int i = 0; i < threadCount; i++) { SycTaskArgs task = new SycTaskArgs { ShopNick = shop.nick, PageSize = 40, QueryBeginTime = begin, QueryEndTime = end, }; BackgroundWorker w = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true, }; w.RunWorkerCompleted += new RunWorkerCompletedEventHandler(w_RunWorkerCompleted); w.ProgressChanged += new ProgressChangedEventHandler(w_ProgressChanged); w.DoWork += new DoWorkEventHandler(w_DoWork); taskList.Add(task); threadList.Add(w); } int index = 0; for (int i = 0; i < pageCount; i++, index++) { if (index >= taskList.Count) { index = 0; } taskList[i].PageNoList.Add(i + 1); } #endregion } } #endregion #region run tasks signal = new AutoResetEvent(false); for (int i = 0; i < threadCount; i++) { threadList[i].RunWorkerAsync(taskList[i]); } signal.WaitOne(); #endregion } } catch (Exception ex) { XtraMessageBox.Show(ex.Message); } }
void w_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; SycTaskArgs task = e.Argument as SycTaskArgs; foreach (var p in task.PageNoList) { #region get trade information //这里改成mainWorker,即主线程取消子线程工作全部停止 if (mainWorker.CancellationPending) { e.Cancel = true; return; } TradeReq request = new TradeReq(); TradeRsp response = null; request.Status = null; request.PageSize = task.PageSize; request.PageNo = p; request.StartCreated = task.QueryBeginTime.ToString("yyyy-MM-dd HH:mm:ss"); request.EndCreated = task.QueryEndTime.ToString("yyyy-MM-dd HH:mm:ss"); string sessionkey = SystemHelper.GetSessionKey(task.ShopNick); response = TopService.TradesSoldGet(sessionkey, request); #endregion #region if getting trade failed do next if (response == null || response.Trades == null) { lock (vlock) { sub_done += task.PageSize; } continue; } #endregion foreach (var t in response.Trades.Trade) { //if (worker.CancellationPending) //这里改成mainWorker,即主线程取消子线程工作全部停止 if (mainWorker.CancellationPending) { e.Cancel = true; return; } lock (vlock) { sub_done++; } TradeRsp fulltrade = TopService.TradeFullinfoGet(sessionkey, t.Tid); #region if getting trade detail failed do next if (fulltrade == null || fulltrade.Trade == null) { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 失败:无法获取交易信息!", t.BuyerNick), }; worker.ReportProgress(0, state); continue; } #endregion UserRsp buyer = TopService.UserGet(sessionkey, fulltrade.Trade.BuyerNick, fulltrade.Trade.AlipayNo); #region if getting buyer detail failed do next if (buyer == null || buyer.User == null) { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 失败:无法获取买家信息!", t.BuyerNick), }; worker.ReportProgress(0, state); continue; } #endregion Alading.Entity.Consumer consumer = Alading.Business.ConsumerService.GetConsumer(fulltrade.Trade.BuyerNick); if (consumer == null) { #region Consumer is not existed and save it consumer = new Alading.Entity.Consumer(); consumer.nick = buyer.User.Nick; consumer.sex = buyer.User.Sex; consumer.buyer_zip = buyer.User.Location.Zip; consumer.location_city = buyer.User.Location.City; consumer.location_state = buyer.User.Location.State; consumer.location_district = buyer.User.Location.District; consumer.location_address = buyer.User.Location.Address; consumer.location_country = buyer.User.Location.Address; consumer.birthday = buyer.User.Birthday; consumer.credit = buyer.User.BuyerCredit.ToString(); consumer.level = buyer.User.BuyerCredit.Level; consumer.score = buyer.User.BuyerCredit.Score; consumer.status = buyer.User.Status; consumer.created = DateTime.Parse(buyer.User.Created); consumer.last_visit = buyer.User.LastVisit; consumer.mobilephone = fulltrade.Trade.ReceiverMobile; consumer.phone = fulltrade.Trade.ReceiverPhone; consumer.email = fulltrade.Trade.BuyerEmail; consumer.buyer_name = fulltrade.Trade.ReceiverName; consumer.alipay = fulltrade.Trade.AlipayNo; ReturnType result = Alading.Business.ConsumerService.AddConsumer(consumer); if (result == ReturnType.Success) { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 信息成功!", consumer.nick), }; worker.ReportProgress(1, state); Alading.Entity.ConsumerAddress addr = Alading.Business.ConsumerAddressService.GetConsumerAddress( c => c.tid == fulltrade.Trade.Tid).FirstOrDefault(); if (addr == null) { addr = new Alading.Entity.ConsumerAddress { buyer_nick = fulltrade.Trade.BuyerNick, location_address = fulltrade.Trade.ReceiverAddress, location_city = fulltrade.Trade.ReceiverCity, location_country = buyer.User.Location.Country, location_district = fulltrade.Trade.ReceiverDistrict, location_state = fulltrade.Trade.ReceiverState, location_zip = fulltrade.Trade.ReceiverZip, receiver_mobile = fulltrade.Trade.ReceiverMobile, receiver_name = fulltrade.Trade.ReceiverName, receiver_phone = fulltrade.Trade.ReceiverPhone, receiver_zip = fulltrade.Trade.ReceiverZip, tid = fulltrade.Trade.Tid, }; result = Alading.Business.ConsumerAddressService.AddConsumerAddress(addr); if (result == ReturnType.Success) { state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 地址信息成功!", consumer.nick), }; worker.ReportProgress(1, state); } else { state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 地址信息失败:数据保存失败!", consumer.nick), }; worker.ReportProgress(1, state); } } } else { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 信息失败:数据保存失败!", consumer.nick), }; worker.ReportProgress(1, state); continue; } #endregion } else { #region Consumer existed and update address information ReportState state0 = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("客户 {0} 已存在!", consumer.nick), }; worker.ReportProgress(0, state0); Alading.Entity.ConsumerAddress addr = Alading.Business.ConsumerAddressService.GetConsumerAddress( c => c.tid == fulltrade.Trade.Tid).FirstOrDefault(); if (addr == null) { addr = new Alading.Entity.ConsumerAddress { buyer_nick = fulltrade.Trade.BuyerNick, location_address = fulltrade.Trade.ReceiverAddress, location_city = fulltrade.Trade.ReceiverCity, location_country = buyer.User.Location.Country, location_district = fulltrade.Trade.ReceiverDistrict, location_state = fulltrade.Trade.ReceiverState, location_zip = fulltrade.Trade.ReceiverZip, receiver_mobile = fulltrade.Trade.ReceiverMobile, receiver_name = fulltrade.Trade.ReceiverName, receiver_phone = fulltrade.Trade.ReceiverPhone, receiver_zip = fulltrade.Trade.ReceiverZip, tid = fulltrade.Trade.Tid, }; ReturnType result = Alading.Business.ConsumerAddressService.AddConsumerAddress(addr); if (result == ReturnType.Success) { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 地址信息成功!", consumer.nick), }; worker.ReportProgress(1, state); } else { ReportState state = new ReportState { Total = sub_total, Current = sub_done, Message = string.Format("同步客户 {0} 地址信息失败:数据保存失败!", consumer.nick), }; worker.ReportProgress(1, state); } } #endregion } } } }
void worker_DoWork(object sender, DoWorkEventArgs e) { TradeTask tradeTask = (TradeTask)e.Argument; int total_num = tradeTask.totalNum; string shopNick = tradeTask.shopNic; string sessionKey = tradeTask.sessionKey; List <string> tidList = tradeTask.ShopTradeList; int CurrentNum = 0; BackgroundWorker worker = (BackgroundWorker)sender; //用于记录下载失败的订单信息 failedTrade = new FailedTrade(); //买家昵称列表 List <string> buyerNickList = new List <string>(); for (int i = 0; i < tidList.Count; i++) { /*线程取消*/ if (worker.CancellationPending) { e.Cancel = true; break; } try { TradeRsp fullinfoTraderspReturn = TopService.TradeFullinfoGet(sessionKey, tidList[i]); if (fullinfoTraderspReturn == null || fullinfoTraderspReturn.Trade == null) { //加锁 lock (lockObject) { /*记录下载失败的交易*/ failedTrade.tidList.Add(tidList[i]); failedTrade.sessionKey = sessionKey; failedTrade.shopNick = shopNick; } UserState stateFail = new UserState(); stateFail.taskIndex = tradeTask.threadIndex; stateFail.tidIndex = i + 1; stateFail.tid = tidList[i]; ProcessRecord++; currentProessNum++; stateFail.message = "交易获取失败!"; /*订单下载失败*/ worker.ReportProgress(-1, stateFail);/*下载失败*/ continue; } UserState stateSuccess = new UserState(); stateSuccess.taskIndex = tradeTask.threadIndex; stateSuccess.tidIndex = i + 1; currentProessNum++; stateSuccess.tid = tidList[i]; stateSuccess.currentProessNum = (int)((currentProessNum * 100) / (float)total_num); ProcessRecord++; stateSuccess.totalProcessNum = (int)((ProcessRecord * 100) / (float)TotalProessNum); worker.ReportProgress(stateSuccess.currentProessNum, stateSuccess);/*下载成功*/ Alading.Taobao.Entity.Trade fullinfoTradersp = fullinfoTraderspReturn.Trade; if (TradeService.AddTradeOrderBuyer(fullinfoTradersp) != ReturnType.Success) { UserState SaveFailState = new UserState(); SaveFailState.shopNick = shopNick; SaveFailState.message = "保存失败!"; worker.ReportProgress(1, SaveFailState);/*参数2:表示保存失败*/ } }/*try*/ catch (System.Exception ex) { ProcessRecord++; currentProessNum++; //加锁 lock (lockObject) { /*记录下载失败的交易*/ failedTrade.tidList.Add(tidList[i]); failedTrade.sessionKey = sessionKey; failedTrade.shopNick = shopNick; } UserState exceptionState = new UserState(); exceptionState.message = ex.Message.ToString(); exceptionState.taskIndex = tradeTask.threadIndex; exceptionState.tidIndex = i + 1; exceptionState.tid = tidList[i]; worker.ReportProgress(-1, exceptionState); } }/*for 对tid遍历*/ e.Result = tradeTask.threadIndex; }
void mainWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; StringBuilder str_fail = new StringBuilder(); TradeReq tradeReq = new TradeReq(); //获取状态 tradeReq.Status = TradeStatus; //总交易量清空 TotalProessNum = 0; //错误列表清空 failedTrade = new FailedTrade(); tradeReq.PageSize = 100; //每页总数 tradeReq.PageNo = 1; //页数 /*计算总的交易量 即总进度条计算*/ for (int j = 0; j < shop_List.Count; j++) { try { #region 时间设置 /*选择近十五天*/ if (cmbSelectTime.SelectedIndex == 0) { tradeReq.StartCreated = this.dateEditBegin.DateTime.ToString("yyyy-MM-dd HH:mm:ss"); tradeReq.EndCreated = this.dateEditEnd.DateTime.ToString("yyyy-MM-dd HH:mm:ss"); } else/*开店至今*/ { tradeReq.StartCreated = shop_List[j].created.ToString("yyyy-MM-dd HH:mm:ss"); tradeReq.EndCreated = DateTime.Now.AddDays(-15).ToString("yyyy-MM-dd HH:mm:ss"); } #endregion //获取sessionkey string sessionkey = SystemHelper.GetSessionKey(shop_List[j].nick); //从淘宝上获取数据 TradeRsp tradeRsp = TopService.TradesSoldGet(sessionkey, tradeReq); //订单获取失败 if (tradeRsp != null || tradeRsp.Trades != null) { TotalProessNum += tradeRsp.TotalResults; } } catch (System.Exception ex) { BeginInvoke(new Action(() => { OrderDown.Items.Insert(0, string.Format("{0} {1}", DateTime.Now.ToString("HH:mm:ss"), ex.Message)); })); return; } } /*各个店铺的交易处理*/ for (int j = 0; j < shop_List.Count; j++) { //清空线程列表 workerList.Clear(); //清空总线程量 totalThreadCount = 0; //当前交易量 currentProessNum = 0; /*信息*/ UserState DoState = new UserState(); DoState.shopNick = shop_List[j].nick; DoState.message = "开始处理!"; mainWorker.ReportProgress(0, DoState); try { //交易列表 List <string> tidList = new List <string>(); #region 时间设置 /*选择近十五天*/ if (cmbSelectTime.SelectedIndex == 0) { tradeReq.StartCreated = this.dateEditBegin.DateTime.ToString("yyyy-MM-dd HH:mm:ss"); tradeReq.EndCreated = this.dateEditEnd.DateTime.ToString("yyyy-MM-dd HH:mm:ss"); } else/*开店至今*/ { tradeReq.StartCreated = shop_List[j].created.ToString("yyyy-MM-dd HH:mm:ss"); tradeReq.EndCreated = DateTime.Now.AddDays(-15).ToString("yyyy-MM-dd HH:mm:ss"); } #endregion //获取sessionkey string sessionkey = SystemHelper.GetSessionKey(shop_List[j].nick); //从淘宝上获取数据 TradeRsp tradeRsp = TopService.TradesSoldGet(sessionkey, tradeReq); //订单获取失败 if (tradeRsp == null || tradeRsp.Trades == null) { //异步操作 BeginInvoke(new Action(() => { OrderDown.Items.Insert(0, string.Format("{0} 网络异常,{1}店铺的订单下载失败!", DateTime.Now.ToString("HH:mm:ss"), shop_List[j].nick)); })); str_fail.Append(shop_List[j].nick); str_fail.Append(" "); continue; } if (tradeRsp != null) { foreach (Alading.Taobao.Entity.Trade tradeObj in tradeRsp.Trades.Trade) { tidList.Add(tradeObj.Tid); } /*foreach*/ } /*if*/ //店铺的总交易量 int totalResults = tradeRsp.TotalResults; BeginInvoke(new Action(() => { OrderDown.Items.Insert(0, string.Format("{0} 店铺{1}共{2}订单!", DateTime.Now.ToString("HH:mm:ss"), shop_List[j].nick, totalResults)); })); #region 计算是否需要分页获取 int PageTotalNum = 0; /*总页数*/ int PageCurrentNo = 0; /*当前页数*/ //计算总页数 PageTotalNum = (tradeRsp.TotalResults % tradeReq.PageSize == 0) ? (tradeRsp.TotalResults / tradeReq.PageSize) : (tradeRsp.TotalResults / tradeReq.PageSize + 1); /*有多余两页的订单*/ if (PageTotalNum >= 2) { for (PageCurrentNo = 2; PageCurrentNo < PageTotalNum + 1; PageCurrentNo++) { tradeReq.PageNo = PageCurrentNo; tradeRsp = TopService.TradesSoldGet(sessionkey, tradeReq); if (tradeRsp != null && tradeRsp.Trades != null) { foreach (Taobao.Entity.Trade tradeObj in tradeRsp.Trades.Trade) { if (!tidList.Contains(tradeObj.Tid)) { tidList.Add(tradeObj.Tid); } } } //if else /*获取失败*/ { if (!str_fail.ToString().Contains(shop_List[j].nick)) { str_fail.Append(shop_List[j].nick); str_fail.Append(" "); BeginInvoke(new Action(() => { OrderDown.Items.Insert(0, string.Format("{0} 网络异常,{1}店铺的订单下载失败!", DateTime.Now.ToString("HH:mm:ss"), shop_List[j].nick)); })); } break; } } //for } //if #endregion /*总交易数小于线程数*/ if (totalResults < threadCount) { threadCount = totalResults; } //每个线程交易下载量 int tradePageSize = (totalResults % threadCount == 0) ? (totalResults / threadCount) : (totalResults / threadCount + 1); #region 开启多线程 for (int i = 0; i < threadCount; i++) { //获取分给每个线程的tid列表 List <string> TradeTidList = tidList.Skip(i * tradePageSize).Take(tradePageSize).ToList(); /*线程配置*/ BackgroundWorker TradeWorker = new BackgroundWorker(); TradeWorker.WorkerReportsProgress = true; TradeWorker.WorkerSupportsCancellation = true; TradeWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); TradeWorker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); TradeWorker.DoWork += new DoWorkEventHandler(worker_DoWork); //添加到线程列表 workerList.Add(TradeWorker); /*参数传递*/ TradeTask tradeTask = new TradeTask(); tradeTask.shopNic = shop_List[j].nick; tradeTask.ShopTradeList = TradeTidList; tradeTask.threadIndex = i + 1; tradeTask.sessionKey = sessionkey; tradeTask.totalNum = totalResults; TradeWorker.RunWorkerAsync(tradeTask); } #endregion } catch (System.Exception ex) { BeginInvoke(new Action(() => { if (ex.Message.Contains("Remote service error")) { OrderDown.Items.Insert(0, string.Format("{0} {1}", DateTime.Now.ToString("HH:mm:ss"), "不能连接远程服务器,请多尝试几次下载!".ToString())); } })); /*进度记录*/ ProcessRecord = 0; TotalProessNum = 0; TotalProessNum = 0; BeginInvoke(new Action(() => { btnDownOrders.Enabled = true; })); return; } //信号量,阻塞当前线程,这里阻塞的是下载主线程 autoReset.WaitOne(); }/*foreach 对店铺遍历*/ }