Files
KJD/TEMUKJD/WXForms/ProductForms/WXProdSyncForm.cs
T

1233 lines
56 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;
namespace TemuKJD.WXForms.ProductForms
{
public partial class WXProdSyncForm : 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;
public Dictionary<string, bool> dicCheckedShopId = new Dictionary<string, bool>();
public string pdd_product_cates = "";
public WXProdSyncForm()
{
InitializeComponent();
}
private void UserSelectDbProductForm_Load(object sender, EventArgs e)
{
this.splitContainer1.Dock = DockStyle.Fill;
dicCheckedShopId = NaiBa.Util.Helper.ConfigHelper.LoadConfig<Dictionary<string, bool>>("wx_checked_shop_dic");
if (dicCheckedShopId == null)
dicCheckedShopId = new Dictionary<string, bool>();
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 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();
pbLoadingShop.Visible = false;
}
private void UserSelectDbProductForm_VisibleChanged(object sender, EventArgs e)
{
if (Visible == true)
{
RefreshShopLogin();
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();
foreach (var note in GlobalConfig.ShopLoginList.Select(s => s.Notes).Where(s => !s.IsNullOrEmpty()).Distinct())
{
cmbFilterShopNotes.Items.Add(note);
}
cmbFilterShopGroup.Items.Clear();
foreach (var group in GlobalConfig.ShopLoginList.Select(s => s.GroupName).Where(s => !s.IsNullOrEmpty()).Distinct())
{
cmbFilterShopGroup.Items.Add(group);
}
}
private void BindShop(ShopLoginInfo shopEntity, List<string> selectShopId = null, string msg = "")
{
if (shopEntity == null)
return;
if (shopEntity.is_point_shop_expire)
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,
shopEntity.GroupName,
"选择商品",
canUse ? "在线" : "掉线",
GlobalConfig.lstWxShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shopEntity.ShopId)?.ExpiresTime > DateTime.Now.AddMinutes(5) ? "可用" : "过期",
canUse,
GlobalConfig.dicWxShopUploadInfo.ContainsKey(shopEntity.ShopId) ? GlobalConfig.dicWxShopUploadInfo[shopEntity.ShopId].DicDayUploadCount[day] : 0,
GlobalConfig.dicWxShopUploadInfo.ContainsKey(shopEntity.ShopId) ? GlobalConfig.dicWxShopUploadInfo[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["colGroup"].Value = shopEntity.GroupName;
row.Cells["colLoginStatus"].Value = canUse ? "在线" : "掉线";
row.Cells["colLoginStatus"].Style.ForeColor = canUse ? Color.Green : Color.Red;
row.Cells["colCanUse"].Value = canUse;
row.Cells["colApi"].Value = GlobalConfig.lstWxShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shopEntity.ShopId)?.ExpiresTime > DateTime.Now.AddMinutes(5) ? "可用" : "过期";
row.Cells["colRemaining"].Value = shopEntity.AddProductRemaining;
row.Cells["colUploadCount"].Value = GlobalConfig.dicWxShopUploadInfo.ContainsKey(shopEntity.ShopId) ? GlobalConfig.dicWxShopUploadInfo[shopEntity.ShopId].DicDayUploadCount[day] : 0;
row.Cells["colOnSaleNum"].Value = GlobalConfig.dicWxShopUploadInfo.ContainsKey(shopEntity.ShopId) ? GlobalConfig.dicWxShopUploadInfo[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();
WXShopListForm.Instance.CheckShopLogin(new string[] { shop.LoginName }, false);
WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop);
//shopLoginForm.prodUserSelectForm = this;
if (shop.LoginStatus != "登录成功")
{
shopLoginForm.openType = EnumOpenType.login;
shopLoginForm.ShowDialog();
RefreshShopLogin();
}
else
{
shopLoginForm.openType = EnumOpenType.manage;
shopLoginForm.WindowState = FormWindowState.Maximized;
shopLoginForm.Show();
}
}
break;
case "colApi":
{
WXShopLoginForm shopLoginForm = new WXShopLoginForm(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 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 "登录":
{
WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop);
//shopLoginForm.prodUserSelectForm = this;
shopLoginForm.openType = EnumOpenType.login;
shopLoginForm.ShowDialog();
RefreshShopLogin();
}
break;
case "进店":
{
WXShopLoginForm shopLoginForm = new WXShopLoginForm(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 "上传商品Id":
//if (!string.IsNullOrEmpty(draftId) && shop != null)
//{
// ShopLoginForm shopLoginForm = new ShopLoginForm(shop);
// shopLoginForm.InitUrl = "https://seller.kuajingmaihuo.com/goods/product-create/product-edit?productDraftId=" +
// draftId + "&from=productDraftList";
// shopLoginForm.openType = EnumOpenType.manage;
// shopLoginForm.WindowState = FormWindowState.Maximized;
// shopLoginForm.ShowDialog();
//}
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 = WXProdNoCheckEditHelper.scanProductPreview(shop, page, nextKey, pageSize);
else
getProdOnSaleRst = WXProdNoCheckEditHelper.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)
{
string notes = cmbFilterShopNotes.Text.Trim().Trim(';');
if (notes == "全部")
notes = "";
List<string> notesLst = notes.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
string group = cmbFilterShopGroup.Text.Trim().Trim(';');
if (group == "全部")
group = "";
List<string> groupLst = group.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
foreach (DataGridViewRow row in dgvShop.Rows)
{
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;
}
if (!string.IsNullOrWhiteSpace(group) && !groupLst.Contains(row.Cells["colGroup"].Value.ParseToString()))
{
row.Visible = false;
row.Cells["colSelect"].Value = false;
continue;
}
row.Visible = true;
}
}
private void btnEmptyShop_Click(object sender, EventArgs e)
{
txtFilterShopName.Text = "";
cmbFilterShopNotes.Text = "全部";
cmbFilterShopGroup.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 = cmbFilterShopNotes.Text.Trim().Trim(';');
if (notes == "全部")
notes = "";
List<string> notesLst = notes.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
string group = cmbFilterShopGroup.Text.Trim().Trim(';');
if (group == "全部")
group = "";
List<string> groupLst = group.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
foreach (DataGridViewRow row in dgvShop.Rows)
{
if (row.Visible == false)
continue;
if (!row.Cells["colShopName"].Value.ParseToString().Contains(txtFilterShopName.Text.Trim()))
continue;
if (!string.IsNullOrWhiteSpace(notes) && !notesLst.Contains(row.Cells["colShopNotes"].Value.ParseToString()))
continue;
if (!string.IsNullOrWhiteSpace(group) && !groupLst.Contains(row.Cells["colGroup"].Value.ParseToString()))
continue;
row.Cells["colSelect"].Value = true;
}
}
private void btnAddUnSelect_Click(object sender, EventArgs e)
{
string notes = cmbFilterShopNotes.Text.Trim().Trim(';');
if (notes == "全部")
notes = "";
List<string> notesLst = notes.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
string group = cmbFilterShopGroup.Text.Trim().Trim(';');
if (group == "全部")
group = "";
List<string> groupLst = group.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
foreach (DataGridViewRow row in dgvShop.Rows)
{
if (row.Visible == false)
continue;
if (!row.Cells["colShopName"].Value.ParseToString().Contains(txtFilterShopName.Text.Trim()))
continue;
if (!string.IsNullOrWhiteSpace(notes) && !notesLst.Contains(row.Cells["colShopNotes"].Value.ParseToString()))
continue;
if (!string.IsNullOrWhiteSpace(group) && !groupLst.Contains(row.Cells["colGroup"].Value.ParseToString()))
continue;
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 txtPageBegin_TextChanged(object sender, EventArgs e)
{
PageEnd = txtPageBegin.Text.ParseToInt();
}
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.IsNullOrEmpty() ? "emptyProdId" : prodId);
extCodeLst.Add(extCode.IsNullOrEmpty() ? "emptyExtCode" : extCode);
}
// 查询下架库有没有
string url = BaseClass.BuildPDDObjString("product/get_prod_down_sku_lst_by_sku_codes");
Thread.Sleep(500);
string data = UserLogin.GetSignaturex();
data += "&search_secret_spu_ids=" + string.Join(",", extCodeLst.Distinct());
//data += "&search_sku_codes=" + string.Join(",", skuExtCodeLst.Distinct());
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<JSTDownProdSkuInfo> downSkuExistLst = JsonHelper.DeserializeJsonToList<JSTDownProdSkuInfo>(JsonHelper.JObjectParse(result)["data"].ParseToString());
// 查询作废库有没有
url = BaseClass.BuildPDDObjString("product/get_product_spu_id_list");
Thread.Sleep(500);
data = UserLogin.GetSignaturex();
data += "&search_secret_spu_ids=" + string.Join(",", extCodeLst.Distinct());
data += "&wx_safe_status=" + "违规商品";
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> downDbProdExistLst = JsonHelper.DeserializeJsonToList<KJDDBProduct>(JsonHelper.JObjectParse(result)["data"].ParseToString());
foreach (var row in rowLstTmp)
{
var extCode = row.Cells["colExtCode"].Value.ParseToString();
// 下架sku
var needDownSkuLst = downSkuExistLst.Where(se => se.secret_spu_id == extCode).ToList();
// 违规商品
var needDownProdLst = downDbProdExistLst.Where(pe => pe.secret_spu_id == extCode).ToList();
if (needDownSkuLst.Count == 0 && 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(100);
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;
}
string productJson = "";
try
{
// 获取免审编辑回传数据
JObject jObjTmp = JsonHelper.JObjectParse(getEditProdRst);
//jObjTmp["product"]["deliverInfo"]["skuDeliverInfo"]["fullPaymentPresaleDeliveryTime"] = chkPreSale.Checked ? txtPreDays.Text.Trim().ParseToInt() : 0;
//jObjTmp["product"]["deliverInfo"]["deliverType"] = chkPreSale.Checked ? 1 : 0;
//jObjTmp["product"]["info"]["presaleTag"] = chkPreSale.Checked ? 1 : 0;
//jObjTmp["product"]["info"]["presaleTagType"] = chkPreSale.Checked ? 1 : 0;
bool needSync = false;
foreach (var jSku in jObjTmp["product"]["productSkus"])
{
var jSkuStr = jSku.ParseToString();
var itemCode = jSku["productSkuInfo"]?["skuCode"].ParseToString();
var needDownSku = downSkuExistLst.FirstOrDefault(se =>se.secret_spu_id == extCode && se.secret_sku_id == itemCode);
if (needDownSku != null || needDownProdLst.Count > 0)
{
if (//jSku["productSkuInfo"]["stockInfo"]["stockNum"].ParseToString() != "0" ||
jSku["productSkuInfo"]["stockInfo"]["totalNum"].ParseToString() != "0" ||
jSku["productSkuInfo"]["realStockInfo"]["stockNum"].ParseToString() != "0" ||
jSku["productSkuInfo"]["realStockInfo"]["totalNum"].ParseToString() != "0")
{
jSku["productSkuInfo"]["stockInfo"]["stockNum"] = "0";
jSku["productSkuInfo"]["stockInfo"]["totalNum"] = "0";
jSku["productSkuInfo"]["realStockInfo"]["stockNum"] = "0";
jSku["productSkuInfo"]["realStockInfo"]["totalNum"] = "0";
needSync = true;
}
}
}
productJson = JsonHelper.SerializeObject(jObjTmp);
if (!needSync)
{
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 = WXProdNoCheckEditHelper.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;
}
if (listingAuditFreeRst.Contains("\"code\":0"))
{
Invoke(new Action(() =>
{
row.Cells["colOpResult"].Value = "商品同步成功";
}));
}
}
}
}
}
}
}