using AllBase; using AllBase.Helper; using AllBase.Model; using AllBase.Model.Params; using AllBase.Model.Result; using CefSharp; 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 Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; 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.BaseForms; namespace TemuKJD.ToolForms { public partial class PddMobileBuyOrderForm : BaseGeneralForm { private BuyerLoginInfo buyer = null; private oms_wei_order_item_info orderItem = null; private WXBuyMapInfo buyMap = null; private TransitWarehouseParam transitWarehouse = null; private Action filterOrderAction = null; public int CloseAfterSecond { get; set; } public string InitUrl = ""; private string shopCookieHead = "yangkeduo.com"; private string shopMainUrl = "https://mobile.yangkeduo.com/index.html"; public ChromiumWebBrowser cefWebBrowser = null; private string currentUrl = ""; public PddMobileBuyOrderForm(Action filterOrder, 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; } private void ShopLoginForm_Load(object sender, EventArgs e) { this.Height = SystemInformation.WorkingArea.Height - 80; this.CenterToScreen(); if (CloseAfterSecond > 0) { Task.Run(() => { Thread.Sleep(1000 * CloseAfterSecond); if (this.Created) { Invoke(new Action(() => { this.Close(); })); } }); } 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 (transitWarehouse != null) { cmbTransitWarehouse.Text = transitWarehouse?.TransName + " " + transitWarehouse?.TransDetailAddress; } } pictureBox1.ImageLocation = orderItem.thumb_img; this.txtShopSkuId.Text = orderItem.sku_id; this.txtShopGoodsId.Text = orderItem.product_id; this.txtUpSpuCode.Text = orderItem.out_product_id; this.txtUpSkuCode.Text = orderItem.out_sku_id; this.txtShopGoodsName.Text = orderItem.title; this.txtShopSpecName.Text = orderItem.sku_attr_str; this.txtShopOrderItemCnt.Text = orderItem.sku_cnt.ParseToString(); this.txtShopOrderItemPrice.Text = (orderItem.real_price * 0.01m).ParseToString(); foreach (var warehouse in TransitWarehouseData.TransitWarehouseList) { //var rb = new RadioButton //{ // Text = warehouse.TransName + warehouse.TransDetailAddress, // Tag = warehouse, // AutoSize = true, //}; //rb.CheckedChanged += Rb_CheckedChanged; //this.flowLayoutPanel1.Controls.Add(rb); this.cmbTransitWarehouse.Items.Add(warehouse.TransName + " " + warehouse.TransDetailAddress); } Task.Run(() => { Invoke(new Action(() => { LoadCef(); })); }); } private void Rb_CheckedChanged(object sender, EventArgs e) { transitWarehouse = (sender as RadioButton)?.Tag as TransitWarehouseParam; } /// /// 自动登录店铺后台 /// private void LoadCef() { if (cefWebBrowser == null) { //cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser("about:blank", false); if (!string.IsNullOrEmpty(InitUrl)) cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser(InitUrl, false); else cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser(shopMainUrl, false); CustomResourceRequestHandlerLocal resourceRequestHandler = new CustomResourceRequestHandlerLocal(); resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete; resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad; cefWebBrowser.RequestHandler = new CustomRequestHandler(resourceRequestHandler); var lifeSapnHandler = new LifeSpanHandlerLocal(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; //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)); //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 (!string.IsNullOrEmpty(InitUrl)) cefWebBrowser.Load(InitUrl); else cefWebBrowser.Load(shopMainUrl); }); } } private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e) { } private void CefWebBrowser_AddressChanged(object sender, CefSharp.AddressChangedEventArgs e) { if (this.Created && !this.Disposing && !this.IsDisposed) { Invoke(new Action(() => { currentUrl = e.Address; 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") && chkChangeWarehouseAddress.Checked && transitWarehouse != null) { //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.TransDetailAddress + Randomx.GetId(1, 35) + Randomx.GetId(1, 9).ToString().PadLeft(2, '0') + "室"; jObj["mobile"] = WaybillHelper.MobileHead[Randomx.GetId(WaybillHelper.MobileHead.Count)] + Randomx.GetNumber(8); jObj["name"] = WaybillHelper.LastName[Randomx.GetId(WaybillHelper.LastName.Count)] + (Randomx.GetId(2) == 1 ? "先生" : "女士"); postData = JsonHelper.SerializeObject(jObj); request.PostData.Elements[0].Bytes = System.Text.Encoding.UTF8.GetBytes(postData); } return false; } //static int GetAntiContentsTimes = 40; private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) { // 个人页面 if (url.Contains("https://mobile.yangkeduo.com/personal.html")) { Task.Run(() => { var data = responseData; }); } // 商品页面 if (url.StartsWith("https://mobile.yangkeduo.com/goods.html?goods_id=")) { Task.Run(() => { 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) { MatchTransitWarehouse(sendProvince); } }); } // 订单详情页面 if (url.StartsWith("https://mobile.yangkeduo.com/order.html?order_sn=")) { Task.Run(() => { 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"); Invoke(new Action(() => { this.txtMapGoodsId.Text = goodsId.ParseToString(); this.txtMapSkuId.Text = skuId.ParseToString(); this.txtMapGoodsName.Text = goodsName; this.txtMapSkuName.Text = spec; })); }); } // 待提交订单确认界面 //"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 (url.StartsWith("https://mobile.yangkeduo.com/proxy/api/api/morgan/confirm/render?pdduid=")) { Task.Run(() => { 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"); var specifications = BaseRegex.GetMatchRegexString(ref data, @"""specifications"":\[([^']+?)\]"); var spec = ""; 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"); Invoke(new Action(() => { this.txtBuyGoodsId.Text = goodsId.ParseToString(); this.txtBuySkuId.Text = skuId.ParseToString(); this.txtBuyGoodsName.Text = goodsName; this.txtBuySkuName.Text = spec; this.txtBuyCnt.Text = buyCnt.ParseToString(); this.txtBuyPrice.Text = (buyPrice * 0.01m).ParseToString(); })); // 自动修改收货地址为中转仓 Invoke(new Action(() => { if (cmbTransitWarehouse.Text.Trim().Length > 0 && IsChangeAddress == false && HasChangeAddress == false) { Task.Run(() => { IsChangeAddress = true; Thread.Sleep(1000); ChangeAddress(); IsChangeAddress = false; }); } })); } }); } // 订单提交接口 if (url.StartsWith("https://mobile.yangkeduo.com/proxy/api/order/prepay?pdduid=")) { Task.Run(() => { var data = postData; Invoke(new Action(() => { txtBuyOrderId.Text = BaseRegex.GetStringJson(ref data, "order_sn"); })); }); } } bool IsChangeAddress = false; bool HasChangeAddress = false; public string ChangeAddress() { //var host = cefWebBrowser.GetBrowser().GetHost(); //var client = cefWebBrowser.GetDevToolsClient(); //if (host == null || client == null) //{ // return "页面未加载"; //} //// 点击图片搜索图标 //var jsStr1 = @"(function() { var spans = document.getElementsByTagName('span'); // for (i=0; i< spans.length;i++){ // var span = spans[i]; // if (span.outerHTML.indexOf('el_image_search_button') >= 0) { // span.click(); // break; // } // } // })();"; //var ts1 = client.Runtime.EvaluateAsync(jsStr1, null, true, null, null, true, null, true); //ts1.Wait(5000); //Thread.Sleep(Randomx.GetId(1500, 3000)); return ""; } private void btnManualUpdateSendProvince_Click(object sender, EventArgs e) { var sendProvince = txtSendProvince.Text.Trim(); MatchTransitWarehouse(sendProvince); } void MatchTransitWarehouse(string sendProvince) { bool isAutoGetWarehouse = false; //foreach (var control in this.flowLayoutPanel1.Controls) //{ // if (control is RadioButton rb) // { // if (rb.Tag is TransitWarehouseParam warehouseParam) // { // if (warehouseParam.TransDetailAddress.Contains(sendProvince)) // { // Invoke(new Action(() => // { // rb.Checked = true; // })); // isAutoGetWarehouse = true; // break; // } // } // } //} foreach (var item in this.cmbTransitWarehouse.Items) { TransitWarehouseParam warehouseParam = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransName + " " + t.TransDetailAddress == item.ParseToString()); if (warehouseParam == null) { continue; } if (warehouseParam.TransDetailAddress.Contains(sendProvince)) { Invoke(new Action(() => { cmbTransitWarehouse.Text = warehouseParam.TransName + " " + warehouseParam.TransDetailAddress; })); transitWarehouse = warehouseParam; isAutoGetWarehouse = true; break; } } if (!isAutoGetWarehouse) { //黄导家庭父母5天训练营-《父母5天成为孩子成长的引路人》+《不内卷养育》2本书 Invoke(new Action(() => { cmbTransitWarehouse.Text = ""; BaseMsgForm.ShowError("匹配仓库失败,请手动选择"); })); } } 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(); })); } }); } private void txtAddress_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { if (cefWebBrowser != null) { cefWebBrowser.Load(txtAddress.Text); } } } private void btnManualUpdateTransitWarehouse_Click(object sender, EventArgs e) { if (transitWarehouse == null && !cmbTransitWarehouse.Text.Trim().IsNullOrEmpty()) { transitWarehouse = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransName + " " + t.TransDetailAddress == cmbTransitWarehouse.Text.Trim().ParseToString()); } if (transitWarehouse == null) { BaseMsgForm.ShowError("仓库不能为空"); return; } var url = BaseClass.Build29WxObjString("order/wx_add_mdy_buy_prod_map"); var data = UserLogin.GetSignaturex() + "&spu_code=" + txtUpSpuCode.Text.Trim() + "&sku_code=" + txtUpSkuCode.Text.Trim() + "&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=" + txtSendProvince.Text.Trim() + "&transit_warehouse_id=" + transitWarehouse?.TransId; var result = GetHtml.PostUtf8(url, data); if (!result.Contains("\"code\":200")) result = GetHtml.PostUtf8(url, data); if (!result.Contains("\"code\":200")) { BaseMsgForm.ShowError("保存失败" + BaseRegex.GetStringJson(ref result, "msg")); } else { var urlMap = BaseClass.Build29WxObjString("order/wx_get_buy_prod_map"); var dataMap = UserLogin.GetSignaturex() + "&spu_codes=" + txtUpSpuCode.Text.Trim(); dataMap += "&sku_codes=" + txtUpSkuCode.Text.Trim(); dataMap += "&main_user_name=" + BaseClass.MainUserName; var resultMap = GetHtml.PostUtf8(urlMap, dataMap); if (string.IsNullOrEmpty(resultMap) || !resultMap.Contains("\"code\":200")) resultMap = GetHtml.PostUtf8(urlMap, dataMap); if (string.IsNullOrEmpty(resultMap) || !resultMap.Contains("\"code\":200")) { } else { List buyMapList = new List(); try { buyMapList = JsonHelper.DeserializeJsonToList(JObject.Parse(resultMap)["data"].ParseToString()); } catch { } var map = buyMapList.FirstOrDefault(); if (map != null) { foreach (var order in GlobalConfig.lstOrder) { if (order.IsWaitBuy) { foreach (var item in order.order_items) { if (item.out_product_id == map.spu_code && item.out_sku_id == map.sku_code) { item.buy_map = map; if (filterOrderAction != null) { GlobalConfig.lstFilterOrder.Remove(order); filterOrderAction(order, false); } } } } } } } BaseMsgForm.ShowInfo("保存成功!"); this.Close(); } } private void btnManualUpdateBuyOrder_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtBuyOrderId.Text)) { BaseMsgForm.ShowError("缺少拍单订单号,请拍单后再提交"); return; } JObject body = new JObject(); body["orderNo"] = orderItem.order_id; body["orderSkuId"] = orderItem.sku_id; 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"] = transitWarehouse.TransId; // 中转仓ID body["orderPlatformCode"] = "WEISHOP"; var url = "https://po.e57.cn/prod-api/api/oms-api/externalProcurement/saveOrUpdate"; var dataStr = JsonHelper.SerializeObject(body); var exportRst = HttpResponseWXBLL.e57PostResponse(url, dataStr, ""); //保存成功200 if (exportRst != null && exportRst.Contains("200")) { BaseMsgForm.ShowInfo("保存成功"); orderItem.item_transit_orders.Insert(0, new oms_wei_external_procurement_log() { 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 = BaseClass.NickName, }); var order = orderItem.item_order; if (filterOrderAction != null) { GlobalConfig.lstFilterOrder.Remove(order); filterOrderAction(order, 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); } } } }