优化拍单 修复异常拍单和状态不准确订单无法拦截退回问题

This commit is contained in:
wule committed 2026-10-16 10:11:22 +08:00
1 parent e71ef72475
commit 75aae91b66
6 files changed
+130 -25

No files matched your search

@@ -60,19 +60,7 @@ public partial class TaobaoBuyOrderCtrl : UserControl
private void ParentWindow_Closed(object sender, EventArgs e)
{
// 1. 解除 JS 绑定
this.ViewModel?.CefWebBrowser?.JavascriptObjectRepository?.UnRegisterAll();
//this.ViewModel.CefWebBrowser?.CloseDevTools();
// 2. 优雅关闭浏览器
this.ViewModel?.CefWebBrowser?.GetBrowser()?.CloseBrowser(false);
// 3. 清理残留子进程(按路径判断,避免误杀)
//CleanupBrowserSubprocesses();
// 4. 释放控件
this.ViewModel?.CefWebBrowser?.Dispose();
//this.ViewModel.CefWebBrowser = null;
ViewModel.Stop();
}
private void ViewModel_BrowserCreated(ChromiumWebBrowser browser)
@@ -17,6 +17,8 @@ using Newtonsoft.Json.Linq;
using Org.BouncyCastle.Asn1.Ocsp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Security.Policy;
@@ -440,6 +442,20 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
public void Stop()
{
_isWindowLoaded = false;
// 1. 解除 JS 绑定
CefWebBrowser?.JavascriptObjectRepository?.UnRegisterAll();
CefWebBrowser?.CloseDevTools();
// 2. 优雅关闭浏览器
CefWebBrowser?.GetBrowser()?.CloseBrowser(false);
// 3. 清理残留子进程(按路径判断,避免误杀)
TaobaoLoginViewModel.CleanupBrowserSubprocesses();
// 4. 释放控件
CefWebBrowser?.Dispose();
CefWebBrowser = null;
}
/// <summary>
@@ -11,6 +11,8 @@ using NaiBa.Util.Extension;
using Org.BouncyCastle.Asn1.Ocsp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Security.Policy;
using System.Text;
@@ -35,6 +37,8 @@ namespace _29WxOrderWpf.ViewModels
// 拼多多买手退货退款售后地址
// https://mobile.yangkeduo.com/complaint.html?order_sn=260718-101481213440980&after_sales_reason=0&after_sales_type=2&after_sales_code=1002
List<Process> cefSubProcesses = new List<Process>();
public static TaobaoLoginViewModel TaobaoLoginInstance { get; set; } = null;
/// <summary>浏览器创建完成后触发(视图在此把浏览器加入可视树)</summary>
@@ -160,7 +164,6 @@ namespace _29WxOrderWpf.ViewModels
}
Task.Run(() =>
{
AutoLogin();
});
}
@@ -171,6 +174,90 @@ namespace _29WxOrderWpf.ViewModels
public void Stop()
{
_isWindowLoaded = false;
// 1. 解除 JS 绑定
CefWebBrowser?.JavascriptObjectRepository?.UnRegisterAll();
CefWebBrowser?.CloseDevTools();
// 2. 优雅关闭浏览器
CefWebBrowser?.GetBrowser()?.CloseBrowser(false);
// 3. 清理残留子进程(按路径判断,避免误杀)
CleanupBrowserSubprocesses(this.cefSubProcesses);
// 4. 释放控件
CefWebBrowser?.Dispose();
CefWebBrowser = null;
}
public static void CleanupBrowserSubprocesses(List<Process> processes = null)
{
// 有可能释放错误导致程序崩溃,废弃
return;
try
{
if (processes == null)
processes = new List<Process>();
string appBasePath = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\', '/');
Process[] subprocesses = Process.GetProcessesByName("CefSharp.BrowserSubprocess");
foreach (Process process in subprocesses)
{
bool shouldKill = false;
try
{
// 安全地获取进程模块信息,进程可能在我们检查时已退出
if (process != null && !process.HasExited)
{
string moduleFileName = process.MainModule?.FileName;
if (!string.IsNullOrEmpty(moduleFileName))
{
// 判断进程是否从当前应用目录启动
string processDir = System.IO.Path.GetDirectoryName(moduleFileName);
if (!string.IsNullOrEmpty(processDir) &&
(processDir.Equals(appBasePath, StringComparison.OrdinalIgnoreCase)
|| appBasePath.Contains(processDir) // 处理子目录情况
|| moduleFileName.Contains(appBasePath)))
{
if (!processes.Any(p => p.Handle.ParseToInt() == process.Handle.ParseToInt()))
shouldKill = true;
}
}
}
}
catch (InvalidOperationException)
{
// 进程可能在检查过程中已退出,忽略
continue;
}
catch (Win32Exception ex) when (ex.NativeErrorCode == 5) // 访问被拒绝
{
// 可能是权限问题或其他应用的进程,跳过
continue;
}
if (shouldKill)
{
try
{
process.Kill();
process.WaitForExit(500); // 等待最多500毫秒,确保进程终止
}
catch (Exception killEx)
{
// 记录日志,但通常进程已死
//System.Diagnostics.Debug.WriteLine($"终止进程时出错: {killEx.Message}");
}
}
}
}
catch (Exception ex)
{
// 这里最好不要用MessageBox,尤其是在关闭流程中,可能引发线程问题
// 建议记录到日志文件
//System.Diagnostics.Debug.WriteLine($"清理子进程时发生异常: {ex}");
}
}
/// <summary>
@@ -184,6 +271,8 @@ namespace _29WxOrderWpf.ViewModels
{
if (CefWebBrowser == null)
{
this.cefSubProcesses = Process.GetProcessesByName("CefSharp.BrowserSubprocess").ToList();
if (!string.IsNullOrEmpty(InitUrl))
CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(InitUrl, false);
else
@@ -223,7 +312,7 @@ namespace _29WxOrderWpf.ViewModels
while (!CefWebBrowser.IsBrowserInitialized || !CefWebBrowser.GetBrowser().MainFrame.IsValid)
await Task.Delay(20);
await WPFCEFBrowser.DeleteCookieAsync(CefWebBrowser.GetCookieManager(null));
//await WPFCEFBrowser.DeleteCookieAsync(CefWebBrowser.GetCookieManager(null));
//cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager
//await WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), CefWebBrowser.GetCookieManager(null));
@@ -55,8 +55,8 @@ namespace _29WxOrderWpf.Windows.OrderWindows
if (OrderItem != null)
{
this.cmbWareHouse.Text = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransId == OrderItem.ItemTransitOrderWithVoid?.platform)?.TransName;
this.txtExpressName.Text = OrderItem.ItemTransitOrder?.express_2_company;
this.txtWarehouseWaybill.Text = OrderItem.ItemTransitOrder?.express_2_waybill;
this.txtExpressName.Text = OrderItem.ItemTransitOrder?.express_2_company ?? OrderItem.ItemTransitOrderWithVoid?.express_2_company;
this.txtWarehouseWaybill.Text = OrderItem.ItemTransitOrder?.express_2_waybill ?? OrderItem.ItemTransitOrderWithVoid?.express_2_waybill;
if (OrderItem.ItemTransitOrderAfterSale != null)
{
@@ -151,7 +151,7 @@ namespace _29WxOrderWpf.Windows.OrderWindows
JObject data = new JObject();
data["orderNo"] = OrderItem.order_id;
data["orderCode"] = OrderItem.ItemTransitOrder?.order_code;
data["orderCode"] = OrderItem.ItemTransitOrderWithVoid?.order_code;
data["refundProvince"] = txtProvince.Text.Trim();
data["refundCity"] = txtCity.Text.Trim();
data["refundCounty"] = txtCounty.Text.Trim();
@@ -251,12 +251,15 @@ namespace _29WxOrderWpf.Windows.OrderWindows
{
if (OrderItem.ItemTransitOrder?.warehouse_status == 3)
return "\"success\":true,\"message\":\"已到仓,无需拦截工单\"";
if (OrderItem.ItemTransitOrderWithVoid?.warehouse_status == 3)
return "\"success\":true,\"message\":\"已到仓,无需拦截工单\"";
string url = HttpResponseTransitWorkOrderBLL.WorkOrderUrl + "/api/open/v1/customer-work-orders/intercept-return-cloud-warehouse-after-outbound";
JObject obj = new JObject();
obj["appId"] = this.OrderItem.Shop.ShopId;
obj["appId"] = this.OrderItem.Shop?.ShopId;
obj["wechatOrderNo"] = this.OrderItem.order_id;
obj["purchaseOrderNo"] = this.OrderItem.PddBuyerAfterSale?.orderSn;
//obj["purchaseOrderNo"] = this.OrderItem.PddBuyerAfterSale?.orderSn;
obj["purchaseOrderNo"] = OrderItem.ItemTransitOrderWithVoid?.order_code;
obj["creator"] = BaseClass.UserName;
obj["remark"] = "客户要求拦截并退回云仓";
@@ -331,10 +331,16 @@ namespace AllBase.Model.DBModel
this.TransitOrderWaybillFakeStr = ItemTransitOrder.express_1_company + "-" + ItemTransitOrder.express_1_waybill;
// 仓库下游物流
if (ItemTransitOrder == null || ItemTransitOrder.express_2_company.IsNullOrEmpty() || ItemTransitOrder.express_2_waybill.IsNullOrEmpty())
TransitOrderWaybillFromWareHouseStr = null;
//if (ItemTransitOrder == null || ItemTransitOrder.express_2_company.IsNullOrEmpty() || ItemTransitOrder.express_2_waybill.IsNullOrEmpty())
// TransitOrderWaybillFromWareHouseStr = null;
//else
// TransitOrderWaybillFromWareHouseStr = ItemTransitOrder.express_2_company + "-" + ItemTransitOrder.express_2_waybill;
if (ItemTransitOrder != null && !ItemTransitOrder.express_2_company.IsNullOrEmpty() && !ItemTransitOrder.express_2_waybill.IsNullOrEmpty())
TransitOrderWaybillFromWareHouseStr = ItemTransitOrder.express_2_company + "-" + ItemTransitOrder.express_2_waybill;
else if (ItemTransitOrderWithVoid != null && !ItemTransitOrderWithVoid.express_2_company.IsNullOrEmpty() && !ItemTransitOrderWithVoid.express_2_waybill.IsNullOrEmpty())
TransitOrderWaybillFromWareHouseStr = ItemTransitOrderWithVoid.express_2_company + "-" + ItemTransitOrderWithVoid.express_2_waybill;
else
TransitOrderWaybillFromWareHouseStr = ItemTransitOrder.express_2_company + "-" + ItemTransitOrder.express_2_waybill;
TransitOrderWaybillFromWareHouseStr = null;
if (order_id == "3739043283864307968")
{
+5 -2
View File
@@ -650,8 +650,9 @@ namespace TemuKJD.ToolForms
Task.Run(async () =>
{
// 自动下单
while (true && IsAutoBuy)
while (this.Created && IsAutoBuy)
{
Thread.Sleep(100);
if (HasChangeAddress && (this.cefWebBrowser?.GetMainFrame()?.Url).ParseToString().StartsWith("https://mobile.yangkeduo.com/order_checkout.html?sku_id="))
{
try
@@ -935,7 +936,7 @@ namespace TemuKJD.ToolForms
}
})();";
}
for (int i = 0; i < 20; i++)
for (int i = 0; i < 30; i++)
{
Thread.Sleep(100);
if (!this.Created)
@@ -1831,6 +1832,8 @@ namespace TemuKJD.ToolForms
/// </summary>
private void CleanupBrowserSubprocesses()
{
// 有可能释放错误导致程序崩溃,废弃
return;
try
{
string appBasePath = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\', '/');