商品预售/下架 改名 商品管理

增加本地搜索功能
This commit is contained in:
chfei committed 2026-11-04 18:21:11 +08:00
1 parent 09769d8d48
commit a95658cac6
5 files changed
+2070 -1951

No files matched your search

@@ -381,7 +381,7 @@ namespace TemuKJD.WXForms.AdminForms
this.lblShopPointsPerMonthUserId.Text = uid;
this.num_shop_renewal_platform_floor_fee.Value = AllUsers.FirstOrDefault(a => a.user_name == mobile)?.shop_renewal_platform_floor_fee ?? 0;
this.num_shop_renewal_platform_floor_fee.Value = AllUsers.FirstOrDefault(a => a.user_name == mobile)?.shop_renewal_platform_floor_fee ?? 5;
}
if (columName == "colChangePostagePerOrder")
{
File diff suppressed because it is too large. Load diff
+155 -105
View File
@@ -34,6 +34,30 @@ namespace TemuKJD.WXForms.ProductForms
{
public partial class WXProdPreSaleForm : BaseForm
{
private sealed class PreSaleProduct
{
public bool IsSelected { get; set; }
public string ShopId { get; set; }
public string ShopName { get; set; }
public string ProductId { get; set; }
public string ImageUrl { get; set; }
public string Title { get; set; }
public string PromotionLink { get; set; }
public string Category { get; set; }
public string ProductCode { get; set; }
public string SkuList { get; set; }
public string Price { get; set; }
public int SoldCount { get; set; }
public string Status { get; set; }
public string PreSale { get; set; }
public DateTime EditTime { get; set; }
public string OperationResult { get; set; }
}
private readonly List<PreSaleProduct> products = new List<PreSaleProduct>();
private readonly BindingList<PreSaleProduct> visibleProducts = new BindingList<PreSaleProduct>();
private string[] titleKeywords = new string[0];
int PageBegin = 1;
int PageEnd = 999;
string PreType = "";
@@ -115,7 +139,41 @@ namespace TemuKJD.WXForms.ProductForms
chkSelectAll.CheckedChanged += chkSelectAll_CheckedChanged;
//chkSelectAll.Checked = true;
this.dgvSelectProduct.AddSelectorColumn("colCheck");
dgvSelectProduct.AutoGenerateColumns = false;
colCheck.DataPropertyName = nameof(PreSaleProduct.IsSelected);
colSupplierId.DataPropertyName = nameof(PreSaleProduct.ShopId);
colSupplierName.DataPropertyName = nameof(PreSaleProduct.ShopName);
colDraftId.DataPropertyName = nameof(PreSaleProduct.ProductId);
colImgUrl.DataPropertyName = nameof(PreSaleProduct.ImageUrl);
colProductName.DataPropertyName = nameof(PreSaleProduct.Title);
colPromotionLink.DataPropertyName = nameof(PreSaleProduct.PromotionLink);
colProductCat.DataPropertyName = nameof(PreSaleProduct.Category);
colExtCode.DataPropertyName = nameof(PreSaleProduct.ProductCode);
colSkuMultiPrice.DataPropertyName = nameof(PreSaleProduct.SkuList);
colPrice.DataPropertyName = nameof(PreSaleProduct.Price);
colSoldNum.DataPropertyName = nameof(PreSaleProduct.SoldCount);
colMsg.DataPropertyName = nameof(PreSaleProduct.Status);
colPreSale.DataPropertyName = nameof(PreSaleProduct.PreSale);
colAddTime.DataPropertyName = nameof(PreSaleProduct.EditTime);
colOpResult.DataPropertyName = nameof(PreSaleProduct.OperationResult);
colAddTime.DefaultCellStyle.Format = "yy-MM-dd HH:mm";
colProductSkcPic.DefaultCellStyle.NullValue = DataGridViewExtension.defaultBitmap;
colLogin.Text = "登录";
colLogin.UseColumnTextForLinkValue = true;
colInShop.Text = "进店";
colInShop.UseColumnTextForLinkValue = true;
ColDelete.Text = "删除";
ColDelete.UseColumnTextForLinkValue = true;
dgvSelectProduct.RowTemplate.Height = 60;
dgvSelectProduct.CellFormatting += ProductCellFormatting;
dgvSelectProduct.DataSource = visibleProducts;
dgvSelectProduct.AddSelectorColumn("colCheck", column => column.AddHeaderCheckBox(
getValue: item => ((PreSaleProduct)item).IsSelected,
setValue: (item, value) =>
{
((PreSaleProduct)item).IsSelected = value;
dgvSelectProduct.InvalidateColumn(colCheck.Index);
}));
dgvSelectProduct.AddImgColumn("colProductSkcPic", "colImgUrl");
dgvSelectProduct.AddImgColumn("colSkuFakeImg", "colSkuFakeImgUrl");
@@ -650,7 +708,8 @@ namespace TemuKJD.WXForms.ProductForms
btnSearchProd.Enabled = false;
pbLoading.Visible = true;
cancellationTokenSource = new CancellationTokenSource();
dgvSelectProduct.Rows.Clear();
visibleProducts.Clear();
products.Clear();
Task.Run(() =>
{
GetProduct(shopIdLst);
@@ -749,8 +808,6 @@ namespace TemuKJD.WXForms.ProductForms
List<Task> tList = new List<Task>();
foreach (JObject prod in prodObjs["productList"])
{
string StatusStr = "";
int rowIndex = 0;
var pStr = JsonHelper.SerializeObject(prod);
var editTime = BaseClass.StampToDateTime(prod["editTime"].ParseToInt());
if (chkProdTime.Checked && editTime < dtpStartTime.Value)
@@ -758,114 +815,74 @@ namespace TemuKJD.WXForms.ProductForms
istTimeOver = true;
break;
}
var prices = prod["skuList"]?.Select(sk => (decimal?)(sk["price"].ParseToDecimal() / 100));
var StatusStr = "其他";
if (prod["status"].ParseToInt() == 5)
StatusStr = "在售";
if (prod["status"].ParseToInt() == 11)
StatusStr = "下架";
if (prod["status"].ParseToInt() == 0)
{
StatusStr = "草稿箱";
if (prod["editStatus"].ParseToInt() == 3)
StatusStr = "审核待处理";
}
if (prod["status"].ParseToInt() == 6)
StatusStr = "回收站";
var Limit1 = pStr.Contains("同款/高度相似商品") ? "\r\n上架相似品" : "";
var Limit2 = BaseRegex.GetStringJson(ref pStr, "secondLevelLabelName").ParseToString().Length > 0 ? "\r\n低风险规则上架" : "";
StatusStr += Limit1 + Limit2;
var product = new PreSaleProduct
{
ShopId = shop.ShopId,
ShopName = shop.ShopAccount,
ProductId = prod["productId"].ParseToString(),
ImageUrl = prod["headImg"].ParseToString(),
Title = prod["title"].ParseToString(),
Category = prod["recommendCategory"].IsJTokenNullOrEmpty() || prod["recommendCategory"]["categoryNames"].IsJTokenNullOrEmpty()
? "" : string.Join(" >> ", prod["recommendCategory"]["categoryNames"].Select(s => s.ParseToString())),
ProductCode = prod["spuCode"].ParseToString(),
SkuList = prod["skuList"].ParseToString(),
Price = prices?.Min() + " - " + prices?.Max(),
SoldCount = prod["soldNum"].ParseToInt(),
Status = StatusStr,
PreSale = prod["presaleTag"].ParseToInt() == 1 ? "[预售]" : "",
EditTime = editTime
};
Invoke(new Action(() =>
{
decimal? minPrice = prod["skuList"]?.Min(sk => sk["price"].ParseToDecimal() / 100);
decimal? maxPrice = prod["skuList"]?.Max(sk => sk["price"].ParseToDecimal() / 100);
var prodId = prod["productId"].ParseToString();
if (dgvSelectProduct.Rows.Cast<DataGridViewRow>().Any(r => r.Cells["colDraftId"].ParseToString() == prodId))
{
}
StatusStr = "其他";
if (prod["status"].ParseToInt() == 5)
StatusStr = "在售";
if (prod["status"].ParseToInt() == 11)
StatusStr = "下架";
if (prod["status"].ParseToInt() == 0)
{
StatusStr = "草稿箱";
if (prod["editStatus"].ParseToInt() == 3)
StatusStr = "审核待处理";
}
if (prod["status"].ParseToInt() == 6)
StatusStr = "回收站";
var Limit1 = pStr.Contains("同款/高度相似商品") ? "\r\n上架相似品" : "";
//var Limit2 = BaseRegex.GetStringJson(ref pStr, "secondLevelLabelName").ParseToString().Length > 0 ? "\r\n命中低风险规则上架" : "";
var Limit2 = BaseRegex.GetStringJson(ref pStr, "secondLevelLabelName").ParseToString().Length > 0 ? "\r\n低风险规则上架" : "";
StatusStr += Limit1 + Limit2;
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(),
prod["skuList"].ParseToString(),
//prod["price"].ParseToDecimal() * 0.01m,
"" + minPrice + " - " + maxPrice,
prod["soldNum"].ParseToInt(),
StatusStr,
prod["presaleTag"].ParseToInt() == 1 ? "[预售]" : "",
"", // 备注
"",
"删除",
editTime.ToString("yy-MM-dd HH:mm"),
"");
dgvSelectProduct.Rows[rowIndex].Height = 60;
Color color = Color.Red;
if (dgvSelectProduct.Rows[rowIndex].Cells["colMsg"].Value.ParseToString() == "在售")
color = Color.Blue;
if (dgvSelectProduct.Rows[rowIndex].Cells["colMsg"].Value.ParseToString() == "下架")
color = Color.Purple;
if (dgvSelectProduct.Rows[rowIndex].Cells["colMsg"].Value.ParseToString() == "草稿箱")
color = Color.DarkOrange;
if (dgvSelectProduct.Rows[rowIndex].Cells["colMsg"].Value.ParseToString() == "回收站")
color = Color.Gray;
dgvSelectProduct.Rows[rowIndex].Cells["colMsg"].Style.ForeColor = color;
dgvSelectProduct.Rows[rowIndex].Cells["colPreSale"].Style.ForeColor = dgvSelectProduct.Rows[rowIndex].Cells["colPreSale"].Value.ParseToString().Contains("预售") ? Color.Green : Color.Blue;
products.Add(product);
if (MatchesTitle(product))
visibleProducts.Add(product);
}));
// 获取商品链接
if (StatusStr.ParseToString().StartsWith("在售") && chkSearchPromotionLink.Checked == true)
{
bool useShortLink = (bool)Invoke(new Func<bool>(() => comboBox1.Text == "短链"));
var t = Task.Run(() =>
{
var PromotionRst = WXProdNoCheckEditHelper.GetPromotionLink(shop, prod["productId"].ParseToString(), page);
Thread.Sleep(Randomx.GetId(50, 150));
string link;
if (PromotionRst.ParseToString().Contains("\"code\":0"))
{
var shareUrl = BaseRegex.GetStringJson(ref PromotionRst, "shareUrl");
var shortLink = BaseRegex.GetStringJson(ref PromotionRst, "shortLink");
if (!string.IsNullOrEmpty(shareUrl))
{
Invoke(new Action(() =>
{
if (comboBox1.Text == "短链")
dgvSelectProduct.Rows[rowIndex].Cells["colPromotionLink"].Value = shortLink;
else
dgvSelectProduct.Rows[rowIndex].Cells["colPromotionLink"].Value = shareUrl;
}));
}
else
{
Invoke(new Action(() =>
{
dgvSelectProduct.Rows[rowIndex].Cells["colPromotionLink"].Value = "链接获取失败";
}));
}
link = string.IsNullOrEmpty(shareUrl) ? "链接获取失败" : useShortLink ? shortLink : shareUrl;
}
else
{
var errMsg = BaseRegex.GetStringJsonByRegs(ref PromotionRst, PromotionRst, "errMsg", "errorMsg", "err_msg", "error_msg", "errormsg");
Invoke(new Action(() =>
{
dgvSelectProduct.Rows[rowIndex].Cells["colPromotionLink"].Value = errMsg;
}));
link = BaseRegex.GetStringJsonByRegs(ref PromotionRst, PromotionRst, "errMsg", "errorMsg", "err_msg", "error_msg", "errormsg");
}
Invoke(new Action(() =>
{
product.PromotionLink = link;
int index = visibleProducts.IndexOf(product);
if (index >= 0)
visibleProducts.ResetItem(index);
}));
});
tList.Add(t);
while (tList.Count >= 5)
@@ -893,18 +910,11 @@ namespace TemuKJD.WXForms.ProductForms
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)
foreach (var product in visibleProducts.Where(p => p.IsSelected).ToList())
{
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);
}
products.Remove(product);
visibleProducts.Remove(product);
}
//NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_select_upload_draft_products", upload_draft_product_lst);
}
private void btnClearFilter_Click(object sender, EventArgs e)
@@ -2088,9 +2098,49 @@ namespace TemuKJD.WXForms.ProductForms
{
}
}
private bool MatchesTitle(PreSaleProduct product)
{
return titleKeywords.Length == 0 || titleKeywords.Any(keyword =>
product.Title.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) >= 0);
}
public class WXProdNoCheckEditHelper
private void btn_prodFilter_Click(object sender, EventArgs e)
{
// 批量操作持有表格行,执行期间保留当前视图。
if (pbLoading.Visible)
{
BaseMsgForm.ShowInfo("请等待当前任务完成后再过滤商品!");
return;
}
titleKeywords = txt_filter_keywrods.Text
.Split(new[] { '\r', '\n', ',', ',', ';', ';' }, StringSplitOptions.RemoveEmptyEntries)
.Select(keyword => keyword.Trim())
.Where(keyword => keyword.Length > 0)
.ToArray();
visibleProducts.Clear();
foreach (var product in products.Where(MatchesTitle))
visibleProducts.Add(product);
}
private void ProductCellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == colMsg.Index)
{
switch (e.Value as string)
{
case "在售": e.CellStyle.ForeColor = Color.Blue; break;
case "下架": e.CellStyle.ForeColor = Color.Purple; break;
case "草稿箱": e.CellStyle.ForeColor = Color.DarkOrange; break;
case "回收站": e.CellStyle.ForeColor = Color.Gray; break;
default: e.CellStyle.ForeColor = Color.Red; break;
}
}
else if (e.ColumnIndex == colPreSale.Index)
e.CellStyle.ForeColor = e.Value as string == "[预售]" ? Color.Green : Color.Blue;
}
}
public class WXProdNoCheckEditHelper
{
public static List<string> LastName { get; set; } = new List<string>()
{
+3 -3
View File
@@ -32,7 +32,7 @@
System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("云端数据");
System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("我的商品库");
System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("云端收藏");
System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("商品预售/下架");
System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("商品管理");
System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("云仓退货地址");
System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("清理无流量");
System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("爆单神器");
@@ -157,8 +157,8 @@
treeNode3.Text = "我的商品库";
treeNode4.Name = "云端收藏";
treeNode4.Text = "云端收藏";
treeNode5.Name = "商品预售/下架";
treeNode5.Text = "商品预售/下架";
treeNode5.Name = "商品管理";
treeNode5.Text = "商品管理";
treeNode6.Name = "云仓退货地址";
treeNode6.Text = "云仓退货地址";
treeNode7.Name = "清理无流量";
@@ -113,7 +113,7 @@ namespace TemuKJD.WXForms.ProductForms
case "云端收藏":
SetForm(cloudgoodsFavoriteForm.Value);
break;
case "商品预售/下架":
case "商品管理":
SetForm(wxProdPreSaleForm.Value);
break;
case "云仓退货地址":