拼多多活动逻辑优化
This commit is contained in:
1 parent
90ead052f3
commit
626cc9e68e
2 files changed
+399
-288
No files matched your search
+1
-1
@@ -322,7 +322,7 @@ namespace TemuKJD
|
||||
#else
|
||||
AntiGrabbingMechanism();
|
||||
#endif
|
||||
Thread.Sleep(3000);
|
||||
try { Thread.Sleep(3000); } catch { }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -123,6 +123,10 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
this.chkUpperSizeSpec.Checked = pddUploadRule.IsUseUpperSizeSpec;
|
||||
this.chkKeepChanceGoodsImg.Checked = pddUploadRule.IsKeepChanceGoodImg;
|
||||
this.chkActivity.Checked = pddUploadRule.IsSignActivity;
|
||||
this.chk20981.Checked = pddUploadRule.sign20981;
|
||||
this.chk15996.Checked = pddUploadRule.sign15996;
|
||||
this.chk21365.Checked = pddUploadRule.sign21365;
|
||||
this.chk22347.Checked = pddUploadRule.sign22347;
|
||||
this.txtAddTimesFake.Text = pddUploadRule.ActivityAddPriceTimes.ParseToString();
|
||||
this.chkLowPriceSku.Checked = pddUploadRule.IsLowPriceSku;
|
||||
this.txtLowPriceSkuName.Text = pddUploadRule.LowPriceSkuName;
|
||||
@@ -1043,9 +1047,10 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
|
||||
string chance_id = prodInfo.chance_id;
|
||||
string chance_refere = prodInfo.chance_refere;
|
||||
int getChanceIdCount = 0;
|
||||
reGetChanceId:
|
||||
if (string.IsNullOrEmpty(chance_id))
|
||||
{
|
||||
|
||||
var chanceRst = GetChanceGoodsList(shop, searchText);
|
||||
if (!chanceRst.Contains("\"success\":true"))
|
||||
{
|
||||
@@ -1055,6 +1060,7 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
return "新建查询失败 " + error;
|
||||
}
|
||||
|
||||
getChanceIdCount++;
|
||||
chance_id = BaseRegex.GetStringJson(ref chanceRst, "chance_id");
|
||||
try
|
||||
{
|
||||
@@ -1063,7 +1069,8 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
var chanceGoodsString = JsonHelper.SerializeObject(chanceGoodJArr);
|
||||
var chanceGoodLst = new NaiBa.Util.ConcurrentList<PDDChanceProductInfo>();
|
||||
chanceGoodLst.AddRange(JsonHelper.DeserializeJsonToList<PDDChanceProductInfo>(chanceGoodsString));
|
||||
var chanceGood = chanceGoodLst.FirstOrDefault(g => g.cat_id_3 == prodInfo.detail.cat_id || g.cat_id_2 == prodInfo.detail.cat_id);
|
||||
var chanceGood = chanceGoodLst.OrderBy(g => Randomx.GetId(10000))
|
||||
.FirstOrDefault(g => g.cat_id_3 == prodInfo.detail.cat_id || g.cat_id_2 == prodInfo.detail.cat_id);
|
||||
if (chanceGood != null)
|
||||
chance_id = chanceGood.chance_id;
|
||||
}
|
||||
@@ -1090,6 +1097,11 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
//失败了继续走普通商品上传接口
|
||||
var draftId = BaseRegex.GetStringJson(ref rst, "draft_id");
|
||||
var goods_id = BaseRegex.GetLongJson(ref rst, "goods_id");
|
||||
if (getChanceIdCount <= 3 && rst.Contains("\"success\":true") && string.IsNullOrEmpty(draftId) && string.IsNullOrEmpty(prodInfo.chance_id))
|
||||
{
|
||||
chance_id = "";
|
||||
goto reGetChanceId;
|
||||
}
|
||||
prodParam.goods_commit_id = draftId;
|
||||
prodParam.goods_id = goods_id;
|
||||
if (prodParam.goods_id <= 0 || prodParam.goods_commit_id.ParseToLong() <= 0)
|
||||
@@ -2656,45 +2668,49 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
// 复制一份商品使用sku替换图片
|
||||
var prodParamHighPriceFakeSkuImg = JsonHelper.DeserializeJsonToObject<PDDProductUploadParam>(JsonHelper.SerializeObject(prodParamHighPrice));
|
||||
var fake_sku_img_dic = new Dictionary<string, string>();
|
||||
bool upLoadFakeImgUrl = false;
|
||||
foreach (var skuParam in prodParamHighPriceFakeSkuImg.skus)
|
||||
{
|
||||
if (!fake_sku_img_dic.Keys.Contains(skuParam.thumb_url))
|
||||
if (upLoadFakeImgUrl)
|
||||
{
|
||||
string getImgError;
|
||||
var image = GetHtml.GetUrlImg(fakeImgUrl, out getImgError);
|
||||
var imageBg = new Bitmap(image.Width, image.Height);
|
||||
if (!string.IsNullOrEmpty(getImgError) || image == null)
|
||||
if (!fake_sku_img_dic.Keys.Contains(skuParam.thumb_url))
|
||||
{
|
||||
return "设置替换sku失败 图片上传失败";
|
||||
}
|
||||
try
|
||||
{
|
||||
using (Graphics g = Graphics.FromImage(imageBg))
|
||||
string getImgError;
|
||||
var image = GetHtml.GetUrlImg(fakeImgUrl, out getImgError);
|
||||
var imageBg = new Bitmap(image.Width, image.Height);
|
||||
if (!string.IsNullOrEmpty(getImgError) || image == null)
|
||||
{
|
||||
g.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);
|
||||
return "设置替换sku失败 图片上传失败";
|
||||
}
|
||||
try
|
||||
{
|
||||
using (Graphics g = Graphics.FromImage(imageBg))
|
||||
{
|
||||
g.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return "修改替换sku图片失败 " + ex.Message;
|
||||
}
|
||||
string uploadUpgradeSkuImgRst = UploadProdSkuImg(shop, imageBg, prodParam.goods_id.ParseToString(), prodParam.goods_commit_id, prodInfo.chance_tab);
|
||||
if (!uploadUpgradeSkuImgRst.Contains("\"url\":\"https:"))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref uploadUpgradeSkuImgRst, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = uploadUpgradeSkuImgRst;
|
||||
return "上传替换sku图片失败 " + error;
|
||||
}
|
||||
else
|
||||
{
|
||||
var fake_thumb_url = BaseRegex.GetStringJson(ref uploadUpgradeSkuImgRst, "url");
|
||||
fake_sku_img_dic[skuParam.thumb_url] = fake_thumb_url;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return "修改替换sku图片失败 " + ex.Message;
|
||||
}
|
||||
string uploadUpgradeSkuImgRst = UploadProdSkuImg(shop, imageBg, prodParam.goods_id.ParseToString(), prodParam.goods_commit_id, prodInfo.chance_tab);
|
||||
if (!uploadUpgradeSkuImgRst.Contains("\"url\":\"https:"))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref uploadUpgradeSkuImgRst, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = uploadUpgradeSkuImgRst;
|
||||
return "上传替换sku图片失败 " + error;
|
||||
}
|
||||
else
|
||||
{
|
||||
var fake_thumb_url = BaseRegex.GetStringJson(ref uploadUpgradeSkuImgRst, "url");
|
||||
fake_sku_img_dic[skuParam.thumb_url] = fake_thumb_url;
|
||||
}
|
||||
skuParam.thumb_url = fake_sku_img_dic[skuParam.thumb_url];
|
||||
}
|
||||
skuParam.thumb_url = fake_sku_img_dic[skuParam.thumb_url];
|
||||
|
||||
//skuParam.thumb_url = fakeImgUrl;
|
||||
else
|
||||
skuParam.thumb_url = fakeImgUrl;
|
||||
skuParam.thumb_url_file_id = null;
|
||||
}
|
||||
#endregion
|
||||
@@ -2800,6 +2816,38 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
saveProdRst = save_goods_edit(shop, prodParam, prodParam.goods_id.ParseToString(), prodParam.goods_commit_id, isChanceApi);
|
||||
for (int i = 0; i < 3 && saveProdRst.Contains("http error:500"); i++)
|
||||
{
|
||||
PDDShopLoginForm loginForm = null;
|
||||
if (pddUploadRule.IsSignActivity && 1 == 2) // 测试在网页里面直接修改 不使用截断提交方式一次最多改两个,使用的话最多改一个
|
||||
{
|
||||
Invoke(new Action(() =>
|
||||
{
|
||||
//this.panel1.SendToBack();
|
||||
this.panel1.BringToFront();
|
||||
loginForm = new PDDShopLoginForm(shop);
|
||||
loginForm.prodParam = prodParam;
|
||||
loginForm.TopLevel = false;
|
||||
loginForm.openType = EnumOpenType.manage;
|
||||
loginForm.WindowState = FormWindowState.Maximized;
|
||||
loginForm.InitUrl = "https://mms.pinduoduo.com/goods/goods_add/index?id=" + prodParamHighPriceFakeSkuImg.goods_commit_id +
|
||||
"&goods_id=" + prodParamHighPriceFakeSkuImg.goods_id + "&type=edit";
|
||||
loginForm.Dock = DockStyle.Fill;
|
||||
this.panel1.Controls.Add(loginForm);
|
||||
loginForm.Show();
|
||||
loginForm.SetPanelVisible(true);
|
||||
}));
|
||||
Thread.Sleep(Randomx.GetId(5000, 10000));
|
||||
}
|
||||
while (true)
|
||||
{
|
||||
if (loginForm == null || loginForm.Disposing || loginForm.IsDisposed)
|
||||
break;
|
||||
Thread.Sleep(Randomx.GetId(500, 1000));
|
||||
}
|
||||
Invoke(new Action(() =>
|
||||
{
|
||||
this.panel1.SendToBack();
|
||||
}));
|
||||
|
||||
Thread.Sleep(Randomx.GetId(2500 * (i+1), 3500 * (i + 1)));
|
||||
if (pddUploadRule.IsSignActivity)
|
||||
saveProdRst = save_goods_edit(shop, prodParamHighPriceFakeSkuImg, prodParamHighPriceFakeSkuImg.goods_id.ParseToString(), prodParamHighPriceFakeSkuImg.goods_commit_id, isChanceApi);
|
||||
@@ -2879,7 +2927,7 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
bool sign20981 = chk20981.Checked;
|
||||
bool sign22347 = chk22347.Checked;
|
||||
bool sign15996 = chk15996.Checked;
|
||||
bool sign23165 = chk21365.Checked;
|
||||
bool sign21365 = chk21365.Checked;
|
||||
|
||||
Thread.Sleep(Randomx.GetId(2000, 6000));
|
||||
// 判断商品是否上架成功
|
||||
@@ -2928,48 +2976,6 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
}
|
||||
}
|
||||
|
||||
PDDShopLoginForm loginForm = null;
|
||||
if (pddUploadRule.IsSignActivity)
|
||||
{
|
||||
Invoke(new Action(() =>
|
||||
{
|
||||
//this.panel1.SendToBack();
|
||||
this.panel1.BringToFront();
|
||||
loginForm = new PDDShopLoginForm(shop);
|
||||
loginForm.TopLevel = false;
|
||||
loginForm.openType = EnumOpenType.manage;
|
||||
loginForm.WindowState = FormWindowState.Maximized;
|
||||
loginForm.InitUrl = "https://mms.pinduoduo.com";
|
||||
loginForm.Dock = DockStyle.Fill;
|
||||
this.panel1.Controls.Add(loginForm);
|
||||
loginForm.Show();
|
||||
}));
|
||||
Thread.Sleep(Randomx.GetId(4000, 10000));
|
||||
if (sign20981)
|
||||
{
|
||||
Invoke(new Action(() =>
|
||||
{
|
||||
loginForm.cefWebBrowser.Load("https://mms.pinduoduo.com/act/multi-act-enroll?activityId=20981&activityType=27&SourceType=PROMO-OwnHome&formInfoSceneType=realBigSaleQuickEnrollMultiActivityScene");
|
||||
}));
|
||||
Thread.Sleep(Randomx.GetId(4000, 10000));
|
||||
|
||||
Invoke(new Action(() =>
|
||||
{
|
||||
//https://mms.pinduoduo.com/act/choose_goods/v2?id=20981&SourceType=MMSActicon
|
||||
loginForm.cefWebBrowser.Load("https://mms.pinduoduo.com/act/goods_price/confirm?activityId=20981&activityType=27&from=chooseGoods&SourceType=MMSActicon");
|
||||
}));
|
||||
Thread.Sleep(Randomx.GetId(4000, 10000));
|
||||
}
|
||||
|
||||
Invoke(new Action(() =>
|
||||
{
|
||||
//if (PDDShopLoginForm.shopLoginInstance != null)
|
||||
// PDDShopLoginForm.shopLoginInstance.Close();
|
||||
if (loginForm != null)
|
||||
loginForm.Close();
|
||||
}));
|
||||
}
|
||||
|
||||
var getProdIdRst = get_prod_commit_id(shop, prodParamHighPriceFakeSkuImg.goods_id.ParseToString(), false);
|
||||
var newCommitId = BaseRegex.GetStringJson(ref getProdIdRst, "goods_commit_id");
|
||||
prodParamHighPriceFakeSkuImg.goods_commit_id = newCommitId;
|
||||
@@ -3061,9 +3067,11 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
skuParam.quantity_delta = 0;
|
||||
}
|
||||
|
||||
loginForm = null;
|
||||
PDDShopLoginForm loginForm = null;
|
||||
if (pddUploadRule.IsSignActivity && 1 == 2) // 测试在网页里面直接修改 不使用截断提交方式一次最多改两个,使用的话最多改一个
|
||||
{
|
||||
LoadActivityPage(shop);
|
||||
|
||||
Invoke(new Action(() =>
|
||||
{
|
||||
//this.panel1.SendToBack();
|
||||
@@ -3106,8 +3114,37 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
|
||||
foreach (var specName in spec0NameLst)
|
||||
{
|
||||
List<int> signLst = new List<int>() { 20981, 15996, 21365, 22347 };
|
||||
while (signLst.Count > 0)
|
||||
{
|
||||
var signId = signLst[Randomx.GetId(0, signLst.Count)];
|
||||
signLst.Remove(signId);
|
||||
|
||||
if (signId == 20981 && sign20981)
|
||||
{
|
||||
var activityRst = activity_goods_info(shop, prodParam.goods_id.ParseToString(), "20981");
|
||||
Thread.Sleep(Randomx.GetId(2000, 4500));
|
||||
}
|
||||
if (signId == 15996 && sign15996)
|
||||
{
|
||||
var activityRst = activity_goods_price_rule(shop, prodParam.goods_id.ParseToString(), 15996, 18);
|
||||
Thread.Sleep(Randomx.GetId(2000, 4500));
|
||||
}
|
||||
if (signId == 21365 && sign21365)
|
||||
{
|
||||
var activityRst = activity_goods_price_rule(shop, prodParam.goods_id.ParseToString(), 21365, 27);
|
||||
Thread.Sleep(Randomx.GetId(2000, 4500));
|
||||
}
|
||||
if (signId == 22347 && sign22347)
|
||||
{
|
||||
var activityRst = activity_goods_price_rule(shop, prodParam.goods_id.ParseToString(), 22347, 27);
|
||||
Thread.Sleep(Randomx.GetId(2000, 4500));
|
||||
}
|
||||
}
|
||||
//LoadActivityPage(shop);
|
||||
|
||||
var fakeImgskuLst = prodParamHighPriceFakeSkuImg.skus.Where(s => s.spec[0].spec_name == specName).ToList();
|
||||
var skuImg = prodParamHighPriceFakeSkuImg.skus.FirstOrDefault(s => s.spec[0].spec_name == specName)?.thumb_url;
|
||||
var skuImg = prodParam.skus.FirstOrDefault(s => s.spec[0].spec_name == specName)?.thumb_url;
|
||||
foreach (var fakeImgSku in fakeImgskuLst)
|
||||
{
|
||||
fakeImgSku.thumb_url = skuImg;
|
||||
@@ -3180,7 +3217,7 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
Thread.Sleep(Randomx.GetId(12000, 15000));
|
||||
}
|
||||
|
||||
string activityErr = SignActivity(shop, prodParam, sign22347, sign20981, sign23165, sign15996);
|
||||
string activityErr = SignActivity(shop, prodParam, sign22347, sign20981, sign21365, sign15996);
|
||||
|
||||
//Thread.Sleep(Randomx.GetId(4000, 8000));
|
||||
if (!string.IsNullOrEmpty(activityErr))
|
||||
@@ -3207,6 +3244,56 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadActivityPage(ShopLoginInfo shop, PDDShopLoginForm loginForm = null)
|
||||
{
|
||||
if (pddUploadRule.IsSignActivity)
|
||||
{
|
||||
bool sign20981 = chk20981.Checked;
|
||||
bool sign22347 = chk22347.Checked;
|
||||
bool sign15996 = chk15996.Checked;
|
||||
bool sign23165 = chk21365.Checked;
|
||||
List<string> activityUrlLst = new List<string>();
|
||||
if (sign20981)
|
||||
{
|
||||
activityUrlLst.Add("https://mms.pinduoduo.com/act/multi-act-enroll?activityId=20981&activityType=27&SourceType=PROMO-OwnHome&formInfoSceneType=realBigSaleQuickEnrollMultiActivityScene");
|
||||
//activityUrlLst.Add("https://mms.pinduoduo.com/act/goods_price/confirm?activityId=20981&activityType=27&from=chooseGoods&SourceType=MMSActicon");
|
||||
}
|
||||
if (activityUrlLst.Count <= 0)
|
||||
return;
|
||||
|
||||
Invoke(new Action(() =>
|
||||
{
|
||||
//this.panel1.SendToBack();
|
||||
this.panel1.BringToFront();
|
||||
if (loginForm == null)
|
||||
{
|
||||
loginForm = new PDDShopLoginForm(shop);
|
||||
loginForm.TopLevel = false;
|
||||
loginForm.openType = EnumOpenType.manage;
|
||||
loginForm.WindowState = FormWindowState.Maximized;
|
||||
//loginForm.InitUrl = "https://mms.pinduoduo.com";
|
||||
loginForm.InitUrl = activityUrlLst[0];
|
||||
activityUrlLst.RemoveAt(0);
|
||||
loginForm.Dock = DockStyle.Fill;
|
||||
this.panel1.Controls.Add(loginForm);
|
||||
loginForm.Show();
|
||||
}
|
||||
}));
|
||||
Thread.Sleep(Randomx.GetId(4000, 8000));
|
||||
while (activityUrlLst.Count > 0)
|
||||
{
|
||||
Thread.Sleep(Randomx.GetId(4000, 8000));
|
||||
}
|
||||
|
||||
Invoke(new Action(() =>
|
||||
{
|
||||
if (loginForm != null)
|
||||
loginForm.Close();
|
||||
this.panel1.SendToBack();
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 所有活动: 22347直通车加权 20981长期报名入口 21365七折活动 15996两件9块9活动(价格要求低于29.9元) 18586百万爆款(需上架满一天) 23620临时活动(已结束)
|
||||
/// </summary>
|
||||
@@ -3217,114 +3304,11 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
{
|
||||
string activityErr = "";
|
||||
|
||||
//21365 7折活动
|
||||
//21365 7折活动 //活动2
|
||||
if (1 == 1 && sign21365)
|
||||
{
|
||||
var activityRst2 = activity_goods_price_rule(shop, prodParam.goods_id.ParseToString(), 21365, 27);
|
||||
if (!activityRst2.Contains("\"success\":true"))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref activityRst2, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = activityRst2;
|
||||
activityErr += "\r\n上传错误 365查询失败 " + error;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg2;
|
||||
}
|
||||
try
|
||||
{
|
||||
var jObj = JObject.Parse(activityRst2);
|
||||
var jStr = JsonHelper.SerializeObject(jObj["result"]);
|
||||
var pddActivitiPriceInfo = JsonHelper.DeserializeJsonToObject<PDDActivitySuggestPriceInfo>(jStr);
|
||||
var pddActivitiPriceProd = pddActivitiPriceInfo.enroll_goods_rule_vos.FirstOrDefault();
|
||||
|
||||
if (pddActivitiPriceProd == null)
|
||||
{
|
||||
activityErr += "\r\n上传错误 365查询/新建失败 商品未提交成功或不满足参加活动条件";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg2;
|
||||
}
|
||||
foreach (var activitySkuInfo in pddActivitiPriceProd.enroll_rule_param.enroll_goods_big_sale_price.sku_info_list)
|
||||
{
|
||||
if (activitySkuInfo.spec_info_str.Contains("福利款"))
|
||||
{
|
||||
}
|
||||
var sku = prodParam.skus.FirstOrDefault(sk => string.Join(",", sk.spec.Select(s => s.spec_name)) == activitySkuInfo.spec_info_str);
|
||||
if (sku == null || sku.multi_price > activitySkuInfo.require_price)
|
||||
{
|
||||
activityErr += "\r\n上传错误 365价格低于产品价 " + activitySkuInfo.require_price + " < " + sku.multi_price;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg2;
|
||||
}
|
||||
}
|
||||
|
||||
var quantity = prodParam.skus.Sum(s => s.quantity_delta);
|
||||
PDDActivitySubmitParam actSubmitParam = new PDDActivitySubmitParam();
|
||||
actSubmitParam.activity_id = pddActivitiPriceInfo.activity_id;
|
||||
actSubmitParam.enroll_source_ctx.enroll_type = 3;
|
||||
actSubmitParam.enroll_source_ctx.scene_full_coverage = "mmsActBatchEnrollV1";
|
||||
actSubmitParam.enroll_source_ctx.source_type = "MMSActicon";
|
||||
actSubmitParam.enroll_source_ctx.scene_type = "ActivityCard";
|
||||
|
||||
var goods_vo_item = new goods_vo_param();
|
||||
goods_vo_item.goods_id = prodParam.goods_id;
|
||||
var skuSamePrice = prodParam.skus.Max(s => s.multi_price);
|
||||
foreach (var activitySkuInfo in pddActivitiPriceProd.enroll_rule_param.enroll_goods_big_sale_price.sku_info_list)
|
||||
{
|
||||
var sku = prodParam.skus.FirstOrDefault(sk => string.Join(",", sk.spec.Select(s => s.spec_name)) == activitySkuInfo.spec_info_str);
|
||||
if (sku == null)
|
||||
{
|
||||
activityErr += "\r\n上传错误 365价格sku未找到";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg2;
|
||||
}
|
||||
|
||||
create_sku_vo_param sku_vo_item = new create_sku_vo_param();
|
||||
sku_vo_item.sku_id = activitySkuInfo.sku_id;
|
||||
sku_vo_item.sku_activity_price = sku.multi_price;
|
||||
sku_vo_item.sku_front_ctx_vo = new sku_front_ctx_vo_param()
|
||||
{
|
||||
filling_sku_price = sku.multi_price,
|
||||
gear_rule = activitySkuInfo.gear_rule,
|
||||
require_price = sku.multi_price,
|
||||
filling_sku_price_gear_rule = activitySkuInfo.filling_sku_price_gear_rule,
|
||||
};
|
||||
goods_vo_item.create_activity_price_vo.create_sku_vos.Add(sku_vo_item);
|
||||
}
|
||||
goods_vo_item.create_activity_price_vo.create_quantity_vo.goods_activity_quantity =
|
||||
Math.Min(quantity.ParseToInt(), 300); // 7折活动库存上限300
|
||||
actSubmitParam.goods_volist.Add(goods_vo_item);
|
||||
actSubmitParam.create_protocol_vo.need_create_cost_template = true;
|
||||
|
||||
var addActivityRst = add_activity_goods(shop, actSubmitParam, prodParam.goods_id.ParseToString(), 21365, 27);
|
||||
if (addActivityRst.Contains("频繁"))
|
||||
{
|
||||
Thread.Sleep(Randomx.GetId(3000, 7000));
|
||||
addActivityRst = add_activity_goods(shop, actSubmitParam, prodParam.goods_id.ParseToString(), 21365, 27);
|
||||
}
|
||||
var err_msg = BaseRegex.GetStringJson(ref addActivityRst, "error_msg");
|
||||
if (!addActivityRst.Contains("\"success\":true") || !string.IsNullOrEmpty(err_msg))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref addActivityRst, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = addActivityRst;
|
||||
activityErr += "\r\n上传错误 365新建失败 " + error;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg2;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
activityErr += "\r\n上传错误 365查询/新建失败 " + ex.Message;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg2;
|
||||
}
|
||||
} //活动2结束
|
||||
SignActivity21365(shop, prodParam);
|
||||
}
|
||||
restoreSkuImg2:
|
||||
|
||||
//活动5 18586 百万爆款 必须上架一天以上的sku才能报名暂时注释
|
||||
@@ -3541,115 +3525,17 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
} //活动4
|
||||
restoreSkuImg4:
|
||||
|
||||
// 20981 长期活动
|
||||
// 20981 长期活动 //活动1
|
||||
if (1 == 1 && sign20981)
|
||||
{
|
||||
activityErr += SignActivity20981(shop, prodParam);
|
||||
goto restoreSkuImg1;
|
||||
}
|
||||
restoreSkuImg1:
|
||||
|
||||
//15996 9块9 (价格要求低于29.9元)
|
||||
//15996 9块9 (价格要求低于29.9元) //活动3
|
||||
if (1 == 1 && sign15996 && !prodParam.skus.Any(s => s.multi_price > 2990))
|
||||
{
|
||||
Thread.Sleep(Randomx.GetId(500, 1500));
|
||||
var activityRst3 = activity_goods_price_rule(shop, prodParam.goods_id.ParseToString(), 15996, 18);
|
||||
if (!activityRst3.Contains("\"success\":true"))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref activityRst3, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = activityRst3;
|
||||
activityErr += "\r\n上传错误 996查询失败 " + error;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg3;
|
||||
}
|
||||
try
|
||||
{
|
||||
var jObj = JObject.Parse(activityRst3);
|
||||
var jStr = JsonHelper.SerializeObject(jObj["result"]);
|
||||
var pddActivitiPriceInfo = JsonHelper.DeserializeJsonToObject<PDDActivitySuggestPriceInfo>(jStr);
|
||||
var pddActivitiPriceProd = pddActivitiPriceInfo.enroll_goods_rule_vos.FirstOrDefault();
|
||||
|
||||
if (pddActivitiPriceProd == null)
|
||||
{
|
||||
activityErr += "\r\n上传错误 996查询/新建失败 商品未提交成功或不满足参加活动条件";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg3;
|
||||
}
|
||||
foreach (var activitySkuInfo in pddActivitiPriceProd.enroll_rule_param.enroll_goods_resource_price.sku_info_list)
|
||||
{
|
||||
var sku = prodParam.skus.FirstOrDefault(sk => string.Join(",", sk.spec.Select(s => s.spec_name)) == activitySkuInfo.spec_info_str);
|
||||
if (sku == null || sku.multi_price > 2990 /*activitySkuInfo.require_price*/)
|
||||
{
|
||||
activityErr += "\r\n上传错误 996价格低于产品价";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg3;
|
||||
}
|
||||
}
|
||||
|
||||
PDDActivitySubmitParam actSubmitParam = new PDDActivitySubmitParam();
|
||||
actSubmitParam.activity_id = pddActivitiPriceInfo.activity_id;
|
||||
actSubmitParam.enroll_source_ctx.enroll_type = 3;
|
||||
actSubmitParam.enroll_source_ctx.scene_full_coverage = "mmsActBatchEnrollV1";
|
||||
actSubmitParam.enroll_source_ctx.source_type = "MMSActicon";
|
||||
actSubmitParam.enroll_source_ctx.scene_type = "ActivityCard";
|
||||
|
||||
var goods_vo_item = new goods_vo_param();
|
||||
goods_vo_item.goods_id = prodParam.goods_id;
|
||||
foreach (var activitySkuInfo in pddActivitiPriceProd.enroll_rule_param.enroll_goods_resource_price.sku_info_list)
|
||||
{
|
||||
var sku = prodParam.skus.FirstOrDefault(sk => string.Join(",", sk.spec.Select(s => s.spec_name)) == activitySkuInfo.spec_info_str);
|
||||
if (sku == null)
|
||||
{
|
||||
activityErr += "\r\n上传错误 996价格sku未找到";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg3;
|
||||
}
|
||||
|
||||
create_sku_vo_param sku_vo_item = new create_sku_vo_param();
|
||||
sku_vo_item.sku_id = activitySkuInfo.sku_id;
|
||||
sku_vo_item.sku_activity_price = sku.multi_price;
|
||||
sku_vo_item.sku_front_ctx_vo = new sku_front_ctx_vo_param()
|
||||
{
|
||||
filling_sku_price = sku.multi_price,
|
||||
gear_rule = activitySkuInfo.gear_rule,
|
||||
require_price = sku.multi_price,
|
||||
filling_sku_price_gear_rule = activitySkuInfo.filling_sku_price_gear_rule,
|
||||
};
|
||||
goods_vo_item.create_discount_vo = new create_discount_vo_param();
|
||||
goods_vo_item.create_discount_vo.hit_multi_percent = true;
|
||||
goods_vo_item.create_discount_vo.multi_percent_discount = 99;
|
||||
goods_vo_item.create_activity_price_vo.create_sku_vos.Add(sku_vo_item);
|
||||
}
|
||||
actSubmitParam.goods_volist.Add(goods_vo_item);
|
||||
actSubmitParam.create_protocol_vo.need_create_cost_template = true;
|
||||
|
||||
var addActivityRst = add_activity_goods(shop, actSubmitParam, prodParam.goods_id.ParseToString(), 15996, 18);
|
||||
var err_msg = BaseRegex.GetStringJson(ref addActivityRst, "error_msg");
|
||||
if (!addActivityRst.Contains("\"success\":true") || !string.IsNullOrEmpty(err_msg))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref addActivityRst, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = addActivityRst;
|
||||
activityErr += "\r\n上传错误 996新建失败 " + error;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg3;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
activityErr = "\r\n上传错误 996查询/新建失败 " + ex.Message;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
goto restoreSkuImg3;
|
||||
}
|
||||
} //活动3
|
||||
restoreSkuImg3:
|
||||
activityErr += SignActivity15996(shop, prodParam);
|
||||
}
|
||||
|
||||
// 22347 直通车加权
|
||||
if (1 == 1 && sign22347)
|
||||
@@ -3660,6 +3546,116 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
return activityErr;
|
||||
}
|
||||
|
||||
string SignActivity21365(ShopLoginInfo shop, PDDProductUploadParam prodParam)
|
||||
{
|
||||
string activityErr = "";
|
||||
var activityRst2 = activity_goods_price_rule(shop, prodParam.goods_id.ParseToString(), 21365, 27);
|
||||
if (!activityRst2.Contains("\"success\":true"))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref activityRst2, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = activityRst2;
|
||||
activityErr += "\r\n上传错误 365查询失败 " + error;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
try
|
||||
{
|
||||
var jObj = JObject.Parse(activityRst2);
|
||||
var jStr = JsonHelper.SerializeObject(jObj["result"]);
|
||||
var pddActivitiPriceInfo = JsonHelper.DeserializeJsonToObject<PDDActivitySuggestPriceInfo>(jStr);
|
||||
var pddActivitiPriceProd = pddActivitiPriceInfo.enroll_goods_rule_vos.FirstOrDefault();
|
||||
|
||||
if (pddActivitiPriceProd == null)
|
||||
{
|
||||
activityErr += "\r\n上传错误 365查询/新建失败 商品未提交成功或不满足参加活动条件";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
foreach (var activitySkuInfo in pddActivitiPriceProd.enroll_rule_param.enroll_goods_big_sale_price.sku_info_list)
|
||||
{
|
||||
if (activitySkuInfo.spec_info_str.Contains("福利款"))
|
||||
{
|
||||
}
|
||||
var sku = prodParam.skus.FirstOrDefault(sk => string.Join(",", sk.spec.Select(s => s.spec_name)) == activitySkuInfo.spec_info_str);
|
||||
if (sku == null || sku.multi_price > activitySkuInfo.require_price)
|
||||
{
|
||||
activityErr += "\r\n上传错误 365价格低于产品价 " + activitySkuInfo.require_price + " < " + sku.multi_price;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
}
|
||||
|
||||
var quantity = prodParam.skus.Sum(s => s.quantity_delta);
|
||||
PDDActivitySubmitParam actSubmitParam = new PDDActivitySubmitParam();
|
||||
actSubmitParam.activity_id = pddActivitiPriceInfo.activity_id;
|
||||
actSubmitParam.enroll_source_ctx.enroll_type = 3;
|
||||
actSubmitParam.enroll_source_ctx.scene_full_coverage = "mmsActBatchEnrollV1";
|
||||
actSubmitParam.enroll_source_ctx.source_type = "MMSActicon";
|
||||
actSubmitParam.enroll_source_ctx.scene_type = "ActivityCard";
|
||||
|
||||
var goods_vo_item = new goods_vo_param();
|
||||
goods_vo_item.goods_id = prodParam.goods_id;
|
||||
var skuSamePrice = prodParam.skus.Max(s => s.multi_price);
|
||||
foreach (var activitySkuInfo in pddActivitiPriceProd.enroll_rule_param.enroll_goods_big_sale_price.sku_info_list)
|
||||
{
|
||||
var sku = prodParam.skus.FirstOrDefault(sk => string.Join(",", sk.spec.Select(s => s.spec_name)) == activitySkuInfo.spec_info_str);
|
||||
if (sku == null)
|
||||
{
|
||||
activityErr += "\r\n上传错误 365价格sku未找到";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
|
||||
create_sku_vo_param sku_vo_item = new create_sku_vo_param();
|
||||
sku_vo_item.sku_id = activitySkuInfo.sku_id;
|
||||
sku_vo_item.sku_activity_price = sku.multi_price;
|
||||
sku_vo_item.sku_front_ctx_vo = new sku_front_ctx_vo_param()
|
||||
{
|
||||
filling_sku_price = sku.multi_price,
|
||||
gear_rule = activitySkuInfo.gear_rule,
|
||||
require_price = sku.multi_price,
|
||||
filling_sku_price_gear_rule = activitySkuInfo.filling_sku_price_gear_rule,
|
||||
};
|
||||
goods_vo_item.create_activity_price_vo.create_sku_vos.Add(sku_vo_item);
|
||||
}
|
||||
goods_vo_item.create_activity_price_vo.create_quantity_vo.goods_activity_quantity =
|
||||
Math.Min(quantity.ParseToInt(), 300); // 7折活动库存上限300
|
||||
actSubmitParam.goods_volist.Add(goods_vo_item);
|
||||
actSubmitParam.create_protocol_vo.need_create_cost_template = true;
|
||||
|
||||
var addActivityRst = add_activity_goods(shop, actSubmitParam, prodParam.goods_id.ParseToString(), 21365, 27);
|
||||
if (addActivityRst.Contains("频繁"))
|
||||
{
|
||||
Thread.Sleep(Randomx.GetId(3000, 7000));
|
||||
addActivityRst = add_activity_goods(shop, actSubmitParam, prodParam.goods_id.ParseToString(), 21365, 27);
|
||||
}
|
||||
var err_msg = BaseRegex.GetStringJson(ref addActivityRst, "error_msg");
|
||||
if (!addActivityRst.Contains("\"success\":true") || !string.IsNullOrEmpty(err_msg))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref addActivityRst, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = addActivityRst;
|
||||
activityErr += "\r\n上传错误 365新建失败 " + error;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
activityErr += "\r\n上传错误 365查询/新建失败 " + ex.Message;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
return activityErr;
|
||||
}
|
||||
|
||||
string SignActivity20981(ShopLoginInfo shop, PDDProductUploadParam prodParam)
|
||||
{
|
||||
string activityErr = "";
|
||||
@@ -3786,6 +3782,108 @@ namespace TemuKJD.PDDForms.ProductSelectForms
|
||||
return activityErr;
|
||||
}
|
||||
|
||||
string SignActivity15996(ShopLoginInfo shop, PDDProductUploadParam prodParam)
|
||||
{
|
||||
string activityErr = "";
|
||||
Thread.Sleep(Randomx.GetId(500, 1500));
|
||||
var activityRst3 = activity_goods_price_rule(shop, prodParam.goods_id.ParseToString(), 15996, 18);
|
||||
if (!activityRst3.Contains("\"success\":true"))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref activityRst3, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = activityRst3;
|
||||
activityErr += "\r\n上传错误 996查询失败 " + error;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
try
|
||||
{
|
||||
var jObj = JObject.Parse(activityRst3);
|
||||
var jStr = JsonHelper.SerializeObject(jObj["result"]);
|
||||
var pddActivitiPriceInfo = JsonHelper.DeserializeJsonToObject<PDDActivitySuggestPriceInfo>(jStr);
|
||||
var pddActivitiPriceProd = pddActivitiPriceInfo.enroll_goods_rule_vos.FirstOrDefault();
|
||||
|
||||
if (pddActivitiPriceProd == null)
|
||||
{
|
||||
activityErr += "\r\n上传错误 996查询/新建失败 商品未提交成功或不满足参加活动条件";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
foreach (var activitySkuInfo in pddActivitiPriceProd.enroll_rule_param.enroll_goods_resource_price.sku_info_list)
|
||||
{
|
||||
var sku = prodParam.skus.FirstOrDefault(sk => string.Join(",", sk.spec.Select(s => s.spec_name)) == activitySkuInfo.spec_info_str);
|
||||
if (sku == null || sku.multi_price > 2990 /*activitySkuInfo.require_price*/)
|
||||
{
|
||||
activityErr += "\r\n上传错误 996价格低于产品价";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
}
|
||||
|
||||
PDDActivitySubmitParam actSubmitParam = new PDDActivitySubmitParam();
|
||||
actSubmitParam.activity_id = pddActivitiPriceInfo.activity_id;
|
||||
actSubmitParam.enroll_source_ctx.enroll_type = 3;
|
||||
actSubmitParam.enroll_source_ctx.scene_full_coverage = "mmsActBatchEnrollV1";
|
||||
actSubmitParam.enroll_source_ctx.source_type = "MMSActicon";
|
||||
actSubmitParam.enroll_source_ctx.scene_type = "ActivityCard";
|
||||
|
||||
var goods_vo_item = new goods_vo_param();
|
||||
goods_vo_item.goods_id = prodParam.goods_id;
|
||||
foreach (var activitySkuInfo in pddActivitiPriceProd.enroll_rule_param.enroll_goods_resource_price.sku_info_list)
|
||||
{
|
||||
var sku = prodParam.skus.FirstOrDefault(sk => string.Join(",", sk.spec.Select(s => s.spec_name)) == activitySkuInfo.spec_info_str);
|
||||
if (sku == null)
|
||||
{
|
||||
activityErr += "\r\n上传错误 996价格sku未找到";
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
|
||||
create_sku_vo_param sku_vo_item = new create_sku_vo_param();
|
||||
sku_vo_item.sku_id = activitySkuInfo.sku_id;
|
||||
sku_vo_item.sku_activity_price = sku.multi_price;
|
||||
sku_vo_item.sku_front_ctx_vo = new sku_front_ctx_vo_param()
|
||||
{
|
||||
filling_sku_price = sku.multi_price,
|
||||
gear_rule = activitySkuInfo.gear_rule,
|
||||
require_price = sku.multi_price,
|
||||
filling_sku_price_gear_rule = activitySkuInfo.filling_sku_price_gear_rule,
|
||||
};
|
||||
goods_vo_item.create_discount_vo = new create_discount_vo_param();
|
||||
goods_vo_item.create_discount_vo.hit_multi_percent = true;
|
||||
goods_vo_item.create_discount_vo.multi_percent_discount = 99;
|
||||
goods_vo_item.create_activity_price_vo.create_sku_vos.Add(sku_vo_item);
|
||||
}
|
||||
actSubmitParam.goods_volist.Add(goods_vo_item);
|
||||
actSubmitParam.create_protocol_vo.need_create_cost_template = true;
|
||||
|
||||
var addActivityRst = add_activity_goods(shop, actSubmitParam, prodParam.goods_id.ParseToString(), 15996, 18);
|
||||
var err_msg = BaseRegex.GetStringJson(ref addActivityRst, "error_msg");
|
||||
if (!addActivityRst.Contains("\"success\":true") || !string.IsNullOrEmpty(err_msg))
|
||||
{
|
||||
var error = BaseRegex.GetStringJson(ref addActivityRst, "error_msg");
|
||||
if (string.IsNullOrEmpty(error))
|
||||
error = addActivityRst;
|
||||
activityErr += "\r\n上传错误 996新建失败 " + error;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
activityErr = "\r\n上传错误 996查询/新建失败 " + ex.Message;
|
||||
if (BaseClass.SaLevel != 1 && 1 != 1)
|
||||
activityErr = "上传错误";
|
||||
return activityErr;
|
||||
}
|
||||
return activityErr;
|
||||
}
|
||||
|
||||
string SignActivity22347(ShopLoginInfo shop, PDDProductUploadParam prodParam)
|
||||
{
|
||||
string activityErr = "";
|
||||
@@ -5655,6 +5753,14 @@ Content-Type: image/jpeg
|
||||
{
|
||||
if (!chk15996.Checked && !chk20981.Checked && !chk21365.Checked && !chk22347.Checked)
|
||||
chkActivity.Checked = false;
|
||||
if (IsLoadComplate)
|
||||
{
|
||||
pddUploadRule.sign20981 = chk20981.Checked;
|
||||
pddUploadRule.sign15996 = chk15996.Checked;
|
||||
pddUploadRule.sign21365 = chk21365.Checked;
|
||||
pddUploadRule.sign22347 = chk22347.Checked;
|
||||
NaiBa.Util.Helper.ConfigHelper.SaveConfig("pdd_upload_rule", pddUploadRule);
|
||||
}
|
||||
}
|
||||
|
||||
private void pbSkuImg_Click(object sender, EventArgs e)
|
||||
@@ -5801,5 +5907,10 @@ Content-Type: image/jpeg
|
||||
public decimal UpgradeVersionAddPrice { get; set; } = 1m;
|
||||
|
||||
public bool IsUseExtCodePrice { get; set; }
|
||||
|
||||
public bool sign20981 { get; set; }
|
||||
public bool sign22347 { get; set; }
|
||||
public bool sign15996 { get; set; }
|
||||
public bool sign21365 { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user