优化买手单读取

This commit is contained in:
wule committed 2026-10-20 14:13:55 +08:00
1 parent 7380763c1d
commit fd07c9ba40
8 files changed
+4383 -129

No files matched your search

+63
View File
@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
@@ -98,9 +98,9 @@
<Button <Button
x:Name="btnNextBuyer" x:Name="btnNextBuyer"
Grid.Column="8" Grid.Column="8"
Padding="4,0"
Height="24" Height="24"
Margin="4,0,0,0" Margin="4,0,0,0"
Padding="4,0"
Click="btnNextBuyer_Click" Click="btnNextBuyer_Click"
Content="下一个买手" Content="下一个买手"
Style="{StaticResource BasePageButtonStyle}" /> Style="{StaticResource BasePageButtonStyle}" />
@@ -273,7 +273,8 @@
Margin="180,0,0,0" Margin="180,0,0,0"
VerticalAlignment="Center" VerticalAlignment="Center"
Panel.ZIndex="1" Panel.ZIndex="1"
Content="正在操作:" /> d:Content="正在操作:"
Content="{Binding LblMsgStr}" />
<TabControl <TabControl
x:Name="tabOrderType" x:Name="tabOrderType"
@@ -21,7 +21,9 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Net;
using System.Reflection; using System.Reflection;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
@@ -52,22 +54,43 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
/// <summary> /// <summary>
/// PDDBuyerOrderReadCtrl.xaml 的交互逻辑 /// PDDBuyerOrderReadCtrl.xaml 的交互逻辑
/// </summary> /// </summary>
public partial class PDDBuyerOrderReadCtrl : UserControl public partial class PDDBuyerOrderReadCtrl : UserControl, INotifyPropertyChanged
{ {
private static readonly object locker = new object(); private static readonly object locker = new object();
string lblMsgStr = "当前没有任何操作";
public string LblMsgStr
{
get { return lblMsgStr; }
set
{
if (lblMsgStr != value)
{
lblMsgStr = value;
OnPropertyChanged(new PropertyChangedEventArgs("LblMsgStr"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(PropertyChangedEventArgs propertyChangedEventArgs)
{
PropertyChanged?.Invoke(this, propertyChangedEventArgs);
}
Dictionary<BuyerLoginInfo, PddPickInfo> dicPddPickInfo = new Dictionary<BuyerLoginInfo, PddPickInfo>(); Dictionary<BuyerLoginInfo, PddPickInfo> dicPddPickInfo = new Dictionary<BuyerLoginInfo, PddPickInfo>();
ConcurrentList<yh_sync_logistics> lstSyncLogistics = new ConcurrentList<yh_sync_logistics>(); ConcurrentList<yh_sync_logistics> lstSyncLogistics = new ConcurrentList<yh_sync_logistics>();
ChromiumWebBrowser cefWebBrowser = null; ChromiumWebBrowser cefWebBrowser = null;
public string cefAddress = ""; ChromiumWebBrowser cefShowShopOrderLstWebBrowser = null;
public string cefAddress = "";
public static ConcurrentList<PddBuyerOrderLiteInfo> lstPddBuyerOrderInfoLite { get; set; } = new ConcurrentList<PddBuyerOrderLiteInfo>(); public static ConcurrentList<PddBuyerOrderLiteInfo> lstPddBuyerOrderInfoLite { get; set; } = new ConcurrentList<PddBuyerOrderLiteInfo>();
public static ObservableCollection<PddBuyerOrderLiteInfo> lstFilterPddBuyerOrderInfoLite { get; set; } = new ObservableCollection<PddBuyerOrderLiteInfo>(); public static ObservableCollection<PddBuyerOrderLiteInfo> lstFilterPddBuyerOrderInfoLite { get; set; } = new ObservableCollection<PddBuyerOrderLiteInfo>();
public static ConcurrentList<PddBuyerAfterSaleLiteInfo> lstPddBuyerAfterSaleInfoLite { get; set; } = new ConcurrentList<PddBuyerAfterSaleLiteInfo>(); public static ConcurrentList<PddBuyerAfterSaleLiteInfo> lstPddBuyerAfterSaleInfoLite { get; set; } = new ConcurrentList<PddBuyerAfterSaleLiteInfo>();
public static ObservableCollectionThreadSafe<PddBuyerAfterSaleLiteInfo> lstFilterPddBuyerAfterSaleInfoLite { get; set; } = new ObservableCollectionThreadSafe<PddBuyerAfterSaleLiteInfo>(); public static ObservableCollectionThreadSafe<PddBuyerAfterSaleLiteInfo> lstFilterPddBuyerAfterSaleInfoLite { get; set; } = new ObservableCollectionThreadSafe<PddBuyerAfterSaleLiteInfo>();
public static ConcurrentList<string> lstPddBuyerOrderVoidAfterSaleOrderSn { get; set; } = new ConcurrentList<string>(); public static ConcurrentList<string> lstPddBuyerOrderVoidAfterSaleOrderSn { get; set; } = new ConcurrentList<string>();
public CancellationTokenSource cancellationTokenSource { get; set; } = new CancellationTokenSource(); public CancellationTokenSource cancellationTokenSource { get; set; } = new CancellationTokenSource();
//public ChromiumWebBrowser cefWebBrowser = null;
public BuyerReadOrderConfig buyerReadOrderConfig = new BuyerReadOrderConfig(); public BuyerReadOrderConfig buyerReadOrderConfig = new BuyerReadOrderConfig();
public DateTime nextGetOrderTime = DateTime.MinValue; public DateTime nextGetOrderTime = DateTime.MinValue;
public DateTime lastCefReadOrderTime = DateTime.Now; public DateTime lastCefReadOrderTime = DateTime.Now;
@@ -105,7 +128,9 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
public PDDBuyerOrderReadCtrl() public PDDBuyerOrderReadCtrl()
{ {
InitializeComponent(); InitializeComponent();
}
this.lblMsg.DataContext = this;
}
void filterBuyerOrder() void filterBuyerOrder()
{ {
@@ -157,8 +182,9 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
} }
private void UserControl_Loaded(object sender, RoutedEventArgs e) private void UserControl_Loaded(object sender, RoutedEventArgs e)
{ {
this.lbPddBuyer.ItemsSource = GlobalConfig.PDDBuyerLoginList; //this.DataContext = this;
this.lbPddBuyer.ItemsSource = GlobalConfig.PDDBuyerLoginList;
buyerReadOrderConfig = NaiBa.Util.Helper.ConfigHelper.LoadConfig<BuyerReadOrderConfig>("pdd_buyer_read_order_config"); buyerReadOrderConfig = NaiBa.Util.Helper.ConfigHelper.LoadConfig<BuyerReadOrderConfig>("pdd_buyer_read_order_config");
if (buyerReadOrderConfig == null) if (buyerReadOrderConfig == null)
@@ -262,24 +288,46 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
{ {
foreach (var buyer in GlobalConfig.PDDBuyerLoginList) foreach (var buyer in GlobalConfig.PDDBuyerLoginList)
{ {
Thread.Sleep(1); Thread.Sleep(1);
Dispatcher.Invoke(new Action(() => Dispatcher.Invoke(new Action(() =>
{ {
buyer.wpf_browser = WPFCEFBrowser.CreateChromiumWebBrowser("about:blank", false); if (cefWebBrowser == null)
LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler(); {
resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete; cefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser("about:blank", false);
resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad; LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler();
buyer.wpf_browser.RequestHandler = new LocalRequestHandler(resourceRequestHandler); resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete;
var lifeSapnHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow); resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad;
buyer.wpf_browser.LifeSpanHandler = lifeSapnHandler; cefWebBrowser.RequestHandler = new LocalRequestHandler(resourceRequestHandler);
buyer.wpf_browser.KeyboardHandler = new KeyboardHandler(); var lifeSapnHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow);
buyer.wpf_browser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd; cefWebBrowser.LifeSpanHandler = lifeSapnHandler;
buyer.wpf_browser.AddressChanged += CefWebBrowser_AddressChanged; cefWebBrowser.KeyboardHandler = new CefKeyboardHandler();
buyer.wpf_browser.LoadError += CefWebBrowser_LoadError; cefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd;
Grid.SetRow(buyer.wpf_browser, 0); cefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged;
this.GridCef.Children.Add(buyer.wpf_browser); cefWebBrowser.LoadError += CefWebBrowser_LoadError;
})); Grid.SetRow(cefWebBrowser, 0);
} this.GridCef.Children.Add(cefWebBrowser);
}
if (buyer.wpf_browser == null)
buyer.wpf_browser = cefWebBrowser;
if (cefShowShopOrderLstWebBrowser == null)
{
cefShowShopOrderLstWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser("about:blank", false);
LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler();
resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete;
resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad;
cefShowShopOrderLstWebBrowser.RequestHandler = new LocalRequestHandler(resourceRequestHandler);
var lifeSapnHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow);
cefShowShopOrderLstWebBrowser.LifeSpanHandler = lifeSapnHandler;
cefShowShopOrderLstWebBrowser.KeyboardHandler = new CefKeyboardHandler();
cefShowShopOrderLstWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd;
cefShowShopOrderLstWebBrowser.AddressChanged += CefWebBrowser_AddressChanged;
cefShowShopOrderLstWebBrowser.LoadError += CefWebBrowser_LoadError;
Grid.SetRow(cefShowShopOrderLstWebBrowser, 0);
this.GridCef.Children.Add(cefShowShopOrderLstWebBrowser);
}
}));
}
} }
private void CefWebBrowser_LoadError(object sender, LoadErrorEventArgs e) private void CefWebBrowser_LoadError(object sender, LoadErrorEventArgs e)
@@ -317,11 +365,17 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
var noPickupPackageData = BaseRegex.GetJsonObjStrJson(ref data1, "noPickupPackageData").FirstOrDefault(); var noPickupPackageData = BaseRegex.GetJsonObjStrJson(ref data1, "noPickupPackageData").FirstOrDefault();
if (!noPickupPackageData.IsNullOrEmpty() && send1 is ChromiumWebBrowser cef) if (!noPickupPackageData.IsNullOrEmpty() && send1 is ChromiumWebBrowser cef)
{ {
var buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(buy => buy.wpf_browser == cef); var cookies = WPFCEFBrowser.GetCookieList("yangkeduo.com", cef.GetCookieManager(null));
if (buyer != null) var pddUserId = cookies.FirstOrDefault(c => c.Name == "pdd_user_id")?.Value;
if (!string.IsNullOrEmpty(pddUserId))
{ {
dicPddPickInfo[buyer] = JsonHelper.DeserializeJsonToObject<PddPickInfo>(noPickupPackageData); var buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(buy => buy.buyer_id == pddUserId);
SetPickUpNo(dicPddPickInfo[buyer]); if (buyer != null)
{
dicPddPickInfo[buyer] = JsonHelper.DeserializeJsonToObject<PddPickInfo>(noPickupPackageData);
SetPickUpNo(dicPddPickInfo[buyer]);
}
} }
} }
} }
@@ -393,8 +447,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
} }
// 读订单 // 读订单
if (/*(cefAddress.Contains("orders.html")) &&*/ url1.StartsWith("https://mobile.yangkeduo.com/proxy/api/api/aristotle/order_list_v")) if (/*(cefAddress.Contains("orders.html")) &&*/ url1.StartsWith("https://mobile.yangkeduo.com/proxy/api/api/aristotle/order_list_v")) //https://mobile.yangkeduo.com/proxy/api/api/aristotle/order_list_v4?pdduid=6766109923730
//https://mobile.yangkeduo.com/proxy/api/api/aristotle/order_list_v4?pdduid=6766109923730
{ {
await Task.Run(() => await Task.Run(() =>
{ {
@@ -1411,7 +1464,8 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
TimeSpan PauseTick = new TimeSpan(1); TimeSpan PauseTick = new TimeSpan(1);
private void chkAutoReadBuyerOrder_CheckedChanged(object sender, RoutedEventArgs e)
private void chkAutoReadBuyerOrder_CheckedChanged(object sender, RoutedEventArgs e)
{ {
if (isLoad) if (isLoad)
{ {
@@ -1433,13 +1487,361 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
void GetOrderAndAfterSale() void GetOrderAndAfterSale()
{ {
GetPddOrder(); ScrollGetPddOrder();
//MakeWxToPddAfterSales(); //MakeWxToPddAfterSales();
nextGetOrderTime = DateTime.Now.AddMinutes(25); nextGetOrderTime = DateTime.Now.AddMinutes(25);
} }
void GetPddOrder() void JsGetPddOrder()
{
isReadBuyerOrder = true;
lstPddBuyerOrderVoidAfterSaleOrderSn.Clear();
if (cancellationTokenSource != null)
cancellationTokenSource.Cancel();
cancellationTokenSource = new CancellationTokenSource();
Task.Run(() =>
{
var tokenSource = cancellationTokenSource;
while (isInitBuyerOrder || isInitBuyerAfterSale)
{
if (tokenSource.IsCancellationRequested)
{
BindBuyerOrderReadInfo(null, "已取消读取");
break;
}
Thread.Sleep(500);
}
currentReadBuyer = "";
foreach (var buyer in GlobalConfig.PDDBuyerLoginList)
{
Dispatcher.Invoke(new Action(() =>
{
Panel.SetZIndex(buyer.wpf_browser, maxZIndex++);
if (buyer.IsSelect != true)
{
foreach (var b in GlobalConfig.PDDBuyerLoginList)
{
b.IsSelect = false;
}
buyer.IsSelect = true;
}
}));
if (tokenSource.IsCancellationRequested)
break;
PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer });
if (buyer.status != "在线")
continue;
try
{
bool isInitial = false;
while (isInitial == false)
{
Thread.Sleep(100);
Dispatcher.Invoke(new Action(() =>
{
if (buyer.wpf_browser != null && buyer.wpf_browser.IsBrowserInitialized)
{
var frame = buyer.wpf_browser.GetBrowser().MainFrame;
isInitial = buyer.wpf_browser != null && buyer.wpf_browser.IsBrowserInitialized && frame.IsValid;
}
}));
}
WPFCEFBrowser.DeleteCookie(buyer.wpf_browser.GetCookieManager(null));
var cookieLst = JsonHelper.DeserializeJsonToList<CefSharp.Cookie>(buyer?.cookie);
var t = WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), buyer.wpf_browser.GetCookieManager(null));
t.Wait();
buyer.wpf_browser.Load("https://mobile.yangkeduo.com/personal.html");
Thread.Sleep(Randomx.GetId(2000, 3000));
buyer.wpf_browser.Load("https://mobile.yangkeduo.com/psnl_goods_help.html?_t_module_name=assistant_search&refer_scene=no_pickup_package_express&refer_page_name=goods_express");
Thread.Sleep(Randomx.GetId(2000, 3000));
string readBuyer = "";
int top = 0;
int times = 0;
#region 售后
if (1 == 1)
{
readBuyer = buyer.buyer_id;
currentReadBuyer = buyer.buyer_id;
buyer.wpf_browser.Load("https://mobile.yangkeduo.com/complaint_list.html?refer_page_name=personal&refer_page_sn=10001&tab=all");
Dispatcher.Invoke(new Action(() =>
{
Panel.SetZIndex(buyer.wpf_browser, maxZIndex++);
if (buyer.IsSelect != true)
{
foreach (var b in GlobalConfig.PDDBuyerLoginList)
{
b.IsSelect = false;
}
buyer.IsSelect = true;
}
}));
Thread.Sleep(Randomx.GetId(2000, 3000));
Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = buyer.buyer_nick + " 售后读取中"; }));
BindBuyerOrderReadInfo(buyer, "正在读取售后");
top = 0;
times = 0;
lastCefReadOrderTime = DateTime.Now;
while (currentReadBuyer == readBuyer)
{
if (isSkipNext)
break;
if (tokenSource.IsCancellationRequested)
{
BindBuyerOrderReadInfo(buyer, "已取消读取");
break;
}
if (lastCefReadOrderTime < DateTime.Now.AddSeconds(-30))
{
PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer });
if (buyer.status != "在线")
{
BindBuyerOrderReadInfo(buyer, "店铺掉线");
break;
}
BindBuyerOrderReadInfo(buyer, "停滞时间超过30秒,跳过");
break;
}
top += Randomx.GetId(450, 600);
Thread.Sleep(Randomx.GetId(100, 300));
var jsStr = @"window.scroll({
top: document.body.scrollHeight,
left: 0,
behavior: 'smooth' // 可选,使滚动平滑
});";
jsStr = @"window.scroll({
top: " + top + @",
left: 0,
behavior: 'smooth' // 可选,使滚动平滑
});";
//var t1 = cefWebBrowser.GetMainFrame().EvaluateScriptAsync(jsStr);
//t1.Wait(1000);
var client = buyer.wpf_browser.GetDevToolsClient();
if (client != null)
{
var result = client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true);
result.Wait(5000);
}
}
if (tokenSource.IsCancellationRequested)
{
BindBuyerOrderReadInfo(buyer, "已取消读取");
break;
}
Thread.Sleep(Randomx.GetId(2000, 3000));
}
#endregion
// 待发货
readBuyer = buyer.buyer_id;
currentReadBuyer = buyer.buyer_id;
buyer.wpf_browser.Load("https://mobile.yangkeduo.com/orders.html?type=2");
Dispatcher.Invoke(new Action(() =>
{
Panel.SetZIndex(buyer.wpf_browser, maxZIndex++);
if (buyer.IsSelect != true)
{
foreach (var b in GlobalConfig.PDDBuyerLoginList)
{
b.IsSelect = false;
}
buyer.IsSelect = true;
}
}));
Thread.Sleep(Randomx.GetId(2000, 3000));
Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = buyer.buyer_nick + " 待发货读取中"; }));
BindBuyerOrderReadInfo(buyer, "正在读取待发货");
top = 0;
lastCefReadOrderTime = DateTime.Now;
while (currentReadBuyer == readBuyer)
{
if (isSkipNext)
break;
if (tokenSource.IsCancellationRequested)
{
BindBuyerOrderReadInfo(buyer, "已取消读取");
break;
}
if (lastCefReadOrderTime < DateTime.Now.AddSeconds(-30))
{
PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer });
if (buyer.status != "在线")
{
BindBuyerOrderReadInfo(buyer, "店铺掉线");
break;
}
BindBuyerOrderReadInfo(buyer, "停滞时间超过30秒,跳过");
break;
}
if (times % 100 == 0)
{
PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer });
}
if (buyer.status != "在线")
break;
times++;
top += Randomx.GetId(450, 600);
Thread.Sleep(Randomx.GetId(100, 300));
var jsStr = @"window.scroll({
top: document.body.scrollHeight,
left: 0,
behavior: 'smooth' // 可选,使滚动平滑
});";
jsStr = @"window.scroll({
top: " + top + @",
left: 0,
behavior: 'smooth' // 可选,使滚动平滑
});";
//var t1 = cefWebBrowser.GetMainFrame().EvaluateScriptAsync(jsStr);
//t1.Wait(1000);
var client = buyer.wpf_browser.GetDevToolsClient();
if (client != null)
{
var result = client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true);
result.Wait(5000);
}
}
if (isSkipNext)
{
isSkipNext = false;
continue;
}
if (tokenSource.IsCancellationRequested)
{
BindBuyerOrderReadInfo(buyer, "已取消读取");
break;
}
Thread.Sleep(Randomx.GetId(2000, 3000));
Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = buyer.buyer_nick + " 已发货读取中"; }));
BindBuyerOrderReadInfo(buyer, "正在读取已发货");
// 已发货
readBuyer = buyer.buyer_id;
currentReadBuyer = buyer.buyer_id;
buyer.wpf_browser.Load("https://mobile.yangkeduo.com/orders.html?type=3");
Dispatcher.Invoke(new Action(() =>
{
Panel.SetZIndex(buyer.wpf_browser, maxZIndex++);
if (buyer.IsSelect != true)
{
foreach (var b in GlobalConfig.PDDBuyerLoginList)
{
b.IsSelect = false;
}
buyer.IsSelect = true;
}
}));
Thread.Sleep(Randomx.GetId(2000, 3000));
top = 0;
lastCefReadOrderTime = DateTime.Now;
while (currentReadBuyer == readBuyer)
{
if (isSkipNext)
break;
if (tokenSource.IsCancellationRequested)
{
BindBuyerOrderReadInfo(buyer, "已取消读取");
break;
}
if (lastCefReadOrderTime < DateTime.Now.AddSeconds(-30))
{
PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer });
if (buyer.status != "在线")
{
BindBuyerOrderReadInfo(buyer, "店铺掉线");
break;
}
BindBuyerOrderReadInfo(buyer, "停滞时间超过30秒,跳过");
break;
}
top += Randomx.GetId(450, 600);
Thread.Sleep(Randomx.GetId(100, 300));
var jsStr = @"window.scroll({
top: document.body.scrollHeight,
left: 0,
behavior: 'smooth' // 可选,使滚动平滑
});";
jsStr = @"window.scroll({
top: " + top + @",
left: 0,
behavior: 'smooth' // 可选,使滚动平滑
});";
//var t1 = cefWebBrowser.GetMainFrame().EvaluateScriptAsync(jsStr);
//t1.Wait(1000);
var client = buyer.wpf_browser.GetDevToolsClient();
if (client != null)
{
var result = client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true);
result.Wait(5000);
}
}
if (isSkipNext)
{
isSkipNext = false;
continue;
}
if (tokenSource.IsCancellationRequested)
{
BindBuyerOrderReadInfo(buyer, "已取消读取");
break;
}
}
catch (Exception ex)
{
if (isSkipNext)
{
isSkipNext = false;
continue;
}
}
Thread.Sleep(Randomx.GetId(6000, 8000));
}
isReadBuyerOrder = false;
Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = "订单读取已结束,等待下次读取"; }));
BindBuyerOrderReadInfo(null, "订单读取已结束,等待下次读取");
}, cancellationTokenSource.Token);
}
void ScrollGetPddOrder()
{ {
isReadBuyerOrder = true; isReadBuyerOrder = true;
lstPddBuyerOrderVoidAfterSaleOrderSn.Clear(); lstPddBuyerOrderVoidAfterSaleOrderSn.Clear();
@@ -1455,7 +1857,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
{ {
if (tokenSource.IsCancellationRequested) if (tokenSource.IsCancellationRequested)
{ {
BindBuyer(null, "已取消读取"); BindBuyerOrderReadInfo(null, "已取消读取");
break; break;
} }
Thread.Sleep(500); Thread.Sleep(500);
@@ -1485,17 +1887,6 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
if (buyer.status != "在线") if (buyer.status != "在线")
continue; continue;
//var row = dgvBuyer.Rows.Cast<DataGridViewRow>().FirstOrDefault(r => r.Cells["colBuyerNick"].Value.ParseToString() == buyer.buyer_nick);
//if (row == null)
//{
// continue;
//}
//if (row.Cells["colSelect"].Value.ParseToBool() != true)
//{
// Invoke(new Action(() => { row.Cells["colMessage"].Value = "未勾选买手号,跳过"; }));
// continue;
//}
try try
{ {
bool isInitial = false; bool isInitial = false;
@@ -1518,13 +1909,13 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
var t = WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), buyer.wpf_browser.GetCookieManager(null)); var t = WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), buyer.wpf_browser.GetCookieManager(null));
t.Wait(); t.Wait();
buyer.wpf_browser.Load("https://mobile.yangkeduo.com/psnl_goods_help.html?_t_module_name=assistant_search&refer_scene=no_pickup_package_express&refer_page_name=goods_express");
Thread.Sleep(Randomx.GetId(2000, 3000));
buyer.wpf_browser.Load("https://mobile.yangkeduo.com/personal.html"); buyer.wpf_browser.Load("https://mobile.yangkeduo.com/personal.html");
Thread.Sleep(Randomx.GetId(2000, 3000)); Thread.Sleep(Randomx.GetId(2000, 3000));
string readBuyer = ""; buyer.wpf_browser.Load("https://mobile.yangkeduo.com/psnl_goods_help.html?_t_module_name=assistant_search&refer_scene=no_pickup_package_express&refer_page_name=goods_express");
Thread.Sleep(Randomx.GetId(2000, 3000));
string readBuyer = "";
int top = 0; int top = 0;
int times = 0; int times = 0;
@@ -1551,7 +1942,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
Thread.Sleep(Randomx.GetId(2000, 3000)); Thread.Sleep(Randomx.GetId(2000, 3000));
Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = buyer.buyer_nick + " 售后读取中"; })); Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = buyer.buyer_nick + " 售后读取中"; }));
BindBuyer(buyer, "正在读取售后"); BindBuyerOrderReadInfo(buyer, "正在读取售后");
top = 0; top = 0;
times = 0; times = 0;
@@ -1563,7 +1954,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
if (tokenSource.IsCancellationRequested) if (tokenSource.IsCancellationRequested)
{ {
BindBuyer(buyer, "已取消读取"); BindBuyerOrderReadInfo(buyer, "已取消读取");
break; break;
} }
@@ -1572,10 +1963,10 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer }); PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer });
if (buyer.status != "在线") if (buyer.status != "在线")
{ {
BindBuyer(buyer, "店铺掉线"); BindBuyerOrderReadInfo(buyer, "店铺掉线");
break; break;
} }
BindBuyer(buyer, "停滞时间超过30秒,跳过"); BindBuyerOrderReadInfo(buyer, "停滞时间超过30秒,跳过");
break; break;
} }
@@ -1603,7 +1994,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
} }
if (tokenSource.IsCancellationRequested) if (tokenSource.IsCancellationRequested)
{ {
BindBuyer(buyer, "已取消读取"); BindBuyerOrderReadInfo(buyer, "已取消读取");
break; break;
} }
Thread.Sleep(Randomx.GetId(2000, 3000)); Thread.Sleep(Randomx.GetId(2000, 3000));
@@ -1631,7 +2022,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
Thread.Sleep(Randomx.GetId(2000, 3000)); Thread.Sleep(Randomx.GetId(2000, 3000));
Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = buyer.buyer_nick + " 待发货读取中"; })); Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = buyer.buyer_nick + " 待发货读取中"; }));
BindBuyer(buyer, "正在读取待发货"); BindBuyerOrderReadInfo(buyer, "正在读取待发货");
top = 0; top = 0;
lastCefReadOrderTime = DateTime.Now; lastCefReadOrderTime = DateTime.Now;
@@ -1642,7 +2033,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
if (tokenSource.IsCancellationRequested) if (tokenSource.IsCancellationRequested)
{ {
BindBuyer(buyer, "已取消读取"); BindBuyerOrderReadInfo(buyer, "已取消读取");
break; break;
} }
@@ -1651,10 +2042,10 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer }); PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer });
if (buyer.status != "在线") if (buyer.status != "在线")
{ {
BindBuyer(buyer, "店铺掉线"); BindBuyerOrderReadInfo(buyer, "店铺掉线");
break; break;
} }
BindBuyer(buyer, "停滞时间超过30秒,跳过"); BindBuyerOrderReadInfo(buyer, "停滞时间超过30秒,跳过");
break; break;
} }
@@ -1695,13 +2086,13 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
} }
if (tokenSource.IsCancellationRequested) if (tokenSource.IsCancellationRequested)
{ {
BindBuyer(buyer, "已取消读取"); BindBuyerOrderReadInfo(buyer, "已取消读取");
break; break;
} }
Thread.Sleep(Randomx.GetId(2000, 3000)); Thread.Sleep(Randomx.GetId(2000, 3000));
Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = buyer.buyer_nick + " 已发货读取中"; })); Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = buyer.buyer_nick + " 已发货读取中"; }));
BindBuyer(buyer, "正在读取已发货"); BindBuyerOrderReadInfo(buyer, "正在读取已发货");
// 已发货 // 已发货
readBuyer = buyer.buyer_id; readBuyer = buyer.buyer_id;
@@ -1732,7 +2123,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
if (tokenSource.IsCancellationRequested) if (tokenSource.IsCancellationRequested)
{ {
BindBuyer(buyer, "已取消读取"); BindBuyerOrderReadInfo(buyer, "已取消读取");
break; break;
} }
@@ -1741,10 +2132,10 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer }); PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo>() { buyer });
if (buyer.status != "在线") if (buyer.status != "在线")
{ {
BindBuyer(buyer, "店铺掉线"); BindBuyerOrderReadInfo(buyer, "店铺掉线");
break; break;
} }
BindBuyer(buyer, "停滞时间超过30秒,跳过"); BindBuyerOrderReadInfo(buyer, "停滞时间超过30秒,跳过");
break; break;
} }
@@ -1777,14 +2168,9 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
} }
if (tokenSource.IsCancellationRequested) if (tokenSource.IsCancellationRequested)
{ {
BindBuyer(buyer, "已取消读取"); BindBuyerOrderReadInfo(buyer, "已取消读取");
break; break;
} }
//Invoke(new Action(() =>
//{
// if (row.Cells["colMessage"].Value.ParseToString().StartsWith("正在读取"))
// BindBuyer(buyer, " ");
//}));
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -1799,11 +2185,13 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
isReadBuyerOrder = false; isReadBuyerOrder = false;
Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = "订单读取已结束,等待下次读取"; })); Dispatcher.Invoke(new Action(() => { MainWindow.Instance.Title = "订单读取已结束,等待下次读取"; }));
}, cancellationTokenSource.Token); BindBuyerOrderReadInfo(null, "订单读取已结束,等待下次读取");
}, cancellationTokenSource.Token);
} }
private void BindBuyer(BuyerLoginInfo buyer, string msg = "", List<string> selectIds = null) private void BindBuyerOrderReadInfo(BuyerLoginInfo buyer, string msg = "", List<string> selectIds = null)
{ {
this.LblMsgStr = buyer?.buyer_name + " " + msg + " " + DateTime.Now.ToString("yyMMdd HH:mm:ss");
} }
private void btnSendBuyerOrder_Click(object sender, RoutedEventArgs e) private void btnSendBuyerOrder_Click(object sender, RoutedEventArgs e)
@@ -2826,40 +3214,96 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls
Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, -1); Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, -1);
} }
private void CheckBox_Click(object sender, RoutedEventArgs e) private async void CheckBox_Click(object sender, RoutedEventArgs e)
{ {
if (sender is CheckBox chk) //if (sender is CheckBox chk)
{ //{
if (chk.DataContext is BuyerLoginInfo pddBuyer) // if (chk.DataContext is BuyerLoginInfo pddBuyer)
{ // {
foreach (var buyer in GlobalConfig.PDDBuyerLoginList) // foreach (var buyer in GlobalConfig.PDDBuyerLoginList)
{ // {
buyer.IsSelect = false; // buyer.IsSelect = false;
} // }
pddBuyer.IsSelect = true; // pddBuyer.IsSelect = true;
if (pddBuyer.wpf_browser != null) // if (pddBuyer.wpf_browser != null)
Panel.SetZIndex(pddBuyer.wpf_browser, maxZIndex++); // Panel.SetZIndex(pddBuyer.wpf_browser, maxZIndex++);
} // }
} //}
//if (e.Source) //if (e.Source)
} if (sender is CheckBox chk)
{
if (chk.DataContext is BuyerLoginInfo pddBuyer)
{
foreach (var buyer in GlobalConfig.PDDBuyerLoginList)
{
buyer.IsSelect = false;
}
pddBuyer.IsSelect = true;
if (currentReadBuyer == pddBuyer.buyer_id && pddBuyer.wpf_browser != null)
Panel.SetZIndex(pddBuyer.wpf_browser, maxZIndex++);
else if (cefShowShopOrderLstWebBrowser != null)
{
WPFCEFBrowser.DeleteCookie(cefShowShopOrderLstWebBrowser.GetCookieManager());
var cookieLst = JsonHelper.DeserializeJsonToList<CefSharp.Cookie>(pddBuyer?.cookie);
//var t = WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), cefShowShopOrderLstWebBrowser.GetCookieManager(null));
//t.Wait();
foreach (var cook in cookieLst)
{
await WPFCEFBrowser.SetCookieAsync(cook.Domain.Trim('.'), cook.Name + "=" + cook.Value + ";", cefShowShopOrderLstWebBrowser.GetCookieManager(null));
}
private void txtBuyerNick_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) Panel.SetZIndex(this.cefShowShopOrderLstWebBrowser, maxZIndex++);
//cefShowShopOrderLstWebBrowser.Load("https://mobile.yangkeduo.com");
cefShowShopOrderLstWebBrowser.Load("https://mobile.yangkeduo.com/personal.html");
}
}
}
}
private async void txtBuyerNick_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{ {
if (sender is TextBox txt) //if (sender is TextBox txt)
{ //{
if (txt.DataContext is BuyerLoginInfo pddBuyer) // if (txt.DataContext is BuyerLoginInfo pddBuyer)
{ // {
foreach (var buyer in GlobalConfig.PDDBuyerLoginList) // foreach (var buyer in GlobalConfig.PDDBuyerLoginList)
{ // {
buyer.IsSelect = false; // buyer.IsSelect = false;
} // }
pddBuyer.IsSelect = true; // pddBuyer.IsSelect = true;
if (pddBuyer.wpf_browser != null) // if (pddBuyer.wpf_browser != null)
Panel.SetZIndex(pddBuyer.wpf_browser, maxZIndex++); // Panel.SetZIndex(pddBuyer.wpf_browser, maxZIndex++);
} // }
} //}
} if (sender is TextBox txt)
{
if (txt.DataContext is BuyerLoginInfo pddBuyer)
{
foreach (var buyer in GlobalConfig.PDDBuyerLoginList)
{
buyer.IsSelect = false;
}
pddBuyer.IsSelect = true;
if (currentReadBuyer == pddBuyer.buyer_id && pddBuyer.wpf_browser != null)
Panel.SetZIndex(pddBuyer.wpf_browser, maxZIndex++);
else if (cefShowShopOrderLstWebBrowser != null)
{
WPFCEFBrowser.DeleteCookie(cefShowShopOrderLstWebBrowser.GetCookieManager());
var cookieLst = JsonHelper.DeserializeJsonToList<CefSharp.Cookie>(pddBuyer?.cookie);
//var t = WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), cefShowShopOrderLstWebBrowser.GetCookieManager(null));
//t.Wait();
foreach (var cook in cookieLst)
{
await WPFCEFBrowser.SetCookieAsync(cook.Domain.Trim('.'), cook.Name + "=" + cook.Value + ";", cefShowShopOrderLstWebBrowser.GetCookieManager(null));
}
Panel.SetZIndex(this.cefShowShopOrderLstWebBrowser, maxZIndex++);
//cefShowShopOrderLstWebBrowser.Load("https://mobile.yangkeduo.com");
cefShowShopOrderLstWebBrowser.Load("https://mobile.yangkeduo.com/personal.html");
}
}
}
}
private void txtBuyerNick_Loaded(object sender, RoutedEventArgs e) private void txtBuyerNick_Loaded(object sender, RoutedEventArgs e)
{ {
@@ -0,0 +1,735 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.BuyerCtrls.PDDMultiBuyerOrderReadCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="pddMultiBuyerOrderReadCtrl"
d:DesignHeight="450"
d:DesignWidth="1000"
Loaded="UserControl_Loaded"
mc:Ignorable="d">
<Border
Background="White"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1,1,0,1"
CornerRadius="5,0,0,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button
x:Name="btnHideAll"
Grid.Row="1"
Width="25"
Height="60"
Margin="-20,0,0,20"
HorizontalAlignment="left"
Click="btnHideAll_Click"
Style="{StaticResource BasePageButtonStyle}">
<TextBlock Margin="0,0,5,0">
关<LineBreak />
闭</TextBlock>
</Button>
<Grid Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Image
Width="16"
Height="16"
Margin="12,0,4,0"
Cursor="Hand"
MouseLeftButtonUp="btnHideAll_Click"
Source="{StaticResource imgCloseGray}"
Visibility="Collapsed" />
<WrapPanel Grid.Column="1" VerticalAlignment="Center">
<CheckBox
x:Name="chkAutoReadBuyerOrder"
Margin="6,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Checked="chkAutoReadBuyerOrder_CheckedChanged"
Content="自动读多多买手单"
FontSize="12"
IsChecked="true"
Unchecked="chkAutoReadBuyerOrder_CheckedChanged" />
<CheckBox
x:Name="chkHideNoWxIdOrder"
Margin="6,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Checked="chkHideNoWxIdOrder_CheckedChanged"
Content="隐藏无微信订单的买手单"
FontSize="12"
IsChecked="True"
Unchecked="chkHideNoWxIdOrder_CheckedChanged" />
<CheckBox
x:Name="chkAutoAfterSale"
Margin="6,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Checked="chkAutoAfterSale_Checked"
Content="未发货订单自动售后"
FontSize="12"
IsChecked="True"
Unchecked="chkAutoAfterSale_Checked"
Visibility="Visible" />
<Button
x:Name="btnSearch"
Grid.Column="8"
Width="118"
Height="24"
Margin="4,0,0,0"
Click="btnSearch_Click"
Content="刷新订单"
Style="{StaticResource BasePageButtonStyle}" />
<Button
x:Name="btnNextBuyer"
Grid.Column="8"
Height="24"
Margin="4,0,0,0"
Padding="4,0"
Click="btnNextBuyer_Click"
Content="下一个买手"
Style="{StaticResource BasePageButtonStyle}" />
</WrapPanel>
<TextBox
x:Name="txtFilter"
Grid.Column="2"
Height="28"
Margin="28,0,8,0"
VerticalContentAlignment="Center"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
TextChanged="txtFilter_TextChanged" />
<Button
x:Name="btnFilter"
Grid.Column="3"
Width="50"
Height="24"
Margin="4,0,8,0"
Click="btnFilter_Click"
Content="过滤"
Style="{StaticResource BasePageButtonStyle}" />
</Grid>
<Grid
x:Name="GridCef"
Grid.Row="1"
Background="LightGray" />
<Grid
Grid.Row="1"
Margin="2,2,0,334"
HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Border
x:Name="borderPddBuyer"
Width="138"
Background="White"
CornerRadius="0,4,4,0">
<Grid>
<ListBox x:Name="lbPddBuyer">
<!-- 使用自定义属性模板去除ListBox高亮显示框 -->
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<!--<local:ShopListRowCtrl></local:ShopListRowCtrl>-->
<Border
MinHeight="50"
Margin="0,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
BorderBrush="{StaticResource ListRowBorderColorBrush}"
BorderThickness="0,0,0,1"
CornerRadius="0">
<Border.Style>
<!-- 鼠标进入或悬停Border时切换颜色(悬停时Border的填充控件必须有填充Border,所在层级不限,仅填充透明Grid则触发器无效) -->
<Style TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource ListRowHoverBackColorBrush}" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid x:Name="gridListItem">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="colCheck" Width="25*" />
<ColumnDefinition x:Name="colBuyerName" Width="100*" />
</Grid.ColumnDefinitions>
<CheckBox
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
Click="CheckBox_Click"
IsChecked="{Binding IsSelect, Mode=TwoWay}" />
<TextBox
x:Name="txtBuyerNick"
Grid.Column="1"
HorizontalContentAlignment="Left"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
Cursor="Hand"
IsReadOnly="True"
Loaded="txtBuyerNick_Loaded"
Text="{Binding buyer_nick}"
TextWrapping="Wrap" />
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Border>
<Border
Grid.Column="1"
Height="60"
Margin="-2,0,0,0"
VerticalAlignment="Center"
Panel.ZIndex="-1"
Background="{StaticResource pageColorBrush}"
CornerRadius="0,5,5,0"
Cursor="Hand">
<Button
x:Name="btnHideBuyer"
Grid.Column="1"
Width="20"
Height="60"
Margin="0,0,0,0"
Padding="0,0,0,0"
VerticalContentAlignment="Center"
Click="btnHideBuyer_Click"
Content="◀"
Style="{StaticResource BasePageButtonStyle}" />
</Border>
</Grid>
<Grid
Grid.Row="1"
Margin="0"
VerticalAlignment="Bottom"
Background="Transparent"
Visibility="Visible">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Button
x:Name="btnHide"
Width="60"
Height="25"
Margin="0,0,0,-10"
Padding="0,2,0,0"
VerticalContentAlignment="top"
Click="btnHide_Click"
Content="▼"
Style="{StaticResource BasePageButtonStyle}" />
<Grid
x:Name="gridTable"
Grid.Row="1"
Height="330"
Margin="2"
VerticalAlignment="Bottom"
Background="White"
Visibility="Visible">
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label
x:Name="lblMsg"
Margin="180,0,0,0"
VerticalAlignment="Center"
Panel.ZIndex="1"
Content="正在操作:" />
<TabControl
x:Name="tabOrderType"
Grid.Row="1"
Margin="0,-32,0,1"
VerticalAlignment="Stretch">
<TabControl.Resources>
<Style TargetType="{x:Type TabControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabControl}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border
Grid.Row="1"
MinHeight="4"
Background="#f8f8f9"
BorderBrush="#e0e0e0"
BorderThickness="1,1,1,0"
CornerRadius="0,4,0,0">
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" />
</Border>
<Border
Margin="0,0,0,0"
HorizontalAlignment="Left"
Background="#e8e8e9"
BorderBrush="#e1e1e1"
BorderThickness="1,1,1,0"
CornerRadius="4,4,0,0">
<TabPanel
x:Name="HeaderPanel"
Background="Transparent"
IsItemsHost="True" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TabItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Border
Name="Border"
Margin="-1,-2,-1,0"
BorderThickness="1,1,1,0"
CornerRadius="4,4,0,0">
<ContentPresenter
x:Name="ContentSite"
Margin="10,5"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ContentSource="Header" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="Background" Value="#f8f8f9" />
<Setter TargetName="Border" Property="BorderBrush" Value="#e0e0e0" />
<Setter TargetName="Border" Property="Margin" Value="-1,-3,-1,-1" />
<Setter Property="Foreground" Value="{StaticResource pageColorBrush}" />
<Setter Property="Panel.ZIndex" Value="100" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="Border" Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="#999999" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.Resources>
<TabItem Header="买手订单">
<DataGrid
x:Name="dgBuyerOrder"
Grid.Row="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
ColumnHeaderHeight="30"
HorizontalGridLinesBrush="{StaticResource HorizontalGridLinesBrush}"
LoadingRow="dgBuyerOrder_LoadingRow"
RowHeaderWidth="0"
RowHeight="50"
SelectionChanged="dgBuyerOrder_SelectionChanged"
VerticalGridLinesBrush="{StaticResource VerticalGridLinesBrush}">
<DataGrid.Columns>
<DataGridTextColumn
Width="40"
Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}"
CanUserSort="False"
Header="序列"
IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.6*"
Binding="{Binding WxSendTypeStr}"
Header="是否直发">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding order_sn}"
Header="拍单订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding ShopOrderIdStr}"
Header="店铺订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding buyerName}"
Header="买手名称">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding OrderTimeStr}"
Header="拍单时间">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.8*"
Binding="{Binding ProdInfoStr}"
Header="商品信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding AmoutValue}"
Header="金额">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding order_status_prompt}"
Header="订单状态">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding outExpressCompanyCode}"
Header="物流名称">
<!-- outExpressCompanyName -->
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding tracking_number}"
Header="物流单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding sendStatus}"
Header="订单信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn
x:Name="colSendBuyerOrder"
Width="0.6*"
Header="手动发送">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Button
x:Name="btnSendBuyerOrder"
Grid.Row="2"
Grid.Column="1"
Margin="4,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
BorderBrush="Transparent"
Click="btnSendBuyerOrder_Click"
Content="发送"
Foreground="{StaticResource PageLinkBrush}"
Visibility="{Binding TransitWarehouseIdStr, Converter={StaticResource HasTextVisibility}}" />
<Button
x:Name="btnSendDirectBuyerOrder"
Grid.Row="2"
Grid.Column="1"
Margin="4,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
BorderBrush="Transparent"
Click="btnSendBuyerOrder_Click"
Content="发送"
Foreground="{StaticResource PageLinkBrush}"
Visibility="{Binding WxSendTypeStr, Converter={StaticResource HasTextVisibility}}" />
<!-- 直发单直发标注不为空 -->
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</TabItem>
<TabItem Header="买手售后">
<DataGrid
x:Name="dgBuyerAfterSale"
Grid.Row="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
ColumnHeaderHeight="30"
HorizontalGridLinesBrush="{StaticResource HorizontalGridLinesBrush}"
LoadingRow="dgBuyerOrder_LoadingRow"
RowHeaderWidth="0"
RowHeight="50"
VerticalGridLinesBrush="{StaticResource VerticalGridLinesBrush}">
<DataGrid.Columns>
<DataGridTextColumn
Width="40"
Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}"
CanUserSort="False"
Header="序列"
IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.6*"
Binding="{Binding WxSendTypeStr}"
Header="是否直发">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding afterSalesId}"
Header="售后单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding orderSn}"
Header="拍单订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding ShopOrderIdStr}"
Header="店铺订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding buyerName}"
Header="买手名称">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding orderDate}"
Header="拍单日期">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.8*"
Binding="{Binding ProdInfoStr}"
Header="商品信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding OrderAmountValue}"
Header="订单金额">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding RefundAmountValue}"
Header="售后金额">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding AfterSaleStatusStr}"
Header="售后状态">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding sendStatus}"
Header="订单信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<!--<DataGridTemplateColumn Width="0.6*" Header="手动发送" x:Name="colSendBuyerOrderAfterSale" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Grid.Column="1" Grid.Row="2" x:Name="btnSendBuyerOrder" VerticalAlignment="Center" Background="Transparent" HorizontalAlignment="Center"
Foreground="{StaticResource PageLinkBrush}" BorderBrush="Transparent" Margin="4,0,0,0" Content="发送" Click="btnSendBuyerOrder_Click"
Visibility="{Binding TransitWarehouseIdStr, Converter={StaticResource HasTextVisibility}}"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>-->
</DataGrid.Columns>
</DataGrid>
</TabItem>
</TabControl>
</Grid>
</Grid>
</Grid>
</Border>
</UserControl>
File diff suppressed because it is too large. Load diff
@@ -1650,11 +1650,15 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls
if (token.IsCancellationRequested) if (token.IsCancellationRequested)
break; break;
if (!GlobalConfig.lstFilterOrder.ToList().Any(o => o.order_id == order.order_id)) var orders = GlobalConfig.lstFilterOrder.ToList();
if (!orders.Any(o => o.order_id == order.order_id))
{ {
Dispatcher.InvokeAsync(() => Dispatcher.InvokeAsync(() =>
{ {
GlobalConfig.lstFilterOrder.Add(order); lock (MainWindow._orderLock)
{
GlobalConfig.lstFilterOrder.Add(order);
}
}); });
} }
} }
@@ -1676,7 +1680,12 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls
if (order == null) if (order == null)
return; return;
var orderExist = GlobalConfig.lstFilterOrder.ToList().FirstOrDefault(o => o.order_id == order.order_id); oms_wei_order_info orderExist = null;
lock (MainWindow._orderLock)
{
orderExist = GlobalConfig.lstFilterOrder.ToList().FirstOrDefault(o => o.order_id == order.order_id);
}
while (orderExist != null) while (orderExist != null)
{ {
Dispatcher.Invoke(() => Dispatcher.Invoke(() =>
@@ -1688,26 +1697,31 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls
if (!GetOrderIsFilter(order)) if (!GetOrderIsFilter(order))
{ {
oms_wei_order_info nextOrder = null;
if (GlobalConfig.OrderTabHeaderStr.StartsWith("需处理售后单") || GlobalConfig.OrderTabHeaderStr.StartsWith("退货仓自动售后单"))
nextOrder = GlobalConfig.lstFilterOrder.ToList().FirstOrDefault(o => o.RefundDatetime < order.RefundDatetime);
else if (GlobalConfig.OrderTabHeaderStr.StartsWith("异常需重拍"))
nextOrder = GlobalConfig.lstFilterOrder.ToList().FirstOrDefault(o => o.update_time < order.update_time);
else
nextOrder = GlobalConfig.lstFilterOrder.ToList().FirstOrDefault(o => o.create_time < order.create_time);
var index = -1; var index = -1;
oms_wei_order_info nextOrder = null;
lock (MainWindow._orderLock)
{
if (GlobalConfig.OrderTabHeaderStr.StartsWith("需处理售后单") || GlobalConfig.OrderTabHeaderStr.StartsWith("退货仓自动售后单"))
nextOrder = GlobalConfig.lstFilterOrder.ToList().FirstOrDefault(o => o.RefundDatetime < order.RefundDatetime);
else if (GlobalConfig.OrderTabHeaderStr.StartsWith("异常需重拍"))
nextOrder = GlobalConfig.lstFilterOrder.ToList().FirstOrDefault(o => o.update_time < order.update_time);
else
nextOrder = GlobalConfig.lstFilterOrder.ToList().FirstOrDefault(o => o.create_time < order.create_time);
}
if (nextOrder != null) if (nextOrder != null)
index = GlobalConfig.lstFilterOrder.IndexOf(nextOrder); index = GlobalConfig.lstFilterOrder.IndexOf(nextOrder);
Dispatcher.InvokeAsync(() => Dispatcher.InvokeAsync(() =>
{ {
if (nextOrder != null && index >= 0 && GlobalConfig.lstFilterOrder.Count > index) lock (MainWindow._orderLock)
{ {
GlobalConfig.lstFilterOrder.Insert(index, order); if (nextOrder != null && index >= 0 && GlobalConfig.lstFilterOrder.Count > index)
} {
else GlobalConfig.lstFilterOrder.Insert(index, order);
{ }
GlobalConfig.lstFilterOrder.Add(order); else
{
GlobalConfig.lstFilterOrder.Add(order);
}
} }
}); });
Thread.Sleep(1); Thread.Sleep(1);
+7 -1
View File
@@ -58,6 +58,7 @@ namespace _29WxOrderWpf
public partial class MainWindow : BaseWindow, INotifyPropertyChanged public partial class MainWindow : BaseWindow, INotifyPropertyChanged
{ {
public static MainWindow Instance { get; private set; } public static MainWindow Instance { get; private set; }
public static readonly object _orderLock = new object();
private readonly TicketRealtimeMonitor _ticketMonitor = TicketRealtimeMonitor.Current; private readonly TicketRealtimeMonitor _ticketMonitor = TicketRealtimeMonitor.Current;
private readonly WorkOrderUnreadService _workOrderUnreadService = new WorkOrderUnreadService(); private readonly WorkOrderUnreadService _workOrderUnreadService = new WorkOrderUnreadService();
@@ -335,7 +336,12 @@ namespace _29WxOrderWpf
break; break;
} }
foreach (var order in GlobalConfig.lstFilterOrder.Where(o => o.shop_id.ParseToString() == shop.ErpShopId).ToList()) List<oms_wei_order_info> orders;
lock (_orderLock)
{
orders = GlobalConfig.lstFilterOrder.Where(o => o.shop_id.ParseToString() == shop.ErpShopId).ToList();
}
foreach (var order in orders)
{ {
// 更新代发管理情况 // 更新代发管理情况
foreach (var orderItem in order.orderItems) foreach (var orderItem in order.orderItems)
+4 -4
View File
@@ -20,10 +20,10 @@ namespace AllBase.Helper
{ {
public class GlobalConfig public class GlobalConfig
{ {
/// <summary> /// <summary>
/// 颜色等图形元素需要在主线程操作 /// 颜色等图形元素需要在主线程操作
/// </summary> /// </summary>
public static Dispatcher Dispatcher { get; set; } public static Dispatcher Dispatcher { get; set; }
/// <summary> /// <summary>
/// 店铺列表 /// 店铺列表
/// </summary> /// </summary>