diff --git a/AllBase/AllBase.csproj b/AllBase/AllBase.csproj index 703da7f..bde7079 100644 --- a/AllBase/AllBase.csproj +++ b/AllBase/AllBase.csproj @@ -190,10 +190,12 @@ + + diff --git a/AllBase/BaseClass.cs b/AllBase/BaseClass.cs index a3347ca..ae9e32b 100644 --- a/AllBase/BaseClass.cs +++ b/AllBase/BaseClass.cs @@ -27,7 +27,7 @@ namespace AllBase /// /// 版本ID /// - public static int VersionCount = 500; + public static int VersionCount = 501; //public static int VersionCount = 500; /// diff --git a/AllBase/Model/Param/SalesManage/TemuActivityParam.cs b/AllBase/Model/Param/SalesManage/TemuActivityParam.cs new file mode 100644 index 0000000..b9a2186 --- /dev/null +++ b/AllBase/Model/Param/SalesManage/TemuActivityParam.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AllBase.Model.Param.SalesManage +{ + public class ActSkuListItem + { + /// + /// + /// + public long? skuId { get; set; } + /// + /// + /// + public int? activityPrice { get; set; } + } + + public class ActSkcListItem + { + /// + /// + /// + public long? skcId { get; set; } + /// + /// + /// + public List skuList { get; set; } + } + + public class ActProductListItem + { + /// + /// + /// + public long? productId { get; set; } + /// + /// + /// + public int? activityStock { get; set; } + /// + /// + /// + public List skcList { get; set; } + } + + public class TemuActivityParam + { + /// + /// + /// + public int? activityType { get; set; } + /// + /// + /// + public long? activityThematicId { get; set; } + /// + /// + /// + public List productList { get; set; } + } +} diff --git a/AllBase/Model/Result/TemuActivityMatchProductInfo.cs b/AllBase/Model/Result/TemuActivityMatchProductInfo.cs new file mode 100644 index 0000000..33790e9 --- /dev/null +++ b/AllBase/Model/Result/TemuActivityMatchProductInfo.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AllBase.Model.Result +{ + public class TemuActivityMatchProductInfo + { + public string pictureUrl { get; set; } + public long? productId { get; set; } + public int? targetActivityStock { get; set; } + public int? suggestActivityStock { get; set; } + public string productName { get; set; } + public List skcList { get; set; } + } + + public class TemuActivitySkcInfo + { + public long skcId { get; set; } + public List skuList { get; set; } + public string extCode { get; set; } + } + + public class TemuActivitySkuInfo + { + public int? dailyPrice { get; set; } + public string extCode { get; set; } + public int? suggestActivityPrice { get; set; } + public long? skuId { get; set; } + public string currenty { get; set; } + public Dictionary properties { get; set; } + } +} diff --git a/KJDService/KJD_WebService/BLL/ProductManage.cs b/KJDService/KJD_WebService/BLL/ProductManage.cs index d97b272..f57dca5 100644 --- a/KJDService/KJD_WebService/BLL/ProductManage.cs +++ b/KJDService/KJD_WebService/BLL/ProductManage.cs @@ -394,11 +394,18 @@ namespace KJD_Web.BLL var status = RegexUtils.GetStringQuery(ref inputData, "status")?.Replace("'", "\\'"); var add_times = RegexUtils.GetStringQuery(ref inputData, "add_times")?.Replace("'", "\\'"); + long l_draft_id = draft_id.ParseToLong(); + long l_table_id = l_draft_id % 128; + string conn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnKJD"].ConnectionString; MysqlUtils mySql = new MysqlUtils(conn); string sql = ""; + // 使用事务一次提交多个sql操作 + //sql += "set @@autocommit=0;\r\n"; + sql += "START TRANSACTION;\r\n"; if (!string.IsNullOrEmpty(up_spu_id) && !string.IsNullOrEmpty(draft_id)) - sql += "insert into kjd.spu_map (draft_id,from_spu_id,shop_id) values(" + draft_id + "," + up_spu_id + ",'" + shop_id + "');"; + sql += "insert into kjd_map.spu_map_" + l_table_id + + " (draft_id,from_spu_id,shop_id) values(" + draft_id + "," + up_spu_id + ",'" + shop_id + "');\r\n"; sql += "update kjd.product_select set"; if (draft_id != null) sql += " draft_id='" + draft_id + "',"; @@ -408,8 +415,14 @@ namespace KJD_Web.BLL sql += " add_times=add_times+1,"; sql += " mdy_time='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "',"; sql = sql.TrimEnd(','); - sql += " where id=" + id + ";"; + sql += " where id=" + id + ";\r\n"; var rst = mySql.ExecuteNonQuery(sql); + string errMsg = mySql.Message; + if (string.IsNullOrEmpty(errMsg)) + sql = "COMMIT;"; + else + sql = "ROLLBACK;"; + mySql.ExecuteNonQuery(sql); mySql.Close(); if (rst) { @@ -417,7 +430,7 @@ namespace KJD_Web.BLL } else { - return "{\"code\":500,\"msg\":\"" + mySql.Message + "\"}"; + return "{\"code\":500,\"msg\":\"" + errMsg + "\"}"; } } return "{\"code\":19999,\"msg\":\"输入为空\"}"; diff --git a/KJDService/KJD_WebService/BLL/ProductThirdManage.cs b/KJDService/KJD_WebService/BLL/ProductThirdManage.cs index ef74900..e74a99b 100644 --- a/KJDService/KJD_WebService/BLL/ProductThirdManage.cs +++ b/KJDService/KJD_WebService/BLL/ProductThirdManage.cs @@ -357,11 +357,18 @@ namespace KJD_Web.BLL var status = RegexUtils.GetStringQuery(ref inputData, "status")?.Replace("'", "\\'"); var add_times = RegexUtils.GetStringQuery(ref inputData, "add_times")?.Replace("'", "\\'"); + long l_draft_id = draft_id.ParseToLong(); + long l_table_id = l_draft_id % 128; + string conn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnKJD"].ConnectionString; MysqlUtils mySql = new MysqlUtils(conn); string sql = ""; + // 使用事务一次提交多个sql操作 + //sql += "set @@autocommit=0;\r\n"; + sql += "START TRANSACTION;\r\n"; if (!string.IsNullOrEmpty(up_spu_id) && !string.IsNullOrEmpty(draft_id)) - sql += "insert into kjd.spu_map (draft_id,from_spu_id,shop_id) values(" + draft_id + "," + up_spu_id + ",'" + shop_id + "');"; + sql += "insert into kjd_map.spu_map_" + l_table_id + + " (draft_id,from_spu_id,shop_id) values(" + draft_id + "," + up_spu_id + ",'" + shop_id + "');\r\n"; sql += "update kjd.third_product_select set"; if (draft_id != null) sql += " draft_id='" + draft_id + "',"; @@ -371,8 +378,14 @@ namespace KJD_Web.BLL sql += " add_times=add_times+1,"; sql += " mdy_time='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "',"; sql = sql.TrimEnd(','); - sql += " where id=" + id + ";"; + sql += " where id=" + id + ";\r\n"; var rst = mySql.ExecuteNonQuery(sql); + string errMsg = mySql.Message; + if (string.IsNullOrEmpty(errMsg)) + sql = "COMMIT;"; + else + sql = "ROLLBACK;"; + mySql.ExecuteNonQuery(sql); mySql.Close(); if (rst) { @@ -380,7 +393,7 @@ namespace KJD_Web.BLL } else { - return "{\"code\":500,\"msg\":\"" + mySql.Message + "\"}"; + return "{\"code\":500,\"msg\":\"" + errMsg + "\"}"; } } return "{\"code\":19999,\"msg\":\"输入为空\"}"; diff --git a/KJDService/KJD_WebService/BLL/ToolManage.cs b/KJDService/KJD_WebService/BLL/ToolManage.cs new file mode 100644 index 0000000..f8fd76d --- /dev/null +++ b/KJDService/KJD_WebService/BLL/ToolManage.cs @@ -0,0 +1,60 @@ +using KJD_Web.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace KJD_Web.BLL +{ + public class ToolManage + { + //mysql workbench 存储过程,可以使用分隔符重定义 +// string 存储过程1 = @" +//DELIMITER $ +//DROP PROCEDURE IF EXISTS add_spu_map; +//CREATE PROCEDURE add_spu_map() +//BEGIN +//insert into kjd_map.spu_map_0 (draft_id,from_spu_id,shop_id) values(9122600878,727585921,'3049342434562'); +//update kjd.third_product_select set draft_id='9122600878', status='已上传', add_times=add_times+1, mdy_time='2025-08-06 11:54:50' where id=6532; +//END $ +//DELIMITER ; +//CALL add_spu_map();"; + + //腾讯云服务器存储过程,不能使用分隔符重定义 +// string 存储过程2 = @" +//DROP PROCEDURE IF EXISTS add_spu_map; +//CREATE PROCEDURE add_spu_map() +//BEGIN +//insert into kjd_map.spu_map_1 (draft_id,from_spu_id,shop_id) values(9122600878,727585921,'3049342434562'); +//update kjd.third_product_select set draft_id='9122600878', status='已上传', add_times=add_times+1, mdy_time='2025-08-06 11:54:50' where id=6532; +//END ; +//CALL add_spu_map();"; + + public void CreateTable() + { +// string conn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnKJD"].ConnectionString; +// MysqlUtils mySql = new MysqlUtils(conn); +// string sql = ""; +// string sql1 = ""; +// for (int i = 0; i < 69; i++) +// { +// //sql = @"drop table if exists kjd_map.spu_map_" + i + ";\r\n"; +// sql = @"CREATE TABLE IF NOT EXISTS kjd_map.spu_map_" + i + @" ( +// `id` int NOT NULL AUTO_INCREMENT, +// `draft_id` bigint NOT NULL COMMENT '草稿箱/商品Id', +// `from_spu_id` bigint NOT NULL COMMENT '母店来源商品Id', +// `shop_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上传的店铺', +// PRIMARY KEY (`id`) +//) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '上传商品与母店商品spu映射关系';"; + +// sql += @" +//ALTER TABLE +// kjd_map.spu_map_" + i + @" +//ADD +// COLUMN `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP"; +// var rst = mySql.ExecuteNonQuery(sql); +// } +// mySql.Close(); + } + } +} \ No newline at end of file diff --git a/KJDService/KJD_WebService/KJD_WebService.csproj b/KJDService/KJD_WebService/KJD_WebService.csproj index b61a165..2f70581 100644 --- a/KJDService/KJD_WebService/KJD_WebService.csproj +++ b/KJDService/KJD_WebService/KJD_WebService.csproj @@ -1,5 +1,5 @@  - + Debug @@ -46,6 +46,9 @@ false + + ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll + ..\Dll\MySql.Data.dll @@ -70,17 +73,13 @@ - - - ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll - - + @@ -88,6 +87,7 @@ + @@ -116,6 +116,10 @@ UpdateService.asmx Component + + ToolService.asmx + Component + UserService.asmx Component @@ -174,7 +178,7 @@ 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 - + - - - - - + + + + + - - + + - - - + + + - + - - + + - - - - + + + + + + + + + + \ No newline at end of file diff --git a/KJDService/KJD_WebService/packages.config b/KJDService/KJD_WebService/packages.config index 08df8e6..28b1adb 100644 --- a/KJDService/KJD_WebService/packages.config +++ b/KJDService/KJD_WebService/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/TEMUKJD/KJDForms/ProductForms/PriceManageForm.cs b/TEMUKJD/KJDForms/ProductForms/PriceManageForm.cs index ebda321..38f14cd 100644 --- a/TEMUKJD/KJDForms/ProductForms/PriceManageForm.cs +++ b/TEMUKJD/KJDForms/ProductForms/PriceManageForm.cs @@ -152,7 +152,7 @@ namespace TemuKJD.KJDForms.ProductForms switch (columnName) { case "colSelect": - if (row.Cells["colCanUse"].Value.ParseToBool()) + if (row.Cells["colCanUse"].Value.ParseToBool() || row.Cells["colSelect"].Value.ParseToBool()) { row.Cells["colSelect"].Value = !row.Cells["colSelect"].Value.ParseToBool(); diff --git a/TEMUKJD/KJDForms/ProductForms/SaleStockUpForm.cs b/TEMUKJD/KJDForms/ProductForms/SaleStockUpForm.cs index 9ddea65..18301d6 100644 --- a/TEMUKJD/KJDForms/ProductForms/SaleStockUpForm.cs +++ b/TEMUKJD/KJDForms/ProductForms/SaleStockUpForm.cs @@ -528,7 +528,7 @@ namespace TemuKJD.KJDForms.ProductForms switch (columnName) { case "colSelect": - if (row.Cells["colCanUse"].Value.ParseToBool()) + if (row.Cells["colCanUse"].Value.ParseToBool() || row.Cells["colSelect"].Value.ParseToBool()) { row.Cells["colSelect"].Value = !row.Cells["colSelect"].Value.ParseToBool(); diff --git a/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.Designer.cs b/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.Designer.cs index a8cc2f2..9f2c5ea 100644 --- a/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.Designer.cs +++ b/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.Designer.cs @@ -75,17 +75,12 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.colCanUse = new System.Windows.Forms.DataGridViewCheckBoxColumn(); this.colMessage = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dgvActivity = new TemuKJD.UserComponent.DataGridViewEx(); - this.colCheckActivity = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.colActivityId = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colActivityName = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colActivityTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colSignUpTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colDiscount = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colActivityMsg = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dgvProduct = new TemuKJD.UserComponent.DataGridViewEx(); this.colCheckProduct = new System.Windows.Forms.DataGridViewCheckBoxColumn(); this.colSupplierId = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colSupplierName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colSubmitActivityId = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colSubmitActivityName = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colPic = new System.Windows.Forms.DataGridViewImageColumn(); this.colProdName = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colSpuId = new System.Windows.Forms.DataGridViewLinkColumn(); @@ -97,6 +92,13 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.colInventory = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.colMsg = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.statusBar = new TemuKJD.UserControls.StatusBarUserControl(); + this.colCheckActivity = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.colActivityId = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colActivityName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colActivityTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colSignUpTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colDiscount = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colActivityMsg = new System.Windows.Forms.DataGridViewTextBoxColumn(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); @@ -249,6 +251,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.panelEx1.StyleMouseOver.ForeColor.Color = System.Drawing.Color.White; this.panelEx1.TabIndex = 668; this.panelEx1.Text = "停止当前操作"; + this.panelEx1.Click += new System.EventHandler(this.btnStop_Click); // // btnClear // @@ -691,6 +694,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.dgvActivity.AllowUserToDeleteRows = false; dataGridViewCellStyle3.BackColor = System.Drawing.Color.WhiteSmoke; this.dgvActivity.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle3; + this.dgvActivity.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.dgvActivity.BackgroundColor = System.Drawing.Color.White; this.dgvActivity.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(126)))), ((int)(((byte)(255))))); dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; @@ -719,56 +723,6 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.dgvActivity.TabIndex = 189; this.dgvActivity.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvActivity_CellContentClick); // - // colCheckActivity - // - this.colCheckActivity.HeaderText = "选择"; - this.colCheckActivity.Name = "colCheckActivity"; - this.colCheckActivity.ReadOnly = true; - this.colCheckActivity.Resizable = System.Windows.Forms.DataGridViewTriState.True; - this.colCheckActivity.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - this.colCheckActivity.Width = 30; - // - // colActivityId - // - this.colActivityId.HeaderText = "活动编号"; - this.colActivityId.Name = "colActivityId"; - this.colActivityId.ReadOnly = true; - this.colActivityId.Visible = false; - // - // colActivityName - // - this.colActivityName.HeaderText = "活动主题"; - this.colActivityName.Name = "colActivityName"; - this.colActivityName.ReadOnly = true; - this.colActivityName.Width = 280; - // - // colActivityTime - // - this.colActivityTime.HeaderText = "活动时间"; - this.colActivityTime.Name = "colActivityTime"; - this.colActivityTime.ReadOnly = true; - this.colActivityTime.Width = 320; - // - // colSignUpTime - // - this.colSignUpTime.HeaderText = "报名截止"; - this.colSignUpTime.Name = "colSignUpTime"; - this.colSignUpTime.ReadOnly = true; - this.colSignUpTime.Width = 110; - // - // colDiscount - // - this.colDiscount.HeaderText = "活动折扣"; - this.colDiscount.Name = "colDiscount"; - this.colDiscount.ReadOnly = true; - // - // colActivityMsg - // - this.colActivityMsg.HeaderText = "状态"; - this.colActivityMsg.Name = "colActivityMsg"; - this.colActivityMsg.ReadOnly = true; - this.colActivityMsg.Width = 400; - // // dgvProduct // this.dgvProduct.AllowUserToAddRows = false; @@ -790,6 +744,8 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.colCheckProduct, this.colSupplierId, this.colSupplierName, + this.colSubmitActivityId, + this.colSubmitActivityName, this.colPic, this.colProdName, this.colSpuId, @@ -815,6 +771,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.colCheckProduct.ReadOnly = true; this.colCheckProduct.Resizable = System.Windows.Forms.DataGridViewTriState.True; this.colCheckProduct.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.colCheckProduct.Visible = false; this.colCheckProduct.Width = 30; // // colSupplierId @@ -830,6 +787,20 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.colSupplierName.ReadOnly = true; this.colSupplierName.Width = 110; // + // colSubmitActivityId + // + this.colSubmitActivityId.HeaderText = "报名活动Id"; + this.colSubmitActivityId.Name = "colSubmitActivityId"; + this.colSubmitActivityId.ReadOnly = true; + this.colSubmitActivityId.Visible = false; + // + // colSubmitActivityName + // + this.colSubmitActivityName.HeaderText = "报名活动名称"; + this.colSubmitActivityName.Name = "colSubmitActivityName"; + this.colSubmitActivityName.ReadOnly = true; + this.colSubmitActivityName.Width = 150; + // // colPic // this.colPic.HeaderText = "图片"; @@ -853,6 +824,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.colSpuId.ReadOnly = true; this.colSpuId.Resizable = System.Windows.Forms.DataGridViewTriState.True; this.colSpuId.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.colSpuId.Width = 90; // // coSkcId // @@ -862,7 +834,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.coSkcId.ReadOnly = true; this.coSkcId.Resizable = System.Windows.Forms.DataGridViewTriState.True; this.coSkcId.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - this.coSkcId.Width = 80; + this.coSkcId.Width = 90; // // colExtCode // @@ -876,7 +848,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.colRecommendPrice.HeaderText = "推荐价格(折扣)"; this.colRecommendPrice.Name = "colRecommendPrice"; this.colRecommendPrice.ReadOnly = true; - this.colRecommendPrice.Width = 70; + this.colRecommendPrice.Width = 90; // // colRecommendInventory // @@ -916,6 +888,54 @@ namespace TemuKJD.KJDForms.SalesCenterForms this.statusBar.Size = new System.Drawing.Size(700, 26); this.statusBar.TabIndex = 2; // + // colCheckActivity + // + this.colCheckActivity.FillWeight = 15F; + this.colCheckActivity.HeaderText = "选择"; + this.colCheckActivity.Name = "colCheckActivity"; + this.colCheckActivity.ReadOnly = true; + this.colCheckActivity.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.colCheckActivity.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // colActivityId + // + this.colActivityId.HeaderText = "活动编号"; + this.colActivityId.Name = "colActivityId"; + this.colActivityId.ReadOnly = true; + this.colActivityId.Visible = false; + // + // colActivityName + // + this.colActivityName.HeaderText = "活动主题"; + this.colActivityName.Name = "colActivityName"; + this.colActivityName.ReadOnly = true; + // + // colActivityTime + // + this.colActivityTime.HeaderText = "活动时间"; + this.colActivityTime.Name = "colActivityTime"; + this.colActivityTime.ReadOnly = true; + // + // colSignUpTime + // + this.colSignUpTime.FillWeight = 50F; + this.colSignUpTime.HeaderText = "报名截止"; + this.colSignUpTime.Name = "colSignUpTime"; + this.colSignUpTime.ReadOnly = true; + // + // colDiscount + // + this.colDiscount.FillWeight = 50F; + this.colDiscount.HeaderText = "活动折扣"; + this.colDiscount.Name = "colDiscount"; + this.colDiscount.ReadOnly = true; + // + // colActivityMsg + // + this.colActivityMsg.HeaderText = "状态"; + this.colActivityMsg.Name = "colActivityMsg"; + this.colActivityMsg.ReadOnly = true; + // // MarketingActivityForm // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; @@ -993,27 +1013,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms private System.Windows.Forms.DataGridViewCheckBoxColumn colCanUse; private System.Windows.Forms.DataGridViewTextBoxColumn colMessage; private UserComponent.DataGridViewEx dgvProduct; - private System.Windows.Forms.DataGridViewCheckBoxColumn colCheckProduct; - private System.Windows.Forms.DataGridViewTextBoxColumn colSupplierId; - private System.Windows.Forms.DataGridViewTextBoxColumn colSupplierName; - private System.Windows.Forms.DataGridViewImageColumn colPic; - private System.Windows.Forms.DataGridViewTextBoxColumn colProdName; - private System.Windows.Forms.DataGridViewLinkColumn colSpuId; - private System.Windows.Forms.DataGridViewLinkColumn coSkcId; - private System.Windows.Forms.DataGridViewTextBoxColumn colExtCode; - private System.Windows.Forms.DataGridViewTextBoxColumn colRecommendPrice; - private System.Windows.Forms.DataGridViewTextBoxColumn colRecommendInventory; - private System.Windows.Forms.DataGridViewTextBoxColumn colPrcie; - private System.Windows.Forms.DataGridViewTextBoxColumn colInventory; - private System.Windows.Forms.DataGridViewTextBoxColumn colMsg; private UserComponent.DataGridViewEx dgvActivity; - private System.Windows.Forms.DataGridViewCheckBoxColumn colCheckActivity; - private System.Windows.Forms.DataGridViewTextBoxColumn colActivityId; - private System.Windows.Forms.DataGridViewTextBoxColumn colActivityName; - private System.Windows.Forms.DataGridViewTextBoxColumn colActivityTime; - private System.Windows.Forms.DataGridViewTextBoxColumn colSignUpTime; - private System.Windows.Forms.DataGridViewTextBoxColumn colDiscount; - private System.Windows.Forms.DataGridViewTextBoxColumn colActivityMsg; private UserComponent.UcCheckBox chkGetDiscount; private DevComponents.DotNetBar.PanelEx panelEx2; private UcActivityDiscountCtrl actDiscount85; @@ -1030,5 +1030,27 @@ namespace TemuKJD.KJDForms.SalesCenterForms private System.Windows.Forms.Label label2; private System.Windows.Forms.NumericUpDown numNoSaleDays; private System.Windows.Forms.Label label1; + private System.Windows.Forms.DataGridViewCheckBoxColumn colCheckProduct; + private System.Windows.Forms.DataGridViewTextBoxColumn colSupplierId; + private System.Windows.Forms.DataGridViewTextBoxColumn colSupplierName; + private System.Windows.Forms.DataGridViewTextBoxColumn colSubmitActivityId; + private System.Windows.Forms.DataGridViewTextBoxColumn colSubmitActivityName; + private System.Windows.Forms.DataGridViewImageColumn colPic; + private System.Windows.Forms.DataGridViewTextBoxColumn colProdName; + private System.Windows.Forms.DataGridViewLinkColumn colSpuId; + private System.Windows.Forms.DataGridViewLinkColumn coSkcId; + private System.Windows.Forms.DataGridViewTextBoxColumn colExtCode; + private System.Windows.Forms.DataGridViewTextBoxColumn colRecommendPrice; + private System.Windows.Forms.DataGridViewTextBoxColumn colRecommendInventory; + private System.Windows.Forms.DataGridViewTextBoxColumn colPrcie; + private System.Windows.Forms.DataGridViewTextBoxColumn colInventory; + private System.Windows.Forms.DataGridViewTextBoxColumn colMsg; + private System.Windows.Forms.DataGridViewCheckBoxColumn colCheckActivity; + private System.Windows.Forms.DataGridViewTextBoxColumn colActivityId; + private System.Windows.Forms.DataGridViewTextBoxColumn colActivityName; + private System.Windows.Forms.DataGridViewTextBoxColumn colActivityTime; + private System.Windows.Forms.DataGridViewTextBoxColumn colSignUpTime; + private System.Windows.Forms.DataGridViewTextBoxColumn colDiscount; + private System.Windows.Forms.DataGridViewTextBoxColumn colActivityMsg; } } \ No newline at end of file diff --git a/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.cs b/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.cs index 6eff8d4..f0afe64 100644 --- a/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.cs +++ b/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.cs @@ -1,5 +1,6 @@ using AllBase; using AllBase.Helper; +using AllBase.Model.Param.SalesManage; using AllBase.Model.Result; using NaiBa.Util.Extension; using Newtonsoft.Json.Linq; @@ -25,6 +26,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms public CancellationTokenSource cancellationTokenSource { get; set; } = null; public List lstActivityThematic { get; set; } = new List(); public List lstShopIdSelect = new List(); + public List lstActivityIdSelect = new List(); public List lstDiscount = new List() { 60, 70, 80, 85 }; public Dictionary> dicNoSaleProd = new Dictionary>(); @@ -158,7 +160,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms switch (columnName) { case "colSelect": - if (row.Cells["colCanUse"].Value.ParseToBool()) + if (row.Cells["colCanUse"].Value.ParseToBool() || row.Cells["colSelect"].Value.ParseToBool()) { row.Cells["colSelect"].Value = !row.Cells["colSelect"].Value.ParseToBool(); @@ -459,6 +461,9 @@ namespace TemuKJD.KJDForms.SalesCenterForms i++; })); + if (cancellationTokenSource.IsCancellationRequested) + break; + if (actInfo == null) continue; @@ -512,7 +517,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms tryAgain: Thread.Sleep(100 + Randomx.GetId(200)); string jsonRst = GetActivityMatch(shop, actInfo.activityThematicId.ParseToLong()); - if (jsonRst.Contains("指定的值含有无效的控制字符")) + if (jsonRst.Contains("指定的值含有无效的控制字符") || jsonRst.Contains("login") || jsonRst.Contains("Login")) { Invoke(new Action(() => { @@ -531,9 +536,6 @@ namespace TemuKJD.KJDForms.SalesCenterForms tryCount++; goto tryAgain; } - if (jsonRst.Contains("当前操作人数太多,请稍后重试")) - { - } if (!jsonRst.Contains("\"success\":true")) { //isError = true; @@ -593,7 +595,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms catch (Exception ex) { BaseMsgForm.ShowError(ex.Message); } } } - if(string.IsNullOrEmpty(actInfo.discount)) + if(string.IsNullOrEmpty(actInfo.discount) && !cancellationTokenSource.IsCancellationRequested) { this.Invoke(new Action(() => { @@ -649,22 +651,21 @@ namespace TemuKJD.KJDForms.SalesCenterForms cancellationTokenSource = new CancellationTokenSource(); lstShopIdSelect.Clear(); lstShopIdSelect.AddRange(lstShopId); + lstActivityIdSelect.Clear(); + lstActivityIdSelect.AddRange(lstActivityId); #endregion Task.Run(() => { - if (chkNoSaleProd.Checked) - GetNoSaleProd(); - SignActivity(); Invoke(new Action(() => { ucGroupBoxEx2.Enabled = true; ucGroupBoxEx3.Enabled = true; - string sRst = "查询结束!"; + string sRst = "已完成活动报名!"; if (cancellationTokenSource.IsCancellationRequested) - sRst = "已取消查询!"; + sRst = "已取消活动报名!"; BaseMsgForm.ShowInfo(sRst); this.statusBar.lblTaskStatus.Text = sRst; @@ -672,14 +673,112 @@ namespace TemuKJD.KJDForms.SalesCenterForms },cancellationTokenSource.Token); } - public void GetNoSaleProd() + /// + /// 查询店铺未出单商品,返回商品id列表 + /// + public List GetNoSaleProd(string shopId) + { + //int i = 0; + //foreach (var shopId in lstShopIdSelect) + //{ + this.Invoke(new Action(() => + { + this.statusBar.lblTaskStatus.Text = "正在查询无销量商品..."; + this.statusBar.pgbTaskProgress.Maximum = lstShopIdSelect.Count; + //this.statusBar.UpdateProgressBar(i + 1); + //i++; + })); + + if (cancellationTokenSource.IsCancellationRequested) + return new List(); + + var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId); + if (shop == null) + return new List(); + var shopRow = this.dgvShop.Rows.Cast() + .FirstOrDefault(r => r.Cells["colShopId"].Value.ParseToString() == shop.ShopId); + if (shopRow == null) + return new List(); + + if (!CheckLogin(shop)) + return new List(); + + Invoke(new Action(() => + { + shopRow.Cells["colMessage"].Value = "正在查询无销量商品"; + })); + + this.dicNoSaleProd[shop.ShopId] = new List(); + int page = 0; + int totalPage = 1; + while (page < totalPage) + { + page++; + string jsonRst = GetNoSaleProd(shop, numNoSaleDays.Value.ParseToInt(), page); + + if (!jsonRst.Contains("\"success\":true")) + { + string sErr = BaseRegex.GetStringJson(ref jsonRst, "errorMsg"); + if (string.IsNullOrEmpty(sErr)) + sErr = BaseRegex.GetStringJson(ref jsonRst, "err_msg"); + if (string.IsNullOrEmpty(sErr)) + sErr = jsonRst; + Invoke(new Action(() => + { + shopRow.Cells["colMessage"].Value = sErr; + })); + break; + } + + var jArr = new JArray(); + try + { + var jObj = JObject.Parse(jsonRst); + jArr = jObj["result"]["subOrderList"] as JArray; + if (jArr == null) + jArr = new JArray(); + + foreach (var item in jArr) + { + string sItem = item.ToString(); + SubOrderInfo sInfo = JsonHelper.DeserializeJsonToObject(sItem); // 反序列化得到类 + if (sInfo != null) + { + this.dicNoSaleProd[shop.ShopId].Add(sInfo); + } + } + } + catch (Exception ex) + { + BaseMsgForm.ShowError(ex.Message); + } + + int total = BaseRegex.GetStringJson(ref jsonRst, "total").ParseToInt(); + totalPage = Math.Ceiling(total / 40.0).ParseToInt(); + } + //} + try + { + return this.dicNoSaleProd[shop.ShopId].Select(p => p.productId.ParseToString()).ToList(); + } + catch + { + return new List(); + } + } + + public void SignActivity() { int i = 0; foreach (var shopId in lstShopIdSelect) { + List noSaleProdIdLst = new List(); + if (chkNoSaleProd.Checked) + noSaleProdIdLst.AddRange(GetNoSaleProd(shopId)); + this.Invoke(new Action(() => { - this.statusBar.lblTaskStatus.Text = "正在查询无销量商品..."; + this.statusBar.lblTaskStatus.Text = "正在报名活动商品..."; this.statusBar.pgbTaskProgress.Maximum = lstShopIdSelect.Count; this.statusBar.UpdateProgressBar(i + 1); i++; @@ -695,17 +794,42 @@ namespace TemuKJD.KJDForms.SalesCenterForms .FirstOrDefault(r => r.Cells["colShopId"].Value.ParseToString() == shop.ShopId); if (shopRow == null) continue; - if (!CheckLogin(shop)) continue; - this.dicNoSaleProd[shop.ShopId] = new List(); - int page = 0; - int totalPage = 1; - while (page < totalPage) + foreach (var activityId in lstActivityIdSelect) { - page++; - string jsonRst = GetNoSaleProd(shop, numNoSaleDays.Value.ParseToInt(), page); + var activity = lstActivityThematic.FirstOrDefault(a => a.activityThematicId.ParseToString() == activityId); + if (activity == null) + continue; + var actRow = this.dgvActivity.Rows.Cast() + .FirstOrDefault(r => r.Cells["colActivityId"].Value.ParseToLong() == activity.activityThematicId); + if (actRow == null) + continue; + + int tryCount = 0; + tryAgain: + Thread.Sleep(100 + Randomx.GetId(200)); + var jsonRst = GetActivityMatch(shop, activity.activityThematicId, string.Join(",", noSaleProdIdLst)); + if (jsonRst.Contains("指定的值含有无效的控制字符") || jsonRst.Contains("login") || jsonRst.Contains("Login")) + { + Invoke(new Action(() => + { + var shopRows = this.dgvShop.Rows.Cast().Where(r => r.Cells["colShopLoginName"].Value.ToString() == shop.LoginName); + foreach (var r in shopRows) + { + r.Cells["colMessage"].Value = "店铺掉线"; + r.Cells["colLoginStatus"].Value = "国际版未登录"; + r.Cells["colCanUse"].Value = false; + } + })); + continue; + } + if (jsonRst.Contains("当前操作人数太多,请稍后重试") && tryCount < 5) + { + tryCount++; + goto tryAgain; + } if (!jsonRst.Contains("\"success\":true")) { @@ -716,48 +840,134 @@ namespace TemuKJD.KJDForms.SalesCenterForms sErr = jsonRst; Invoke(new Action(() => { + actRow.Cells["colActivityMsg"].Value = sErr; shopRow.Cells["colMessage"].Value = sErr; })); - break; + continue; } var jArr = new JArray(); try { var jObj = JObject.Parse(jsonRst); - jArr = jObj["result"]["subOrderList"] as JArray; + jArr = jObj["result"]?["matchList"] as JArray; if (jArr == null) jArr = new JArray(); + } + catch (Exception ex) { BaseMsgForm.ShowError(ex.Message); } - foreach (var item in jArr) + if (jArr.Count() == 0) + { + continue; + } + + try + { + string str = JsonHelper.SerializeObject(jArr); + var prodLst = JsonHelper.DeserializeJsonToList(str); + var prodSubmitRows = new List(); + + TemuActivityParam activityParam = new TemuActivityParam(); + activityParam.activityType = 13; + activityParam.activityThematicId = activity.activityThematicId; + activityParam.productList = new List(); + + foreach (var prod in prodLst) { - string sItem = item.ToString(); - SubOrderInfo sInfo = JsonHelper.DeserializeJsonToObject(sItem); // 反序列化得到类 - if (sInfo != null) + int discount = this.GetNearDiscount(activity.discount.ParseToInt()); + var discountCtrl = this.actDiscount60; + if (discount == 70) + discountCtrl = this.actDiscount70; + if (discount == 80) + discountCtrl = this.actDiscount80; + if (discount == 85) + discountCtrl = this.actDiscount85; + // 如果是默认库存或者库存小于推荐值,使用推荐库存 + int inventory = discountCtrl.Inventory; + if (inventory < prod.suggestActivityStock || discountCtrl.IsDefaultInventory) + inventory = prod.suggestActivityStock.ParseToInt(); + Invoke(new Action(() => { - this.dicNoSaleProd[shop.ShopId].Add(sInfo); + int rowId = dgvProduct.Rows.Add( + true, + shop.ShopId, + shop.ShopAccount, + activity.activityThematicId, + activity.activityThematicName, + null,//prod.pictureUrl, + prod.productName, + prod.productId, + prod.skcList.FirstOrDefault()?.skcId, + prod.skcList.FirstOrDefault()?.extCode, + activity.discount.Trim('0') + "折", + prod.suggestActivityStock, + activity.discount.Trim('0') + "折", + inventory + ); + dgvProduct.Rows[rowId].Height = 30; + prodSubmitRows.Add(dgvProduct.Rows[rowId]); + })); + + ActProductListItem activityProditem = new ActProductListItem(); + activityProditem.productId = prod.productId; + activityProditem.activityStock = inventory; + activityProditem.skcList = new List(); + + ActSkcListItem actSkcListItem = new ActSkcListItem(); + actSkcListItem.skcId = prod.skcList.FirstOrDefault()?.skcId; + actSkcListItem.skuList = new List(); + foreach (var skuInfo in prod.skcList.FirstOrDefault()?.skuList) + { + actSkcListItem.skuList.Add(new ActSkuListItem + { + activityPrice = skuInfo.suggestActivityPrice, + skuId = skuInfo.skuId, + }); } + activityProditem.skcList.Add(actSkcListItem); + activityParam.productList.Add(activityProditem); + } + string data = JsonHelper.SerializeObject(activityParam); + string submitRst = ""; + submitRst = SubmitActivity(shop, activityParam.activityThematicId, data); + + if (!submitRst.Contains("\"success\":true")) + { + string sSubmitErr = BaseRegex.GetStringJson(ref submitRst, "errorMsg"); + if (string.IsNullOrEmpty(sSubmitErr)) + sSubmitErr = BaseRegex.GetStringJson(ref submitRst, "err_msg"); + if (string.IsNullOrEmpty(sSubmitErr)) + sSubmitErr = jsonRst; + Invoke(new Action(() => + { + foreach(var submitRow in prodSubmitRows) + { + submitRow.Cells["colMsg"].Value = sSubmitErr; + } + })); + continue; + } + + Invoke(new Action(() => + { + foreach (var submitRow in prodSubmitRows) + { + submitRow.Cells["colMsg"].Value = "提交活动成功"; + } + })); + + // 如果提交成功且还有更多商品可报名,继续重复报名(已报名商品不会出现在搜索结果列表) + if (submitRst.Contains("\"success\":true") && jsonRst.Contains("\"hasMore\":true")) + { + tryCount = 0; + goto tryAgain; } } - catch (Exception ex) - { - BaseMsgForm.ShowError(ex.Message); - } - - int total = BaseRegex.GetStringJson(ref jsonRst, "total").ParseToInt(); - totalPage = Math.Ceiling(total / 40.0).ParseToInt(); + catch (Exception ex) { BaseMsgForm.ShowError(ex.Message); } } } } - public void SignActivity() - { - foreach (var shopId in lstShopIdSelect) - { - - } - } - public bool CheckLogin(ShopLoginInfo shop) { if (shop.LoginStatus2 != "国际版在线") @@ -783,6 +993,12 @@ namespace TemuKJD.KJDForms.SalesCenterForms return true; } + private void btnStop_Click(object sender, EventArgs e) + { + if (cancellationTokenSource != null) + cancellationTokenSource.Cancel(); + } + /// /// 获取活动列表 /// @@ -801,12 +1017,35 @@ namespace TemuKJD.KJDForms.SalesCenterForms /// 获取符合店铺的活动 /// /// + /// + /// 多个用逗号隔开 /// - private string GetActivityMatch(ShopLoginInfo shop, long? thematicId) + private string GetActivityMatch(ShopLoginInfo shop, long? thematicId, string spuIds="") { string url = "https://agentseller.temu.com/api/kiana/gamblers/marketing/enroll/scroll/match"; string body; body = @"{""activityType"":13,""activityThematicId"":" + thematicId + @",""rowCount"":50}"; + if (!string.IsNullOrWhiteSpace(spuIds)) + { + body = @"{""activityType"":13,""activityThematicId"":" + thematicId + + @",""rowCount"":50,""productIds"":[" + spuIds + @"],""productSkcExtCodes"":[]}"; + } + string refere = "https://agentseller.temu.com/activity/marketing-activity/detail-new?type=13&thematicId=" + thematicId; + return KJDHttpResponse.PostResponse2(shop, url, body, refere); + } + + /// + /// 提交活动报名 + /// + /// + /// + /// + /// + private string SubmitActivity(ShopLoginInfo shop, long? thematicId, string _body) + { + string url = "https://agentseller.temu.com/api/kiana/gamblers/marketing/enroll/submit"; + string body; + body = _body; string refere = "https://agentseller.temu.com/activity/marketing-activity/detail-new?type=13&thematicId=" + thematicId; return KJDHttpResponse.PostResponse2(shop, url, body, refere); } diff --git a/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.resx b/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.resx index ccc3e86..76f7f60 100644 --- a/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.resx +++ b/TEMUKJD/KJDForms/SalesCenterForms/MarketingActivityForm.resx @@ -165,6 +165,12 @@ True + + True + + + True + True diff --git a/TEMUKJD/KJDForms/SalesCenterForms/Old/CouponForm.cs b/TEMUKJD/KJDForms/SalesCenterForms/Old/CouponForm.cs index 4642e71..ea9f600 100644 --- a/TEMUKJD/KJDForms/SalesCenterForms/Old/CouponForm.cs +++ b/TEMUKJD/KJDForms/SalesCenterForms/Old/CouponForm.cs @@ -147,7 +147,7 @@ namespace TemuKJD.KJDForms.SalesCenterForms switch (columnName) { case "colSelect": - if (row.Cells["colCanUse"].Value.ParseToBool()) + if (row.Cells["colCanUse"].Value.ParseToBool() || row.Cells["colSelect"].Value.ParseToBool()) { row.Cells["colSelect"].Value = !row.Cells["colSelect"].Value.ParseToBool(); if (dgvShop.Rows[e.RowIndex].Cells["colSelect"].Value.ParseToBool())