商品预售/下架 改名 商品管理
增加本地搜索功能
This commit is contained in:
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")
|
||||
{
|
||||
|
||||
+1910
-1841
File diff suppressed because it is too large.
Load diff
@@ -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
@@ -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 "云仓退货地址":
|
||||
|
||||
Reference in new issue
Block a user