From da4f20ef3bddd4e681240eeb4c29d6feb3a5417d Mon Sep 17 00:00:00 2001 From: wule Date: Wed, 7 Oct 2026 20:14:33 +0800 Subject: [PATCH] =?UTF-8?q?1=E6=B7=98=E5=AE=9D=E6=8B=8D=E5=8D=95=20=202?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=9B=B4=E5=8F=91=E5=94=AE=E5=90=8E=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 29WxOrderWpf/29WxOrderWpf.csproj | 1 + .../BuyerCtrls/TaobaoBuyOrderViewModel.cs | 418 ++++++++++++++---- .../Ctrls/OrderCtrls/OrderListCtrl.xaml.cs | 44 +- .../OrderCtrls/OrderListRowItemCtrl.xaml | 2 +- .../OrderCtrls/OrderListRowItemCtrl.xaml.cs | 23 +- .../OrderCtrls/Resources/tbAutoAddress.js | 140 ++++++ .../ViewModels/TaobaoLoginViewModel.cs | 1 + .../Model/DBModel/oms_wei_order_item_info.cs | 7 +- 8 files changed, 525 insertions(+), 111 deletions(-) create mode 100644 29WxOrderWpf/Ctrls/OrderCtrls/Resources/tbAutoAddress.js diff --git a/29WxOrderWpf/29WxOrderWpf.csproj b/29WxOrderWpf/29WxOrderWpf.csproj index 42cb098..8ae2c8f 100644 --- a/29WxOrderWpf/29WxOrderWpf.csproj +++ b/29WxOrderWpf/29WxOrderWpf.csproj @@ -68,6 +68,7 @@ + diff --git a/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderViewModel.cs b/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderViewModel.cs index f43d1f5..d9be30f 100644 --- a/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderViewModel.cs +++ b/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderViewModel.cs @@ -28,6 +28,8 @@ using Work; using Work._29Tools.BLL; using Work._29Tools.CefTools; using Work.BaseForms; +using WxOrder.Framework.Commons; +using WxOrder.Framework.Helpers; using static AllBase.DouYinModel.Result.DouOrderListInfo; using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; using static WPFCommon.Interop.InteropValues; @@ -51,7 +53,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls public int CloseAfterSecond { get; set; } public string InitUrl { get; set; } = ""; - //private string shopCookieHead = "taobao.com"; + private string shopCookieHead = "taobao.com"; private string buyerLoginUrl = "https://login.taobao.com/havanaone/login/login.htm"; private string MainUrl = "https://i.taobao.com/my_itaobao"; //"https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?"; @@ -468,7 +470,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls Thread.Sleep(100); } - // 如果在商品搜索页面 + // 第一次打开如果在商品搜索页面 if (Address.StartsWith("https://s.taobao.com/search?")) { Thread.Sleep(1000); @@ -521,92 +523,25 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls } } + // 打开窗口即进入商品页面一定是拍单,则下一步点击立即购买,随后进入地址修改页面(不能一开始就进入,会掉cookie) if (Address.StartsWith("https://item.taobao.com/item.htm?id=")) { - //修改 - Thread.Sleep(Randomx.GetId(500, 1000)); - CefWebBrowser.Load("https://i.taobao.com/my_itaobao/receiver-address-pc"); - - var client = CefWebBrowser.GetDevToolsClient(); - var host = CefWebBrowser.GetBrowserHost(); - if (client == null || host == null) - return; - - string jsRst = "failed"; - StringBuilder sb = new StringBuilder(); - sb.Append("(function() {\r\n"); - //sb.Append(" var searchBtns = document.getElementsByTagName('a');\r\n"); - sb.Append(" var searchBtns = document.getElementsByClassName('t-change');\r\n"); - sb.Append(" for (i = 0; i < searchBtns.length; i++) {\r\n"); - sb.Append(" var searchBtn = searchBtns[i];\r\n"); - sb.Append(" if (searchBtn.innerHTML='修改') {\r\n"); - sb.Append(" searchBtn.click();\r\n"); - sb.Append(" return 'success';\r\n"); - sb.Append(" }\r\n"); - sb.Append(" }\r\n"); - sb.Append(" return 'failed';\r\n"); - sb.Append("})();"); - var jsStr = sb.ToString(); - for (int i = 0; i < 20 && jsRst != "success"; i++) + try { - var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); - jsRst = r.Result.Value.ParseToString(); - Thread.Sleep(500); + // 点击 立即购买/领券购买 + await AutoClickBuyButton(); + + // 点击 管理地址(必出验证,暂时url直接跳转) + //await AutoClickManageAddressButton(); + + // 自动修改地址 进入地址页面 + //Thread.Sleep(Randomx.GetId(500, 1000)); + CefWebBrowser.Load("https://i.taobao.com/my_itaobao/receiver-address-pc"); + await AutoChangeAddress(); } - } - - // 如果在地质修改页面 - if (Address.StartsWith("https://i.taobao.com/my_itaobao/receiver-address-pc")) - { - Thread.Sleep(1000); - - return; - - string jsRst = "failed"; - StringBuilder sb = new StringBuilder(); - sb.Append("(function() {\r\n"); - sb.Append(" var searchBtn = document.getElementsByClassName('image-search-icon-outerMode')[0];\r\n"); - sb.Append(" if (searchBtn)\r\n"); - sb.Append(" searchBtn.click();\r\n"); - sb.Append(" else\r\n"); - sb.Append(" return 'failed';\r\n"); - sb.Append("})();"); - var jsStr = sb.ToString(); - var client = CefWebBrowser.GetDevToolsClient(); - var host = CefWebBrowser.GetBrowserHost(); - if (client == null || host == null) - return; - - for (int i = 0; i < 10 && jsRst == "failed"; i++) + catch (Exception ex) { - var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); - jsRst = r.Result.Value.ParseToString(); - Thread.Sleep(500); - } - - var image = ImageBuild.LoadBitmipImageFromUrl(orderItem.thumb_img); - if (image == null) - return; - - await Application.Current.Dispatcher.InvokeAsync(new Action(() => { Clipboard.SetImage(image); })); - host.SendKeyEvent(new CefSharp.KeyEvent() { WindowsKeyCode = 86, Type = KeyEventType.RawKeyDown, Modifiers = CefEventFlags.ControlDown }); - Thread.Sleep(Randomx.GetId(2500, 3000)); - - jsRst = "failed"; - sb = new StringBuilder(); - sb.Append("(function() {\r\n"); - sb.Append(" var searchBtn = document.getElementById('image-search-upload-button');\r\n"); - sb.Append(" if (searchBtn)\r\n"); - sb.Append(" searchBtn.click();\r\n"); - sb.Append(" else\r\n"); - sb.Append(" return 'failed';\r\n"); - sb.Append("})();"); - jsStr = sb.ToString(); - for (int i = 0; i < 10 && jsRst == "failed"; i++) - { - var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); - jsRst = r.Result.Value.ParseToString(); - Thread.Sleep(500); + BaseMsgWindow.ShowError(ex.Message); } } }); @@ -614,7 +549,324 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls }); } + private async Task AutoClickBuyButton() + { + for (int i = 0; i < 10 && !Address.StartsWith("https://item.taobao.com/item.htm?id="); i++) + { + Thread.Sleep(500); + } + if (!Address.StartsWith("https://item.taobao.com/item.htm?id=")) + throw new Exception("当前不在商品界面!"); + var client = CefWebBrowser.GetDevToolsClient(); + var host = CefWebBrowser.GetBrowserHost(); + if (client == null || host == null) + throw new Exception("初始化商品购买失败!"); + + // 1.点击修改按钮 + string jsRst = "failed"; + StringBuilder sb = new StringBuilder(); + // 查找元素 + sb.Append(@"function findElement(selector, isXPath = true) { + if (isXPath) { + return document.evaluate( + selector, + document, + null, + XPathResult.FIRST_ORDERED_NODE_TYPE, + null + ).singleNodeValue; + } else { + return document.querySelector(selector); + } + } + "); + sb.Append("(function() {\r\n"); + //sb.Append(" var searchBtns = document.getElementsByTagName('button');\r\n"); + sb.Append(" var searchBtns = document.getElementsByTagName('span');\r\n"); + sb.Append(" for (i = 0; i < searchBtns.length; i++) {\r\n"); + sb.Append(" var searchBtn = searchBtns[i];\r\n"); + sb.Append(" if (searchBtn.innerHTML.indexOf('立即购买') >= 0) {\r\n"); + sb.Append(" searchBtn.parentElement.click();\r\n"); + sb.Append(" return 'success';\r\n"); + sb.Append(" }\r\n"); + sb.Append(" }\r\n"); + sb.Append(" searchBtns = document.getElementsByTagName('span');\r\n"); + sb.Append(" for (i = 0; i < searchBtns.length; i++) {\r\n"); + sb.Append(" var searchBtn = searchBtns[i];\r\n"); + sb.Append(" if (searchBtn.innerHTML.indexOf('领券购买') >= 0) {\r\n"); + sb.Append(" searchBtn.parentElement.click();\r\n"); + sb.Append(" return 'success';\r\n"); + sb.Append(" }\r\n"); + sb.Append(" }\r\n"); + //sb.Append(" const buyBtn = findElement('//*[contains(text(), \"立即购买\")]').parentElement || findElement('//*[contains(text(), \"领券购买\")]');\r\n"); + //sb.Append(" if (buyBtn) {\r\n"); + //sb.Append(" buyBtn.click();\r\n"); + //sb.Append(" return 'success';\r\n"); + //sb.Append(" }\r\n"); + sb.Append(" return 'failed';\r\n"); + sb.Append("})();"); + var jsStr = sb.ToString(); + for (int i = 0; i < 20 && jsRst != "success"; i++) + { + var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); + jsRst = r.Result.Value.ParseToString(); + Thread.Sleep(500); + } + if (jsRst != "success") + throw new Exception("立即购买按钮不存在!"); + + for (int i = 0; i < 10 && !Address.StartsWith("https://buy.taobao.com/auction/buy_now.jhtml"); i++) + { + Thread.Sleep(500); + } + + //滑块完成验证 + bool isNeedSlider = false; + jsRst = "failed"; + sb = new StringBuilder(); + jsStr = ""; + sb.Append("(function() {\r\n"); + sb.Append(" if (document.body.innerHTML.indexOf('下方滑块完成验证') < 0) {\r\n"); + sb.Append(" return 'success';\r\n"); + sb.Append(" }\r\n"); + sb.Append(" return 'failed';\r\n"); + sb.Append("})();"); + jsStr = sb.ToString(); + for (int i = 0; i < 1000; i++) + { + var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); + jsRst = r.Result.Value.ParseToString(); + if (jsRst != "success") + isNeedSlider = true; + else + isNeedSlider = false; + Thread.Sleep(500); + if (!isNeedSlider) + break; + } + + if (!Address.StartsWith("https://buy.taobao.com/auction/buy_now.jhtml")) + throw new Exception("立即购买点击失败!"); + Thread.Sleep(500); + + if (isNeedSlider) + { + List cookieList = WPFCEFBrowser.GetCookieList(shopCookieHead, CefWebBrowser.GetCookieManager(null)); + this.buyer.cookie = JsonHelper.SerializeObject(cookieList); + + var buyerUrl = BaseClass.Build29WxObjString("user/mdy_taobao_buyer_cookie"); + var buyerData = UserLogin.GetSignaturex() + + "&buyer_id=" + this.buyer.buyer_id + + "&status=" + "在线" + + "&cookie=" + GetHtml.UrlEncodeUtf8(JsonHelper.SerializeObject(cookieList)); + var result = GetHtml.PostUtf8(buyerUrl, buyerData); + if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200")) + result = GetHtml.PostUtf8(buyerUrl, buyerData); + } + } + + private async Task AutoClickManageAddressButton() + { + for (int i = 0; i < 10 && !Address.StartsWith("https://buy.taobao.com/auction/buy_now.jhtml"); i++) + { + Thread.Sleep(500); + } + if (!Address.StartsWith("https://buy.taobao.com/auction/buy_now.jhtml")) + throw new Exception("当前不在结算界面!"); + + var client = CefWebBrowser.GetDevToolsClient(); + var host = CefWebBrowser.GetBrowserHost(); + if (client == null || host == null) + throw new Exception("初始化商品结算失败!"); + + // 1.点击修改按钮 + string jsRst = "failed"; + StringBuilder sb = new StringBuilder(); + sb.Append("(function() {\r\n"); + sb.Append(" var searchBtns = document.getElementsByTagName('a');\r\n"); + sb.Append(" for (i = 0; i < searchBtns.length; i++) {\r\n"); + sb.Append(" var searchBtn = searchBtns[i];\r\n"); + sb.Append(" if (searchBtn.innerHTML.indexOf('管理地址') >= 0) {\r\n"); + sb.Append(" searchBtn.click();\r\n"); + sb.Append(" return 'success';\r\n"); + sb.Append(" }\r\n"); + sb.Append(" }\r\n"); + sb.Append(" return 'failed';\r\n"); + sb.Append("})();"); + var jsStr = sb.ToString(); + for (int i = 0; i < 20 && jsRst != "success"; i++) + { + var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); + jsRst = r.Result.Value.ParseToString(); + Thread.Sleep(500); + } + if (jsRst != "success") + throw new Exception("管理地址按钮不存在!"); + + for (int i = 0; i < 10 && !Address.StartsWith("https://i.taobao.com/my_itaobao/receiver-address-pc"); i++) + { + Thread.Sleep(500); + } + if (!Address.StartsWith("https://i.taobao.com/my_itaobao/receiver-address-pc")) + throw new Exception("管理地址点击失败!"); + Thread.Sleep(500); + } + + private async Task AutoChangeAddress() + { + for (int i = 0; i < 10 && !Address.StartsWith("https://i.taobao.com/my_itaobao/receiver-address-pc"); i++) + { + Thread.Sleep(500); + } + if (!Address.StartsWith("https://i.taobao.com/my_itaobao/receiver-address-pc")) + throw new Exception("当前不在修改地址界面!"); + + var client = CefWebBrowser.GetDevToolsClient(); + var host = CefWebBrowser.GetBrowserHost(); + if (client == null || host == null) + throw new Exception("初始化修改地址失败!"); + + //string content = ResourceHelper.GetResourceText("/Ctrls/OrderCtrls/Resources/tbAutoAddress.js", "29WxFindOrder"); + //var cr = await client.Runtime.EvaluateAsync(content, null, true, null, null, true, null, true); + //var contentRst = cr.Result.Value.ParseToString(); + //Thread.Sleep(500); + //return; + + // 1.点击修改按钮 + string jsRst = "failed"; + StringBuilder sb = new StringBuilder(); + sb.Append("(function() {\r\n"); + //sb.Append(" var searchBtns = document.getElementsByTagName('a');\r\n"); + sb.Append(" var searchBtns = document.getElementsByClassName('t-change');\r\n"); + sb.Append(" for (i = 0; i < searchBtns.length; i++) {\r\n"); + sb.Append(" var searchBtn = searchBtns[i];\r\n"); + sb.Append(" if (searchBtn.innerHTML == '修改') {\r\n"); + sb.Append(" searchBtn.click();\r\n"); + sb.Append(" return 'success';\r\n"); + sb.Append(" }\r\n"); + sb.Append(" }\r\n"); + sb.Append(" return 'failed';\r\n"); + sb.Append("})();"); + var jsStr = sb.ToString(); + for (int i = 0; i < 20 && jsRst != "success"; i++) + { + var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); + jsRst = r.Result.Value.ParseToString(); + Thread.Sleep(500); + } + if (jsRst != "success") + throw new Exception("修改地址按钮不存在!"); + + // 2.给地址框赋值 + var changeReactInputValueStr = @" + function changeReactInputValue(inputDom,newText){ + let lastValue = inputDom.value; + inputDom.value = newText; + let event = new Event('input', { bubbles: true }); + event.simulated = true; + let tracker = inputDom._valueTracker; + if (tracker) { + tracker.setValue(lastValue); + } + inputDom.dispatchEvent(event); + }"; + await client.Runtime.EvaluateAsync(changeReactInputValueStr, null, true, null, null, true, null, true); + + string name = null, mobile = null, address = null; + if (BuyType == "transit") + { + if (txtSourceCodeVal.IsNullOrEmpty()) + throw new Exception("溯源码不存在!"); + name = TransitWaybillHelper.LastName[Randomx.GetId(TransitWaybillHelper.LastName.Count)] + (Randomx.GetId(2) == 1 ? "先生" : "女士"); + mobile = TransitWaybillHelper.MobileHead[Randomx.GetId(TransitWaybillHelper.MobileHead.Count)] + Randomx.GetNumber(8); + address = name + mobile + transitWarehouse.TransDetailAddress + Randomx.GetId(1, 35) + Randomx.GetId(1, 9).ToString().PadLeft(2, '0') + "室" + txtSourceCodeVal; + } + else // todo 直发 + { + } + if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(mobile) || string.IsNullOrEmpty(address)) + throw new Exception("地址获取失败!"); + + jsRst = "failed"; + sb = new StringBuilder(); + sb.Append("(function() {\r\n"); + sb.Append(" var txt = document.getElementsByTagName('textarea')[0];\r\n"); + sb.Append(" if (txt) {\r\n"); + sb.Append(" changeReactInputValue(txt, '" + address + "');\r\n"); + sb.Append(" return 'success';\r\n"); + sb.Append(" }\r\n"); + sb.Append(" return 'failed';\r\n"); + sb.Append("})();"); + jsStr = sb.ToString(); + for (int i = 0; i < 20 && jsRst != "success"; i++) + { + var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); + jsRst = r.Result.Value.ParseToString(); + Thread.Sleep(500); + } + if (jsRst != "success") + throw new Exception("填写地址信息失败!"); + + // 3.点击识别按钮 + jsRst = "failed"; + sb = new StringBuilder(); + sb.Append("(function() {\r\n"); + sb.Append(" var searchBtns = document.getElementsByTagName('button');\r\n"); + //sb.Append(" var searchBtns = document.getElementsByClassName('t-change');\r\n"); + sb.Append(" for (i = 0; i < searchBtns.length; i++) {\r\n"); + sb.Append(" var searchBtn = searchBtns[i];\r\n"); + sb.Append(" if (searchBtn.innerHTML.indexOf('识别') >= 0) {\r\n"); + sb.Append(" searchBtn.click();\r\n"); + sb.Append(" return 'success';\r\n"); + sb.Append(" }\r\n"); + sb.Append(" }\r\n"); + sb.Append(" return 'failed';\r\n"); + sb.Append("})();"); + jsStr = sb.ToString(); + for (int i = 0; i < 20 && jsRst != "success"; i++) + { + var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); + jsRst = r.Result.Value.ParseToString(); + Thread.Sleep(500); + } + if (jsRst != "success") + throw new Exception("识别地址按钮不存在!"); + + // 4.核对详细地址 + jsRst = "failed"; + sb = new StringBuilder(); + sb.Append("(function() {\r\n"); + sb.Append(" var txts = document.getElementsByTagName('textarea');\r\n"); + sb.Append(" for (i = 0; i < txts.length; i++) {\r\n"); + sb.Append(" var txt = txts[i];\r\n"); + sb.Append(" if (txt.outerHTML.indexOf('请输入详细地址信息') > 0) {\r\n"); + sb.Append(" if ('" + address + "'.indexOf(txt.innerHTML) >= 0) {\r\n"); + if (BuyType == "transit") + { + // 中转仓订单判断溯源码 + sb.Append(" if (txt.innerHTML.indexOf('" + txtSourceCodeVal + "') < 0) {\r\n"); + sb.Append(" changeReactInputValue(txt, txt.innerHTML + '" + txtSourceCodeVal + "'); \r\n"); + sb.Append(" }\r\n"); + } + sb.Append(" return 'success';\r\n"); + sb.Append(" }\r\n"); + sb.Append(" }\r\n"); + sb.Append(" }\r\n"); + sb.Append(" return 'failed';\r\n"); + sb.Append("})();"); + jsStr = sb.ToString(); + for (int i = 0; i < 20 && jsRst != "success"; i++) + { + var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); + jsRst = r.Result.Value.ParseToString(); + Thread.Sleep(500); + } + if (jsRst != "success") + throw new Exception("详细地址信息有误!"); + + //textarea + } private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e) diff --git a/29WxOrderWpf/Ctrls/OrderCtrls/OrderListCtrl.xaml.cs b/29WxOrderWpf/Ctrls/OrderCtrls/OrderListCtrl.xaml.cs index e502612..7a980f9 100644 --- a/29WxOrderWpf/Ctrls/OrderCtrls/OrderListCtrl.xaml.cs +++ b/29WxOrderWpf/Ctrls/OrderCtrls/OrderListCtrl.xaml.cs @@ -1821,7 +1821,7 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls if (cmbRejectStatusText == "拒收成功" && !order.orderItems.Any(oi => oi.AddEditTransitWarehouseRejectStr.StartsWith("拒收成功"))) return true; - if (order.order_id == "3738674216947317248") + if (order.order_id == "3739296914665288192") { } @@ -2335,7 +2335,7 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls { foreach (var orderItem in order.orderItems) { - if (order.order_id == "3739105285145538816") + if (order.order_id == "3739296914665288192") { } @@ -2356,7 +2356,7 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls { foreach (var orderItem in tmpOrderItems) { - if (orderItem.order_id == "3738564728075491584") + if (orderItem.order_id == "3739296914665288192") { } @@ -2385,7 +2385,7 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls { foreach (var orderItem in order.orderItems) { - if (order.order_id == "3739105285145538816") + if (order.order_id == "3739296914665288192") { } @@ -2400,16 +2400,18 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls // 退货地址是退货仓的,直接申请退货退款,取到地址后直接去填写退货仓退货信息 if (orderItem?.ItemOrder?.OrderBuyType == "云仓") { - if (!string.IsNullOrEmpty(orderItem.ItemTransitOrderWithVoid?.out_order_no) && orderItem.PddBuyerAfterSaleAddressStr.IsNullOrEmpty() && - (orderItem.TransitRefundStatusStr.Contains("需手动申请售后") || orderItem.TransitRefundStatusStr.Contains("需手动申请售后") || orderItem.TransitRefundStatusStr.IsNullOrEmpty())) + if (!string.IsNullOrEmpty(orderItem.ItemTransitOrderWithVoid?.out_order_no) && orderItem.PddBuyerAfterSaleAddressStr.IsNullOrEmpty() && GetNeedBuyerAfterSale(orderItem.TransitRefundStatusStr)) + tmpOrderItems.Add(orderItem); + if (!string.IsNullOrEmpty(orderItem.ItemTransitOrderWithVoid?.out_order_no) && GetNeedBuyerNewAfterSale(orderItem.TransitRefundStatusStr)) tmpOrderItems.Add(orderItem); } if (orderItem?.ItemOrder?.OrderBuyType == "直发") { if (orderItem != null && !string.IsNullOrEmpty(orderItem.ItemOrder?.out_order_no) && orderItem.DirectPddBuyerAfterSaleAddressStr.IsNullOrEmpty() && - ((orderItem.ItemOrder?.out_after_sale_status).ParseToString().Contains("需手动申请售后") || (orderItem.ItemOrder?.out_after_sale_status).ParseToString().Contains("待用户发货") || - (orderItem.ItemOrder?.out_after_sale_status).IsNullOrEmpty())) + GetNeedBuyerAfterSale(orderItem.ItemOrder?.out_after_sale_status)) + tmpOrderItems.Add(orderItem); + if (orderItem != null && !string.IsNullOrEmpty(orderItem.ItemOrder?.out_order_no) && GetNeedBuyerNewAfterSale(orderItem.ItemOrder?.out_after_sale_status)) tmpOrderItems.Add(orderItem); } @@ -2417,8 +2419,9 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls if (orderItem?.ItemOrder?.OrderBuyType == "云改直") { if (orderItem != null && !string.IsNullOrEmpty(orderItem.ItemOrder?.out_order_no) && orderItem.DirectPddBuyerAfterSaleAddressStr.IsNullOrEmpty() && - ((orderItem.ItemOrder?.out_after_sale_status).ParseToString().Contains("需手动申请售后") || (orderItem.ItemOrder?.out_after_sale_status).ParseToString().Contains("待用户发货") || - (orderItem.ItemOrder?.out_after_sale_status).IsNullOrEmpty())) + GetNeedBuyerAfterSale(orderItem.ItemOrder?.out_after_sale_status)) + tmpOrderItems.Add(orderItem); + if (orderItem != null && !string.IsNullOrEmpty(orderItem.ItemOrder?.out_order_no) && GetNeedBuyerNewAfterSale(orderItem.ItemOrder?.out_after_sale_status)) tmpOrderItems.Add(orderItem); } } @@ -2439,7 +2442,7 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls int index = 0; foreach (var tmpOrderItem in tmpOrderItems) { - if (tmpOrderItem.order_id == "3739105285145538816") + if (tmpOrderItem.order_id == "3739296914665288192") { } @@ -2501,8 +2504,7 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls refundStatusStr = (order.out_after_sale_status).ParseToString(); AfterSaleAddressStr = orderItem.DirectPddBuyerAfterSaleAddressStr; } - if (string.IsNullOrEmpty(outOrderNo) || !AfterSaleAddressStr.IsNullOrEmpty() || - (!refundStatusStr.Contains("需手动申请售后") && !refundStatusStr.Contains("待用户发货") && !refundStatusStr.IsNullOrEmpty())) + if (string.IsNullOrEmpty(outOrderNo) || !(AfterSaleAddressStr.IsNullOrEmpty() || GetNeedBuyerNewAfterSale(refundStatusStr)) || !GetNeedBuyerAfterSale(refundStatusStr)) continue; PddBuyerOrderLiteInfo pddBuyerOrderLiteInfo = new PddBuyerOrderLiteInfo(); @@ -2534,7 +2536,7 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls pddBuyerAfterSale = orderItem.DirectPddBuyerAfterSale; bool isSimPddAfterSaleSuccess = true; - if (refundStatusStr.Contains("需手动申请售后") || string.IsNullOrEmpty(refundStatusStr)) + if (GetNeedBuyerNewAfterSale(refundStatusStr)) { isSimPddAfterSaleSuccess = false; // pddBuyerAfterSale作为参数传入,获取退货退款金额 @@ -3052,6 +3054,20 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls chkNoPickupNumOrderIsChecked = chkNoPickupNumOrder.IsChecked.ParseToBool(); FilterOrders(); } + + public static bool GetNeedBuyerAfterSale(string buyerAfterSaleStatus) + { + if (buyerAfterSaleStatus.Contains("待用户发货") || GetNeedBuyerNewAfterSale(buyerAfterSaleStatus)) + return true; + return false; + } + + public static bool GetNeedBuyerNewAfterSale(string buyerAfterSaleStatus) + { + if (buyerAfterSaleStatus.Contains("需手动申请售后") || buyerAfterSaleStatus.Contains("已申请售后 退款失败") || buyerAfterSaleStatus.Contains("已取消申请") || string.IsNullOrEmpty(buyerAfterSaleStatus)) + return true; + return false; + } } public class OrderFilterConfig : PropertyNotifyObject diff --git a/29WxOrderWpf/Ctrls/OrderCtrls/OrderListRowItemCtrl.xaml b/29WxOrderWpf/Ctrls/OrderCtrls/OrderListRowItemCtrl.xaml index be14da9..fbd6d40 100644 --- a/29WxOrderWpf/Ctrls/OrderCtrls/OrderListRowItemCtrl.xaml +++ b/29WxOrderWpf/Ctrls/OrderCtrls/OrderListRowItemCtrl.xaml @@ -673,7 +673,7 @@ Title="采购账户:" Cursor="Hand" Foreground="#0099ff" - MouseLeftButtonUp="TransitOrderBuye_Click" + MouseLeftButtonUp="TransitOrderBuy_Click" Visibility="{Binding ElementName=txtTransitOrderBuyerStr, Path=Text, Converter={StaticResource HasTextVisibility}}"> setTimeout(resolve, ms)); +} + +// 查找元素(支持选择器或XPath) +function findElement(selector, isXPath = true) { + if (isXPath) { + return document.evaluate( + selector, + document, + null, + XPathResult.FIRST_ORDERED_NODE_TYPE, + null + ).singleNodeValue; + } else { + return document.querySelector(selector); + } +} + +// 完整流程 +async function changeTbAddress(data = {}) { + const { + transitAddress = '' + } = data; + + console.log('📝 开始自动填写地址...'); + + // 1. 点击"修改"按钮,弹出修改地址框 + var btnType = findElement('(//a[contains(text(), "修改")])[1]'); + for (i = 0; i < 10; i++) { + if (!btnType) { + console.warn('⚠️ 找不到"修改"按钮,等待重试' + i); + await sleep(500); + btnType = findElement('(//a[contains(text(), "修改")])[1]'); + } + } + if (!btnType) { + console.warn('⚠️ 找不到"修改"按钮'); + return false; + } + btnType.click(); + console.log('✅ 已点击"修改"按钮'); + await sleep(500); + + return true; + + // // 2. 填充并自动识别收货地址 + // const invoiceTitle = findElement('//label[contains(text(), "发票抬头")]/following-sibling::textarea[1]') || + // findElement('//*[contains(text(), "发票抬头")]/following-sibling::textarea[1]'); + // if (invoiceTitle) { + // changeReactInputValue(invoiceTitle, title); + // console.log('✅ 发票抬头已填充'); + // } else { + // console.warn('⚠️ 未找到发票抬头控件'); + // } + + // // 3. 查找并填充税号 + // const taxNumberInput = findElement('//label[contains(text(), "税号")]/following-sibling::input[1]') || + // findElement('//*[contains(text(), "税号")]/following-sibling::input[1]'); + // if (taxNumberInput) { + // changeReactInputValue(taxNumberInput, taxNumber); + // console.log('✅ 税号已填充'); + // } else { + // console.warn('⚠️ 未找到税号控件'); + // } + + // await sleep(300); + + // // 4. 查找并点击"申请发票"按钮 + // const applyBtn = findElement('//*[contains(text(), "申请发票")]'); + // if (!applyBtn) { + // console.error('❌ 未找到"申请发票"按钮'); + // return false; + // } + + // applyBtn.scrollIntoView({ behavior: 'smooth', block: 'center' }); + // await sleep(300); + // applyBtn.click(); + // console.log('✅ 已点击"申请发票"按钮'); + + // // 5. 等待弹窗/状态出现 + // await sleep(300); + + // // 6. 判断状态 + // // 检查是否有"已经申请过"的提示 + // const alreadyApplied = findElement('//*[contains(text(), "您已经提交过发票申请了")]') + + + // if (alreadyApplied) { + // console.log('✅ 已经申请过,无需重复操作'); + // return true; + // } + // const successElement = findElement('//*[text()="确认发票信息无误后再提交"]'); + // if (successElement == null) { + // return false; + // } + // // 检查是否有"确认开具"按钮或提示 + // const confirmBtn = findElement('//*[text()= "确认"]'); + + // if (confirmBtn) { + // console.log('✅ 找到"确认"按钮,准备点击...'); + // await sleep(200); + // confirmBtn.click(); + // console.log('✅ 已点击"确认"按钮'); + // return true; + // } + + // // 如果都没有找到 + // console.warn('⚠️ 未找到"已经申请过"或"确认"按钮,请手动检查'); + // return false; +} + +// ========== 调用 ========== +(async function () { + try { + const result = await changeTbAddress({ + transitAddress: '{中转仓地址}' + }); + console.log('执行结果:', result); + // 批量开票时,C# 端轮询该变量获取执行结果 + window.__invoiceApplyResult = result; + } catch (ex) { + console.error('执行异常:', ex); + window.__invoiceApplyResult = false; + } +})(); \ No newline at end of file diff --git a/29WxOrderWpf/ViewModels/TaobaoLoginViewModel.cs b/29WxOrderWpf/ViewModels/TaobaoLoginViewModel.cs index 4086436..3d38e40 100644 --- a/29WxOrderWpf/ViewModels/TaobaoLoginViewModel.cs +++ b/29WxOrderWpf/ViewModels/TaobaoLoginViewModel.cs @@ -371,6 +371,7 @@ namespace _29WxOrderWpf.ViewModels this.buyer = GlobalConfig.TaobaoBuyerLoginList.FirstOrDefault(b => b.buyer_id == uid); if (this.buyer != null) { + this.buyer.status = "在线"; this.buyer.user_name = username; this.buyer.buyer_nick = nickname; this.buyer.cookie = JsonHelper.SerializeObject(cookieList); diff --git a/AllBase/Model/DBModel/oms_wei_order_item_info.cs b/AllBase/Model/DBModel/oms_wei_order_item_info.cs index f3094e4..d503a41 100644 --- a/AllBase/Model/DBModel/oms_wei_order_item_info.cs +++ b/AllBase/Model/DBModel/oms_wei_order_item_info.cs @@ -998,9 +998,10 @@ namespace AllBase.Model.DBModel } - this.DirectPddBuyerAfterSale = DirectPddBuyerAfterSales?.FirstOrDefault(p => p.statusText == "退款成功") ?? DirectPddBuyerAfterSales?.FirstOrDefault(p => p.statusText != "申请已撤销"); + this.DirectPddBuyerAfterSale = DirectPddBuyerAfterSales?.Where(d => d.orderSn == ItemOrder?.out_order_no)?.FirstOrDefault(p => p.statusText == "退款成功") ?? + DirectPddBuyerAfterSales?.Where(d => d.orderSn == ItemOrder?.out_order_no)?.FirstOrDefault(p => p.statusText != "申请已撤销"); if (DirectPddBuyerAfterSale == null) - DirectPddBuyerAfterSale = DirectPddBuyerAfterSales?.FirstOrDefault(); + DirectPddBuyerAfterSale = DirectPddBuyerAfterSales?.Where(d => d.orderSn == ItemOrder?.out_order_no)?.FirstOrDefault(); //this.DirectPddBuyerAfterSale = DirectPddBuyerAfterSales.FirstOrDefault(p => OrderItemExt?.out_order_id == p.orderSn); // 服务端这个值不会在拍新单后覆盖,在此处使用扩展订单绑定的买手单信息修改掉,后续在拍单的时候覆盖掉 if (ItemOrder.order_id == "3738859887048176128") @@ -1012,7 +1013,7 @@ namespace AllBase.Model.DBModel DirectRefundStatusStr = this.ItemOrder.out_after_sale_status.ParseToString(); if (DirectRefundStatusStr.Contains("退款成功")) - DirectRefundStatusStr += "(¥" + DirectPddBuyerAfterSale.refundAmount * 0.01m + ")"; + DirectRefundStatusStr += "(¥" + DirectPddBuyerAfterSale?.refundAmount * 0.01m + ")"; DirectRefundStatusBackColor = GlobalConfig.LightOrangeBrush; if (DirectRefundStatusStr.ParseToString().Contains("退款成功"))