diff --git a/AllBase/BaseClass.cs b/AllBase/BaseClass.cs index b3f31d8..2ad5324 100644 --- a/AllBase/BaseClass.cs +++ b/AllBase/BaseClass.cs @@ -27,7 +27,7 @@ namespace AllBase /// /// 版本ID /// - public static int VersionCount = 819; + public static int VersionCount = 822; //public static int VersionCount = 613; /// diff --git a/AllBase/Model/Param/WXParam/WXUploadProductParam.cs b/AllBase/Model/Param/WXParam/WXUploadProductParam.cs index 4eb3b78..65020c2 100644 --- a/AllBase/Model/Param/WXParam/WXUploadProductParam.cs +++ b/AllBase/Model/Param/WXParam/WXUploadProductParam.cs @@ -60,6 +60,11 @@ namespace AllBase.Model.Param.WXParam public string thumbImg { get; set; } // "https://wst.wxapp.tc.qq.com/161/20304/snscosdownload/SH/reserved/695c85e9000a3bff29d22878fedda00b000000a000004f50", public int? salePrice { get; set; } // 10000, public string skuCode { get; set; } = ""; + public string outSkuId { get; set; } = ""; // 模拟接口没有 + public string out_sku_id { get; set; } = ""; // 模拟接口没有 + /// + /// 条形码 + /// public string barCode { get; set; } = ""; public stockInfoParam stockInfo { get; set; } = new stockInfoParam(); public List saleParam { get; set; } = new List(); @@ -247,11 +252,14 @@ namespace AllBase.Model.Param.WXParam public class skuKeyParam { public string skuId { get; set; } = ""; // "6134573242" - public productKeyDetailParam productKey { get; set; } + public productKeyParam productKey { get; set; } + public string skuSnapId { get; set; } // "1196674898", + public string outSkuId { get; set; } // "" } - public class productKeyDetailParam + public class productKeyParam { + public List cashCouponSendKey = new List(); public string productId { get; set; } // "10000408181873", public string outProductId { get; set; } = ""; public string appid { get; set; } = ""; @@ -316,6 +324,8 @@ namespace AllBase.Model.Param.WXParam /// extCode 货号 /// public string spuCode { get; set; } = ""; + public string outProductId { get; set; } = ""; // 模拟接口没有 + public string out_product_id { get; set; } = ""; // 模拟接口没有 public int? asyncUpproductRet { get; set; } = 0; public int? illegalRecordId { get; set; } = 0; public string headImage { get; set; } = ""; @@ -814,12 +824,4 @@ namespace AllBase.Model.Param.WXParam public string key { get; set; } // "reason" public string value { get; set; } // "" } - - public class productKeyParam - { - /// - /// 商品id(保存草稿箱的时候才能获取到,提交上架的时候需要填写) - /// - public string productId { get; set; } // "10000408181873" - } } diff --git a/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs b/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs index 7c5b17c..c81d04d 100644 --- a/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs +++ b/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs @@ -868,7 +868,14 @@ namespace TemuKJD.WXForms.ProductForms break; //将商品上传 - result = UploadProduct(shop, kjdDbProd, selectProd, row.Cells["colOpResult"], startTime); + var kjdDbProdTmp = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(kjdDbProd)); + result = UploadProduct(shop, kjdDbProdTmp, selectProd, row.Cells["colOpResult"], startTime); + if (result.Contains("10020225") || result.Contains("10020226")) + { + kjdDbProdTmp = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(kjdDbProd)); + kjdDbProdTmp.wx_img_map_json = null; + result = UploadProduct(shop, kjdDbProdTmp, selectProd, row.Cells["colOpResult"], startTime); + } Invoke(new Action(() => { @@ -893,6 +900,17 @@ namespace TemuKJD.WXForms.ProductForms } Thread.Sleep(Randomx.GetId(100, 300)); + // 记录失败商品 + if (!result.Contains("success\":true")) + { + selectProd.wxDraftProduct = null; + selectProd.draft_id = BaseRegex.GetStringJson(ref result, "draftId"); + selectProd.status = "上传失败"; + selectProd.add_time = DateTime.Now; + upload_draft_product_lst.Add(selectProd); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_select_upload_draft_products", upload_draft_product_lst); + } + //额外等待时间(无论失败与否) var waitTime = 0; Invoke(new Action(() => { waitTime = txtWaitSeconds.Text.Trim().ParseToInt(); })); @@ -915,6 +933,7 @@ namespace TemuKJD.WXForms.ProductForms } var error = BaseRegex.GetStringJson(ref result, "errMsg"); + error = GetHtml.UrlDecode(error); // 上传失败 if (!result.Contains("\"success\":true") && !result.Contains("上传成功")) { @@ -1314,6 +1333,27 @@ namespace TemuKJD.WXForms.ProductForms } #endregion + // 过滤重复图片 + if (chkImgRandomBlock.Checked && (dbProd.main_cat_name == "图书" || dbProd.main_cat_name == "书籍/杂志/报纸")) + { + } + else + { + List galls = new List(); + foreach (var gall in prodInfo.detail.galleries.Where(g => g.type == 1)) + { + if (!galls.Any(g => g.url == gall.url)/* && !prodInfo.detail.sku.Any(s => s.thumb_url == gall.url)*/) + galls.Add(gall); + } + foreach (var gall in prodInfo.detail.galleries.Where(g => g.type == 2)) + { + if (!galls.Any(g => g.url == gall.url)/* && !prodInfo.detail.sku.Any(s => s.thumb_url == gall.url)*/) + galls.Add(gall); + } + prodInfo.detail.galleries.Clear(); + prodInfo.detail.galleries.AddRange(galls); + } + // 生成初始化上传商品对象 var upProdInitParam = new WXUploadProductInitParam(); // 生成上传商品对象 @@ -1335,6 +1375,9 @@ namespace TemuKJD.WXForms.ProductForms extCode = "EC1" + dbProd.spu_id + "A"; } upProdParam.product.info.spuCode = extCode; + upProdParam.product.info.outProductId = extCode; + upProdParam.product.info.out_product_id = extCode; + upProdParam.product.productKey.outProductId = extCode; #endregion #region 上传主图 @@ -1348,13 +1391,6 @@ namespace TemuKJD.WXForms.ProductForms Thread.Sleep(Randomx.GetId(100, 300)); foreach (var gallery_item in prodInfo.detail.galleries.Where(g => g.type == 1).Take(9)) // 9张主图 { - // 先查主图缓存 - if (wxImgMapDic.ContainsKey(BaseClass.GetMd5(gallery_item.url))) - { - upProdInitParam.product.info.headImg.Add(wxImgMapDic[BaseClass.GetMd5(gallery_item.url)]); - upProdParam.product.info.headImg.Add(wxImgMapDic[BaseClass.GetMd5(gallery_item.url)]); - continue; - } try { @@ -1365,6 +1401,14 @@ namespace TemuKJD.WXForms.ProductForms } else { + // 主图缓存盗链 + if (wxImgMapDic.ContainsKey(BaseClass.GetMd5(gallery_item.url))) + { + upProdInitParam.product.info.headImg.Add(wxImgMapDic[BaseClass.GetMd5(gallery_item.url)]); + upProdParam.product.info.headImg.Add(wxImgMapDic[BaseClass.GetMd5(gallery_item.url)]); + continue; + } + // 使用接口链接传图 var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); var upDate = UserLogin.GetSignaturex(); @@ -1410,7 +1454,7 @@ namespace TemuKJD.WXForms.ProductForms { Invoke(new Action(() => { - cell.Value = "图片提报失败,正在重试。"; + cell.Value = "图片提报失败,正在重试。" + (i + 1); })); Thread.Sleep(Randomx.GetId(3000, 6000)); upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); @@ -1420,7 +1464,7 @@ namespace TemuKJD.WXForms.ProductForms var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); if (string.IsNullOrEmpty(error)) error = upImgAuthRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"申请上传主图失败 " + error + "\"}"; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"申请上传主图失败 " + GetHtml.UrlEncodeUtf8(error) + "\"}"; } string disK = BaseRegex.GetStringJson(ref upImgAuthRst, "disK"); long disT = BaseRegex.GetLongJson(ref upImgAuthRst, "disT"); @@ -1917,12 +1961,6 @@ namespace TemuKJD.WXForms.ProductForms foreach (var gallery_item in detailGalleries) { - if (wxImgMapDic.ContainsKey(BaseClass.GetMd5(gallery_item.url))) - { - upProdParam.product.info.detail.detailImg.Add(wxImgMapDic[BaseClass.GetMd5(gallery_item.url)]); - continue; - } - if (chkImgRandomBlock.Checked && (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸" || dbProd.main_cat_name == "图书" || dbProd.main_cat_name == "书籍/杂志/报纸")) { @@ -1930,6 +1968,13 @@ namespace TemuKJD.WXForms.ProductForms } else { + // 盗链 + if (wxImgMapDic.ContainsKey(BaseClass.GetMd5(gallery_item.url))) + { + upProdParam.product.info.detail.detailImg.Add(wxImgMapDic[BaseClass.GetMd5(gallery_item.url)]); + continue; + } + // 使用接口链接传图 var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); var upDate = UserLogin.GetSignaturex(); @@ -2232,7 +2277,7 @@ namespace TemuKJD.WXForms.ProductForms foreach (var sku in prodInfo.detail.sku) { var spec = sku.spec[0]; - if (!attrParam.items.Any(it => it.value == spec.spec_name)) + if (!attrParam.items.Any(it => it.value == spec.spec_name) && !string.IsNullOrEmpty(sku.thumb_url)) { if (wxImgMapDic.ContainsKey(BaseClass.GetMd5(sku.thumb_url))) { @@ -2370,6 +2415,12 @@ namespace TemuKJD.WXForms.ProductForms // sku图 skuParam.productSkuInfo.thumbImg = upProdParam.product.info.productSaleAttrs[0].items.FirstOrDefault(a => a.value == skuInfo.spec[0].spec_name)?.imgUrl; skuParam.productSkuInfo.skuCode = skuInfo.out_sku_sn; + skuParam.productSkuInfo.outSkuId = skuInfo.out_sku_sn; + skuParam.productSkuInfo.out_sku_id = skuInfo.out_sku_sn; + //skuParam.productSkuInfo.barCode = skuInfo.out_sku_sn; // 条形码 + skuParam.skuKey.outSkuId = skuInfo.out_sku_sn; + skuParam.skuKey.productKey = new productKeyParam(); + skuParam.skuKey.productKey.outProductId = upProdParam.product.info.spuCode; // 库存 skuParam.productSkuInfo.stockInfo = new stockInfoParam() { stockNum = defaultAddPriceRule.StockNum }; skuParam.productSkuInfo.saleParam = new List(); @@ -2565,6 +2616,8 @@ namespace TemuKJD.WXForms.ProductForms var error = BaseRegex.GetStringJson(ref uploadProdRst, "msg"); if (string.IsNullOrEmpty(error)) error = BaseRegex.GetStringJson(ref uploadProdRst, "errmsg"); + if (string.IsNullOrEmpty(error)) + error = BaseRegex.GetStringJson(ref uploadProdRst, "errcode"); if (string.IsNullOrEmpty(error)) error = uploadProdRst; return "{\"success\":false,\"draftId\":" + upProdParam.product.productKey.productId + ",\"status\":\"草稿箱\",\"errMsg\":\"上架失败 " + error + "\"}"; @@ -2757,13 +2810,13 @@ namespace TemuKJD.WXForms.ProductForms public string UploadImg(ShopLoginInfo shop, Bitmap img, DataGridViewCell cell = null) { var upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); - for (int i = 0; i < 10 && upImgAuthRst.Contains("LogicError"); i++) + for (int i = 0; i < 20 && upImgAuthRst.Contains("LogicError"); i++) { if (cell != null) { Invoke(new Action(() => { - cell.Value = "图片提报失败,正在重试。"; + cell.Value = "图片提报失败,正在重试。" + (i + 1); })); } Thread.Sleep(Randomx.GetId(3000, 6000)); @@ -2774,7 +2827,7 @@ namespace TemuKJD.WXForms.ProductForms var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); if (string.IsNullOrEmpty(error)) error = upImgAuthRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"申请上传图片失败 " + error + "\"}"; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"申请上传图片失败 " + GetHtml.UrlEncodeUtf8(error) + "\"}"; } string disK = BaseRegex.GetStringJson(ref upImgAuthRst, "disK"); long disT = BaseRegex.GetLongJson(ref upImgAuthRst, "disT");