using AllBase; using AllBase.Model.Result.WXResult; using NaiBa.Util.Extension; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using TemuKJD.BaseForms; using Work; namespace TemuKJD.PDDForms.ProductForms { public partial class ExprotProductForm : BaseForms.BaseForm { public ExprotProductForm() { InitializeComponent(); } private void btnExportWxApp_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Multiselect = true; // 设置过滤条件,只显示文本文件 openFileDialog.Filter = "文本文件 (*.txt)|*.txt|All files (*.*)|*.*"; // 显示对话框并获取结果 if (openFileDialog.ShowDialog() == DialogResult.OK) { var filePathLst = openFileDialog.FileNames.ToList(); //pbLoading.Visible = true; this.statusBar.pgbTaskProgress.Maximum = filePathLst.Count; this.statusBar.UpdateProgressBar(0); Task.Run(() => { int successNum = 0; int failedNum = 0; foreach (var path in filePathLst) { Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在导入 " + (successNum + failedNum) + "/" + filePathLst.Count + " 成功:" + successNum + " 失败:" + failedNum; })); //string content = ""; string rst = ""; try { rst = getProd(path); if (!rst.Contains("成功")) { } } catch (Exception ex) { rst = ex.Message; } if (string.IsNullOrEmpty(rst) || rst.Contains("入库成功")) successNum++; else failedNum++; Invoke(new Action(() => { this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1); this.statusBar.lblTaskStatus.Text = "正在导入 " + (successNum + failedNum) + "/" + filePathLst.Count + " 成功:" + successNum + " 失败:" + failedNum; })); } Invoke(new Action(() => { //pbLoading.Visible = false; this.statusBar.lblTaskStatus.Text = "导入完成" + (successNum + failedNum) + "/" + filePathLst.Count + " 成功:" + successNum + " 失败:" + failedNum; BaseMsgForm.ShowInfo("导入完成!"); })); }); } } string getProd(string filePath) { string prodStr = ""; //prodStr = Encoding.UTF8.GetString(this.FileUpload1.FileBytes); //prodStr = TextBox2.Text.Trim(); //prodStr = FileBase.ReadAllText(filePath, Encoding.UTF8); using (StreamReader sr = new StreamReader(filePath)) { prodStr = sr.ReadToEnd(); } var reducePer = filePath.Replace(".txt", "").Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries).LastOrDefault().ParseToInt(); if (reducePer > 0) prodStr = "{\"reducePre\":" + reducePer + "}" + prodStr; var realPricePer = 1m - reducePer * 0.01m; if (realPricePer < 0.1m) realPricePer = 0.1m; WXClientProductInfoLite wxClientProd = new WXClientProductInfoLite(); var str_lst = BaseRegex.GetJsonObjStrJson(ref prodStr, "product_key"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.product_key = JsonHelper.DeserializeJsonToObject(regex_str); if (wxClientProd.product_key == null) return "解析失败product_key"; } catch { return "解析失败product_key"; } //商品详情格式 wxClientProd.info = new wx_client_prod_info(); //主标题 wxClientProd.info.title = BaseRegex.GetStringJson(ref prodStr, "title"); if (wxClientProd.info.title.IsNullOrEmpty()) return "解析失败title"; //副标题 wxClientProd.info.sub_title = BaseRegex.GetStringJson(ref prodStr, "sub_title"); str_lst = BaseRegex.GetJsonArrStrJson(ref prodStr, "head_img"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.head_img = JsonHelper.DeserializeJsonToListNullable(regex_str); if (wxClientProd.info.head_img == null) return "解析失败sub_title"; } catch { return "解析失败sub_title"; } var nodeCatId = BaseRegex.GetStringJson(ref prodStr, "nodeCatId"); str_lst = BaseRegex.GetJsonArrStrJson(ref prodStr, "category"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.category = JsonHelper.DeserializeJsonToListNullable(regex_str); if (wxClientProd.info.category != null && !str_lst.IsNullOrEmpty() && !wxClientProd.info.category.Any(c => c.catIdStr == nodeCatId)) { wxClientProd.info.category.Add(new wx_client_category() { catId = nodeCatId, cat_id = nodeCatId }); } //if (wxClientProd.info.category == null) // return "解析失败"; } catch { return "解析失败category"; } str_lst = BaseRegex.GetJsonObjStrJson(ref prodStr, "detail"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.detail = JsonHelper.DeserializeJsonToObjectNullable(regex_str); if (wxClientProd.info.detail == null) { wxClientProd.info.detail = new wx_client_prod_detail(); wxClientProd.info.detail.detail_img.Add(wxClientProd.info.head_img.FirstOrDefault()); } //if (wxClientProd.info.detail == null) // return "解析失败"; } catch { return "解析失败detail"; } str_lst = BaseRegex.GetJsonArrStrJson(ref prodStr, "param"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.param = JsonHelper.DeserializeJsonToListNullable(regex_str); if (wxClientProd.info.param == null) wxClientProd.info.param = new List(); //if (wxClientProd.info.param == null) // return "解析失败"; } catch { return "解析失败param"; } //品牌id wxClientProd.info.brand_id = BaseRegex.GetStringJson(ref prodStr, "brand_id"); //if (wxClientProd.info.brand_id.IsNullOrEmpty()) // return "解析失败"; str_lst = BaseRegex.GetJsonObjStrJson(ref prodStr, "sku_id_list"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.sku_id_list = JsonHelper.DeserializeJsonToObjectNullable(regex_str); //if (wxClientProd.info.sku_id_list == null) // return "解析失败"; } catch { return "解析失败sku_id_list"; } str_lst = BaseRegex.GetJsonObjStrJson(ref prodStr, "sku_list"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.sku_list = JsonHelper.DeserializeJsonToObjectNullable(regex_str); //if (wxClientProd.info.sku_list == null) // return "解析失败"; } catch { return "解析失败sku_id_list"; } if (wxClientProd.info.sku_list == null) { str_lst = BaseRegex.GetJsonArrStrJson(ref prodStr, "sku_info"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); var sku_infos = JsonHelper.DeserializeJsonToListNullable(regex_str); if (sku_infos != null) { wxClientProd.info.sku_list = new wx_sku(); wxClientProd.info.sku_list.sku_info = sku_infos; } } catch { return "解析失败sku_info"; } } // 佣金商品 根据折扣价格和佣金比例减去佣金 if (wxClientProd.info.sku_list != null) { foreach (var sku in wxClientProd.info.sku_list.sku_info) { sku.price = (sku.price - (sku.price - sku.discounted_price) * (1m - realPricePer)).ParseToInt(); } } str_lst = BaseRegex.GetJsonArrStrJson(ref prodStr, "product_sale_attrs"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.product_sale_attrs = JsonHelper.DeserializeJsonToListNullable(regex_str); //if (wxClientProd.info.product_sale_attrs == null) // return "解析失败"; } catch { return "解析失败product_sale_attrs"; } //总销量 wxClientProd.info.total_sold_num = BaseRegex.GetStringJson(ref prodStr, "total_sold_num"); //if (wxClientProd.info.total_sold_num.IsNullOrEmpty()) // return "解析失败"; str_lst = BaseRegex.GetJsonObjStrJson(ref prodStr, "service_desc"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.service_desc = JsonHelper.DeserializeJsonToObjectNullable(regex_str); //if (wxClientProd.info.service_desc == null) // return "解析失败"; } catch { return "解析失败service_desc"; } str_lst = BaseRegex.GetJsonObjStrJson(ref prodStr, "express_info"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.express_info = JsonHelper.DeserializeJsonToObjectNullable(regex_str); //if (wxClientProd.info.express_info == null) // return; } catch { return "解析失败express_info"; } str_lst = BaseRegex.GetJsonArrStrJson(ref prodStr, "headVideoInfo"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.headVideoInfo = JsonHelper.DeserializeJsonToListNullable(regex_str); //if (wxClientProd.info.headVideoInfo == null) // return "解析失败"; } catch { return "解析失败headVideoInfo"; } str_lst = BaseRegex.GetJsonObjStrJson(ref prodStr, "afterSaleInfo"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.afterSaleInfo = JsonHelper.DeserializeJsonToObjectNullable(regex_str); //if (wxClientProd.info.afterSaleInfo == null) // return "解析失败"; } catch { return "解析失败afterSaleInfo"; } str_lst = BaseRegex.GetJsonArrStrJson(ref prodStr, "deliveryExpressFee"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.deliveryExpressFee = JsonHelper.DeserializeJsonToListNullable(regex_str); //if (wxClientProd.info.deliveryExpressFee == null) // return "解析失败"; } catch { return "解析失败deliveryExpressFee"; } str_lst = BaseRegex.GetJsonArrStrJson(ref prodStr, "templateInfo"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.info.templateInfo = JsonHelper.DeserializeJsonToListNullable(regex_str); //if (wxClientProd.info.templateInfo == null) // return "解析失败"; } catch { return "解析失败templateInfo"; } wxClientProd.info.spuCode = BaseRegex.GetStringJson(ref prodStr, "spuCode"); str_lst = BaseRegex.GetJsonArrStrJson(ref prodStr, "productSkus"); try { var regex_str = str_lst.OrderByDescending(s => s.Length).FirstOrDefault(); wxClientProd.productSkus = JsonHelper.DeserializeJsonToList(regex_str); if (wxClientProd.productSkus == null) return "解析失败productSkus"; } catch { return "解析失败productSkus"; } // 佣金商品 根据价格给售卖价格赋值,如果价格丢失,直接在售卖价上计算 foreach (var sku in wxClientProd.productSkus) { var wxDisSku = wxClientProd.info.sku_list?.sku_info?.FirstOrDefault(s => s.sku_id == sku.skuKey.skuId); if (wxDisSku != null) sku.productSkuInfo.salePrice = wxDisSku.price; else sku.productSkuInfo.salePrice = (sku.productSkuInfo.salePrice - sku.productSkuInfo.salePrice * realPricePer).ParseToInt(); } if (wxClientProd.productSkus.Min(s => s.productSkuInfo.salePrice * 0.01m) == 0) { return "解析失败Sku价格为0"; } return SaveWxProd(wxClientProd.product_key.product_id, wxClientProd, prodStr); } string SaveWxProd(string prodId, WXClientProductInfoLite wxClientProdInfoLite, string baseStr) { bool isExist = false; var existUrl = BaseClass.BuildPDDObjString("product/get_product_spu_id_list"); string existData = UserLogin.GetSignaturex() + "&search_spu_ids=" + prodId; //if (!string.IsNullOrEmpty(prod.dbProduct.real_spu_id)) // existData = UserLogin.GetSignaturex() + "&search_spu_ids=" + prod.spuId + "," + prod.dbProduct.real_spu_id; string html = GetHtml.PostUtf8(existUrl, existData); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) html = GetHtml.PostUtf8(existUrl, existData); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) { return "采集入库失败,产品数据库连接失败"; } else { if (html.Contains("\"data\":[") && !html.Contains("\"data\":[]")) isExist = true; } var url = BaseClass.BuildPDDObjString("product/add_product"); if (isExist) url = BaseClass.BuildPDDObjString("product/mdy_product"); var skus = wxClientProdInfoLite.productSkus; var product_json = "{\"wxxdData\":" + JsonHelper.SerializeObject(wxClientProdInfoLite) + ",\"baseData\":" + JsonHelper.SerializeObject(baseStr) + "}"; var data = UserLogin.GetSignaturex() + "&from_shop_id=" + wxClientProdInfoLite.product_key.appid + "&from_shop_name=" + wxClientProdInfoLite.product_key.appid + "&spu_id=" + prodId + "&skc_id=" + prodId + "&price_text=" + skus.Min(s => s.productSkuInfo.salePrice * 0.01m) + " - " + skus.Max(s => s.productSkuInfo.salePrice * 0.01m) + "&ext_code=" + wxClientProdInfoLite.info.spuCode + "&product_name=" + HttpUtility.UrlEncode(wxClientProdInfoLite.info.title, Encoding.UTF8) + "&product_json=" + HttpUtility.UrlEncode(product_json, Encoding.UTF8) + // product_json /*HttpUtility.UrlEncode(JsonUtils.SerializeObject(wxClientProdInfoLite), Encoding.UTF8)*/ "&sale_count=" + wxClientProdInfoLite.info.total_sold_num + "&sale_count_text=" + wxClientProdInfoLite.info.total_sold_num + "&main_img=" + HttpUtility.UrlEncode(wxClientProdInfoLite.info.head_img.FirstOrDefault(), Encoding.UTF8) + "&wx_safe_status=" + HttpUtility.UrlEncode("安全商品", Encoding.UTF8) + "&product_get_type=" + HttpUtility.UrlEncode("微信小店", Encoding.UTF8); if (wxClientProdInfoLite.info.category.Count > 0) { data += "&wx_cat_1=" + wxClientProdInfoLite.info.category[0].catIdStr; data += "&main_cat_id=" + wxClientProdInfoLite.info.category[0].catIdStr; data += "&main_cat_name=" + wxClientProdInfoLite.info.category[0].name; data += "&wx_cat_leaf=" + wxClientProdInfoLite.info.category.LastOrDefault()?.catIdStr; data += "&cat_id=" + wxClientProdInfoLite.info.category.LastOrDefault()?.catIdStr; data += "&cat_name=" + HttpUtility.UrlEncode((wxClientProdInfoLite.info.category.LastOrDefault()?.name).ParseToString(), Encoding.UTF8); } if (wxClientProdInfoLite.info.category.Count > 1) { data += "&wx_cat_2=" + wxClientProdInfoLite.info.category[1].catIdStr; } if (wxClientProdInfoLite.info.category.Count > 2) { data += "&wx_cat_3=" + wxClientProdInfoLite.info.category[2].catIdStr; } if (wxClientProdInfoLite.info.category.FirstOrDefault().name == "图书") { data += "&special_prod_type=" + HttpUtility.UrlEncode("书籍", Encoding.UTF8); } html = GetHtml.PostUtf8(url, data); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) html = GetHtml.PostUtf8(url, data); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) { string msg = "商品入库失败!请检查网络连接:" + BaseRegex.GetStringJson(ref html, "msg"); //Invoke(new Action(() => //{ // row.Cells["colMsg"].Value = msg; //})); return msg; } else { //prod.getProductMsg = "商品入库成功!"; //Invoke(new Action(() => //{ // row.Cells["colMsg"].Value = prod.getProductMsg; //})); if (!isExist) { url = BaseClass.BuildPDDObjString("product/mdy_product"); html = GetHtml.PostUtf8(url, data); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) html = GetHtml.PostUtf8(url, data); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) { string msg = "商品入库失败!请检查网络连接:" + BaseRegex.GetStringJson(ref html, "msg"); return msg; } } return "微信商品采集入库成功!"; } } } }