1淘宝拍单 2修复直发售后处理逻辑错误问题
This commit is contained in:
1 parent
b1e03ddbb1
commit
da4f20ef3b
8 files changed
+525
-111
No files matched your search
@@ -68,6 +68,7 @@
|
||||
<None Remove="Ctrls\PDDInvoice\Resources\invoice.js" />
|
||||
<Resource Include="29wx.ico" />
|
||||
<Resource Include="29_common_icon.ico" />
|
||||
<Resource Include="Ctrls\OrderCtrls\Resources\tbAutoAddress.js" />
|
||||
<Resource Include="Ctrls\PDDInvoice\Resources\invoice.js" />
|
||||
<Resource Include="gear.ico" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -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<Cookie> 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -673,7 +673,7 @@
|
||||
Title="采购账户:"
|
||||
Cursor="Hand"
|
||||
Foreground="#0099ff"
|
||||
MouseLeftButtonUp="TransitOrderBuye_Click"
|
||||
MouseLeftButtonUp="TransitOrderBuy_Click"
|
||||
Visibility="{Binding ElementName=txtTransitOrderBuyerStr, Path=Text, Converter={StaticResource HasTextVisibility}}">
|
||||
<WrapPanel Orientation="Horizontal">
|
||||
<uc:UcWaterMarkTextBox1
|
||||
|
||||
@@ -55,8 +55,8 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls
|
||||
public OrderListRowItemCtrl()
|
||||
{
|
||||
InitializeComponent();
|
||||
txtTransitOrderBuyerStr.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(TransitOrderBuye_Click), true);
|
||||
txtTransitOrderNumStr.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(TransitOrderBuye_Click), true);
|
||||
txtTransitOrderBuyerStr.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(TransitOrderBuy_Click), true);
|
||||
txtTransitOrderNumStr.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(TransitOrderBuy_Click), true);
|
||||
txtDirectBuyer.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(txtDirectOrderNumStr_MouseLeftButtonUp), true);
|
||||
txtDirectBuyerOrderNo.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(txtDirectOrderNumStr_MouseLeftButtonUp), true);
|
||||
txtRefundId.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(txtRefundId_MouseLeftButtonUp), true);
|
||||
@@ -397,14 +397,17 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls
|
||||
return;
|
||||
|
||||
// 拍单前检测买手号是否在线
|
||||
if (GlobalConfig.CurrentPddBuyer.status == "在线")
|
||||
if (GlobalConfig.CurrentBuyPlatform == "pdd")
|
||||
{
|
||||
PddMobileLoginViewModel.CheckBuyerLogin(GlobalConfig.CurrentPddBuyer);
|
||||
}
|
||||
if (GlobalConfig.CurrentPddBuyer.status != "在线")
|
||||
{
|
||||
BaseMsgWindow.ShowError("买手号掉线");
|
||||
return;
|
||||
if (GlobalConfig.CurrentPddBuyer.status == "在线")
|
||||
{
|
||||
PddMobileLoginViewModel.CheckBuyerLogin(GlobalConfig.CurrentPddBuyer);
|
||||
}
|
||||
if (GlobalConfig.CurrentPddBuyer.status != "在线")
|
||||
{
|
||||
BaseMsgWindow.ShowError("买手号掉线");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
orderRetry:
|
||||
@@ -767,7 +770,7 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls
|
||||
|
||||
return true;
|
||||
}
|
||||
private void TransitOrderBuye_Click(object sender, MouseButtonEventArgs e)
|
||||
private void TransitOrderBuy_Click(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var buyerName = txtTransitOrderBuyerStr.Text;
|
||||
var outOrderId = txtTransitOrderNumStr.Text;
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
// 填写信息
|
||||
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);
|
||||
}
|
||||
|
||||
// 异步 sleep
|
||||
function sleep(ms) {
|
||||
return new Promise(resolve => 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;
|
||||
}
|
||||
})();
|
||||
@@ -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);
|
||||
|
||||
@@ -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("退款成功"))
|
||||
|
||||
Reference in new issue
Block a user