348 lines
16 KiB
C#
348 lines
16 KiB
C#
using AllBase;
|
|
using AllBase.Helper;
|
|
using AllBase.Model.Result;
|
|
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.IO;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using TemuKJD.Extension;
|
|
using TemuKJD.KJDForms.BaseForms;
|
|
using TemuKJD.KJDForms.ShopForms;
|
|
|
|
namespace TemuKJD.KJDForms.UploadForms
|
|
{
|
|
public partial class StockUpForm : Form
|
|
{
|
|
private CheckBox chkSelectAll = null;
|
|
public CancellationTokenSource cancellationTokenSource { get; set; } = null;
|
|
|
|
/// <summary>
|
|
/// 备货单列表
|
|
/// </summary>
|
|
List<StockInfo> lstStockInfo = new List<StockInfo>();
|
|
|
|
public StockUpForm()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void StockUpForm_Load(object sender, EventArgs e)
|
|
{
|
|
pnlSamePostage.Location = pnlStepPostage.Location;
|
|
|
|
chkSelectAll = dgvShop.Columns["colSelect"].AddHeaderCheckBox(HorizontalAlignment.Center, 0, 0, null, null, false);
|
|
dgvShop.Columns["colSelect"].HeaderText = "";
|
|
chkSelectAll.Width = chkSelectAll.Height = 13;
|
|
chkSelectAll.CheckedChanged += chkSelectAll_CheckedChanged;
|
|
}
|
|
|
|
private void chkSelectAll_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
if (!chkSelectAll.Checked)
|
|
{
|
|
foreach (DataGridViewRow row in dgvShop.Rows)
|
|
{
|
|
row.Cells["colSelect"].Value = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var list = GlobalConfig.ShopLoginList.Where(s => s.LoginStatus == "登录成功").Select(ss => ss.ShopId);
|
|
foreach (DataGridViewRow row in dgvShop.Rows)
|
|
{
|
|
if (list.Any(l => l == row.Cells["colShopId"]?.Value?.ToString()))
|
|
row.Cells["colSelect"].Value = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void StockUpForm_VisibleChanged(object sender, EventArgs e)
|
|
{
|
|
if (Visible == true)
|
|
RefreshShop();
|
|
}
|
|
|
|
private void btnRefreshShop_Click(object sender, EventArgs e)
|
|
{
|
|
RefreshShop();
|
|
}
|
|
|
|
private void RefreshShop()
|
|
{
|
|
// 店铺Id
|
|
var selectIds = dgvShop.Rows.Cast<DataGridViewRow>().Where(row
|
|
=> row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList();
|
|
// 获取被删除的店铺
|
|
List<DataGridViewRow> dgvRowList = dgvShop.Rows.Cast<DataGridViewRow>().Where(row
|
|
=> !GlobalConfig.ShopLoginList.Any(s => s.ShopId == row.Cells["colShopId"]?.Value?.ToString())).ToList();
|
|
// 更新被删除的店铺列表
|
|
foreach (var row in dgvRowList)
|
|
{
|
|
dgvShop.Rows.Remove(row);
|
|
}
|
|
// 绑定其他店铺(含新导入的店铺)
|
|
foreach (DouShopLoginInfo shopEntity in GlobalConfig.ShopLoginList)
|
|
{
|
|
if(!string.IsNullOrEmpty(shopEntity.ShopId))
|
|
BindShop(shopEntity, selectIds);
|
|
}
|
|
}
|
|
|
|
private void BindShop(DouShopLoginInfo shopEntity, List<string> selectShopId = null)
|
|
{
|
|
if (shopEntity == null)
|
|
return;
|
|
if (selectShopId == null)
|
|
selectShopId = new List<string>();
|
|
|
|
bool canUse = shopEntity.LoginStatus == "登录成功";
|
|
var row = dgvShop.Rows.Cast<DataGridViewRow>().FirstOrDefault(p => p.Cells.GetCellValueFromColumnName("colShopId").ParseToString() == shopEntity.ShopId);
|
|
if (row == null)
|
|
{
|
|
this.dgvShop.Rows.Add(
|
|
selectShopId.Contains(shopEntity.ShopId) && canUse,
|
|
shopEntity.LoginName,
|
|
shopEntity.ShopId,
|
|
shopEntity.ShopAccount,
|
|
shopEntity.LoginStatus,
|
|
canUse,
|
|
string.Empty
|
|
);
|
|
}
|
|
else
|
|
{
|
|
row.Cells["colSelect"].Value = selectShopId.Contains(shopEntity.ShopId) && canUse;
|
|
row.Cells["colShopLoginName"].Value = shopEntity.LoginName;
|
|
row.Cells["colShopName"].Value = shopEntity.ShopAccount;
|
|
row.Cells["colLoginStatus"].Value = shopEntity.LoginStatus;
|
|
row.Cells["colCanUse"].Value = canUse;
|
|
}
|
|
}
|
|
|
|
private void btnSearch_Click(object sender, EventArgs e)
|
|
{
|
|
var lstShopId = dgvShop.Rows.Cast<DataGridViewRow>().Where(row
|
|
=> row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList();
|
|
if (lstShopId.Count == 0)
|
|
{
|
|
BaseMsgForm.ShowInfo("请选择店铺!");
|
|
return;
|
|
}
|
|
|
|
lstStockInfo.Clear();
|
|
dgvStock.Rows.Clear();
|
|
|
|
string searchText = txtStockid.Text.Trim();
|
|
btnSearch.Enabled = false;
|
|
|
|
cancellationTokenSource = new CancellationTokenSource();
|
|
Task.Run(() =>
|
|
{
|
|
var lstShopIdTemp = new List<string>();
|
|
lstShopIdTemp.AddRange(lstShopId);
|
|
|
|
foreach (var shopId in lstShopIdTemp)
|
|
{
|
|
if (cancellationTokenSource.IsCancellationRequested)
|
|
break;
|
|
|
|
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId);
|
|
if (shop == null)
|
|
continue;
|
|
|
|
#region 检测登录
|
|
if (shop.LoginStatus != "登录成功")
|
|
{
|
|
continue;
|
|
}
|
|
if (ShopListForm.Instance == null)
|
|
ShopListForm.Instance = new ShopListForm();
|
|
ShopListForm.Instance.CheckShopLogin(new string[] { shop.LoginName }, false);
|
|
if (shop.LoginStatus != "登录成功")
|
|
{
|
|
Invoke(new Action(() =>
|
|
{
|
|
var rows = this.dgvShop.Rows.Cast<DataGridViewRow>().Where(r => r.Cells["colShopLoginName"].Value.ToString() == shop.LoginName);
|
|
foreach(var row in rows)
|
|
{
|
|
row.Cells["colLoginStatus"].Value = "未登录";
|
|
row.Cells["colCanUse"].Value = false;
|
|
}
|
|
}));
|
|
continue;
|
|
}
|
|
#endregion
|
|
|
|
int page = 1;
|
|
int totalPage = 1;
|
|
while (page <= totalPage)
|
|
{
|
|
Thread.Sleep(50 + Randomx.GetId(100));
|
|
string jsonStr = GetStock(shop, page);
|
|
if (jsonStr.Contains("指定的值含有无效的控制字符"))
|
|
{
|
|
BaseMsgForm.ShowError("店铺" + shop.LoginName + " " + shop.ShopId + "已掉线");
|
|
break;
|
|
}
|
|
if (!jsonStr.Contains("\"success\":true"))
|
|
jsonStr = GetStock(shop, page);
|
|
|
|
if (jsonStr.Contains("\"success\":true"))
|
|
{
|
|
var jObj = JObject.Parse(jsonStr);
|
|
var jArr = jObj["result"]?["subOrderForSupplierList"] as JArray;
|
|
if (jArr == null)
|
|
jArr = new JArray();
|
|
foreach(var item in jArr)
|
|
{
|
|
string sItem = item.ToString();
|
|
StockInfo sInfo = JsonHelper.DeserializeJsonToObject<StockInfo>(sItem); // 反序列化得到类
|
|
if (sInfo != null)
|
|
{
|
|
lstStockInfo.Add(sInfo);
|
|
|
|
//string url = "https://i0.wp.com/tvax1.sinaimg.cn/large/005DW9w3ly1h7dc70ghc5j32yo1o0773.jpg";
|
|
//pictureBox1.Image = Image.FromStream(System.Net.WebRequest.Create(url).GetResponse().GetResponseStream());
|
|
//var httpClient = new HttpClient();
|
|
//var stream = httpClient.GetStreamAsync("https://i0.wp.com/tvax1.sinaimg.cn/large/005DW9w3ly1h7dc70ghc5j32yo1o0773.jpg").Result; // 异步下载图片流
|
|
//Image image = Image.FromStream(stream);
|
|
|
|
string url = sInfo.productSkcPicture.Replace("https", "http");
|
|
var image = Image.FromStream(WebRequest.Create(url).GetResponse().GetResponseStream());
|
|
Invoke(new Action(() =>
|
|
{
|
|
this.dgvStock.Rows.Add(
|
|
"",
|
|
sInfo.supplierId,
|
|
sInfo.supplierName,
|
|
sInfo.subPurchaseOrderSn,
|
|
sInfo.originalPurchaseOrderSn,
|
|
image,
|
|
sInfo.productId,
|
|
sInfo.productSkcId,
|
|
sInfo.productName,
|
|
"",
|
|
"",
|
|
"",
|
|
""
|
|
);
|
|
}));
|
|
}
|
|
}
|
|
}
|
|
|
|
int total = BaseRegex.GetStringJson(ref jsonStr, "total").ParseToInt();
|
|
totalPage = Math.Ceiling(total / 20.0).ParseToInt();
|
|
page++;
|
|
}
|
|
}
|
|
Invoke(new Action(() =>
|
|
{
|
|
btnSearch.Enabled = true;
|
|
}));
|
|
}, cancellationTokenSource.Token);
|
|
}
|
|
|
|
|
|
private string GetStock(DouShopLoginInfo shop, int page=1)
|
|
{
|
|
HttpWebResponse response = null;
|
|
string result;
|
|
try
|
|
{
|
|
page = Math.Max(page, 1);
|
|
string url = "https://seller.kuajingmaihuo.com/oms/bg/venom/api/supplier/purchase/manager/querySubOrderList";
|
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
|
|
|
|
request.KeepAlive = true;
|
|
request.Headers.Set(HttpRequestHeader.CacheControl, "max-age=0");
|
|
request.Headers.Add("Anti-Content", @"0aqAfqFyXcGvBgd9Q0HiJJ7kvWcKK7muUHnJ6oMAdmem0tmm_enmX1DBr-nJNxmoki33dqHTkZU18BU2p8P72Cg2uEZ_acOOBCxGmIs-Gym4EtKpTdZ6kWRCSClS9L6maLm0imx0GIjodHtLnwpx4ayHnhzNnCXEFecZSC8lBRHb9WCAoyY79kMLIWxBMZZSZrR2_LYUJ5UXzf-82ob455f7OvJa6s895N4wiMGR4vbVH8gFN2VuCxS27RpXDa2WCQQQd6XsJPw7amSUaob6oZ2MXuYb9K3ZqoCX5-nJimNZDR0rNCLB13sYgWq9jy0Q3gjnsFY2dJQDh3ewXS2vvf2DN9IAEzInwWTY31Fn0B6-s8DqwIm61OlXsfYt1AYOOyNMLzkw5llaDaqK21f7vspAuXwnJdAdKXJXSyyEimvTyF_AYLp1gkNqBqN1_ik_jc6cKTDJtGUgFjRojR4g4zM7Ww3wfW63WQrJftYhiTIJiS1tZcsceZht3Zu3MsvyxpAbx4bxFrvL0A6OFx752XsVi04Tm6HDhgt7MmpsrTO5WD_KjgjxNX8VNoGndD0OmriAYVn6kwmZXE6Y_khGedxumIGy4sOQI36__CeiuiPIvB8itfOqd7eyqyeCIaEODrh9dSLBQz8AxQ2xt60OTn4HSiPmlwo1J0TFtjUw2DUZB68tdrINb7ugulMsaIwMKr8S0bilSKW6JuYw3oAsmK3daQfJWy3mzVowY1UwPQfTB4Ibz6uRQxHkvhsRTXkrAygGeZIc9S");
|
|
request.Headers.Add("sec-ch-ua-platform", @"""Windows""");
|
|
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36";
|
|
request.Headers.Add("mallid", shop.ShopId);
|
|
request.Headers.Add("sec-ch-ua", @"""Google Chrome"";v=""137"", ""Chromium"";v=""137"", ""Not/A)Brand"";v=""24""");
|
|
request.ContentType = "application/json";
|
|
request.Headers.Add("sec-ch-ua-mobile", @"?0");
|
|
request.Accept = "*/*";
|
|
request.Headers.Add("Origin", @"https://seller.kuajingmaihuo.com");
|
|
request.Headers.Add("Sec-Fetch-Site", @"same-origin");
|
|
request.Headers.Add("Sec-Fetch-Mode", @"cors");
|
|
request.Headers.Add("Sec-Fetch-Dest", @"empty");
|
|
request.Referer = "https://seller.kuajingmaihuo.com/main/order-manage";
|
|
request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br, zstd");
|
|
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.9");
|
|
request.Headers.Set(HttpRequestHeader.Cookie, shop.Cookies);
|
|
|
|
request.Method = "POST";
|
|
request.ServicePoint.Expect100Continue = false;
|
|
|
|
string body = @"{""pageNo"":" + page + @",""pageSize"":20,""urgencyType"":0,""isCustomGoods"":false,""statusList"":[2],""oneDimensionSort"":{""firstOrderByParam"":""realDeliverTime"",""firstOrderByDesc"":1}}";
|
|
byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(body);
|
|
request.ContentLength = postBytes.Length;
|
|
Stream stream = request.GetRequestStream();
|
|
stream.Write(postBytes, 0, postBytes.Length);
|
|
stream.Close();
|
|
|
|
response = (HttpWebResponse)request.GetResponse();
|
|
}
|
|
catch (WebException ex)
|
|
{
|
|
if (ex.Status == WebExceptionStatus.ProtocolError)
|
|
{
|
|
response = (HttpWebResponse)ex.Response;
|
|
result = GetProxyHtml.ReadResponse(response);
|
|
return result;
|
|
}
|
|
else return ex.Message;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
if (response != null) response.Close();
|
|
return e.Message;
|
|
}
|
|
result = GetProxyHtml.ReadResponse(response);
|
|
return result;
|
|
}
|
|
|
|
private void dgvShop_CellContentClick(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
if (e.ColumnIndex < 0 || e.RowIndex < 0)
|
|
return;
|
|
string headerText = dgvShop.Columns[e.ColumnIndex].HeaderText;
|
|
string columnName = dgvShop.Columns[e.ColumnIndex].Name;
|
|
long shopId = dgvShop.Rows[e.RowIndex].Cells["colShopId"].Value.ParseToLong();
|
|
string shopAccount = dgvShop.Rows[e.RowIndex].Cells["colShopName"].Value.ToString();
|
|
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId.ToString());
|
|
var row = dgvShop.Rows[e.RowIndex];
|
|
switch (columnName)
|
|
{
|
|
case "colSelect":
|
|
if (row.Cells["colCanUse"].Value.ParseToBool())
|
|
{
|
|
row.Cells["colSelect"].Value = !row.Cells["colSelect"].Value.ParseToBool();
|
|
if (dgvShop.Rows.Cast<DataGridViewRow>().All(r => r.Cells["colSelect"].Value.ParseToBool()))
|
|
chkSelectAll.Checked = true;
|
|
else
|
|
chkSelectAll.Checked = false;
|
|
}
|
|
else
|
|
{
|
|
BaseMsgForm.ShowInfo("店铺未登录!");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|