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; } = ""; /// /// 直发direct 中转transit /// 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 filterOrderAction = null; // (拍单后)回调函数,更新拍单余额 private Action updateBalanceAction = null; /// /// 拍单中转地址 /// string txtBuyTransitWarehouseStr = ""; bool IsChangeAddress = false; bool HasChangeAddress = false; public PddMobileBuyOrderForm(Action 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; } /// /// 自动登录店铺后台 /// 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 cookieLst = new List(); try { if (buyer != null) { cookieLst = JsonHelper.DeserializeJsonToList(buyer?.cookie); if (cookieLst == null) cookieLst = new List(); } } 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 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); })); } } /// /// 自动拍单循环 /// 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 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; } /// /// 获取溯源码 /// /// 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); } } /// /// 自动填写地址 /// /// /// public async Task 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(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 buyMapSkuList = new List(); try { buyMapSkuList = JsonHelper.DeserializeJsonToList(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 buyMapList = new List(); try { buyMapList = JsonHelper.DeserializeJsonToList(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, ""); //保存成功200 //订单不存在:373733973395494272500 if (!exportRst.ParseToString().Contains("200")) { 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("200") && !getVirtualTicketRst.ParseToString().Contains("0")) // { // 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(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"; //成功 "0SUCCESS" //更新微信外采订单状态成功1 //失败 已存在 1505调用微信接口更新物流信息失败: 非法参数, 同运单号拦截 rid: 69d8ab9c-22baa3b1-67de0d95 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; } /// /// 清理本应用创建的CefSharp.BrowserSubprocess子进程 /// 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; } } }