1929 lines
76 KiB
C#
1929 lines
76 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|