From 5467acadc083196c792670b748da75bdc0adf6e3 Mon Sep 17 00:00:00 2001 From: wule_5900x Date: Sun, 28 Jun 2026 21:05:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=95=86=E5=93=81=E6=94=B9?= =?UTF-8?q?=E4=BB=B7=E5=9B=9E=E6=BB=9A=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=9B=BE=E4=B9=A6=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AllBase/BaseClass.cs | 2 +- .../KJD_WebService/KJD_WebService.csproj.user | 2 +- .../OrderForms/WXOrderListOptimizeForm.cs | 1 + .../ProductForms/WXDBProdUploadForm.cs | 155 +++++++-- .../WXProdPreSaleForm.Designer.cs | 154 +++++---- .../WXForms/ProductForms/WXProdPreSaleForm.cs | 299 +++++++++++++++--- .../ProductForms/WXProdPreSaleForm.resx | 3 + 7 files changed, 476 insertions(+), 140 deletions(-) diff --git a/AllBase/BaseClass.cs b/AllBase/BaseClass.cs index 8991970..7a2b7f2 100644 --- a/AllBase/BaseClass.cs +++ b/AllBase/BaseClass.cs @@ -27,7 +27,7 @@ namespace AllBase /// /// 版本ID /// - public static int VersionCount = 1192; + public static int VersionCount = 1195; public static string MainPath = "29wx"; //public static string MainPath = "29wx"; //public static string MainPath = "29pdd"; diff --git a/KJDService/KJD_WebService/KJD_WebService.csproj.user b/KJDService/KJD_WebService/KJD_WebService.csproj.user index 1b87364..4bcdc04 100644 --- a/KJDService/KJD_WebService/KJD_WebService.csproj.user +++ b/KJDService/KJD_WebService/KJD_WebService.csproj.user @@ -8,7 +8,7 @@ - Debug|Any CPU + Release|Any CPU ShowAllFiles diff --git a/TEMUKJD/WXForms/OrderForms/WXOrderListOptimizeForm.cs b/TEMUKJD/WXForms/OrderForms/WXOrderListOptimizeForm.cs index 7093470..b6f9096 100644 --- a/TEMUKJD/WXForms/OrderForms/WXOrderListOptimizeForm.cs +++ b/TEMUKJD/WXForms/OrderForms/WXOrderListOptimizeForm.cs @@ -54,6 +54,7 @@ namespace TemuKJD.WXForms.OrderForms { var error = BaseRegex.GetStringJsonByRegs(ref getProdOnSaleRst, getProdOnSaleRst, "err_msg", "error_msg", "errMsg", "errorMsg", "msg"); BaseMsgForm.ShowInfo("改价失败" + error); + return; } prodObj = JsonHelper.JObjectParse(getProdOnSaleRst)["productList"].FirstOrDefault() as JObject; if (prodObj != null) diff --git a/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs b/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs index db41490..2aee728 100644 --- a/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs +++ b/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs @@ -3163,10 +3163,10 @@ namespace TemuKJD.WXForms.ProductForms foreach (var wxEditCategoryParam in wxEditPropParam.categorys) { // 修改书名 - //if (wxEditPropParam.categorys.FirstOrDefault().name == "书名" && wxEditCategoryParam == wxEditPropParam.categorys.LastOrDefault()) - //{ - // wxEditCategoryParam.name = prodTitle; - //} + if (wxEditPropParam.categorys.FirstOrDefault().name == "书名" && wxEditCategoryParam == wxEditPropParam.categorys.LastOrDefault()) + { + wxEditCategoryParam.name = prodTitle; + } var wxCategoryParam = new categoryPropParam() { catType = wxEditCategoryParam.catType, @@ -3320,14 +3320,15 @@ namespace TemuKJD.WXForms.ProductForms if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") { // 修改书名 作者 - //if (attr.name == "书名" /*&& dbProd.product_get_type_text == "微信小店"*/) - //{ - // attrValue = prodTitle; - //} - //if (attr.name == "作者" && attrValue == "无") - //{ - // attrValue = new List() { "赵老师", "钱老师", "孙老师", "李老师", "周老师", "吴老师", "郑老师", "王老师", "张老师", "孙老师", "刘老师" }.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); - //} + if (attr.name == "书名" /*&& dbProd.product_get_type_text == "微信小店"*/) + { + attrValue = prodTitle; + } + if (attr.name == "作者" && attrValue == "无") + { + attrValue = new List() { "赵老师", "钱老师", "孙老师", "李老师", "周老师", "吴老师", "郑老师", "王老师", "张老师", "孙老师", "刘老师" }.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); + attrValue = "无"; + } if (attrValue.IsNullOrEmpty() && attr.type == "integer_unit" && (propInfo.values.FirstOrDefault()?.value).IsNumber()) { @@ -3603,7 +3604,10 @@ namespace TemuKJD.WXForms.ProductForms if (attr.name == "出版社名称") attrValue = new List() { "技术出版社", "文化出版社", "美术出版社" }[Randomx.GetId(3)]; if (attr.name == "作者") + { attrValue = new List() { "赵老师", "钱老师", "孙老师", "李老师", "周老师", "吴老师", "郑老师", "王老师", "张老师", "孙老师", "刘老师" }.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); + attrValue = "无"; + } if (attr.name == "包装") attrValue = "平装"; if (attr.name == "出版时间") @@ -3723,6 +3727,19 @@ namespace TemuKJD.WXForms.ProductForms wxPropParam.categorys.Add(wxCategoryParam1); wxPropParam.categorys.Add(wxCategoryParam2); } + if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") + { + foreach (var param in upProdParam.product.info.param.ToList()) + { + if (param.categorys.FirstOrDefault()?.name == "作者" && param.categorys.LastOrDefault()?.name == "无") + { + param.categorys.LastOrDefault().name = upProdParam.product.info.param.FirstOrDefault(p => p.categorys.FirstOrDefault()?.name == "出版社名称")?.categorys?.LastOrDefault()?.name; + if (param.categorys.LastOrDefault().name.IsNullOrEmpty()) + param.categorys.LastOrDefault().name = "无"; + break; + } + } + } #endregion #region sku规格属性 @@ -4160,7 +4177,7 @@ namespace TemuKJD.WXForms.ProductForms } } // 微信店采直接复制 - else if (dbProd.product_get_type_text == "微信店采") //&& upProdParam.product.info.category.FirstOrDefault()?.name != "图书") + else if (dbProd.product_get_type_text == "微信店采" && upProdParam.product.info.category.FirstOrDefault()?.name != "图书") { upProdParam.product.info.qualificationList.Clear(); if (wxEditProdInfo.product?.info?.qualificationList?.Count > 0) @@ -4198,9 +4215,10 @@ namespace TemuKJD.WXForms.ProductForms } string publisher = "出版社名称:" + new List() { "技术出版社", "文化出版社", "美术出版社" }[Randomx.GetId(3)]; - string isbn = "ISBN:"; - string bookName = "书名:"; - //string bookName = "图书名称:"; + //string isbn = "ISBN:"; + string isbn = "ISBN/CN刊号:"; + //string bookName = "书名:"; + string bookName = "图书名称:"; string bookPrice = "定价:" + upProdParam.product.productSkus.Max(s => s.productSkuInfo.salePrice) * 0.01; string author = "作者:王老师"; string publishTime = "出版时间:" + DateTime.Now.AddMonths(-3).ToString("yyyy年MM月dd日"); @@ -4212,10 +4230,20 @@ namespace TemuKJD.WXForms.ProductForms if (propParam.categorys[0].name.Contains("出版社名称")) publisher = "出版社名称:" + propParam.categorys[1].name; else if (propParam.categorys[0].name.Contains("ISBN版号/CN刊号")) - isbn = "ISBN:" + propParam.categorys[1].name; + { + //isbn = "ISBN:" + propParam.categorys[1].name; + isbn = "ISBN/CN刊号:" + propParam.categorys[1].name; + if (propParam.categorys[1].name.Length == 13) + { + var isbnStr = propParam.categorys[1].name; + isbn = "ISBN/CN刊号:" + isbnStr[0] + isbnStr[1] + isbnStr[2] + "-" + isbnStr[3] + "-" + isbnStr[4] + isbnStr[5] + isbnStr[6] + isbnStr[7] + "-" + isbnStr[8] + isbnStr[9] + isbnStr[10] + isbnStr[11] + "-" + isbnStr[12]; + } + } else if (propParam.categorys[0].name.Contains("书名")) - //bookName = "图书名称:" + propParam.categorys[1].name; - bookName = "书名:" + propParam.categorys[1].name; + { + //bookName = "书名:" + propParam.categorys[1].name; + bookName = "图书名称:" + propParam.categorys[1].name; + } else if (propParam.categorys[0].name.Contains("定价")) { //bookPrice = "定价:" + propParam.categorys[1].name; @@ -4240,17 +4268,58 @@ namespace TemuKJD.WXForms.ProductForms edition + "\r\n" + "\r\n" + binding; - var bookImg = new Bitmap(800, 800); + int imgW = 800; int imgH = 800; int textImgH = 0; + string getImgError; + var img_url = upProdParam.product.info.headImg[0]; + if (!img_url.Contains("wst.wxapp.tc.qq.com") && !img_url.Contains("mmecimage.cn")) + img_url = img_url.Replace("https://", "http://"); + var imageMain = GetHtml.GetUrlImg(img_url, out getImgError); + if (imageMain == null) + imageMain = new Bitmap(800, 800); + using (Bitmap bitmap = new Bitmap(1, 1)) // 尺寸不重要,只是为了使用Graphics对象 + using (Graphics g = Graphics.FromImage(bitmap)) // 获取Graphics对象 + { + // 定义字体 + Font font = new Font("微软雅黑", 16, FontStyle.Regular); + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + // 定义要测量的字符串 + string text = bookStr; + // 测量字符串大小 + SizeF size = g.MeasureString(text, font, imgW - 120); + // 输出高度信息 + //Console.WriteLine("Text Height: " + size.Height); + textImgH = size.Height.ParseToInt() + 180; + } + + //var bookImg = new Bitmap(imgW, imgH); + //using (Graphics g = Graphics.FromImage(bookImg)) + //{ + // g.Clear(Color.White); + // //Font font = new Font("宋体", 15, FontStyle.Bold); + // //Font font = new Font("微软雅黑", 15, FontStyle.Regular); + // Font font = new Font("微软雅黑", 16, FontStyle.Regular); + // //Font font = new Font("宋体", 17, FontStyle.Bold); + // Brush textBrush = Brushes.Black; + // g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + // RectangleF rectF = new RectangleF(60, 80, imgW - 120, imgH - 180); + // g.DrawString(bookStr, font, textBrush, rectF); + //} + + // 绘制一张带主图的商品详情页 + var bookImg = new Bitmap(imgW, imgH + textImgH); using (Graphics g = Graphics.FromImage(bookImg)) { - g.Clear(Color.White); + g.Clear(Color.FromArgb(248, 239, 244)); + + g.DrawImage(imageMain, new Rectangle(0, 0, imgW, imgH), 0, 0, imageMain.Width, imageMain.Height, GraphicsUnit.Pixel); + //Font font = new Font("宋体", 15, FontStyle.Bold); - Font font = new Font("微软雅黑", 15, FontStyle.Regular); - //Font font = new Font("微软雅黑", 16, FontStyle.Regular); + //Font font = new Font("微软雅黑", 15, FontStyle.Regular); + Font font = new Font("微软雅黑", 18, FontStyle.Regular); //Font font = new Font("宋体", 17, FontStyle.Bold); Brush textBrush = Brushes.Black; g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - RectangleF rectF = new RectangleF(80, 80, 800 - 80, 800 - 80); + RectangleF rectF = new RectangleF(60, imgH + 80, imgW - 120, textImgH - 180); g.DrawString(bookStr, font, textBrush, rectF); } @@ -4260,6 +4329,44 @@ namespace TemuKJD.WXForms.ProductForms return locationStr; var location = BaseRegex.GetStringJson(ref locationStr, "Location"); upProdParam.product.info.qualificationList.Add(new qualificationParam() { qualificationId = "1111485", qualificationUrl = new List() { location }, }); + + #region 将资质图作为主图的最后一张。 + using (MemoryStream memoryStream = new MemoryStream()) + { + bookImg.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); + byte[] imageBytes = memoryStream.ToArray(); + var imgBase64 = Convert.ToBase64String(imageBytes); + + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + //upDate += "&is_file=true"; + //if (needAddRandomBlock || wantAddRandomBlock) + // upDate += "&random_code=true"; + upDate += "&img_url=" + location; + upDate += "&img_base64=" + imgBase64; + + var sTime = DateTime.Now; + var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在上传资质图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); + upProdParam.product.info.headImg = upProdParam.product.info.headImg.Take(8).ToList(); + upProdParam.product.info.headImg.Add(upImgUrl); + } + #endregion } #endregion diff --git a/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.Designer.cs b/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.Designer.cs index 0e7e4d4..2acaad9 100644 --- a/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.Designer.cs +++ b/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.Designer.cs @@ -32,15 +32,16 @@ namespace TemuKJD.WXForms.ProductForms private void InitializeComponent() { this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle7 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle8 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle(); System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle10 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle11 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle12 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle13 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle14 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle15 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle16 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle17 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle18 = new System.Windows.Forms.DataGridViewCellStyle(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.ucGroupBoxEx3 = new TemuKJD.UserComponent.UcGroupBoxEx(this.components); this.btnBatchRealDel = new DevComponents.DotNetBar.PanelEx(); @@ -124,6 +125,8 @@ namespace TemuKJD.WXForms.ProductForms this.pbLoading = new System.Windows.Forms.PictureBox(); this.chkTestNoAuditUpload = new TemuKJD.UserComponent.UcCheckBox(this.components); this.dgvSelectProduct = new TemuKJD.UserComponent.DataGridViewEx(); + this.splitContainer4 = new System.Windows.Forms.SplitContainer(); + this.statusBar = new TemuKJD.UserControls.StatusBarUserControl(); this.colCheck = new System.Windows.Forms.DataGridViewCheckBoxColumn(); this.colSelectId = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colSupplierId = new System.Windows.Forms.DataGridViewTextBoxColumn(); @@ -141,6 +144,7 @@ namespace TemuKJD.WXForms.ProductForms this.colPromotionLink = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colProductCat = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colExtCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colSkuMultiPrice = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colPrice = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colSoldNum = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colMsg = new System.Windows.Forms.DataGridViewTextBoxColumn(); @@ -150,8 +154,6 @@ namespace TemuKJD.WXForms.ProductForms this.ColDelete = new System.Windows.Forms.DataGridViewLinkColumn(); this.colAddTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colOpResult = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.splitContainer4 = new System.Windows.Forms.SplitContainer(); - this.statusBar = new TemuKJD.UserControls.StatusBarUserControl(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); @@ -491,7 +493,8 @@ namespace TemuKJD.WXForms.ProductForms this.btnRestorePrice.StyleMouseOver.BackColor1.Color = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(102)))), ((int)(((byte)(255))))); this.btnRestorePrice.StyleMouseOver.BackColor2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(102)))), ((int)(((byte)(255))))); this.btnRestorePrice.TabIndex = 854; - this.btnRestorePrice.Text = "批量设置价格"; + this.btnRestorePrice.Text = "批量还原价格"; + this.btnRestorePrice.Click += new System.EventHandler(this.btnRestorePrice_Click); // // label7 // @@ -1322,19 +1325,19 @@ namespace TemuKJD.WXForms.ProductForms // this.dgvShop.AllowUserToAddRows = false; this.dgvShop.AllowUserToDeleteRows = false; - dataGridViewCellStyle10.BackColor = System.Drawing.Color.WhiteSmoke; - this.dgvShop.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle10; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.WhiteSmoke; + this.dgvShop.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1; this.dgvShop.AutoRowNumber = true; this.dgvShop.BackgroundColor = System.Drawing.Color.White; this.dgvShop.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(126)))), ((int)(((byte)(255))))); - dataGridViewCellStyle11.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle11.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle11.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - dataGridViewCellStyle11.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle11.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle11.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle11.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dgvShop.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle11; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvShop.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle2; this.dgvShop.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dgvShop.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.colSelect, @@ -1503,19 +1506,19 @@ namespace TemuKJD.WXForms.ProductForms // this.dgvSelectProduct.AllowUserToAddRows = false; this.dgvSelectProduct.AllowUserToDeleteRows = false; - dataGridViewCellStyle12.BackColor = System.Drawing.Color.WhiteSmoke; - this.dgvSelectProduct.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle12; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.WhiteSmoke; + this.dgvSelectProduct.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle3; this.dgvSelectProduct.AutoRowNumber = true; this.dgvSelectProduct.BackgroundColor = System.Drawing.Color.White; this.dgvSelectProduct.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(126)))), ((int)(((byte)(255))))); - dataGridViewCellStyle13.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle13.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle13.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - dataGridViewCellStyle13.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle13.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle13.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle13.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dgvSelectProduct.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle13; + dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle4.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle4.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvSelectProduct.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle4; this.dgvSelectProduct.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dgvSelectProduct.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.colCheck, @@ -1535,6 +1538,7 @@ namespace TemuKJD.WXForms.ProductForms this.colPromotionLink, this.colProductCat, this.colExtCode, + this.colSkuMultiPrice, this.colPrice, this.colSoldNum, this.colMsg, @@ -1554,6 +1558,31 @@ namespace TemuKJD.WXForms.ProductForms this.dgvSelectProduct.TabIndex = 187; this.dgvSelectProduct.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvSelectProduct_CellContentClick); // + // splitContainer4 + // + this.splitContainer4.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer4.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer4.Location = new System.Drawing.Point(0, 0); + this.splitContainer4.Name = "splitContainer4"; + // + // splitContainer4.Panel1 + // + this.splitContainer4.Panel1.Controls.Add(this.statusBar); + this.splitContainer4.Size = new System.Drawing.Size(1346, 26); + this.splitContainer4.SplitterDistance = 1165; + this.splitContainer4.TabIndex = 3; + // + // statusBar + // + this.statusBar.BackColor = System.Drawing.Color.White; + this.statusBar.Dock = System.Windows.Forms.DockStyle.Fill; + this.statusBar.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.statusBar.Location = new System.Drawing.Point(0, 0); + this.statusBar.Margin = new System.Windows.Forms.Padding(0); + this.statusBar.Name = "statusBar"; + this.statusBar.Size = new System.Drawing.Size(1165, 26); + this.statusBar.TabIndex = 2; + // // colCheck // this.colCheck.Frozen = true; @@ -1580,8 +1609,8 @@ namespace TemuKJD.WXForms.ProductForms // // colSupplierName // - dataGridViewCellStyle14.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.colSupplierName.DefaultCellStyle = dataGridViewCellStyle14; + dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.colSupplierName.DefaultCellStyle = dataGridViewCellStyle5; this.colSupplierName.Frozen = true; this.colSupplierName.HeaderText = "店铺名称"; this.colSupplierName.Name = "colSupplierName"; @@ -1669,8 +1698,8 @@ namespace TemuKJD.WXForms.ProductForms // // colProductName // - dataGridViewCellStyle15.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.colProductName.DefaultCellStyle = dataGridViewCellStyle15; + dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.colProductName.DefaultCellStyle = dataGridViewCellStyle6; this.colProductName.HeaderText = "商品标题"; this.colProductName.Name = "colProductName"; this.colProductName.ReadOnly = true; @@ -1685,8 +1714,8 @@ namespace TemuKJD.WXForms.ProductForms // // colProductCat // - dataGridViewCellStyle16.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.colProductCat.DefaultCellStyle = dataGridViewCellStyle16; + dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.colProductCat.DefaultCellStyle = dataGridViewCellStyle7; this.colProductCat.HeaderText = "商品类目"; this.colProductCat.Name = "colProductCat"; this.colProductCat.ReadOnly = true; @@ -1699,8 +1728,17 @@ namespace TemuKJD.WXForms.ProductForms this.colExtCode.ReadOnly = true; this.colExtCode.Width = 145; // + // colSkuMultiPrice + // + this.colSkuMultiPrice.HeaderText = "sku价格序列"; + this.colSkuMultiPrice.Name = "colSkuMultiPrice"; + this.colSkuMultiPrice.ReadOnly = true; + this.colSkuMultiPrice.Visible = false; + // // colPrice // + dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.colPrice.DefaultCellStyle = dataGridViewCellStyle8; this.colPrice.HeaderText = "价格"; this.colPrice.Name = "colPrice"; this.colPrice.ReadOnly = true; @@ -1715,8 +1753,8 @@ namespace TemuKJD.WXForms.ProductForms // // colMsg // - dataGridViewCellStyle17.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.colMsg.DefaultCellStyle = dataGridViewCellStyle17; + dataGridViewCellStyle9.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.colMsg.DefaultCellStyle = dataGridViewCellStyle9; this.colMsg.HeaderText = "状态"; this.colMsg.Name = "colMsg"; this.colMsg.ReadOnly = true; @@ -1754,8 +1792,8 @@ namespace TemuKJD.WXForms.ProductForms // // colAddTime // - dataGridViewCellStyle18.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.colAddTime.DefaultCellStyle = dataGridViewCellStyle18; + dataGridViewCellStyle10.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.colAddTime.DefaultCellStyle = dataGridViewCellStyle10; this.colAddTime.HeaderText = "上架时间"; this.colAddTime.Name = "colAddTime"; this.colAddTime.ReadOnly = true; @@ -1768,31 +1806,6 @@ namespace TemuKJD.WXForms.ProductForms this.colOpResult.ReadOnly = true; this.colOpResult.Width = 240; // - // splitContainer4 - // - this.splitContainer4.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer4.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; - this.splitContainer4.Location = new System.Drawing.Point(0, 0); - this.splitContainer4.Name = "splitContainer4"; - // - // splitContainer4.Panel1 - // - this.splitContainer4.Panel1.Controls.Add(this.statusBar); - this.splitContainer4.Size = new System.Drawing.Size(1346, 26); - this.splitContainer4.SplitterDistance = 1165; - this.splitContainer4.TabIndex = 3; - // - // statusBar - // - this.statusBar.BackColor = System.Drawing.Color.White; - this.statusBar.Dock = System.Windows.Forms.DockStyle.Fill; - this.statusBar.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.statusBar.Location = new System.Drawing.Point(0, 0); - this.statusBar.Margin = new System.Windows.Forms.Padding(0); - this.statusBar.Name = "statusBar"; - this.statusBar.Size = new System.Drawing.Size(1165, 26); - this.statusBar.TabIndex = 2; - // // WXProdPreSaleForm // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; @@ -1921,6 +1934,10 @@ namespace TemuKJD.WXForms.ProductForms private UserComponent.UcCheckBox chkNotDownCount; private System.Windows.Forms.Label label6; private UserComponent.UcCheckBox chkSearchPromotionLink; + private System.Windows.Forms.TextBox txtPrice; + private DevComponents.DotNetBar.PanelEx btnSetPrice; + private DevComponents.DotNetBar.PanelEx btnRestorePrice; + private System.Windows.Forms.Label label7; private System.Windows.Forms.DataGridViewCheckBoxColumn colCheck; private System.Windows.Forms.DataGridViewTextBoxColumn colSelectId; private System.Windows.Forms.DataGridViewTextBoxColumn colSupplierId; @@ -1938,6 +1955,7 @@ namespace TemuKJD.WXForms.ProductForms private System.Windows.Forms.DataGridViewTextBoxColumn colPromotionLink; private System.Windows.Forms.DataGridViewTextBoxColumn colProductCat; private System.Windows.Forms.DataGridViewTextBoxColumn colExtCode; + private System.Windows.Forms.DataGridViewTextBoxColumn colSkuMultiPrice; private System.Windows.Forms.DataGridViewTextBoxColumn colPrice; private System.Windows.Forms.DataGridViewTextBoxColumn colSoldNum; private System.Windows.Forms.DataGridViewTextBoxColumn colMsg; @@ -1947,9 +1965,5 @@ namespace TemuKJD.WXForms.ProductForms private System.Windows.Forms.DataGridViewLinkColumn ColDelete; private System.Windows.Forms.DataGridViewTextBoxColumn colAddTime; private System.Windows.Forms.DataGridViewTextBoxColumn colOpResult; - private System.Windows.Forms.TextBox txtPrice; - private DevComponents.DotNetBar.PanelEx btnSetPrice; - private DevComponents.DotNetBar.PanelEx btnRestorePrice; - private System.Windows.Forms.Label label7; } } \ No newline at end of file diff --git a/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.cs b/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.cs index 1071000..088b4d1 100644 --- a/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.cs +++ b/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.cs @@ -92,6 +92,10 @@ namespace TemuKJD.WXForms.ProductForms if (wxUploadRule == null) wxUploadRule = new WXUploadRule(); + dicProductBasePrice = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_product_base_price"); + if (dicProductBasePrice == null) + dicProductBasePrice = new Dictionary(); + this.txtPreDays.TextChanged -= txtPreDays_TextChanged; this.chkPreSale.CheckedChanged -= chkPreSale_CheckedChanged; this.chkNoPreSale.CheckedChanged -= chkNoPreSale_CheckedChanged; @@ -782,8 +786,8 @@ namespace TemuKJD.WXForms.ProductForms var pStr = JsonHelper.SerializeObject(prod); Invoke(new Action(() => { - decimal? price = null; - try { price = prod["skuList"]?[0]["price"].ParseToDecimal() / 100; } catch { } + 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().Any(r => r.Cells["colDraftId"].ParseToString() == prodId)) { @@ -826,8 +830,9 @@ namespace TemuKJD.WXForms.ProductForms (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["skuList"].ParseToString(), + //prod["price"].ParseToDecimal() * 0.01m, + "" + minPrice + " - " + maxPrice, prod["soldNum"].ParseToInt(), StatusStr, prod["presaleTag"].ParseToInt() == 1 ? "[预售]" : "", @@ -1661,7 +1666,7 @@ namespace TemuKJD.WXForms.ProductForms cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { - SetProdDown(rowLst); + ChangeProdPrice(rowLst); Invoke(new Action(() => { if (cancellationTokenSource.IsCancellationRequested) @@ -1682,7 +1687,8 @@ namespace TemuKJD.WXForms.ProductForms } - void SetProdPrice(List rowLst) + Dictionary dicProductBasePrice = new Dictionary(); + void ChangeProdPrice(List rowLst) { Invoke(new Action(() => { @@ -1740,60 +1746,265 @@ namespace TemuKJD.WXForms.ProductForms foreach (var row in rowLstTmp) { var prodId = row.Cells["colDraftId"].Value.ParseToString(); - prodIdLst.Add(prodId); - } + var skuPricesStr = row.Cells["colSkuMultiPrice"].Value.ParseToString(); + var newPrice = txtPrice.Text.ParseToDecimal(); - var downProdRst = WXPreSale.DownProd(shop, string.Join(",", prodIdLst)); - Thread.Sleep(Randomx.GetId(1000, 1500)); - if (!downProdRst.Contains("\"code\":0")) - { - if (downProdRst.Contains("biz magic invalid")) + if (dicProductBasePrice.ContainsKey(prodId)) { - WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); - if (shop.LoginStatus != "登录成功") + Invoke(new Action(() => { - Invoke(new Action(() => - { - foreach (var row in rowLstTmp) - { - row.Cells["colOpResult"].Value = "店铺掉线"; - } - })); - continue; - } + row.Cells["colOpResult"].Value = "商品改价未还原,跳过"; + })); + continue; } - var errmsg = BaseRegex.GetStringJson(ref downProdRst, "msg"); - if (string.IsNullOrWhiteSpace(errmsg)) - errmsg = downProdRst; + var downProdRst = changePrice(shop, prodId, skuPricesStr, (newPrice * 100).ParseToInt()); + Thread.Sleep(Randomx.GetId(200, 500)); + if (!downProdRst.Contains("\"code\":0")) + { + if (downProdRst.Contains("biz magic invalid")) + { + WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); + if (shop.LoginStatus != "登录成功") + { + Invoke(new Action(() => + { + foreach (var r in rowLstTmp) + { + r.Cells["colOpResult"].Value = "店铺掉线"; + } + })); + break; + } + } + + var errmsg = BaseRegex.GetStringJson(ref downProdRst, "msg"); + if (string.IsNullOrWhiteSpace(errmsg)) + errmsg = downProdRst; + + Invoke(new Action(() => + { + row.Cells["colOpResult"].Value = "修改价格失败" + errmsg; + })); + } + // 改价成功 + else + { + dicProductBasePrice[prodId] = skuPricesStr; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_product_base_price", dicProductBasePrice); + Invoke(new Action(() => + { + row.Cells["colOpResult"].Value = "修改价格成功"; + row.Cells["colPrice"].Value = newPrice; + })); + } + } + } + } + + /// + /// 修改成指定价格或者还原缓存的原来价格 + /// + /// + /// + /// + /// 新价格 单位分 + /// 是否是还原价格 + /// + private string changePrice(ShopLoginInfo shop, string spuId, string skuPrices, int newPrice, bool isRestore = false) + { + try + { + var skuListObj = JArray.Parse(skuPrices); + JObject changePriceObj = new JObject(); + JArray skuArr = new JArray(); + foreach (var sku in skuListObj) + { + JObject obj = new JObject(); + obj["spuId"] = spuId; + obj["skuId"] = sku["skuId"]; + if (isRestore) + obj["salePrice"] = sku["price"].ParseToInt(); + else + obj["salePrice"] = newPrice; + skuArr.Add(obj); + } + changePriceObj["skuList"] = skuArr; + changePriceObj["uploadSource"] = 6; + + // string body = @"{""skuList"":[{""spuId"":" + spuId + @",""skuId"":""" + skuId + @""",""salePrice"":" + newPrice + @"}],""uploadSource"":6}"; + var rst = OrderForms.WXOrderList.EditPrice(shop, changePriceObj); + + if (rst.Contains("\"code\":0")) + { + return rst; + } + else + { + return rst; + } + } + catch (Exception ex) + { + return ex.Message; + } + } + + private void btnRestorePrice_Click(object sender, EventArgs e) + { + var rowLst = dgvSelectProduct.Rows.Cast().Where(r => r.Cells["colCheck"].Value.ParseToBool() == true).ToList(); + if (rowLst.Count <= 0) + { + BaseMsgForm.ShowError("请勾选需要操作的商品!"); + return; + } + if (rowLst.Any(r => r.Cells["colMsg"].Value.ParseToString().Contains("在售") == false)) + { + BaseMsgForm.ShowError("只能勾选在售商品!"); + return; + } + + if (BaseMsgForm.ShowConfirm("确认要还原商品价格?").DialogResult != DialogResult.OK) + return; + + this.pbLoading.Visible = true; + this.btnSetPreSale.Enabled = false; + if (cancellationTokenSource != null && !cancellationTokenSource.IsCancellationRequested) + cancellationTokenSource.Cancel(); + cancellationTokenSource = new CancellationTokenSource(); + Task.Run(() => + { + RestoreProdPrice(rowLst); + Invoke(new Action(() => + { + if (cancellationTokenSource.IsCancellationRequested) + { + this.statusBar.lblTaskStatus.Text = "商品还原价格中断"; + BaseMsgForm.ShowInfo("商品还原价格中断"); + } + else + { + this.statusBar.lblTaskStatus.Text = "商品还原价格完毕"; + BaseMsgForm.ShowInfo("商品还原价格完毕"); + } + + this.pbLoading.Visible = false; + this.btnSetPreSale.Enabled = true; + })); + }, cancellationTokenSource.Token); + + } + + void RestoreProdPrice(List rowLst) + { + Invoke(new Action(() => + { + this.pbLoading.Visible = true; + this.statusBar.lblTaskStatus.Text = "正在还原价格" + "...".Substring(0, DateTime.Now.Second % 4); + this.statusBar.pgbTaskProgress.Maximum = dgvSelectProduct.Rows.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(() => { - foreach (var row in rowLstTmp) - { - if (downProdRst.Contains("\"code\":108002")) - { - var prodId = row.Cells["colDraftId"].Value.ParseToString(); - if (downProdRst.Contains(prodId)) - row.Cells["colOpResult"].Value = "修改价格失败,请检查商品是否已下架或不存在"; - else - row.Cells["colOpResult"].Value = "修改价格成功"; - } - else - row.Cells["colOpResult"].Value = errmsg; - } + this.statusBar.lblTaskStatus.Text = "正在还原价格" + "...".Substring(0, DateTime.Now.Second % 4); + this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1); + r.Cells["colOpResult"].Value = ""; })); } - - if (downProdRst.Contains("\"code\":0")) + if (shop == null) { Invoke(new Action(() => { - foreach (var row in rowLstTmp) + foreach (var r in rowLstTmp) { - row.Cells["colOpResult"].Value = "修改价格成功"; + r.Cells["colOpResult"].Value = "店铺不存在"; } })); + continue; + } + if (shop.LoginStatus != "登录成功") + { + Invoke(new Action(() => + { + foreach (var r in rowLstTmp) + { + r.Cells["colOpResult"].Value = "店铺掉线"; + } + })); + continue; + } + + List prodIdLst = new List(); + foreach (var row in rowLstTmp) + { + var prodId = row.Cells["colDraftId"].Value.ParseToString(); + + if (!dicProductBasePrice.ContainsKey(prodId)) + { + Invoke(new Action(() => + { + row.Cells["colOpResult"].Value = "未找到价格修改记录,无法还原,跳过"; + })); + continue; + } + var skuPricesStr = dicProductBasePrice[prodId]; + + var downProdRst = changePrice(shop, prodId, skuPricesStr, -1, true); + Thread.Sleep(Randomx.GetId(200, 500)); + if (!downProdRst.Contains("\"code\":0")) + { + if (downProdRst.Contains("biz magic invalid")) + { + WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); + if (shop.LoginStatus != "登录成功") + { + Invoke(new Action(() => + { + foreach (var r in rowLstTmp) + { + r.Cells["colOpResult"].Value = "店铺掉线"; + } + })); + break; + } + } + + var errmsg = BaseRegex.GetStringJson(ref downProdRst, "msg"); + if (string.IsNullOrWhiteSpace(errmsg)) + errmsg = downProdRst; + + Invoke(new Action(() => + { + row.Cells["colOpResult"].Value = "还原失败" + errmsg; + })); + } + // 还原价格成功 + else + { + dicProductBasePrice.Remove(prodId); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_product_base_price", dicProductBasePrice); + Invoke(new Action(() => + { + row.Cells["colOpResult"].Value = "还原价格成功"; + var skuListObj = JArray.Parse(skuPricesStr); + row.Cells["colPrice"].Value = skuListObj.Min(sk => sk["price"].ParseToInt() * 0.01m) + " - " + skuListObj.Max(sk => sk["price"].ParseToInt() * 0.01m); + })); + } } } } diff --git a/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.resx b/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.resx index 4303aa0..2087be1 100644 --- a/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.resx +++ b/TEMUKJD/WXForms/ProductForms/WXProdPreSaleForm.resx @@ -204,6 +204,9 @@ True + + True + True