Files
KJD_WebService/TEMUKJD/WXForms/AdminForms/WXProdComplateForm.cs
T
2026-03-19 20:44:33 +08:00

1238 lines
57 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using TemuKJD.Extension;
using TemuKJD.BaseForms;
using TemuKJD.ToolForms;
using Work;
using TemuKJD.BLL;
using System.Text.RegularExpressions;
using TemuKJD.PDDForms.ProductSelectForms;
using TemuKJD.WXForms.ShopForms;
using AllBase.Model.Result.PDDResult;
using AllBase.Model.Param.WXParam;
using AllBase.Model.Result.WXResult;
using Newtonsoft.Json;
using NaiBa.Util;
using AllBase.Model.Config;
using TemuKJD.WXForms.ProductForms;
namespace TemuKJD.WXForms.AdminForms
{
public partial class WXProdComplateForm : BaseForm
{
int PageBegin = 1;
int PageEnd = 999;
string PreType = "";
public CancellationTokenSource cancellationTokenSource { get; set; } = null;
public bool IsLoadComplate { get; set; } = false;
bool isInit = false;
CheckBox chkSelectAll = null;
ConcurrentList<AuthInfo> lstShopAuthInfo = new ConcurrentList<AuthInfo>();
ConcurrentList<WXShopTokenInfo> lstWXShopTokenInfo = new ConcurrentList<WXShopTokenInfo>();
public NaiBa.Util.ConcurrentList<TemuDBProductSelect> lstTemuDBProductSelect = new NaiBa.Util.ConcurrentList<TemuDBProductSelect>();
//public Dictionary<string, List<string>> dicCheckedShopIdList = new Dictionary<string, List<string>>();
public Dictionary<string, bool> dicCheckedShopId = new Dictionary<string, bool>();
public Dictionary<string, WxShopUploadInfo> dicShopUpload = new Dictionary<string, WxShopUploadInfo>();
public string pdd_product_cates = "";
public WXProdComplateForm()
{
InitializeComponent();
}
private void UserSelectDbProductForm_Load(object sender, EventArgs e)
{
this.splitContainer1.Dock = DockStyle.Fill;
lstShopAuthInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig<NaiBa.Util.ConcurrentList<AuthInfo>>("wx_shop_auth_list");
if (lstShopAuthInfo == null)
lstShopAuthInfo = new ConcurrentList<AuthInfo>();
lstWXShopTokenInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig<NaiBa.Util.ConcurrentList<WXShopTokenInfo>>("wx_shop_token_list");
if (lstWXShopTokenInfo == null)
lstWXShopTokenInfo = new ConcurrentList<WXShopTokenInfo>();
lstTemuDBProductSelect = NaiBa.Util.Helper.ConfigHelper.LoadConfig<NaiBa.Util.ConcurrentList<TemuDBProductSelect>>("wx_db_prod_upload_list");
if (lstTemuDBProductSelect == null)
lstTemuDBProductSelect = new NaiBa.Util.ConcurrentList<TemuDBProductSelect>();
dicCheckedShopId = NaiBa.Util.Helper.ConfigHelper.LoadConfig<Dictionary<string, bool>>("wx_checked_shop_dic");
if (dicCheckedShopId == null)
dicCheckedShopId = new Dictionary<string, bool>();
dicShopUpload = NaiBa.Util.Helper.ConfigHelper.LoadConfig<Dictionary<string, WxShopUploadInfo>>("wx_shop_upload_info");
if (dicShopUpload == null)
dicShopUpload = new Dictionary<string, WxShopUploadInfo>();
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;
//chkSelectAll.Checked = true;
this.dgvSelectProduct.AddSelectorColumn("colCheck");
dgvSelectProduct.AddImgColumn("colProductSkcPic", "colImgUrl");
dgvSelectProduct.AddImgColumn("colSkuFakeImg", "colSkuFakeImgUrl");
dgvSelectProduct.Columns["colSkuFakeImg"].Visible = false;
//#if DEBUG
if (BaseClass.SaLevel == 1)
{
//txtIdFilter.Visible = true;
//txtExtCodeFilter.Visible = true;
//lblIdFilter.Visible = true;
//lblExtCodeFilter.Visible = true;
}
//#endif
IsLoadComplate = true;
}
private void btnRefreshAuthor_Click(object sender, EventArgs e)
{
updateAuthor(true);
}
/// <summary>
/// 升级授权
/// </summary>
/// <param name="idRefreshTodayHasGet">今日取过的也取</param>
private void updateAuthor(bool idRefreshTodayHasGet = false)
{
this.pbLoadingShop.Visible = true;
Task.Run(() =>
{
// 店铺Id
var updateIds = dgvShop.Rows.Cast<DataGridViewRow>().Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList();
var selectIds = dgvShop.Rows.Cast<DataGridViewRow>().Where(row
=> row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList();
if (idRefreshTodayHasGet == true)
updateIds = selectIds;
List<Task> tList = new List<Task>();
if (idRefreshTodayHasGet)
lstShopAuthInfo.RemoveAll(s => updateIds.Contains(s.ShopId));
foreach (var shop in GlobalConfig.ShopLoginList.Where(s => updateIds.Contains(s.ShopId)))
{
Invoke(new Action(() => { BindShop(shop, selectIds, ""); }));
var t = Task.Run(() =>
{
try
{
if (shop.LoginStatus != "登录成功")
{
Invoke(new Action(() => { BindShop(shop, selectIds, "店铺掉线"); }));
return;
}
var authInfo = lstShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shop.ShopId);
if (idRefreshTodayHasGet || authInfo == null || authInfo?.AddTime.Date != DateTime.Now.Date)
{
lstShopAuthInfo.RemoveAll(sa => sa.ShopId == shop.ShopId);
var rst = WXUpload.GetApiServiceList(shop);
if (!rst.Contains("\"code\":0"))
{
WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false);
if (shop.LoginStatus != "登录成功")
{
Invoke(new Action(() => { BindShop(shop, selectIds, "店铺掉线"); }));
return;
}
lstShopAuthInfo.Add(new AuthInfo() { ShopId = shop.ShopId, AddTime = DateTime.Now, ExpiresTime = DateTime.Now });
Invoke(new Action(() => { BindShop(shop, selectIds, "授权查询失败"); }));
return;
}
foreach (var itemObj in JsonHelper.JObjectParse(rst)["itemList"])
{
// 找到了指定服务
if (itemObj["serviceName"].ParseToString() == "店统领供应链-商品管理")
{
var expiresTick = itemObj["expireTime"].ParseToLong();
lstShopAuthInfo.Add(new AuthInfo() { ShopId = shop.ShopId, AddTime = DateTime.Now, ExpiresTime = BaseClass.StampToDateTime(expiresTick.ParseToInt()) });
Invoke(new Action(() => { BindShop(shop, selectIds, "已查询"); }));
return;
}
}
// 没找到指定服务
lstShopAuthInfo.Add(new AuthInfo() { ShopId = shop.ShopId, AddTime = DateTime.Now, ExpiresTime = DateTime.Now });
Invoke(new Action(() => { BindShop(shop, selectIds, "已查询"); }));
}
}
catch (Exception ex)
{
}
});
tList.Add(t);
while (tList.Where(ta => !ta.IsFaulted && !ta.IsCompleted).Count() >= 20) { Thread.Sleep(100); }
}
while (tList.Where(ta => !ta.IsFaulted && !ta.IsCompleted).Count() >= 1) { Thread.Sleep(100); }
NaiBa.Util.Helper.ConfigHelper.SaveConfig( "wx_shop_auth_list", lstShopAuthInfo);
Invoke(new Action(() => { pbLoadingShop.Visible = false; }));
});
}
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()))
if(row.Visible == true)
row.Cells["colSelect"].Value = true;
}
}
foreach (var r in dgvShop.Rows.Cast<DataGridViewRow>())
{
dicCheckedShopId[r.Cells["colShopId"].Value.ParseToString()] = r.Cells["colSelect"].Value.ParseToBool();
}
NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_checked_shop_dic", dicCheckedShopId);
}
private void btnRefreshShop_Click(object sender, EventArgs e)
{
pbLoadingShop.Visible = true;
RefreshShopLogin();
}
private void UserSelectDbProductForm_VisibleChanged(object sender, EventArgs e)
{
if (Visible == true)
{
//RefreshShopLogin();
//updateAuthor();
if (!isInit)
{
Task.Run(() =>
{
foreach (var shop in GlobalConfig.ShopLoginList)
{
//if (shop.LoginStatus == "登录成功")
//{
// var rst = WXPreSale.scanProductPreview(shop);
// if (!rst.Contains("\"code\":0") && !rst.Contains("\"success\":true"))
// {
// WXShopListForm.Instance.CheckShopLogin(new string[] { shop.LoginName }, false);
// }
//}
}
});
}
isInit = true;
}
}
private void RefreshShopLogin()
{
// 店铺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 (ShopLoginInfo shopEntity in GlobalConfig.ShopLoginList)
{
if (!string.IsNullOrEmpty(shopEntity.ShopId))
BindShop(shopEntity, selectIds);
}
//cmbFilterShopNotes.Items.Clear();
////cmbFilterShopNotes.Items.Add("");
//foreach (var note in GlobalConfig.ShopLoginList.Select(s => s.Notes).Where(s => !s.IsNullOrEmpty()).Distinct())
//{
// cmbFilterShopNotes.Items.Add(note);
//}
textBox1.Text = "";
}
private void BindShop(ShopLoginInfo shopEntity, List<string> selectShopId = null, string msg = "")
{
if (shopEntity == null)
return;
if (selectShopId == null)
selectShopId = new List<string>();
bool canUse = shopEntity.LoginStatus == "登录成功";
//canUse = true; // 内部库不需要校验登录状态
var row = dgvShop.Rows.Cast<DataGridViewRow>().FirstOrDefault(p => p.Cells.GetCellValueFromColumnName("colShopId").ParseToString() == shopEntity.ShopId);
var day = DateTime.Now.ToString("yyyyMMdd").ParseToInt();
if (row == null)
{
this.dgvShop.Rows.Add(
//!isInit || (selectShopId.Contains(shopEntity.ShopId) && canUse),
dicCheckedShopId.Keys.Contains(shopEntity.ShopId) && dicCheckedShopId[shopEntity.ShopId] == true,
shopEntity.LoginName,
shopEntity.ShopId,
shopEntity.ShopAccount,
shopEntity.Notes,
"选择商品",
canUse ? "在线" : "掉线",
lstShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shopEntity.ShopId)?.ExpiresTime > DateTime.Now.AddMinutes(5) ? "可用" : "过期",
canUse,
dicShopUpload.ContainsKey(shopEntity.ShopId) && dicShopUpload[shopEntity.ShopId].DicDayUploadCount.ContainsKey(day) ?
dicShopUpload[shopEntity.ShopId].DicDayUploadCount[day] : 0,
dicShopUpload.ContainsKey(shopEntity.ShopId) && dicShopUpload[shopEntity.ShopId].OnSaleRefreshDay == DateTime.Now.ToString("yyyyMMdd").ParseToInt() ?
dicShopUpload[shopEntity.ShopId].OnSaleCount : 0,
shopEntity.AddProductRemaining,
"",
msg
);
}
else
{
row.Cells["colSelect"].Value = !isInit || (selectShopId.Contains(shopEntity.ShopId) && canUse);
row.Cells["colShopLoginName"].Value = shopEntity.LoginName;
row.Cells["colShopName"].Value = shopEntity.ShopAccount;
row.Cells["colShopNotes"].Value = shopEntity.Notes;
row.Cells["colLoginStatus"].Value = canUse ? "在线" : "掉线";
row.Cells["colLoginStatus"].Style.ForeColor = canUse ? Color.Green : Color.Red;
row.Cells["colCanUse"].Value = canUse;
row.Cells["colApi"].Value = lstShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shopEntity.ShopId)?.ExpiresTime > DateTime.Now.AddMinutes(5) ? "可用" : "过期";
row.Cells["colRemaining"].Value = shopEntity.AddProductRemaining;
row.Cells["colUploadCount"].Value = dicShopUpload.ContainsKey(shopEntity.ShopId) && dicShopUpload[shopEntity.ShopId].DicDayUploadCount.ContainsKey(day) ?
dicShopUpload[shopEntity.ShopId].DicDayUploadCount[day] : 0;
row.Cells["colOnSaleNum"].Value = dicShopUpload.ContainsKey(shopEntity.ShopId) && dicShopUpload[shopEntity.ShopId].OnSaleRefreshDay == DateTime.Now.ToString("yyyyMMdd").ParseToInt() ?
dicShopUpload[shopEntity.ShopId].OnSaleCount : 0;
row.Cells["colMessage"].Value = msg;
}
displayAuthStatus(shopEntity);
}
void displayAuthStatus(ShopLoginInfo shop)
{
var rows = this.dgvShop.Rows.Cast<DataGridViewRow>().Where(r => r.Cells["colShopId"].Value.ParseToString() == shop?.ShopId);
foreach (var row in rows)
{
bool canUse = row.Cells["colLoginStatus"].Value.ParseToString() == "在线";
(row.Cells["colLoginStatus"] as DataGridViewLinkCell).Style.ForeColor = canUse ? Color.Blue : Color.Red;
(row.Cells["colLoginStatus"] as DataGridViewLinkCell).LinkColor = canUse ? Color.Blue : Color.Red;
(row.Cells["colLoginStatus"] as DataGridViewLinkCell).ActiveLinkColor = canUse ? Color.LightBlue : Color.OrangeRed;
(row.Cells["colLoginStatus"] as DataGridViewLinkCell).VisitedLinkColor = canUse ? Color.DarkBlue : Color.DarkRed;
canUse = row.Cells["colApi"].Value.ParseToString() == "可用";
(row.Cells["colApi"] as DataGridViewLinkCell).Style.ForeColor = canUse ? Color.Blue : Color.Red;
(row.Cells["colApi"] as DataGridViewLinkCell).LinkColor = canUse ? Color.Blue : Color.Red;
(row.Cells["colApi"] as DataGridViewLinkCell).ActiveLinkColor = canUse ? Color.LightBlue : Color.OrangeRed;
(row.Cells["colApi"] as DataGridViewLinkCell).VisitedLinkColor = canUse ? Color.DarkBlue : Color.DarkRed;
}
}
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;
string shopId = dgvShop.Rows[e.RowIndex].Cells["colShopId"].Value.ParseToString();
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();
chkSelectAll.CheckedChanged -= chkSelectAll_CheckedChanged;
if (dgvShop.Rows.Cast<DataGridViewRow>().All(r => r.Cells["colSelect"].Value.ParseToBool()))
chkSelectAll.Checked = true;
else
chkSelectAll.Checked = false;
chkSelectAll.CheckedChanged += chkSelectAll_CheckedChanged;
}
//else
{
//BaseMsgForm.ShowInfo("店铺未登录!");
}
dicCheckedShopId[row.Cells["colShopId"].Value.ParseToString()] = row.Cells["colSelect"].Value.ParseToBool();
NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_checked_shop_dic", dicCheckedShopId);
break;
case "colLoginStatus":
{
if (WXShopListForm.Instance == null)
WXShopListForm.Instance = new WXShopListForm();
WXAdminShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false);
WXAdminShopLoginForm shopLoginForm = new WXAdminShopLoginForm(shop);
if (shop.LoginStatus != "登录成功")
{
shopLoginForm.openType = EnumOpenType.login;
shopLoginForm.ShowDialog();
RefreshShopLogin();
}
else
{
shopLoginForm.openType = EnumOpenType.manage;
shopLoginForm.WindowState = FormWindowState.Maximized;
shopLoginForm.Show();
}
}
break;
case "colApi":
{
WXAdminShopLoginForm shopLoginForm = new WXAdminShopLoginForm(shop);
shopLoginForm.openType = EnumOpenType.manage;
shopLoginForm.WindowState = FormWindowState.Maximized;
shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/servicemarket/detail?serviceId=3984039898079707139";
shopLoginForm.Show();
}
break;
}
}
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;
}
}
private void dgvSelectProduct_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0)
return;
string headerText = dgvSelectProduct.Columns[e.ColumnIndex].HeaderText;
var dbId = dgvSelectProduct.Rows[e.RowIndex].Cells["colSelectId"].Value.ParseToString();
var dbProduct = lstTemuDBProductSelect.FirstOrDefault(p => p.id.ToString() == dbId);
var shopId = dgvSelectProduct.Rows[e.RowIndex].Cells["colSupplierId"].Value.ParseToString();
var draftId = dgvSelectProduct.Rows[e.RowIndex].Cells["colDraftId"].Value.ParseToString();
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId);
switch (headerText)
{
case "删除":
break;
case "登录":
{
WXAdminShopLoginForm shopLoginForm = new WXAdminShopLoginForm(shop);
//shopLoginForm.prodUserSelectForm = this;
shopLoginForm.openType = EnumOpenType.login;
shopLoginForm.ShowDialog();
RefreshShopLogin();
}
break;
case "进店":
{
WXAdminShopLoginForm shopLoginForm = new WXAdminShopLoginForm(shop);
WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false);
if (shop.LoginStatus == "登录成功")
{
shopLoginForm.openType = EnumOpenType.manage;
shopLoginForm.WindowState = FormWindowState.Maximized;
shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/home";
shopLoginForm.Show();
}
else
{
shopLoginForm.openType = EnumOpenType.login;
shopLoginForm.ShowDialog();
RefreshShopLogin();
}
}
break;
case "图片":
{
ShowImgForm imgFrom = new ShowImgForm(dgvSelectProduct.Rows[e.RowIndex].Cells["colImgUrl"].Value.ParseToString());
imgFrom.ShowDialog();
break;
}
case "SKU替换图":
{
ShowImgForm imgFrom = new ShowImgForm(dgvSelectProduct.Rows[e.RowIndex].Cells["colSkuFakeImgUrl"].Value.ParseToString());
imgFrom.ShowDialog();
break;
}
case "":
dgvSelectProduct.Rows[e.RowIndex].Cells["colCheck"].Value = !(bool)dgvSelectProduct.Rows[e.RowIndex].Cells["colCheck"].Value;
break;
default:
break;
}
}
private void btnStop_Click(object sender, EventArgs e)
{
if (this.cancellationTokenSource != null)
this.cancellationTokenSource.Cancel();
}
private void btnSearchProd_Click(object sender, EventArgs e)
{
var shopIdLst = dgvShop.Rows.Cast<DataGridViewRow>().Where(row
=> row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList();
if (shopIdLst.Count <= 0)
{
BaseMsgForm.ShowError("未勾选上传店铺!");
return;
}
btnSearchProd.Enabled = false;
pbLoading.Visible = true;
cancellationTokenSource = new CancellationTokenSource();
dgvSelectProduct.Rows.Clear();
dgvSelectProduct.Columns["colCouponNum"].Visible = false;
Task.Run(() =>
{
GetProduct(shopIdLst);
Invoke(new Action(() =>
{
this.statusBar.lblTaskStatus.Text = "商品查询完毕";
BaseMsgForm.ShowInfo("商品查询完毕");
pbLoading.Visible = false;
btnSearchProd.Enabled = true;
}));
}, cancellationTokenSource.Token);
}
void GetProduct(List<string> shopIdLst)
{
List<ShopLoginInfo> shopLst = GlobalConfig.ShopLoginList.Where(s => shopIdLst.Contains(s.ShopId)).ToList();
foreach(var shop in shopLst)
{
if(cancellationTokenSource.IsCancellationRequested)
break;
if (shop.LoginStatus != "登录成功")
{
continue;
}
int page = PageBegin - 1;
int totalPage = 1;
int pageSize = 50;
string nextKey = "";
while (page < totalPage && page < PageEnd)
{
page++;
if (cancellationTokenSource.IsCancellationRequested)
break;
string getProdOnSaleRst = "";
if (string.IsNullOrEmpty(PreType) && sortType == null)
getProdOnSaleRst = WXPreSale.scanProductPreview(shop, page, nextKey, pageSize);
else
getProdOnSaleRst = WXPreSale.searchProduct(shop, page, null, pageSize, sortType);
Thread.Sleep(Randomx.GetId(50, 100));
if (!getProdOnSaleRst.Contains("\"success\":true"))
{
var error = BaseRegex.GetStringJson(ref getProdOnSaleRst, "msg");
if (string.IsNullOrEmpty(error))
error = getProdOnSaleRst;
WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false);
if (shop.LoginStatus != "登录成功")
{
Invoke(new Action(() => { BindShop(shop, shopIdLst, "店铺掉线"); }));
}
var shopRow = dgvShop.Rows.Cast<DataGridViewRow>().FirstOrDefault(r => r.Cells["colShopId"].Value.ParseToString() == shop.ShopId);
Invoke(new Action(() => {
if (shopRow != null)
{
shopRow.Cells["colOpResult"].Value = error;
}
}));
break;
}
try
{
var prodObjs = JsonHelper.JObjectParse(getProdOnSaleRst);
if (page == 1 || 1 == 1)
{
var totalNum = prodObjs["totalNum"].ParseToInt();
totalPage = Math.Ceiling(1m * totalNum / pageSize).ParseToInt();
}
nextKey = prodObjs["nextKey"].ParseToString();
Invoke(new Action(() =>
{
this.pbLoading.Visible = true;
this.statusBar.lblTaskStatus.Text = "正在查询店铺:" + shop.ShopAccount + " " + page + "/" + Math.Min(PageEnd, totalPage);
//this.statusBar.pgbTaskProgress.Maximum = lstTemuDBProductSelect.Count;
//this.statusBar.UpdateProgressBar(0);
}));
foreach (JObject prod in prodObjs["productList"])
{
var pStr = JsonHelper.SerializeObject(prod);
Invoke(new Action(() =>
{
decimal? price = null;
try { price = prod["skuList"][0]["price"].ParseToDecimal() / 100; } catch { }
var prodId = prod["productId"].ParseToString();
if (dgvSelectProduct.Rows.Cast<DataGridViewRow>().Any(r => r.Cells["colDraftId"].ParseToString() == prodId))
{
}
var rowIndex = this.dgvSelectProduct.Rows.Add(
false,
"",
shop.ShopId,
shop.ShopAccount,
"登录",
"进店",
"",
"",
prod["productId"].ParseToString(),
prod["headImg"].ParseToString(),
DataGridViewExtension.defaultBitmap,
"", // 替换图地址
null, // 替换图
prod["title"].ParseToString(), // 用户端显示商品原名
(prod["recommendCategory"].IsJTokenNullOrEmpty() || prod["recommendCategory"]["categoryNames"].IsJTokenNullOrEmpty()) ?
"" : string.Join(" >> ", prod["recommendCategory"]["categoryNames"].Select(s => s.ParseToString())), // 类目名称
prod["spuCode"].ParseToString(),
//price,
prod["price"].ParseToDecimal() * 0.01m,
prod["soldNum"].ParseToInt(),
"在售" + (prod["presaleTag"].ParseToInt() == 1 ? "[预售]" : ""),
"", // 备注
"",
"删除",
BaseClass.StampToDateTime(prod["lastEditDraftTime"].ParseToInt()).ToString("yy-MM-dd HH:mm"),
"");
dgvSelectProduct.Rows[rowIndex].Height = 60;
dgvSelectProduct.Rows[rowIndex].Cells["colMsg"].Style.ForeColor = dgvSelectProduct.Rows[rowIndex].Cells["colMsg"].Value.ParseToString().Contains("预售") ? Color.Orange : Color.Blue;
}));
}
}
catch (Exception ex)
{
}
}
}
}
private void btnClearDgv_Click(object sender, EventArgs e)
{
var rows = this.dgvSelectProduct.Rows.Cast<DataGridViewRow>().ToList(); //Cast后Rows做foreach循环时仍会夹花跳过,所以要ToList转一个新的数组。
foreach (var row in rows)
{
if (row.Cells["colCheck"].Value.ParseToBool() == true)
{
//var draft_id = row.Cells["colDraftId"].Value.ParseToString();
//upload_draft_product_lst.RemoveAll(p => p.draft_id == draft_id);
this.dgvSelectProduct.Rows.Remove(row);
}
}
//NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_select_upload_draft_products", upload_draft_product_lst);
}
private void btnClearFilter_Click(object sender, EventArgs e)
{
txtFiltSaleNumMoreThan.Text = "0";
txtFiltSaleNumLessThan.Text = "1";
}
private void btnFilterShop_Click(object sender, EventArgs e)
{
foreach(DataGridViewRow row in dgvShop.Rows)
{
string notes = textBox1.Text.Trim().Trim(';');
if (notes == "全部")
notes = "";
List<string> notesLst = notes.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (!row.Cells["colShopName"].Value.ParseToString().Contains(txtFilterShopName.Text.Trim()))
{
row.Visible = false;
row.Cells["colSelect"].Value = false;
continue;
}
if (!string.IsNullOrWhiteSpace(notes) && !notesLst.Contains(row.Cells["colShopNotes"].Value.ParseToString()))
{
row.Visible = false;
row.Cells["colSelect"].Value = false;
continue;
}
row.Visible = true;
}
}
private void btnEmptyShop_Click(object sender, EventArgs e)
{
txtFilterShopName.Text = "";
textBox1.Text = "";
btnFilterShop_Click(null, null);
}
private void btnReverse_Click(object sender, EventArgs e)
{
foreach(DataGridViewRow row in dgvShop.Rows)
{
if (row.Visible == true)
row.Cells["colSelect"].Value = !row.Cells["colSelect"].Value.ParseToBool();
}
}
private void btnAddSelect_Click(object sender, EventArgs e)
{
string notes = textBox1.Text.Trim().Trim(';');
if (notes == "全部")
notes = "";
List<string> notesLst = notes.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
foreach (DataGridViewRow row in dgvShop.Rows)
{
if (row.Visible == true)
{
if (row.Cells["colShopName"].Value.ParseToString().Contains(txtFilterShopName.Text.Trim()) &&
(string.IsNullOrWhiteSpace(notes) || notesLst.Contains(row.Cells["colShopNotes"].Value.ParseToString())))
{
row.Cells["colSelect"].Value = true;
}
}
}
}
private void btnAddUnSelect_Click(object sender, EventArgs e)
{
string notes = textBox1.Text.Trim().Trim(';');
if (notes == "全部")
notes = "";
List<string> notesLst = notes.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
foreach (DataGridViewRow row in dgvShop.Rows)
{
if (row.Visible == true)
{
if (row.Cells["colShopName"].Value.ParseToString().Contains(txtFilterShopName.Text.Trim()) &&
(string.IsNullOrWhiteSpace(notes) || notesLst.Contains(row.Cells["colShopNotes"].Value.ParseToString())))
{
row.Cells["colSelect"].Value = false;
}
}
}
}
private void btnSelectOnline_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dgvShop.Rows)
{
if (row.Visible == true)
{
if (row.Cells["colLoginStatus"].Value.ParseToString() == "在线")
{
row.Cells["colSelect"].Value = true;
}
else
{
row.Cells["colSelect"].Value = false;
}
}
}
}
private void btnSelectOffline_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dgvShop.Rows)
{
if (row.Visible == true)
{
if (row.Cells["colLoginStatus"].Value.ParseToString() != "在线")
{
row.Cells["colSelect"].Value = true;
}
else
{
row.Cells["colSelect"].Value = false;
}
}
}
}
private void txtPageEnd_TextChanged(object sender, EventArgs e)
{
PageEnd = txtPageEnd.Text.ParseToInt();
}
private void cmbPreType_SelectedIndexChanged(object sender, EventArgs e)
{
PreType = cmbPreType.Text.Trim();
}
private void btnFiltSelectMoreThan_Click(object sender, EventArgs e)
{
foreach(DataGridViewRow row in dgvSelectProduct.Rows)
{
if (row.Cells["colSoldNum"].Value.ParseToInt() > txtFiltSaleNumMoreThan.Text.Trim().ParseToInt())
row.Cells["colCheck"].Value = true;
else
row.Cells["colCheck"].Value = false;
}
}
private void btnFiltSelectLessThan_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dgvSelectProduct.Rows)
{
if (row.Cells["colSoldNum"].Value.ParseToInt() >= txtFiltSaleNumLessThan.Text.Trim().ParseToInt())
row.Cells["colCheck"].Value = false;
else
row.Cells["colCheck"].Value = true;
}
}
decimal productPriceValue = 0;
private void btnEndCoupon_Click(object sender, EventArgs e)
{
var rowLst = dgvSelectProduct.Rows.Cast<DataGridViewRow>().Where(r => r.Cells["colCheck"].Value.ParseToBool() == true).ToList();
if (rowLst.Count <= 0)
{
BaseMsgForm.ShowError("请勾选需要操作的商品!");
return;
}
this.pbLoading.Visible = true;
cancellationTokenSource = new CancellationTokenSource();
dgvSelectProduct.Columns["colCouponNum"].HeaderText = "生效券数量";
dgvSelectProduct.Columns["colCouponNum"].Visible = true;
Task.Run(() =>
{
EndProdCoupon(rowLst);
Invoke(new Action(() =>
{
this.statusBar.lblTaskStatus.Text = "优惠券作废删除完毕";
BaseMsgForm.ShowInfo("优惠券作废删除完毕");
this.pbLoading.Visible = false;
}));
}, cancellationTokenSource.Token);
}
void EndProdCoupon(List<DataGridViewRow> rowLst)
{
Invoke(new Action(() =>
{
this.pbLoading.Visible = true;
this.statusBar.lblTaskStatus.Text = "正在作废删除" + "...".Substring(0, DateTime.Now.Second % 4);
this.statusBar.pgbTaskProgress.Maximum = rowLst.Count;
this.statusBar.UpdateProgressBar(0);
}));
foreach (var row in rowLst)
{
if (cancellationTokenSource.IsCancellationRequested)
break;
Invoke(new Action(() =>
{
this.statusBar.lblTaskStatus.Text = "正在作废删除" + "...".Substring(0, DateTime.Now.Second % 4);
this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1);
row.Cells["colOpResult"].Value = "";
row.Cells["colCouponNum"].Value = "";
}));
var prodId = row.Cells["colDraftId"].Value.ParseToString();
var shopId = row.Cells["colSupplierId"].Value.ParseToString();
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId);
if (shop == null)
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "店铺不存在";
}));
continue;
}
if (shop.LoginStatus != "登录成功")
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "店铺掉线";
}));
continue;
}
var searchCouponRst = WxCoupon.WxSearchCoupon(shop, prodId);
Thread.Sleep(Randomx.GetId(500, 1000));
if (searchCouponRst.Contains("biz magic invalid"))
{
WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false);
}
if (!searchCouponRst.Contains("\"success\":true") && !searchCouponRst.Contains("\"code\":0"))
{
var errmsg = BaseRegex.GetStringJson(ref searchCouponRst, "msg");
if (string.IsNullOrWhiteSpace(errmsg))
errmsg = searchCouponRst;
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = errmsg;
}));
continue;
}
if (searchCouponRst.Contains("\"code\":0"))
{
var totalNum = BaseRegex.GetStringJson(ref searchCouponRst, "totalNum");
Invoke(new Action(() =>
{
row.Cells["colCouponNum"].Value = totalNum;
}));
if (totalNum == "0")
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "商品无专属优惠券,跳过";
}));
continue;
}
try
{
var couponLst = JsonHelper.DeserializeJsonToList<WXCouponParam>(JsonHelper.JObjectParse(searchCouponRst)["coupons"].ToString());
string errMsg = "";
foreach (var coupon in couponLst)
{
var endRst = WxCoupon.WxEndCoupon(shop, coupon.couponKey.couponId.ParseToString());
Thread.Sleep(Randomx.GetId(100, 300));
if (!endRst.Contains("\"code\":0"))
{
var err = BaseRegex.GetStringJson(ref endRst, "msg");
if (string.IsNullOrWhiteSpace(err))
err = endRst;
errMsg += coupon.couponKey.couponId + " " + err + " \r\n";
continue;
}
var delRst = WxCoupon.WxDelCoupon(shop, coupon.couponKey.couponId.ParseToString());
Thread.Sleep(Randomx.GetId(100, 300));
if (!delRst.Contains("\"code\":0"))
{
var err = BaseRegex.GetStringJson(ref delRst, "msg");
if (string.IsNullOrWhiteSpace(err))
err = delRst;
errMsg += coupon.couponKey.couponId + " " + err + " \r\n";
continue;
}
}
if (!errMsg.IsNullOrEmpty())
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "作废删除失败 " + errMsg;
}));
}
else
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "作废删除成功";
}));
}
}
catch (Exception ex)
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "作废删除失败 优惠券格式转换失败";
}));
}
}
}
}
int? sortType = null;
private void cmbSaleSort_TextChanged(object sender, EventArgs e)
{
sortType = null;
if (cmbSaleSort.Text == "降序")
sortType = 6;
if (cmbSaleSort.Text == "升序")
sortType = 5;
}
private void btnSync_Click(object sender, EventArgs e)
{
var rowLst = dgvSelectProduct.Rows.Cast<DataGridViewRow>().Where(r => r.Cells["colCheck"].Value.ParseToBool() == true).ToList();
if (rowLst.Count <= 0)
{
BaseMsgForm.ShowError("请勾选需要操作的商品!");
return;
}
this.pbLoading.Visible = true;
cancellationTokenSource = new CancellationTokenSource();
dgvSelectProduct.Columns["colCouponNum"].Visible = false;
Task.Run(() =>
{
SyncProd(rowLst);
Invoke(new Action(() =>
{
if(cancellationTokenSource.IsCancellationRequested)
{
this.statusBar.lblTaskStatus.Text = "商品同步中断";
BaseMsgForm.ShowInfo("商品同步中断");
}
else
{
this.statusBar.lblTaskStatus.Text = "商品同步完毕";
BaseMsgForm.ShowInfo("商品同步完毕");
}
this.pbLoading.Visible = false;
}));
}, cancellationTokenSource.Token);
}
void SyncProd(List<DataGridViewRow> rowLst)
{
Invoke(new Action(() =>
{
this.pbLoading.Visible = true;
this.statusBar.lblTaskStatus.Text = "正在同步" + "...".Substring(0, DateTime.Now.Second % 4);
this.statusBar.pgbTaskProgress.Maximum = rowLst.Count;
this.statusBar.UpdateProgressBar(0);
}));
while(rowLst.Count > 0)
{
if (cancellationTokenSource.IsCancellationRequested)
break;
var r0 = rowLst.FirstOrDefault();
var shopId = r0.Cells["colSupplierId"].Value.ParseToString();
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId);
var rowLstTmp = rowLst.Where(r => r.Cells["colSupplierId"].Value.ParseToString() == shopId).Take(50).ToList();
foreach(var r in rowLstTmp)
{
rowLst.Remove(r);
Invoke(new Action(() =>
{
this.statusBar.lblTaskStatus.Text = "正在同步" + "...".Substring(0, DateTime.Now.Second % 4);
this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1);
r.Cells["colOpResult"].Value = "";
}));
}
if (shop == null)
{
Invoke(new Action(() =>
{
foreach (var r in rowLstTmp)
{
r.Cells["colOpResult"].Value = "店铺不存在";
}
}));
continue;
}
if (shop.LoginStatus != "登录成功")
{
Invoke(new Action(() =>
{
foreach (var r in rowLstTmp)
{
r.Cells["colOpResult"].Value = "店铺掉线";
}
}));
continue;
}
List<string> prodIdLst = new List<string>();
List<string> extCodeLst = new List<string>();
foreach (var row in rowLstTmp)
{
var prodId = row.Cells["colDraftId"].Value.ParseToString();
var extCode = row.Cells["colExtCode"].Value.ParseToString();
prodIdLst.Add(prodId);
extCodeLst.Add(extCode);
}
// 查询商品库有没有
var url = BaseClass.BuildPDDObjString("product/get_product_spu_id_list");
Thread.Sleep(500);
var data = UserLogin.GetSignaturex();
data += "&search_secret_spu_ids=" + string.Join(",", extCodeLst.Distinct());
data += "&wx_safe_status=" + "安全商品,未校验";
var result = GetHtml.PostUtf8(url, data);
if (!result.Contains("\"code\":200"))
result = GetHtml.PostUtf8(url, data);
if (!result.Contains("\"code\":200"))
{
var errMsg = BaseRegex.GetStringJson(ref result, "msg");
if (string.IsNullOrEmpty(errMsg))
errMsg = result;
Invoke(new Action(() =>
{
foreach (var row in rowLstTmp)
{
row.Cells["colOpResult"].Value = "查询商品错误:" + errMsg;
}
}));
continue;
}
List<KJDDBProduct> complateDbProdExistLst = JsonHelper.DeserializeJsonToList<KJDDBProduct>(JsonHelper.JObjectParse(result)["data"].ParseToString());
foreach (var row in rowLstTmp)
{
var extCode = row.Cells["colExtCode"].Value.ParseToString();
// 是否是库存商品
var needDownProdLst = complateDbProdExistLst.Where(pe => pe.secret_spu_id == extCode).ToList();
if (needDownProdLst.Count == 0)
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "数据库内没有找到该商品,跳过回采";
}));
continue;
}
else
{
if (needDownProdLst.Count > 0)
{
}
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "正在回采商品";
}));
Thread.Sleep(200);
var prodId = row.Cells["colDraftId"].Value.ParseToString();
var getEditProdRst = WXUpload.getEditProductV2(shop, prodId);
Thread.Sleep(Randomx.GetId(50, 100));
if (getEditProdRst.Contains("biz magic invalid"))
{
WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false);
}
if (!getEditProdRst.Contains("\"success\":true"))
{
var errmsg = BaseRegex.GetStringJson(ref getEditProdRst, "msg");
if (string.IsNullOrWhiteSpace(errmsg))
errmsg = getEditProdRst;
if (shop.LoginStatus != "登录成功")
errmsg = "店铺掉线";
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = errmsg;
}));
continue;
}
try
{
WXGetEditProductInfoLite wxProdInfoLite = JsonHelper.DeserializeJsonToObject<WXGetEditProductInfoLite>(getEditProdRst);
var secret_spu_id = wxProdInfoLite.product.info.spuCode;
if (!string.IsNullOrWhiteSpace(secret_spu_id))
{
}
else
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "商品回采失败:外部编码采集失败,跳过";
}));
continue;
}
}
catch (Exception ex)
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "商品回采失败:" + ex.Message;
}));
continue;
}
//DateTime tickTime = DateTime.Now.AddSeconds(0 - Randomx.GetId(10, 30));
//int time1 = BaseClass.DateTimeToTimestampSeconds(tickTime) - Randomx.GetId(80, 150);
//int time2 = BaseClass.DateTimeToTimestampSeconds(tickTime);
//// 提交免审修改(实际生效接口)
//var listingAuditFreeRst = WXUpload.listingAuditFree(shop, productJson, prodId, time1, time2);
//System.Threading.Thread.Sleep(Randomx.GetId(150, 500));
//if (!listingAuditFreeRst.Contains("\"code\":0"))
//{
// var errmsg = BaseRegex.GetStringJson(ref listingAuditFreeRst, "msg");
// if (string.IsNullOrWhiteSpace(errmsg))
// errmsg = listingAuditFreeRst;
// if (errmsg.Contains("107232"))
// errmsg = "图片不清晰禁止操作";
// if (errmsg.Contains("9401083"))
// errmsg = "店铺处罚中禁止操作";
// if (getEditProdRst.Contains("biz magic invalid"))
// {
// WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false);
// Invoke(new Action(() =>
// {
// row.Cells["colOpResult"].Value = "店铺掉线";
// }));
// continue;
// }
// if (chkFailDownProd.Checked)
// {
// var downProd = WXPreSale.DownProd(shop, prodId);
// System.Threading.Thread.Sleep(Randomx.GetId(50, 100));
// if (downProd.Contains("\"code\":0"))
// {
// errmsg += " 商品同步失败 已下架";
// }
// else
// errmsg += " 商品同步失败 下架失败";
// }
// Invoke(new Action(() =>
// {
// row.Cells["colOpResult"].Value = errmsg;
// }));
// continue;
//}
var complateRst = "";
if (complateRst.Contains("\"code\":0"))
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "商品回采成功";
}));
}
}
}
}
}
}
}