using AllBase; using AllBase.Helper; using AllBase.Model.Result; using NaiBa.Util.Extension; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using TemuKJD.Extension; using TemuKJD.BaseForms; using TemuKJD.ToolForms; using Work; using TemuKJD.BLL; using System.Text.RegularExpressions; using TemuKJD.PDDForms.ProductSelectForms; using TemuKJD.WXForms.ShopForms; using AllBase.Model.Result.PDDResult; using AllBase.Model.Param.WXParam; using AllBase.Model.Result.WXResult; using Newtonsoft.Json; using NaiBa.Util; using AllBase.Model.Config; namespace TemuKJD.WXForms.ProductForms { public partial class WXProdCouponOrderBoomForm : BaseForm { int PageBegin = 1; int PageEnd = 999; string PreType = ""; public CancellationTokenSource cancellationTokenSource { get; set; } = null; public bool IsLoadComplate { get; set; } = false; bool isInit = false; CheckBox chkSelectAll = null; public Dictionary dicCheckedShopId = new Dictionary(); public WXProdCouponOrderBoomForm() { InitializeComponent(); } private void UserSelectDbProductForm_Load(object sender, EventArgs e) { this.splitContainer1.Dock = DockStyle.Fill; btnClearCoupon_Click(null, null); dicCheckedShopId = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_checked_shop_dic"); if (dicCheckedShopId == null) dicCheckedShopId = new Dictionary(); chkSelectAll = dgvShop.Columns["colSelect"].AddHeaderCheckBox(HorizontalAlignment.Center, 0, 0, null, null, false); dgvShop.Columns["colSelect"].HeaderText = ""; //chkSelectAll.Width = chkSelectAll.Height = 13; chkSelectAll.CheckedChanged += chkSelectAll_CheckedChanged; //chkSelectAll.Checked = true; this.dgvSelectProduct.AddSelectorColumn("colCheck"); dgvSelectProduct.AddImgColumn("colProductSkcPic", "colImgUrl"); dgvSelectProduct.AddImgColumn("colSkuFakeImg", "colSkuFakeImgUrl"); dgvSelectProduct.Columns["colSkuFakeImg"].Visible = false; //#if DEBUG if (BaseClass.SaLevel == 1) { //txtIdFilter.Visible = true; //txtExtCodeFilter.Visible = true; //lblIdFilter.Visible = true; //lblExtCodeFilter.Visible = true; } //#endif IsLoadComplate = true; } private void chkSelectAll_CheckedChanged(object sender, EventArgs e) { if (!chkSelectAll.Checked) { foreach (DataGridViewRow row in dgvShop.Rows) { row.Cells["colSelect"].Value = false; } } else { //var list = GlobalConfig.ShopLoginList.Where(s => s.LoginStatus == "登录成功").Select(ss => ss.ShopId); foreach (DataGridViewRow row in dgvShop.Rows) { //if (list.Any(l => l == row.Cells["colShopId"]?.Value?.ToString())) if(row.Visible == true) row.Cells["colSelect"].Value = true; } } foreach (var r in dgvShop.Rows.Cast()) { dicCheckedShopId[r.Cells["colShopId"].Value.ParseToString()] = r.Cells["colSelect"].Value.ParseToBool(); } NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_checked_shop_dic", dicCheckedShopId); } private void btnRefreshShop_Click(object sender, EventArgs e) { pbLoadingShop.Visible = true; RefreshShopLogin(); pbLoadingShop.Visible = false; } private void UserSelectDbProductForm_VisibleChanged(object sender, EventArgs e) { if (Visible == true) { RefreshShopLogin(); if (!isInit) { Task.Run(() => { foreach (var shop in GlobalConfig.ShopLoginList) { //if (shop.LoginStatus == "登录成功") //{ // var rst = WXPreSale.scanProductPreview(shop); // if (!rst.Contains("\"code\":0") && !rst.Contains("\"success\":true")) // { // WXShopListForm.Instance.CheckShopLogin(new string[] { shop.LoginName }, false); // } //} } }); } isInit = true; } } private void RefreshShopLogin() { // 店铺Id var selectIds = dgvShop.Rows.Cast().Where(row => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); // 获取被删除的店铺 List dgvRowList = dgvShop.Rows.Cast().Where(row => !GlobalConfig.ShopLoginList.Any(s => s.ShopId == row.Cells["colShopId"]?.Value?.ToString())).ToList(); // 更新被删除的店铺列表 foreach (var row in dgvRowList) { dgvShop.Rows.Remove(row); } // 绑定其他店铺(含新导入的店铺) foreach (ShopLoginInfo shopEntity in GlobalConfig.ShopLoginList) { if (!string.IsNullOrEmpty(shopEntity.ShopId)) BindShop(shopEntity, selectIds); } cmbFilterShopNotes.Items.Clear(); foreach (var note in GlobalConfig.ShopLoginList.Select(s => s.Notes).Where(s => !s.IsNullOrEmpty()).Distinct()) { cmbFilterShopNotes.Items.Add(note); } cmbFilterShopGroup.Items.Clear(); foreach (var group in GlobalConfig.ShopLoginList.Select(s => s.GroupName).Where(s => !s.IsNullOrEmpty()).Distinct()) { cmbFilterShopGroup.Items.Add(group); } } private void BindShop(ShopLoginInfo shopEntity, List selectShopId = null, string msg = "") { if (shopEntity == null) return; if (shopEntity.is_point_shop_expire) return; if (selectShopId == null) selectShopId = new List(); bool canUse = shopEntity.LoginStatus == "登录成功"; //canUse = true; // 内部库不需要校验登录状态 var row = dgvShop.Rows.Cast().FirstOrDefault(p => p.Cells.GetCellValueFromColumnName("colShopId").ParseToString() == shopEntity.ShopId); var day = DateTime.Now.ToString("yyyyMMdd").ParseToInt(); if (row == null) { this.dgvShop.Rows.Add( //!isInit || (selectShopId.Contains(shopEntity.ShopId) && canUse), dicCheckedShopId.Keys.Contains(shopEntity.ShopId) && dicCheckedShopId[shopEntity.ShopId] == true, shopEntity.LoginName, shopEntity.ShopId, shopEntity.ShopAccount, shopEntity.Notes, shopEntity.GroupName, "选择商品", canUse ? "在线" : "掉线", GlobalConfig.lstWxShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shopEntity.ShopId)?.ExpiresTime > DateTime.Now.AddMinutes(5) ? "可用" : "过期", canUse, GlobalConfig.dicWxShopUploadInfo.ContainsKey(shopEntity.ShopId) ? GlobalConfig.dicWxShopUploadInfo[shopEntity.ShopId].DicDayUploadCount[day] : 0, GlobalConfig.dicWxShopUploadInfo.ContainsKey(shopEntity.ShopId) ? GlobalConfig.dicWxShopUploadInfo[shopEntity.ShopId].OnSaleCount : 0, shopEntity.AddProductRemaining, "", msg ); } else { row.Cells["colSelect"].Value = !isInit || (selectShopId.Contains(shopEntity.ShopId) && canUse); row.Cells["colShopLoginName"].Value = shopEntity.LoginName; row.Cells["colShopName"].Value = shopEntity.ShopAccount; row.Cells["colShopNotes"].Value = shopEntity.Notes; row.Cells["colGroup"].Value = shopEntity.GroupName; row.Cells["colLoginStatus"].Value = canUse ? "在线" : "掉线"; row.Cells["colLoginStatus"].Style.ForeColor = canUse ? Color.Green : Color.Red; row.Cells["colCanUse"].Value = canUse; row.Cells["colApi"].Value = GlobalConfig.lstWxShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shopEntity.ShopId)?.ExpiresTime > DateTime.Now.AddMinutes(5) ? "可用" : "过期"; row.Cells["colRemaining"].Value = shopEntity.AddProductRemaining; row.Cells["colUploadCount"].Value = GlobalConfig.dicWxShopUploadInfo.ContainsKey(shopEntity.ShopId) ? GlobalConfig.dicWxShopUploadInfo[shopEntity.ShopId].DicDayUploadCount[day] : 0; row.Cells["colOnSaleNum"].Value = GlobalConfig.dicWxShopUploadInfo.ContainsKey(shopEntity.ShopId) ? GlobalConfig.dicWxShopUploadInfo[shopEntity.ShopId].OnSaleCount : 0; row.Cells["colMessage"].Value = msg; } displayAuthStatus(shopEntity); } void displayAuthStatus(ShopLoginInfo shop) { var rows = this.dgvShop.Rows.Cast().Where(r => r.Cells["colShopId"].Value.ParseToString() == shop?.ShopId); foreach (var row in rows) { bool canUse = row.Cells["colLoginStatus"].Value.ParseToString() == "在线"; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).Style.ForeColor = canUse ? Color.Blue : Color.Red; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).LinkColor = canUse ? Color.Blue : Color.Red; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).ActiveLinkColor = canUse ? Color.LightBlue : Color.OrangeRed; (row.Cells["colLoginStatus"] as DataGridViewLinkCell).VisitedLinkColor = canUse ? Color.DarkBlue : Color.DarkRed; canUse = row.Cells["colApi"].Value.ParseToString() == "可用"; (row.Cells["colApi"] as DataGridViewLinkCell).Style.ForeColor = canUse ? Color.Blue : Color.Red; (row.Cells["colApi"] as DataGridViewLinkCell).LinkColor = canUse ? Color.Blue : Color.Red; (row.Cells["colApi"] as DataGridViewLinkCell).ActiveLinkColor = canUse ? Color.LightBlue : Color.OrangeRed; (row.Cells["colApi"] as DataGridViewLinkCell).VisitedLinkColor = canUse ? Color.DarkBlue : Color.DarkRed; } } private void dgvShop_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex < 0 || e.RowIndex < 0) return; string headerText = dgvShop.Columns[e.ColumnIndex].HeaderText; string columnName = dgvShop.Columns[e.ColumnIndex].Name; string shopId = dgvShop.Rows[e.RowIndex].Cells["colShopId"].Value.ParseToString(); string shopAccount = dgvShop.Rows[e.RowIndex].Cells["colShopName"].Value.ToString(); var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId.ToString()); var row = dgvShop.Rows[e.RowIndex]; switch (columnName) { case "colSelect": //if (row.Cells["colCanUse"].Value.ParseToBool()) { row.Cells["colSelect"].Value = !row.Cells["colSelect"].Value.ParseToBool(); chkSelectAll.CheckedChanged -= chkSelectAll_CheckedChanged; if (dgvShop.Rows.Cast().All(r => r.Cells["colSelect"].Value.ParseToBool())) chkSelectAll.Checked = true; else chkSelectAll.Checked = false; chkSelectAll.CheckedChanged += chkSelectAll_CheckedChanged; } //else { //BaseMsgForm.ShowInfo("店铺未登录!"); } dicCheckedShopId[row.Cells["colShopId"].Value.ParseToString()] = row.Cells["colSelect"].Value.ParseToBool(); NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_checked_shop_dic", dicCheckedShopId); break; case "colLoginStatus": { if (WXShopListForm.Instance == null) WXShopListForm.Instance = new WXShopListForm(); WXShopListForm.Instance.CheckShopLogin(new string[] { shop.LoginName }, false); WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop); //shopLoginForm.prodUserSelectForm = this; if (shop.LoginStatus != "登录成功") { shopLoginForm.openType = EnumOpenType.login; shopLoginForm.ShowDialog(); RefreshShopLogin(); } else { shopLoginForm.openType = EnumOpenType.manage; shopLoginForm.WindowState = FormWindowState.Maximized; shopLoginForm.Show(); } } break; case "colApi": { WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop); shopLoginForm.openType = EnumOpenType.manage; shopLoginForm.WindowState = FormWindowState.Maximized; shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/servicemarket/detail?serviceId=3984039898079707139"; shopLoginForm.Show(); } break; } } private void btnSearch_Click(object sender, EventArgs e) { var lstShopId = dgvShop.Rows.Cast().Where(row => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); if (lstShopId.Count == 0) { BaseMsgForm.ShowInfo("请选择店铺!"); return; } } private void dgvSelectProduct_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex < 0 || e.RowIndex < 0) return; string headerText = dgvSelectProduct.Columns[e.ColumnIndex].HeaderText; var dbId = dgvSelectProduct.Rows[e.RowIndex].Cells["colSelectId"].Value.ParseToString(); var shopId = dgvSelectProduct.Rows[e.RowIndex].Cells["colSupplierId"].Value.ParseToString(); var draftId = dgvSelectProduct.Rows[e.RowIndex].Cells["colDraftId"].Value.ParseToString(); var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId); switch (headerText) { case "删除": break; case "登录": { WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop); //shopLoginForm.prodUserSelectForm = this; shopLoginForm.openType = EnumOpenType.login; shopLoginForm.ShowDialog(); RefreshShopLogin(); } break; case "进店": { WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop); WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); if (shop.LoginStatus == "登录成功") { shopLoginForm.openType = EnumOpenType.manage; shopLoginForm.WindowState = FormWindowState.Maximized; shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/home"; shopLoginForm.Show(); } else { shopLoginForm.openType = EnumOpenType.login; shopLoginForm.ShowDialog(); RefreshShopLogin(); } } break; case "图片": { ShowImgForm imgFrom = new ShowImgForm(dgvSelectProduct.Rows[e.RowIndex].Cells["colImgUrl"].Value.ParseToString()); imgFrom.ShowDialog(); break; } case "SKU替换图": { ShowImgForm imgFrom = new ShowImgForm(dgvSelectProduct.Rows[e.RowIndex].Cells["colSkuFakeImgUrl"].Value.ParseToString()); imgFrom.ShowDialog(); break; } case "": dgvSelectProduct.Rows[e.RowIndex].Cells["colCheck"].Value = !(bool)dgvSelectProduct.Rows[e.RowIndex].Cells["colCheck"].Value; break; default: break; } } Task tskPreSale = null; private void btnSetPreSale_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 (cmbCouponType.Text != "满减" && cmbCouponType.Text != "每满" && cmbCouponType.Text != "直减" && cmbCouponType.Text != "统一折扣" && cmbCouponType.Text != "条件折扣") { BaseMsgForm.ShowError("请填写正确的优惠方式参数!"); return; } if (cmbCouponType.Text == "满减" && (txtProductPrice.Text.Trim().ParseToDecimal() == 0 || txtDiscountFee.Text.Trim().ParseToDecimal() == 0)) { BaseMsgForm.ShowError("请填写正确的优惠方式参数!"); return; } else if (cmbCouponType.Text == "每满" && (txtProductPrice.Text.Trim().ParseToDecimal() == 0 || txtDiscountFee.Text.Trim().ParseToDecimal() == 0)) { BaseMsgForm.ShowError("请填写正确的优惠方式参数!"); return; } else if (cmbCouponType.Text == "直减" && (txtDiscountFee.Text.Trim().ParseToDecimal() == 0)) { BaseMsgForm.ShowError("请填写正确的优惠方式参数!"); return; } else if (cmbCouponType.Text == "统一折扣" && (txtDiscountNum.Text.Trim().ParseToDecimal() == 0)) { BaseMsgForm.ShowError("请填写正确的优惠方式参数!"); return; } else if (cmbCouponType.Text == "条件折扣" && (txtProductCnt.Text.Trim().ParseToDecimal() == 0 || txtDiscountNum.Text.Trim().ParseToDecimal() == 0)) { BaseMsgForm.ShowError("请填写正确的优惠方式参数!"); return; } else if (cmbCouponType.Text == "统一折扣" && (txtDiscountNum.Text.Trim().ParseToDecimal() > 9.9m || txtDiscountNum.Text.Trim().ParseToDecimal() < 2)) { BaseMsgForm.ShowError("折扣必须在2-9.9之间,最多一位小数"); return; } else if (cmbCouponType.Text == "条件折扣" && (txtDiscountNum.Text.Trim().ParseToDecimal() > 9.9m || txtDiscountNum.Text.Trim().ParseToDecimal() < 2)) { BaseMsgForm.ShowError("折扣必须在2-9.9之间,最多一位小数"); return; } if (txtLimitNumOnePerson.Text.Trim().ParseToInt() == 0) { BaseMsgForm.ShowError("请填写正确的限领参数!"); return; } if (txtTotalCnt.Text.Trim().ParseToInt() == 0) { BaseMsgForm.ShowError("请填写正确的发放数量参数!"); return; } this.pbLoading.Visible = true; this.btnSetPreSale.Enabled = false; cancellationTokenSource = new CancellationTokenSource(); dgvSelectProduct.Columns["colCouponNum"].Visible = false; tskPreSale = Task.Run(() => { SetProdCoupon(rowLst.Select(r => r.Cells["colDraftId"].Value.ParseToString()).Distinct().ToList()); Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "商品设置完毕"; BaseMsgForm.ShowInfo("商品设置完毕"); this.pbLoading.Visible = false; this.btnSetPreSale.Enabled = true; })); }, cancellationTokenSource.Token); } void SetProdCoupon(List prodIdLst) { Invoke(new Action(() => { this.pbLoading.Visible = true; this.statusBar.lblTaskStatus.Text = "正在设置" + "...".Substring(0, DateTime.Now.Second % 4); this.statusBar.pgbTaskProgress.Maximum = prodIdLst.Count; this.statusBar.UpdateProgressBar(0); })); foreach (var prodId in prodIdLst) { var row = dgvSelectProduct.Rows.Cast().FirstOrDefault(r => r.Cells["colDraftId"].Value.ParseToString() == prodId); Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在设置" + "...".Substring(0, DateTime.Now.Second % 4); this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1); row.Cells["colOpResult"].Value = ""; })); if (cancellationTokenSource.IsCancellationRequested) break; var shopId = row.Cells["colSupplierId"].Value.ParseToString(); var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId); if (shop == null) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "店铺不存在"; })); continue; } if (shop.LoginStatus != "登录成功") { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "店铺掉线"; })); continue; } WXCouponParamBase wxCouponParam = new WXCouponParamBase(); Thread.Sleep(Randomx.GetId(200, 500)); //wxCouponParam.check = true; wxCouponParam.coupon.couponInfo.name = prodId; wxCouponParam.coupon.couponInfo.discountInfo.discountCondition.productIds.Add(prodId.ParseToLong()); wxCouponParam.coupon.couponInfo.extInfo.autoValidTime = BaseClass.DateTimeToTimestampSeconds(startTime); wxCouponParam.coupon.couponInfo.receiveInfo.startTime = BaseClass.DateTimeToTimestampSeconds(startTime); wxCouponParam.coupon.couponInfo.receiveInfo.endTime = BaseClass.DateTimeToTimestampSeconds(endTime); wxCouponParam.coupon.couponInfo.validInfo.startTime = BaseClass.DateTimeToTimestampSeconds(startTime); wxCouponParam.coupon.couponInfo.validInfo.endTime = BaseClass.DateTimeToTimestampSeconds(endTime); wxCouponParam.coupon.couponInfo.receiveInfo.limitNumOnePerson = limitNumOnePerson; wxCouponParam.coupon.couponInfo.receiveInfo.totalNum = totalCnt.ParseToString(); if (couponType == "满减") { wxCouponParam.coupon.couponKey.type = 2; wxCouponParam.coupon.couponInfo.discountInfo.discountCondition.productPrice = productPriceValue.ParseToString(); wxCouponParam.coupon.couponInfo.discountInfo.discountFee = discountFeeValue.ParseToString(); } else if (couponType == "每满") { wxCouponParam.coupon.couponKey.type = 2; wxCouponParam.coupon.couponInfo.discountInfo.isCanUp = true; wxCouponParam.coupon.couponInfo.discountInfo.discountCondition.productPrice = productPriceValue.ParseToString(); wxCouponParam.coupon.couponInfo.discountInfo.discountFee = discountFeeValue.ParseToString(); } else if (couponType == "直减") { wxCouponParam.coupon.couponKey.type = 4; wxCouponParam.coupon.couponInfo.discountInfo.discountFee = discountFeeValue.ParseToString(); } else if (couponType == "统一折扣") { wxCouponParam.coupon.couponKey.type = 3; wxCouponParam.coupon.couponInfo.discountInfo.discountNum = discountNum.ToString("0.##"); } else if (couponType == "条件折扣") { wxCouponParam.coupon.couponKey.type = 1; wxCouponParam.coupon.couponInfo.discountInfo.discountCondition.productCnt = productCnt; wxCouponParam.coupon.couponInfo.discountInfo.discountNum = discountNum.ToString("0.##"); } Thread.Sleep(Randomx.GetId(200, 500)); if (chkSkipSet.Checked) { var searchCouponRst = WxCoupon.WxSearchCoupon(shop, prodId); if (searchCouponRst.Contains("biz magic invalid")) { WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); } if (!searchCouponRst.Contains("\"success\":true") && !searchCouponRst.Contains("\"code\":0")) { var errmsg = BaseRegex.GetStringJson(ref searchCouponRst, "msg"); if (string.IsNullOrWhiteSpace(errmsg)) errmsg = searchCouponRst; Invoke(new Action(() => { row.Cells["colOpResult"].Value = errmsg; })); continue; } if (searchCouponRst.Contains("\"code\":0")) { var totalNum = BaseRegex.GetStringJson(ref searchCouponRst, "totalNum"); Invoke(new Action(() => { row.Cells["colCouponNum"].Value = totalNum; })); var issuedNum = 0; try { var jCoupons = JsonHelper.JObjectParse(searchCouponRst); foreach(var coupon in jCoupons) { var couponStr = JsonHelper.SerializeObject(coupon); //var receiveNum = BaseRegex.GetStringJson(ref couponStr, "receiveNum"); issuedNum = BaseRegex.GetStringJson(ref couponStr, "issuedNum").ParseToInt(); if (issuedNum > 0) break; } } catch { } if (issuedNum.ParseToInt() > 0) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "商品还有未领取的专属优惠券,跳过"; })); continue; } } } var addCouponRst = WxCoupon.WxSetCoupon(shop, wxCouponParam); Thread.Sleep(Randomx.GetId(50, 100)); if(addCouponRst.Contains("biz magic invalid")) { WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); } if (!addCouponRst.Contains("\"success\":true") && !addCouponRst.Contains("\"code\":0")) { var errmsg = BaseRegex.GetStringJson(ref addCouponRst, "msg"); if (string.IsNullOrWhiteSpace(errmsg)) errmsg = addCouponRst; Invoke(new Action(() => { row.Cells["colOpResult"].Value = errmsg; })); continue; } if (addCouponRst.Contains("\"code\":0")) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "设置成功"; })); } } } private void btnStop_Click(object sender, EventArgs e) { if (this.cancellationTokenSource != null) this.cancellationTokenSource.Cancel(); } private void btnSearchProd_Click(object sender, EventArgs e) { var shopIdLst = dgvShop.Rows.Cast().Where(row => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); if (shopIdLst.Count <= 0) { BaseMsgForm.ShowError("未勾选上传店铺!"); return; } btnSearchProd.Enabled = false; pbLoading.Visible = true; cancellationTokenSource = new CancellationTokenSource(); dgvSelectProduct.Rows.Clear(); dgvSelectProduct.Columns["colCouponNum"].Visible = false; Task.Run(() => { GetProduct(shopIdLst); Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "商品查询完毕"; BaseMsgForm.ShowInfo("商品查询完毕"); pbLoading.Visible = false; btnSearchProd.Enabled = true; })); }, cancellationTokenSource.Token); } void GetProduct(List shopIdLst) { List shopLst = GlobalConfig.ShopLoginList.Where(s => shopIdLst.Contains(s.ShopId)).ToList(); foreach(var shop in shopLst) { if(cancellationTokenSource.IsCancellationRequested) break; if (shop.LoginStatus != "登录成功") { continue; } int page = PageBegin - 1; int totalPage = 1; int pageSize = 50; string nextKey = ""; while (page < totalPage && page < PageEnd) { page++; if (cancellationTokenSource.IsCancellationRequested) break; string getProdOnSaleRst = ""; if (string.IsNullOrEmpty(PreType) && sortType == null) getProdOnSaleRst = WXProdNoCheckEditHelper.scanProductPreview(shop, page, nextKey, pageSize); else getProdOnSaleRst = WXProdNoCheckEditHelper.searchProduct(shop, page, null, pageSize, sortType); Thread.Sleep(Randomx.GetId(50, 100)); if (!getProdOnSaleRst.Contains("\"success\":true")) { var error = BaseRegex.GetStringJson(ref getProdOnSaleRst, "msg"); if (string.IsNullOrEmpty(error)) error = getProdOnSaleRst; WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); if (shop.LoginStatus != "登录成功") { Invoke(new Action(() => { BindShop(shop, shopIdLst, "店铺掉线"); })); } var shopRow = dgvShop.Rows.Cast().FirstOrDefault(r => r.Cells["colShopId"].Value.ParseToString() == shop.ShopId); Invoke(new Action(() => { if (shopRow != null) { shopRow.Cells["colOpResult"].Value = error; } })); break; } try { var prodObjs = JsonHelper.JObjectParse(getProdOnSaleRst); if (page == 1 || 1 == 1) { var totalNum = prodObjs["totalNum"].ParseToInt(); totalPage = Math.Ceiling(1m * totalNum / pageSize).ParseToInt(); } nextKey = prodObjs["nextKey"].ParseToString(); Invoke(new Action(() => { this.pbLoading.Visible = true; this.statusBar.lblTaskStatus.Text = "正在查询店铺:" + shop.ShopAccount + " " + page + "/" + Math.Min(PageEnd, totalPage); //this.statusBar.pgbTaskProgress.Maximum = lstTemuDBProductSelect.Count; //this.statusBar.UpdateProgressBar(0); })); foreach (JObject prod in prodObjs["productList"]) { var pStr = JsonHelper.SerializeObject(prod); Invoke(new Action(() => { decimal? price = null; try { price = prod["skuList"][0]["price"].ParseToDecimal() / 100; } catch { } var prodId = prod["productId"].ParseToString(); if (dgvSelectProduct.Rows.Cast().Any(r => r.Cells["colDraftId"].ParseToString() == prodId)) { } var rowIndex = this.dgvSelectProduct.Rows.Add( false, "", shop.ShopId, shop.ShopAccount, "登录", "进店", "", "", prod["productId"].ParseToString(), prod["headImg"].ParseToString(), DataGridViewExtension.defaultBitmap, "", // 替换图地址 null, // 替换图 prod["title"].ParseToString(), // 用户端显示商品原名 (prod["recommendCategory"].IsJTokenNullOrEmpty() || prod["recommendCategory"]["categoryNames"].IsJTokenNullOrEmpty()) ? "" : string.Join(" >> ", prod["recommendCategory"]["categoryNames"].Select(s => s.ParseToString())), // 类目名称 prod["spuCode"].ParseToString(), //price, prod["price"].ParseToDecimal() * 0.01m, prod["soldNum"].ParseToInt(), "在售" + (prod["presaleTag"].ParseToInt() == 1 ? "[预售]" : ""), "", // 备注 "", "删除", BaseClass.StampToDateTime(prod["lastEditDraftTime"].ParseToInt()).ToString("yy-MM-dd HH:mm"), ""); dgvSelectProduct.Rows[rowIndex].Height = 60; dgvSelectProduct.Rows[rowIndex].Cells["colMsg"].Style.ForeColor = dgvSelectProduct.Rows[rowIndex].Cells["colMsg"].Value.ParseToString().Contains("预售") ? Color.Orange : Color.Blue; })); } } catch (Exception ex) { } } } } private void btnClearDgv_Click(object sender, EventArgs e) { var rows = this.dgvSelectProduct.Rows.Cast().ToList(); //Cast后Rows做foreach循环时仍会夹花跳过,所以要ToList转一个新的数组。 foreach (var row in rows) { if (row.Cells["colCheck"].Value.ParseToBool() == true) { //var draft_id = row.Cells["colDraftId"].Value.ParseToString(); //upload_draft_product_lst.RemoveAll(p => p.draft_id == draft_id); this.dgvSelectProduct.Rows.Remove(row); } } //NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_select_upload_draft_products", upload_draft_product_lst); } private void btnClearFilter_Click(object sender, EventArgs e) { txtFiltSaleNumMoreThan.Text = "0"; txtFiltSaleNumLessThan.Text = "1"; } private void txtPreDays_TextChanged(object sender, EventArgs e) { } private void chkPreSale_CheckedChanged(object sender, EventArgs e) { } private void btnFilterShop_Click(object sender, EventArgs e) { string notes = cmbFilterShopNotes.Text.Trim().Trim(';'); if (notes == "全部") notes = ""; List notesLst = notes.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); string group = cmbFilterShopGroup.Text.Trim().Trim(';'); if (group == "全部") group = ""; List groupLst = group.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); foreach (DataGridViewRow row in dgvShop.Rows) { if (!row.Cells["colShopName"].Value.ParseToString().Contains(txtFilterShopName.Text.Trim())) { row.Visible = false; row.Cells["colSelect"].Value = false; continue; } if (!string.IsNullOrWhiteSpace(notes) && !notesLst.Contains(row.Cells["colShopNotes"].Value.ParseToString())) { row.Visible = false; row.Cells["colSelect"].Value = false; continue; } if (!string.IsNullOrWhiteSpace(group) && !groupLst.Contains(row.Cells["colGroup"].Value.ParseToString())) { row.Visible = false; row.Cells["colSelect"].Value = false; continue; } row.Visible = true; } } private void btnEmptyShop_Click(object sender, EventArgs e) { txtFilterShopName.Text = ""; cmbFilterShopNotes.Text = "全部"; cmbFilterShopGroup.Text = "全部"; btnFilterShop_Click(null, null); } private void btnReverse_Click(object sender, EventArgs e) { foreach(DataGridViewRow row in dgvShop.Rows) { if (row.Visible == true) row.Cells["colSelect"].Value = !row.Cells["colSelect"].Value.ParseToBool(); } } private void btnAddSelect_Click(object sender, EventArgs e) { string notes = cmbFilterShopNotes.Text.Trim().Trim(';'); if (notes == "全部") notes = ""; List notesLst = notes.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); string group = cmbFilterShopGroup.Text.Trim().Trim(';'); if (group == "全部") group = ""; List groupLst = group.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); foreach (DataGridViewRow row in dgvShop.Rows) { if (row.Visible == false) continue; if (!row.Cells["colShopName"].Value.ParseToString().Contains(txtFilterShopName.Text.Trim())) continue; if (!string.IsNullOrWhiteSpace(notes) && !notesLst.Contains(row.Cells["colShopNotes"].Value.ParseToString())) continue; if (!string.IsNullOrWhiteSpace(group) && !groupLst.Contains(row.Cells["colGroup"].Value.ParseToString())) continue; row.Cells["colSelect"].Value = true; } } private void btnAddUnSelect_Click(object sender, EventArgs e) { string notes = cmbFilterShopNotes.Text.Trim().Trim(';'); if (notes == "全部") notes = ""; List notesLst = notes.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); string group = cmbFilterShopGroup.Text.Trim().Trim(';'); if (group == "全部") group = ""; List groupLst = group.Split(new string[] { ";", ";", ",", "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); foreach (DataGridViewRow row in dgvShop.Rows) { if (row.Visible == false) continue; if (!row.Cells["colShopName"].Value.ParseToString().Contains(txtFilterShopName.Text.Trim())) continue; if (!string.IsNullOrWhiteSpace(notes) && !notesLst.Contains(row.Cells["colShopNotes"].Value.ParseToString())) continue; if (!string.IsNullOrWhiteSpace(group) && !groupLst.Contains(row.Cells["colGroup"].Value.ParseToString())) continue; row.Cells["colSelect"].Value = false; } } private void btnSelectOnline_Click(object sender, EventArgs e) { foreach (DataGridViewRow row in dgvShop.Rows) { if (row.Visible == true) { if (row.Cells["colLoginStatus"].Value.ParseToString() == "在线") { row.Cells["colSelect"].Value = true; } else { row.Cells["colSelect"].Value = false; } } } } private void btnSelectOffline_Click(object sender, EventArgs e) { foreach (DataGridViewRow row in dgvShop.Rows) { if (row.Visible == true) { if (row.Cells["colLoginStatus"].Value.ParseToString() != "在线") { row.Cells["colSelect"].Value = true; } else { row.Cells["colSelect"].Value = false; } } } } private void txtPageBegin_TextChanged(object sender, EventArgs e) { PageEnd = txtPageBegin.Text.ParseToInt(); } private void txtPageEnd_TextChanged(object sender, EventArgs e) { PageEnd = txtPageEnd.Text.ParseToInt(); } private void cmbPreType_SelectedIndexChanged(object sender, EventArgs e) { PreType = cmbPreType.Text.Trim(); } private void btnFiltSelectMoreThan_Click(object sender, EventArgs e) { foreach(DataGridViewRow row in dgvSelectProduct.Rows) { if (row.Cells["colSoldNum"].Value.ParseToInt() > txtFiltSaleNumMoreThan.Text.Trim().ParseToInt()) row.Cells["colCheck"].Value = true; else row.Cells["colCheck"].Value = false; } } private void btnFiltSelectLessThan_Click(object sender, EventArgs e) { foreach (DataGridViewRow row in dgvSelectProduct.Rows) { if (row.Cells["colSoldNum"].Value.ParseToInt() >= txtFiltSaleNumLessThan.Text.Trim().ParseToInt()) row.Cells["colCheck"].Value = false; else row.Cells["colCheck"].Value = true; } } string couponType = "满减"; private void cmbCouponType_TextChanged(object sender, EventArgs e) { couponType = cmbCouponType.Text; //满减 //每满 //直减 //统一折扣 //条件折扣 foreach (Control c in flowLayoutPanel1.Controls) { c.Visible = false; lblProductPrice.Text = "满"; lblDiscountFee.Text = "减"; } if (cmbCouponType.Text == "满减") { lblProductPrice.Text = "满"; lblProductPrice.Visible = true; txtProductPrice.Visible = true; lblDiscountFee.Visible = true; txtDiscountFee.Visible = true; } else if (cmbCouponType.Text == "每满") { lblProductPrice.Text = "每满"; lblProductPrice.Visible = true; txtProductPrice.Visible = true; lblDiscountFee.Visible = true; txtDiscountFee.Visible = true; } else if (cmbCouponType.Text == "直减") { lblDiscountFee.Text = "直减"; lblDiscountFee.Visible = true; txtDiscountFee.Visible = true; } else if (cmbCouponType.Text == "统一折扣") { lblDiscountNum.Visible = true; txtDiscountNum.Visible = true; } else if (cmbCouponType.Text == "条件折扣") { lblProductPrice.Visible = true; lblProductCnt.Visible = true; txtProductCnt.Visible = true; lblDiscountNum.Visible = true; txtDiscountNum.Visible = true; } } private void btnClearCoupon_Click(object sender, EventArgs e) { txtProductPrice.Text = ""; txtDiscountFee.Text = ""; txtProductCnt.Text = ""; txtDiscountNum.Text = ""; txtTotalCnt.Text = "100"; txtLimitNumOnePerson.Text = "1"; dtpStartTime.Value = DateTime.Now.Date; dtpEndTime.Value = DateTime.Now.Date.AddDays(30); } decimal productPriceValue = 0; private void txtProductPrice_TextChanged(object sender, EventArgs e) { productPriceValue = txtProductPrice.Text.Trim().ParseToDecimal(); } decimal discountFeeValue = 0; private void txtDiscountFee_TextChanged(object sender, EventArgs e) { discountFeeValue = txtDiscountFee.Text.Trim().ParseToDecimal(); } int productCnt = 0; private void txtProductCnt_TextChanged(object sender, EventArgs e) { productCnt = txtProductCnt.Text.Trim().ParseToInt(); } decimal discountNum = 0; private void txtDiscountNum_TextChanged(object sender, EventArgs e) { discountNum = txtDiscountNum.Text.Trim().ParseToDecimal(); } int totalCnt = 100; private void txtTotalCnt_TextChanged(object sender, EventArgs e) { totalCnt = txtTotalCnt.Text.Trim().ParseToInt(); } int limitNumOnePerson = 1; private void txtLimitNumOnePerson_TextChanged(object sender, EventArgs e) { limitNumOnePerson = txtLimitNumOnePerson.Text.Trim().ParseToInt(); } DateTime startTime = DateTime.Now.Date; private void dtpStartTime_ValueChanged(object sender, EventArgs e) { startTime = dtpStartTime.Value; } DateTime endTime = DateTime.Now.Date.AddDays(30); private void dtpEndTime_ValueChanged(object sender, EventArgs e) { endTime = dtpEndTime.Value; } private void btnEndCoupon_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; } this.pbLoading.Visible = true; this.btnSetPreSale.Enabled = false; cancellationTokenSource = new CancellationTokenSource(); dgvSelectProduct.Columns["colCouponNum"].HeaderText = "生效券数量"; dgvSelectProduct.Columns["colCouponNum"].Visible = true; Task.Run(() => { EndProdCoupon(rowLst); Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "优惠券作废删除完毕"; BaseMsgForm.ShowInfo("优惠券作废删除完毕"); this.pbLoading.Visible = false; this.btnSetPreSale.Enabled = true; })); }, cancellationTokenSource.Token); } void EndProdCoupon(List rowLst) { Invoke(new Action(() => { this.pbLoading.Visible = true; this.statusBar.lblTaskStatus.Text = "正在作废删除" + "...".Substring(0, DateTime.Now.Second % 4); this.statusBar.pgbTaskProgress.Maximum = rowLst.Count; this.statusBar.UpdateProgressBar(0); })); foreach (var row in rowLst) { if (cancellationTokenSource.IsCancellationRequested) break; Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在作废删除" + "...".Substring(0, DateTime.Now.Second % 4); this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1); row.Cells["colOpResult"].Value = ""; row.Cells["colCouponNum"].Value = ""; })); var prodId = row.Cells["colDraftId"].Value.ParseToString(); var shopId = row.Cells["colSupplierId"].Value.ParseToString(); var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId); if (shop == null) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "店铺不存在"; })); continue; } if (shop.LoginStatus != "登录成功") { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "店铺掉线"; })); continue; } var searchCouponRst = WxCoupon.WxSearchCoupon(shop, prodId); Thread.Sleep(Randomx.GetId(500, 1000)); if (searchCouponRst.Contains("biz magic invalid")) { WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); } if (!searchCouponRst.Contains("\"success\":true") && !searchCouponRst.Contains("\"code\":0")) { var errmsg = BaseRegex.GetStringJson(ref searchCouponRst, "msg"); if (string.IsNullOrWhiteSpace(errmsg)) errmsg = searchCouponRst; Invoke(new Action(() => { row.Cells["colOpResult"].Value = errmsg; })); continue; } if (searchCouponRst.Contains("\"code\":0")) { var totalNum = BaseRegex.GetStringJson(ref searchCouponRst, "totalNum"); Invoke(new Action(() => { row.Cells["colCouponNum"].Value = totalNum; })); if (totalNum == "0") { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "商品无专属优惠券,跳过"; })); continue; } try { var couponLst = JsonHelper.DeserializeJsonToList(JsonHelper.JObjectParse(searchCouponRst)["coupons"].ToString()); string errMsg = ""; foreach (var coupon in couponLst) { var endRst = WxCoupon.WxEndCoupon(shop, coupon.couponKey.couponId.ParseToString()); Thread.Sleep(Randomx.GetId(100, 300)); if (!endRst.Contains("\"code\":0")) { var err = BaseRegex.GetStringJson(ref endRst, "msg"); if (string.IsNullOrWhiteSpace(err)) err = endRst; errMsg += coupon.couponKey.couponId + " " + err + " \r\n"; continue; } var delRst = WxCoupon.WxDelCoupon(shop, coupon.couponKey.couponId.ParseToString()); Thread.Sleep(Randomx.GetId(100, 300)); if (!delRst.Contains("\"code\":0")) { var err = BaseRegex.GetStringJson(ref delRst, "msg"); if (string.IsNullOrWhiteSpace(err)) err = delRst; errMsg += coupon.couponKey.couponId + " " + err + " \r\n"; continue; } } if (!errMsg.IsNullOrEmpty()) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "作废删除失败 " + errMsg; })); } else { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "作废删除成功"; })); } } catch (Exception ex) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "作废删除失败 优惠券格式转换失败"; })); } } } } int? sortType = null; private void cmbSaleSort_TextChanged(object sender, EventArgs e) { sortType = null; if (cmbSaleSort.Text == "降序") sortType = 6; if (cmbSaleSort.Text == "升序") sortType = 5; } private void btnPromotion_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 (ratioValue < 1 || ratioValue > 50) { BaseMsgForm.ShowError("佣金范围为1到50!"); return; } this.pbLoading.Visible = true; this.btnSetPreSale.Enabled = false; cancellationTokenSource = new CancellationTokenSource(); dgvSelectProduct.Columns["colCouponNum"].Visible = false; Task.Run(() => { SetPromotion(rowLst); Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "商品设置推广完毕"; BaseMsgForm.ShowInfo("商品设置推广完毕"); this.pbLoading.Visible = false; this.btnSetPreSale.Enabled = true; })); }, cancellationTokenSource.Token); } void SetPromotion(List rowLst) { Invoke(new Action(() => { this.pbLoading.Visible = true; this.statusBar.lblTaskStatus.Text = "正在设置" + "...".Substring(0, DateTime.Now.Second % 4); this.statusBar.pgbTaskProgress.Maximum = rowLst.Count; this.statusBar.UpdateProgressBar(0); })); while(rowLst.Count > 0) { if (cancellationTokenSource.IsCancellationRequested) break; var r0 = rowLst.FirstOrDefault(); var shopId = r0.Cells["colSupplierId"].Value.ParseToString(); var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId); var rowLstTmp = rowLst.Where(r => r.Cells["colSupplierId"].Value.ParseToString() == shopId).Take(30).ToList(); foreach(var r in rowLstTmp) { rowLst.Remove(r); Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在设置" + "...".Substring(0, DateTime.Now.Second % 4); this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1); r.Cells["colOpResult"].Value = ""; })); } if (shop == null) { Invoke(new Action(() => { foreach (var r in rowLstTmp) { r.Cells["colOpResult"].Value = "店铺不存在"; } })); continue; } if (shop.LoginStatus != "登录成功") { Invoke(new Action(() => { foreach (var r in rowLstTmp) { r.Cells["colOpResult"].Value = "店铺掉线"; } })); continue; } List prodIdLst = new List(); List prodIdTmpLst = new List(); foreach (var row in rowLstTmp) { var prodId = row.Cells["colDraftId"].Value.ParseToString(); prodIdTmpLst.Add(prodId); } var prodCanPromotionRst = WxCoupon.WxGetCanPromotion(shop, prodIdTmpLst); Thread.Sleep(Randomx.GetId(300, 800)); if (prodCanPromotionRst.Contains("biz magic invalid")) { WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); } if (!prodCanPromotionRst.Contains("\"success\":true") && !prodCanPromotionRst.Contains("\"code\":0")) { var errmsg = BaseRegex.GetStringJson(ref prodCanPromotionRst, "msg"); if (string.IsNullOrWhiteSpace(errmsg)) errmsg = prodCanPromotionRst; Invoke(new Action(() => { foreach (var row in rowLstTmp) row.Cells["colOpResult"].Value = errmsg; })); continue; } if (prodCanPromotionRst.Contains("\"code\":0")) { try { var itemLst = JsonHelper.JObjectParse(prodCanPromotionRst)["itemList"]; foreach(JObject itemObj in itemLst) { var spuId = itemObj["spuId"].ParseToLong(); var status = itemObj["status"].ParseToInt(); if (status == 4) { prodIdLst.Add(spuId.ParseToString()); } else { var row = rowLstTmp.FirstOrDefault(r => r.Cells["colDraftId"].Value.ParseToString() == spuId.ParseToString()); if (row != null) { Invoke(new Action(() => { if (status == 1) row.Cells["colOpResult"].Value = "已存在普通推广,跳过"; else row.Cells["colOpResult"].Value = "商品不符合推广条件,跳过"; })); } } } if (prodIdLst.Count > 0) { var addPromotionRst = WxCoupon.WxAddPromotion(shop, prodIdLst, (ratioValue * 10000).ParseToInt()); Thread.Sleep(Randomx.GetId(500, 1500)); //{"code":0,"errCodeList":[0,0,15978008]} if (!addPromotionRst.Contains("\"code\":0")) { var errmsg = BaseRegex.GetStringJson(ref addPromotionRst, "msg"); if (string.IsNullOrWhiteSpace(errmsg)) errmsg = addPromotionRst; foreach (var prodId in prodIdLst) { var row = rowLstTmp.FirstOrDefault(r => r.Cells["colDraftId"].Value.ParseToString() == prodId.ParseToString()); if (row != null) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "推广失败," + errmsg; })); } } } else { var errCodeLst = (JsonHelper.JObjectParse(addPromotionRst)["errCodeList"] as JArray).Select(code => code.ParseToLong()).ToList(); for (int i = 0; i < errCodeLst.Count; i++) { var prodId = prodIdLst[i]; var errCode = errCodeLst[i]; var row = rowLstTmp.FirstOrDefault(r => r.Cells["colDraftId"].Value.ParseToString() == prodId.ParseToString()); if (row != null) { Invoke(new Action(() => { if (errCode == 15978008) row.Cells["colOpResult"].Value = "推广设置失败,佣金比例错误,错误码 " + errCode; else if (errCode > 0) row.Cells["colOpResult"].Value = "推广设置失败,错误码 " + errCode; else row.Cells["colOpResult"].Value = "推广设置成功"; })); } } } } } catch (Exception ex) { Invoke(new Action(() => { foreach (var r in rowLstTmp) { if (r.Cells["colOpResult"].Value.ParseToString().IsNullOrEmpty()) r.Cells["colOpResult"].Value = "推广失败" + ex.Message; } })); } //Invoke(new Action(() => //{ // row.Cells["colOpResult"].Value = "设置成功"; //})); } } } decimal ratioValue = 1; private void txtRatio_TextChanged(object sender, EventArgs e) { ratioValue = txtRatio.Text.Trim().ParseToDecimal(); } private void btnEndPromotion_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; } this.pbLoading.Visible = true; this.btnSetPreSale.Enabled = false; cancellationTokenSource = new CancellationTokenSource(); dgvSelectProduct.Columns["colCouponNum"].HeaderText = "生效推广数量"; dgvSelectProduct.Columns["colCouponNum"].Visible = true; Task.Run(() => { EndProdPromotion(rowLst); Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "推广取消完毕"; BaseMsgForm.ShowInfo("推广取消完毕"); this.pbLoading.Visible = false; this.btnSetPreSale.Enabled = true; })); }, cancellationTokenSource.Token); } void EndProdPromotion(List rowLst) { Invoke(new Action(() => { this.pbLoading.Visible = true; this.statusBar.lblTaskStatus.Text = "正在取消推广" + "...".Substring(0, DateTime.Now.Second % 4); this.statusBar.pgbTaskProgress.Maximum = rowLst.Count; this.statusBar.UpdateProgressBar(0); })); foreach (var row in rowLst) { if (cancellationTokenSource.IsCancellationRequested) break; Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在取消推广" + "...".Substring(0, DateTime.Now.Second % 4); this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1); row.Cells["colOpResult"].Value = ""; row.Cells["colCouponNum"].Value = ""; })); var prodId = row.Cells["colDraftId"].Value.ParseToString(); var shopId = row.Cells["colSupplierId"].Value.ParseToString(); var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ShopId == shopId); if (shop == null) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "店铺不存在"; })); continue; } if (shop.LoginStatus != "登录成功") { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "店铺掉线"; })); continue; } var searchPromotionRst = WxCoupon.WxSearchPromotion(shop, prodId); Thread.Sleep(Randomx.GetId(500, 1000)); if (searchPromotionRst.Contains("biz magic invalid")) { WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); } if (!searchPromotionRst.Contains("\"success\":true") && !searchPromotionRst.Contains("\"code\":0")) { var errmsg = BaseRegex.GetStringJson(ref searchPromotionRst, "msg"); if (string.IsNullOrWhiteSpace(errmsg)) errmsg = searchPromotionRst; Invoke(new Action(() => { row.Cells["colOpResult"].Value = errmsg; })); continue; } if (searchPromotionRst.Contains("\"code\":0")) { var totalNum = BaseRegex.GetStringJson(ref searchPromotionRst, "totalNum"); Invoke(new Action(() => { row.Cells["colCouponNum"].Value = totalNum; })); if (totalNum == "0") { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "商品无推广,跳过"; })); continue; } try { var promArr = JsonHelper.JObjectParse(searchPromotionRst)["itemList"] as JArray; string errMsg = ""; foreach (JObject promObj in promArr) { var endRst = WxCoupon.WxEndPromotion(shop, promObj["spuId"].ParseToString()); Thread.Sleep(Randomx.GetId(100, 300)); if (!endRst.Contains("\"code\":0")) { var err = BaseRegex.GetStringJson(ref endRst, "msg"); if (string.IsNullOrWhiteSpace(err)) err = endRst; errMsg += promObj["spuId"].ParseToString() + " " + err + " \r\n"; continue; } var delRst = WxCoupon.WxDelPromotion(shop, promObj["spuId"].ParseToString()); Thread.Sleep(Randomx.GetId(100, 300)); if (!delRst.Contains("\"code\":0")) { var err = BaseRegex.GetStringJson(ref delRst, "msg"); if (string.IsNullOrWhiteSpace(err)) err = delRst; errMsg += promObj["spuId"].ParseToString() + " " + err + " \r\n"; continue; } } if (!errMsg.IsNullOrEmpty()) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "取消推广失败 " + errMsg; })); } else { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "取消推广成功"; })); } } catch (Exception ex) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "取消推广失败 推广格式转换失败"; })); } } } } private void ucGroupBoxEx3_Enter(object sender, EventArgs e) { } } public class WxCoupon { public static string WxSetCoupon(ShopLoginInfo shop, WXCouponParamBase couponParam) { string url = "https://store.weixin.qq.com/shop-faas/market/coupon/cgi/makeQp?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/marketing/coupon/make?type=990"; JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; var prodStr = JsonConvert.SerializeObject(couponParam, jsonSetting); string body = prodStr; //JsonHelper.SerializeObject(jObj); var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); return result; } //{"pageSize":20,"page":0,"couponName":"10000509758262","couponCustomizeChannel":"","couponTypeList":[],"promoteTypeList":[],"couponStatusList":[]} public static string WxSearchCoupon(ShopLoginInfo shop, string couponName) { string url = "https://store.weixin.qq.com/shop-faas/market/coupon/cgi/searchCoupon?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/marketing/coupon"; //所有券 //string body = "{\"pageSize\":20,\"page\":0,\"couponName\":\"10000509758262\",\"couponCustomizeChannel\":\"\",\"couponTypeList\":[],\"promoteTypeList\":[],\"couponStatusList\":[]}"; //生效中的券 string body = "{\"pageSize\":20,\"page\":0,\"couponName\":\"" + couponName + "\",\"couponCustomizeChannel\":\"\",\"couponTypeList\":[],\"promoteTypeList\":[],\"couponStatusList\":[\"2\"]}"; var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); return result; } public static string WxEndCoupon(ShopLoginInfo shop, string couponId) { string url = "https://store.weixin.qq.com/shop-faas/market/coupon/cgi/upCouponStatus?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/marketing/coupon"; string body = @"{""couponId"":""" + couponId + @""",""status"":4}"; var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); return result; } public static string WxDelCoupon(ShopLoginInfo shop, string couponId) { string url = "https://store.weixin.qq.com/shop-faas/market/coupon/cgi/upCouponStatus?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/marketing/coupon"; string body = @"{""couponId"":""" + couponId + @""",""status"":5}"; var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); return result; } public static string WxGetCanPromotion(ShopLoginInfo shop, List prodIdLst) { string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeleague/plan/getItemList?token=&lang=zh_CN"; foreach (var prodId in prodIdLst) { url += "&spuIdList[]=" + prodId; } url += "&offset=0&list_type=1"; string referer = "https://store.weixin.qq.com/shop/shopleague/home/normal-add"; var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); return result; } public static string WxAddPromotion(ShopLoginInfo shop, List prodIdLst, int ratio) { string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeleague/plan/batchAddItem?token=&lang=zh_CN"; string body = @"{""list"":["; foreach (var prodId in prodIdLst) body += @"{""spuId"":""" + prodId + @""",""ratio"":" + ratio + @",""finderCoupon"":0},"; body = body.TrimEnd(','); body += @"]}"; string referer = "https://store.weixin.qq.com/shop/shopleague/home/normal-add"; var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); return result; } public static string WxSearchPromotion(ShopLoginInfo shop, string prodId) { string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeleague/plan/getItemListBySearch?" + "token=&lang=zh_CN&offset=0&size=10&product_title=" + prodId + "&status=1&list_type=2&needWarning=true&needStockNum=true"; string referer = "https://store.weixin.qq.com/shop/shopleague/home"; var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); return result; } public static string WxEndPromotion(ShopLoginInfo shop, string prodId) { string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeleague/plan/updateItem?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/shopleague/home"; string body = @"{""spu_id"":""" + prodId + @""",""operate_type"":2}"; var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); return result; } public static string WxDelPromotion(ShopLoginInfo shop, string prodId) { string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeleague/plan/updateItem?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/shopleague/home"; string body = @"{""spu_id"":""" + prodId + @""",""operate_type"":3}"; var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); return result; } } }