Files
29WxOrder/Work/_29Tools/Forms/PddMobileBuyOrderForm.cs
T

1929 lines
76 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using AllBase;
using AllBase.Helper;
using AllBase.Model;
using AllBase.Model.Config;
using AllBase.Model.DBModel;
using AllBase.Model.Result;
using CefSharp;
using CefSharp.DevTools;
using CefSharp.DevTools.IO;
using CefSharp.DevTools.Profiler;
using CefSharp.DevTools.Runtime;
using CefSharp.Web;
using CefSharp.WinForms;
using DevComponents.WinForms.Drawing;
//using TemuKJD.DashBoardForms;
using Microsoft.Win32;
using NaiBa.CefHelper;
using NaiBa.CefHelper.Handler;
using NaiBa.Util.Enum;
using NaiBa.Util.Extension;
using NaiBa.Util.Model;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Runtime.InteropServices.ComTypes;
using System.Security.Policy;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
//using System.Web.Hosting;
using System.Windows.Forms;
using Work;
using Work._29Tools.BLL;
using Work._29Tools.CefTools;
using Work._29Tools.Forms.ToolForms;
using Work.BaseForms;
using Work.Pinduoduo;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
namespace TemuKJD.ToolForms
{
public partial class PddMobileBuyOrderForm : BaseGeneralForm
{
public oms_wei_external_procurement_log_info AbnormalTransitWarehouseOrderInfo { get; set; } = null;
public pddFrontGoods3Lite pddFrontGoodsLite = new pddFrontGoods3Lite();
public bool IsClose { get; set; } = false;
public bool IsAutoBuy { get; set; } = false;
public bool IsBuySuccess { get; set; } = false;
public bool IsFormLoad { get; set; } = false;
public bool ShowBuyMask { get; set; } = false;
public string BuyErrMsg { get; set; } = "";
/// <summary>
/// 直发direct 中转transit
/// </summary>
public string BuyType { get; set; } = "transit";
public int CloseAfterSecond { get; set; }
public string InitUrl = "";
public string BuyMapUrl = "";
private static readonly object lockObj = new();
private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
private string shopCookieHead = "yangkeduo.com";
private string shopMainUrl = "https://mobile.yangkeduo.com/index.html";
private ChromiumWebBrowser cefWebBrowser = null;
private string currentUrl = "";
private bool IsSoldOut = false;
// 当前买手
private BuyerLoginInfo buyer = null;
// 订单商品
private oms_wei_order_item_info orderItem = null;
// 关联商品
private WXBuyMapInfo buyMap = null;
// 订单仓库
private TransitWarehouseParam transitWarehouse = null;
// (拍单后)回调函数,过滤订单
private Action<oms_wei_order_info, bool> filterOrderAction = null;
// (拍单后)回调函数,更新拍单余额
private Action updateBalanceAction = null;
/// <summary>
/// 拍单中转地址
/// </summary>
string txtBuyTransitWarehouseStr = "";
bool IsChangeAddress = false;
bool HasChangeAddress = false;
public PddMobileBuyOrderForm(Action<oms_wei_order_info, bool> filterOrder, Action updateBalance, oms_wei_order_item_info orderItemInfo, BuyerLoginInfo buyerInfo, WXBuyMapInfo buy_map = null)
{
InitializeComponent();
this.buyer = buyerInfo;
this.orderItem = orderItemInfo;
this.buyMap = buy_map;
filterOrderAction = filterOrder;
updateBalanceAction = updateBalance;
}
private void PddBuyOrderForm_Load(object sender, EventArgs e)
{
lblErrMsg.Text = string.Empty;
if (this.BuyType == "direct" && pnlMap.Visible == false)
{
this.pnlDirectAddressAnalysis.Visible = true;
this.lblBuyAddress.Text = "拍单地址";
}
//splitContainer1.Dock = DockStyle.Fill;
this.Height = SystemInformation.WorkingArea.Height - 80;
this.CenterToScreen();
chkAutoChangeWarehouseAddress.Checked = GlobalConfig.BuyConfig.IsAutoChangeWarehouseAddress;
chkUseAppBalance.Checked = GlobalConfig.BuyConfig.IsUseAppBalance;
// 强制使用软件余额而非erp余额拍单
chkUseAppBalance.Checked = true;
GlobalConfig.BuyConfig.IsUseAppBalance = true;
if (IsAutoBuy)
CloseAfterSecond = 60;
if (CloseAfterSecond > 0)
{
Task.Run(() =>
{
Thread.Sleep(1000 * CloseAfterSecond);
if (this.Created && IsAutoBuy)
{
Invoke(new Action(() =>
{
this.IsClose = true;
this.Close();
}));
}
});
}
if (this.ShowBuyMask == true)
{
Task.Run(() =>
{
for (int i = 3; i > 0; i--)
{
if (this.Created)
Invoke(new Action(() =>
{
this.pnlMask.Dock = DockStyle.Fill;
this.pnlMask.Visible = true;
this.pnlMask.Text = "自动拍单倒计时\r\n" + i;
}));
else
break;
Thread.Sleep(1000);
}
if (this.Created)
Invoke(new Action(() =>
{
//this.pnlMask.Visible = false;
this.pnlMask.Text = "请等待地址修改";
this.pnlMask.Dock = DockStyle.Bottom;
this.pnlMask.Height = 120;
}));
});
}
if (buyMap != null)
{
this.txtMapGoodsName.Text = buyMap.map_goods_name;
this.txtMapSkuName.Text = buyMap.map_spec_name;
this.txtMapGoodsId.Text = buyMap.map_goods_id;
this.txtMapSkuId.Text = buyMap.map_sku_id;
txtSendProvince.Text = buyMap.map_send_address;
this.transitWarehouse = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransId == buyMap.transit_warehouse_id);
// 异常单重新拍单
if (AbnormalTransitWarehouseOrderInfo != null)
{
transitWarehouse = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransId == AbnormalTransitWarehouseOrderInfo.platform);
}
if (transitWarehouse != null && this.BuyType == "transit")
{
cmbTransitWarehouse.Text = transitWarehouse?.TransName + " " + transitWarehouse?.TransFullAddress;
txtBuyTransitWarehouse.Text = transitWarehouse?.TransFullAddress;
}
else
{
txtBuyTransitWarehouse.Text = orderItem.ItemOrder.AddressStr;
}
}
else if (orderItem.PddBuyMapSkus != null && orderItem.PddBuyMapSkus.Count > 0 && AbnormalTransitWarehouseOrderInfo == null) // 不能是异常重拍
{
//panel2.Visible = true;
cmbMapSkusProd.Items.Clear();
cmbMapSkusProd.Items.Add("");
foreach (var mapSku in orderItem.PddBuyMapSkus)
{
cmbMapSkusProd.Items.Add(mapSku.map_goods_name + mapSku.map_goods_id);
}
}
this.pictureBox1.Image = ImageBuild.LoadBitmapLoadBitmipImageFromUrl(orderItem.thumb_img);
this.txtShopSkuId.Text = orderItem.sku_id;
this.txtShopGoodsId.Text = orderItem.product_id;
this.txtSpuCode.Text = orderItem.out_product_id.IsNullOrEmpty() ? orderItem.product_id : orderItem.out_product_id;
this.txtSkuCode.Text = orderItem.out_sku_id.IsNullOrEmpty() ? orderItem.SkuAttrStr : orderItem.out_sku_id;
this.txtShopGoodsName.Text = orderItem.title;
this.txtShopSpecName.Text = orderItem.SkuAttrStr;
this.txtShopOrderItemCnt.Text = orderItem.sku_cnt.ParseToString();
this.txtShopOrderItemPrice.Text = (orderItem.real_price * 0.01m + orderItem.ItemOrder?.postage_price * 0.01m / orderItem.ItemOrder?.orderItems?.Count).ParseToString();
this.txtOrderId.Text = orderItem.order_id;
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ErpShopId == orderItem.shop_id.ParseToString());
this.txtShopName.Text = shop?.ShopAccount;
foreach (var warehouse in TransitWarehouseData.TransitWarehouseList)
{
this.cmbTransitWarehouse.Items.Add(warehouse.TransName + " " + warehouse.TransFullAddress);
}
Task.Run(() =>
{
Invoke(new Action(() =>
{
LoadCef();
}));
});
this.AotoBuyLoop();
IsFormLoad = true;
}
/// <summary>
/// 自动登录店铺后台
/// </summary>
private void LoadCef()
{
if (cefWebBrowser == null)
{
//cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser("about:blank", false);
if (!string.IsNullOrEmpty(InitUrl))
cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser(InitUrl, true, true);
else
cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser(shopMainUrl, false);
LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler();
resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete;
resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad;
cefWebBrowser.RequestHandler = new CustomRequestHandler(resourceRequestHandler);
var lifeSapnHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow);
cefWebBrowser.LifeSpanHandler = lifeSapnHandler;
cefWebBrowser.KeyboardHandler = new KeyboardHandler();
cefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd;
cefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged;
cefWebBrowser.LoadError += CefWebBrowser_LoadError;
cefWebBrowser.Dock = DockStyle.Fill;
cefWebBrowser.SendToBack();
//js绑定C#对象
//PDDShopBrowserObject shopObj = new PDDShopBrowserObject();
//shopObj.OnInfoReceived += ShopObj_OnInfoReceived;
//CefSharpSettings.WcfEnabled = true;
//cefWebBrowser.JavascriptObjectRepository.Register(
// name: "shopObj",
// objectToBind: shopObj,
// isAsync: false,
// options: new BindingOptions { Binder = BindingOptions.DefaultBinder.Binder /*CamelCaseJavascriptNames = false*/ /*cef79*/ }
//);
//if (buyer.cookie == null)
// buyer.cookie = "";
List<Cookie> cookieLst = new List<Cookie>();
try
{
if (buyer != null)
{
cookieLst = JsonHelper.DeserializeJsonToList<CefSharp.Cookie>(buyer?.cookie);
if (cookieLst == null)
cookieLst = new List<Cookie>();
}
}
catch
{
}
Task.Run(() =>
{
Invoke(new Action(() =>
{
splitContainer1.Panel1.Controls.Add(cefWebBrowser);
//cefWebBrowser.Load(shopMainUrl);
}));
// cef138必须init后方可设置或删除cookie
while (!cefWebBrowser.IsBrowserInitialized || !cefWebBrowser.GetBrowser().MainFrame.IsValid)
Thread.Sleep(20);
CEFBrowser.DeleteCookie(cefWebBrowser.GetCookieManager(null), "mobile.yangkeduo.com");
CEFBrowser.DeleteCookie(cefWebBrowser.GetCookieManager(null), "yangkeduo.com");
//if (cookieLst.Any(c => c.Value.StartsWith("windows_1")))
// cefWebBrowser.ExecuteScriptAsync("navigator.__defineGetter__('userAgent', function() { return 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.5.40.8 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12'; });");
//cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager
//if (this.openType != EnumOpenType.login)
{
var t = CEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), cefWebBrowser.GetCookieManager(null));
if (InitUrl.Contains("&after_sales_reason=88"))
{
t.Wait(5000);
}
}
if (!string.IsNullOrEmpty(InitUrl))
cefWebBrowser.Load(InitUrl);
else
cefWebBrowser.Load(shopMainUrl);
});
}
}
private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e)
{
}
private async void CefWebBrowser_AddressChanged(object sender, CefSharp.AddressChangedEventArgs e)
{
if (!this.IsClose && this.Created && !this.Disposing && !this.IsDisposed)
{
currentUrl = e.Address;
Invoke(() => { txtAddress.Text = e.Address; });
}
}
private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
{
//js绑定C#对象 html页面内声明绑定的C#对象
StringBuilder sb = new StringBuilder();
sb.Append("(function(){");
sb.Append("CefSharp.BindObjectAsync('shopObj');");
sb.Append("})();");
cefWebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(sb.ToString());
}
//public Func<object, string, string, request, bool> BeforeResourceLoadEvent; // sender, requestUrl, postData, request, true(表示取消执行)
private bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request)
{
if (url.StartsWith("https://mobile.yangkeduo.com/proxy/api/api/origenes/address_info"))
{
if (chkAutoChangeWarehouseAddress.Checked && transitWarehouse != null && BuyType == "transit")
{
//var address = BaseRegex.GetStringJson(ref postData, "address");
JObject jObj = JsonHelper.JObjectParse(postData);
jObj["province_id"] = transitWarehouse.province_id;
jObj["city_id"] = transitWarehouse.city_id;
jObj["district_id"] = transitWarehouse.district_id;
jObj["address"] = transitWarehouse.TransFullAddress + Randomx.GetId(1, 35) + Randomx.GetId(1, 9).ToString().PadLeft(2, '0') + "室" + txtSourceCode.Text;
jObj["mobile"] = TransitWaybillHelper.MobileHead[Randomx.GetId(TransitWaybillHelper.MobileHead.Count)] + Randomx.GetNumber(8);
jObj["name"] = TransitWaybillHelper.LastName[Randomx.GetId(TransitWaybillHelper.LastName.Count)] + (Randomx.GetId(2) == 1 ? "先生" : "女士");
postData = JsonHelper.SerializeObject(jObj);
request.PostData.Elements[0].Bytes = System.Text.Encoding.UTF8.GetBytes(postData);
Invoke(() => { this.pnlMask.Visible = false; });
}
else if (BuyType == "direct" && orderItem?.ItemOrder?.AddressStr.Contains("******") == false)
{
try
{
var dvProvince = GlobalConfig.PddDivisions.FirstOrDefault(d => d.name == orderItem.ItemOrder.province_name);
var dvCity = dvProvince.children.FirstOrDefault(d => d.name == orderItem.ItemOrder.city_name);
var dvCounty = dvCity.children.FirstOrDefault(d => d.name == orderItem.ItemOrder.county_name);
JObject jObj = JsonHelper.JObjectParse(postData);
jObj["province_id"] = dvProvince.pdd_region_id;
jObj["city_id"] = dvCity.pdd_region_id;
jObj["district_id"] = dvCounty.pdd_region_id;
jObj["address"] = orderItem.ItemOrder.detail_info;
jObj["mobile"] = orderItem.ItemOrder.tel_number;
jObj["name"] = orderItem.ItemOrder.user_name;
postData = JsonHelper.SerializeObject(jObj);
request.PostData.Elements[0].Bytes = System.Text.Encoding.UTF8.GetBytes(postData);
Invoke(() => { this.pnlMask.Visible = false; });
}
catch
{
}
}
HasChangeAddress = true;
}
return false;
}
//static int GetAntiContentsTimes = 40;
// 处理网页加载信息
private async void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request)
{
try
{
await DoResourceLoadComplete(url, postData, responseData);
}
catch (Exception ex)
{
if (!this.IsClose && this.Created)
{
Invoke(new Action(() =>
{
if (!IsAutoBuy)
BaseMsgForm.ShowError(ex.Message);
else
lblErrMsg.Text = ex.Message;
}));
if (IsAutoBuy)
{
await (Task.Run(() =>
{
Thread.Sleep(6000);
if (!this.IsClose && this.Created)
{
Invoke(new Action(() =>
{
this.IsClose = true;
this.Close();
}));
}
}));
}
}
}
}
public async Task DoResourceLoadComplete(string url, string postData, string responseData)
{
if (url.StartsWith("https://mobile.yangkeduo.com/order_checkout.html") && responseData.Contains("该商品已下架"))
{
IsSoldOut = true;
}
// 个人页面
if (url.Contains("https://mobile.yangkeduo.com/personal.html"))
{
}
// 商品页面 获取发货地信息,如果页面没有去客服页面询问
if (url.StartsWith("https://mobile.yangkeduo.com/goods.html?goods_id="))
{
var sendProvince = "";
var data = responseData;
var sendProvinceIndex = data.IndexOf("{\"key\":\"发货地\",\"values\":[");
if (sendProvinceIndex > 0)
{
sendProvince = data.Substring(sendProvinceIndex + "{\"key\":\"发货地\",\"values\":[".Length);
sendProvince = sendProvince.Substring(0, sendProvince.IndexOf("]"));
sendProvince = sendProvince.Trim('\"');
Invoke(new Action(() => { this.txtSendProvince.Text = sendProvince; }));
}
if (!string.IsNullOrEmpty(sendProvince) && this.transitWarehouse == null)
{
await MatchTransitWarehouse(sendProvince);
}
MatchProdAllSkus(data);
}
// 订单详情页面 获取关联信息和拍单信息(已拍过单但是因某种原因未成功绑定仓库)
if (url.StartsWith("https://mobile.yangkeduo.com/order.html?order_sn="))
{
var data = responseData;
var goodsId = BaseRegex.GetLongJson(ref data, "goodsId");
var skuId = BaseRegex.GetLongJson(ref data, "skuId");
var goodsName = BaseRegex.GetStringJson(ref data, "goodsName");
var spec = BaseRegex.GetStringJson(ref data, "spec");
var oneGoodsPrice = BaseRegex.GetIntJson(ref data, "goodsPrice");
var buyCnt = BaseRegex.GetIntJson(ref data, "goodsNumber");
var buyPrice = BaseRegex.GetIntJson(ref data, "payAmount");
if (buyPrice.IsNullOrZero())
buyPrice = BaseRegex.GetIntJson(ref data, "orderAmount");
var orderSn = BaseRegex.GetIntJson(ref data, "orderSn");
Invoke(new Action(() =>
{
// 自动填写关联信息界面
this.txtMapGoodsId.Text = goodsId.ParseToString();
this.txtMapSkuId.Text = skuId.ParseToString();
this.txtMapGoodsName.Text = goodsName;
this.txtMapSkuName.Text = spec;
this.txtSendProvince.Text = "";
this.cmbTransitWarehouse.Text = "";
// 自动填写拍单信息界面
if (!goodsId.IsNullOrZero()) this.txtBuyGoodsId.Text = goodsId.ParseToString();
if (!skuId.IsNullOrZero()) this.txtBuySkuId.Text = skuId.ParseToString();
if (!goodsName.IsNullOrEmpty()) this.txtBuyGoodsName.Text = goodsName;
if (!spec.IsNullOrEmpty()) this.txtBuySkuName.Text = spec;
if (!buyCnt.IsNullOrZero()) this.txtBuyCnt.Text = buyCnt.ParseToString();
if (!buyPrice.IsNullOrZero()) this.txtBuyPrice.Text = (buyPrice * 0.01m).ParseToString();
}));
}
// 待提交订单确认界面,填写拍单信息 两个接口都有可能有值,通过返回值内信息和url是否含有sku_id综合判断
//https://mobile.yangkeduo.com/proxy/api/api/morgan/confirm/render?pdduid=8161628055192
//https://mobile.yangkeduo.com/order_checkout.html?sku_id=1917755178967&group_id=168599782729&goods_id=966934985983&goods_number=1&page_from=0&detail_id=27322663212&_oak_rcto=YWJun7Qe7qhenWIlxgKO3uhsoi0WMIkr6Sb3iSrTsNPiwo_AHzvFVWwZ36KSfBTSAX-QF_CD92G9rA&order_extra_type=1&refer_page_element=open_btn&source_channel=0&refer_page_name=goods_detail&refer_page_id=10014_1782220402115_blxn1wofgo&refer_page_sn=10014
//https://mobile.yangkeduo.com/order_checkout.html?sku_id=1914416497946&group_id=168211384489&goods_id=964481496910&goods_number=2&page_from=23&detail_id=27475863056&_oc_refer_ad=0&_oak_rcto=YWJQMioxuzYiHEIW34yn103Toi0WMIkr6SaYUDjBkmkvOAtI8c-ZcKMw36KSfBTSAX-QF_CD92G9rA&order_extra_type=1&refer_page_element=open_btn&source_channel=0&_x_query=%E4%B8%AD%E5%9B%BD%E5%8F%A4%E4%BB%A3%E7%AE%97%E6%9C%AF%E6%B3%95%E8%80%81%E7%89%88%E6%9C%AC%E6%B4%AA%E4%B8%95%E8%B0%9F%E8%91%97%E5%91%BD%E7%90%86%E5%AD%A6%E7%A0%94%E7%A9%B6%E5%85%A5%E9%97%A8%E9%A3%8E%E6%B0%B4%E5%AD%A6%E4%B9%A6%E7%B1%8D%E5%85%A5%E9%97%A8%E5%B1%85%E5%AE%B6&refer_page_name=goods_detail&refer_page_id=10014_1782275100226_pojdmxgpty&refer_page_sn=10014
if (responseData.Contains("\"goods_id\""))
{
if (url.StartsWith("https://mobile.yangkeduo.com/proxy/api/api/morgan/confirm/render?pdduid=") || url.Contains("sku_id="))
{
var data = responseData;
if (data.Contains("\"goods_id\""))
{
var goodsId = BaseRegex.GetLongJson(ref data, "goods_id");
var skuId = BaseRegex.GetLongJson(ref data, "sku_id");
var goodsName = BaseRegex.GetStringJson(ref data, "goods_name");
if (string.IsNullOrEmpty(goodsName))
goodsName = BaseRegex.GetStringJson(ref data, "goodsName");
var specifications = BaseRegex.GetMatchRegexString(ref data, @"""specifications"":\[([^']*?)\]");
var spec = string.IsNullOrEmpty(specifications) ? "" : specifications;
if (spec.IsNullOrEmpty())
{
var specMatch = BaseRegex.GetMatchRegex(ref data, @"""spec_value"":""([^']+?)""");
foreach (var match in specMatch)
{
var matchStr = match.ParseToString();
spec += ("," + BaseRegex.GetStringJson(ref matchStr, "spec_value"));
}
spec = spec.Trim(',');
}
var oneGoodsPrice = BaseRegex.GetIntJson(ref data, "goodsPrice");
var buyCnt = BaseRegex.GetIntJson(ref data, "goods_number");
var buyPrice = BaseRegex.GetIntJson(ref data, "pay_price");
if (IsAutoBuy && GlobalConfig.AutoBuyConfig.IsLimitMinProfit)
{
var salePrice = orderItem.real_price * 0.01m + orderItem.ItemOrder?.postage_price * 0.01m / orderItem.ItemOrder?.orderItems?.Count;
var profit = salePrice - buyPrice * 0.01m;
var limitProfit = GlobalConfig.AutoBuyConfig.MinProfit * 0.01m;
if (profit < limitProfit)
{
throw new Exception("拍单利润 " + profit + " 小于设定的数值 " + limitProfit + ",跳过当前订单");
}
}
if (!this.Created)
return;
Invoke(new Action(() =>
{
if (!goodsId.IsNullOrZero()) this.txtBuyGoodsId.Text = goodsId.ParseToString();
if (!skuId.IsNullOrZero()) this.txtBuySkuId.Text = skuId.ParseToString();
if (!goodsName.IsNullOrEmpty()) this.txtBuyGoodsName.Text = goodsName;
if (!spec.IsNullOrEmpty()) this.txtBuySkuName.Text = spec;
if (!buyCnt.IsNullOrZero()) this.txtBuyCnt.Text = buyCnt.ParseToString();
if (!buyPrice.IsNullOrZero()) this.txtBuyPrice.Text = (buyPrice * 0.01m).ParseToString();
}));
if (!this.Created)
return;
if (BuyType == "direct" && txtBuyTransitWarehouseStr.Contains("******"))
{
throw new Exception("请先解析地址或者输入合法地址信息再拍单!");
}
// 自动修改收货地址为中转仓(或直发)
var transit = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransFullAddress == txtBuyTransitWarehouseStr);
if (transit == null && BuyType == "transit")
{
throw new Exception("仓库已发生改变,请点击重新关联商品,选择仓库后重新拍单!");
}
if (IsSoldOut)
{
throw new Exception("商品已售罄,请重新关联未售罄商品后再拍单!");
}
if ((transit != null || BuyType == "direct") && IsChangeAddress == false && HasChangeAddress == false)
{
IsChangeAddress = true;
Thread.Sleep(100);
if (BuyType == "transit")
{
if (AbnormalTransitWarehouseOrderInfo != null)
{
Invoke(new Action(() => { txtSourceCode.Text = AbnormalTransitWarehouseOrderInfo.random_code; }));
}
else
{
var sourceCodeRst = GetSourceCode(transit);
if (sourceCodeRst.Contains("失败"))
{
Invoke(new Action(() =>
{
this.cefWebBrowser.Visible = false;
BaseMsgForm.ShowError(sourceCodeRst);
}));
return;
}
}
}
var rst = await ChangeAddress(transit);
IsChangeAddress = false;
}
}
}
}
// 订单提交接口
//https://mobile.yangkeduo.com/proxy/api/order/prepay?pdduid=8161628055192
//https://mobile.yangkeduo.com/proxy/api/api/van-spike/prepay?pdduid=8161628055192
if (url.StartsWith("https://mobile.yangkeduo.com/proxy/api/order/prepay?pdduid=") ||
url.StartsWith("https://mobile.yangkeduo.com/proxy/api/api/van-spike/prepay?pdduid="))
{
var data = postData;
Invoke(new Action(() =>
{
txtBuyOrderId.Text = BaseRegex.GetStringJsonByRegs(ref data, "", "order_sn", "orderSn");
}));
}
if (url.Contains("alipay.com") && responseData.Contains("支付成功"))
{
var uri = url;
var pData = postData;
var rData = responseData;
Invoke(new Action(() =>
{
btnManualUpdateBuyOrder_Click(null, null);
}));
}
}
/// <summary>
/// 自动拍单循环
/// </summary>
public void AotoBuyLoop()
{
Task.Run(async () =>
{
// 自动下单
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
{
await AutoBuy();
}
catch (Exception ex)
{
this.BuyErrMsg = ex.Message;
}
if (!this.IsClose && this.Created && IsAutoBuy)
{
Invoke(() =>
{
this.IsClose = true;
this.Close();
});
}
}
}
});
}
public async Task AutoBuy()
{
if (IsSoldOut)
throw new Exception("商品已售罄");
await CheckSourceCode();
await SetAliPaySecret();
}
public async Task SetAliPaySecret()
{
// 选择支付宝去支付
if (!IsAutoBuy) return;
var ts1 = await EvaluateJsBuyTagNameAndInnerHtml("span", "支付宝", true);
if (ts1.Result?.Value.ParseToString() != "success")
{
throw new Exception("支付方式获取失败1");
}
Thread.Sleep(Randomx.GetId(500, 1000));
if (!IsAutoBuy) return;
var ts2 = await EvaluateJsBuyTagNameAndInnerHtml("span", "立即支付", true);
for (int i = 0; i < 20; i++)
{
if (ts2.Result?.Value is string rstStr && rstStr == "success")
break;
Thread.Sleep(500);
ts2 = await EvaluateJsBuyTagNameAndInnerHtml("span", "确认付款", true);
}
if (ts2.Result?.Value.ParseToString() != "success")
{
throw new Exception("支付方式获取失败2");
}
// 点击确认付款
Thread.Sleep(Randomx.GetId(500, 1000));
if (!IsAutoBuy) return;
ts2 = await EvaluateJsBuyTagNameAndInnerHtml("span", "确认付款", true);
for (int i = 0; i < 25; i++)
{
if (ts2.Result?.Value is string rstStr && rstStr == "success")
break;
Thread.Sleep(500);
ts2 = await EvaluateJsBuyTagNameAndInnerHtml("span", "确认付款", true);
}
// 输入支付密码
Thread.Sleep(Randomx.GetId(500, 1000));
if (!IsAutoBuy) return;
ts2 = await EvaluateJsBuyTagNameAndInnerHtml("div", "输入支付密码");
for (int i = 0; i < 20; i++)
{
if (ts2.Result?.Value is string rstStr && rstStr == "success")
break;
Thread.Sleep(500);
ts2 = await EvaluateJsBuyTagNameAndInnerHtml("div", "输入支付密码");
}
Thread.Sleep(Randomx.GetId(500, 1000));
foreach (var c in DataOpenSSL.DecryptString(GlobalConfig.AutoBuyConfig.AlipayPassword))
{
CEFBrowser.SimulateInputChar(host, c);
}
// 点下一步付款
Thread.Sleep(Randomx.GetId(500, 1000));
if (!IsAutoBuy) return;
ts2 = await EvaluateJsBuyTagNameAndInnerHtml("button", "下一步", true);
for (int i = 0; i < 20; i++)
{
if (ts2.Result?.Value is string rstStr && rstStr == "success")
break;
Thread.Sleep(500);
if (!IsAutoBuy) return;
ts2 = await EvaluateJsBuyTagNameAndInnerHtml("button", "下一步", true);
}
// 最后未执行成功也关闭窗口。
Thread.Sleep(Randomx.GetId(12500, 15000));
}
public async Task CheckSourceCode()
{
var sourceCode = txtSourceCode.Text.Trim();
var ts1 = await EvaluateJsBuyTagNameAndInnerHtml("div", sourceCode);
if (ts1.Result?.Value.ParseToString() != "success")
{
throw new Exception("溯源码不匹配");
}
}
IBrowserHost host = null;
DevToolsClient client = null;
public async Task<EvaluateResponse> EvaluateJsBuyTagNameAndInnerHtml(string tagName, string innerHTML, bool isClick = false)
{
if (!this.Created)
throw new Exception("窗口已关闭");
for (int i = 0; i < 25; i++)
{
Thread.Sleep(200);
if (host == null || client == null)
{
host = cefWebBrowser.GetBrowser().GetHost();
client = cefWebBrowser.GetDevToolsClient();
}
else
break;
}
if (host == null || client == null)
{
throw new Exception("页面加载异常");
}
var jsStr1 = @"(function() { var elements = document.getElementsByTagName('" + tagName + @"');
for (i = elements.length - 1; i >= 0; i--){
var element = elements[i];
if (element.innerHTML.indexOf('" + innerHTML + @"') >= 0) {";
if (isClick)
jsStr1 += @"element.click();";
jsStr1 += @"
return 'success';
}
}
return '';
})();";
var rst = await client.Runtime.EvaluateAsync(jsStr1, null, true, null, null, true, null, true);
if (tagName == "button")
{
}
return rst;
}
/// <summary>
/// 获取溯源码
/// </summary>
/// <returns></returns>
public string GetSourceCode(TransitWarehouseParam transit)
{
JObject body = new JObject();
body["province"] = transit.province_name;
body["city"] = transit.city_name;
body["warehouseCode"] = transit.TransId;
body["matchType"] = 1;
var url = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/getRandomTraceCode";
var dataStr = JsonHelper.SerializeObject(body);
var sourceCodeRst = HttpResponseWXBLL.e57PostResponse(url, dataStr, "");
var randomCode = BaseRegex.GetStringXml(ref sourceCodeRst, "randomCode");
if (!string.IsNullOrEmpty(randomCode))
{
Invoke(new Action(() => { txtSourceCode.Text = randomCode; }));
return randomCode;
}
else
{
return "获取失败,请关闭拍单窗口重试 " + BaseRegex.GetStringXml(ref sourceCodeRst, "msg", sourceCodeRst);
}
}
/// <summary>
/// 自动填写地址
/// </summary>
/// <param name="transit"></param>
/// <returns></returns>
public async Task<string> ChangeAddress(TransitWarehouseParam transit)
{
for (int i = 0; i < 50; i++)
{
Thread.Sleep(200);
if (host == null || client == null)
{
host = cefWebBrowser.GetBrowser().GetHost();
client = cefWebBrowser.GetDevToolsClient();
}
else
break;
}
if (host == null || client == null)
{
throw new Exception("页面加载异常");
}
// 点击地址框第一个
var jsStr1 = @"(function() {
var element = document.getElementsByClassName('oc-address-info')[0];
element.click();
return 'success';
})();";
for (int i = 0; i < 50; i++)
{
Thread.Sleep(200);
if (!this.Created) return "窗口已关闭";
var ts1 = await client.Runtime.EvaluateAsync(jsStr1, null, true, null, null, true, null, true);
if (ts1.Result.Value is string rstStr)
{
if (rstStr == "success")
{
ts1 = await EvaluateJsBuyTagNameAndInnerHtml("span", "修改");
if (ts1.Result.Value is string rst && rst == "success")
{
break;
}
}
}
}
Thread.Sleep(Randomx.GetId(300, 500));
for (int i = 0; i < 50; i++)
{
Thread.Sleep(200);
if (!this.Created) return "窗口已关闭";
var ts1 = await EvaluateJsBuyTagNameAndInnerHtml("span", "修改", true);
if (ts1.Result.Value is string rstStr && rstStr == "success")
{
break;
}
}
Thread.Sleep(Randomx.GetId(300, 500));
for (int i = 0; i < 50; i++)
{
Thread.Sleep(200);
if (!this.Created) return "窗口已关闭";
var ts1 = await EvaluateJsBuyTagNameAndInnerHtml("span", "保存", true);
if (ts1.Result.Value is string rstStr)
{
if (rstStr == "success")
break;
}
}
Thread.Sleep(Randomx.GetId(300, 500));
jsStr1 = @"(function() { var elements = document.getElementsByTagName('div');
for (i = elements.length - 1; i >= 0; i--){
var element = elements[i];
if (element.innerHTML.indexOf('" + txtBuyTransitWarehouseStr + @"') >= 0 && element.innerHTML.indexOf('" + txtSourceCode.Text.Trim() + @"') >= 0) {
element.click();
return 'success';
}
}
})();";
if (BuyType == "direct")
{
jsStr1 = @"(function() { var elements = document.getElementsByTagName('div');
for (i = elements.length - 1; i >= 0; i--){
var element = elements[i];
if (element.innerHTML.indexOf('" + orderItem?.ItemOrder?.detail_info + @"') >= 0) {
element.click();
return 'success';
}
}
})();";
}
for (int i = 0; i < 30; i++)
{
Thread.Sleep(100);
if (!this.Created)
return "窗口已关闭";
var ts1 = await client.Runtime.EvaluateAsync(jsStr1, null, true, null, null, true, null, true);
if (ts1.Result.Value is string rstStr)
{
if (rstStr == "success")
break;
}
}
Thread.Sleep(Randomx.GetId(300, 500));
return "";
}
private async void btnManualUpdateSendProvince_Click(object sender, EventArgs e)
{
var sendProvince = txtSendProvince.Text.Trim();
try
{
await MatchTransitWarehouse(sendProvince);
}
catch (Exception ex)
{
BaseMsgForm.ShowError("匹配仓库失败,请手动选择");
}
}
async Task MatchTransitWarehouse(string sendProvince)
{
bool isAutoGetWarehouse = false;
foreach (var item in this.cmbTransitWarehouse.Items)
{
TransitWarehouseParam warehouseParam = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransName + " " + t.TransFullAddress == item.ParseToString());
if (warehouseParam == null)
{
continue;
}
if (warehouseParam.TransFullAddress.Contains(sendProvince))
{
Invoke(new Action(() =>
{
cmbTransitWarehouse.Text = warehouseParam.TransName + " " + warehouseParam.TransFullAddress;
}));
transitWarehouse = warehouseParam;
isAutoGetWarehouse = true;
break;
}
}
if (!isAutoGetWarehouse)
{
//黄导家庭父母5天训练营-《父母5天成为孩子成长的引路人》+《不内卷养育》2本书
Invoke(() =>
{
cmbTransitWarehouse.Text = "";
});
throw new Exception("匹配仓库失败,请手动选择");
}
}
void MatchProdAllSkus(string data)
{
var skusStrLst = BaseRegex.GetJsonArrStrJson(ref data, "skus");
skusStrLst = skusStrLst.OrderByDescending(s => s.Length).ToList();
pddFrontGoodsLite.skus = JsonHelper.DeserializeJsonToList<frontSkuInfo3>(skusStrLst?.FirstOrDefault());
pddFrontGoodsLite.goodsName = BaseRegex.GetStringJson(ref data, "goodsName");
pddFrontGoodsLite.goodsId = BaseRegex.GetLongJson(ref data, "goodsId");
pddFrontGoodsLite.mallName = BaseRegex.GetStringJson(ref data, "mallName");
pddFrontGoodsLite.mallId = BaseRegex.GetLongJson(ref data, "mallId");
if (pddFrontGoodsLite.mallId == 0)
pddFrontGoodsLite.mallId = -1;
}
private void ShopLoginForm_FormClosed(object sender, FormClosedEventArgs e)
{
//OnSaveComplete(shop);
Task.Run(() => {
Thread.Sleep(500);
if (!this.Disposing && !this.IsDisposed)
{
//MainForm.instance.Invoke(new Action(() => { this.Dispose(); }));
// 1. 解除 JS 绑定
cefWebBrowser?.JavascriptObjectRepository?.UnRegisterAll();
cefWebBrowser?.CloseDevTools();
// 2. 优雅关闭浏览器
cefWebBrowser?.GetBrowser()?.CloseBrowser(false);
// 3. 清理残留子进程(按路径判断,避免误杀)
//CleanupBrowserSubprocesses();
// 4. 释放控件
cefWebBrowser?.Dispose();
cefWebBrowser = null;
}
});
}
private void txtAddress_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (cefWebBrowser != null)
{
cefWebBrowser.Load(txtAddress.Text);
}
}
}
private async void btnManualUpdateTransitWarehouse_Click(object sender, EventArgs e)
{
try
{
await ManualUpdateTransitWarehouse();
}
catch (Exception ex)
{
}
}
public async Task ManualUpdateTransitWarehouse()
{
var sendProvince = txtSendProvince.Text.Trim();
if (transitWarehouse == null && !cmbTransitWarehouse.Text.Trim().IsNullOrEmpty())
{
transitWarehouse = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransName + " " + t.TransFullAddress == cmbTransitWarehouse.Text.Trim().ParseToString());
}
if (transitWarehouse == null)
{
BaseMsgForm.ShowError("仓库不能为空");
return;
}
if ((this.pddFrontGoodsLite?.goodsId).IsNullOrZero() || (this.pddFrontGoodsLite?.mallId).IsNullOrZero())
{
StringBuilder sb = new StringBuilder();
sb.Append("(function(){\r\n");
sb.Append("var orderGoodsBlock = document.getElementById('orderGoodsBlock')\r\n");
sb.Append("if (orderGoodsBlock) {\r\n");
sb.Append(" orderGoodsBlock.getElementsByTagName('div')[0].click();\r\n");
sb.Append(" return 'success';\r\n");
sb.Append("}\r\n");
sb.Append("else\r\n");
sb.Append(" return 'failed';\r\n");
sb.Append("})();\r\n");
//var jsStr = "document.getElementById('orderGoodsBlock').getElementsByTagName('div')[0].click();";
var jsStr = sb.ToString();
var host = cefWebBrowser.GetBrowser().GetHost();
var client = cefWebBrowser.GetDevToolsClient();
var rst = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true);
for (int i = 0; i < 80; i++)
{
if (rst.Result.Value.ParseToString() == "failed")
break;
if (!(this.pddFrontGoodsLite?.mallId).IsNullOrZero())
break;
await Task.Delay(100);
}
}
this.Enabled = false;
if (this.cefWebBrowser != null &&
!this.cefWebBrowser.Address.StartsWith("https://mobile.yangkeduo.com/order.html?order_sn=") && (this.pddFrontGoodsLite?.goodsId).ParseToString() == txtMapGoodsId.Text.Trim())
{
}
string url;
string upSpuCode = txtSpuCode.Text.Trim();
string upSkuCode = txtSkuCode.Text.Trim();
// 保存sku及商品关联信息
var data = UserLogin.GetSignaturex()
+ "&spu_code=" + GetHtml.UrlEncodeUtf8(upSpuCode)
+ "&sku_code=" + GetHtml.UrlEncodeUtf8(upSkuCode)
+ "&main_user_name=" + BaseClass.MainUserName
+ "&map_goods_name=" + txtMapGoodsName.Text.Trim()
+ "&map_spec_name=" + txtMapSkuName.Text.Trim()
+ "&map_goods_id=" + txtMapGoodsId.Text.Trim()
+ "&map_sku_id=" + txtMapSkuId.Text.Trim()
+ "&map_send_address=" + sendProvince
+ "&transit_warehouse_id=" + transitWarehouse?.TransId;
if (!(this.pddFrontGoodsLite?.mallId).IsNullOrZero() && this.pddFrontGoodsLite.goodsId.ParseToString() == txtMapGoodsId.Text.Trim())
{
// 保存商品关联信息
data += "&map_skus=" + GetHtml.UrlEncodeUtf8(JsonHelper.SerializeObject(pddFrontGoodsLite));
url = BaseClass.Build29WxObjString("order/wx_add_mdy_buy_prod_map_skus");
var skusRst = await GetHtml.PostUtf8Async(url, data);
if (!skusRst.Contains("\"code\":200"))
skusRst = await GetHtml.PostUtf8Async(url, data);
// 存完立即读取
//wx_get_buy_pord_map_skus
var dataTest = UserLogin.GetSignaturex() + "&spu_codes=" + GetHtml.UrlEncodeUtf8(upSpuCode);
dataTest += "&main_user_name=" + BaseClass.MainUserName;
url = BaseClass.Build29WxObjString("order/wx_get_buy_pord_map_skus");
var resultSkusMap = await GetHtml.PostUtf8Async(url, dataTest);
if (string.IsNullOrEmpty(resultSkusMap) || !resultSkusMap.Contains("\"code\":200"))
{
resultSkusMap = await GetHtml.PostUtf8Async(url, dataTest);
}
if (string.IsNullOrEmpty(resultSkusMap) || !resultSkusMap.Contains("\"code\":200"))
{
}
else
{
List<WXBuyMapSkusInfo> buyMapSkuList = new List<WXBuyMapSkusInfo>();
try
{
buyMapSkuList = JsonHelper.DeserializeJsonToList<WXBuyMapSkusInfo>(JObject.Parse(resultSkusMap)["data"].ParseToString());
GlobalConfig.BuyMapSkusList.RemoveAll(b => buyMapSkuList.Any(map => b.spu_code == map.spu_code));
GlobalConfig.BuyMapSkusList.AddRange(buyMapSkuList);
foreach (var order in GlobalConfig.lstOrder)
{
if (order.IsWaitBuy)
{
foreach (var item in order.orderItems)
{
if (item.out_product_id == upSpuCode || item.product_id == upSpuCode)
{
item.PddBuyMapSkus = buyMapSkuList.Where(s => s.platform == "pdd").ToList();
item.TbBuyMapSkus = buyMapSkuList.Where(s => s.platform == "tb").ToList();
//if (filterOrderAction != null)
//{
// item.SetOrderItemTextProperty();
// filterOrderAction(order, false);
//}
}
}
}
}
}
catch
{
}
}
}
//time=1792314251&code=22107EDBDC132F485500B33B4C58CFDB&code_version=1&version=329&user_name=13367632144&path=29wx&spu_code=10001462916616&sku_code=%e7%bb%bf%e8%89%b2%e6%8c%8e%e5%8c%85%e5%b0%8f%e9%bb%91%e7%8c%ab%e6%8c%82%e4%bb%b6&main_user_name=13367632144&map_goods_name=超萌小黑猫挂件手工编织毛绒公仔多色礼物送朋友&map_spec_name=【大眼猫】挎包绿&map_goods_id=984310168545&map_sku_id=1941546612897&map_send_address=&transit_warehouse_id=XDYSHANDC
url = BaseClass.Build29WxObjString("order/wx_add_mdy_buy_prod_map");
var result = await GetHtml.PostUtf8Async(url, data);
if (!result.Contains("\"code\":200"))
result = await GetHtml.PostUtf8Async(url, data);
if (!result.Contains("\"code\":200"))
{
this.Enabled = true;
BaseMsgForm.ShowError("保存失败" + BaseRegex.GetStringJson(ref result, "msg") + ",请稍后重试");
}
else
{
var urlMap = BaseClass.Build29WxObjString("order/wx_get_buy_prod_map");
var dataMap = UserLogin.GetSignaturex()
+ "&spu_codes=" + upSpuCode;
//dataMap += "&sku_codes=" + upSkuCode;
dataMap += "&main_user_name=" + BaseClass.MainUserName;
var resultMap = await GetHtml.PostUtf8Async(urlMap, dataMap);
if (string.IsNullOrEmpty(resultMap) || !resultMap.Contains("\"code\":200"))
resultMap = await GetHtml.PostUtf8Async(urlMap, dataMap);
if (string.IsNullOrEmpty(resultMap) || !resultMap.Contains("\"code\":200"))
{
}
else
{
List<WXBuyMapInfo> buyMapList = new List<WXBuyMapInfo>();
try
{
buyMapList = JsonHelper.DeserializeJsonToList<WXBuyMapInfo>(JObject.Parse(resultMap)["data"].ParseToString());
GlobalConfig.BuyMapList.RemoveAll(b => buyMapList.Any(map => b.spu_code == map.spu_code && b.sku_code == map.sku_code));
GlobalConfig.BuyMapList.AddRange(buyMapList);
}
catch
{
}
var pddBuyMap = buyMapList.FirstOrDefault(b => b.spu_code == upSpuCode && b.sku_code == upSkuCode && b.platform == "pdd");
if (pddBuyMap != null)
{
foreach (var order in GlobalConfig.lstOrder)
{
if (order.IsWaitBuy)
{
foreach (var item in order.orderItems)
{
if ((item.out_product_id == pddBuyMap.spu_code && item.out_sku_id == pddBuyMap.sku_code) ||
(item.out_product_id == pddBuyMap.spu_code && item.SkuAttrStr == pddBuyMap.sku_code) ||
(item.product_id == pddBuyMap.spu_code && item.out_sku_id == pddBuyMap.sku_code) ||
(item.product_id == pddBuyMap.spu_code && item.SkuAttrStr == pddBuyMap.sku_code))
{
item.PddBuyMap = pddBuyMap;
if (filterOrderAction != null)
{
item.SetOrderItemTextProperty();
filterOrderAction(order, false);
}
}
}
}
}
}
}
BaseMsgForm.ShowInfo("保存成功!");
this.IsClose = true;
this.Close();
}
}
private async void btnManualUpdateBuyOrder_Click(object sender, EventArgs e)
{
if (BuyType == "transit" && txtSourceCode.Text.Trim().Length != 6)
{
if (!IsAutoBuy)
BaseMsgForm.ShowError("溯源码长度错误!");
else
Invoke(() => { lblErrMsg.Text = "溯源码长度错误!"; });
return;
}
var client = cefWebBrowser.GetDevToolsClient();
if (client == null)
{
if (!IsAutoBuy)
BaseMsgForm.ShowError("页面未加载!");
else
Invoke(() => { lblErrMsg.Text = "页面未加载!"; });
return;
}
//var sourceCode = txtSourceCode.Text.Trim();
//var jsStr1 = @"(function() { var elements = document.getElementsByTagName('div');
// for (i = elements.length - 1; i >= 0; i--){
// var element = elements[i];
// if (element.innerHTML.indexOf('" + sourceCode + @"') >= 0) {
// return 'success';
// }
// }
// return '';
// })();";
//var ts1 = client.Runtime.EvaluateAsync(jsStr1, null, true, null, null, true, null, true);
//await ts1;
// 付款页面没法匹配,暂时注释
//if (ts1.Result?.Result?.Value.ParseToString() != "success")
//{
// if (!IsAutoBuy)
// BaseMsgForm.ShowError("溯源码不匹配!");
// else
// Invoke(() => { lblErrMsg.Text = "页面未加载!"; });
// return;
//}
if (BuyType == "transit" && string.IsNullOrEmpty(txtBuyTransitWarehouseStr))
{
if (!IsAutoBuy)
BaseMsgForm.ShowError("缺少中转地址,请重新绑定商品并选择仓库地址");
else
Invoke(() => { lblErrMsg.Text = "缺少中转地址,请重新绑定商品并选择仓库地址"; });
return;
}
var transit = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransFullAddress == txtBuyTransitWarehouseStr);
if (BuyType == "transit" && transit == null)
{
if (!IsAutoBuy)
BaseMsgForm.ShowError("中转地址对应的中转仓不存在,请核对");
else
Invoke(() => { lblErrMsg.Text = "中转地址对应的中转仓不存在,请核对"; });
return;
}
if (string.IsNullOrEmpty(txtBuyOrderId.Text.Trim()))
{
if (!IsAutoBuy)
BaseMsgForm.ShowError("缺少拍单订单号,请拍单后再提交");
else
Invoke(() => { lblErrMsg.Text = "缺少拍单订单号,请拍单后再提交"; });
return;
}
if ((txtBuyPrice.Text.ParseToDecimal() * 100).ParseToInt().IsNullOrZero())
{
if (!IsAutoBuy)
BaseMsgForm.ShowError("缺少拍单金额,请拍单后再提交");
else
Invoke(() => { lblErrMsg.Text = "缺少拍单金额,请拍单后再提交"; });
return;
}
btnManualUpdateBuyOrder.Enabled = false;
if (BuyType == "transit")
{
#region 正常中转拍单
if (AbnormalTransitWarehouseOrderInfo == null)
{
JObject body = new JObject();
body["orderNo"] = orderItem.order_id; // 微信订单号
body["orderSkuId"] = orderItem.sku_id; // 微信商品skuId
body["outOrderNo"] = txtBuyOrderId.Text.Trim(); // 拍单订单号
body["outAmount"] = (txtBuyPrice.Text.ParseToDecimal() * 100).ParseToInt() + ""; // 外采金额
body["buyerAccount"] = buyer.buyer_nick; // 买手昵称
body["purchaserNote"] = BaseClass.NickName; // 购买软件账户备注
body["express1Company"] = ""; // 物流公司编号
body["express1Waybill"] = ""; // 物流编号
body["platform"] = transit.TransId; // 中转仓ID
body["orderPlatformCode"] = "WEISHOP";
body["randomCode"] = txtSourceCode.Text.Trim();
if (GlobalConfig.BuyConfig.IsUseAppBalance)
{
body["userName"] = BaseClass.UserName; // 软件端用户名
body["purchaserNote"] = BaseClass.UserName + "-" + BaseClass.NickName; // 购买软件账户备注
string basePostageKey = WarehousePostageInfo.DicWarehousePostage.Keys.FirstOrDefault(pk => (orderItem.ItemOrder?.province_name).ParseToString().Contains(pk));
decimal basePostage = basePostageKey.IsNullOrEmpty() ? WarehousePostageInfo.DicWarehousePostage.Values.Min() : WarehousePostageInfo.DicWarehousePostage[basePostageKey];
body["oemAmount"] = (BaseClass.PostagePerOrderDiff * 100).ParseToInt().ParseToString();
body["postage"] = ((basePostage + BaseClass.PostagePerOrderDiff) * 100).ParseToInt().ParseToString();
}
var url = "https://po.e57.cn/prod-api/api/oms-api/externalProcurement/saveOrUpdate";
var dataStr = JsonHelper.SerializeObject(body);
//dataStr = "{\"orderNo\":\"3737339733954942720\",\"outOrderNo\":\"2606846854564\",\"buyerAccount\":\"测试\",\"outAmount\":\"2000\",\"purchaserNote\":\"测试\",\"express1Company\":\"\"" +
// ",\"express1Waybill\":\"\",\"platform\":\"XDYSHC\",\"orderPlatformCode\":\"WEISHOP\"}";
var exportRst = HttpResponseWXBLL.e57PostResponse(url, dataStr, "");
//<AjaxResult><msg>保存成功</msg><code>200</code></AjaxResult>
//<AjaxResult><msg>订单不存在:373733973395494272</msg><code>500</code></AjaxResult>
if (!exportRst.ParseToString().Contains("<code>200</code>"))
{
string msg = "";
string code = "";
try
{
System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
xmlDoc.LoadXml(exportRst);
code = xmlDoc["AjaxResult"]["code"].InnerText;
msg = xmlDoc["AjaxResult"]["msg"].InnerText;
}
catch
{
msg = exportRst.ParseToString();
}
if (!IsAutoBuy)
BaseMsgForm.ShowError("拍单保存失败,服务端返回 " + msg, "拍单信息保存失败");
else
Invoke(() => { lblErrMsg.Text = "拍单保存失败,服务端返回 " + msg; });
btnManualUpdateBuyOrder.Enabled = true;
return;
}
if (updateBalanceAction != null)
updateBalanceAction();
orderItem.ItemTransitOrders.Insert(0, new oms_wei_external_procurement_log_info()
{
buyer_account = buyer.buyer_nick,
id = 0,
order_no = orderItem.order_id,
order_sku_id = orderItem.sku_id,
out_amount = (txtBuyPrice.Text.ParseToDecimal() * 100).ParseToInt(),
out_order_no = txtBuyOrderId.Text.Trim(),
purchaser_note = body["purchaserNote"].ParseToString(),
created_time = DateTime.Now,
});
orderItem.SetOrderItemTextProperty();
// 利润计算重置为最小值,控件Resource更新时将计算利润
orderItem.ProfitCount = decimal.MinValue;
var order = orderItem?.ItemOrder;
orderItem.SetOrderItemTextProperty();
order.SetOrderTextProperty();
if (filterOrderAction != null && order != null)
{
filterOrderAction(order, true);
}
//// 前一天的订单直接提前取号
//if (DateTime.Now.Date > BaseClass.StampToDateTime(order.create_time).Date)
//{
// JObject data = new JObject();
// data["outOrderNo"] = txtBuyOrderId.Text.Trim();
// //data2["outOrderNo"] = orderItem.ItemTransitOrder.order_code;
// data["warehouseCode"] = transit.TransId; // 中转仓仓库对应编码 XDYSZC XDYYWC ...
// //data["warehouseCode"] = txtBuyOrderId.Text.Trim(); // 中转仓仓库对应编码
// data["platform"] = "WEISHOP";
// var getVirtualTicketUrl = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/order/virtual/create";
// var getVirtualTicketDataStr = JsonHelper.SerializeObject(data);
// var getVirtualTicketRst = HttpResponseWXBLL.e57PostResponse(getVirtualTicketUrl, getVirtualTicketDataStr, "");
// if (!getVirtualTicketRst.ParseToString().Contains("<code>200</code>") && !getVirtualTicketRst.ParseToString().Contains("<code>0</code>"))
// {
// string msg = "";
// string code = "";
// try
// {
// System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
// xmlDoc.LoadXml(getVirtualTicketRst);
// code = xmlDoc["AjaxResult"]["code"].InnerText;
// msg = xmlDoc["AjaxResult"]["msg"].InnerText;
// }
// catch
// {
// msg = getVirtualTicketRst.ParseToString();
// }
// if (!IsAutoBuy)
// BaseMsgForm.ShowError("拍单信息保存成功,接收到服务端传递的错误消息:" + msg, "订单提前取号失败");
// else
// Invoke(() => { lblErrMsg.Text = "拍单信息保存成功,接收到服务端传递的错误消息:" + msg; });
// btnManualUpdateBuyOrder.Enabled = true;
// return;
// }
//}
}
#endregion
#region 秒退异常单中转重拍
if (AbnormalTransitWarehouseOrderInfo != null)
{
var url = BaseClass.Build29WxObjString("order/wx_update_abnormal_transit_order");
var data = UserLogin.GetSignaturex();
data += "&out_order_no=" + txtBuyOrderId.Text.Trim();
data += "&order_no=" + orderItem.order_id;
data += "&order_sku_id=" + orderItem.sku_id;
data += "&buyer_account=" + buyer.buyer_nick;
data += "&out_amount=" + (txtBuyPrice.Text.ParseToDecimal() * 100).ParseToInt() + "";
data += "&purchaser_note=" + BaseClass.UserName + "-" + BaseClass.NickName; // 购买软件账户备注
data += "&refund_status=" + "";
data += "&old_out_order_no=" + AbnormalTransitWarehouseOrderInfo.out_order_no;
data += "&old_order_no=" + AbnormalTransitWarehouseOrderInfo.order_no;
data += "&old_order_sku_id=" + AbnormalTransitWarehouseOrderInfo.order_sku_id;
data += "&old_buyer_account=" + AbnormalTransitWarehouseOrderInfo.buyer_account;
data += "&old_out_amount=" + AbnormalTransitWarehouseOrderInfo.out_amount;
data += "&old_purchaser_note=" + AbnormalTransitWarehouseOrderInfo.purchaser_note;
data += "&old_refund_status=" + AbnormalTransitWarehouseOrderInfo.refund_status;
data += "&order_code=" + AbnormalTransitWarehouseOrderInfo.order_code;
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
{
var msg = BaseRegex.GetStringJsonByRegs(ref html, html, "msg");
BaseMsgForm.ShowError("异常单重拍保存失败");
btnManualUpdateBuyOrder.Enabled = true;
return;
}
if (orderItem.ItemTransitOrder != null)
{
orderItem.ItemTransitOrder.buyer_account = buyer.buyer_nick;
orderItem.ItemTransitOrder.id = 0;
orderItem.ItemTransitOrder.order_no = orderItem.order_id;
orderItem.ItemTransitOrder.order_sku_id = orderItem.sku_id;
orderItem.ItemTransitOrder.out_amount = (txtBuyPrice.Text.ParseToDecimal() * 100).ParseToInt();
orderItem.ItemTransitOrder.out_order_no = txtBuyOrderId.Text.Trim();
orderItem.ItemTransitOrder.purchaser_note = BaseClass.UserName + "-" + BaseClass.NickName;
orderItem.ItemTransitOrder.refund_status = "";
}
orderItem.SetOrderItemTextProperty();
// 利润计算重置为最小值,控件Resource更新时将计算利润
orderItem.ProfitCount = decimal.MinValue;
var order = orderItem?.ItemOrder;
if (filterOrderAction != null && order != null)
{
filterOrderAction(order, true);
}
}
#endregion
if (!IsAutoBuy)
BaseMsgForm.ShowInfo("拍单信息保存成功");
}
if (BuyType == "direct")
{
#region 直发拍单
var url = BaseClass.Build29WxObjString("order/wx_get_order_item_ext_info");
var data = UserLogin.GetSignaturex();
data += "&wx_order_id_in=" + orderItem.order_id;
data += "&wx_sku_id_in=" + orderItem.sku_id;
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
{
if (!IsAutoBuy)
BaseMsgForm.ShowError("直发拍单信息保存失败(01) " + BaseRegex.GetStringJson(ref html, "msg"));
else
Invoke(() => { lblErrMsg.Text = "直发拍单信息保存失败(01) " + BaseRegex.GetStringJson(ref html, "msg"); });
return;
}
var existOrderExtList = JsonHelper.DeserializeJsonToList<order_item_ext>(JsonHelper.JObjectParse(html)["data"].ParseToString());
order_item_ext orderExt = new order_item_ext()
{
order_id = orderItem.order_id,
sku_id = orderItem.sku_id,
out_order_id = txtBuyOrderId.Text.Trim(),
shop_app_id = orderItem.Shop.ShopId,
shop_name = orderItem.Shop.ShopAccount,
buy_type = "直发",
};
var url1 = BaseClass.Build29WxObjString("order/wx_add_order_item_ext_info");
if (existOrderExtList.Any(eoe => eoe.order_id == orderExt.order_id && eoe.sku_id == orderExt.sku_id))
url1 = BaseClass.Build29WxObjString("order/wx_mdy_order_item_ext_info");
var data1 = UserLogin.GetSignaturex();
data1 += "&wx_order_id=" + orderExt.order_id;
data1 += "&wx_sku_id=" + orderExt.sku_id;
data1 += "&out_order_id=" + orderExt.out_order_id;
data1 += "&shop_app_id=" + orderExt.shop_app_id;
data1 += "&shop_name=" + orderExt.shop_name;
data1 += "&buy_type=" + orderExt.buy_type;
var html1 = GetHtml.PostUtf8(url1, data1);
if (string.IsNullOrEmpty(html1) || !html1.Contains("\"code\":200"))
{
if (!IsAutoBuy)
BaseMsgForm.ShowError("直发拍单信息保存失败(02) " + BaseRegex.GetStringJson(ref html1, "msg"));
else
Invoke(() => { lblErrMsg.Text = "直发拍单信息保存失败(02) " + BaseRegex.GetStringJson(ref html, "msg"); });
return;
}
// 拍单后覆盖原售后状态(如果有)
var url2 = BaseClass.Build29WxObjString("order/wx_update_erp_out_after_sale_status");
var data2 = UserLogin.GetSignaturex();
data2 += "&order_id=" + orderItem.order_id;
data2 += "&out_after_sale_status=NULL";
var html2 = GetHtml.PostUtf8(url2, data2);
if (string.IsNullOrEmpty(html2) || !html2.Contains("\"code\":200"))
html2 = GetHtml.PostUtf8(url2, data2);
if (string.IsNullOrEmpty(html2) || !html2.Contains("\"code\":200"))
{
if (!IsAutoBuy)
BaseMsgForm.ShowError("直发拍单信息保存失败(03) " + BaseRegex.GetStringJson(ref html2, "msg"));
else
Invoke(() => { lblErrMsg.Text = "直发拍单信息保存失败(03) " + BaseRegex.GetStringJson(ref html, "msg"); });
return;
}
JObject obj = new JObject();
obj["platform"] = "WEISHOP";
obj["outAmount"] = (txtBuyPrice.Text.ParseToDecimal() * 100).ParseToInt() + "";
obj["outAccount"] = buyer.buyer_name;
obj["orderId"] = orderItem.order_id;
obj["outOrderNo"] = txtBuyOrderId.Text.Trim();
//if (!order.outExpressCompanyCode.IsNullOrEmpty() && !order.tracking_number.IsNullOrEmpty())
//{
// obj["outExpressCompany"] = order.outExpressCompanyCode;
// obj["outExpressNo"] = order.tracking_number;
//}
var dataStr = JsonHelper.SerializeObject(obj);
url = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/bind/v2";
//成功 "<ResultVo><code>0</code><msg>SUCCESS</msg><data/><totalRecords/></ResultVo>"
//<AjaxResult><msg>更新微信外采订单状态成功</msg><code>1</code></AjaxResult>
//失败 已存在 <ResultVo><code>1505</code><msg>调用微信接口更新物流信息失败: 非法参数, 同运单号拦截 rid: 69d8ab9c-22baa3b1-67de0d95</msg><data/><totalRecords/></ResultVo>
var exportRst = HttpResponseWXBLL.e57PostResponse(url, dataStr, "");
var code = BaseRegex.GetStringXml(ref exportRst, "code");
var msg = BaseRegex.GetStringXml(ref exportRst, "msg");
if (code == "0" || code == "1")
{
// 利润计算重置为最小值,控件Resource更新时将计算利润
orderItem.ProfitCount = decimal.MinValue;
var order = orderItem?.ItemOrder;
if (filterOrderAction != null && order != null)
{
orderItem.OrderItemExt = orderExt;
order.out_account = buyer.buyer_id;
order.out_express_company = "OTHER";
order.out_order_no = txtBuyOrderId.Text.Trim();
orderItem.SetOrderItemTextProperty();
order.SetOrderTextProperty();
filterOrderAction(order, true);
}
if (!IsAutoBuy)
BaseMsgForm.ShowInfo("拍单信息保存成功");
}
else
{
//order.sendStatus = "发送失败 " + (string.IsNullOrEmpty(msg) ? data : msg);
//NaiBa.Util.Helper.ConfigHelper.SaveConfig("other_buyer_order_list", lstOtherBuyerOrderInfoLite);
if (!IsAutoBuy)
BaseMsgForm.ShowError("直发拍单保存失败,服务端返回 " + msg, "拍单信息保存失败");
else
Invoke(() => { lblErrMsg.Text = "直发拍单保存失败,服务端返回 " + msg; });
return;
}
#endregion
}
this.IsClose = true;
this.IsBuySuccess = true;
this.Close();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
if (pictureBox1.Size.Width == 100)
{
pictureBox1.Size = new Size(430, 430);
pictureBox1.BringToFront();
}
else
{
pictureBox1.Size = new Size(100, 100);
}
}
private void btnJumpOrderList_Click(object sender, EventArgs e)
{
cefWebBrowser.Load("https://mobile.yangkeduo.com/orders.html");
}
private void btnReMap_Click(object sender, EventArgs e)
{
transitWarehouse = null;
pnlMap.Visible = true;
}
private void cmbTransitWarehouse_SelectedIndexChanged(object sender, EventArgs e)
{
transitWarehouse = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransName + " " + t.TransFullAddress == cmbTransitWarehouse.Text);
}
private void chkAutoChangeWarehouseAddress_CheckedChanged(object sender, EventArgs e)
{
if (IsFormLoad)
{
GlobalConfig.BuyConfig.IsAutoChangeWarehouseAddress = chkAutoChangeWarehouseAddress.Checked;
NaiBa.Util.Helper.ConfigHelper.SaveConfig("buy_config_260708", GlobalConfig.BuyConfig);
}
}
private void chkUseAppBalance_CheckedChanged(object sender, EventArgs e)
{
if (IsFormLoad)
{
GlobalConfig.BuyConfig.IsUseAppBalance = chkUseAppBalance.Checked;
GlobalConfig.BuyConfig.IsUseAppBalance = true;
NaiBa.Util.Helper.ConfigHelper.SaveConfig("buy_config_260708", GlobalConfig.BuyConfig);
}
}
private async void btnAnalysis_Click(object sender, EventArgs e)
{
var order = this.orderItem?.ItemOrder;
if (order == null)
return;
var txt = txtDirectAddress.Text.Trim();
txt = txt.Replace("\r", "").Replace("\n", "");
if (txt.Contains("拨打请输入分机号"))
{
Match extensionNumberMatch = Regex.Match(txt, @"拨打请输入分机号\d{4}");
if (extensionNumberMatch.Success)
{
var extensionNumber = extensionNumberMatch.Value.Replace("拨打请输入分机号", "");
txt = txt.Replace("-" + extensionNumber, "");
txt = txt.Replace("(", "(");
txt = txt.Replace(")", ")");
txt = txt.Replace("(拨打请输入分机号" + extensionNumber + ")", "");
}
}
// 定义座机号的正则表达式
string landlinePattern = @"\d{3}-\d{8}|\d{4}-\d{7}";
// 定义手机号的正则表达式
string mobilePattern = @"1[3-9]\d{9}";
// 使用正则表达式匹配座机号和手机号
Match landlineMatch = Regex.Match(txt, landlinePattern);
Match mobileMatch = Regex.Match(txt, mobilePattern);
var phone = "";
if (landlineMatch.Success)
{
phone = landlineMatch.Value;
txt = txt.Replace(phone, " ");
}
if (mobileMatch.Success)
{
phone = mobileMatch.Value;
txt = txt.Replace(phone, " ");
}
if (!string.IsNullOrEmpty(phone))
{
this.orderItem.ItemOrder.tel_number = phone;
}
var province = GlobalConfig.Divisions.FirstOrDefault(d => txt.Contains(d.name));
if (province == null)
return;
this.orderItem.ItemOrder.province_name = province.name;
var city = province.children.FirstOrDefault(c => txt.Contains(c.name));
if (city == null)
return;
this.orderItem.ItemOrder.city_name = city.name;
var county = city.children.FirstOrDefault(c => txt.Contains(c.name));
if (county == null)
return;
this.orderItem.ItemOrder.county_name = county.name;
txt = txt.Replace(county.name, " ").Replace(city.name, " ").Replace(province.name, " ");
var tArr = txt.Split(new string[] { " ", ",", "," }, StringSplitOptions.RemoveEmptyEntries);
tArr = tArr.OrderBy(t => t.Length).ToArray();
this.orderItem.ItemOrder.user_name = tArr.FirstOrDefault();
this.orderItem.ItemOrder.detail_info = string.Join("", tArr).Replace(this.orderItem.ItemOrder.user_name, "").Trim(',',',');
order.AddressStr = order.user_name + "," + order.tel_number + "," + order.province_name + order.city_name + order.county_name + order.detail_info;
this.txtBuyTransitWarehouse.Text = this.orderItem.ItemOrder.AddressStr;
try
{
await ChangeAddress(null);
}
catch (Exception ex)
{
}
}
private void cmbMapSkusProd_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.IsFormLoad)
{
cmbMapSkus.Items.Clear();
if (!string.IsNullOrEmpty(cmbMapSkusProd.Text))
{
cmbMapSkus.Items.Add("");
var mapSku = orderItem.PddBuyMapSkus.FirstOrDefault(m => m.map_goods_name + m.map_goods_id == cmbMapSkusProd.Text);
if (mapSku != null)
{
foreach(var pddsku in mapSku.pdd_front_goods3_Lite.skus)
{
cmbMapSkus.Items.Add(string.Join(";", pddsku.specs.Select(sp => sp.spec_value)));
}
}
}
}
}
private void cmbMapSkus_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.IsFormLoad)
{
this.pictureBox2.Image = null;
this.pictureBox2.Tag = null;
var mapSkuProd = orderItem.PddBuyMapSkus.FirstOrDefault(s => s.map_goods_name + s.map_goods_id == cmbMapSkusProd.Text);
if (mapSkuProd == null)
return;
var mapSku = mapSkuProd.pdd_front_goods3_Lite.skus.FirstOrDefault(s => string.Join(";", s.specs.Select(sp => sp.spec_value)) == cmbMapSkus.Text);
if (mapSku == null)
return;
this.pictureBox2.Image = ImageBuild.LoadBitmapLoadBitmipImageFromUrl(mapSku.thumbUrl);
this.pictureBox2.Tag = mapSku.thumbUrl;
}
}
private void pictureBox2_Click(object sender, EventArgs e)
{
ShowImgForm imgFrom = new ShowImgForm(pictureBox2.Tag.ParseToString());
imgFrom.Show();
}
private void btnAddToMap_Click(object sender, EventArgs e)
{
if (this.IsFormLoad)
{
var mapSkuProd = orderItem.PddBuyMapSkus.FirstOrDefault(s => s.map_goods_name + s.map_goods_id == cmbMapSkusProd.Text);
if (mapSkuProd == null)
return;
var mapSku = mapSkuProd.pdd_front_goods3_Lite.skus.FirstOrDefault(s => string.Join(";", s.specs.Select(sp => sp.spec_value)) == cmbMapSkus.Text);
if (mapSku == null)
return;
this.txtMapGoodsName.Text = mapSkuProd.map_goods_name;
this.txtMapSkuName.Text = string.Join(",", mapSku.specs.Select(sp => sp.spec_value));
this.txtMapGoodsId.Text = mapSkuProd.map_goods_id;
this.txtMapSkuId.Text = mapSku.skuId.ParseToString();
txtSendProvince.Text = mapSkuProd.map_send_address;
this.transitWarehouse = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransId == mapSkuProd.transit_warehouse_id);
if (transitWarehouse != null)
{
cmbTransitWarehouse.Text = transitWarehouse?.TransName + " " + transitWarehouse?.TransFullAddress;
txtBuyTransitWarehouse.Text = transitWarehouse?.TransFullAddress;
}
}
}
private void btnCancelAutoBuy_Click(object sender, EventArgs e)
{
IsAutoBuy = false;
BaseMsgForm.ShowInfo("已取消自动拍单");
}
private void txtBuyTransitWarehouse_TextChanged(object sender, EventArgs e)
{
txtBuyTransitWarehouseStr = txtBuyTransitWarehouse.Text.Trim();
}
private void lblErrMsg_TextChanged(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(lblErrMsg.Text))
pnlMsg.Visible = false;
else
pnlMsg.Visible = true;
}
private void pictureBox4_Click(object sender, EventArgs e)
{
this.pnlMsg.Visible = false;
}
/// <summary>
/// 清理本应用创建的CefSharp.BrowserSubprocess子进程
/// </summary>
private void CleanupBrowserSubprocesses()
{
// 有可能释放错误导致程序崩溃,废弃
return;
try
{
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 = Path.GetDirectoryName(moduleFileName);
if (!string.IsNullOrEmpty(processDir) &&
(processDir.Equals(appBasePath, StringComparison.OrdinalIgnoreCase)
|| appBasePath.Contains(processDir) // 处理子目录情况
|| moduleFileName.Contains(appBasePath)))
{
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}");
}
}
private void pictureBox5_Click(object sender, EventArgs e)
{
pnlMask.Visible = false;
}
}
}