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.sku_attr_str : 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 + 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