diff --git a/TEMUKJD/BLL/WXVideoUploader.cs b/TEMUKJD/BLL/WXVideoUploader.cs new file mode 100644 index 0000000..ce7d287 --- /dev/null +++ b/TEMUKJD/BLL/WXVideoUploader.cs @@ -0,0 +1,671 @@ +using AllBase; +using AllBase.Model.Result; +using Fiddler; +using NaiBa.Util.Extension; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace TemuKJD.BLL +{ + internal static class Config + { + // ------- Cookie ------- + + + // ------- 以下是协议里的固定常量,一般不用改 ------- + public const string VideoHost = "https://westoregamma.video.qq.com"; + public const string ShopHost = "https://store.weixin.qq.com"; + public const int BizId = 50087; // 微信小店商品视频固定 bizId + public const int AppType = 162; // 视频场景固定 apptype + public const int FileType = 20302; // 视频场景固定 filetype + public const int ChunkSize = 2 * 1024 * 1024; // 分片大小 2MB,与抓包一致 + + // 轮询转码结果的间隔与最大次数 + public static readonly TimeSpan PollInterval = TimeSpan.FromSeconds(2); + public const int MaxPollTimes = 30; + } + public class WXVideoUploader + { + private string Cookie = ""; + + // ------- 当前登录会话的 openid ------- + private string OpenId = ""; + + // ------- 商品 ID, groupid ------- + private string ProductId = ""; + + private string biz_magic = ""; + private readonly HttpClient _http; + public WXVideoUploader() + { + _http = new HttpClient(new HttpClientHandler + { + Proxy = new WebProxy("http://127.0.0.1:8080"), + UseProxy = true, + UseCookies=false, + AutomaticDecompression = System.Net.DecompressionMethods.GZip + | System.Net.DecompressionMethods.Deflate + }); + } + public WXVideoUploader(HttpClient http) + { + _http = http; + } + + public MultiMediaDownloadUrlResp Upload(ShopLoginInfo shop, string productId, string videoPath) + { + if (!File.Exists(videoPath)) + { + throw new Exception("视频文件不存在"); + } + byte[] bs = File.ReadAllBytes(videoPath); + return Upload(shop, productId, bs); + } + public MultiMediaDownloadUrlResp Upload(ShopLoginInfo shop, string productId, byte[] videoBytes) + { + var cookieLst = JsonHelper.DeserializeJsonToList(shop?.Cookies.ParseToString()); + if (cookieLst == null) + cookieLst = new List(); + foreach (var cook in cookieLst) + { + if (cook.Name == "biz_magic") + { + biz_magic = cook.Value; + } + Cookie += cook.Name + "=" + cook.Value + "; "; + } + + OpenId = shop.openid; + ProductId = productId; + int fileSize = videoBytes.Length; + if (fileSize == 0) + { + throw new Exception("视频数据错误"); + } + + + + // taskId 贯穿整个上传流程的 X-Arguments,fileId 与之相同 + string taskId = Guid.NewGuid().ToString(); + Debug.WriteLine($"[0/6] GetUploadTempImgAuth"); + TempImgAuthResp authResp = GetUploadTempImgAuth(); + + Debug.WriteLine($"[1/6] initupload fileSize={fileSize} taskId={taskId}"); + InitUploadResp initResp = InitUpload(taskId, fileSize); + Debug.WriteLine($" -> fileName={initResp.FileName} uKey={initResp.UKey} videoId={initResp.VideoId}"); + + Debug.WriteLine("[2/6] uploadpart 分片上传..."); + List finishParts = UploadParts(taskId, videoBytes, initResp.FileName, initResp.UKey, fileSize); + Debug.WriteLine($" -> 共 {finishParts.Count} 片上传完成"); + + Debug.WriteLine("[3/6] finishupload 提交分片清单..."); + FinishUpload(taskId, initResp.FileName, initResp.UKey, finishParts); + + Debug.WriteLine("[4/6] transcode 触发转码..."); + Transcode(taskId, initResp.FileName); + + Debug.WriteLine("[5/6] getplayinfo 轮询转码结果..."); + // 转码后的文件名规则: .f100001.mp4 + string transcodedFileName = $"{initResp.VideoId}.f100001.mp4"; + string playUrl = PollPlayUrl(taskId, transcodedFileName); + Debug.WriteLine($" -> playUrl={playUrl}"); + + Debug.WriteLine("[6/6] getMultiMediaDownloadUrl 换取最终下载地址..."); + MultiMediaDownloadUrlResp finalResult = GetMultiMediaDownloadUrl(playUrl); + finalResult.VideoDuration = GetMp4Duration(videoBytes).Seconds; + return finalResult; + } + + + + // ------------------------------------------------------------------- + // getUploadTempImgAuth + // ------------------------------------------------------------------- + private TempImgAuthResp GetUploadTempImgAuth(string uploadScene = "100") + { + string url = $"{Config.ShopHost}/shop-faas/mmecchannelspicture/cgi/getUploadTempImgAuth" + + $"?token=&lang=zh_CN&uploadScene={uploadScene}"; + + using var req = new HttpRequestMessage(HttpMethod.Get, url); + req.Headers.TryAddWithoutValidation("Cookie", Cookie); + req.Headers.TryAddWithoutValidation("potter-scene", "weixinShop"); + req.Headers.TryAddWithoutValidation("wecom_magic", ""); + req.Headers.TryAddWithoutValidation("supplier_magic", ""); + req.Headers.TryAddWithoutValidation("talent_magic", ""); + req.Headers.TryAddWithoutValidation("logistics_magic", ""); + req.Headers.TryAddWithoutValidation("mcn_magic", ""); + req.Headers.TryAddWithoutValidation("biz_magic", biz_magic); + req.Headers.TryAddWithoutValidation("Accept", "application/json, text/plain, */*"); + req.Headers.Referrer = new Uri($"{Config.ShopHost}/shop/goods/entry?productId={ProductId}"); + + using HttpResponseMessage resp = _http.SendAsync(req).GetAwaiter().GetResult(); + string json = resp.Content.ReadAsStringAsync().GetAwaiter().GetResult(); + EnsureSuccessJson(resp, json); + + var parsed = JsonConvert.DeserializeObject(json, JsonOpts)!; + if (parsed.Code != 0) + throw new Exception($"getUploadTempImgAuth 失败: {json}"); + + return parsed; + } + + + // ------------------------------------------------------------------- + // 1. initupload + // ------------------------------------------------------------------- + private InitUploadResp InitUpload(string taskId, long fileSize) + { + var body = new + { + bizId = Config.BizId, + fileUpInfo = new + { + fileId = taskId, + fileType = "mp4", + fileSize + } + }; + + using var req = BuildVideoRequest(HttpMethod.Post, "/initupload", taskId); + req.Content = JsonContent(body); + + using HttpResponseMessage resp = _http.SendAsync(req).GetAwaiter().GetResult(); + string json = resp.Content.ReadAsStringAsync().GetAwaiter().GetResult(); + EnsureSuccessJson(resp, json); + + var parsed = JsonConvert.DeserializeObject(json, JsonOpts)!; + if (parsed.Code != 0) + throw new Exception($"initupload 失败: {json}"); + return parsed; + } + + // ------------------------------------------------------------------- + // 2. uploadpart(按 2MB 分片,partnum 从 1 开始) + // ------------------------------------------------------------------- + private List UploadParts(string taskId, byte[] videoBytes, string fileName, string uKey, long fileSize) + { + var finishParts = new List(); + + using var fs = new MemoryStream(videoBytes); + byte[] buffer = new byte[Config.ChunkSize]; + int partNum = 1; + long remaining = fileSize; + + while (remaining > 0) + { + int toRead = (int)Math.Min(Config.ChunkSize, remaining); + int readTotal = 0; + while (readTotal < toRead) + { + int n = fs.Read(buffer, readTotal, toRead - readTotal); + if (n <= 0) throw new IOException("读取文件失败,文件可能被截断"); + readTotal += n; + } + + byte[] chunk = readTotal == buffer.Length ? buffer : buffer.Take(readTotal).ToArray(); + + string path = $"/uploadpart?filename={Uri.EscapeDataString(fileName)}&ukey={Uri.EscapeDataString(uKey)}&partnum={partNum}"; + using var req = BuildVideoRequest(HttpMethod.Post, path, taskId); + req.Content = new ByteArrayContent(chunk); + req.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); // 与抓包一致(实际发的是二进制) + + using HttpResponseMessage resp = _http.SendAsync(req).GetAwaiter().GetResult(); + string json = resp.Content.ReadAsStringAsync().GetAwaiter().GetResult(); + EnsureSuccessJson(resp, json); + + var parsed = JsonConvert.DeserializeObject(json, JsonOpts)!; + if (parsed.Code != 0) + throw new Exception($"uploadpart(part {partNum}) 失败: {json}"); + + Console.WriteLine($" part {partNum}: {readTotal} bytes, sha1(server)={parsed.PartSha}"); + finishParts.Add(new FinishPart { PartNum = partNum, PartSha = parsed.PartSha }); + + remaining -= readTotal; + partNum++; + } + + return finishParts; + } + + // ------------------------------------------------------------------- + // 3. finishupload + // ------------------------------------------------------------------- + private void FinishUpload(string taskId, string fileName, string uKey, List finishParts) + { + var body = new + { + bizId = Config.BizId, + fileName, + uKey, + finishParts, + transInfo = new + { + snapshot = new[] { new { formatId = 1400 } }, // 封面截图 + transcode = new[] { new { formatId = 100003 }, new { formatId = 100004 } } + } + }; + + using var req = BuildVideoRequest(HttpMethod.Post, "/finishupload", taskId); + req.Content = JsonContent(body); + + using HttpResponseMessage resp = _http.SendAsync(req).GetAwaiter().GetResult(); + string json = resp.Content.ReadAsStringAsync().GetAwaiter().GetResult(); + EnsureSuccessJson(resp, json); + + var parsed = JsonConvert.DeserializeObject(json, JsonOpts)!; + if (parsed.Code != 0) + throw new Exception($"finishupload 失败: {json}"); + } + + // ------------------------------------------------------------------- + // 4. transcode(触发最终可播放版本 formatId=100001) + // ------------------------------------------------------------------- + private void Transcode(string taskId, string fileName) + { + var body = new + { + fileName, + bizId = Config.BizId, + transInfo = new { transcode = new[] { new { formatId = 100001 } } }, + use_new_transcode = 1 + }; + + using var req = BuildVideoRequest(HttpMethod.Post, "/transcode", taskId); + req.Content = JsonContent(body); + + using HttpResponseMessage resp = _http.SendAsync(req).GetAwaiter().GetResult(); + string json = resp.Content.ReadAsStringAsync().GetAwaiter().GetResult(); + EnsureSuccessJson(resp, json); + + var parsed = JsonConvert.DeserializeObject(json, JsonOpts)!; + if (parsed.Code != 0) + throw new Exception($"transcode 失败: {json}"); + } + + // ------------------------------------------------------------------- + // 5. getplayinfo 轮询(转码未完成时返回 code=404,完成后 code=0 带 playUrl) + // ------------------------------------------------------------------- + private string PollPlayUrl(string taskId, string transcodedFileName) + { + for (int i = 0; i < Config.MaxPollTimes; i++) + { + string path = $"/getplayinfo?filename={Uri.EscapeDataString(transcodedFileName)}"; + using var req = BuildVideoRequest(HttpMethod.Get, path, taskId); + + using HttpResponseMessage resp = _http.SendAsync(req).GetAwaiter().GetResult(); + string json = resp.Content.ReadAsStringAsync().GetAwaiter().GetResult(); + + var parsed = JsonConvert.DeserializeObject(json, JsonOpts)!; + if (parsed.Code == 0 && parsed.FormatList != null && parsed.FormatList.Count > 0) + { + string? url = parsed.FormatList[0].PlayUrl; + if (!string.IsNullOrEmpty(url)) + return url; + } + + Console.WriteLine($" 转码中... ({i + 1}/{Config.MaxPollTimes}) code={parsed.Code}"); + Thread.Sleep(Config.PollInterval); + } + + throw new TimeoutException("等待转码超时,请增大 Config.MaxPollTimes 或检查视频云状态"); + } + + // ------------------------------------------------------------------- + // 6. store.weixin.qq.com getMultiMediaDownloadUrl + // ------------------------------------------------------------------- + private MultiMediaDownloadUrlResp GetMultiMediaDownloadUrl(string playUrl) + { + var url = $"{Config.ShopHost}/shop-faas/mmecchannelspicture/cgi/getMultiMediaDownloadUrl?token=&lang=zh_CN"; + + using var req = new HttpRequestMessage(HttpMethod.Post, url); + req.Headers.TryAddWithoutValidation("Cookie", Cookie); + req.Headers.TryAddWithoutValidation("potter-scene", "weixinShop"); + // 抓包里这几个 magic 头是空字符串,但仍然带上 + req.Headers.TryAddWithoutValidation("wecom_magic", ""); + req.Headers.TryAddWithoutValidation("supplier_magic", ""); + req.Headers.TryAddWithoutValidation("talent_magic", ""); + req.Headers.TryAddWithoutValidation("logistics_magic", ""); + req.Headers.TryAddWithoutValidation("mcn_magic", ""); + req.Headers.TryAddWithoutValidation("biz_magic", biz_magic); + req.Headers.Referrer = new Uri($"{Config.ShopHost}/shop/goods/entry?productId={ProductId}"); + req.Headers.TryAddWithoutValidation("Accept", "application/json, text/plain, */*"); + + req.Content = JsonContent(new { playUrl }); + + using HttpResponseMessage resp = _http.SendAsync(req).GetAwaiter().GetResult(); + string json = resp.Content.ReadAsStringAsync().GetAwaiter().GetResult(); + EnsureSuccessJson(resp, json); + + var parsed = JsonConvert.DeserializeObject(json, JsonOpts)!; + if (parsed.Code != 0) + throw new Exception($"getMultiMediaDownloadUrl 失败: {json}"); + return parsed; + } + + // ------------------------------------------------------------------- + // 公共辅助方法 + // ------------------------------------------------------------------- + + /// + /// 构造 westoregamma.video.qq.com 上的请求,统一带上 X-Arguments 等公共头 + /// + private HttpRequestMessage BuildVideoRequest(HttpMethod method, string pathAndQuery, string taskId) + { + var req = new HttpRequestMessage(method, Config.VideoHost + pathAndQuery); + + string xArguments = + $"apptype={Config.AppType}&filetype={Config.FileType}&openid={OpenId}&groupid={ProductId}&taskid={taskId}"; + + req.Headers.TryAddWithoutValidation("X-Requested-With", "XMLHttpRequest"); + req.Headers.TryAddWithoutValidation("X-Arguments", xArguments); + req.Headers.TryAddWithoutValidation("Accept", "application/json, text/plain, */*"); + req.Headers.Referrer = new Uri($"{Config.ShopHost}/"); + req.Headers.TryAddWithoutValidation("Origin", Config.ShopHost); + + return req; + } + + private static HttpContent JsonContent(object body) + { + string json = JsonConvert.SerializeObject(body); + return new StringContent(json, Encoding.UTF8, "application/json"); + } + + private static void EnsureSuccessJson(HttpResponseMessage resp, string json) + { + if (!resp.IsSuccessStatusCode) + throw new Exception($"HTTP {(int)resp.StatusCode} {resp.ReasonPhrase}: {json}"); + } + + + #region 获取video时长 + /// + /// 从 MP4 字节数组中读取视频时长 + /// + /// 完整的 MP4 文件字节数组 + /// 视频时长 + private static TimeSpan GetMp4Duration(byte[] videoBytes) + { + if (videoBytes == null || videoBytes.Length < 8) + throw new ArgumentException("无效的 MP4 数据", nameof(videoBytes)); + + int offset = 0; + + while (offset + 8 <= videoBytes.Length) + { + ulong boxSize = ReadUInt32BE(videoBytes, offset); + string boxType = Encoding.ASCII.GetString( + videoBytes, offset + 4, 4); + + int headerSize = 8; + + // Extended Size + if (boxSize == 1) + { + if (offset + 16 > videoBytes.Length) + throw new InvalidOperationException("MP4 Box 数据不完整"); + + boxSize = ReadUInt64BE(videoBytes, offset + 8); + headerSize = 16; + } + // size == 0 表示一直到文件末尾 + else if (boxSize == 0) + { + boxSize = (ulong)(videoBytes.Length - offset); + } + + if (boxSize < (ulong)headerSize || + boxSize > (ulong)(videoBytes.Length - offset)) + { + throw new InvalidOperationException( + "无效的 MP4 Box: " + boxType); + } + + // 找到 moov + if (boxType == "moov") + { + int moovStart = offset + headerSize; + int moovLength = checked((int)boxSize - headerSize); + + return ParseMoov( + videoBytes, + moovStart, + moovLength); + } + + offset += checked((int)boxSize); + } + + throw new InvalidOperationException( + "MP4 中没有找到 moov Box"); + } + + private static TimeSpan ParseMoov( + byte[] data, + int start, + int length) + { + int offset = start; + int end = start + length; + + while (offset + 8 <= end) + { + ulong boxSize = ReadUInt32BE(data, offset); + + string boxType = Encoding.ASCII.GetString( + data, + offset + 4, + 4); + + int headerSize = 8; + + if (boxSize == 1) + { + if (offset + 16 > end) + throw new InvalidOperationException( + "MP4 Box 数据不完整"); + + boxSize = ReadUInt64BE(data, offset + 8); + headerSize = 16; + } + else if (boxSize == 0) + { + boxSize = (ulong)(end - offset); + } + + if (boxSize < (ulong)headerSize || + boxSize > (ulong)(end - offset)) + { + throw new InvalidOperationException( + "无效的 MP4 Box: " + boxType); + } + + // moov -> mvhd + if (boxType == "mvhd") + { + return ParseMvhd( + data, + offset + headerSize, + checked((int)boxSize - headerSize)); + } + + offset += checked((int)boxSize); + } + + throw new InvalidOperationException( + "MP4 中没有找到 mvhd Box"); + } + + private static TimeSpan ParseMvhd( + byte[] data, + int start, + int length) + { + if (length < 20) + throw new InvalidOperationException( + "mvhd 数据不完整"); + + // version + byte version = data[start]; + + // Version 0 + if (version == 0) + { + // version + flags 4 + // creation_time 4 + // modification_time 4 + // timescale 4 + // duration 4 + + uint timescale = ReadUInt32BE( + data, + start + 12); + + uint duration = ReadUInt32BE( + data, + start + 16); + + if (timescale == 0) + throw new InvalidOperationException( + "MP4 timescale 为 0"); + + return TimeSpan.FromSeconds( + (double)duration / timescale); + } + + // Version 1 + if (version == 1) + { + if (length < 32) + throw new InvalidOperationException( + "mvhd version 1 数据不完整"); + + // version + flags 4 + // creation_time 8 + // modification_time 8 + // timescale 4 + // duration 8 + + uint timescale = ReadUInt32BE( + data, + start + 20); + + ulong duration = ReadUInt64BE( + data, + start + 24); + + if (timescale == 0) + throw new InvalidOperationException( + "MP4 timescale 为 0"); + + return TimeSpan.FromSeconds( + (double)duration / timescale); + } + + throw new NotSupportedException( + "不支持的 mvhd version: " + version); + } + + private static uint ReadUInt32BE( + byte[] data, + int offset) + { + return (uint)( + (data[offset] << 24) | + (data[offset + 1] << 16) | + (data[offset + 2] << 8) | + data[offset + 3]); + } + + private static ulong ReadUInt64BE( + byte[] data, + int offset) + { + uint high = ReadUInt32BE(data, offset); + uint low = ReadUInt32BE(data, offset + 4); + + return ((ulong)high << 32) | low; + } + #endregion + + + private static readonly JsonSerializerSettings JsonOpts = new JsonSerializerSettings + { + + }; + } + + + internal class TempImgAuthResp + { + [JsonProperty("code")] public int Code { get; set; } + [JsonProperty("disK")] public string DisK { get; set; } = ""; + [JsonProperty("disT")] public long DisT { get; set; } + [JsonProperty("ext")] public string Ext { get; set; } = ""; + [JsonProperty("url")] public string Url { get; set; } = ""; + } + internal class InitUploadResp + { + [JsonProperty("code")] public int Code { get; set; } + [JsonProperty("fileName")] public string FileName { get; set; } = ""; + [JsonProperty("uKey")] public string UKey { get; set; } = ""; + [JsonProperty("videoId")] public string VideoId { get; set; } = ""; + [JsonProperty("msg")] public string Msg { get; set; } + } + + internal class UploadPartResp + { + [JsonProperty("code")] public int Code { get; set; } + [JsonProperty("msg")] public string Msg { get; set; } + [JsonProperty("partSha")] public string PartSha { get; set; } = ""; + } + + internal class FinishPart + { + [JsonProperty("partNum")] public int PartNum { get; set; } + [JsonProperty("partSha")] public string PartSha { get; set; } = ""; + } + + internal class CodeMsgResp + { + [JsonProperty("code")] public int Code { get; set; } + [JsonProperty("msg")] public string Msg { get; set; } + } + + internal class GetPlayInfoResp + { + [JsonProperty("code")] public int Code { get; set; } + [JsonProperty("msg")] public string Msg { get; set; } + [JsonProperty("formatList")] public List? FormatList { get; set; } + } + + internal class PlayFormat + { + [JsonProperty("formatId")] public int FormatId { get; set; } + [JsonProperty("playUrl")] public string PlayUrl { get; set; } + [JsonProperty("duration")] public double Duration { get; set; } + [JsonProperty("width")] public int Width { get; set; } + [JsonProperty("height")] public int Height { get; set; } + } + + public class MultiMediaDownloadUrlResp + { + [JsonProperty("code")] public int Code { get; set; } + [JsonProperty("videoImgUrl")] public string VideoImgUrl { get; set; } + [JsonProperty("downloadUrl")] public string DownloadUrl { get; set; } + /// + /// 时长 + /// + public int VideoDuration { get; set; } + } +} diff --git a/TEMUKJD/KJD.csproj b/TEMUKJD/KJD.csproj index 928cc06..309b1ce 100644 --- a/TEMUKJD/KJD.csproj +++ b/TEMUKJD/KJD.csproj @@ -63,7 +63,7 @@ DEBUG;TRACE full x64 - 7.3 + 8.0 prompt false @@ -73,7 +73,7 @@ true pdbonly x64 - 7.3 + 8.0 prompt true @@ -155,6 +155,7 @@ + diff --git a/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs b/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs index 864daea..27a6302 100644 --- a/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs +++ b/TEMUKJD/WXForms/ProductForms/WXDBProdUploadForm.cs @@ -38,7412 +38,7458 @@ using static System.Net.Mime.MediaTypeNames; namespace TemuKJD.WXForms.ProductForms { - public partial class WXDBProdUploadForm : BaseForm - { - public static WXDBProdUploadForm Instance { get; set; } = null; - public static ConcurrentList lstWXShopTokenInfo = new ConcurrentList(); + public partial class WXDBProdUploadForm : BaseForm + { + public static WXDBProdUploadForm Instance { get; set; } = null; + public static ConcurrentList lstWXShopTokenInfo = new ConcurrentList(); - public CancellationTokenSource cancellationTokenSource { get; set; } = null; - public bool IsWxNotUseSoftwareDefaultAddressOnce { get; set; } = false; + public CancellationTokenSource cancellationTokenSource { get; set; } = null; + public bool IsWxNotUseSoftwareDefaultAddressOnce { get; set; } = false; - public ConcurrentList lstTemuDBProductSelect = new ConcurrentList(); - ConcurrentList lstAddPriceRule = new ConcurrentList(); + public ConcurrentList lstTemuDBProductSelect = new ConcurrentList(); + ConcurrentList lstAddPriceRule = new ConcurrentList(); - bool isInit = false; - CheckBox chkSelectAll = null; + bool isInit = false; + CheckBox chkSelectAll = null; - AddPriceRule defaultAddPriceRule = null; - WXUploadRule wxUploadRule = null; + AddPriceRule defaultAddPriceRule = null; + WXUploadRule wxUploadRule = null; - public Dictionary dicCheckedShopId = new Dictionary(); + public Dictionary dicCheckedShopId = new Dictionary(); - public string pdd_product_cates = ""; + public string pdd_product_cates = ""; - public List forceFilteKeyWords = new List() - { - "顶级", "之王", "二手", "亏本", "冲量", "白菜价", "跳楼价", "xxx", "xx", "最大", "最小", "低价", "降价", "成本", "赔钱", "甩卖", - "真丝", "蚕丝", "香云纱", "羊绒", "羊毛", "羊羔绒", "羊羔毛", "羽绒", "皮草" - }; + public List forceFilteKeyWords = new List() + { + "顶级", "之王", "二手", "亏本", "冲量", "白菜价", "跳楼价", "xxx", "xx", "最大", "最小", "低价", "降价", "成本", "赔钱", "甩卖", + "真丝", "蚕丝", "香云纱", "羊绒", "羊毛", "羊羔绒", "羊羔毛", "羽绒", "皮草" + }; - string DefaultAdultBrandId = ""; + string DefaultAdultBrandId = ""; - // 微信带货助手cookie - List lstWxSaleAssistantCookie = new List(); + // 微信带货助手cookie + List lstWxSaleAssistantCookie = new List(); - List lstQulificationImage = new List(); + List lstQulificationImage = new List(); - public WXDBProdUploadForm() - { - InitializeComponent(); - } + public WXDBProdUploadForm() + { + InitializeComponent(); + } - private void UserSelectDbProductForm_Load(object sender, EventArgs e) - { - Instance = this; + private void UserSelectDbProductForm_Load(object sender, EventArgs e) + { + Instance = this; - if (!BaseClass.UserAuthority.Contains("定向品牌")) - { - cmbSpBrandName.Visible = lblSpBrand.Visible = false; - this.ucTabControlMetro1.TabPages.Remove(特殊参数); - } - else - cmbSpBrandName.Visible = lblSpBrand.Visible = true; + if (!BaseClass.UserAuthority.Contains("定向品牌")) + { + cmbSpBrandName.Visible = lblSpBrand.Visible = false; + this.ucTabControlMetro1.TabPages.Remove(特殊参数); + } + else + cmbSpBrandName.Visible = lblSpBrand.Visible = true; - if (!BaseClass.UserAuthority.Contains("佣金上货")) - this.ucTabControlMetro1.TabPages.Remove(佣金上货); - else - { - lstWxSaleAssistantCookie = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_sale_assistant_cookies"); - if (lstWxSaleAssistantCookie == null) - lstWxSaleAssistantCookie = new List(); - } + if (!BaseClass.UserAuthority.Contains("佣金上货")) + this.ucTabControlMetro1.TabPages.Remove(佣金上货); + else + { + lstWxSaleAssistantCookie = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_sale_assistant_cookies"); + if (lstWxSaleAssistantCookie == null) + lstWxSaleAssistantCookie = new List(); + } - GlobalConfig.lstWxShopAuthInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_shop_auth_list"); - if (GlobalConfig.lstWxShopAuthInfo == null) - GlobalConfig.lstWxShopAuthInfo = new ConcurrentList(); + GlobalConfig.lstWxShopAuthInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_shop_auth_list"); + if (GlobalConfig.lstWxShopAuthInfo == null) + GlobalConfig.lstWxShopAuthInfo = new ConcurrentList(); - lstWXShopTokenInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_shop_token_list"); - if (lstWXShopTokenInfo == null) - lstWXShopTokenInfo = new ConcurrentList(); + lstWXShopTokenInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_shop_token_list"); + if (lstWXShopTokenInfo == null) + lstWXShopTokenInfo = new ConcurrentList(); - lstTemuDBProductSelect = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_db_prod_upload_list"); - if (lstTemuDBProductSelect == null) - lstTemuDBProductSelect = new NaiBa.Util.ConcurrentList(); + lstTemuDBProductSelect = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_db_prod_upload_list"); + if (lstTemuDBProductSelect == null) + lstTemuDBProductSelect = new NaiBa.Util.ConcurrentList(); - lstAddPriceRule = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_add_price_rules"); - if (lstAddPriceRule == null) - { - lstAddPriceRule = new NaiBa.Util.ConcurrentList(); - lstAddPriceRule.Add(new AddPriceRule() { MoreThanPrice = 0, LessThanPrice = 10, AddPriceTimes = 2, AddMorePrice = 10, SinglePriceAdd = 1 }); - lstAddPriceRule.Add(new AddPriceRule() { MoreThanPrice = 10, LessThanPrice = 20, AddPriceTimes = 2, AddMorePrice = 10, SinglePriceAdd = 1 }); - lstAddPriceRule.Add(new AddPriceRule() { MoreThanPrice = 20, LessThanPrice = 999, AddPriceTimes = 2, AddMorePrice = 10, SinglePriceAdd = 1 }); - } - this.fPnlPriceRule.Controls.Clear(); - foreach (var priceItem in lstAddPriceRule) - { - var ucPrice = new UcAddPrice() - { - PriceEnd = priceItem.LessThanPrice, - PriceStart = priceItem.MoreThanPrice, - PriceAddTimes = priceItem.AddPriceTimes, - PriceAddMore = priceItem.AddMorePrice, - SinglePriceAdd = priceItem.SinglePriceAdd, - }; - ucPrice.lblSinglePriceAdd.Visible = false; - ucPrice.txtSinglePriceAdd.Visible = false; - if (IsSetFontScaleNone) - { - Font of = ucPrice.Font; - Font nf = new Font(of.FontFamily, (of.Size * 96.0 / FormDpi).ParseToFloat(), of.Style, of.Unit, of.GdiCharSet, of.Bold); - ucPrice.Font = nf; - } + lstAddPriceRule = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_add_price_rules"); + if (lstAddPriceRule == null) + { + lstAddPriceRule = new NaiBa.Util.ConcurrentList(); + lstAddPriceRule.Add(new AddPriceRule() { MoreThanPrice = 0, LessThanPrice = 10, AddPriceTimes = 2, AddMorePrice = 10, SinglePriceAdd = 1 }); + lstAddPriceRule.Add(new AddPriceRule() { MoreThanPrice = 10, LessThanPrice = 20, AddPriceTimes = 2, AddMorePrice = 10, SinglePriceAdd = 1 }); + lstAddPriceRule.Add(new AddPriceRule() { MoreThanPrice = 20, LessThanPrice = 999, AddPriceTimes = 2, AddMorePrice = 10, SinglePriceAdd = 1 }); + } + this.fPnlPriceRule.Controls.Clear(); + foreach (var priceItem in lstAddPriceRule) + { + var ucPrice = new UcAddPrice() + { + PriceEnd = priceItem.LessThanPrice, + PriceStart = priceItem.MoreThanPrice, + PriceAddTimes = priceItem.AddPriceTimes, + PriceAddMore = priceItem.AddMorePrice, + SinglePriceAdd = priceItem.SinglePriceAdd, + }; + ucPrice.lblSinglePriceAdd.Visible = false; + ucPrice.txtSinglePriceAdd.Visible = false; + if (IsSetFontScaleNone) + { + Font of = ucPrice.Font; + Font nf = new Font(of.FontFamily, (of.Size * 96.0 / FormDpi).ParseToFloat(), of.Style, of.Unit, of.GdiCharSet, of.Bold); + ucPrice.Font = nf; + } - this.fPnlPriceRule.Controls.Add(ucPrice); - ucPrice.PriceChange += ucAddPrice_PriceChange; - } + this.fPnlPriceRule.Controls.Add(ucPrice); + ucPrice.PriceChange += ucAddPrice_PriceChange; + } - dicCheckedShopId = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_checked_shop_dic"); - if (dicCheckedShopId == null) - dicCheckedShopId = new Dictionary(); + dicCheckedShopId = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_checked_shop_dic"); + if (dicCheckedShopId == null) + dicCheckedShopId = new Dictionary(); - GlobalConfig.dicWxShopUploadInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_shop_upload_info"); - if (GlobalConfig.dicWxShopUploadInfo == null) - GlobalConfig.dicWxShopUploadInfo = new Dictionary(); + GlobalConfig.dicWxShopUploadInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_shop_upload_info"); + if (GlobalConfig.dicWxShopUploadInfo == null) + GlobalConfig.dicWxShopUploadInfo = new Dictionary(); - defaultAddPriceRule = NaiBa.Util.Helper.ConfigHelper.LoadConfig("wx_default_add_price_rule"); - if (defaultAddPriceRule == null) - { - defaultAddPriceRule = new AddPriceRule() { AddPriceTimes = 1.3m, AddMorePrice = 1, SinglePriceAdd = 1 }; - } + defaultAddPriceRule = NaiBa.Util.Helper.ConfigHelper.LoadConfig("wx_default_add_price_rule"); + if (defaultAddPriceRule == null) + { + defaultAddPriceRule = new AddPriceRule() { AddPriceTimes = 1.3m, AddMorePrice = 1, SinglePriceAdd = 1 }; + } - //this.txtFissionTitle.Text = NaiBa.Util.Helper.ConfigHelper.LoadConfig("wx_prod_fission_title").ParseToString(); - try - { - if (File.Exists("data\\config\\wx_prod_fission_title")) - this.txtFissionTitle.Text = File.ReadAllText("data\\config\\wx_prod_fission_title"); - } - catch { } + //this.txtFissionTitle.Text = NaiBa.Util.Helper.ConfigHelper.LoadConfig("wx_prod_fission_title").ParseToString(); + try + { + if (File.Exists("data\\config\\wx_prod_fission_title")) + this.txtFissionTitle.Text = File.ReadAllText("data\\config\\wx_prod_fission_title"); + } + catch { } - txtAddTimes.TextChanged -= txtAddPrice_TextChanged; - txtAddMorePrice.TextChanged -= txtAddPrice_TextChanged; - txtSinglePriceAdd.TextChanged -= txtAddPrice_TextChanged; - txtStockNum.TextChanged -= txtAddPrice_TextChanged; - txtShippingPriceTimes.TextChanged -= txtAddPrice_TextChanged; - chkAddMorePriceFirst.CheckedChanged -= chkAddMorePriceFirst_CheckedChanged; - chkStepAddPrice.CheckedChanged -= chkStepAddPrice_CheckedChanged; + txtAddTimes.TextChanged -= txtAddPrice_TextChanged; + txtAddMorePrice.TextChanged -= txtAddPrice_TextChanged; + txtSinglePriceAdd.TextChanged -= txtAddPrice_TextChanged; + txtStockNum.TextChanged -= txtAddPrice_TextChanged; + txtShippingPriceTimes.TextChanged -= txtAddPrice_TextChanged; + chkAddMorePriceFirst.CheckedChanged -= chkAddMorePriceFirst_CheckedChanged; + chkStepAddPrice.CheckedChanged -= chkStepAddPrice_CheckedChanged; - this.txtAddTimes.Text = defaultAddPriceRule.AddPriceTimes.ToString(); - this.txtAddMorePrice.Text = defaultAddPriceRule.AddMorePrice.ToString(); - this.txtSinglePriceAdd.Text = defaultAddPriceRule.SinglePriceAdd.ToString(); - this.txtStockNum.Text = defaultAddPriceRule.StockNum.ToString(); - this.txtShippingPriceTimes.Text = defaultAddPriceRule.ShippingPriceTimes.ToString(); - this.chkAddMorePriceFirst.Checked = defaultAddPriceRule.AddMorePriceFirst; - this.chkStepAddPrice.Checked = defaultAddPriceRule.IsStepAddPrice; + this.txtAddTimes.Text = defaultAddPriceRule.AddPriceTimes.ToString(); + this.txtAddMorePrice.Text = defaultAddPriceRule.AddMorePrice.ToString(); + this.txtSinglePriceAdd.Text = defaultAddPriceRule.SinglePriceAdd.ToString(); + this.txtStockNum.Text = defaultAddPriceRule.StockNum.ToString(); + this.txtShippingPriceTimes.Text = defaultAddPriceRule.ShippingPriceTimes.ToString(); + this.chkAddMorePriceFirst.Checked = defaultAddPriceRule.AddMorePriceFirst; + this.chkStepAddPrice.Checked = defaultAddPriceRule.IsStepAddPrice; - txtAddTimes.TextChanged += txtAddPrice_TextChanged; - txtAddMorePrice.TextChanged += txtAddPrice_TextChanged; - txtSinglePriceAdd.TextChanged += txtAddPrice_TextChanged; - txtStockNum.TextChanged += txtAddPrice_TextChanged; - txtShippingPriceTimes.TextChanged += txtAddPrice_TextChanged; - chkAddMorePriceFirst.CheckedChanged += chkAddMorePriceFirst_CheckedChanged; - chkStepAddPrice.CheckedChanged += chkStepAddPrice_CheckedChanged; + txtAddTimes.TextChanged += txtAddPrice_TextChanged; + txtAddMorePrice.TextChanged += txtAddPrice_TextChanged; + txtSinglePriceAdd.TextChanged += txtAddPrice_TextChanged; + txtStockNum.TextChanged += txtAddPrice_TextChanged; + txtShippingPriceTimes.TextChanged += txtAddPrice_TextChanged; + chkAddMorePriceFirst.CheckedChanged += chkAddMorePriceFirst_CheckedChanged; + chkStepAddPrice.CheckedChanged += chkStepAddPrice_CheckedChanged; - wxUploadRule = NaiBa.Util.Helper.ConfigHelper.LoadConfig("wx_upload_rule"); - if (wxUploadRule == null) - wxUploadRule = new WXUploadRule(); - var filteWords = wxUploadRule.FilterWords.Split(new string[] { ",", ",", " ", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); - filteWords.RemoveAll(w => forceFilteKeyWords.Contains(w)); - filteWords.AddRange(forceFilteKeyWords); - wxUploadRule.FilterWords = string.Join(",", filteWords); - this.txtPreDays.TextChanged -= txtPreDays_TextChanged; - this.txtReplaceText.TextChanged -= txtReplaceText_TextChanged; - this.txtMinPrice.TextChanged -= txtMinPrice_TextChanged; - this.txtMaxPrice.TextChanged -= txtMaxPrice_TextChanged; - this.txtWaitSeconds.TextChanged -= txtWaitSeconds_TextChanged; - this.chkHighestPriceSku.CheckedChanged -= chkHighestPriceSku_CheckedChanged; - this.chkLowestPriceSku.CheckedChanged -= chkLowestPriceSku_CheckedChanged; - this.chkSameSpecPriceUp.CheckedChanged -= chkSameSpecPriceUp_CheckedChanged; - this.chkSameSpecPriceDown.CheckedChanged -= chkSameSpecPriceDown_CheckedChanged; - this.chkSkipUploaded.CheckedChanged -= chkSkipUploaded_CheckedChanged; - this.chkUpDraft.CheckedChanged -= chkUpDraft_CheckedChanged; - this.chkPreSale.CheckedChanged -= chkPreSale_CheckedChanged; - this.txtTitleHeadWord.TextChanged -= txtTitleHeadWord_TextChanged; - this.chkAiShortTitle.CheckedChanged -= chkAiShotTitle_CheckedChanged; - this.chkUseWXComplateProd.CheckedChanged -= chkUseWXComplateProd_CheckedChanged; - this.chkSaveBound.CheckedChanged -= chkSaveBound_CheckedChanged; - this.txtFilterBoundMin.TextChanged -= txtFilterBoundMin_TextChanged; - this.txtFilterBoundMax.TextChanged -= txtFilterBoundMax_TextChanged; + wxUploadRule = NaiBa.Util.Helper.ConfigHelper.LoadConfig("wx_upload_rule"); + if (wxUploadRule == null) + wxUploadRule = new WXUploadRule(); + var filteWords = wxUploadRule.FilterWords.Split(new string[] { ",", ",", " ", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); + filteWords.RemoveAll(w => forceFilteKeyWords.Contains(w)); + filteWords.AddRange(forceFilteKeyWords); + wxUploadRule.FilterWords = string.Join(",", filteWords); + this.txtPreDays.TextChanged -= txtPreDays_TextChanged; + this.txtReplaceText.TextChanged -= txtReplaceText_TextChanged; + this.txtMinPrice.TextChanged -= txtMinPrice_TextChanged; + this.txtMaxPrice.TextChanged -= txtMaxPrice_TextChanged; + this.txtWaitSeconds.TextChanged -= txtWaitSeconds_TextChanged; + this.chkHighestPriceSku.CheckedChanged -= chkHighestPriceSku_CheckedChanged; + this.chkLowestPriceSku.CheckedChanged -= chkLowestPriceSku_CheckedChanged; + this.chkSameSpecPriceUp.CheckedChanged -= chkSameSpecPriceUp_CheckedChanged; + this.chkSameSpecPriceDown.CheckedChanged -= chkSameSpecPriceDown_CheckedChanged; + this.chkSkipUploaded.CheckedChanged -= chkSkipUploaded_CheckedChanged; + this.chkUpDraft.CheckedChanged -= chkUpDraft_CheckedChanged; + this.chkPreSale.CheckedChanged -= chkPreSale_CheckedChanged; + this.txtTitleHeadWord.TextChanged -= txtTitleHeadWord_TextChanged; + this.chkAiShortTitle.CheckedChanged -= chkAiShotTitle_CheckedChanged; + this.chkUseWXComplateProd.CheckedChanged -= chkUseWXComplateProd_CheckedChanged; + this.chkSaveBound.CheckedChanged -= chkSaveBound_CheckedChanged; + this.txtFilterBoundMin.TextChanged -= txtFilterBoundMin_TextChanged; + this.txtFilterBoundMax.TextChanged -= txtFilterBoundMax_TextChanged; - this.txtPreDays.Text = wxUploadRule.PreSaleDays.ParseToString(); - this.txtReplaceText.Text = wxUploadRule.FilterWords.ParseToString(); - this.chkSkipReplaceText.Checked = wxUploadRule.IsSkipHasFilterWordsProd.ParseToBool(); - this.txtMinPrice.Text = wxUploadRule.SkuMinPrice.ParseToString(); - this.txtWaitSeconds.Text = wxUploadRule.WaitSeconds.ParseToString(); - this.chkHighestPriceSku.Checked = wxUploadRule.OnlyHighestPriceSku.ParseToBool(); - this.chkLowestPriceSku.Checked = wxUploadRule.OnlyLowestPriceSku.ParseToBool(); - this.chkSameSpecPriceUp.Checked = wxUploadRule.SameSpecSamePriceUp.ParseToBool(); - this.chkSameSpecPriceDown.Checked = wxUploadRule.SameSpecSamePriceDown.ParseToBool(); - this.chkSkipUploaded.Checked = wxUploadRule.SkipUploaded.ParseToBool(); - this.chkUpDraft.Checked = wxUploadRule.UpDraft.ParseToBool(); - this.chkPreSale.Checked = wxUploadRule.IsPreSale.ParseToBool(); - this.txtTitleHeadWord.Text = wxUploadRule.TitleHeadWords.ParseToString(); - this.chkAiShortTitle.Checked = wxUploadRule.IsAiShortTitle; - this.chkUseShanghaiReturnOrderAddress.Checked = wxUploadRule.IsUseShanghaiReturnOrderAddress; - this.chkUseWXComplateProd.Checked = wxUploadRule.IsUseWXComplateProd; - this.chkSaveBound.Checked = wxUploadRule.IsSaveBound; - if (wxUploadRule.IsSaveBound) - { - this.txtFilterBoundMin.Text = wxUploadRule.FilterBoundMinSave.ParseToString(); - this.txtFilterBoundMax.Text = wxUploadRule.FilterBoundMaxSave.ParseToString(); - } + this.txtPreDays.Text = wxUploadRule.PreSaleDays.ParseToString(); + this.txtReplaceText.Text = wxUploadRule.FilterWords.ParseToString(); + this.chkSkipReplaceText.Checked = wxUploadRule.IsSkipHasFilterWordsProd.ParseToBool(); + this.txtMinPrice.Text = wxUploadRule.SkuMinPrice.ParseToString(); + this.txtWaitSeconds.Text = wxUploadRule.WaitSeconds.ParseToString(); + this.chkHighestPriceSku.Checked = wxUploadRule.OnlyHighestPriceSku.ParseToBool(); + this.chkLowestPriceSku.Checked = wxUploadRule.OnlyLowestPriceSku.ParseToBool(); + this.chkSameSpecPriceUp.Checked = wxUploadRule.SameSpecSamePriceUp.ParseToBool(); + this.chkSameSpecPriceDown.Checked = wxUploadRule.SameSpecSamePriceDown.ParseToBool(); + this.chkSkipUploaded.Checked = wxUploadRule.SkipUploaded.ParseToBool(); + this.chkUpDraft.Checked = wxUploadRule.UpDraft.ParseToBool(); + this.chkPreSale.Checked = wxUploadRule.IsPreSale.ParseToBool(); + this.txtTitleHeadWord.Text = wxUploadRule.TitleHeadWords.ParseToString(); + this.chkAiShortTitle.Checked = wxUploadRule.IsAiShortTitle; + this.chkUseShanghaiReturnOrderAddress.Checked = wxUploadRule.IsUseShanghaiReturnOrderAddress; + this.chkUseWXComplateProd.Checked = wxUploadRule.IsUseWXComplateProd; + this.chkSaveBound.Checked = wxUploadRule.IsSaveBound; + if (wxUploadRule.IsSaveBound) + { + this.txtFilterBoundMin.Text = wxUploadRule.FilterBoundMinSave.ParseToString(); + this.txtFilterBoundMax.Text = wxUploadRule.FilterBoundMaxSave.ParseToString(); + } - this.txtPreDays.TextChanged += txtPreDays_TextChanged; - this.txtReplaceText.TextChanged += txtReplaceText_TextChanged; - this.txtMinPrice.TextChanged += txtMinPrice_TextChanged; - this.txtWaitSeconds.TextChanged += txtWaitSeconds_TextChanged; - this.chkHighestPriceSku.CheckedChanged += chkHighestPriceSku_CheckedChanged; - this.chkLowestPriceSku.CheckedChanged += chkLowestPriceSku_CheckedChanged; - this.chkSameSpecPriceUp.CheckedChanged += chkSameSpecPriceUp_CheckedChanged; - this.chkSameSpecPriceDown.CheckedChanged += chkSameSpecPriceDown_CheckedChanged; - this.chkSkipUploaded.CheckedChanged += chkSkipUploaded_CheckedChanged; - this.chkUpDraft.CheckedChanged += chkUpDraft_CheckedChanged; - this.chkPreSale.CheckedChanged += chkPreSale_CheckedChanged; - this.txtTitleHeadWord.TextChanged += txtTitleHeadWord_TextChanged; - this.chkAiShortTitle.CheckedChanged += chkAiShotTitle_CheckedChanged; - this.chkUseWXComplateProd.CheckedChanged += chkUseWXComplateProd_CheckedChanged; - this.chkSaveBound.CheckedChanged += chkSaveBound_CheckedChanged; - this.txtFilterBoundMin.TextChanged += txtFilterBoundMin_TextChanged; - this.txtFilterBoundMax.TextChanged += txtFilterBoundMax_TextChanged; + this.txtPreDays.TextChanged += txtPreDays_TextChanged; + this.txtReplaceText.TextChanged += txtReplaceText_TextChanged; + this.txtMinPrice.TextChanged += txtMinPrice_TextChanged; + this.txtWaitSeconds.TextChanged += txtWaitSeconds_TextChanged; + this.chkHighestPriceSku.CheckedChanged += chkHighestPriceSku_CheckedChanged; + this.chkLowestPriceSku.CheckedChanged += chkLowestPriceSku_CheckedChanged; + this.chkSameSpecPriceUp.CheckedChanged += chkSameSpecPriceUp_CheckedChanged; + this.chkSameSpecPriceDown.CheckedChanged += chkSameSpecPriceDown_CheckedChanged; + this.chkSkipUploaded.CheckedChanged += chkSkipUploaded_CheckedChanged; + this.chkUpDraft.CheckedChanged += chkUpDraft_CheckedChanged; + this.chkPreSale.CheckedChanged += chkPreSale_CheckedChanged; + this.txtTitleHeadWord.TextChanged += txtTitleHeadWord_TextChanged; + this.chkAiShortTitle.CheckedChanged += chkAiShotTitle_CheckedChanged; + this.chkUseWXComplateProd.CheckedChanged += chkUseWXComplateProd_CheckedChanged; + this.chkSaveBound.CheckedChanged += chkSaveBound_CheckedChanged; + this.txtFilterBoundMin.TextChanged += txtFilterBoundMin_TextChanged; + this.txtFilterBoundMax.TextChanged += txtFilterBoundMax_TextChanged; - this.lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; + this.lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; - int prodCount = 0; - pbSelectProd.Visible = true; - Task.Run(() => - { - GetRandomProductList(out prodCount, 1, 1); - Invoke(new Action(() => - { - pbSelectProd.Visible = false; - lblGoodsCount.Text = "产品库 " + prodCount + " 件"; - })); - }); + int prodCount = 0; + pbSelectProd.Visible = true; + Task.Run(() => + { + GetRandomProductList(out prodCount, 1, 1); + Invoke(new Action(() => + { + pbSelectProd.Visible = false; + lblGoodsCount.Text = "产品库 " + prodCount + " 件"; + })); + }); - 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; + 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"); + this.dgvSelectProduct.AddSelectorColumn("colCheck"); - dgvSelectProduct.AddImgColumn("colProductSkcPic", "colImgUrl"); - dgvSelectProduct.AddImgColumn("colSkuFakeImg", "colSkuFakeImgUrl"); + dgvSelectProduct.AddImgColumn("colProductSkcPic", "colImgUrl"); + dgvSelectProduct.AddImgColumn("colSkuFakeImg", "colSkuFakeImgUrl"); - dgvSelectProduct.Columns["colSkuFakeImg"].Visible = false; + dgvSelectProduct.Columns["colSkuFakeImg"].Visible = false; - upload_draft_product_lst = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_select_upload_draft_products"); - if (upload_draft_product_lst == null) - upload_draft_product_lst = new ConcurrentList(); - Task.Run(() => - { - foreach (var selectProd in upload_draft_product_lst.Reverse().ToList()) - { - int maxRowCount = 10000; - if (dgvSelectProduct.Rows.Count >= maxRowCount) - { - break; - } - if (dgvSelectProduct.Rows.Count % 100 == 0) - Thread.Sleep(1); - Invoke(new Action(() => - { - int rowIndex = this.dgvSelectProduct.Rows.Add( - true, - selectProd.id, - selectProd.shop_id, - selectProd.shop_account, - "登录", - "进店", - BaseClass.SaLevel > 0 ? selectProd.spu_id : selectProd.spu_id.ParseToString().GetHashCode().ParseToString().Trim('-'), - selectProd.skc_id, - selectProd.main_img, - DataGridViewExtension.defaultBitmap, - "", - null, - selectProd.product_name, // 用户端显示商品原名 - selectProd.cat_name, - BaseClass.SaLevel > 0 ? selectProd.ext_code : selectProd.ext_code.ParseToString().GetHashCode().ParseToString().Trim('-'), - selectProd.status, - selectProd.draft_id, - selectProd.notes, - (selectProd.user_notes + " 编辑").Trim(), - "删除", - selectProd.add_time.ToString("yy-MM-dd HH:mm:ss"), - "" - ); + upload_draft_product_lst = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_select_upload_draft_products"); + if (upload_draft_product_lst == null) + upload_draft_product_lst = new ConcurrentList(); + Task.Run(() => + { + foreach (var selectProd in upload_draft_product_lst.Reverse().ToList()) + { + int maxRowCount = 10000; + if (dgvSelectProduct.Rows.Count >= maxRowCount) + { + break; + } + if (dgvSelectProduct.Rows.Count % 100 == 0) + Thread.Sleep(1); + Invoke(new Action(() => + { + int rowIndex = this.dgvSelectProduct.Rows.Add( + true, + selectProd.id, + selectProd.shop_id, + selectProd.shop_account, + "登录", + "进店", + BaseClass.SaLevel > 0 ? selectProd.spu_id : selectProd.spu_id.ParseToString().GetHashCode().ParseToString().Trim('-'), + selectProd.skc_id, + selectProd.main_img, + DataGridViewExtension.defaultBitmap, + "", + null, + selectProd.product_name, // 用户端显示商品原名 + selectProd.cat_name, + BaseClass.SaLevel > 0 ? selectProd.ext_code : selectProd.ext_code.ParseToString().GetHashCode().ParseToString().Trim('-'), + selectProd.status, + selectProd.draft_id, + selectProd.notes, + (selectProd.user_notes + " 编辑").Trim(), + "删除", + selectProd.add_time.ToString("yy-MM-dd HH:mm:ss"), + "" + ); - dgvSelectProduct.Rows[rowIndex].Height = 60; - })); - } - }); + dgvSelectProduct.Rows[rowIndex].Height = 60; + })); + } + }); - //#if DEBUG - if (BaseClass.SaLevel == 1) - { - //lblExtCodeFilter.Visible = true; - //txtExtCodeFilter.Visible = true; + //#if DEBUG + if (BaseClass.SaLevel == 1) + { + //lblExtCodeFilter.Visible = true; + //txtExtCodeFilter.Visible = true; - lblIdFilter.Visible = true; - txtIdFilter.Visible = true; - lblSourceType.Visible = true; - cmbSourceType.Visible = true; - lblGroupFilter.Visible = true; - cmbGroupFilter.Visible = true; - lblJstInitSet.Visible = true; - cmbJstInitSet.Visible = true; - lblHot.Visible = true; - cmbHot.Visible = true; - } + lblIdFilter.Visible = true; + txtIdFilter.Visible = true; + lblSourceType.Visible = true; + cmbSourceType.Visible = true; + lblGroupFilter.Visible = true; + cmbGroupFilter.Visible = true; + lblJstInitSet.Visible = true; + cmbJstInitSet.Visible = true; + lblHot.Visible = true; + cmbHot.Visible = true; + } - if (BaseClass.UserAuthority.ParseToString().Contains("货源选择")) - { - lblSourceType.Visible = true; - cmbSourceType.Visible = true; - //if (!string.IsNullOrWhiteSpace(cmbSourceType.Text)) - { - lblGroupFilter.Visible = true; - cmbGroupFilter.Visible = true; - } - } - if (BaseClass.UserAuthority.ParseToString().Contains("微信回采")) - { - chkWXComplateProd.Visible = true; - chkUseWXComplateProd.Visible = true; - } - if (BaseClass.UserAuthority.ParseToString().Contains("爆款数据")) - { - lblHot.Visible = true; - cmbHot.Visible = true; - chkFilterViewUv.Visible = true; - numFilterViewUv.Visible = true; - if (!string.IsNullOrWhiteSpace(cmbSourceType.Text)) - { - //lblGroupFilter.Visible = true; - //cmbGroupFilter.Visible = true; - } - } - if (BaseClass.UserAuthority.Contains("商品采集") || BaseClass.ParentAuthority.Contains("商品采集")) - { - if (BaseClass.UserAuthority.Contains("学员数据") || BaseClass.ParentAuthority.Contains("学员数据")) - { - cmbSourceType.Items.Insert(1, "--------"); - cmbSourceType.Items.Insert(1, "学员数据"); - } - cmbSourceType.Items.Insert(1, "--------"); - cmbSourceType.Items.Insert(1, "微信商品"); - cmbSourceType.Items.Insert(1, "1688商品"); - cmbSourceType.Items.Insert(1, "多多商品"); + if (BaseClass.UserAuthority.ParseToString().Contains("货源选择")) + { + lblSourceType.Visible = true; + cmbSourceType.Visible = true; + //if (!string.IsNullOrWhiteSpace(cmbSourceType.Text)) + { + lblGroupFilter.Visible = true; + cmbGroupFilter.Visible = true; + } + } + if (BaseClass.UserAuthority.ParseToString().Contains("微信回采")) + { + chkWXComplateProd.Visible = true; + chkUseWXComplateProd.Visible = true; + } + if (BaseClass.UserAuthority.ParseToString().Contains("爆款数据")) + { + lblHot.Visible = true; + cmbHot.Visible = true; + chkFilterViewUv.Visible = true; + numFilterViewUv.Visible = true; + if (!string.IsNullOrWhiteSpace(cmbSourceType.Text)) + { + //lblGroupFilter.Visible = true; + //cmbGroupFilter.Visible = true; + } + } + if (BaseClass.UserAuthority.Contains("商品采集") || BaseClass.ParentAuthority.Contains("商品采集")) + { + if (BaseClass.UserAuthority.Contains("学员数据") || BaseClass.ParentAuthority.Contains("学员数据")) + { + cmbSourceType.Items.Insert(1, "--------"); + cmbSourceType.Items.Insert(1, "学员数据"); + } + cmbSourceType.Items.Insert(1, "--------"); + cmbSourceType.Items.Insert(1, "微信商品"); + cmbSourceType.Items.Insert(1, "1688商品"); + cmbSourceType.Items.Insert(1, "多多商品"); - if (!BaseClass.UserAuthority.ParseToString().Contains("货源选择")) - { - this.lblSourceType.Visible = true; - this.cmbSourceType.Visible = true; - this.cmbSourceType.Items.Clear(); - cmbSourceType.Items.Add(""); - if (BaseClass.UserAuthority.Contains("学员数据") || BaseClass.ParentAuthority.Contains("学员数据")) - { - cmbSourceType.Items.Add("学员数据"); - cmbSourceType.Items.Add("--------"); - } - this.cmbSourceType.Items.Add("多多商品,1688商品,微信商品"); - this.cmbSourceType.Items.Add("多多商品"); - this.cmbSourceType.Items.Add("1688商品"); - this.cmbSourceType.Items.Add("微信商品"); - } + if (!BaseClass.UserAuthority.ParseToString().Contains("货源选择")) + { + this.lblSourceType.Visible = true; + this.cmbSourceType.Visible = true; + this.cmbSourceType.Items.Clear(); + cmbSourceType.Items.Add(""); + if (BaseClass.UserAuthority.Contains("学员数据") || BaseClass.ParentAuthority.Contains("学员数据")) + { + cmbSourceType.Items.Add("学员数据"); + cmbSourceType.Items.Add("--------"); + } + this.cmbSourceType.Items.Add("多多商品,1688商品,微信商品"); + this.cmbSourceType.Items.Add("多多商品"); + this.cmbSourceType.Items.Add("1688商品"); + this.cmbSourceType.Items.Add("微信商品"); + } - chkRandomFissionProduct.Visible = true; - txtRandomFissionProductCount.Visible = true; + chkRandomFissionProduct.Visible = true; + txtRandomFissionProductCount.Visible = true; - lblNotes.Visible = true; - cmbNotes.Visible = true; - Task.Run(() => - { - string addUserName = BaseClass.GroupId == 3 ? BaseClass.UserName : BaseClass.ParentUserName; - PDDDBProdListForm.GetPDDProductNotes(new List { cmbNotes }, addUserName); - }); - } - cmbHot_TextChanged(null, null); + lblNotes.Visible = true; + cmbNotes.Visible = true; + Task.Run(() => + { + string addUserName = BaseClass.GroupId == 3 ? BaseClass.UserName : BaseClass.ParentUserName; + PDDDBProdListForm.GetPDDProductNotes(new List { cmbNotes }, addUserName); + }); + } + cmbHot_TextChanged(null, null); - if (BaseClass.UserAuthority.Contains("裂变调试")) - { - chkRandomFissionProduct.Visible = true; - txtRandomFissionProductCount.Visible = true; - } - else - { - ucTabControlMetro1.TabPages.Remove(裂变调试); - } + if (BaseClass.UserAuthority.Contains("裂变调试")) + { + chkRandomFissionProduct.Visible = true; + txtRandomFissionProductCount.Visible = true; + } + else + { + ucTabControlMetro1.TabPages.Remove(裂变调试); + } - List ctrlLst = new List() - { - lblSourceType, cmbSourceType, lblGroupFilter, cmbGroupFilter, lblHot, cmbHot, lblIdFilter, txtIdFilter, - chkFilterViewUv, numFilterViewUv /*chkRandomFissionProduct, txtRandomFissionProductCount, lblNotes, cmbNotes*//*, lblJstInitSet, cmbJstInitSet*/ + List ctrlLst = new List() + { + lblSourceType, cmbSourceType, lblGroupFilter, cmbGroupFilter, lblHot, cmbHot, lblIdFilter, txtIdFilter, + chkFilterViewUv, numFilterViewUv /*chkRandomFissionProduct, txtRandomFissionProductCount, lblNotes, cmbNotes*//*, lblJstInitSet, cmbJstInitSet*/ }; - for (int i = 0; i < ctrlLst.Count - 2; i += 2) - { - if (ctrlLst[i].Visible == false) - { - for (int j = ctrlLst.Count - 2; j > i; j -= 2) - { - ctrlLst[j].Parent = ucGroupBoxEx4; - ctrlLst[j].Location = new Point(ctrlLst[j - 2].Location.X + ctrlLst[j - 2].Width - ctrlLst[j].Width, ctrlLst[j - 2].Location.Y); - if (ctrlLst[j] is CheckBox) // 额外减去一个像素 - ctrlLst[j].Location = new Point(ctrlLst[j].Location.X - 1, ctrlLst[j].Location.Y); - ctrlLst[j + 1].Location = new Point(ctrlLst[j].Location.X + ctrlLst[j].Width - 3, ctrlLst[j - 1].Location.Y); - ctrlLst[j + 1].Width = ctrlLst[j - 1].Width; - ctrlLst[j + 1].BringToFront(); - } - } - } - if (cmbNotes.Visible == false) - { - txtSearchGoodsName.Width = 229; - } - if (chkWXComplateProd.Visible == false) - { - chkRandomFissionProduct.Location = new Point(chkRandomFissionProduct.Location.X + 54, chkRandomFissionProduct.Location.Y); - txtRandomFissionProductCount.Location = new Point(txtRandomFissionProductCount.Location.X + 54, txtRandomFissionProductCount.Location.Y); - } - - IsFormLoad = true; - } - - private void btnRefreshAuthor_Click(object sender, EventArgs e) - { - updateAuthor(true); - } - - /// - /// 升级授权 - /// - /// 今日取过的也取 - private void updateAuthor(bool idRefreshTodayHasGet = false) - { - this.pbLoadingShop.Visible = true; - Task.Run(() => - { - // 店铺Id - var updateIds = dgvShop.Rows.Cast().Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); - var selectIds = dgvShop.Rows.Cast().Where(row - => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); - if (idRefreshTodayHasGet == true) - updateIds = selectIds; - - List tList = new List(); - if (idRefreshTodayHasGet) - GlobalConfig.lstWxShopAuthInfo.RemoveAll(s => updateIds.Contains(s.ShopId)); - foreach (var shop in GlobalConfig.ValidShopLoginList.Where(s => updateIds.Contains(s.ShopId))) - { - Invoke(new Action(() => { BindShop(shop, selectIds, ""); })); - var t = Task.Run(() => - { - try - { - if (shop.LoginStatus != "登录成功") - { - Invoke(new Action(() => { BindShop(shop, selectIds, "店铺掉线"); })); - return; - } - - var authInfo = GlobalConfig.lstWxShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shop.ShopId); - if (idRefreshTodayHasGet || authInfo == null || authInfo?.UpdateTime.Date != DateTime.Now.Date) - { - GlobalConfig.lstWxShopAuthInfo.RemoveAll(sa => sa.ShopId == shop.ShopId); - var rst = WXUpload.GetApiServiceList(shop); - if (!rst.Contains("\"code\":0")) - { - WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); - if (shop.LoginStatus != "登录成功") - { - Invoke(new Action(() => { BindShop(shop, selectIds, "店铺掉线"); })); - return; - } - - GlobalConfig.lstWxShopAuthInfo.Add(new AuthInfo() { ShopId = shop.ShopId, UpdateTime = DateTime.Now, ExpiresTime = DateTime.Now }); - Invoke(new Action(() => { BindShop(shop, selectIds, "授权查询失败"); })); - return; - } - - foreach (var itemObj in JsonHelper.JObjectParse(rst)["itemList"]) - { - // 找到了指定服务 - if (itemObj["serviceName"].ParseToString() == "店统领供应链-商品管理") - { - var expiresTick = itemObj["expireTime"].ParseToLong(); - var WxShopAuthInfo = new AuthInfo() { ShopId = shop.ShopId, UpdateTime = DateTime.Now, ExpiresTime = BaseClass.StampToDateTime(expiresTick.ParseToInt()) }; - if (WxShopAuthInfo.ExpiresTime > DateTime.Now) - { - GlobalConfig.lstWxShopAuthInfo.Add(WxShopAuthInfo); - Invoke(new Action(() => { BindShop(shop, selectIds, "已查询"); })); - return; - } - } - if (itemObj["serviceName"].ParseToString() == "东内部" || itemObj["serviceName"].ParseToString() == "29ERP") - { - var expiresTick = itemObj["expireTime"].ParseToLong(); - var WxShopAuthInfo = new AuthInfo() { ShopId = shop.ShopId, UpdateTime = DateTime.Now, ExpiresTime = BaseClass.StampToDateTime(expiresTick.ParseToInt()) }; - if (WxShopAuthInfo.ExpiresTime > DateTime.Now) - { - GlobalConfig.lstWxShopAuthInfo.Add(WxShopAuthInfo); - Invoke(new Action(() => { BindShop(shop, selectIds, "已查询"); })); - return; - } - } - } - // 没找到指定服务 - GlobalConfig.lstWxShopAuthInfo.Add(new AuthInfo() { ShopId = shop.ShopId, UpdateTime = DateTime.Now, ExpiresTime = DateTime.Now }); - Invoke(new Action(() => { BindShop(shop, selectIds, "已查询"); })); - } - } - catch (Exception ex) - { - } - }); - tList.Add(t); - while (tList.Where(ta => !ta.IsFaulted && !ta.IsCompleted).Count() >= 20) { Thread.Sleep(100); } - } - while (tList.Where(ta => !ta.IsFaulted && !ta.IsCompleted).Count() >= 1) { Thread.Sleep(100); } - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_shop_auth_list", GlobalConfig.lstWxShopAuthInfo); - Invoke(new Action(() => { pbLoadingShop.Visible = false; })); - }); - } - - 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.ValidShopLoginList.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; - RefreshDbProdGroupAndCate(); - RefreshShopLogin(); - } - - private void UserSelectDbProductForm_VisibleChanged(object sender, EventArgs e) - { - if (Visible == true) - { - RefreshShopLogin(); - updateAuthor(); - RefreshDbProdGroupAndCate(); - - if (!isInit) - { - Task.Run(() => - { - foreach (var shop in GlobalConfig.ValidShopLoginList) - { - //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 RefreshDbProdGroupAndCate() - { - Task.Run(() => - { - // 同时刷新下商品分组 - //string addUserName = BaseClass.UserAuthority.Contains("商品采集") ? ("admin," + BaseClass.UserName) : "admin"; - //if (BaseClass.GroupId != 3) - // addUserName = BaseClass.ParentAuthority.Contains("商品采集") ? ("admin," + BaseClass.ParentUserName) : "admin"; - //PDDDBProdListForm.GetPDDProductGroup(cmbGroupFilter, sourceType, "", addUserName); // 同时刷新下商品分组 - PDDDBProdListForm.GetPDDProductGroup(new List { cmbGroupFilter, }, "", "", "admin"); - if (BaseClass.UserAuthority.Contains("商品采集") || BaseClass.ParentAuthority.Contains("商品采集")) - { - Invoke(new Action(() => - { - //cmbGroupFilter.Items.Remove("用户" + mainUserName); - cmbGroupFilter.Items.Remove("--------"); - cmbGroupFilter.Items.Remove("我的商品"); - cmbGroupFilter.Items.Insert(0, "--------"); - cmbGroupFilter.Items.Insert(0, "我的商品"); - })); - } - GetPddProductCate(); - Invoke(new Action(() => - { - this.btnSwitchCatType.Text = "P"; - btnSwitchCatType_Click(null, null); - pbLoadingShop.Visible = false; - })); - }); - } - - /// - /// 获取商品所有类目 - /// - void GetPddProductCate() - { - var pddMainCats = GlobalConfig.PddCatList.Where(c => c.level == 1); - var mainCatsText = string.Join(",", pddMainCats.Select(c => c.cat_name)) + "," + string.Join(",", pddMainCats.Select(c => c.cat_id)); - - - - var url = BaseClass.BuildObjString("product/get_pdd_product_cates"); - var data = UserLogin.GetSignaturex(); - var 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")) - { - BaseMsgForm.ShowError("商品类目获取失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg")); - } - else - { - pdd_product_cates = BaseRegex.GetStringJson(ref html, "data"); - } - - //Invoke(new Action(() => - //{ - // if (cmbSourceType.Text.Trim() != "厂商直采" && cmbSourceType.Text.Trim() != "微信店采" && cmbSourceType.Text.Trim() != "微信小店") - // { - // fillPddCate(); - // } - // else - // { - // fillWxCate(); - // } - //})); - } - - void fillPddCate() - { - cmbCateFilter1.Items.Clear(); - cmbCateFilter2.Items.Clear(); - cmbCateFilter3.Items.Clear(); - cmbCateFilter1.Text = ""; - cmbCateFilter2.Text = ""; - cmbCateFilter3.Text = ""; - foreach (var item in pdd_product_cates.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)) - { - cmbCateFilter1.Items.Add(item); - } - cmbCateFilter1.Items.Add(""); - } - - void fillWxCate() - { - cmbCateFilter1.Items.Clear(); - cmbCateFilter2.Items.Clear(); - cmbCateFilter3.Items.Clear(); - cmbCateFilter1.Text = ""; - cmbCateFilter2.Text = ""; - cmbCateFilter3.Text = ""; - foreach (var cate in GlobalConfig.WxCatList.Where(c => c.level == 1).ToList()) - { - cmbCateFilter1.Items.Add(cate.name); - } - } - - 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.ValidShopLoginList.Any(s => s.ShopId == row.Cells["colShopId"]?.Value?.ToString())).ToList(); - // 更新被删除的店铺列表 - foreach (var row in dgvRowList) - { - dgvShop.Rows.Remove(row); - } - // 绑定其他店铺(含新导入的店铺) - foreach (ShopLoginInfo shopEntity in GlobalConfig.ValidShopLoginList) - { - if (!string.IsNullOrEmpty(shopEntity.ShopId)) - BindShop(shopEntity, selectIds); - } - cmbFilterShopNotes.Items.Clear(); - foreach (var note in GlobalConfig.ValidShopLoginList.Select(s => s.Notes).Where(s => !s.IsNullOrEmpty()).Distinct()) - { - cmbFilterShopNotes.Items.Add(note); - } - cmbFilterShopGroup.Items.Clear(); - foreach (var note in GlobalConfig.ValidShopLoginList.Select(s => s.GroupName).Where(s => !s.IsNullOrEmpty()).Distinct()) - { - cmbFilterShopGroup.Items.Add(note); - } - } - - 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["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; - var row = dgvShop.Rows[e.RowIndex]; - 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.ValidShopLoginList.FirstOrDefault(s => s.ShopId == shopId.ToString()); - if (shop == null) - { - BaseMsgForm.ShowError("店铺不存在或已过期"); - return; - } - 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.InitUrl = "https://store.weixin.qq.com/shop/servicemarket/detail?serviceId=4431685489938137094"; - 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; - var row = dgvShop.Rows[e.RowIndex]; - var headerText = dgvSelectProduct.Columns[e.ColumnIndex].HeaderText; - var dbId = dgvSelectProduct.Rows[e.RowIndex].Cells["colSelectId"].Value.ParseToString(); - var dbProduct = lstTemuDBProductSelect.FirstOrDefault(p => p.id.ToString() == dbId); - var shopId = dgvSelectProduct.Rows[e.RowIndex].Cells["colSupplierId"].Value.ParseToString(); - var draftId = dgvSelectProduct.Rows[e.RowIndex].Cells["colDraftId"].Value.ParseToString(); - var shop = GlobalConfig.ValidShopLoginList.FirstOrDefault(s => s.ShopId == shopId); - if (shop == null && !string.IsNullOrEmpty(headerText)) - { - BaseMsgForm.ShowError("店铺不存在或已过期"); - return; - } - 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); - //shopLoginForm.prodUserSelectForm = this; - shopLoginForm.openType = EnumOpenType.manage; - shopLoginForm.WindowState = FormWindowState.Maximized; - shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/home"; - shopLoginForm.Show(); - } - break; - case "上传商品Id": - //if (!string.IsNullOrEmpty(draftId) && shop != null) - //{ - // ShopLoginForm shopLoginForm = new ShopLoginForm(shop); - // shopLoginForm.InitUrl = "https://seller.kuajingmaihuo.com/goods/product-create/product-edit?productDraftId=" + - // draftId + "&from=productDraftList"; - // shopLoginForm.openType = EnumOpenType.manage; - // shopLoginForm.WindowState = FormWindowState.Maximized; - // shopLoginForm.ShowDialog(); - //} - 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; - } - } - - private void btnUpload_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; - } - - if (lstTemuDBProductSelect.Count() > 0) - { - if (WXShopLoginForm.shopLoginInstance != null && WXShopLoginForm.shopLoginInstance.IsDisposed != true) - WXShopLoginForm.shopLoginInstance.Dispose(); - - this.btnUpload.Enabled = false; - cancellationTokenSource = new CancellationTokenSource(); - Task.Run(() => - { - if (GlobalConfig.GlobalSettings.IsWxUseSoftwareDefaultAddress == true && !IsWxNotUseSoftwareDefaultAddressOnce && - lstTemuDBProductSelect.Any(p => p.product_get_type_text != "厂商直采" && p.product_get_type_text != "1688厂家")) - { - if (shopIdLst.Any(a => !GlobalConfig.WXShopDefaultAddressList.Any(aa => aa.shop_id == a))) - WXShopDefaultAddressListForm.GetShopDefaultAddress(); - var addressLst = GlobalConfig.WXShopDefaultAddressList.Where(s => shopIdLst.Contains(s.shop_id)).ToList(); - foreach (var add in addressLst) - { - if (!add.isFullAddress) - { - string msg = "未设置店铺售后地址!\r\n" + - "\r\n部分商品无默认售后地址信息,需要设置店铺售后地址,"; - if (BaseClass.GroupId == 3) - msg += "\r\n将自动跳转 店铺管理-店铺地址管理 界面设置,"; - else - msg += "\r\n请使用主账号进行设置,"; - msg += "\r\n或者点击 取消 按钮,本次使用店铺后台默认地址。\r\n" + - "\r\n可在系统设置选项卡更改配置永久使用店铺后台地址。\r\n\r\n"; - var rst = BaseMsgForm.ShowConfirm(msg, "注意", FormLevel.LARGE, true); - if (rst.DialogResult == DialogResult.OK) - { - if (BaseClass.GroupId == 3) - Invoke(new Action(() => - { - btnUpload.Enabled = true; - MainForm.instance.pnlShop_Click(MainForm.instance.pnlShop, null); - WXShopForm.instance.ClickShopAddress(); - })); - return; - } - else - { - IsWxNotUseSoftwareDefaultAddressOnce = true; - break; - } - } - } - } - - AddProductArr(shopIdLst); - Invoke(new Action(() => - { - this.btnUpload.Enabled = true; - })); - }, cancellationTokenSource.Token); - } - else - { - BaseMsgForm.ShowError("请选择要上传的商品!"); - } - } - - void AddProductArr(List shopIdLst) - { - Invoke(new Action(() => - { - this.pbLoading.Visible = true; - this.statusBar.lblTaskStatus.Text = "正在上传" + "...".Substring(0, DateTime.Now.Second % 4); - this.statusBar.pgbTaskProgress.Maximum = lstTemuDBProductSelect.Count; - this.statusBar.UpdateProgressBar(0); - })); - - // 随机厂商商品 - var url = BaseClass.BuildObjString("product/get_random_company_product_config"); - var data = UserLogin.GetSignaturex(); - var html = GetHtml.PostUtf8(url, data); - if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) - html = GetHtml.PostUtf8(url, data); - chkRandomCompanyProd.Checked = BaseRegex.GetStringJson(ref html, "is_on") == "1"; - int randomComProdInterval = Math.Max(1, BaseRegex.GetIntJson(ref html, "product_interval")); - string randomComProdGroup = BaseRegex.GetStringJson(ref html, "product_group"); - int waitCompanyProdCnt = 0; - ConcurrentList CompanyProdLst = new ConcurrentList(); - - ConcurrentList currentShopList = new ConcurrentList(); - while (lstTemuDBProductSelect.Count > 0) - { - if (cancellationTokenSource.IsCancellationRequested) - break; - - shopIdLst = dgvShop.Rows.Cast().Where(row => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); - if (shopIdLst.Count <= 0) - { - Invoke(new Action(() => - { - this.statusBar.lblTaskStatus.Text = "请至少勾选一个店铺"; - })); - Thread.Sleep(500); - continue; - } - var randomShopLst = new ConcurrentList(); - randomShopLst.AddRange(GlobalConfig.ValidShopLoginList.Where(s => shopIdLst.Contains(s.ShopId) && s.LoginStatus == "登录成功")); - if (randomShopLst.Count <= 0) - { - Invoke(new Action(() => - { - this.statusBar.lblTaskStatus.Text = "所有店铺都已掉线,请登录店铺"; - })); - Thread.Sleep(500); - continue; - } - if (currentShopList.Count >= 20) // 最多20店同传 - { - Thread.Sleep(500); - continue; - } - - var randomShop = randomShopLst.Where(s => !currentShopList.Contains(s)).ToList().OrderBy(x => Randomx.GetId(999999)).FirstOrDefault(); - if (randomShop == null) - { - Thread.Sleep(500); - continue; - } - currentShopList.Add(randomShop); - - if (cancellationTokenSource.IsCancellationRequested) - break; - - // 每次挑选列表第一件商品 - var selectProd = lstTemuDBProductSelect.FirstOrDefault(); - selectProd.shop_id = randomShop.ShopId; - selectProd.shop_account = randomShop.ShopAccount; - - // 每若干个个商品插一件黄总商品包或其他组商品 - waitCompanyProdCnt++; - if (chkRandomCompanyProd.Checked && waitCompanyProdCnt > randomComProdInterval) - { - waitCompanyProdCnt = 0; - if (CompanyProdLst.Count == 0) - { - int dbCompanyProdCount; - var dbComProdLst = GetRandomCompanyProductList(out dbCompanyProdCount, randomComProdGroup); - foreach (var comProd in dbComProdLst) - { - var comSelectProd = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(comProd)); - comSelectProd.out_product_Id = comProd.id.ToString(); - comSelectProd.id = 1; - if (CompanyProdLst.Count > 0) - comSelectProd.id = CompanyProdLst.Max(p => p.id).ParseToInt() + 1; - CompanyProdLst.Add(comSelectProd); - } - } - selectProd = CompanyProdLst.FirstOrDefault(); - selectProd.shop_id = randomShop.ShopId; - selectProd.shop_account = randomShop.ShopAccount; - CompanyProdLst.Remove(selectProd); - } - else - { - lstTemuDBProductSelect.Remove(selectProd); - } - - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); - Invoke(new Action(() => - { - lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; - })); - - Invoke(new Action(() => - { - this.statusBar.lblTaskStatus.Text = "正在上传" + "...".Substring(0, DateTime.Now.Second % 4); - this.statusBar.pgbTaskProgress.Maximum = lstTemuDBProductSelect.Count + this.statusBar.pgbTaskProgress.Value + 1; - this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1); - })); - - if (selectProd == null) - { - Invoke(new Action(() => - { - BaseMsgForm.ShowError("商品为空,将为您跳过该商品!"); - })); - currentShopList.Remove(randomShop); - continue; - } - - // 过滤标题 - var lstTitleReplaceText = new List(); - if (!txtReplaceText.Text.Trim().IsNullOrEmpty()) - lstTitleReplaceText.AddRange(txtReplaceText.Text.Trim().Split(new string[] { ",", ",", " ", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries)); - // 过滤标题内指定词语 - foreach (var txt in lstTitleReplaceText) - { - selectProd.product_name = selectProd.product_name.Replace(txt, ""); - } - - Invoke(new Action(() => - { - int rowIndex = 0; - this.dgvSelectProduct.Rows.Insert(rowIndex, - true, - selectProd.id, - selectProd.shop_id, - selectProd.shop_account, - "登录", - "进店", - BaseClass.SaLevel > 0 ? selectProd.spu_id : selectProd.spu_id.ParseToString().GetHashCode().ParseToString().Trim('-'), - selectProd.skc_id, - selectProd.main_img, - DataGridViewExtension.defaultBitmap, - "", - null, - selectProd.product_name, // 用户端显示商品原名 - selectProd.cat_name, - BaseClass.SaLevel > 0 ? selectProd.ext_code : selectProd.ext_code.ParseToString().GetHashCode().ParseToString().Trim('-'), - selectProd.status, - selectProd.draft_id, - selectProd.notes, - (selectProd.user_notes + " 编辑").Trim(), - "删除", - "", - ""); - - dgvSelectProduct.Rows[rowIndex].Height = 60; - - int maxRowCount = 10000; - while (dgvSelectProduct.Rows.Count > maxRowCount) - { - dgvSelectProduct.Rows.RemoveAt(maxRowCount); - } - })); - - Invoke(new Action(() => - { - this.pbLoading.Visible = false; - })); - - Task.Run(() => - { - DateTime startTime = DateTime.Now; - for (int j = 0; j < 1; j++) - { - var shop = GlobalConfig.ValidShopLoginList.FirstOrDefault(s => s.ShopId == selectProd.shop_id); - if (shop == null) - continue; - - var row = dgvSelectProduct.Rows.Cast().FirstOrDefault(r => - r.Cells["colSelectId"]?.Value.ToString() == selectProd.id.ToString()); - double duration = 0; - if (row == null) - { - Invoke(new Action(() => - { - BaseMsgForm.ShowError("商品已被清除,将为您跳过该商品!"); - })); - continue; - } - - KJDDBProduct kjdDbProd = selectProd.kjdDbProduct; - string errStr = ""; - if (kjdDbProd == null) - kjdDbProd = GetProductDetail(selectProd.out_product_Id.ToString(), out errStr, true, true); - if (kjdDbProd == null || kjdDbProd.id == 0) - { - if (kjdDbProd?.id == 0) - { - selectProd.status = "已清除"; - } - - Invoke(new Action(() => - { - if (row.Index >= 0) - { - row.Cells["colOpResult"].Value = "选品数据库商品已被清除"; - if (kjdDbProd?.id == 0) - row.Cells["colStatus"].Value = "已清除"; - } - })); - continue; - } - - var result = ""; - try - { - WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); - if (shop.LoginStatus != "登录成功") - { - Invoke(new Action(() => - { - if (row.Index >= 0) - { - row.Cells["colOpResult"].Value = "店铺掉线"; - } - })); - continue; - } - - if (cancellationTokenSource.IsCancellationRequested) - break; - - //将商品上传 - KJDDBProduct kjdDbProdTmp = null; - try - { - kjdDbProdTmp = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(kjdDbProd)); - } - catch (Exception ex) - { - result = "{\"success\":false,\"status\":\"未上传\",\"errMsg\":\"商品初始化失败:" + ex.Message + "\"}"; - goto endUploadProduct; - } - - result = UploadProduct(shop, kjdDbProdTmp, selectProd, row.Cells["colOpResult"], startTime); - if (result.Contains("今日提审次数已用尽,请明日再试") || result.Contains("如需上架请先缴纳足额保证金") || result.Contains("在架商品数已达到上限") || - result.Contains("提审次数已达上限") || result.Contains("拥金上货失败:需要开通优选联盟") || result.Contains("本店铺近期提审失败比例较高,已被限")) - { - shop.upLimitRetryCount++; - if (shop.upLimitRetryCount >= 3) - { - shop.upLimitRetryCount = 0; - - var shopRow = dgvShop.Rows.Cast().FirstOrDefault(r => r.Cells["colShopId"].Value.ParseToString() == shop.ShopId); - if (shopRow != null) - Invoke(new Action(() => { shopRow.Cells["colSelect"].Value = false; })); - } - } - else - { - shop.upLimitRetryCount = Math.Max(0, shop.upLimitRetryCount - 1); - } - // 图片重复的,修改图片缓存为空再传一次 - 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); - } - - if (!result.Contains("success")) - { - WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); - } - endUploadProduct:; - } - catch (Exception ex) - { - result = "{\"success\":false,\"status\":\"未上传\",\"errMsg\":\"内部错误:" + ex.Message + " " + ex.InnerException?.Message + "\"}"; - } - 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(); })); - if (waitTime > 0) - Thread.Sleep(Randomx.GetId(waitTime * 1000, (waitTime + 2) * 1000)); - - selectProd.status = BaseRegex.GetStringJson(ref result, "status"); - if (string.IsNullOrWhiteSpace(selectProd.status)) - selectProd.status = "待上传"; - var productDraftId = BaseRegex.GetStringJson(ref result, "draftId"); - - var timeSpan = DateTime.Now - startTime; - duration = timeSpan.TotalSeconds; - // 至少3秒才完成一件商品 - while (duration < 3) - { - Thread.Sleep(1000); - timeSpan = DateTime.Now - startTime; - duration = timeSpan.TotalSeconds; - } - - var error = BaseRegex.GetStringJson(ref result, "errMsg"); - error = GetHtml.UrlDecode(error); - // 上传失败 - if (!result.Contains("\"success\":true") && !result.Contains("上传成功")) - { - if (string.IsNullOrWhiteSpace(error)) - error = result; - Invoke(new Action(() => - { - if (row.Index >= 0) - { - row.Cells["colDraftId"].Value = productDraftId; // 草稿箱id - row.Cells["colOpResult"].Value = error + " " + duration.ParseToInt() + "秒"; - } - })); - } - // 上传成功/上传到草稿箱 - else - { - Invoke(new Action(() => - { - if (row.Index >= 0) - { - row.Cells["colDraftId"].Value = productDraftId; // 草稿箱id - row.Cells["colAddTime"].Value = DateTime.Now.ToString("yy-MM-dd HH:mm:ss"); - row.Cells["colOpResult"].Value = (selectProd.status == "已上传" ? "已成功上传" : "已上传 注意:") + (" " + error).TrimEnd(' ') + " " + duration.ParseToInt() + "秒"; - row.Cells["colMsg"].Value = selectProd.status; - } - })); - } - } - - currentShopList.Remove(randomShop); - }); - } - - for (int i = 0; i < 300 && currentShopList.Count > 0; i++) - { - Thread.Sleep(1000); - if (cancellationTokenSource.IsCancellationRequested) - break; - } - Invoke(new Action(() => - { - if (cancellationTokenSource.IsCancellationRequested) - BaseMsgForm.ShowInfo("上传停止!"); - else - BaseMsgForm.ShowInfo("上传完成!"); - })); - - Invoke(new Action(() => - { - this.pbLoading.Visible = false; - if (cancellationTokenSource.IsCancellationRequested) - this.statusBar.lblTaskStatus.Text = "上传停止"; - else - this.statusBar.lblTaskStatus.Text = "上传完成"; - //this.statusBar.UpdateProgressBar(lstTemuDBProductSelect.Count); - })); - } - - /// - /// - /// - /// - /// - /// 校验违规商品 - /// 校验微信禁售商品 - /// - public static KJDDBProduct GetProductDetail(string prodDbId, out string errMsg, bool noViolationProduct = false, bool noBanWx = false) - { - errMsg = ""; - - if (string.IsNullOrEmpty(prodDbId)) - { - errMsg = "产品编号为空"; - return new KJDDBProduct(); - } - - List list = new List(); - - var url = BaseClass.BuildObjString("product/get_pdd_product_detail_list"); - var data = UserLogin.GetSignaturex() + "&search_db_ids=" + prodDbId; - if (noViolationProduct) - data += "&wx_safe_status=安全商品,未校验"; - if (noBanWx) - data += "&ban_wx=0"; - if (BaseClass.SaLevel > 0 || BaseClass.UserAuthority.Contains("爆款数据") || BaseClass.UserAuthority.Contains("学员数据") || BaseClass.ParentAuthority.Contains("学员数据")) - data += "&special_prod_type=普通商品,爆款数据"; - - var 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")) - html = GetHtml.PostUtf8(url, data); - if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) - { - return null; - } - - var jArr = JObject.Parse(html)["data"]; - if (jArr.Count() == 0) - return null; - var sProd = JsonHelper.SerializeObject(jArr); - - try - { - list = JsonHelper.DeserializeJsonToList(sProd); - var item = list.FirstOrDefault(); - if (item == null) - item = new KJDDBProduct(); - return item; - } - catch (Exception ex) - { - return null; - } - } - - public static WXGetEditProductInfoLite GetProductWXComplate(string secret_spu_id, out string errMsg) - { - errMsg = ""; - - if (string.IsNullOrEmpty(secret_spu_id)) - { - errMsg = "产品编码为空"; - return null; - } - - List list = new List(); - - var url = BaseClass.BuildObjString("product/get_pdd_prod_wx_complate_list"); - var data = UserLogin.GetSignaturex() + "&search_secret_spu_ids=" + secret_spu_id; - - var 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")) - html = GetHtml.PostUtf8(url, data); - if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) - { - errMsg = BaseRegex.GetStringJson(ref html, "msg"); - if (errMsg.IsNullOrEmpty()) - errMsg = html; - errMsg = "取回采数据失败 " + errMsg; - return null; - } - - var jArr = JObject.Parse(html)["data"]; - if (jArr.Count() == 0) - { - errMsg = "产品不存在"; - return null; - } - var sProd = JsonHelper.SerializeObject(jArr); - - try - { - var item = jArr.FirstOrDefault()["wx_edit_prod_json"]; - if (item == null) - return null; - - var editProd = JsonHelper.DeserializeJsonToObject(((JValue)item).Value.ParseToString()); - return editProd; - } - catch (Exception ex) - { - errMsg = "回采数据转换失败 " + ex.Message; - return null; - } - } - - string UploadProduct(ShopLoginInfo shop, KJDDBProduct dbProd, TemuDBProductSelect selectProd, DataGridViewCell cell, DateTime startTime) - { - Thread.Sleep(Randomx.GetId(100, 300)); - if (shop == null || string.IsNullOrEmpty(shop.ShopId) || shop.LoginStatus != "登录成功") - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"店铺为空或未登录!\"}"; - } - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在初始化上传"; - })); - } - - #region 裂变标题 - if (BaseClass.UserAuthority.Contains("裂变调试") && chkFissionGoodsName.Checked) - { - bool isFinish = false; - Invoke(new Action(() => - { - var titles = txtFissionTitle.Text.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); - if (titles.Count == 0) - { - cancellationTokenSource.Cancel(); - if (cell != null) - cell.Value = "裂变标题数量不足,将暂停上传"; - BaseMsgForm.ShowError("裂变标题数量不足,将暂停上传"); - isFinish = true; - } - selectProd.product_name = titles[0]; - selectProd.is_fission_title = true; - titles.RemoveAt(0); - txtFissionTitle.Text = string.Join("\r\n", titles); - cell.Value = "标题裂变成功,更改为:" + selectProd.product_name; - })); - if (isFinish) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"裂变标题数量不足,将暂停上传\"}"; - } - } - #endregion - - #region 跳过已上传商品,默认按商品货号,裂变商品按标题。 - if (chkSkipUploaded.Checked) - { - // 裂变按标题名称 - if (selectProd.is_fission_title) - { - var searchRst = WXUpload.searchProductWithTitle(shop, GetHtml.UrlEncodeUtf8(selectProd?.product_name)); - if (!searchRst.Contains("\"code\":0") && !searchRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref searchRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = searchRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"已存在商品查询错误 " + error + "\"}"; - } - try - { - var num = JObject.Parse(searchRst)["totalNum"].ParseToInt(); - if (num > 0) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品已存在,选择跳过\"}"; - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"已存在商品查询错误 " + ex.Message + "\"}"; - } - } - // 非裂变商品按商品Id - else - { - var searchExtCode = dbProd.ext_code; - if (searchExtCode.ParseToString().Length < 10) - searchExtCode = "EC1" + dbProd.spu_id + "A"; - if (dbProd.sku_secret_json != null && dbProd.sku_secret_json.Contains("goodsId")) - { - var sku_secret_json = dbProd.sku_secret_json; - searchExtCode = BaseRegex.GetStringJson(ref sku_secret_json, "goodsId"); - } - var searchRst = WXUpload.searchProduct(shop, searchExtCode); - if (!searchRst.Contains("\"code\":0") && !searchRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref searchRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = searchRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"已存在商品查询错误 " + error + "\"}"; - } - try - { - var num = JObject.Parse(searchRst)["totalNum"].ParseToInt(); - if (num > 0) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品已存在,选择跳过\"}"; - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"已存在商品查询错误 " + ex.Message + "\"}"; - } - } - } - #endregion - - #region 处理佣金上传 - int commissionRate = 0; - int minCommissionRate = 0; - int maxCommissionRate = 0; - int commissionRateChange = 0; - int? fromCommissionRate = 0; - if (BaseClass.UserAuthority.Contains("佣金上货") && chkCommission.Checked) - { - if (dbProd.special_prod_type != "爆款数据" && dbProd.product_get_type_text != "微信小店") - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:仅爆款微信小店数据支持佣金上传!\"}"; - - var rst = WXUpload.GetAndUpdateWebStatus(shop); - if (!rst.Contains("\"isOpenLeague\":true")) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:需要开通优选联盟!\"}"; - } - - var url = BaseClass.BuildObjString("product/wx_get_commission_rate"); - var date = UserLogin.GetSignaturex(); - date += "&spu_ids=" + dbProd.spu_id; - - var prodCommissionRst = GetHtml.PostUtf8(url, date); - if (!prodCommissionRst.Contains("\"code\":200")) - { - var errMsg = BaseRegex.GetStringJsonByRegs(ref prodCommissionRst, prodCommissionRst, "msg"); - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:" + errMsg + "\"}"; - } - fromCommissionRate = BaseRegex.GetStringJson(ref prodCommissionRst, "commission_rate").ParseToNullableInt(); - if (fromCommissionRate == null) - fromCommissionRate = -1; - if (prodCommissionRst.Contains("\"data\":[]") || BaseRegex.GetStringJson(ref prodCommissionRst, "mdy_time").ParseToString().ParseToDateTime() < DateTime.Now.AddDays(-30)) - { - var assistantShop = new ShopLoginInfo(); - assistantShop.Cookies = JsonHelper.SerializeObject(lstWxSaleAssistantCookie); - var result = WxGetAssistant.wxGetAssistant(assistantShop, dbProd.spu_id); - Thread.Sleep(Randomx.GetId(500, 1500)); - if (result.Contains("mcn magic invalid")) - { - Invoke(new Action(() => - { - BaseMsgForm.ShowError("拥金上货失败:请先登录上货助手"); - btnLoginAssistant_Click(null, null); - })); - assistantShop.Cookies = JsonHelper.SerializeObject(lstWxSaleAssistantCookie); - result = WxGetAssistant.wxGetAssistant(assistantShop, dbProd.spu_id); - if (result.Contains("mcn magic invalid")) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:请先登录上货助手\"}"; - } - fromCommissionRate = BaseRegex.GetStringJson(ref result, "commissionRate").ParseToNullableInt(); - var prodName = BaseRegex.GetStringJson(ref result, "name"); - if (fromCommissionRate == null) - fromCommissionRate = -1; - if (prodName.IsNullOrEmpty()) - prodName = dbProd.product_name; - //if (fromCommissionRate != null && !string.IsNullOrEmpty(prodName)) - { - url = BaseClass.BuildObjString("product/wx_add_mdy_commission_rate"); - date = UserLogin.GetSignaturex(); - date += "&spu_id=" + dbProd.spu_id; - date += "&commission_rate=" + fromCommissionRate; - date += "&product_name=" + prodName; - var addCommissionRateRst = GetHtml.PostUtf8(url, date); - } - } - Invoke(new Action(() => - { - minCommissionRate = this.txtMinUpCommission.Text.Trim().ParseToInt() * 10000; - maxCommissionRate = this.txtMaxUpCommission.Text.Trim().ParseToInt() * 10000; - commissionRateChange = this.txtCommissionChangeValue.Text.Trim().ParseToInt() * 10000; - if (cmbCommissionAddOrReduce.Text != "增加") - commissionRateChange = -commissionRateChange; - commissionRate = fromCommissionRate.ParseToInt() + commissionRateChange; - })); - if (fromCommissionRate < minCommissionRate || fromCommissionRate > maxCommissionRate) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:原商品佣金比例 " + fromCommissionRate * 0.0001 + "% 超过设置的佣金范围!\"}"; - } - } - #endregion - - #region 将聚水潭产品数据格式进行转换成pdd格式统一上传,匹配加密的spuCode和skuCoke 微信小店的货号spuCode和外部商品编号outProductId/out_product_id对应加密的聚水潭goodsId - if (dbProd.product_get_type_text == "厂商直采") - { - if (dbProd.sku_secret_json.IsNullOrEmpty() || !dbProd.sku_secret_json.Contains("goodsId")) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询格式错误\"}"; - } - if (dbProd.wx_cat_leaf.IsNullOrZero() || dbProd.send_to_out_server != 1 || dbProd.distribution_set != 1) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询校验错误\"}"; - } - - string convertRst = ""; - var pInfo = new PDDProdFormConverter().JstPddProdToPddConvert(out convertRst, dbProd); - if (!string.IsNullOrEmpty(convertRst)) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; - } - #endregion - - #region 微信店采原始格式还原 - WXGetEditProductInfoLite wxEditProdInfo = null; - if (dbProd.product_get_type_text == "微信店采") - { - try - { - wxEditProdInfo = JsonHelper.DeserializeJsonToObject(dbProd.product_json); - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"微信商品格式获取失败" + ex.Message + "\"}"; - } - } - #endregion - - #region 微信店采格式转换 - if (dbProd.product_get_type_text == "微信店采") - { - string convertRst = ""; - var pInfo = new PDDProdFormConverter().WXProdToPddConvert(out convertRst, dbProd); - if (!string.IsNullOrEmpty(convertRst)) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; - } - #endregion - - #region 微信回采转换 - if (BaseClass.UserAuthority.ParseToString().Contains("微信回采") && chkUseWXComplateProd.Checked && dbProd.has_wx_format == "1") - { - string errMsg = ""; - wxEditProdInfo = GetProductWXComplate(dbProd.secret_spu_id, out errMsg); - - if (wxEditProdInfo == null) - { - Invoke(new Action(() => - { - cell.Value = errMsg; - })); - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + errMsg + "\"}"; - } - } - #endregion - - #region 微信小店app - if (dbProd.product_get_type_text == "微信小店") - { - string convertRst = ""; - var pInfo = new PDDProdFormConverter().WXClientToPddConvert(out convertRst, dbProd); - if (!string.IsNullOrEmpty(convertRst)) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; - } - #endregion - - #region 1688格式转换 - if (dbProd.product_get_type_text == "1688厂家") - { - string convertRst = ""; - var pInfo = new PDDProdFormConverter()._1688ClientToPddConvert(out convertRst, dbProd); - if (!string.IsNullOrEmpty(convertRst)) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; - } - if (dbProd.product_get_type_text == "1688外部数据") - { - string convertRst = ""; - var pInfo = new PDDProdFormConverter()._1688OutToPddConvert(out convertRst, dbProd); - if (!string.IsNullOrEmpty(convertRst)) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; - } - #endregion - - #region 将产品数据初始化成微信小店支持的参数 - JObject prodJObj = new JObject(); - try - { - prodJObj = JObject.Parse(dbProd.product_json); - - var lstTitleReplaceText = new List(); - if (!txtReplaceText.Text.Trim().IsNullOrEmpty()) - lstTitleReplaceText.AddRange(txtReplaceText.Text.Trim().Split(new string[] { ",", ",", " ", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries)); - // 过滤标题敏感词 - if (lstTitleReplaceText.Count > 0) - { - if (chkSkipReplaceText.Checked) - { - if (lstTitleReplaceText.Any(t => selectProd.product_name.Contains(t))) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; - if (lstTitleReplaceText.Any(t => dbProd.product_name.Contains(t))) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; - - var goods_name = prodJObj["detail"]["goods_name"].ParseToString(); - if (lstTitleReplaceText.Any(t => goods_name.Contains(t))) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; - var tiny_name = prodJObj["detail"]["tiny_name"].ParseToString(); - if (lstTitleReplaceText.Any(t => tiny_name.Contains(t))) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; - var goods_desc = prodJObj["detail"]["goods_desc"].ParseToString(); - if (lstTitleReplaceText.Any(t => goods_desc.Contains(t))) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; - var share_desc = prodJObj["detail"]["share_desc"].ParseToString(); - if (lstTitleReplaceText.Any(t => share_desc.Contains(t))) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; - } - else - { - foreach (var txt in lstTitleReplaceText) - { - dbProd.product_name = dbProd.product_name.Replace(txt, ""); - selectProd.product_name = selectProd.product_name.Replace(txt, ""); - } - - var goods_name = prodJObj["detail"]["goods_name"].ParseToString(); - foreach (var txt in lstTitleReplaceText) - { - goods_name = goods_name.Replace(txt, ""); - } - prodJObj["detail"]["goods_name"] = goods_name; - - var tiny_name = prodJObj["detail"]["tiny_name"].ParseToString(); - foreach (var txt in lstTitleReplaceText) - { - tiny_name = tiny_name.Replace(txt, ""); - } - prodJObj["detail"]["tiny_name"] = tiny_name; - - var goods_desc = prodJObj["detail"]["goods_desc"].ParseToString(); - foreach (var txt in lstTitleReplaceText) - { - goods_desc = goods_desc.Replace(txt, ""); - } - prodJObj["detail"]["goods_desc"] = goods_desc; - - var share_desc = prodJObj["detail"]["share_desc"].ParseToString(); - foreach (var txt in lstTitleReplaceText) - { - share_desc = share_desc.Replace(txt, ""); - } - prodJObj["detail"]["share_desc"] = share_desc; - } - } - // 过滤标题特殊字符 - if (chkRemoveSpecialChar.Checked) - { - var chLst = new List { ']', '】', ')', ')', '}', }; - foreach (var ch in chLst) - { - if (dbProd.product_name.Contains(ch) && dbProd.product_name.IndexOf(ch) < dbProd.product_name.Length / 2 && dbProd.product_name.Length > 10) - dbProd.product_name = dbProd.product_name.Substring(dbProd.product_name.IndexOf(ch)).Trim(ch); - - if (selectProd.product_name.Contains(ch) && selectProd.product_name.IndexOf(ch) < selectProd.product_name.Length / 2 && selectProd.product_name.Length > 10) - selectProd.product_name = selectProd.product_name.Substring(selectProd.product_name.IndexOf(ch)).Trim(ch); - - var goods_name = prodJObj["detail"]["goods_name"].ParseToString(); - if (goods_name.Contains(ch) && goods_name.IndexOf(ch) < goods_name.Length / 2 && goods_name.Length > 10) - prodJObj["detail"]["goods_name"] = goods_name.Substring(goods_name.IndexOf(ch)).Trim(ch); - } - - } - // 替换货号 - if (!string.IsNullOrEmpty(dbProd.ext_code)) - prodJObj["detail"]["out_goods_sn"] = dbProd.ext_code; - // 替换编辑过的sku - if (!string.IsNullOrEmpty(dbProd.sku_edit_json)) - prodJObj["detail"]["sku"] = JArray.Parse(JsonHelper.SerializeObject(JsonHelper.DeserializeJsonToList(dbProd.sku_edit_json))); - // 过滤sku敏感词 - if (lstTitleReplaceText.Count > 0) - { - var skuJArr = prodJObj["detail"]["sku"] as JArray; - try - { - foreach (var skuJObj in skuJArr) - { - var specJArr = skuJObj["spec"] as JArray; - for (int i = 0; i < specJArr.Count; i++) - { - foreach (var txt in lstTitleReplaceText) - { - specJArr[i]["spec_name"] = specJArr[i]["spec_name"].ParseToString().Replace(txt, ""); - } - } - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; - } - } - // 同颜色规格向上浮动同价格 - if (chkSameSpecPriceUp.Checked) - { - var priceTextLst = dbProd.price_text.Split('-'); - if (priceTextLst.Length != 2 || priceTextLst[0] != priceTextLst[1]) - { - Dictionary specPriceDic = new Dictionary(); - Dictionary specMultiPriceDic = new Dictionary(); - var skuJArr = prodJObj["detail"]["sku"] as JArray; - try - { - // 计算主spec的最高价 - foreach (var skuJObj in skuJArr) - { - var specJArr = skuJObj["spec"] as JArray; - if (!specPriceDic.ContainsKey(specJArr[0]["spec_name"].ParseToString()) || skuJObj["price"].ParseToInt() > specPriceDic[specJArr[0]["spec_name"].ParseToString()]) - { - specPriceDic[specJArr[0]["spec_name"].ParseToString()] = skuJObj["price"].ParseToInt(); - } - if (!specMultiPriceDic.ContainsKey(specJArr[0]["spec_name"].ParseToString()) || skuJObj["multi_price"].ParseToInt() > specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()]) - { - specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()] = skuJObj["multi_price"].ParseToInt(); - } - } - // 统一按最高价设置 - foreach (var skuJObj in skuJArr) - { - var specJArr = skuJObj["spec"] as JArray; - skuJObj["price"] = specPriceDic[specJArr[0]["spec_name"].ParseToString()]; - skuJObj["multi_price"] = specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()]; - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; - } - } - } - // 同颜色规格向下浮动同价格 - if (chkSameSpecPriceDown.Checked) - { - var priceTextLst = dbProd.price_text.Split('-'); - if (priceTextLst.Length != 2 || priceTextLst[0] != priceTextLst[1]) - { - Dictionary specPriceDic = new Dictionary(); - Dictionary specMultiPriceDic = new Dictionary(); - var skuJArr = prodJObj["detail"]["sku"] as JArray; - try - { - // 计算主spec的最低价 - foreach (var skuJObj in skuJArr) - { - var specJArr = skuJObj["spec"] as JArray; - if (!specPriceDic.ContainsKey(specJArr[0]["spec_name"].ParseToString()) || skuJObj["price"].ParseToInt() < specPriceDic[specJArr[0]["spec_name"].ParseToString()]) - { - specPriceDic[specJArr[0]["spec_name"].ParseToString()] = skuJObj["price"].ParseToInt(); - } - if (!specMultiPriceDic.ContainsKey(specJArr[0]["spec_name"].ParseToString()) || skuJObj["multi_price"].ParseToInt() < specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()]) - { - specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()] = skuJObj["multi_price"].ParseToInt(); - } - } - // 统一按最低价设置 - foreach (var skuJObj in skuJArr) - { - var specJArr = skuJObj["spec"] as JArray; - skuJObj["price"] = specPriceDic[specJArr[0]["spec_name"].ParseToString()]; - skuJObj["multi_price"] = specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()]; - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; - } - } - } - // 只保留最高价 - if (chkHighestPriceSku.Checked) - { - int price = 0; - var skuJArr = prodJObj["detail"]["sku"] as JArray; - try - { - // 计算主spec的最高价 - foreach (var skuJObj in skuJArr) - { - if (price < skuJObj["multi_price"].ParseToInt()) - price = skuJObj["multi_price"].ParseToInt(); - } - - var product_json_tmp = JsonHelper.SerializeObject(prodJObj); - - // 移除第一组所有sku - skuJArr.RemoveAll(); - - // 序列化第二组,从组中挑选符合价格条件的sku往第一组内填写 - var prodJObj2 = JObject.Parse(product_json_tmp); - var skuJArr2 = prodJObj2["detail"]["sku"] as JArray; - foreach (var skuJObj2 in skuJArr2) - { - if (skuJObj2["multi_price"].ParseToInt() >= price) - skuJArr.Add(skuJObj2); - } - if (skuJArr.Count == 0) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品sku差价不满足上货条件,跳过\"}"; - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; - } - } - // 只保留最低价 - if (chkLowestPriceSku.Checked) - { - int price = 99999999; - var skuJArr = prodJObj["detail"]["sku"] as JArray; - try - { - // 计算主spec的最低价 - foreach (var skuJObj in skuJArr) - { - if (price > skuJObj["multi_price"].ParseToInt()) - price = skuJObj["multi_price"].ParseToInt(); - } - - var product_json_tmp = JsonHelper.SerializeObject(prodJObj); - - // 移除第一组所有sku - skuJArr.RemoveAll(); - - // 序列化第二组,从组中挑选符合价格条件的sku往第一组内填写 - var prodJObj2 = JObject.Parse(product_json_tmp); - var skuJArr2 = prodJObj2["detail"]["sku"] as JArray; - foreach (var skuJObj2 in skuJArr2) - { - if (skuJObj2["multi_price"].ParseToInt() <= price) - skuJArr.Add(skuJObj2); - } - if (skuJArr.Count == 0) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品sku差价不满足上货条件,跳过\"}"; - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; - } - } - // 过滤低价sku,如果所有sku都不达标,跳过商品 - if (!string.IsNullOrEmpty(txtMinPrice.Text)) - { - var product_json_tmp = JsonHelper.SerializeObject(prodJObj); - - // 移除第一组所有sku - var skuJArr = prodJObj["detail"]["sku"] as JArray; - skuJArr.RemoveAll(); - - // 序列化第二组,从组中挑选符合价格条件的sku往第一组内填写 - var prodJObj2 = JObject.Parse(product_json_tmp); - var skuJArr2 = prodJObj2["detail"]["sku"] as JArray; - foreach (var skuJObj2 in skuJArr2) - { - var limitMinPrice = this.txtMinPrice.Text.Trim().ParseToDecimal() * 100; - // 供应商价加价10%(最低1元)赚取差价 先加价后过滤,过滤条件也要相应增加10% - //if (dbProd.product_get_type_text == "厂商直采") - // limitPrice += Math.Max(100m, limitPrice * 0.1m); - if (skuJObj2["multi_price"].ParseToInt() >= limitMinPrice) - skuJArr.Add(skuJObj2); - } - if (skuJArr.Count == 0) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品sku价格不满足上货条件,跳过\"}"; - } - } - // 过滤高价sku,如果所有sku都不达标,跳过商品 - if (!string.IsNullOrEmpty(txtMaxPrice.Text)) - { - var product_json_tmp = JsonHelper.SerializeObject(prodJObj); - - // 移除第一组所有sku - var skuJArr = prodJObj["detail"]["sku"] as JArray; - skuJArr.RemoveAll(); - - // 序列化第二组,从组中挑选符合价格条件的sku往第一组内填写 - var prodJObj2 = JObject.Parse(product_json_tmp); - var skuJArr2 = prodJObj2["detail"]["sku"] as JArray; - foreach (var skuJObj2 in skuJArr2) - { - var limitMaxPrice = this.txtMaxPrice.Text.Trim().ParseToDecimal() * 100; - // 供应商价加价10%(最低1元)赚取差价 先加价后过滤,过滤条件也要相应增加10% - //if (dbProd.product_get_type_text == "厂商直采") - // limitPrice += Math.Max(100m, limitPrice * 0.1m); - if (skuJObj2["multi_price"].ParseToInt() <= limitMaxPrice) - skuJArr.Add(skuJObj2); - } - if (skuJArr.Count == 0) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品sku价格不满足上货条件,跳过\"}"; - } - } - - dbProd.product_json = JsonHelper.SerializeObject(prodJObj); - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; - } - #endregion - - #region 图片盗链映射生成字典(如果有) - bool isChangeImgDic = false; - Dictionary wxImgMapDic = new Dictionary(); - if (!string.IsNullOrEmpty(dbProd.wx_img_map_json)) - { - try - { - wxImgMapDic = JsonHelper.DeserializeJsonToObject>(dbProd.wx_img_map_json); - } - catch - { - isChangeImgDic = true; - wxImgMapDic = new Dictionary(); - } - } - #endregion - - #region 提取源商品详情,根据需要生成sku货号 - var prodInfo = JsonHelper.DeserializeJsonToObject(dbProd.product_json); - - // 如果没有货号或有相同货号无法区分sku,自定义货号 - if (dbProd.product_get_type_text != "厂商直采") - { - if (prodInfo.detail.sku.Any(s => s.out_sku_sn.IsNullOrEmpty()) || - prodInfo.detail.sku.Select(s => s.out_sku_sn).ToList().Count > prodInfo.detail.sku.Select(s => s.out_sku_sn).Distinct().ToList().Count) - { - foreach (var sku in prodInfo.detail.sku) - { - sku.out_sku_sn = string.Join(";", sku.spec.Select(s => s.spec_name)); - sku.out_sku_sn = "EC1" + Math.Abs(BaseClass.GetLong(sku.out_sku_sn)) + "A"; - } - } - } - #endregion - - #region 暂时不上传视频 - prodInfo.detail.galleries.RemoveAll(g => g.type == 6); // 视频暂时移除,以后再视情况加上 - #endregion - - #region 主图不够详情图补充 - int mainImgCount = (prodInfo?.detail?.galleries?.Where(g => g.type == 1).Count()).ParseToInt(); - if (mainImgCount > 0 && mainImgCount < 3) - { - var gallery1 = prodInfo?.detail?.galleries?.Where(g => g.type == 2).FirstOrDefault(); - // 先补一张 - if (gallery1 != null) - { - prodInfo.detail.galleries.Add(new gallery_item() - { - type = 1, - url = gallery1.url, - width = gallery1.width, - height = gallery1.height, - }); - } - // 如果补了只有两张再补一张 - if (mainImgCount == 1 && (prodInfo?.detail?.galleries?.Where(g => g.type == 1).Count()).ParseToInt() > 1) - { - var gallery2 = prodInfo?.detail?.galleries?[1]; - if (gallery2 != null) - { - prodInfo.detail.galleries.Add(new gallery_item() - { - type = 1, - url = gallery2.url, - width = gallery2.width, - height = gallery2.height, - }); - } - } - } - if ((prodInfo?.detail?.galleries?.Where(g => g.type == 1).Count()).ParseToInt() < 3) - { - Invoke(new Action(() => - { - cell.Value = "主图数量少于三张"; - })); - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"主图数量少于三张\"}"; - } - #endregion - - #region 过滤重复图片 无论是否打码 - bool needAddRandomBlock = false; - bool wantAddRandomBlock = chkImgRandomBlock.Checked && (/*upProdParam.product.info.category.FirstOrDefault()?.name == "图书" ||*/ - prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸" || dbProd.main_cat_name == "图书" || dbProd.main_cat_name == "书籍/杂志/报纸"); - { - List galls = new List(); - foreach (var gall in prodInfo.detail.galleries.Where(g => g.type == 1).ToList()) - { - 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).ToList()) - { - 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); - int repeatSn = 0; - while (prodInfo.detail.galleries.Where(g => g.type == 1).Count() > 0 && prodInfo.detail.galleries.Where(g => g.type == 1).Count() < 3) - { - repeatSn++; - var gallOld = prodInfo.detail.galleries.LastOrDefault(g => g.type == 1); - var gallNew = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(gallOld)); - // 如果有 替换掉之前附加的后缀 - for (int i = 0; i < 10; i++) - { - gallNew.url = gallNew.url.Replace("?re_sn1=" + i, ""); - gallNew.url = gallNew.url.Replace("?re_sn1=" + i, ""); - } - if (gallNew.url.Contains("?")) - gallNew.url += "&re_sn1=" + repeatSn; - else - gallNew.url += "?re_sn1=" + repeatSn; - prodInfo.detail.galleries.Add(gallNew); - needAddRandomBlock = true; - } - if (prodInfo.detail.galleries.Where(g => g.type == 1).Count() > 0 && prodInfo.detail.galleries.Where(g => g.type == 2).Count() <= 0) - { - var gallOld = prodInfo.detail.galleries.FirstOrDefault(g => g.type == 1); - var gallNew = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(gallOld)); - if (gallNew.url.Contains("?")) - gallNew.url += "&re_sn2=" + 1; - else - gallNew.url += "?re_sn2=" + 1; - gallNew.type = 2; - prodInfo.detail.galleries.Add(gallNew); - needAddRandomBlock = true; - } - } - #endregion - - #region 初始化上传商品对象 - // 生成初始化上传商品对象 - var upProdInitParam = new WXUploadProductInitParam(); - // 生成上传商品对象 - var upProdParam = new WXUploadProductParam(); - #endregion - - #region 获取店铺 Api Token - // 获取店铺的accessToken - WXShopTokenInfo token = lstWXShopTokenInfo.FirstOrDefault(t => t.shopId == shop.ShopId); - if (token == null) - token = new WXShopTokenInfo(); - if (token.isExpire || string.IsNullOrEmpty(token.accessToken)) - { - AuthInfo auth = GlobalConfig.lstWxShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shop.ShopId); - //if (auth != null && auth.ExpiresTime > DateTime.Now.AddMinutes(5)) - { - token = new WxApiBLL().GetShopWxToken(shop); - - if (!string.IsNullOrEmpty(token.accessToken)) - { - lstWXShopTokenInfo.RemoveAll(t => t.shopId == shop.ShopId); - lstWXShopTokenInfo.Add(token); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_shop_token_list", lstWXShopTokenInfo); - } - } - } - // 如果店铺token不可用,随机获取一个上传图片的accessToken - if (token == null || token.isExpire || string.IsNullOrEmpty(token.accessToken)) - token = new WxApiBLL().GetRandomWxToken(); - #endregion - - #region 设置标题 - string prodTitle = selectProd.product_name; - if (prodTitle.IsNullOrEmpty()) - prodTitle = dbProd.product_name.IsNullOrEmpty() ? prodInfo.detail.goods_name : dbProd.product_name; - - upProdInitParam.product.info.title = prodTitle; - upProdParam.product.info.title = prodTitle; - upProdParam.sessionInfo.sessionId = upProdInitParam.product.sessionId; - #endregion - - #region 设置货号 - var extCode = dbProd.ext_code.IsNullOrEmpty() ? prodInfo.detail.out_goods_sn : dbProd.ext_code; - if (extCode.IsNullOrEmpty() || extCode.Length <= 10) - { - //extCode = "EC" + Randomx.GetId(1000).ToString().PadLeft(3, '0') + dbProd.spu_id + "C"; - 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 上传主图 - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成主图并识别商品"; - })); - } - Thread.Sleep(Randomx.GetId(100, 300)); - var mainGalleries = prodInfo.detail.galleries.Where(g => g.type == 1).Take(9).ToList(); - foreach (var gallery_item in mainGalleries) // 9张主图 - { - try - { - if (dbProd.product_get_type_text == "微信店采") - { - upProdInitParam.product.info.headImg.Add(gallery_item.url); - upProdParam.product.info.headImg.Add(gallery_item.url); - continue; - } - - // 获取缓存盗链 主图 - 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; - } - - if (needAddRandomBlock || wantAddRandomBlock || gallery_item.url.Contains("wst.wxapp.tc.qq.com")) - { - // 如果想打码或者需要打码,就走差异化详情图,不走api直传 - } - else - { - // 使用接口链接传主图 - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - upDate += "&post_data=" + GetHtml.UrlEncodeUtf8("{\"img_url\":\"" + gallery_item.url.Replace("https://", "http://") + "\"}"); - - var sTime = DateTime.Now; - var upDateRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成主图并识别商品 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 20 && upDateRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - upDateRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref upDateRst, "img_url"); - if (upDateRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) - { - upProdInitParam.product.info.headImg.Add(upImgUrl); - upProdParam.product.info.headImg.Add(upImgUrl); - wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl; - isChangeImgDic = true; - continue; - } - else - { - } - } - } - catch - { - } - - // api上传图片文件 主图 - if (1 == 1) - { - try - { - string errMsg = ""; - var imgBase64 = GetImgBase64ForApi(out errMsg, gallery_item.url, needAddRandomBlock, wantAddRandomBlock, 800, 800); - if (!string.IsNullOrEmpty(errMsg)) - { - return errMsg; - } - - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - //upDate += "&is_file=true"; - //if (needAddRandomBlock || wantAddRandomBlock) - // upDate += "&random_code=true"; - upDate += "&img_url=" + gallery_item.url; - upDate += "&img_base64=" + imgBase64; - - var sTime = DateTime.Now; - var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在上传主图文件并识别商品 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); - if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) - { - upProdInitParam.product.info.headImg.Add(upImgUrl); - upProdParam.product.info.headImg.Add(upImgUrl); - wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl; - isChangeImgDic = true; - continue; - } - else - { - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改主图失败 " + ex.Message + "\"}"; - } - } - - // 模拟上传图片 - if (1 == 1) - { - var upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); - for (int i = 0; i < 10 && upImgAuthRst.Contains("LogicError"); i++) - { - Invoke(new Action(() => - { - cell.Value = "图片提报失败,正在重试。" + (i + 1); - })); - Thread.Sleep(Randomx.GetId(3000, 6000)); - upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); - } - if (!upImgAuthRst.Contains("\"code\":0")) - { - var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = upImgAuthRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"申请上传主图失败 " + GetHtml.UrlEncodeUtf8(error) + "\"}"; - } - string disK = BaseRegex.GetStringJson(ref upImgAuthRst, "disK"); - long disT = BaseRegex.GetLongJson(ref upImgAuthRst, "disT"); - string ext = BaseRegex.GetStringJson(ref upImgAuthRst, "ext"); - string imgBase64 = ""; - - //------------------------------------------------------------------------------------------------------------------------------------- - //生成主图base64字符串 - string getImgError; - var image = GetHtml.GetUrlImg(gallery_item.url.Replace("https://", "http://"), out getImgError); - var imageBg = new Bitmap(800, 800); - if (!string.IsNullOrEmpty(getImgError) || image == null) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"初始化主图上传失败\"}"; - } - try - { - using (Graphics g = Graphics.FromImage(imageBg)) - { - g.DrawImage(image, new Rectangle(0, 0, imageBg.Width, imageBg.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); - if (needAddRandomBlock || wantAddRandomBlock) - { - g.FillRectangle(new SolidBrush(Color.FromArgb(Randomx.GetId(256), Randomx.GetId(256), Randomx.GetId(256))), - new Rectangle(Randomx.GetId(imageBg.Width - 30), Randomx.GetId(imageBg.Height - 30), 30, 30)); - } - } - using (MemoryStream memoryStream = new MemoryStream()) - { - imageBg.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); - byte[] imageBytes = memoryStream.ToArray(); - imgBase64 = Convert.ToBase64String(imageBytes); - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改主图失败 " + ex.Message + "\"}"; - } - - //------------------------------------------------------------------------------------------------------------------------------------- - //上传主图获取路径 - var upImgRst = WXUpload.adtimageupload(shop, imgBase64, disK, disT, ext).ParseToString(); - var location = BaseRegex.GetStringJson(ref upImgRst, "Location"); - if (string.IsNullOrEmpty(location)) - { - var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = upImgAuthRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"主图上传失败 " + error + "\"}"; - } - upProdInitParam.product.info.headImg.Add(location); - upProdParam.product.info.headImg.Add(location); - //wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = location; - //isChangeImgDic = true; - Thread.Sleep(Randomx.GetId(10, 50)); - } - } - #endregion - - #region 保存缓存盗链图片 - if (isChangeImgDic) - { - var url = BaseClass.BuildObjString("product/mdy_pdd_product"); - var data = ""; - Invoke(new Action(() => - { - data = UserLogin.GetSignaturex(); - data += "&spu_id=" + dbProd.spu_id; - data += "&wx_img_map_json=" + JsonHelper.SerializeObject(wxImgMapDic); - })); - var 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")) - html = GetHtml.PostUtf8(url, data); - isChangeImgDic = false; - } - #endregion - - #region 识别类目 - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成类目属性"; - })); - } - List aiCateIdLst = new List(); - // 聚水潭商品已识别类目使用类目缓存 - if (dbProd.product_get_type_text == "厂商直采" && dbProd.wx_cat_leaf == null) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"该商品类目信息不完整\"}"; - } - // 微信商品使用类目缓存 - if (!dbProd.wx_cat_leaf.IsNullOrZero()) - { - if (dbProd.wx_cat_3 == 7370) - dbProd.wx_cat_3 = 547591; - if (dbProd.wx_cat_leaf == 7370) - dbProd.wx_cat_leaf = 547591; - - if (!dbProd.wx_cat_1.IsNullOrZero()) - aiCateIdLst.Add(dbProd.wx_cat_1.ParseToLong()); - if (!dbProd.wx_cat_2.IsNullOrZero()) - aiCateIdLst.Add(dbProd.wx_cat_2.ParseToLong()); - if (!dbProd.wx_cat_3.IsNullOrZero()) - aiCateIdLst.Add(dbProd.wx_cat_3.ParseToLong()); - if (!dbProd.wx_cat_leaf.IsNullOrZero()) - aiCateIdLst.Add(dbProd.wx_cat_leaf.ParseToLong()); - aiCateIdLst = aiCateIdLst.Distinct().ToList(); - } - else - { - //------------------------------------------------------------------------------------------------------------------------------------- - // ai识别类目暂存主图位置 - int imgId = 0; - string tempImgPath = Path.GetTempPath().Trim('\\') + "\\" + Randomx.GetWordWithNumber(8).ToLower(); - List tempImgFullPathLst = new List(); - //------------------------------------------------------------------------------------------------------------------------------------- - // 生成ai识别类目所需图片 - var aiGalleries = prodInfo.detail.galleries.Where(g => g.type == 1).Take(3).ToList(); - foreach (var gallery_item in aiGalleries) // 9张主图 - { - string getImgError; - var image = GetHtml.GetUrlImg(gallery_item.url.Replace("https://", "http://"), out getImgError); - var imageBg = new Bitmap(800, 800); - if (!string.IsNullOrEmpty(getImgError) || image == null) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"初始化主图上传失败\"}"; - } - using (Graphics g = Graphics.FromImage(imageBg)) - { - g.DrawImage(image, new Rectangle(0, 0, imageBg.Width, imageBg.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); - } - - // 取前三张图片保存到系统temp路径,配合商品标题获取商品类目 - if (imgId <= 3) - { - if (!Directory.Exists(tempImgPath)) - Directory.CreateDirectory(tempImgPath); - string imgFullPath = tempImgPath + "\\图片" + imgId + ".jpg"; - tempImgFullPathLst.Add(imgFullPath); - if (imgId == 1) - image.Save(imgFullPath, System.Drawing.Imaging.ImageFormat.Jpeg); - else - { - // 只需要传一张真实图像即可 - int fileSize = Randomx.GetId(1024, 10240); - using (BinaryWriter writer = new BinaryWriter(File.Create(imgFullPath))) - { - for (int i = 0; i < fileSize; i++) - { - writer.Write((byte)Randomx.GetId(256)); // 生成0到255之间的随机字节 - } - } - } - } - } - Thread.Sleep(Randomx.GetId(100, 300)); - //------------------------------------------------------------------------------------------------------------------------------------- - // 根据Ai分类,获取类目信息 - //{"code":0,"predInfo":{"firstCatRes":[{"catId":10000111,"catName":"服饰内衣","level":1},{"catId":10000111,"catName":"服饰内衣","level":1},{"catId":10000111,"catName":"服饰内衣","level":1}],"secondCatRes":[{"catId":10000113,"catName":"女装","level":2},{"catId":10000113,"catName":"女装","level":2},{"catId":10000113,"catName":"女装","level":2}],"thirdCatRes":[{"catId":547705,"catName":"牛仔裤","level":3,"modelVersion":""},{"catId":547704,"catName":"加绒裤","level":3,"modelVersion":"商品标题含'加绒加厚、保暖'等关键词,这表示裤子具备加绒保暖功能。主图展示了加绒内衬,也符合【服饰内衣:女装:裤子:加绒裤】类目特征。"},{"catId":547701,"catName":"休闲裤","level":3,"modelVersion":""}],"singleSecondCatRes":[],"singleFirstCatRes":[],"isSupportedCate":1},"aiCategoryList":[{"id":547705,"paths":[{"id":"10000111","name":"服饰内衣","sonIdList":["10000397","10000115","10000112","10000113","10000114"],"fId":"0","level":1,"leaf":false},{"id":"10000113","name":"女装","sonIdList":["546810","546811","530041","547706","6090","6089","6088","6087","6083","6076","6073","6070","6065","6063","6058","10000672","10000671","10000670","10000669","10000668","10000667","10000666","10000665","10000664","10000663","10000662","10000661","10000660","10000659","10000658","10000657","10000656","10000655"],"fId":"10000111","level":2,"leaf":false},{"id":"10000672","name":"裤子","sonIdList":["547699","547700","547701","547702","547703","547704","547705"],"fId":"10000113","level":3,"leaf":false},{"id":"547705","name":"牛仔裤","fId":"10000672","level":4,"leaf":true,"state":0,"hasTrialCategory":false,"isTrialCategory":false,"isLocalLife":false}],"depositAmount":0,"catAuth":true,"limitSubjectTypes":[]},{"id":547704,"paths":[{"id":"10000111","name":"服饰内衣","sonIdList":["10000397","10000115","10000112","10000113","10000114"],"fId":"0","level":1,"leaf":false},{"id":"10000113","name":"女装","sonIdList":["546810","546811","530041","547706","6090","6089","6088","6087","6083","6076","6073","6070","6065","6063","6058","10000672","10000671","10000670","10000669","10000668","10000667","10000666","10000665","10000664","10000663","10000662","10000661","10000660","10000659","10000658","10000657","10000656","10000655"],"fId":"10000111","level":2,"leaf":false},{"id":"10000672","name":"裤子","sonIdList":["547699","547700","547701","547702","547703","547704","547705"],"fId":"10000113","level":3,"leaf":false},{"id":"547704","name":"加绒裤","fId":"10000672","level":4,"leaf":true,"state":0,"hasTrialCategory":false,"isTrialCategory":false,"isLocalLife":false}],"depositAmount":0,"catAuth":true,"limitSubjectTypes":[]},{"id":547701,"paths":[{"id":"10000111","name":"服饰内衣","sonIdList":["10000397","10000115","10000112","10000113","10000114"],"fId":"0","level":1,"leaf":false},{"id":"10000113","name":"女装","sonIdList":["546810","546811","530041","547706","6090","6089","6088","6087","6083","6076","6073","6070","6065","6063","6058","10000672","10000671","10000670","10000669","10000668","10000667","10000666","10000665","10000664","10000663","10000662","10000661","10000660","10000659","10000658","10000657","10000656","10000655"],"fId":"10000111","level":2,"leaf":false},{"id":"10000672","name":"裤子","sonIdList":["547699","547700","547701","547702","547703","547704","547705"],"fId":"10000113","level":3,"leaf":false},{"id":"547701","name":"休闲裤","fId":"10000672","level":4,"leaf":true,"state":0,"hasTrialCategory":false,"isTrialCategory":false,"isLocalLife":false}],"depositAmount":0,"catAuth":true,"limitSubjectTypes":[]}],"version":"ProductClsRAG","noQualificationCatIds":[547705,547704,547701],"depositCatInfos":[{"catId":547705,"amountToPay":0,"error":false},{"catId":547704,"amountToPay":0,"error":false},{"catId":547701,"amountToPay":0,"error":false}],"visionCallMethod":"ProductClsRAG"} - var productClassifyRst = WXUpload.getProductClassify(shop, upProdInitParam.product.info.title, tempImgFullPathLst); - if (!productClassifyRst.Contains("\"code\":0")) - { - var error = BaseRegex.GetStringJson(ref productClassifyRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = productClassifyRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"获取类目失败 " + error + "\"}"; - } - WXGetProdCateInfo cateInfo = new WXGetProdCateInfo(); - try - { - cateInfo = JsonHelper.DeserializeJsonToObject(productClassifyRst); - foreach (var catePath in cateInfo.aiCategoryList.FirstOrDefault().paths) - { - aiCateIdLst.Add(catePath.id.ParseToLong()); - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + "根据图片获取类目失败 " + ex.Message + "\"}"; - } - } - #endregion - - #region 生成类目模板 - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成类目模板"; - })); - } - - if (aiCateIdLst.LastOrDefault() == 7370) - { - aiCateIdLst.RemoveAt(aiCateIdLst.Count - 1); - aiCateIdLst.Add(547591); - } - - string getCateRst = WXUpload.getCategoryOnShelf(shop, aiCateIdLst); - if (!getCateRst.Contains("\"code\":0")) - { - var error = BaseRegex.GetStringJson(ref getCateRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = getCateRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"获取类目模板失败" + error + "\"}"; - } - - JObject jCateRst = JObject.Parse(getCateRst); - upProdParam.product.info.category = JsonHelper.DeserializeJsonToList(JsonHelper.SerializeObject(jCateRst["category"])); - // 这里用了ai获取类目,如下填写 - upProdParam.product.info.recommendCategory = new recommendCategoryParam() - { - isAccepted = true, - categoryNames = new List(), - recommendSource = "ai", - interfaceName = "ProductClsRAG", - useNewInterface = 1, - }; - foreach (var cateParam in upProdParam.product.info.category) - { - upProdParam.product.info.recommendCategory.categoryNames.Add(cateParam.name); - } - - // 获取叶子类目id - - long leafCatId = (upProdParam.product.info.category.LastOrDefault()?.catId).ParseToLong(); //哲学经典著作 - var bound = GlobalConfig.WxCatBoundList.FirstOrDefault(b => b.leaf_id == leafCatId); - if (leafCatId == 547591) - bound = GlobalConfig.WxCatBoundList.FirstOrDefault(b => b.leaf_id == 7370); - if (bound == null) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"获取类目保证金失败\"}"; - var maxBount = txtFilterBoundMax.Text.Trim().ParseToInt(); - var minBount = txtFilterBoundMin.Text.Trim().ParseToInt(); - if (bound.cat_bound < minBount || bound.cat_bound > maxBount) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目保证金(" + bound.cat_bound + ")超过过滤限制(" + minBount + "-" + maxBount + ")\"}"; - - // 定向类目需指定品牌Id - var spBrandId = ""; - var spBrandName = ""; - if (leafCatId == 547591) - { - // 先写死 - //spBrandId = 10914219.ToString(); - - var rst = WXUpload.getMixBrand(shop, leafCatId.ToString()); - Invoke(new Action(() => { spBrandName = cmbSpBrandName.Text.Trim(); })); - - if (!string.IsNullOrEmpty(spBrandName) && rst.Contains("\"code\":0")) - { - var jObj = JsonHelper.JObjectParse(rst); - foreach (var jItem in jObj["mixBrandList"]) // bizuinBrandList mixBrandList - { - if (jItem["chName"].ParseToString() == spBrandName) - spBrandId = jItem["brandId"].ParseToString(); - } - } - - if (spBrandId.IsNullOrEmpty()) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"定向类目绑定品牌失败\"}"; - } - - // 国表定向类目 - upProdParam.product.info.brandId = spBrandId.ParseToLong(); - } - else - { - - // 检测是否有类目上传权限 - var cateUpCheckRst = WXUpload.batchCheckCategoryRelation(shop, leafCatId); - //"{\"code\":0,\"list\":[{\"category_id\":\"1427\",\"result\":0,\"no_auth_reason_type\":0}]}" - //"{\"code\":0,\"list\":[{\"category_id\":\"7486\",\"result\":0,\"no_auth_reason_type\":0}]}" - if (!cateUpCheckRst.Contains("\"code\":0") && !cateUpCheckRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref cateUpCheckRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = cateUpCheckRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目校验错误 " + error + "\"}"; - } - if (!cateUpCheckRst.Contains("\"result\":1")) - { - if (aiCateIdLst.FirstOrDefault() == 10000215) - { - //@"{""categoryInfo"":{""categories"":[{""id"":10000215},{""id"":10000222},{""id"":7483}],""categoryDeposit"":""1000.00"",""isNewApplyCat"":true,""licenseGroupList"":[{""licenseGroupId"":""1"",""license"":{""licenseId"":""4"",""cosIdList"":[""1771897594802-oM5657FQAaKYlf2uP300NBgx9HYY-0581""],""licenseFieldList"":[{""key"":""audit_license_registration_no"",""value"":""YB23509020049441""},{""key"":""search_url"",""value"":""""}],""isReuse"":true}}],""ruleVersion"":5234,""certificate"":[]},""brandIdList"":[],""leafCategoryId"":7483,""reuse"":0,""applyType"":""normalApply""}"; - var getCatDataRst = WXUpload.getSingleCategoryData(shop, leafCatId, aiCateIdLst); - if (!getCatDataRst.Contains("\"code\":0") && !getCatDataRst.Contains("\"success\":true")) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请失败 查询类目资质文件失败" + "\"}"; - } - - WXCateAuthParam wxCateAuthParam = new WXCateAuthParam(); - wxCateAuthParam.leafCategoryId = leafCatId; - wxCateAuthParam.categoryInfo.categoryDeposit = bound.cat_bound.ToString("0.00"); - wxCateAuthParam.categoryInfo.ruleVersion = BaseRegex.GetIntJson(ref getCatDataRst, "ruleVersion"); - foreach (var cateId in aiCateIdLst) - { - wxCateAuthParam.categoryInfo.categories.Add(new WXCateId() { id = cateId }); - } - try - { - if (!JsonHelper.JObjectParse(getCatDataRst)["reuseApplyData"].IsJTokenNullOrEmpty()) - { - var jlicenseGroupList = JsonHelper.JObjectParse(getCatDataRst)["reuseApplyData"]["catInfo"]["licenseGroupList"]; - var licenseGroupListStr = JsonHelper.SerializeObject(jlicenseGroupList); - wxCateAuthParam.categoryInfo.licenseGroupList = JsonHelper.DeserializeJsonToList(licenseGroupListStr); - } - else - { - var licenseGroup = new licenseGroup(); - wxCateAuthParam.categoryInfo.licenseGroupList.Add(licenseGroup); - licenseGroup.license.licenseId = "4"; - var cosIdList = "[" + BaseRegex.GetMatchRegexString(ref getCatDataRst, "\"cosIdList\":\\[([\\s\\S]*?)\\]") + "]"; - licenseGroup.license.cosIdList = JsonHelper.DeserializeJsonToList(cosIdList); - var licenseFieldList = "[" + BaseRegex.GetMatchRegexString(ref getCatDataRst, "\"licenseFieldList\":\\[([\\s\\S]*?)\\]") + "]"; - licenseGroup.license.licenseFieldList = JsonHelper.DeserializeJsonToList(licenseFieldList); - } - var authCateRst = WXUpload.wxCateAuth(shop, aiCateIdLst, wxCateAuthParam); - if (!authCateRst.Contains("\"code\":0") && !authCateRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref authCateRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = BaseRegex.GetStringJson(ref authCateRst, "errmsg"); - if (string.IsNullOrEmpty(error)) - error = authCateRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请失败 " + error + "\"}"; - } - Thread.Sleep(Randomx.GetId(5000, 7000)); - cateUpCheckRst = WXUpload.batchCheckCategoryRelation(shop, leafCatId); - if (!cateUpCheckRst.Contains("\"code\":0") && !cateUpCheckRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref cateUpCheckRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = cateUpCheckRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请校验错误 " + error + "\"}"; - } - if (!cateUpCheckRst.Contains("\"result\":1")) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请审核中 请稍后再试\"}"; - } - catch - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请失败 复用资质文件失败,请重新提交资质文件" + "\"}"; - } - //return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请失败 请手动申请资质类目" + "\"}"; - } - else - { - Thread.Sleep(Randomx.GetId(1000, 2000)); - var cateAuthorRst = WXUpload.addFinderCategoryV2(shop, leafCatId); - if (!cateAuthorRst.Contains("\"code\":0") && !cateAuthorRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref cateAuthorRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = BaseRegex.GetStringJson(ref cateAuthorRst, "errmsg"); - if (string.IsNullOrEmpty(error)) - error = cateAuthorRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请错误 " + error + "\"}"; - } - } - } - } - - #endregion - - #region ai短标题 // ai获取短标题 - if (wxUploadRule.IsAiShortTitle || chkAiImage.Checked) - { - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成短标题"; - })); - } - - WXGetShortTitleParam titleParam = new WXGetShortTitleParam() - { - categories = new List(), - headImgUrls = upProdParam.product.info.headImg, - productTitle = upProdParam.product.info.title, - }; - foreach (var cate in upProdParam.product.info.category) - { - titleParam.categories.Add(new categorieParam() { catId = cate.catId, catName = cate.name }); - } - var shortTitleRst = WXUpload.genProductShortTitle(shop, titleParam); - if (!shortTitleRst.Contains("\"code\":0") && !shortTitleRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref shortTitleRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = shortTitleRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"短标题获取失败 " + error + "\"}"; - } - upProdParam.product.info.shortTitle = BaseRegex.GetStringJson(ref shortTitleRst, "shortTitle"); - upProdParam.product.info.aiGenShortTitle = upProdParam.product.info.shortTitle; - upProdParam.product.info.title = upProdParam.product.info.shortTitle + upProdParam.product.info.title; - } - #endregion - - #region 标题前缀,加在最前面 - if (!string.IsNullOrWhiteSpace(wxUploadRule.TitleHeadWords)) - upProdParam.product.info.title = wxUploadRule.TitleHeadWords + upProdParam.product.info.title; - #endregion - - #region 售后信息 - - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在选取售后属性"; - })); - } - - // 非上海仓退货 - if (!chkUseShanghaiReturnOrderAddress.Checked) - { - var afterSaleAddress = ""; - var afterSaleDetail = ""; - // 厂商直采获取售后地址用于处理售后单 - if (dbProd.product_get_type_text == "厂商直采") - { - - var urlAfterSale = BaseClass.BuildObjString("product/wx_get_after_sale"); - var dataAfterSale = Work.UserLogin.GetSignaturex(); - if (!string.IsNullOrEmpty(dbProd.real_coid)) - dataAfterSale += "&coid=" + dbProd.skc_id + "->" + dbProd.real_coid; - else - dataAfterSale += "&coid=" + dbProd.skc_id; - var htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); - if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) - htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); - if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) - { - - } - else - { - if (htmlAfterSale.Contains("\"data\":\"\"")) - { - } - else - { - try - { - afterSaleAddress = JsonHelper.SerializeObject(JsonHelper.JObjectParse(htmlAfterSale)["data"]); - } - catch - { - - } - } - } - - //{"address_id":null,"user_name":"退货","postal_code":null,"province_name":"广东省","city_name":"揭阳市","county_name":"榕城区","street_name":"东兴街道","detail_info":"建阳路万泰华庭二期对面眼镜","tel_number":"13024622251","number":"10431013","name":"麦多多供应链"} - //{"address_id":null,"user_name":"退货","postal_code":null,"province_name":"广东省","city_name":"揭阳市","county_name":"榕城区","street_name":"东兴街道","detail_info":"建阳路万泰华庭二期对面眼镜","tel_number":"13024622251","number":"10431013","name":"麦多多供应链"} - if (string.IsNullOrEmpty(afterSaleAddress)) - { - // 获取推单售后地址 - var urlAfter = BaseClass.BuildObjString("product/e57_after_sale"); - var dataAfter = Work.UserLogin.GetSignaturex() + "&coid=" + dbProd.skc_id; - var afterRst = GetHtml.PostUtf8(urlAfter, dataAfter); - try - { - afterSaleAddress = JsonHelper.SerializeObject(JsonHelper.JObjectParse(afterRst)["data"]); - if (afterRst.Contains("\"code\":0") && !string.IsNullOrEmpty(afterSaleAddress)) - { - urlAfterSale = BaseClass.BuildObjString("product/wx_add_mdy_after_sale"); - dataAfterSale = Work.UserLogin.GetSignaturex() + - "&coid=" + dbProd.skc_id + - "&after_sale_json=" + afterSaleAddress; - htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); - if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) - htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); - } - } - catch (Exception ex) - { - } - } - - if (string.IsNullOrEmpty(afterSaleAddress)) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址信息获取失败\"}"; - } - } - - // 官方库1688厂家数据必须有退货地址才能上传,用户自采数据使用店铺或默认退货地址 26.5.29 - // 官方库暂时也放开限制可以随意传 26.5.31 - else if (dbProd.product_get_type_text == "1688厂家" && dbProd.add_user_name == "admin" && 1 == 2) - { - var urlAfterSale = BaseClass.BuildObjString("product/wx_get_after_sale"); - var dataAfterSale = Work.UserLogin.GetSignaturex(); - dataAfterSale += "&coid=" + dbProd.from_shop_id; - var htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); - if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) - htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); - if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) - { - - } - else - { - if (htmlAfterSale.Contains("\"data\":\"\"")) - { - } - else - { - try - { - afterSaleAddress = JsonHelper.SerializeObject(JsonHelper.JObjectParse(htmlAfterSale)["data"]); - } - catch - { - - } - } - } - - if (string.IsNullOrEmpty(afterSaleAddress)) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址信息获取失败\"}"; - } - } - - else if (GlobalConfig.GlobalSettings.IsWxUseSoftwareDefaultAddress == true && !IsWxNotUseSoftwareDefaultAddressOnce) - { - if (GlobalConfig.WXShopDefaultAddressList.Any(a => a.shop_id == shop.ShopId)) - WXShopDefaultAddressListForm.GetShopDefaultAddress(new List() { shop }); - var address = GlobalConfig.WXShopDefaultAddressList.First(a => a.shop_id == shop.ShopId); - if (!address.isFullAddress) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"店铺地址信息获取失败\"}"; - afterSaleAddress = JsonHelper.SerializeObject(address); - } - - if (!string.IsNullOrEmpty(afterSaleAddress)) - { - afterSaleDetail = BaseRegex.GetStringJson(ref afterSaleAddress, "detail_info"); - if (string.IsNullOrEmpty(afterSaleDetail)) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址详细信息获取失败\"}"; - } - } - - var addressRst = WXUpload.getAddress(shop, afterSaleDetail); - if (!addressRst.Contains("\"code\":0") && !addressRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref addressRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = addressRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址获取失败 " + error + "\"}"; - } - if (addressRst.Contains("\"totalNum\":0") && !string.IsNullOrEmpty(afterSaleDetail)) - { - string provinceName = BaseRegex.GetStringJson(ref afterSaleAddress, "province_name"); - string cityName = BaseRegex.GetStringJson(ref afterSaleAddress, "city_name"); - string countyName = BaseRegex.GetStringJson(ref afterSaleAddress, "county_name"); - string detailInfo = afterSaleDetail; - string userName = BaseRegex.GetStringJson(ref afterSaleAddress, "user_name"); - string telNumber = BaseRegex.GetStringJson(ref afterSaleAddress, "tel_number"); - var addAddRst = WXUpload.addAddress(shop, provinceName, cityName, countyName, detailInfo, userName, telNumber); - - Thread.Sleep(Randomx.GetId(500, 1000)); - - addressRst = WXUpload.getAddress(shop, afterSaleDetail); - if (!addressRst.Contains("\"code\":0") && !addressRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref addressRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = addressRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址获取失败 " + error + "\"}"; - } - } - - if (addressRst.Contains("\"totalNum\":0")) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址获取失败\"}"; - } - - upProdParam.product.info.afterSaleInfo = new afterSaleInfoParam(); - upProdParam.product.info.afterSaleInfo.afterSaleAddressId = BaseRegex.GetStringJson(ref addressRst, "addressId"); - } - // 上海仓退货 - else - { - try - { - string addressId = ""; - string setAddressRst = WXProdNoCheckEditHelper.SetShanghaiReturnOrderAddress(shop); - if (setAddressRst.Contains("\"success\":true")) - { - addressId = WXProdNoCheckEditHelper.dicShopAddressId[shop.ShopId]; - } - else - { - var errmsg = BaseRegex.GetStringJson(ref setAddressRst, "msg"); - if (string.IsNullOrWhiteSpace(errmsg)) - errmsg = setAddressRst; - WXProdNoCheckEditHelper.dicShopAddressId.Remove(shop.ShopId); - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"退货地址指定失败:" + errmsg + "\"}"; - } - - upProdParam.product.info.afterSaleInfo = new afterSaleInfoParam(); - upProdParam.product.info.afterSaleInfo.afterSaleAddressId = addressId; - } - catch (Exception ex) - { - WXProdNoCheckEditHelper.dicShopAddressId.Remove(shop.ShopId); - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"退货地址指定失败:" + ex.Message + "\"}"; - } - } - #endregion - - // 厂商直采获取推单运费模板 - #region 获取推单运费模板,计算运费加价。 - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在选取运费模板"; - })); - } - - var shippingTemplateJson = ""; - var shipPrice = 0; - - if (dbProd.product_get_type_text == "厂商直采") - { - var urlShipping = BaseClass.BuildObjString("product/wx_get_shipping_template"); - var dataShipping = Work.UserLogin.GetSignaturex() + - "&coid=" + dbProd.skc_id; - var htmlShipping = GetHtml.PostUtf8(urlShipping, dataShipping); - if (string.IsNullOrEmpty(htmlShipping) || !htmlShipping.Contains("\"code\":200")) - htmlShipping = GetHtml.PostUtf8(urlShipping, dataShipping); - if (string.IsNullOrEmpty(htmlShipping) || !htmlShipping.Contains("\"code\":200")) - { - } - else - { - if (htmlShipping.Contains("\"data\":\"\"")) - { - } - else - { - try - { - shippingTemplateJson = JsonHelper.SerializeObject(JsonHelper.JObjectParse(htmlShipping)["data"]); - } - catch - { - - } - } - } - - if (string.IsNullOrEmpty(shippingTemplateJson)) - { - // 获取运费模板 - var urlShip = BaseClass.BuildObjString("product/e57_get_freight_template"); - var dataShip = Work.UserLogin.GetSignaturex() + "&coid=" + dbProd.skc_id; - var shipRst = GetHtml.PostUtf8(urlShip, dataShip); - if (string.IsNullOrEmpty(shipRst) || !shipRst.Contains("\"code\":0")) - shipRst = GetHtml.PostUtf8(urlShipping, dataShipping); - if (!shipRst.Contains("\"code\":0")) - { - var errMsg = BaseRegex.GetStringJson(ref shipRst, "msg"); - if (string.IsNullOrEmpty(errMsg)) - errMsg = shipRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 " + errMsg + "\"}"; - } - try - { - //[{"id":"204","warehouseNum":"15016108","freightType":0,"provinces":"香港特别行政区,台湾省,澳门特别行政区","freightPrice":9999900,"createBy":"vmslin","createTime":"2026-01-30T16:45:03+08:00","updateBy":"vmslin","updateTime":"2026-01-30T16:45:03+08:00"},{"id":"205","warehouseNum":"15016108","freightType":3,"provinces":"海南省,新疆维吾尔自治区,西藏自治区,内蒙古自治区","freightPrice":1530,"createBy":"vmslin","createTime":"2026-01-30T16:45:51+08:00","updateBy":"vmslin","updateTime":"2026-01-30T16:45:51+08:00"},{"id":"206","warehouseNum":"15016108","freightType":1,"provinces":"北京市,上海市","freightPrice":410,"createBy":"vmslin","createTime":"2026-01-30T16:46:04+08:00","updateBy":"vmslin","updateTime":"2026-01-30T16:46:04+08:00"},{"id":"207","warehouseNum":"15016108","freightType":1,"provinces":"安徽省,重庆市,福建省,广东省,甘肃省,广西壮族自治区,贵州省,河北省,湖北省,黑龙江省,河南省,湖南省,吉林省,江苏省,江西省,辽宁省,宁夏回族自治区,青海省,四川省,山东省,山西省,陕西省,天津市,云南省,浙江省","freightPrice":310,"createBy":"vmslin","createTime":"2026-01-30T16:46:17+08:00","updateBy":"vmslin","updateTime":"2026-01-30T16:46:17+08:00"}] - shippingTemplateJson = JsonHelper.SerializeObject(JsonHelper.JObjectParse(shipRst)["data"]); - if (shipRst.Contains("\"code\":0") && !string.IsNullOrEmpty(shippingTemplateJson)) - { - urlShipping = BaseClass.BuildObjString("product/wx_add_mdy_shipping_template"); - dataShipping = Work.UserLogin.GetSignaturex() + - "&coid=" + dbProd.skc_id + - "&shipping_template_json=" + shippingTemplateJson; - htmlShipping = GetHtml.PostUtf8(urlShipping, dataShipping); - if (string.IsNullOrEmpty(htmlShipping) || !htmlShipping.Contains("\"code\":200")) - htmlShipping = GetHtml.PostUtf8(urlShipping, dataShipping); - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板解析失败 " + ex.Message + "\"}"; - } - } - - if (!string.IsNullOrEmpty(shippingTemplateJson)) - { - try - { - int count = 0; - var shipObjs = JArray.Parse(shippingTemplateJson); - foreach (var shipObj in shipObjs) - { - var provincesStr = shipObj["provinces"].ParseToString(); - if (provincesStr.Split(',').Length > count) - { - count = provincesStr.Split(',').Length; - shipPrice = shipObj["freightPrice"].ParseToInt(); - } - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 " + ex.Message + "\"}"; - } - } - if (shipPrice <= 0) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 未获取到\"}"; - } - } - #endregion - - #region 获取店铺运费模板 - var expressRst = WXUpload.getFreightTemplate(shop); - if (!expressRst.Contains("\"code\":0") && !expressRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref expressRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = expressRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 " + error + "\"}"; - } - try - { - var addressArr = JsonHelper.JObjectParse(expressRst)["freightTemplateList"]; - foreach (var addressObj in addressArr) - { - var addressStr = JsonHelper.SerializeObject(addressObj); - if (addressObj["isDefault"].ParseToInt() == 1) - { - string templateId = addressObj["templateId"].ParseToString(); - upProdParam.product.info.expressInfo = new expressInfoParam(); - upProdParam.product.info.expressInfo.templateId = templateId; // BaseRegex.GetStringJson(ref expressRst, "templateId"); - break; - } - } - if (upProdParam.product.info.expressInfo == null) - { - upProdParam.product.info.expressInfo = new expressInfoParam(); - upProdParam.product.info.expressInfo.templateId = BaseRegex.GetStringJson(ref expressRst, "templateId"); - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 " + ex.Message + "\"}"; - } - #endregion - - #region 详情图 - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成商品详情"; - })); - } - Thread.Sleep(Randomx.GetId(100, 300)); - upProdParam.product.info.detail = new productDetailParam(); // 详情图 - var detailGalleries = prodInfo.detail.galleries.Where(g => g.type == 2).ToList(); - if (detailGalleries.Count == 0) - detailGalleries.Add(new gallery_item() { type = 2, url = prodInfo.detail.galleries.FirstOrDefault(g => g.type == 1)?.url }); - - foreach (var gallery_item in detailGalleries) - { - try - { - if (dbProd.product_get_type_text == "微信店采") - { - upProdParam.product.info.detail.detailImg.Add(gallery_item.url); - continue; - } - - // 获取缓存盗链 详情图 - if (wxImgMapDic.ContainsKey(BaseClass.GetMd5(gallery_item.url))) - { - upProdParam.product.info.detail.detailImg.Add(wxImgMapDic[BaseClass.GetMd5(gallery_item.url)]); - continue; - } - - if (needAddRandomBlock || wantAddRandomBlock || gallery_item.url.Contains("wst.wxapp.tc.qq.com")) - { - // 如果想打码或者需要打码,就走差异化详情图,不走api直传 - } - else - { - // 使用接口链接传详情图 - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - upDate += "&post_data=" + GetHtml.UrlEncodeUtf8("{\"img_url\":\"" + gallery_item.url.Replace("https://", "http://") + "\"}"); - - var sTime = DateTime.Now; - var upDateRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成商品详情图 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 20 && upDateRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - upDateRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref upDateRst, "img_url"); - if (upDateRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) - { - upProdParam.product.info.detail.detailImg.Add(upImgUrl); - wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl; - isChangeImgDic = true; - continue; - } - else - { - } - } - } - catch (Exception ex) - { - } - - // api上传图片文件 详情图 - if (1 == 1) - { - try - { - string errMsg = ""; - var imgBase64 = GetImgBase64ForApi(out errMsg, gallery_item.url, needAddRandomBlock, wantAddRandomBlock); - if (!string.IsNullOrEmpty(errMsg)) - { - return errMsg; - } - - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - //upDate += "&is_file=true"; - //if (needAddRandomBlock || wantAddRandomBlock) - // upDate += "&random_code=true"; - upDate += "&img_url=" + gallery_item.url; - upDate += "&img_base64=" + imgBase64; - - var sTime = DateTime.Now; - var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在上传商品详情图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); - if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) - { - upProdParam.product.info.detail.detailImg.Add(upImgUrl); - wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl; - isChangeImgDic = true; - continue; - } - else - { - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改详情图失败 " + ex.Message + "\"}"; - } - } - - // 模拟上传图片 - bool randomDrawBlock = false; - if (needAddRandomBlock || wantAddRandomBlock) - randomDrawBlock = true; - var locationStr = UploadImg(shop, gallery_item.url, cell, randomDrawBlock); - if (!locationStr.Contains("\"success\":true")) - return locationStr; - var location = BaseRegex.GetStringJson(ref locationStr, "Location"); - upProdParam.product.info.detail.detailImg.Add(location); - //wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = location; - //isChangeImgDic = true; - Thread.Sleep(Randomx.GetId(10, 50)); - } - #endregion - - #region 保存缓存盗链图片 - if (isChangeImgDic) - { - var url = BaseClass.BuildObjString("product/mdy_pdd_product"); - var data = ""; - Invoke(new Action(() => - { - data = UserLogin.GetSignaturex(); - data += "&spu_id=" + dbProd.spu_id; - data += "&wx_img_map_json=" + JsonHelper.SerializeObject(wxImgMapDic); - })); - var 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")) - html = GetHtml.PostUtf8(url, data); - isChangeImgDic = false; - } - #endregion - - WXUploadProductInfoRecommendParam recommendParamRst = new WXUploadProductInfoRecommendParam(); - if (chkUseRecommand.Checked) - { - WXUploadProductInfoRecommendParam recommendParam = new WXUploadProductInfoRecommendParam(); - //recommendParam.productId = upProdParam.product.productKey.productId; - recommendParam.predictTypeList = new List() { 5, 4, 2 }; - recommendParam.productInfo = new RecommendProductInfoParam(); - recommendParam.productInfo.title = upProdParam.product.info.title; - recommendParam.productInfo.headImg = new List(); - recommendParam.productInfo.headImg.AddRange(upProdParam.product.info.headImg); - recommendParam.productInfo.brandId = upProdParam.product.info.brandId.ParseToString(); - recommendParam.productInfo.category = JsonHelper.DeserializeJsonToList(JsonHelper.SerializeObject(upProdParam.product.info.category)); - recommendParam.productInfo.detail = new productDetailParam(); //JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(upProdParam.product.info.detail)); - var recommendRst = WXUpload.generalProductInfoRecommend(shop, recommendParam); - if (recommendRst.Contains("\"code\":0")) - { - recommendParamRst = JsonHelper.DeserializeJsonToObject(recommendRst); - } - } - if (recommendParamRst.productInfo == null) - recommendParamRst.productInfo = new RecommendProductInfoParam(); - if (recommendParamRst.productInfo.param == null) - recommendParamRst.productInfo.param = new List(); - - #region 匹配产品属性 - //真丝、蚕丝、香云纱、羊绒、羊毛、羊羔毛、羽绒、皮草 - upProdParam.product.info.param = new List(); // 商品属性值 - var productAttr = upProdParam.product.info.category.LastOrDefault().catInfo.productAttr; - - // 直接转换微信回采 - if (BaseClass.UserAuthority.ParseToString().Contains("微信回采") && chkUseWXComplateProd.Checked && dbProd.has_wx_format == "1" && wxEditProdInfo != null) - { - foreach (var wxEditPropParam in wxEditProdInfo.product.info.param) - { - var wxPropParam = new wxPropParam(); - upProdParam.product.info.param.Add(wxPropParam); - foreach (var wxEditCategoryParam in wxEditPropParam.categorys) - { - var wxCategoryParam = new categoryPropParam() - { - catType = wxEditCategoryParam.catType, - name = wxEditCategoryParam.name, - catInfo = new catInfoParam() - { - inputType = wxEditCategoryParam.catInfo.inputType, - isRequired = wxEditCategoryParam.catInfo.isRequired, - isCustomize = wxEditCategoryParam.catInfo.isCustomize, - } - }; - wxPropParam.categorys.Add(wxCategoryParam); - } - } - } - // 直接转换微信店采 - else if (dbProd.product_get_type_text == "微信店采") - { - foreach (var wxEditPropParam in wxEditProdInfo.product.info.param) - { - var wxPropParam = new wxPropParam(); - upProdParam.product.info.param.Add(wxPropParam); - foreach (var wxEditCategoryParam in wxEditPropParam.categorys) - { - // 修改书名 - if (wxEditPropParam.categorys.FirstOrDefault().name == "书名" && wxEditCategoryParam == wxEditPropParam.categorys.LastOrDefault()) - { - wxEditCategoryParam.name = prodTitle; - } - var wxCategoryParam = new categoryPropParam() - { - catType = wxEditCategoryParam.catType, - name = wxEditCategoryParam.name, - catInfo = new catInfoParam() - { - inputType = wxEditCategoryParam?.catInfo?.inputType, - isRequired = wxEditCategoryParam?.catInfo?.isRequired, - isCustomize = wxEditCategoryParam?.catInfo?.isCustomize, - } - }; - wxPropParam.categorys.Add(wxCategoryParam); - } - } - } - else - { - foreach (var propInfo in prodInfo.property.goods_properties) - { - if (propInfo.name == "容量") - { - - } - if (propInfo.name == "格数") - { - - } - if (propInfo.values.Count == 0) - continue; - - - var attr = productAttr.attr.FirstOrDefault(r => r.name == propInfo.name); - if (attr == null) - attr = productAttr.attr.FirstOrDefault(r => r.name.Replace("填充材料", "填充材质") == propInfo.name || - r.name.Replace("材质", "材质种类") == propInfo.name); - // 材质 产品名称 适用年龄 面料 生产企业名称 CCC证书编号 尺寸(长) 尺寸(宽) 尺寸(高) 物品(含配件)清单 型号 产品名称 - if (propInfo.name == "生产日期" && propInfo.values.Count > 0) - { - propInfo.values.FirstOrDefault().value = DateTime.Now.Date.AddDays(-15).ToString("yyyy-MM-dd"); - propInfo.values.FirstOrDefault().raw_value = propInfo.values.FirstOrDefault().value; - } - if (attr == null) - { - if (propInfo.name.Contains("面料俗称")) - { - attr = productAttr.attr.FirstOrDefault(r => r.name == "面料材质"); - } - if (propInfo.name.Contains("适用年龄")) - { - attr = productAttr.attr.FirstOrDefault(r => r.name == "适用年龄" || r.name == "适用年龄段"); - } - if (propInfo.name.Contains("填充物")) - { - attr = productAttr.attr.FirstOrDefault(r => r.name == "填充物种类" || r.name == "填充物"); - } - - // 书籍类目属性匹配 - if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") - { - if (propInfo.name == "出版社名称") - attr = productAttr.attr.FirstOrDefault(r => r.name == "出版社名称"); - else if ((propInfo.name == "ISBN编号" || propInfo.name == "书号") && !prodInfo.property.goods_properties.Any(p => p.name == "ISBN版号/CN刊号")) - attr = productAttr.attr.FirstOrDefault(r => r.name == "ISBN版号/CN刊号"); - else if (propInfo.name == "书名") - attr = productAttr.attr.FirstOrDefault(r => r.name == "书名"); - else if (propInfo.name == "定价") - attr = productAttr.attr.FirstOrDefault(r => r.name == "定价"); - else if (propInfo.name == "作者") - attr = productAttr.attr.FirstOrDefault(r => r.name == "作者"); - else if (propInfo.name == "出版时间") - attr = productAttr.attr.FirstOrDefault(r => r.name == "出版时间"); - else if (propInfo.name == "版次") - attr = productAttr.attr.FirstOrDefault(r => r.name == "版次"); - else if (propInfo.name == "装帧类型") - attr = productAttr.attr.FirstOrDefault(r => r.name == "包装"); - else if (propInfo.name == "包册数") - attr = productAttr.attr.FirstOrDefault(r => r.name == "图书册数"); - } - if (upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料") - { - if (propInfo.name == "厂名") - attr = productAttr.attr.FirstOrDefault(r => r.name == "生产企业名称"); - else if (propInfo.name == "食品生产许可证编号") - attr = productAttr.attr.FirstOrDefault(r => r.name == "食品生产许可证编号"); - else if (propInfo.name == "产品标准号") - attr = productAttr.attr.FirstOrDefault(r => r.name == "产品标准号"); - else if (propInfo.name == "保质期") - attr = productAttr.attr.FirstOrDefault(r => r.name == "保质期"); - else if (propInfo.name == "生产日期") - { - attr = productAttr.attr.FirstOrDefault(r => r.name == "生产日期"); - } - else if (propInfo.name == "产品重量") - { - attr = productAttr.attr.FirstOrDefault(r => r.name == "单件净含量"); - if (attr == null) - attr = productAttr.attr.FirstOrDefault(r => r.name == "净含量"); - } - else if (propInfo.name == "包装方式") - attr = productAttr.attr.FirstOrDefault(r => r.name == "包装方式"); - //else if (propInfo.name == "配料表") - // attr = productAttr.attr.FirstOrDefault(r => r.name == "配料表"); - //else if (propInfo.name == "联系方式") - // attr = productAttr.attr.FirstOrDefault(r => r.name == "联系方式"); - else if (propInfo.name == "厂址") - attr = productAttr.attr.FirstOrDefault(r => r.name == "地址"); - else if (propInfo.name == "储藏方法") - attr = productAttr.attr.FirstOrDefault(r => r.name == "贮存条件"); - } - } - if (attr == null) - { - continue; - } - var attrValueLst = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).ToList(); - var attrValue = attrValueLst.FirstOrDefault(v => v == propInfo.values.FirstOrDefault()?.value); - if (attrValue.IsNullOrEmpty()) - attrValue = attrValueLst.FirstOrDefault(v => v.Replace("高硼硅玻璃", "耐热玻璃(高硼硅)") == propInfo.values.FirstOrDefault()?.value); - if (propInfo.name == "保质期") - { - attrValue = "30 天"; - if (propInfo.values.Count > 0) - { - if (propInfo.values.FirstOrDefault().value.Contains("年") || propInfo.values.FirstOrDefault().value.Contains("月") - || propInfo.values.FirstOrDefault().value.Contains("日") || propInfo.values.FirstOrDefault().value.Contains("天") - || propInfo.values.FirstOrDefault().value.Contains("见包装")) - { - attrValue = propInfo.values.FirstOrDefault().value; - } - if (attrValue.Contains("天") && attrValue.Replace("天", "").ParseToInt() < 30) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"食品保质期小于30天,跳过上传\"}"; - } - } - } - - if (propInfo.name == "产品重量") - { - attrValue = "10g"; - if (propInfo.values.FirstOrDefault().value.Contains("g") || propInfo.values.FirstOrDefault().value.Contains("kg")) - attrValue = propInfo.values.FirstOrDefault().value; - } - if (propInfo.name == "风格" && attrValue == null) - { - attrValue = attrValueLst.FirstOrDefault(v => v == propInfo.values.FirstOrDefault().value + "风"); - } - if (attr.type == "string") - { - attrValue = propInfo.values.FirstOrDefault()?.value; - } - //书籍属性处理 - if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") - { - // 修改书名 作者 - if (attr.name == "书名" /*&& dbProd.product_get_type_text == "微信小店"*/) - { - attrValue = prodTitle; - } - if (attr.name == "作者" && attrValue == "无") - { - attrValue = new List() { "赵老师", "钱老师", "孙老师", "李老师", "周老师", "吴老师", "郑老师", "王老师", "张老师", "孙老师", "刘老师" }.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); - attrValue = "无"; - } - - if (attrValue.IsNullOrEmpty() && attr.type == "integer_unit" && (propInfo.values.FirstOrDefault()?.value).IsNumber()) - { - attrValue = propInfo.values.FirstOrDefault()?.value + " " + attr.value.Split(';').FirstOrDefault(); - } - if (attrValue.IsNullOrEmpty() && attr.name == "包装") - { - if (propInfo.values.FirstOrDefault()?.value == "平装-胶订") - attrValue = "平装"; - } - } - // 强制改为国产 - { - if (attrValueLst.Contains("国产")) - attrValue = "国产"; - else if (attr.name == "是否进口") - { - attrValue = "非进口"; - if (attr.value == "是;否") - attrValue = "否"; - } - else if (attr.name == "商品产地") - { - attrValue = "中国大陆"; - } - else if (attr.name == "产地") - { - if (attr.type == "select_one") - { - //北京;天津;上海;重庆;河北石家庄;河北唐山;河北秦皇岛;河北邯郸;河北邢台;河北保定;河北张家口;河北承德;河北沧州;河北廊坊;河北衡水;山西太原;山西大同;山西阳泉;山西长治;山西晋城;山西朔州;山西晋中;山西运城;山西忻州;山西临汾;山西吕梁;内蒙古呼和浩特;内蒙古包头;内蒙古乌海;内蒙古赤峰;内蒙古通辽;内蒙古鄂尔多斯;内蒙古呼伦贝尔;内蒙古巴彦淖尔;内蒙古乌兰察布;内蒙古兴安;内蒙古锡林郭勒;内蒙古阿拉善;辽宁沈阳;辽宁大连;辽宁鞍山;辽宁抚顺;辽宁本溪;辽宁丹东;辽宁锦州;辽宁营口;辽宁阜新;辽宁辽阳;辽宁盘锦;辽宁铁岭;辽宁朝阳;辽宁葫芦岛;吉林长春;吉林吉林;吉林四平;吉林辽源;吉林通化;吉林白山;吉林松原;吉林白城;吉林延边;黑龙江哈尔滨;黑龙江齐齐哈尔;黑龙江鸡西;黑龙江鹤岗;黑龙江双鸭山;黑龙江大庆;黑龙江伊春;黑龙江佳木斯;黑龙江七台河;黑龙江牡丹江;黑龙江黑河;黑龙江绥化;黑龙江大兴安岭;江苏南京;江苏无锡;江苏徐州;江苏常州;江苏苏州;江苏南通;江苏连云港;江苏淮安;江苏盐城;江苏扬州;江苏镇江;江苏泰州;江苏宿迁;浙江杭州;浙江宁波;浙江温州;浙江嘉兴;浙江湖州;浙江绍兴;浙江金华;浙江衢州;浙江舟山;浙江台州;浙江丽水;安徽合肥;安徽芜湖;安徽蚌埠;安徽淮南;安徽马鞍山;安徽淮北;安徽铜陵;安徽安庆;安徽黄山;安徽滁州;安徽阜阳;安徽宿州;安徽六安;安徽亳州;安徽池州;安徽宣城;福建福州;福建厦门;福建莆田;福建三明;福建泉州;福建漳州;福建南平;福建龙岩;福建宁德;江西南昌;江西景德镇;江西萍乡;江西九江;江西新余;江西鹰潭;江西赣州;江西吉安;江西宜春;江西抚州;江西上饶;山东济南;山东青岛;山东淄博;山东枣庄;山东东营;山东烟台;山东潍坊;山东济宁;山东泰安;山东威海;山东日照;山东临沂;山东德州;山东聊城;山东滨州;山东菏泽;河南郑州;河南开封;河南洛阳;河南平顶山;河南安阳;河南鹤壁;河南新乡;河南焦作;河南濮阳;河南许昌;河南漯河;河南三门峡;河南南阳;河南商丘;河南信阳;河南周口;河南驻马店;河南济源;湖北武汉;湖北黄石;湖北十堰;湖北宜昌;湖北襄阳;湖北鄂州;湖北荆门;湖北孝感;湖北荆州;湖北黄冈;湖北咸宁;湖北随州;湖北恩施;湖北仙桃;湖北潜江;湖北天门;湖北神农架;湖南长沙;湖南株洲;湖南湘潭;湖南衡阳;湖南邵阳;湖南岳阳;湖南常德;湖南张家界;湖南益阳;湖南郴州;湖南永州;湖南怀化;湖南娄底;湖南湘西;广东广州;广东韶关;广东深圳;广东珠海;广东汕头;广东佛山;广东江门;广东湛江;广东茂名;广东肇庆;广东惠州;广东梅州;广东汕尾;广东河源;广东阳江;广东清远;广东东莞;广东中山;广东潮州;广东揭阳;广东云浮;广西南宁;广西柳州;广西桂林;广西梧州;广西北海;广西防城港;广西钦州;广西贵港;广西玉林;广西百色;广西贺州;广西河池;广西来宾;广西崇左;海南海口;海南三亚;海南三沙;海南儋州;海南五指山;海南琼海;海南文昌;海南万宁;海南东方;海南定安;海南屯昌;海南澄迈;海南临高;海南白沙;海南昌江;海南乐东;海南陵水;海南保亭;海南琼中;四川成都;四川自贡;四川攀枝花;四川泸州;四川德阳;四川绵阳;四川广元;四川遂宁;四川内江;四川乐山;四川南充;四川眉山;四川宜宾;四川广安;四川达州;四川雅安;四川巴中;四川资阳;四川阿坝;四川甘孜;四川凉山;贵州贵阳;贵州六盘水;贵州遵义;贵州安顺;贵州毕节;贵州铜仁;贵州黔西南;贵州黔东南;贵州黔南;云南昆明;云南曲靖;云南玉溪;云南保山;云南昭通;云南丽江;云南普洱;云南临沧;云南楚雄;云南红河;云南文山;云南西双版纳;云南大理;云南德宏;云南怒江;云南迪庆;西藏拉萨;西藏日喀则;西藏昌都;西藏林芝;西藏山南;西藏那曲;西藏阿里;陕西西安;陕西铜川;陕西宝鸡;陕西咸阳;陕西渭南;陕西延安;陕西汉中;陕西榆林;陕西安康;陕西商洛;甘肃兰州;甘肃嘉峪关;甘肃金昌;甘肃白银;甘肃天水;甘肃武威;甘肃张掖;甘肃平凉;甘肃酒泉;甘肃庆阳;甘肃定西;甘肃陇南;甘肃临夏;甘肃甘南;青海西宁;青海海东;青海海北;青海黄南;青海海南;青海果洛;青海玉树;青海海西;宁夏银川;宁夏石嘴山;宁夏吴忠;宁夏固原;宁夏中卫;新疆乌鲁木齐;新疆克拉玛依;新疆吐鲁番;新疆哈密;新疆昌吉;新疆博尔塔拉;新疆巴音郭楞;新疆阿克苏;新疆克孜勒苏;新疆喀什;新疆和田;新疆伊犁;新疆塔城;新疆阿勒泰;新疆石河子;新疆阿拉尔;新疆图木舒克;新疆五家渠;新疆北屯;新疆铁门关;新疆双河;新疆可克达拉;新疆昆玉;新疆胡杨河;新疆新星;新疆白杨 - //北京;天津;上海;重庆;河北;山西;内蒙古;辽宁;吉林;黑龙江;江苏;浙江;安徽;福建;江西;山东;河南;湖北;湖南;广东;广西;海南;四川;贵州;云南;西藏;陕西;甘肃;青海;宁夏;新疆 - var values = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).OrderBy(x => Guid.NewGuid()).ToList(); - if (values.Contains("中国大陆")) - attrValue = "中国大陆"; - else - { - var value = values.FirstOrDefault(v => prodTitle.ParseToString().Contains(v)); - if (value == null) - value = values.FirstOrDefault(v => prodTitle.ParseToString().Contains(string.Join("", v.Take(2)))); - if (value == null) - value = values.FirstOrDefault(v => "北京;天津;上海;重庆;河北;山西;内蒙古;辽宁;吉林;黑龙江;江苏;浙江;安徽;福建;江西;山东;河南;湖北;湖南;广东;广西;海南;四川;贵州;云南;西藏;陕西;甘肃;青海;宁夏;新疆".Contains(string.Join("", v.Take(2)))); - attrValue = value; - } - } - else - { - attrValue = "中国大陆"; - } - } - } - // 强制非收藏品 - { - if (attrValueLst.Contains("是否具有拍卖/收藏价值")) - { - attrValue = "不具有"; - } - if (attrValueLst.Contains("是否批量生产(孤品)")) - { - attrValue = "批量生产"; - } - } - if (attrValue.IsNullOrEmpty() && attr.isRequired == true) - { - if (attrValueLst.Contains("其他")) - attrValue = "其他"; - else if (attrValueLst.Contains("常规")) - attrValue = "常规"; - else if (attrValueLst.Contains("通用")) - attrValue = "通用"; - else if (attr.value.Contains("绒丝;羽毛;白鸭绒;白鹅绒;灰鸭绒;灰鹅绒;鸭毛片;鹅毛片")) - { - attrValue = "绒丝"; - } - //else if (attrValueLst.Any(v => v.Contains("%"))) - //{ - // attrValue = attrValueLst.FirstOrDefault(); - //} - else - attrValue = attrValueLst.Where(v => !"真丝、蚕丝、香云纱、羊绒、羊毛、羊羔绒、羊羔毛、羽绒、皮草".Contains(v)).OrderBy(x => Guid.NewGuid()).FirstOrDefault(); - } - if (attrValue.IsNullOrEmpty()) - { - if (attrValueLst.Contains("其他")) - attrValue = "其他"; - else if (attrValueLst.Contains("通用")) - attrValue = "通用"; - } - if (attrValue.IsNullOrEmpty() && attr.type == "string") - { - attrValue = propInfo.values.FirstOrDefault()?.value; - } - if (attr.type == "decimal4_unit" || attr.type == "integer_unit") - { - if (attr.value == "%") - attrValue = "1 %"; - else if (attr.value == "g;kg") - attrValue = "50 g"; - else if (attr.value == "g") - attrValue = "10 g"; - else if (attr.value == "kg") - attrValue = "1 kg"; - //else if (attr.value == "g;kg;ml;L") - // attrValue = "100 g"; - else if (attr.value == "cm") - { - var propValue = propInfo.values.FirstOrDefault()?.value; - var match = BaseRegex.GetMatchRegexString(ref propValue, @"([\d]{1,4})cm"); - if (!string.IsNullOrEmpty(match)) - { - attrValue = match + " cm"; - } - } - else if (attr.value == "mm") - { - var propValue = propInfo.values.FirstOrDefault()?.value; - var match = BaseRegex.GetMatchRegexString(ref propValue, @"([\d]{1,4})mm"); - if (!string.IsNullOrEmpty(match)) - { - attrValue = match + " mm"; - } - } - else if (attr.value.Contains("岁以上") && attr.value.Contains("个月以上")) - { - attrValue = "7 岁以上"; - if (propInfo.values.FirstOrDefault().value.Contains("岁以上") || propInfo.values.FirstOrDefault().value.Contains("个月以上")) - attrValue = propInfo.values.FirstOrDefault().value; - if (propInfo.values.FirstOrDefault().value.Contains("岁")) - { - var propValue = propInfo.values.FirstOrDefault().value; - var match = BaseRegex.GetMatchRegexString(ref propValue, @"([\d]{1,3})"); - if (!string.IsNullOrEmpty(match)) - { - attrValue = match + " 岁以上"; - } - } - else if (propInfo.values.FirstOrDefault().value.Contains("月")) - { - var propValue = propInfo.values.FirstOrDefault().value; - var match = BaseRegex.GetMatchRegexString(ref propValue, @"([\d]{1,3})"); - if (!string.IsNullOrEmpty(match)) - { - attrValue = match + " 个月以上"; - } - } - } - else if (attr.value == "个") - { - if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith("个")) - { - attrValue = propInfo.values.FirstOrDefault()?.value; - if (attrValue.TrimEnd('个').ParseToInt() == 0) - attrValue = BaseRegex.GetMatchMaxRegexString(ref attrValue, "(\\d{1,6})") + (attrValue.Contains("只") ? " 只" : " 个"); - if (attrValue.TrimEnd('个').ParseToInt() == 0) - attrValue = "1 个"; - } - else - attrValue = "1 个"; - } - else if (attr.value == "只;个") - { - if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith("只") || (propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith("个")) - { - attrValue = propInfo.values.FirstOrDefault()?.value; - if (attrValue.TrimEnd('只', '个').ParseToInt() == 0) - attrValue = BaseRegex.GetMatchMaxRegexString(ref attrValue, "(\\d{1,6})") + (attrValue.Contains("只") ? " 只" : " 个"); - if (attrValue.TrimEnd('只', '个').ParseToInt() == 0) - attrValue = "1 个"; - } - else - attrValue = "1 个"; - } - else if (attr.value == "ml") - { - if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith(attr.value)) - attrValue = propInfo.values.FirstOrDefault()?.value.TrimStart('-', ' '); - else - attrValue = "100 ml"; - } - else if (attr.value == "L") - { - if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith(attr.value)) - { - attrValue = propInfo.values.FirstOrDefault()?.value; - if (attrValue.TrimEnd('L').ParseToInt() == 0) - attrValue = BaseRegex.GetMatchMaxRegexString(ref attrValue, "(\\d{1,6})") + " L"; - if (attrValue.TrimEnd('L').ParseToInt() == 0) - attrValue = "1 L"; - } - else - attrValue = "1 L"; - } - else if (attr.value == "g;kg;ml;L") - { - var propInfoValue = (propInfo.values.FirstOrDefault()?.value).ParseToString(); - if (propInfoValue.EndsWith("g") || propInfoValue.EndsWith("kg") || propInfoValue.EndsWith("ml") || propInfoValue.EndsWith("L")) - attrValue = propInfo.values.FirstOrDefault()?.value; - else - attrValue = "100 g"; - } - else if (attr.value == "日;月;年") - { - var propInfoValue = (propInfo.values.FirstOrDefault()?.value).ParseToString(); - if (propInfoValue.EndsWith("日") || propInfoValue.EndsWith("月") || propInfoValue.EndsWith("年")) - attrValue = propInfo.values.FirstOrDefault()?.value + propInfoValue.LastOrDefault(); - else - attrValue = "30 日"; - } - else if (attr.value.ParseToString().Length > 0 && !attr.value.ParseToString().Contains(";")) - { - if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith(attr.value)) - { - attrValue = propInfo.values.FirstOrDefault()?.value; - if (attrValue.Substring(0, attrValue.Length - attr.value.Length - 1).ParseToInt() == 0) - attrValue = BaseRegex.GetMatchMaxRegexString(ref attrValue, "(\\d{1,6})") + " " + attr.value; - if (attrValue.Substring(0, attrValue.Length - attr.value.Length - 1).ParseToInt() == 0) - attrValue = "1 " + attr.value; - } - else - attrValue = "1 " + attr.value; - } - else - { - var param = recommendParamRst.productInfo.param.FirstOrDefault(p => p.categorys?.FirstOrDefault()?.name == attr.name); - if (param != null && param.categorys.Count == 2) - { - attrValue = param.categorys[1].name; - if (attrValue.Contains("磅") && attrValue.Replace("磅", "").ParseToDecimal() > 0) - { - if ((";" + attr.value + ";").Contains(";g;")) - attrValue = (attrValue.Replace("磅", "").ParseToDecimal() * 454).ParseToInt() + "g"; - else if ((";" + attr.value + ";").Contains(";kg;")) - attrValue = (attrValue.Replace("磅", "").ParseToDecimal() * 0.454m).ParseToDecimal() + "kg"; - } - } - else - { - attrValue = propInfo.values.FirstOrDefault()?.value.ParseToString(); - var units = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); - foreach (var unit in units) - { - var val = attrValue.Replace(unit, "").Trim(); - if (attr.type == "decimal4_unit" && val.ParseToDecimal() != 0m) - { - attrValue = val + " " + unit; - break; - } - if (attr.type == "integer_unit" && val.ParseToInt() != 0) - { - attrValue = val + " " + unit; - break; - } - } - } - } - } - - if (string.IsNullOrEmpty(attrValue)) - continue; - - var wxPropParam = new wxPropParam(); - upProdParam.product.info.param.Add(wxPropParam); - var wxCategoryParam1 = new categoryPropParam() - { - catType = 7, - name = attr.name, - catInfo = new catInfoParam() { inputType = attr.normalRelease.ruleType, isRequired = attr.isRequired == true ? 1 : 0, isCustomize = 0 } - }; - var wxCategoryParam2 = new categoryPropParam() - { - catType = 7, - name = attrValue, - catInfo = new catInfoParam() { inputType = attr.normalRelease.ruleType, isRequired = attr.isRequired == true ? 1 : 0, isCustomize = 0 } - }; - wxPropParam.categorys.Add(wxCategoryParam1); - wxPropParam.categorys.Add(wxCategoryParam2); - } - } - foreach (var wxPropParam in upProdParam.product.info.param) - { - if (wxPropParam.categorys.Count > 0 && - wxPropParam.categorys.FirstOrDefault().name == "作者" && (wxPropParam.categorys.LastOrDefault().name == "无" || - wxPropParam.categorys.LastOrDefault().name == "-" || wxPropParam.categorys.LastOrDefault().name == "/")) - { - wxPropParam.categorys.LastOrDefault().name = upProdParam.product.info.param.FirstOrDefault(p => p.categorys.FirstOrDefault()?.name == "出版社名称").categorys.LastOrDefault()?.name; - } - } - - foreach (var attr in productAttr.attr) - { - if (attr.isRequired != true) - continue; - // 已填写内没有但是必填属性 - if (upProdParam.product.info.param.Any(p => p.categorys.FirstOrDefault()?.name == attr.name)) - continue; - - var attrValueLst = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).ToList(); - string attrValue = ""; - if (attrValue.IsNullOrEmpty() && attr.isRequired == true) - { - if (attrValueLst.Contains("其他")) - attrValue = "其他"; - else if (attrValueLst.Contains("常规")) - attrValue = "常规"; - else if (attrValueLst.Contains("通用")) - attrValue = "通用"; - else if (attrValueLst.Contains("国产")) - attrValue = "国产"; - else if (attr.value.Contains("绒丝;羽毛;白鸭绒;白鹅绒;灰鸭绒;灰鹅绒;鸭毛片;鹅毛片")) - { - attrValue = "绒丝"; - } - else if (attr.name == "是否进口") - { - attrValue = "非进口"; - if (attr.value == "是;否") - attrValue = "否"; - } - else if (attr.name == "商品产地") - { - attrValue = "中国大陆"; - } - else if (attr.name == "产地") - { - if (attr.type == "select_one") - { - //北京;天津;上海;重庆;河北石家庄;河北唐山;河北秦皇岛;河北邯郸;河北邢台;河北保定;河北张家口;河北承德;河北沧州;河北廊坊;河北衡水;山西太原;山西大同;山西阳泉;山西长治;山西晋城;山西朔州;山西晋中;山西运城;山西忻州;山西临汾;山西吕梁;内蒙古呼和浩特;内蒙古包头;内蒙古乌海;内蒙古赤峰;内蒙古通辽;内蒙古鄂尔多斯;内蒙古呼伦贝尔;内蒙古巴彦淖尔;内蒙古乌兰察布;内蒙古兴安;内蒙古锡林郭勒;内蒙古阿拉善;辽宁沈阳;辽宁大连;辽宁鞍山;辽宁抚顺;辽宁本溪;辽宁丹东;辽宁锦州;辽宁营口;辽宁阜新;辽宁辽阳;辽宁盘锦;辽宁铁岭;辽宁朝阳;辽宁葫芦岛;吉林长春;吉林吉林;吉林四平;吉林辽源;吉林通化;吉林白山;吉林松原;吉林白城;吉林延边;黑龙江哈尔滨;黑龙江齐齐哈尔;黑龙江鸡西;黑龙江鹤岗;黑龙江双鸭山;黑龙江大庆;黑龙江伊春;黑龙江佳木斯;黑龙江七台河;黑龙江牡丹江;黑龙江黑河;黑龙江绥化;黑龙江大兴安岭;江苏南京;江苏无锡;江苏徐州;江苏常州;江苏苏州;江苏南通;江苏连云港;江苏淮安;江苏盐城;江苏扬州;江苏镇江;江苏泰州;江苏宿迁;浙江杭州;浙江宁波;浙江温州;浙江嘉兴;浙江湖州;浙江绍兴;浙江金华;浙江衢州;浙江舟山;浙江台州;浙江丽水;安徽合肥;安徽芜湖;安徽蚌埠;安徽淮南;安徽马鞍山;安徽淮北;安徽铜陵;安徽安庆;安徽黄山;安徽滁州;安徽阜阳;安徽宿州;安徽六安;安徽亳州;安徽池州;安徽宣城;福建福州;福建厦门;福建莆田;福建三明;福建泉州;福建漳州;福建南平;福建龙岩;福建宁德;江西南昌;江西景德镇;江西萍乡;江西九江;江西新余;江西鹰潭;江西赣州;江西吉安;江西宜春;江西抚州;江西上饶;山东济南;山东青岛;山东淄博;山东枣庄;山东东营;山东烟台;山东潍坊;山东济宁;山东泰安;山东威海;山东日照;山东临沂;山东德州;山东聊城;山东滨州;山东菏泽;河南郑州;河南开封;河南洛阳;河南平顶山;河南安阳;河南鹤壁;河南新乡;河南焦作;河南濮阳;河南许昌;河南漯河;河南三门峡;河南南阳;河南商丘;河南信阳;河南周口;河南驻马店;河南济源;湖北武汉;湖北黄石;湖北十堰;湖北宜昌;湖北襄阳;湖北鄂州;湖北荆门;湖北孝感;湖北荆州;湖北黄冈;湖北咸宁;湖北随州;湖北恩施;湖北仙桃;湖北潜江;湖北天门;湖北神农架;湖南长沙;湖南株洲;湖南湘潭;湖南衡阳;湖南邵阳;湖南岳阳;湖南常德;湖南张家界;湖南益阳;湖南郴州;湖南永州;湖南怀化;湖南娄底;湖南湘西;广东广州;广东韶关;广东深圳;广东珠海;广东汕头;广东佛山;广东江门;广东湛江;广东茂名;广东肇庆;广东惠州;广东梅州;广东汕尾;广东河源;广东阳江;广东清远;广东东莞;广东中山;广东潮州;广东揭阳;广东云浮;广西南宁;广西柳州;广西桂林;广西梧州;广西北海;广西防城港;广西钦州;广西贵港;广西玉林;广西百色;广西贺州;广西河池;广西来宾;广西崇左;海南海口;海南三亚;海南三沙;海南儋州;海南五指山;海南琼海;海南文昌;海南万宁;海南东方;海南定安;海南屯昌;海南澄迈;海南临高;海南白沙;海南昌江;海南乐东;海南陵水;海南保亭;海南琼中;四川成都;四川自贡;四川攀枝花;四川泸州;四川德阳;四川绵阳;四川广元;四川遂宁;四川内江;四川乐山;四川南充;四川眉山;四川宜宾;四川广安;四川达州;四川雅安;四川巴中;四川资阳;四川阿坝;四川甘孜;四川凉山;贵州贵阳;贵州六盘水;贵州遵义;贵州安顺;贵州毕节;贵州铜仁;贵州黔西南;贵州黔东南;贵州黔南;云南昆明;云南曲靖;云南玉溪;云南保山;云南昭通;云南丽江;云南普洱;云南临沧;云南楚雄;云南红河;云南文山;云南西双版纳;云南大理;云南德宏;云南怒江;云南迪庆;西藏拉萨;西藏日喀则;西藏昌都;西藏林芝;西藏山南;西藏那曲;西藏阿里;陕西西安;陕西铜川;陕西宝鸡;陕西咸阳;陕西渭南;陕西延安;陕西汉中;陕西榆林;陕西安康;陕西商洛;甘肃兰州;甘肃嘉峪关;甘肃金昌;甘肃白银;甘肃天水;甘肃武威;甘肃张掖;甘肃平凉;甘肃酒泉;甘肃庆阳;甘肃定西;甘肃陇南;甘肃临夏;甘肃甘南;青海西宁;青海海东;青海海北;青海黄南;青海海南;青海果洛;青海玉树;青海海西;宁夏银川;宁夏石嘴山;宁夏吴忠;宁夏固原;宁夏中卫;新疆乌鲁木齐;新疆克拉玛依;新疆吐鲁番;新疆哈密;新疆昌吉;新疆博尔塔拉;新疆巴音郭楞;新疆阿克苏;新疆克孜勒苏;新疆喀什;新疆和田;新疆伊犁;新疆塔城;新疆阿勒泰;新疆石河子;新疆阿拉尔;新疆图木舒克;新疆五家渠;新疆北屯;新疆铁门关;新疆双河;新疆可克达拉;新疆昆玉;新疆胡杨河;新疆新星;新疆白杨 - //北京;天津;上海;重庆;河北;山西;内蒙古;辽宁;吉林;黑龙江;江苏;浙江;安徽;福建;江西;山东;河南;湖北;湖南;广东;广西;海南;四川;贵州;云南;西藏;陕西;甘肃;青海;宁夏;新疆 - var values = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).OrderBy(x => Guid.NewGuid()).ToList(); - if (values.Contains("中国大陆")) - attrValue = "中国大陆"; - else - { - var value = values.FirstOrDefault(v => prodTitle.ParseToString().Contains(v)); - if (value == null) - value = values.FirstOrDefault(v => prodTitle.ParseToString().Contains(string.Join("", v.Take(2)))); - if (value == null) - value = values.FirstOrDefault(v => "北京;天津;上海;重庆;河北;山西;内蒙古;辽宁;吉林;黑龙江;江苏;浙江;安徽;福建;江西;山东;河南;湖北;湖南;广东;广西;海南;四川;贵州;云南;西藏;陕西;甘肃;青海;宁夏;新疆".Contains(string.Join("", v.Take(2)))); - attrValue = value; - } - } - else - { - attrValue = "中国大陆"; - } - } - else if (attr.name == "是否具有拍卖/收藏价值") - { - attrValue = "不具有"; - } - else if (attr.name == "是否批量生产(孤品)") - { - attrValue = "批量生产"; - } - //else if (attrValueLst.Any(v => v.Contains("%"))) - //{ - // attrValue = attrValueLst.FirstOrDefault(); - //} - else if (!(attr.type == "decimal4_unit" || attr.type == "integer_unit")) - attrValue = attrValueLst.Where(v => !"真丝、蚕丝、香云纱、羊绒、羊毛、羊羔绒、羊羔毛、羽绒、皮草".Contains(v)).OrderBy(x => Guid.NewGuid()).FirstOrDefault(); - - //书籍属性处理 - if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") - { - //if (attr.name == "ISBN版号/CN刊号") - // attrValue = "9787922575016"; - if (attr.name == "书名") - attrValue = prodTitle; - if (attr.name == "是否为单一书号丛书") - attrValue = "是"; - if (attr.name == "图书册数") - attrValue = "1 册"; - if (attr.name == "出版社名称") - attrValue = new List() { "技术出版社", "文化出版社", "美术出版社" }[Randomx.GetId(3)]; - if (attr.name == "作者") - { - attrValue = new List() { "赵老师", "钱老师", "孙老师", "李老师", "周老师", "吴老师", "郑老师", "王老师", "张老师", "孙老师", "刘老师" }.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); - attrValue = "无"; - } - if (attr.name == "包装") - attrValue = "平装"; - if (attr.name == "出版时间") - attrValue = DateTime.Now.AddMonths(0 - Randomx.GetId(3, 7)).ToString("yyyy-MM"); - } - if (upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料") - { - if (attr.name == "食品名称") - attrValue = prodTitle; - if (attr.name == "生产企业名称") - attrValue = "见包装"; - if (attr.name == "食品生产许可证编号") - { - attrValue = "SC10241162100670"; - attrValue = "见包装"; - } - if (attr.name == "产品标准号") - { - attrValue = "GB 2726"; - attrValue = "见包装"; - } - if (attr.name == "生产日期") - attrValue = DateTime.Now.Date.AddDays(-15).ToString("yyyy-MM-dd"); - if (attr.name == "净含量") - attrValue = "见包装"; - if (attr.name == "单件净含量") - { - attrValue = "见包装"; - } - if (attr.name == "包装方式") - attrValue = "袋装"; - if (attr.name == "配料表") - attrValue = "水"; - if (attr.name == "联系方式") - attrValue = "无"; - if (attr.name == "地址") - attrValue = "见包装"; - if (attr.name == "贮存条件") - attrValue = "常温"; - - //if (attr.name == "保质期") - //{ - // if (chkDefaultBestBefore.Checked == false) - // return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"食品属性不含保质期,跳过上传\"}"; - // if (txtDefaultBestBefore.Text.ParseToInt() < 15) - // return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"食品默认保质期设置小于15天,跳过上传\"}"; - // attrValue = txtDefaultBestBefore.Text.ParseToInt() + " 天"; - //} - } - - if (attr.name == "保质期") - { - if (chkDefaultBestBefore.Checked == false) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"属性不含保质期,跳过上传\"}"; - if (txtDefaultBestBefore.Text.ParseToInt() < 3) - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"默认保质期设置小于3天,跳过上传\"}"; - attrValue = txtDefaultBestBefore.Text.ParseToInt() + " 天"; - } - } - if (attrValue.IsNullOrEmpty() && attr.type == "string") - { - attrValue = "其他"; - } - if ((attrValue.IsNullOrEmpty() || attrValue == "见包装" || attrValue == "%") && (attr.type == "decimal4_unit" || attr.type == "integer_unit")) - { - // 走系统推荐 - var param = recommendParamRst.productInfo.param.FirstOrDefault(p => p.categorys?.FirstOrDefault()?.name == attr.name); - if (param != null && param.categorys.Count == 2) - { - attrValue = param.categorys[1].name; - if (attrValue.Contains("磅") && attrValue.Replace("磅", "").ParseToDecimal() > 0) - { - if ((";" + attr.value + ";").Contains(";g;")) - attrValue = (attrValue.Replace("磅", "").ParseToDecimal() * 454).ParseToInt() + "g"; - else if ((";" + attr.value + ";").Contains(";kg;")) - attrValue = (attrValue.Replace("磅", "").ParseToDecimal() * 0.454m).ParseToDecimal() + "kg"; - } - } - else if (attr.value == "%") - attrValue = "1 %"; - else if (attr.value == "g;kg") - attrValue = "50 g"; - else if (attr.value == "g") - attrValue = "10 g"; - else if (attr.value == "kg") - attrValue = "1 kg"; - else if (attr.value == "g;kg;ml;L") - attrValue = "100 g"; - else if (attr.value == "cm") - attrValue = "20 cm"; - else if (attr.value == "mm") - attrValue = "20 mm"; - else if (attr.value == "毫米(mm);厘米(cm);米(m)") - attrValue = "20 毫米(mm)"; - else if (attr.value.Contains("岁以上") && attr.value.Contains("个月以上")) - attrValue = "7 岁以上"; - else if (attr.value == "只;个") - attrValue = "1 个"; - else if (attr.value == "个") - attrValue = "1 个"; - else if (attr.value == "ml") - attrValue = "100 ml"; - else if (attr.value == "L") - attrValue = "1 L"; - else if (attr.value == "日;月;年") - attrValue = "30 日"; - } - - var wxPropParam = new wxPropParam(); - upProdParam.product.info.param.Add(wxPropParam); - var wxCategoryParam1 = new categoryPropParam() - { - catType = 7, - name = attr.name, - catInfo = new catInfoParam() { inputType = attr.normalRelease.ruleType, isRequired = attr.isRequired == true ? 1 : 0, isCustomize = 0 } - }; - var wxCategoryParam2 = new categoryPropParam() - { - catType = 7, - name = attrValue, - catInfo = new catInfoParam() { inputType = attr.normalRelease.ruleType, isRequired = attr.isRequired == true ? 1 : 0, isCustomize = 0 } - }; - wxPropParam.categorys.Add(wxCategoryParam1); - wxPropParam.categorys.Add(wxCategoryParam2); - } - if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") - { - foreach (var param in upProdParam.product.info.param.ToList()) - { - if (param.categorys.FirstOrDefault()?.name == "作者" && param.categorys.LastOrDefault()?.name == "无") - { - param.categorys.LastOrDefault().name = upProdParam.product.info.param.FirstOrDefault(p => p.categorys.FirstOrDefault()?.name == "出版社名称")?.categorys?.LastOrDefault()?.name; - if (param.categorys.LastOrDefault().name.IsNullOrEmpty()) - param.categorys.LastOrDefault().name = "无"; - break; - } - } - } - #endregion - - #region sku规格属性 - - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成sku"; - })); - } - Thread.Sleep(Randomx.GetId(100, 300)); - - upProdParam.product.info.productSaleAttrs = new List(); - if (prodInfo.detail.sku == null) - prodInfo.detail.sku = new List(); - if (prodInfo.detail.sku.Count == 0) - prodInfo.detail.sku.Add(new sku_item() { spec = new List() }); - if (prodInfo.detail.sku.FirstOrDefault().spec == null) - prodInfo.detail.sku.FirstOrDefault().spec = new List(); - if (prodInfo.detail.sku.FirstOrDefault().spec.Count == 0) - prodInfo.detail.sku.FirstOrDefault().spec.Add(new spec_item() { parent_name = "规格", spec_name = "默认" }); - if (prodInfo.detail.sku.FirstOrDefault().thumb_url.IsNullOrEmpty()) - prodInfo.detail.sku.FirstOrDefault().thumb_url = prodInfo.detail.galleries.FirstOrDefault(g => g.type == 1)?.url; - - // 处理系统指定的规格名称 - //if ((upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料") && - // (selectProd.cat_name == "坚果炒货" || selectProd.cat_name == "果干")) - //{ - // if (!prodInfo.detail.sku.FirstOrDefault().spec.Any(s => s.parent_name == "规格/净含量")) - // { - // foreach (var sku in prodInfo.detail.sku) - // { - // sku.spec.FirstOrDefault().parent_name = "规格/净含量"; - // } - // } - //} - ////else if ((upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料")) - ////{ - //// if (!prodInfo.detail.sku.FirstOrDefault().spec.Any(s => s.parent_name == "规格")) - //// { - //// foreach (var sku in prodInfo.detail.sku) - //// { - //// sku.spec.FirstOrDefault().parent_name = "规格"; - //// } - //// } - ////} - // 坚果炒货类,系统返回的试规格/净含量但是要求填规格 - if ((upProdParam.product.info?.category?.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail?.cats?.FirstOrDefault() == "食品饮料") && - (upProdParam.product.info?.category?.LastOrDefault()?.name == "坚果炒货" || upProdParam.product.info?.category?.LastOrDefault()?.name == "果干")) - { - if (!prodInfo.detail.sku.FirstOrDefault().spec.Any(s => s.parent_name == "规格")) - { - foreach (var sku in prodInfo.detail.sku) - { - sku.spec.FirstOrDefault().parent_name = "规格"; - } - } - } - else - { - var leafCat = upProdParam.product.info.category.LastOrDefault(); - if (leafCat?.catInfo?.saleAttr?.attr != null) - { - foreach (var att in leafCat.catInfo.saleAttr.attr) - { - //decimal4_unit //g;kg;斤 - if (att.isRequired == true) - { - // 规格属性名放在第二个规格上 - if (att.normalRelease.ruleType == 2 && prodInfo.detail.sku.FirstOrDefault()?.spec.Count == 2) - { - foreach (var sku in prodInfo.detail.sku) - { - // 如果有指定规格属性名称就不再设置 - if (!sku.spec.Any(sp => sp.parent_name == att.name)) - { - sku.spec[1].parent_name = att.name; - } - // 如果不在指定位置上,交换位置 - else if (sku.spec[0].parent_name == att.name) - { - var specTmp = sku.spec[0]; - sku.spec[0] = sku.spec[1]; - sku.spec[1] = specTmp; - } - if (att.type == "decimal4_unit") - { - if (att.value == "g;kg;斤") - { - var specName = ""; - foreach (var unit in att.value.Split(';').Reverse().ToList()) - { - Match specMatch = Regex.Match(sku.spec[1].spec_name.Replace(" ", "").Replace("-", "负号"), @"\d+(.\d+)?" + unit); - //Match specMatch = Regex.Match(sku.spec[1].spec_name.Replace(" ", ""), @"((0{1}.\d{1,4})|([1-9]\d{1}.\d{1,4})|([1-9]+\d)|0)" + unit); - if (specMatch.Success) - { - specName = specMatch.Value.Replace(unit, "")/*.ParseToDecimal().ParseToInt()*/ + " " + unit; - break; - } - } - if (string.IsNullOrEmpty(specName)) - specName = Randomx.GetId(10, 500) + " g"; - sku.spec[1].spec_name = specName; - } - } - } - } - // 规格属性名放在第一个规格上 - else - { - foreach (var sku in prodInfo.detail.sku) - { - // 如果有指定规格属性名称就不再设置 - if (!sku.spec.Any(sp => sp.parent_name == att.name)) - { - sku.spec[0].parent_name = att.name; - } - // 如果不在指定位置上,交换位置 - else if (sku.spec.Count > 1 && sku.spec[1].parent_name == att.name) - { - var specTmp = sku.spec[0]; - sku.spec[0] = sku.spec[1]; - sku.spec[1] = specTmp; - } - if (att.type == "decimal4_unit") - { - if (att.value == "g;kg;斤") - { - var specName = ""; - foreach (var unit in att.value.Split(';').Reverse().ToList()) - { - Match specMatch = Regex.Match(sku.spec[0].spec_name.Replace(" ", "").Replace("-", "负号"), @"\d+(.\d+)?" + unit); - //Match specMatch = Regex.Match(sku.spec[0].spec_name.Replace(" ", ""), @"((0{1}.\d{1,4})|([1-9]\d{1}.\d{1,4})|([1-9]+\d)|0)" + unit); - if (specMatch.Success) - { - specName = specMatch.Value.Replace(unit, "")/*.ParseToDecimal().ParseToInt()*/ + " " + unit; - break; - } - } - if (string.IsNullOrEmpty(specName)) - specName = Randomx.GetId(10, 500) + " g"; - sku.spec[0].spec_name = specName; - } - } - } - } - } - } - } - } - - if (prodInfo.detail.sku.FirstOrDefault()?.spec?.Count > 0) - { - productSaleAttrParam attrParam = new productSaleAttrParam() - { - key = prodInfo.detail.sku.FirstOrDefault()?.spec[0].parent_name, - hasImg = true, - items = new List() - }; - upProdParam.product.info.productSaleAttrs.Add(attrParam); - foreach (var sku in prodInfo.detail.sku) - { - var spec = sku.spec[0]; - if (!attrParam.items.Any(it => it.value == spec.spec_name) && !string.IsNullOrEmpty(sku.thumb_url)) - { - if (dbProd.product_get_type_text == "微信店采") - { - attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = sku.thumb_url, }); - continue; - } - - // 获取缓存盗链 sku图 - if (wxImgMapDic.ContainsKey(BaseClass.GetMd5(sku.thumb_url))) - { - attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = wxImgMapDic[BaseClass.GetMd5(sku.thumb_url)], }); - continue; - } - // 使用接口链接传sku图 - if (1 == 1 && !sku.thumb_url.Contains("wst.wxapp.tc.qq.com")) - { - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - upDate += "&post_data=" + GetHtml.UrlEncodeUtf8("{\"img_url\":\"" + sku.thumb_url.Replace("https://", "http://") + "\"}"); - - var sTime = DateTime.Now; - var upDateRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成sku " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 20 && upDateRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - upDateRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref upDateRst, "img_url"); - if (upDateRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) - { - attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = upImgUrl, }); - wxImgMapDic[BaseClass.GetMd5(sku.thumb_url)] = upImgUrl; - isChangeImgDic = true; - continue; // 传图成功跳过模拟上传 - } - else - { - } - } - - // api上传图片文件 sku图 - if (1 == 1) - { - try - { - string errMsg = ""; - var imgBase64 = GetImgBase64ForApi(out errMsg, sku.thumb_url, false, false); - if (!string.IsNullOrEmpty(errMsg)) - { - return errMsg; - } - - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - //upDate += "&is_file=true"; - //if (needAddRandomBlock || wantAddRandomBlock) - // upDate += "&random_code=true"; - upDate += "&img_url=" + sku.thumb_url; - upDate += "&img_base64=" + imgBase64; - - var sTime = DateTime.Now; - var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在上传商品sku图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); - if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) - { - attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = upImgUrl, }); - wxImgMapDic[BaseClass.GetMd5(sku.thumb_url)] = upImgUrl; - isChangeImgDic = true; - continue; - } - else - { - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改详情图失败 " + ex.Message + "\"}"; - } - } - - // 上传sku图 - var locationStr = UploadImg(shop, sku.thumb_url, cell); - if (!locationStr.Contains("\"success\":true")) - return locationStr; - var location = BaseRegex.GetStringJson(ref locationStr, "Location"); - attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = location, }); - Thread.Sleep(Randomx.GetId(10, 50)); - - //wxImgMapDic[BaseClass.GetMd5(sku.thumb_url)] = location; - //isChangeImgDic = true; - } - } - } - if (prodInfo.detail.sku.FirstOrDefault()?.spec?.Count > 1) - { - productSaleAttrParam attrParam = new productSaleAttrParam() - { - key = prodInfo.detail.sku.FirstOrDefault()?.spec[1].parent_name, - hasImg = false, - items = new List() - }; - upProdParam.product.info.productSaleAttrs.Add(attrParam); - foreach (var sku in prodInfo.detail.sku) - { - var spec = sku.spec[1]; - if (!attrParam.items.Any(it => it.value == spec.spec_name)) - attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name }); - } - } - #endregion - - #region 保存缓存盗链图片 - if (isChangeImgDic) - { - var url = BaseClass.BuildObjString("product/mdy_pdd_product"); - var data = ""; - Invoke(new Action(() => - { - data = UserLogin.GetSignaturex(); - data += "&spu_id=" + dbProd.spu_id; - data += "&wx_img_map_json=" + JsonHelper.SerializeObject(wxImgMapDic); - })); - var 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")) - html = GetHtml.PostUtf8(url, data); - isChangeImgDic = false; - } - #endregion - - #region sku信息 - upProdParam.product.productSkus = new List(); - int skuIndex = 0; - int id = 3; - long catId = 200000000003; - long fCatId = 200000000003; - long valueCatId = (17 + Randomx.GetNumber(11)).ParseToLong(); - Dictionary dicSpecParentNameId = new Dictionary(); - Dictionary dicSpecParentNameCatId = new Dictionary(); - Dictionary dicSpecNamefCatId = new Dictionary(); - Dictionary dicSpecNameCatId = new Dictionary(); - foreach (var skuInfo in prodInfo.detail.sku) - { - foreach (var spec in skuInfo.spec) - { - if (!dicSpecParentNameId.Keys.Contains(spec.parent_name)) - { - dicSpecParentNameId[spec.parent_name] = id++; - dicSpecParentNameCatId[spec.parent_name] = catId++; - } - if (!dicSpecNamefCatId.Keys.Contains(spec.spec_name)) - { - dicSpecNamefCatId[spec.spec_name] = fCatId++; - dicSpecNameCatId[spec.spec_name] = valueCatId++; - } - } - } - if (dbProd.product_get_type_text == "厂商直采" && !prodInfo.detail.sku.Any(s => s.quantity.ParseToInt() > 0)) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"源商品库存为0\"}"; - } - foreach (var skuInfo in prodInfo.detail.sku) - { - productSkuParam skuParam = new productSkuParam(); - upProdParam.product.productSkus.Add(skuParam); - for (int i = skuInfo.spec.Count - 1; i >= 0; i--) - { - var specInfo = skuInfo.spec[i]; - skuParam.__skuKey = specInfo.parent_name + "." + specInfo.spec_name + "_"; - skuParam.__skuKey += specInfo.spec_name; - } - skuParam.__skuKey.TrimEnd('_'); - skuParam.index = skuIndex++; - skuParam.productSkuInfo = new productSkuInfoParam(); - // 加价 - skuParam.productSkuInfo.salePrice = (skuInfo.multi_price * defaultAddPriceRule.AddPriceTimes + defaultAddPriceRule.AddMorePrice * 100).ParseToInt(); - if (defaultAddPriceRule.AddMorePriceFirst) - skuParam.productSkuInfo.salePrice = ((skuInfo.multi_price + defaultAddPriceRule.AddMorePrice * 100) * defaultAddPriceRule.AddPriceTimes).ParseToInt(); - // 阶梯式加价,如果命中则按阶梯式加价进行 - if (defaultAddPriceRule.IsStepAddPrice) - { - foreach (var addPrice in lstAddPriceRule) - { - if (skuInfo.multi_price > addPrice.MoreThanPrice * 100 && skuInfo.multi_price <= addPrice.LessThanPrice * 100) - { - if (defaultAddPriceRule.AddMorePriceFirst) // 先加后乘 - skuParam.productSkuInfo.salePrice = ((skuInfo.multi_price + addPrice.AddMorePrice * 100) * addPrice.AddPriceTimes).ParseToInt(); - else - skuParam.productSkuInfo.salePrice = (skuInfo.multi_price * addPrice.AddPriceTimes + addPrice.AddMorePrice * 100).ParseToInt(); - break; - } - } - } - // 聚水潭上微信小店,加运费(其他平台shipPrice默认为0) - skuParam.productSkuInfo.salePrice += (shipPrice * defaultAddPriceRule.ShippingPriceTimes).ParseToInt(); - // 商品裂变随机增加价格 - if (selectProd.is_fission_title && chkFissionRandomPriceChange.Checked) - { - Invoke(new Action(() => - { - var fissionRandomPrice = Randomx.GetId((txtFissionRandomPriceChange.Text.ParseToDecimal() * 100).ParseToInt() + 1); - skuParam.productSkuInfo.salePrice += fissionRandomPrice; - })); - } - // sku图 - skuParam.productSkuInfo.thumbImg = upProdParam.product.info.productSaleAttrs[0].items.FirstOrDefault(a => a.value == skuInfo.spec[0].spec_name)?.imgUrl; - if (dbProd.special_prod_type == "爆款数据") - { - if (!skuInfo.out_sku_sn.StartsWith("BS")) // Best-seller 爆款 - skuInfo.out_sku_sn = "BS" + skuInfo.out_sku_sn; - } - 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 }; - // 厂商直采上家库存为0则按0上架 - if (dbProd.product_get_type_text == "厂商直采" && skuInfo.quantity.IsNullOrZero()) - skuParam.productSkuInfo.stockInfo.stockNum = 0; - skuParam.productSkuInfo.saleParam = new List(); - foreach (var specInfo in skuInfo.spec) - { - saleParamParam saleParam = new saleParamParam(); - skuParam.productSkuInfo.saleParam.Add(saleParam); - saleParam.categorys = new List(); - - // specKey - categoryKeyParam skuCateKeyParam = new categoryKeyParam(); - saleParam.categorys.Add(skuCateKeyParam); - skuCateKeyParam.isCustomize = true; - skuCateKeyParam.isMainSale = true; - skuCateKeyParam.name = specInfo.parent_name; - skuCateKeyParam.id = dicSpecParentNameId[specInfo.parent_name].ParseToInt(); // 3; - skuCateKeyParam.catId = dicSpecParentNameCatId[specInfo.parent_name]; - skuCateKeyParam.label = "自定义规格"; - skuCateKeyParam.catInfo = new skuCatInfoParam() { isCustomize = 1 }; - skuCateKeyParam.catType = 8; - - // specValue - categoryValueParam skuCateValueParam = new categoryValueParam(); - saleParam.categorys.Add(skuCateValueParam); - skuCateValueParam.fCatId = dicSpecNamefCatId[specInfo.spec_name]; - skuCateValueParam.catId = dicSpecNameCatId[specInfo.spec_name]; - skuCateValueParam.name = specInfo.spec_name; - skuCateValueParam.skuNameValue = specInfo.spec_name; - skuCateValueParam.desc = ""; - skuCateValueParam.catInfo = new categoryValueCatInfo() { editByUser = 1 }; - skuCateValueParam.thumbImg = ""; - var specIndex = skuInfo.spec.IndexOf(specInfo); - skuCateValueParam.priority = prodInfo.detail.sku.Select(s => s.spec[specIndex].spec_name).Distinct().ToList().IndexOf(specInfo.spec_name); - skuCateValueParam.selected = false; - } - skuParam.productSkuInfo.skuDeliverInfo = new skuDeliverInfoParam(); - skuParam.productSkuInfo.stockDiff = new stockDiffParam() { diffType = 1, num = defaultAddPriceRule.StockNum }; - // 厂商直采上家库存为0则按0上架 - if (dbProd.product_get_type_text == "厂商直采" && skuInfo.quantity.IsNullOrZero()) - skuParam.productSkuInfo.stockDiff.num = 0; - skuParam.status = 5; - } - #endregion - - #region 预售信息 - if (chkPreSale.Checked) - { - upProdParam.product.deliverInfo = new productDeliverInfoParam(); - upProdParam.product.deliverInfo.deliverType = 1; - int preSaleDays = Math.Max(3, wxUploadRule.PreSaleDays); - preSaleDays = Math.Min(45, preSaleDays); - upProdParam.product.deliverInfo.skuDeliverInfo = new skuDeliverInfoParam() - { - stockType = 1, - fullPaymentPresaleDeliveryTime = preSaleDays.ParseToString() - }; - } - #endregion - - #region 佣金信息,需要权限 - if (BaseClass.UserAuthority.Contains("佣金上货") && chkCommission.Checked) - { - upProdParam.product.info.leagueItemInfo = new leagueItemInfoParam(); - upProdParam.product.info.leagueItemInfo.itemSwitch = 1; - upProdParam.product.info.leagueItemInfo.itemRatio = commissionRate; - upProdParam.product.info.leagueItemInfo.headSupplierPublicItemSwitch = 1; - upProdParam.product.info.leagueItemInfo.headSupplierPublicItemServiceRatio = commissionRate; - } - #endregion - - #region 资质信息 - // 微信回采直接复制 - if (BaseClass.UserAuthority.ParseToString().Contains("微信回采") && chkUseWXComplateProd.Checked && dbProd.has_wx_format == "1" && wxEditProdInfo != null) - { - upProdParam.product.info.qualificationList.Clear(); - if (wxEditProdInfo.product?.info?.qualificationList?.Count > 0) - { - foreach (var editQualification in wxEditProdInfo.product.info.qualificationList) - { - upProdParam.product.info.qualificationList.Add(new qualificationParam() - { - qualificationId = editQualification.qualificationId, - qualificationUrl = editQualification.qualificationUrl, - }); - } - } - - if (upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") - { - if (wxEditProdInfo.product.info.brandId.ParseToLong() > 0) - DefaultAdultBrandId = wxEditProdInfo.product.info.brandId; - if (wxEditProdInfo.product.info.brandId.ParseToLong() > 0) - upProdParam.product.info.brandId = wxEditProdInfo.product.info.brandId.ParseToLong(); - } - } - // 微信店采直接复制 - //else if (dbProd.product_get_type_text == "微信店采" && upProdParam.product.info.category.FirstOrDefault()?.name != "图书" && - // upProdParam.product.info.category.FirstOrDefault()?.name != "食品饮料") - else if (dbProd.product_get_type_text == "微信店采" && - upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") - { - upProdParam.product.info.qualificationList.Clear(); - if (wxEditProdInfo.product?.info?.qualificationList?.Count > 0) - { - foreach (var editQualification in wxEditProdInfo.product.info.qualificationList) - { - upProdParam.product.info.qualificationList.Add(new qualificationParam() - { - qualificationId = editQualification.qualificationId, - qualificationUrl = editQualification.qualificationUrl, - }); - } - } - - if (upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") - { - if (wxEditProdInfo.product.info.brandId.ParseToLong() > 0) - DefaultAdultBrandId = wxEditProdInfo.product.info.brandId; - if (wxEditProdInfo.product.info.brandId.ParseToLong() > 0) - upProdParam.product.info.brandId = wxEditProdInfo.product.info.brandId.ParseToLong(); - } - } - else - { - #region 标签图 书籍类生成书籍图片 - //qualificationList - if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") - { - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成图书专有信息"; - })); - } - - if (lstQulificationImage.Count == 0) - { - var pageCount = 1; - var seconds = 0m; - lstQulificationImage = AdminForms.WXAdminQualificationImageForm.AdminGetServerQualificationImageLst(out pageCount, out seconds, "图书"); - } - var qulificationImage = lstQulificationImage.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); - if (qulificationImage != null) - { - if (qulificationImage.img_base64.IsNullOrEmpty()) - { - var pageCount = 1; - var seconds = 0m; - qulificationImage.img_base64 = AdminForms.WXAdminQualificationImageForm.AdminGetServerQualificationImageLst(out pageCount, out seconds, "图书", qulificationImage.img_md5) - .FirstOrDefault()?.img_base64; - } - } - - //string publisher = "出版社名称:" + new List() { "技术出版社", "文化出版社", "美术出版社" }[Randomx.GetId(3)]; - ////string isbn = "ISBN:"; - //string isbn = "ISBN/CN刊号:"; - ////string bookName = "书名:"; - //string bookName = "图书名称:"; - //string bookPrice = "定价:" + upProdParam.product.productSkus.Max(s => s.productSkuInfo.salePrice) * 0.01; - //string author = "作者:王老师"; - //string publishTime = "出版时间:" + DateTime.Now.AddMonths(-3).ToString("yyyy年MM月dd日"); - //string edition = "版次:1"; - //string binding = "装帧:平装"; - - //foreach (var propParam in upProdParam.product.info.param) - //{ - // if (propParam.categorys[0].name.Contains("出版社名称")) - // publisher = "出版社名称:" + propParam.categorys[1].name; - // else if (propParam.categorys[0].name.Contains("ISBN版号/CN刊号")) - // { - // //isbn = "ISBN:" + propParam.categorys[1].name; - // isbn = "ISBN/CN刊号:" + propParam.categorys[1].name; - // if (propParam.categorys[1].name.Length == 13) - // { - // var isbnStr = propParam.categorys[1].name; - // isbn = "ISBN/CN刊号:" + isbnStr[0] + isbnStr[1] + isbnStr[2] + "-" + isbnStr[3] + "-" + isbnStr[4] + isbnStr[5] + isbnStr[6] + isbnStr[7] + "-" + isbnStr[8] + isbnStr[9] + isbnStr[10] + isbnStr[11] + "-" + isbnStr[12]; - // } - // } - // else if (propParam.categorys[0].name.Contains("书名")) - // { - // //bookName = "书名:" + propParam.categorys[1].name; - // bookName = "图书名称:" + propParam.categorys[1].name; - // } - // else if (propParam.categorys[0].name.Contains("定价")) - // { - // //bookPrice = "定价:" + propParam.categorys[1].name; - // propParam.categorys[1].name = bookPrice; - // } - // else if (propParam.categorys[0].name.Contains("作者")) - // author = "作者:" + propParam.categorys[1].name; - // else if (propParam.categorys[0].name.Contains("出版时间")) - // publishTime = "出版时间:" + propParam.categorys[1].name; - // else if (propParam.categorys[0].name.Contains("版次")) - // edition = "版次:" + propParam.categorys[1].name; - // else if (propParam.categorys[0].name.Contains("包装")) - // binding = "装帧:" + propParam.categorys[1].name; - //} - - //var bookStr = publisher + "\r\n" + "\r\n" + - // isbn + "\r\n" + "\r\n" + - // bookName + "\r\n" + "\r\n" + - // bookPrice + "\r\n" + "\r\n" + - // author + "\r\n" + "\r\n" + - // publishTime + "\r\n" + "\r\n" + - // edition + "\r\n" + "\r\n" + - // binding; - - //int imgW = 800; int imgH = 800; int textImgH = 0; - //string getImgError; - //var img_url = upProdParam.product.info.headImg[0]; - //if (!img_url.Contains("wst.wxapp.tc.qq.com") && !img_url.Contains("mmecimage.cn")) - // img_url = img_url.Replace("https://", "http://"); - //var imageMain = GetHtml.GetUrlImg(img_url, out getImgError); - //if (imageMain == null) - // imageMain = new Bitmap(800, 800); - //using (Bitmap bitmap = new Bitmap(1, 1)) // 尺寸不重要,只是为了使用Graphics对象 - //using (Graphics g = Graphics.FromImage(bitmap)) // 获取Graphics对象 - //{ - // // 定义字体 - // Font font = new Font("微软雅黑", 16, FontStyle.Regular); - // g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - // // 定义要测量的字符串 - // string text = bookStr; - // // 测量字符串大小 - // SizeF size = g.MeasureString(text, font, imgW - 120); - // // 输出高度信息 - // //Console.WriteLine("Text Height: " + size.Height); - // textImgH = size.Height.ParseToInt() + 180; - //} - - ////var bookImg = new Bitmap(imgW, imgH); - ////using (Graphics g = Graphics.FromImage(bookImg)) - ////{ - //// g.Clear(Color.White); - //// //Font font = new Font("宋体", 15, FontStyle.Bold); - //// //Font font = new Font("微软雅黑", 15, FontStyle.Regular); - //// Font font = new Font("微软雅黑", 16, FontStyle.Regular); - //// //Font font = new Font("宋体", 17, FontStyle.Bold); - //// Brush textBrush = Brushes.Black; - //// g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - //// RectangleF rectF = new RectangleF(60, 80, imgW - 120, imgH - 180); - //// g.DrawString(bookStr, font, textBrush, rectF); - ////} - - //// 绘制一张带主图的商品详情页 - //var bookImg = new Bitmap(imgW, imgH + textImgH); - //using (Graphics g = Graphics.FromImage(bookImg)) - //{ - // g.Clear(Color.FromArgb(248, 239, 244)); - - // g.DrawImage(imageMain, new Rectangle(0, 0, imgW, imgH), 0, 0, imageMain.Width, imageMain.Height, GraphicsUnit.Pixel); - - // //Font font = new Font("宋体", 15, FontStyle.Bold); - // //Font font = new Font("微软雅黑", 15, FontStyle.Regular); - // Font font = new Font("微软雅黑", 18, FontStyle.Regular); - // //Font font = new Font("宋体", 17, FontStyle.Bold); - // Brush textBrush = Brushes.Black; - // g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - // RectangleF rectF = new RectangleF(60, imgH + 80, imgW - 120, textImgH - 180); - // g.DrawString(bookStr, font, textBrush, rectF); - //} - - - string publisher = "出版发行:" + new List() { "技术出版社", "文化出版社", "美术出版社" }[Randomx.GetId(3)]; - //string isbn = "ISBN:"; - string isbn = "ISBN/CN刊号:"; - //string bookName = "书名:"; - string bookName = "图书名称:"; - string bookPrice = "定  价:" + upProdParam.product.productSkus.Max(s => s.productSkuInfo.salePrice) * 0.01; - string author = "作  者:王老师"; - string publishTime = "出版时间:" + DateTime.Now.AddMonths(-3).ToString("yyyy年MM月dd日"); - string edition = "版  次:1"; - string binding = "装  帧:平装"; - - foreach (var propParam in upProdParam.product.info.param) - { - if (propParam.categorys[0].name.Contains("出版社名称")) - publisher = "出版发行:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("ISBN版号/CN刊号")) - { - //isbn = "ISBN:" + propParam.categorys[1].name; - isbn = "ISBN/CN刊号:" + propParam.categorys[1].name; - if (propParam.categorys[1].name.Length == 13) - { - var isbnStr = propParam.categorys[1].name; - isbn = "ISBN/CN刊号:" + isbnStr[0] + isbnStr[1] + isbnStr[2] + "-" + isbnStr[3] + "-" + isbnStr[4] + isbnStr[5] + isbnStr[6] + isbnStr[7] + "-" + isbnStr[8] + isbnStr[9] + isbnStr[10] + isbnStr[11] + "-" + isbnStr[12]; - } - } - else if (propParam.categorys[0].name.Contains("书名")) - { - //bookName = "书名:" + propParam.categorys[1].name; - bookName = "图书名称:" + propParam.categorys[1].name; - } - else if (propParam.categorys[0].name.Contains("定价")) - { - //bookPrice = "定价:" + propParam.categorys[1].name; - propParam.categorys[1].name = bookPrice; - } - else if (propParam.categorys[0].name.Contains("作者")) - { - if (propParam.categorys[1].name != "/") - author = "作  者:" + propParam.categorys[1].name; - else - author = ""; - } - else if (propParam.categorys[0].name.Contains("出版时间")) - publishTime = "出版时间:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("版次")) - edition = "版  次:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("包装")) - binding = "装  帧:" + propParam.categorys[1].name; - } - if (author.IsNullOrEmpty()) - author = "作  者:" + publisher.Replace("出版发行:", ""); - - var bookStr = publisher + "\r\n" + "\r\n" + - isbn + "\r\n" + "\r\n" + - bookName + "\r\n" + "\r\n" + - bookPrice + "\r\n" + "\r\n" + - author + "\r\n" + "\r\n" + - publishTime + "\r\n" + "\r\n" + - edition + "\r\n" + "\r\n" + - binding; - - int imgW = 800; int imgH = 800; int textImgH = 0; - string getImgError; - var img_url = upProdParam.product.info.headImg[0]; - if (!img_url.Contains("wst.wxapp.tc.qq.com") && !img_url.Contains("mmecimage.cn")) - img_url = img_url.Replace("https://", "http://"); - var imageMain = GetHtml.GetUrlImg(img_url, out getImgError); - if (imageMain == null) - imageMain = new Bitmap(800, 800); - using (Bitmap bitmap = new Bitmap(1, 1)) // 尺寸不重要,只是为了使用Graphics对象 - using (Graphics g = Graphics.FromImage(bitmap)) // 获取Graphics对象 - { - // 定义字体 - Font font = new Font("微软雅黑", 16, FontStyle.Regular); - g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - // 定义要测量的字符串 - string text = bookStr; - // 测量字符串大小 - SizeF size = g.MeasureString(text, font, imgW - 120); - // 输出高度信息 - //Console.WriteLine("Text Height: " + size.Height); - textImgH = size.Height.ParseToInt() + 180; - } - - - var bookImg = TemuKJD.Properties.Resources.empty_book_900_1200; - if (!string.IsNullOrEmpty(qulificationImage?.img_base64)) - { - // 使用服务端随即图 - try - { - bookImg = Base64ChangeImgUrl.Base64ToImage(qulificationImage.img_base64); - } - catch (Exception ex) - { - } - } - imgH = bookImg.Height; - imgW = bookImg.Width; - using (Graphics g = Graphics.FromImage(bookImg)) - { - Brush textBrush = Brushes.Black; - g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - - float txtTop = 240, txtBottom = 240, txtLeft = 280, txtRight = 270; - if (qulificationImage.txt_margin.ParseToString().Split(',').Select(m => m.ParseToInt()).ToList() is List marginValueList && marginValueList.Count == 4) - { - txtLeft = marginValueList[0] + 10 - Randomx.GetId(21); - txtTop = marginValueList[1] + 10 - Randomx.GetId(21); - txtRight = marginValueList[2] + 10 - Randomx.GetId(21); - txtBottom = marginValueList[3] + 10 - Randomx.GetId(21); - } - int txtWidth = (int)imgW - (int)txtLeft - (int)txtRight; // 370; - - // 书名 - Font font = new Font("宋体", 22, FontStyle.Bold); - RectangleF rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop - 80); - g.DrawString(bookName.Replace("图书名称:", ""), font, textBrush, rectF); - // 测量文本的高度 决定接下来文字绘制位置 - var textSize = g.MeasureString(bookName.Replace("图书名称:", ""), font, txtWidth); - txtTop += 20 + textSize.Height; - - font = new Font("宋体", 15, FontStyle.Bold); - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop - 80); - g.DrawString(author.Replace("作  者:", "").TrimEnd('著', ' ') + " 著", font, textBrush, rectF); - // 测量文本的高度 - textSize = g.MeasureString(author.Replace("作  者:", "").TrimEnd('著', ' ') + " 著", font, txtWidth); - txtTop += 20 + textSize.Height; - - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop - 80); - g.DrawString(publisher.Replace("出版发行:", ""), font, textBrush, rectF); - // 测量文本的高度 - textSize = g.MeasureString(publisher.Replace("出版发行:", ""), font, txtWidth); - txtTop += 20 + textSize.Height; - - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop - 80); - g.DrawString(isbn.Replace("ISBN/CN刊号:", "ISBN "), font, textBrush, rectF); - // 测量文本的高度 - textSize = g.MeasureString(isbn.Replace("ISBN/CN刊号:", "ISBN "), font, txtWidth); - txtTop += 20 + textSize.Height; - - // 以下从下往上写 - txtTop = imgH - txtBottom; - // 测量文本的高度 - textSize = g.MeasureString(binding, font, txtWidth); - txtTop -= (10 + textSize.Height); - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); - g.DrawString(binding, font, textBrush, rectF); - - // 测量文本的高度 - textSize = g.MeasureString(edition, font, txtWidth); - txtTop -= (10 + textSize.Height); - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); - g.DrawString(edition, font, textBrush, rectF); - - // 测量文本的高度 - textSize = g.MeasureString(publishTime, font, txtWidth); - txtTop -= (10 + textSize.Height); - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); - g.DrawString(publishTime, font, textBrush, rectF); - - // 测量文本的高度 - textSize = g.MeasureString(author, font, txtWidth); - txtTop -= (10 + textSize.Height); - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); - g.DrawString(author, font, textBrush, rectF); - - // 测量文本的高度 - textSize = g.MeasureString(bookPrice + "元", font, txtWidth); - txtTop -= (10 + textSize.Height); - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); - g.DrawString(bookPrice + "元", font, textBrush, rectF); - - // 测量文本的高度 - textSize = g.MeasureString(bookName, font, txtWidth); - txtTop -= (10 + textSize.Height); - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); - g.DrawString(bookName, font, textBrush, rectF); - - // 测量文本的高度 - textSize = g.MeasureString(isbn.Replace("ISBN/CN刊号:", "书  号:ISBN "), font, txtWidth); - textSize = g.MeasureString(isbn.Replace("ISBN/CN刊号:", "书  号:"), font, txtWidth); - txtTop -= (10 + textSize.Height); - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); - g.DrawString(isbn.Replace("ISBN/CN刊号:", "书  号: "), font, textBrush, rectF); - - // 测量文本的高度 - textSize = g.MeasureString(publisher, font, txtWidth); - txtTop -= (10 + textSize.Height); - rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); - g.DrawString(publisher, font, textBrush, rectF); - - } - - - Thread.Sleep(Randomx.GetId(500, 800)); - var locationStr = UploadImg(shop, bookImg, cell); - if (!locationStr.Contains("\"success\":true")) - return locationStr; - var location = BaseRegex.GetStringJson(ref locationStr, "Location"); - upProdParam.product.info.qualificationList.Add(new qualificationParam() { qualificationId = "1111485", qualificationUrl = new List() { location }, }); - - #region 将资质图作为主图的最后一张。 - using (MemoryStream memoryStream = new MemoryStream()) - { - bookImg.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); - byte[] imageBytes = memoryStream.ToArray(); - var imgBase64 = Convert.ToBase64String(imageBytes); - - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - //upDate += "&is_file=true"; - //if (needAddRandomBlock || wantAddRandomBlock) - // upDate += "&random_code=true"; - upDate += "&img_url=" + location; - upDate += "&img_base64=" + imgBase64; - - var sTime = DateTime.Now; - var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在上传资质图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); - upProdParam.product.info.headImg = upProdParam.product.info.headImg.Take(8).ToList(); - upProdParam.product.info.headImg.Add(upImgUrl); - } - #endregion - } - #endregion - - #region 标签图 食品类生成食品图片 - //qualificationList - if (upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料") - { - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成食品饮料专有信息"; - })); - } - - - string foodName = "食品名称:" + prodTitle; - string companyName = "生产商名称:中国地区食品厂"; - string SCID = "食品生产许可证编号:SC10241162100670"; - string GBID = "产品标准号:GB 2726"; - string ExpDate = "保质期:30天"; - string MakeDate = "生产日期:" + DateTime.Now.AddDays(-15).ToString("yyyy-MM-dd"); - string NetContent = "净含量:见包装"; - string Pack = "包装方式:袋装"; - string inList = "配料表:水"; - string contact = "联系方式:无"; - string address = "地址:见包装"; - string Storage = "贮存条件:常温"; - - foreach (var propParam in upProdParam.product.info.param) - { - if (propParam.categorys[0].name.Contains("食品名称") && !propParam.categorys[1].name.Contains("见包装") && !propParam.categorys[1].name.Contains("见外包装")) - foodName = "食品名称:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("生产企业名称") && !propParam.categorys[1].name.Contains("见包装") && !propParam.categorys[1].name.Contains("见外包装")) - companyName = "生产商名称:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("食品生产许可证编号") && !propParam.categorys[1].name.Contains("见包装") && !propParam.categorys[1].name.Contains("见外包装")) - SCID = "食品生产许可证编号:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("产品标准号") && !propParam.categorys[1].name.Contains("见包装") && !propParam.categorys[1].name.Contains("见外包装")) - GBID = "产品标准号:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("保质期")) - ExpDate = "保质期:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("生产日期")) - MakeDate = "生产日期:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("净含量")) - NetContent = "净含量:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("包装方式")) - Pack = "包装方式:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("配料表")) - inList = "配料表:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("联系方式")) - contact = "联系方式:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("地址")) - address = "地址:" + propParam.categorys[1].name; - else if (propParam.categorys[0].name.Contains("贮存条件")) - Storage = "贮存条件:" + propParam.categorys[1].name; - } - - var bookStr = foodName + "\r\n" + "\r\n"; - bookStr += companyName + "\r\n" + "\r\n"; - bookStr += SCID + "\r\n" + "\r\n"; - bookStr += GBID + "\r\n" + "\r\n"; - bookStr += ExpDate + "\r\n" + "\r\n"; - bookStr += MakeDate + "\r\n" + "\r\n"; - bookStr += NetContent + "\r\n" + "\r\n"; - bookStr += Pack + "\r\n" + "\r\n"; - bookStr += inList + "\r\n" + "\r\n"; - bookStr += contact + "\r\n" + "\r\n"; - bookStr += address + "\r\n" + "\r\n"; - bookStr += Storage + "\r\n" + "\r\n"; - - int width = 800; - int height = 1000; - var bookImg = new Bitmap(width, height); - using (Graphics g = Graphics.FromImage(bookImg)) - { - g.Clear(Color.Gray); - - Brush borderBrush = Brushes.Gray; - Brush contentBrush = Brushes.White; - g.FillRectangle(contentBrush, new RectangleF(8, 8, width - 16, height - 16)); - g.FillRectangle(borderBrush, new RectangleF(18, 18, width - 36, height - 36)); - g.FillRectangle(contentBrush, new RectangleF(22, 22, width - 44, height - 44)); - g.FillRectangle(borderBrush, new RectangleF(40, 140, width - 80, 4)); - - SizeF textSize; - { - Font font = new Font("微软雅黑", 30, FontStyle.Regular); - Brush textBrush = Brushes.DarkRed; - g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - // 测量文本的宽度 - textSize = g.MeasureString("商 品 标 签", font); - float x = (width - textSize.Width) / 2; - - RectangleF rectF = new RectangleF(x, 50, width - x, height - 200); - g.DrawString("商 品 标 签", font, textBrush, rectF); - } - - { - //Font font = new Font("宋体", 15, FontStyle.Bold); - Font font = new Font("微软雅黑", 15, FontStyle.Regular); - Brush textBrush = Brushes.Black; - g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - RectangleF rectF = new RectangleF(80, 120 + textSize.Height, width - 160, height - 80 - 120 - textSize.Height); - g.DrawString(bookStr, font, textBrush, rectF); - } - } - - Thread.Sleep(Randomx.GetId(500, 800)); - var locationStr = UploadImg(shop, bookImg, cell); - if (!locationStr.Contains("\"success\":true")) - return locationStr; - var location = BaseRegex.GetStringJson(ref locationStr, "Location"); - upProdParam.product.info.qualificationList.Add(new qualificationParam() { qualificationId = "50000057", qualificationUrl = new List() { location }, }); - } - #endregion - - #region 标签图 成人用品 - //qualificationList - if (upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") - { - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成成人用品专有信息"; - })); - } - - string prodName = "产品名称:" + - (upProdParam.product.info.category.Count > 2 ? upProdParam.product.info.category[2].name : upProdParam.product.info.category.LastOrDefault()?.name); - string company = "生产企业:浙江邦臣医药有限公司"; - string address = "制造商地址:浙江省金华市婺城区神丽路1399号6号厂房"; - string model = "产品型号:见包装"; - string material = "材质:其他"; - string user = "适用人群:18岁以上成年人"; - - foreach (var propParam in upProdParam.product.info.param) - { - //if (propParam.categorys[0].name.Contains("产品名称")) - // prodName = "产品名称:" + propParam.categorys[1].name; - } - - var bookStr = prodName + "\r\n" + "\r\n" + - company + "\r\n" + "\r\n" + - address + "\r\n" + "\r\n" + - model + "\r\n" + "\r\n" + - material + "\r\n" + "\r\n" + - user; - - var bookImg = new Bitmap(800, 800); - using (Graphics g = Graphics.FromImage(bookImg)) - { - g.Clear(Color.White); - //Font font = new Font("宋体", 15, FontStyle.Bold); - Font font = new Font("微软雅黑", 15, FontStyle.Regular); - Brush textBrush = Brushes.Black; - g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - RectangleF rectF = new RectangleF(80, 80, 800 - 80, 800 - 80); - g.DrawString(bookStr, font, textBrush, rectF); - } - - Thread.Sleep(Randomx.GetId(500, 800)); - var locationStr = UploadImg(shop, bookImg, cell); - if (!locationStr.Contains("\"success\":true")) - return locationStr; - var location = BaseRegex.GetStringJson(ref locationStr, "Location"); - upProdParam.product.info.qualificationList.Add(new qualificationParam() { qualificationId = "50000089", qualificationUrl = new List() { location }, }); - } - - if (upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") - { - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在生成成人用品专有信息"; - })); - } - - string prodName = (upProdParam.product.info.category.Count > 2 ? upProdParam.product.info.category[2].name : upProdParam.product.info.category.LastOrDefault()?.name); - - var baseImg = TemuKJD.Properties.Resources.qingqu; - var newImg = new Bitmap(baseImg.Width, baseImg.Height); - using (Graphics g = Graphics.FromImage(newImg)) - { - //g.Clear(Color.White); - g.DrawImage(baseImg, new Rectangle(0, 0, newImg.Width, newImg.Height), 0, 0, baseImg.Width, baseImg.Height, GraphicsUnit.Pixel); - - g.FillRectangle(Brushes.White, 860.ParseToInt(), (1024 - 4).ParseToInt(), 500, 120); - - //Font font = new Font("宋体", txtSize.Text.Trim().ParseToInt(), FontStyle.Bold); - Font font = new Font("宋体", 44.ParseToInt(), FontStyle.Regular); - //Font font = new Font("微软雅黑", 15, FontStyle.Regular); - Brush textBrush = Brushes.Black; - textBrush = new SolidBrush(Color.FromArgb(0, 0, 0)); - g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; - RectangleF rectF = new RectangleF(860, 1024, baseImg.Width - 80, baseImg.Height - 80); - if (!string.IsNullOrWhiteSpace(prodName.Trim())) - g.DrawString(prodName.Trim(), font, textBrush, rectF); - } - - Thread.Sleep(Randomx.GetId(500, 800)); - var locationStr = UploadImg(shop, newImg, cell); - if (!locationStr.Contains("\"success\":true")) - return locationStr; - var location = BaseRegex.GetStringJson(ref locationStr, "Location"); - upProdParam.product.info.qualificationList.Add(new qualificationParam() { qualificationId = "50000115", qualificationUrl = new List() { location }, }); - } - #endregion - } - #endregion - - #region AI生成图片,用于商品裂变 - if (chkAiImage.Checked) - { - int imgCount = 1; - Invoke(new Action(() => - { - if (cell != null) - cell.Value = "正在Ai生图"; - imgCount = txtAiImgCount.Text.Trim().ParseToInt(); - if (imgCount == 0) - imgCount = 1; - })); - - List tList = new List(); - List errStrLst = new List(); - for (int n = 0; n < upProdParam.product.info.headImg.Count && n < imgCount; n++) - { - while (tList.Count >= 10) - { - Thread.Sleep(500); - tList.RemoveAll(t => t.IsCanceled || t.IsFaulted || t.IsCompleted); - } - var tt = Task.Run(() => - { - var imgUrl = GetAiImg(upProdParam.product.info.headImg[n], upProdParam.product.info.shortTitle); - if (imgUrl.StartsWith("生成Ai图片错误")) - { - errStrLst.Add(imgUrl); - return; - //return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + imgUrl + "\"}"; - } - - // api上传图片文件 Ai主图 - if (1 == 1) - { - try - { - string errMsg = ""; - //var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, needAddRandomBlock, wantAddRandomBlock, 800, 800); - var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, false, false, 800, 800); - if (!string.IsNullOrEmpty(errMsg)) - { - errStrLst.Add(errMsg); - return; - //return errMsg; - } - - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - //upDate += "&is_file=true"; - //if (needAddRandomBlock || wantAddRandomBlock) - // upDate += "&random_code=true"; - upDate += "&img_url=" + imgUrl; - upDate += "&img_base64=" + imgBase64; - - var sTime = DateTime.Now; - var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在上传Ai主图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); - if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) - { - upProdParam.product.info.headImg[n] = upImgUrl; - //if (n == 0) - // upProdParam.product.info.detail.detailImg.Insert(0, upImgUrl); - } - else - { - string upImgErrMsg = BaseRegex.GetStringJsonByRegs(ref apiUpImgFileRst, apiUpImgFileRst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); - errStrLst.Add("上传Ai图失败 " + upImgErrMsg); - return; - //return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"上传Ai图失败 " + upImgErrMsg + "\"}"; - } - } - catch (Exception ex) - { - errStrLst.Add("上传Ai图失败 " + ex.Message); - return; - //return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"上传Ai图失败 " + ex.Message + "\"}"; - } - } - }); - tList.Add(tt); - } - while (tList.Count > 0) - { - Thread.Sleep(500); - tList.RemoveAll(t => t.IsCanceled || t.IsFaulted || t.IsCompleted); - } - // 错误超过一定数量直接报错返回 - if (errStrLst.Count > 0 && errStrLst.Count >= imgCount / 3) - { - return string.Join(",", errStrLst); - } - } - #endregion - - #region 添加图片随机外框,用于商品裂变 - if (selectProd.is_fission_title && chkRandomImgBorder.Checked) - { - // selectProd.isFission - int mainCount = 9; - int detailCount = 1; - Invoke(new Action(() => - { - mainCount = txtMainBorderImgCount.Text.Trim().ParseToInt(); - detailCount = txtDetailBorderImgCount.Text.Trim().ParseToInt(); - })); - // api上传图片文件 边框主图 - if (1 == 1) - { - if (chkRandomMainImgOrder.Checked) - upProdParam.product.info.headImg = upProdParam.product.info.headImg.OrderBy(x => Guid.NewGuid()).Take(100).ToList(); - for (int n = 0; n < upProdParam.product.info.headImg.Count && n < mainCount; n++) - { - var imgUrl = upProdParam.product.info.headImg[n]; - try - { - string errMsg = ""; - //var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, needAddRandomBlock, wantAddRandomBlock, 800, 800); - var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, false, false, 800, 800, true); - if (!string.IsNullOrEmpty(errMsg)) - { - return errMsg; - } - - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - //upDate += "&is_file=true"; - //if (needAddRandomBlock || wantAddRandomBlock) - // upDate += "&random_code=true"; - upDate += "&img_url=" + imgUrl; - upDate += "&img_base64=" + imgBase64; - - var sTime = DateTime.Now; - var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在优化主图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); - if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) - { - upProdParam.product.info.headImg[n] = upImgUrl; - } - else - { - string upImgErrMsg = BaseRegex.GetStringJsonByRegs(ref apiUpImgFileRst, apiUpImgFileRst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"优化主图失败 " + upImgErrMsg + "\"}"; - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"优化主图失败 " + ex.Message + "\"}"; - } - } - } - // api上传图片文件 边框详情图 - if (1 == 1) - { - if (chkRandomDetailImgOrder.Checked) - upProdParam.product.info.detail.detailImg = upProdParam.product.info.detail.detailImg.OrderBy(x => Guid.NewGuid()).Take(100).ToList(); - for (int n = 0; n < upProdParam.product.info.detail.detailImg.Count && n < detailCount; n++) - { - var imgUrl = upProdParam.product.info.detail.detailImg[n]; - try - { - string errMsg = ""; - //var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, needAddRandomBlock, wantAddRandomBlock, 800, 800); - var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, false, false, 800, 800, true); - if (!string.IsNullOrEmpty(errMsg)) - { - return errMsg; - } - - var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); - var upDate = UserLogin.GetSignaturex(); - upDate += "&token=" + token.accessToken; - //upDate += "&is_file=true"; - //if (needAddRandomBlock || wantAddRandomBlock) - // upDate += "&random_code=true"; - upDate += "&img_url=" + imgUrl; - upDate += "&img_base64=" + imgBase64; - - var sTime = DateTime.Now; - var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在优化详情图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); - })); - } - - for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) - { - token.mdyTime = DateTime.Now.AddDays(-100); - token = new WxApiBLL().GetRandomWxToken(); - apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); - } - var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); - if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) - { - upProdParam.product.info.detail.detailImg[n] = upImgUrl; - } - else - { - string upImgErrMsg = BaseRegex.GetStringJsonByRegs(ref apiUpImgFileRst, apiUpImgFileRst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"优化详情图失败 " + upImgErrMsg + "\"}"; - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"优化详情图失败 " + ex.Message + "\"}"; - } - } - } - } - #endregion - - // 直接使用微信回采情趣商品品牌 - if (BaseClass.UserAuthority.ParseToString().Contains("微信回采") && chkUseWXComplateProd.Checked && - upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") - { - if (DefaultAdultBrandId.ParseToLong() > 0) - upProdParam.product.info.brandId = DefaultAdultBrandId.ParseToLong(); - } - // 情趣内衣等类目禁止设置运费险 - if (upProdParam.product.info.category[1].name == "情趣内衣" || - upProdParam.product.info.category[1].name == "水果") - { - upProdParam.product.info.extraService.freightInsurance = 0; - } - // 假1赔3 - if (upProdParam.product.info.category[0].name == "珠宝首饰" || upProdParam.product.info.category[1].name == "时尚饰品") - { - upProdParam.product.info.extraService.fakeOnePayFour = 1; - } - // 坏损包退 damageGuarantee - if (upProdParam.product.info.category[0].name == "生鲜" || upProdParam.product.info.category[0].name == "酒类" || - upProdParam.product.info.category[0].name == "食品饮料" || upProdParam.product.info.category[0].name == "保健食品/膳食营养补充食品" || - (upProdParam.product.info.category[0].name == "农资园艺" && upProdParam.product.info.category[1].name == "花卉绿植")) - { - upProdParam.product.info.extraService.damageGuarantee = 1; - } - // 生鲜不支持换货,关闭 - if (upProdParam.product.info.category[0].name == "生鲜") - { - upProdParam.product.info.extraService.exchangeSupport = 0; - } - - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "正在提交商品"; - })); - } - Thread.Sleep(Randomx.GetId(1000, 2000)); - - var uploadDraftRst = WXUpload.uploadProductDraft(shop, upProdParam); - if (!uploadDraftRst.Contains("\"code\":0") && !uploadDraftRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref uploadDraftRst, "msg"); - if (string.IsNullOrEmpty(error)) - { - if (uploadDraftRst.Contains("\"errcode\":9401043")) - error = "sku价格异常,请检查加价比例"; - else - error = uploadDraftRst; - } - var draftId = BaseRegex.GetStringJson(ref uploadDraftRst, "productId").ParseToLong(); - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"草稿保存失败 " + GetHtml.UrlEncodeUtf8(error) + "\"}"; - } - if (cell != null) - { - Invoke(new Action(() => - { - var timeSpan = DateTime.Now - startTime; - var duration = timeSpan.TotalSeconds; - cell.Value = "商品已保存草稿,正在提交上架" + " " + duration.ParseToInt() + "秒"; - })); - } - - #region 保存缓存盗链图片 - if (isChangeImgDic) - { - var url = BaseClass.BuildObjString("product/mdy_pdd_product"); - var data = ""; - Invoke(new Action(() => - { - data = UserLogin.GetSignaturex(); - data += "&spu_id=" + dbProd.spu_id; - data += "&wx_img_map_json=" + JsonHelper.SerializeObject(wxImgMapDic); - })); - var 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")) - html = GetHtml.PostUtf8(url, data); - isChangeImgDic = false; - } - #endregion - - upProdParam.product.productKey.productId = BaseRegex.GetLongJson(ref uploadDraftRst, "productId").ParseToString(); - - var commissionRstStr = ""; - if (chkUpDraft.Checked && BaseClass.UserAuthority.Contains("佣金上货") && chkCommission.Checked) - { - var rst = WXUpload.addLeagueItemForUpdatingProduct(shop, 1, commissionRate, 1, commissionRate, upProdParam.product.productKey.productId.ParseToLong()); - if (!rst.Contains("\"code\":0")) - { - var error = BaseRegex.GetStringJsonByRegs(ref rst, rst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); - commissionRstStr = "设置佣金比例失败 " + rst; - } - } - - if (chkUpDraft.Checked) - { - selectProd.wxDraftProduct = upProdParam; - selectProd.draft_id = upProdParam.product.productKey.productId; - 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); - - return "{\"success\":true,\"draftId\":" + upProdParam.product.productKey.productId + ",\"status\":\"草稿箱\",\"errMsg\":\"指定上传到草稿箱" + commissionRstStr + "\"}"; - } - - // 提交商品上架 - if (!chkTestNoAuditUpload.Checked) - { - var uploadProdRst = WXUpload.upProductV2(shop, upProdParam); - //{"success":true,"retcode":209006,"errcode":209006,"productId":10001226244322,"productKey":{"productId":"10001226244322"}} // 提审成功 - //{"success":true,"retcode":0,"errcode":0,"productId":10001226095876,"productKey":{"productId":"10001226095876"}} // 未能提审 - if (!uploadProdRst.Contains("\"code\":0") && !uploadProdRst.Contains("\"success\":true")) - { - 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 + "\"}"; - } - if (upProdParam.product.productKey.productId.IsNullOrEmpty()) - upProdParam.product.productKey.productId = BaseRegex.GetLongJson(ref uploadProdRst, "productId").ParseToString(); - - if (BaseClass.UserAuthority.Contains("佣金上货") && chkCommission.Checked) - { - var rst = WXUpload.addLeagueItemForUpdatingProduct(shop, 1, commissionRate, 1, commissionRate, upProdParam.product.productKey.productId.ParseToLong(), 1); - if (!rst.Contains("\"code\":0")) - { - var error = BaseRegex.GetStringJsonByRegs(ref rst, rst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); - commissionRstStr = "设置佣金比例失败 " + rst; - } - } - if (chkIsSubmitSuccess.Checked) - { - Thread.Sleep(Randomx.GetId(2000, 3001)); - var uploadCheckRst = WXUpload.SearchProductUpload(shop, upProdParam.product.productKey.productId); - if (uploadCheckRst.Contains("\"productList\":[]") || uploadCheckRst.Contains("\"totalNum\":0")) - { - return "{\"success\":false,\"draftId\":" + upProdParam.product.productKey.productId + ",\"status\":\"草稿箱\",\"errMsg\":\"上架提审失败 请检查是否在架商品数已达到上限或店铺受到其他限制\"}"; - } - } - } - else - { - #region 尝试免审接口提交 未成功 作废 - var getEditProd = WXUpload.getEditProductV2(shop, upProdParam.product.productKey.productId); - //getEditProd = getEditProd.Replace("8388275713", "33333333"); - //getEditProd = getEditProd.Replace("33333333", "8387633147"); - - string productJson = ""; - try - { - // 获取免审编辑回传数据 - JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - var prodStr = JsonConvert.SerializeObject(upProdParam, jsonSetting); - JObject jObj = JsonHelper.JObjectParse(prodStr); - - JObject jObjTmp = JsonHelper.JObjectParse(getEditProd); - jObj["product"] = jObjTmp["product"]; - - //productJson = productJson.Replace("999", "1005"); - jObj["product"]["status"] = 1; //默认为5 - foreach (var sku in jObj["product"]["productSkus"]) - { - sku["productSkuInfo"]["stockInfo"]["stockNum"] = "1000"; - sku["productSkuInfo"]["stockInfo"]["totalNum"] = "1000"; - //sku["productSkuInfo"]["realStockInfo"]["stockNum"] = "1000"; - //sku["productSkuInfo"]["realStockInfo"]["totalNum"] = "1000"; - - var realStockInfo = new realStockInfoParam() { stockNum = 999, totalNum = 999 }; - sku["productSkuInfo"]["realStockInfo"] = JsonHelper.JObjectParse(JsonHelper.SerializeObject(realStockInfo)); - } - productJson = JsonHelper.SerializeObject(jObj); - - // 提交上架 - //var uploadProdRst = WXUpload.upProductJObjectV2(shop, productJson); - } - catch (Exception ex) - { - } - - string submitJson = "{\"name\":\"goods/" + upProdParam.product.productKey.productId + "/" + DateTime.Now.ToString("yyyy-MM-dd") + "/" + - BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now) + "/submit.json\"}"; - var initFileName = BaseRegex.GetStringJson(ref submitJson, "name"); - DateTime tickTime = DateTime.Now.AddSeconds(0 - Randomx.GetId(10, 30)); - int time1 = BaseClass.DateTimeToTimestampSeconds(tickTime) - Randomx.GetId(80, 150); - int time2 = BaseClass.DateTimeToTimestampSeconds(tickTime); - - var uploadPartRst = WXUpload.initUploadPart(shop, submitJson, upProdParam.product.productKey.productId, time1, time2); - string uploadPartId = BaseRegex.GetStringJson(ref uploadPartRst, "uploadId"); - - //upProdParam.product.status = 5; - //upProdParam.product.editStatus = 0; - //upProdParam.product.auditReason = ""; - //upProdParam.product.info.skuIdList = new skuIdListParam(); - //upProdParam.product.info.skuList = new skuListParam(); - //upProdParam.product.info.skuList.skuInfo = new List(); - //var listingAuditFreeRst = WXUpload.listingAuditFree(shop, upProdParam, upProdParam.product.productKey.productId, time1, time2); - // 提交免审修改(实际生效接口) - var listingAuditFreeRst = WXUpload.listingAuditFree(shop, productJson, upProdParam.product.productKey.productId, time1, time2); - - string tempBlobPath = Path.GetTempPath().Trim('\\') + "\\" + Randomx.GetWordWithNumber(8).ToLower(); - if (!Directory.Exists(tempBlobPath)) - Directory.CreateDirectory(tempBlobPath); - string blobFullPath = tempBlobPath + "\\blob"; // C:\Users\Administrator\AppData\Local\Temp\3mer3k21\blob - using (StreamWriter sw = new StreamWriter(blobFullPath)) - { - //skuParam.productSkuInfo.realStockInfo = new realStockInfoParam() { stockNum = 1005, totalNum = 1005 }; - - - var jObj = JsonHelper.JObjectParse(productJson); - foreach (JObject skuObj in jObj["product"]["productSkus"]) - { - skuObj["productSkuInfo"]["stockInfo"]["stockNum"] = 1005; - - var realStockInfo = new realStockInfoParam() { stockNum = 999, totalNum = 999 }; - skuObj["productSkuInfo"]["realStockInfo"] = JsonHelper.JObjectParse(JsonHelper.SerializeObject(realStockInfo)); - } - - JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - foreach (var sku in upProdParam.product.productSkus) - { - sku.productSkuInfo.stockInfo.stockNum = 1005; - } - var prodStr = JsonConvert.SerializeObject(upProdParam, jsonSetting); - prodStr = JsonHelper.SerializeObject(jObj["product"]); - sw.Write(prodStr); - } - uploadPartRst = WXUpload.uploadPartBinary(shop, initFileName, blobFullPath, uploadPartId, upProdParam.product.productKey.productId, time1, time2); - //{"code":0,"etag":"18e3f73046378472219641ef181d3232"} - //C:\Users\Administrator\AppData\Local\Temp\9uaeiplr\blob - - var eTag = BaseRegex.GetStringJson(ref uploadPartRst, "etag"); - string rstParmStr = @"{""name"":""" + initFileName + @""",""uploadId"":""" + uploadPartId + @""",""etagList"":[""" + eTag + @"""],""partSeqList"":[1]}"; - var complateRst = WXUpload.completeUploadPart(shop, rstParmStr, upProdParam.product.productKey.productId, time1, time2); - - #endregion - } - - if (cell != null) - { - Invoke(new Action(() => - { - var timeSpan = DateTime.Now - startTime; - var duration = timeSpan.TotalSeconds; - cell.Value = "商品已上传" + " " + duration.ParseToInt() + "秒"; - })); - } - - // 已传的商品保存为安全商品 - if (dbProd.wx_safe_status == "未校验") - { - var url = BaseClass.BuildObjString("product/mdy_pdd_product"); - var data = ""; - Invoke(new Action(() => - { - data = UserLogin.GetSignaturex(); - data += "&spu_id=" + dbProd.spu_id; - data += "&wx_safe_status=安全商品"; - })); - var 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")) - html = GetHtml.PostUtf8(url, data); - } - if (!string.IsNullOrEmpty(dbProd.secret_spu_id)) - { - //add_secret_spu_id_shop_id_map //测试id "2017522348787531778" FC4C8B7F3C6E4B029AD2A12D4D323B41 // 老函数已作废 - var url = BaseClass.BuildObjString("product/wx_add_secret_id_up_map"); - var data = ""; - Invoke(new Action(() => - { - data = UserLogin.GetSignaturex(); - data += "&up_secret_spu_id=" + dbProd.secret_spu_id; - data += "&up_spu_id=" + dbProd.spu_id; - data += "&shop_id=" + shop.ShopId; - data += "&index=" + Math.Abs(dbProd.secret_spu_id.GetHashCode()) % 1024; - data += "&price_max=" + upProdParam.product.productSkus.Max(s => s.productSkuInfo.salePrice); - data += "&price_min=" + upProdParam.product.productSkus.Min(s => s.productSkuInfo.salePrice); - })); - var 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")) - html = GetHtml.PostUtf8(url, data); - } - - //colUploadCount - var dgvShopRow = dgvShop.Rows.Cast().FirstOrDefault(row => row.Cells["colShopId"]?.Value.ParseToString() == shop.ShopId); - if (dgvShopRow != null) - { - var day = DateTime.Now.ToString("yyyyMMdd").ParseToInt(); - if (!GlobalConfig.dicWxShopUploadInfo.ContainsKey(shop.ShopId)) - GlobalConfig.dicWxShopUploadInfo[shop.ShopId] = new WxShopUploadInfo(); - if (!GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.ContainsKey(day)) - GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day] = 0; - GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day] += 1; - // 删除45天前的记录 - var removeKeys = GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.Keys.Where(s => s < DateTime.Now.AddDays(-45).ToString("yyyyMMdd").ParseToInt()).ToList(); - foreach (var key in removeKeys) - { - GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.Remove(key); - } - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_shop_upload_info", GlobalConfig.dicWxShopUploadInfo); - - Invoke(new Action(() => - { - dgvShopRow.Cells["colUploadCount"].Value = GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day]; - })); - } - - return "{\"success\":true,\"draftId\":" + upProdParam.product.productKey.productId + ",\"status\":\"已上传\",\"msg\":\"上传成功" + commissionRstStr + "\"}"; - } - - - public static string GetImgBase64ForApi(out string errorMsg, string img_url, bool needAddRandomBlock, bool wantAddRandomBlock, int imgWidth = 0, int imgHeight = 0, bool wantAddRandomBorder = false) - { - errorMsg = ""; - string imgBase64 = ""; - //------------------------------------------------------------------------------------------------------------------------------------- - //生成主图base64字符串 - string getImgError; - if (!img_url.Contains("wst.wxapp.tc.qq.com") && !img_url.Contains("mmecimage.cn")) - img_url = img_url.Replace("https://", "http://"); - var image = GetHtml.GetUrlImg(img_url, out getImgError); - if (image == null) - image = new Bitmap(800, 800); - if (imgWidth == 0 || imgHeight == 0) - { - imgWidth = image.Width; - imgHeight = image.Height; - } - var imageBg = new Bitmap(imgWidth, imgHeight); - if (image == null || !string.IsNullOrEmpty(getImgError)) - { - errorMsg = "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"初始化图片上传失败 " + getImgError + "\"}"; - return ""; - } - try - { - using (Graphics g = Graphics.FromImage(imageBg)) - { - g.DrawImage(image, new Rectangle(0, 0, imageBg.Width, imageBg.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); - if (needAddRandomBlock || wantAddRandomBlock) - { - g.FillRectangle(new SolidBrush(Color.FromArgb(Randomx.GetId(256), Randomx.GetId(256), Randomx.GetId(256))), - new Rectangle(Randomx.GetId(imageBg.Width - 30), Randomx.GetId(imageBg.Height - 30), 30, 30)); - } - if (wantAddRandomBorder) - { - var borderColor = Color.FromArgb(Randomx.GetId(256), Randomx.GetId(256), Randomx.GetId(256)); - g.FillRectangle(new SolidBrush(borderColor), new Rectangle(0, 0, imageBg.Width, 20)); - g.FillRectangle(new SolidBrush(borderColor), new Rectangle(0, imageBg.Height - 20, imageBg.Width, 20)); - g.FillRectangle(new SolidBrush(borderColor), new Rectangle(0, 0, 20, imageBg.Height)); - g.FillRectangle(new SolidBrush(borderColor), new Rectangle(imageBg.Width - 20, 0, 20, imageBg.Height)); - } - } - using (MemoryStream memoryStream = new MemoryStream()) - { - imageBg.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); - byte[] imageBytes = memoryStream.ToArray(); - imgBase64 = Convert.ToBase64String(imageBytes); - return imgBase64; - } - } - catch (Exception ex) - { - errorMsg = "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改图片失败 " + ex.Message + "\"}"; - return ""; - } - } - - public string UploadImg(ShopLoginInfo shop, string img_url, DataGridViewCell cell = null, bool randomBlock = false) - { - string getImgError; - var image = GetHtml.GetUrlImg(img_url.Replace("https://", "http://"), out getImgError); - if (image == null) - image = new Bitmap(800, 800); - var imageBg = new Bitmap(image.Width, image.Height); - if (!string.IsNullOrEmpty(getImgError) || image == null) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"初始化图片上传失败\"}"; - } - try - { - using (Graphics g = Graphics.FromImage(imageBg)) - { - g.DrawImage(image, new Rectangle(0, 0, imageBg.Width, imageBg.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); - if (randomBlock) - g.FillRectangle(new SolidBrush(Color.FromArgb(Randomx.GetId(256), Randomx.GetId(256), Randomx.GetId(256))), - new Rectangle(Randomx.GetId(imageBg.Width - 30), Randomx.GetId(imageBg.Height - 30), 30, 30)); - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + "修改图片失败 " + ex.Message + "\"}"; - } - return UploadImg(shop, imageBg, cell); - } - - - public string UploadImg(ShopLoginInfo shop, Bitmap img, DataGridViewCell cell = null) - { - var upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); - for (int i = 0; i < 20 && upImgAuthRst.Contains("LogicError"); i++) - { - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "图片提报失败,正在重试。" + (i + 1); - })); - } - Thread.Sleep(Randomx.GetId(3000, 6000)); - upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); - } - if (!upImgAuthRst.Contains("\"code\":0")) - { - var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = upImgAuthRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"申请上传图片失败 " + GetHtml.UrlEncodeUtf8(error) + "\"}"; - } - string disK = BaseRegex.GetStringJson(ref upImgAuthRst, "disK"); - long disT = BaseRegex.GetLongJson(ref upImgAuthRst, "disT"); - string ext = BaseRegex.GetStringJson(ref upImgAuthRst, "ext"); - string imgBase64 = ""; - - //------------------------------------------------------------------------------------------------------------------------------------- - //生成图片base64字符串 - try - { - using (MemoryStream memoryStream = new MemoryStream()) - { - img.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); - byte[] imageBytes = memoryStream.ToArray(); - imgBase64 = Convert.ToBase64String(imageBytes); - } - } - catch (Exception ex) - { - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + "修改图片失败 " + ex.Message + "\"}"; - } - - //------------------------------------------------------------------------------------------------------------------------------------- - //上传图片,获取图片路径 - var upImgRst = WXUpload.adtimageupload(shop, imgBase64, disK, disT, ext).ParseToString(); - var location = BaseRegex.GetStringJson(ref upImgRst, "Location"); - if (string.IsNullOrEmpty(location)) - { - var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = upImgAuthRst; - return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"图片上传失败 " + error + "\"}"; - } - return "{\"success\":true,\"location\":\"" + location + "\"}"; - } - - private void btnStop_Click(object sender, EventArgs e) - { - if (this.cancellationTokenSource != null) - this.cancellationTokenSource.Cancel(); - } - - CancellationTokenSource getProdTokenSource = null; - private void pbSelectProd_Click(object sender, EventArgs e) - { - if (getProdTokenSource != null) - getProdTokenSource.Cancel(); - } - private void btnRandomAdd_Click(object sender, EventArgs e) - { - btnRandomAdd.Enabled = false; - Task.Run(() => - { - Thread.Sleep(5000); - Invoke(new Action(() => - { - btnRandomAdd.Enabled = true; - })); - }); - - if (BaseClass.UserAuthority.Contains("裂变调试") && chkFissionGoodsName.Checked) - { - Invoke(new Action(() => - { - var titles = txtFissionTitle.Text.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); - txtAddCount.Text = "" + titles.Count; - if (titles.Count == 0) - { - BaseMsgForm.ShowError("裂变标题数量不足"); - return; - } - - //this.lstTemuDBProductSelect.Clear(); - //NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); - //lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; - })); - } - - pbSelectProd.Visible = true; - int addCount = txtAddCount.Text.Trim().ParseToInt(); - if (getProdTokenSource != null) - getProdTokenSource.Cancel(); - getProdTokenSource = new CancellationTokenSource(); - Task.Run(() => - { - List prodLst = new List(); - int index = 0; - int pageSize = 50; - int prodCount = 99999999; - while (addCount > 0) - { - if (getProdTokenSource.IsCancellationRequested) - break; - - index++; - // 如果产品数量在0到50之间,说明数据库商品数量不足,无需再重复筛选,直接随机打乱 - if (prodLst.Count == 0 || prodCount > pageSize) - { - if (prodCount != 99999999) - { - //不重复筛选 - prodLst = GetRandomProductList(out prodCount, 1, Math.Min(pageSize, addCount), true, prodCount); - } - else - { - prodLst = GetRandomProductList(out prodCount, 1, Math.Min(pageSize, addCount)); - } - //Thread.Sleep(Randomx.GetId(50, 100)); - Thread.Sleep(Randomx.GetId(250, 500)); - } - else - { - prodLst = prodLst.OrderBy(x => Guid.NewGuid()).ToList(); - Thread.Sleep(Randomx.GetId(10, 30)); - } - Invoke(new Action(() => - { - lblGoodsCount.Text = "产品库 " + prodCount + " 件"; - })); - if (prodLst.Count == 0) // 等于0要么库里没数据要么出错了,跳出 - break; - foreach (var prod in prodLst) - { - var productNameLst = new List() { prod.product_name }; - if (chkRandomFissionProduct.Checked) - { - Invoke(new Action(() => - { - var titleCount = txtRandomFissionProductCount.Text.Trim().ParseToInt(); - if (prod.fission_words.ParseToString().Length > 20 && titleCount > 0) - { - productNameLst = prod.fission_words.Replace("fission_goods_names:", "") - .Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).OrderBy(x => Guid.NewGuid()).Distinct().Take(titleCount) - .ToList(); - } - })); - } - foreach (var productName in productNameLst) - { - var selectProd = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(prod)); - selectProd.product_name = productName; - if (chkRandomFissionProduct.Checked) - selectProd.is_fission_title = true; - selectProd.out_product_Id = prod.id.ToString(); - selectProd.id = 1; - if (lstTemuDBProductSelect.Count > 0) - selectProd.id = lstTemuDBProductSelect.Max(p => p.id) + 1; - this.lstTemuDBProductSelect.Add(selectProd); - - addCount--; - if (addCount <= 0) - break; - } - - Invoke(new Action(() => - { - lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; - })); - //addCount--; - if (addCount <= 0) - break; - } - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); - } - - Invoke(new Action(() => - { - pbSelectProd.Visible = false; - })); - }, getProdTokenSource.Token); - } - - public List GetRandomProductList(out int totalCount, int page = 1, int pageSize = 50, bool isNotCount = false, int totalProdCount = 0) - { - var lstShopId = dgvShop.Rows.Cast().Where(row - => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); - - List list = new List(); - int pageCount = 1; - totalCount = 0; - - var url = BaseClass.BuildObjString("product/get_pdd_product_list_random"); - var data = ""; - Invoke(new Action(() => - { - data = UserLogin.GetSignaturex() + - "&page=" + 1 + - "&page_size=" + pageSize; - if (isNotCount) - { - data += "&is_not_count=" + true; - data += "&prod_count=" + totalProdCount; - } - data += "&ban_wx=0"; - - //data += "&in_ext_codes=" + txtExtCodeFilter.Text; - data += "&in_spu_ids=" + txtIdFilter.Text; - - string serach_group = cmbGroupFilter.Text.Trim(); - if (BaseClass.UserAuthority.Contains("商品采集") || BaseClass.ParentAuthority.Contains("商品采集")) - { - if (BaseClass.GroupId == 3) - serach_group = cmbGroupFilter.Text.Trim().Replace("我的商品", "用户" + BaseClass.UserName); - else - serach_group = cmbGroupFilter.Text.Trim().Replace("我的商品", "用户" + BaseClass.ParentUserName); - } - data += "&in_groups=" + serach_group; - - data += "&in_notes=" + cmbNotes.Text.Trim(); - - data += "&product_name=" + txtSearchGoodsName.Text.Trim(); - - // 商品采集权限可以随机管理员或自己采集的商品 - string addUserName = BaseClass.UserAuthority.Contains("商品采集") ? ("admin," + BaseClass.UserName) : "admin"; - if (BaseClass.GroupId != 3) - addUserName = BaseClass.ParentAuthority.Contains("商品采集") ? ("admin," + BaseClass.ParentUserName) : "admin"; - - // 采集用户如果没有爆款数据或货源选择权限,则只能随机自己采集的商品 - if ((BaseClass.UserAuthority.Contains("商品采集") || BaseClass.UserAuthority.Contains("商品采集")) && - cmbHot.Text != "爆款数据" && !BaseClass.UserAuthority.Contains("货源选择")) - data += "&add_user_name=" + (BaseClass.GroupId == 3 ? BaseClass.UserName : BaseClass.ParentUserName); - - // 防止手输查询学员数据 - if (!BaseClass.UserAuthority.Contains("学员数据") && !BaseClass.ParentAuthority.Contains("学员数据") && cmbSourceType.Text.Contains("学员数据")) - { - cmbSourceType.Text = cmbSourceType.Text.Replace("学员数据", ""); - } - // 如果指定只有自己采集的商品,则只会随机自己采集的商品 - else if ((cmbSourceType.Text.Trim().Contains("多多商品") || cmbSourceType.Text.Trim().Contains("1688商品") || cmbSourceType.Text.Trim().Contains("微信商品")) && - cmbSourceType.Text.Trim().Replace("多多商品", "").Replace("1688商品", "").Replace("微信商品", "").Trim(',').IsNullOrEmpty()) - data += "&add_user_name=" + (BaseClass.GroupId == 3 ? BaseClass.UserName : BaseClass.ParentUserName); - else - data += "&add_user_name=" + addUserName; - - if (!string.IsNullOrWhiteSpace(cmbSourceType.Text.Trim())) - { - // 采集来源判断 - data += "&product_get_type=" + cmbSourceType.Text.Trim().Replace("已采集数据", "1688外部数据") - .Replace("多多商品", "机会商品,多多外部数据").Replace("1688商品", "1688厂家,1688外部数据").Replace("微信商品", "微信店采"); - } - - - - if (btnSwitchCatType.Text == "P") - data += "&in_cates=" + (cmbCateFilter1.Text == "全部" ? "" : cmbCateFilter1.Text); - else - { - var selectCate1 = GlobalConfig.WxCatList.Where(c => c.level == 1 && (";" + cmbCateFilter1.Text.Trim() + ";").Contains(";" + c.name + ";")).ToList(); - var cates2 = GlobalConfig.WxCatList.Where(c => selectCate1.Any(c1 => c.f_cat_id == c1.cat_id)).ToList(); - var selectCate2 = cates2.Where(c => c.level == 2 && (";" + cmbCateFilter2.Text.Trim() + ";").Contains(";" + c.name + ";")).ToList(); - var cates3 = GlobalConfig.WxCatList.Where(c => selectCate2.Any(c2 => c.f_cat_id == c2.cat_id)).ToList(); - var selectCate3 = cates3.Where(c => c.level == 3 && (";" + cmbCateFilter3.Text.Trim() + ";").Contains(";" + c.name + ";")).ToList(); - - if (selectCate1?.Count == 0 && chkSkipQualification.Checked) - { - // 厂商直采普通店铺不要随特殊商品 - data += "&wx_cat_1=" + string.Join(",", GlobalConfig.WxCatList.Where(c => c.level == 1 && !(c.name == "图书" || c.name == "食品饮料" || c.name == "成人用品")) - .Select(c => c.cat_id)); - } - - if (!string.IsNullOrEmpty(cmbCateFilter1.Text) && selectCate1?.Count > 0) - data += "&wx_cat_1=" + string.Join(",", selectCate1.Select(c => c.cat_id).ToList()); - if (!string.IsNullOrEmpty(cmbCateFilter2.Text) && selectCate2?.Count > 0) - data += "&wx_cat_2=" + string.Join(",", selectCate2.Select(c => c.cat_id).ToList()); - if (!string.IsNullOrEmpty(cmbCateFilter3.Text) && selectCate3?.Count > 0) - data += "&wx_cat_3=" + string.Join(",", selectCate3.Select(c => c.cat_id).ToList()); - } - - // 爆款数据商品 - // 不为空搜内容 - if (!string.IsNullOrWhiteSpace(cmbHot.Text.Trim())) - data += "&special_prod_type=" + cmbHot.Text; - // 为空按照权限搜 - else if (BaseClass.SaLevel > 0 || BaseClass.UserAuthority.Contains("爆款数据")) - data += "&special_prod_type=爆款数据,普通商品"; - else - data += "&special_prod_type=普通商品"; - - // 聚水潭商品处理条件校验 - data += "&is_supplier_prod_ok=" + cmbJstInitSet.Text.Trim(); - - // 微信安全商品检测 - data += "&wx_safe_status=" + cmbWxSafe.Text.Trim().Replace("安全+未校验", "安全商品,未校验"); - - // 7天爆款数据 - if (chkSevenDays.Checked) - data += "&add_days_less=21"; - - // 回采数据 - if (chkWXComplateProd.Checked) - data += "&has_wx_format=1"; - - // 标题裂变 - if (chkRandomFissionProduct.Checked) - data += "&fission_words=fission_goods_names:"; - - if (chkFilterViewUv.Checked) - data += "&min_view_uv=" + numFilterViewUv.Value; - })); - var 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")) - // html = GetHtml.PostUtf8(url, data); - if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) - { - Invoke(new Action(() => - { - BaseMsgForm.ShowError("获取商品失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg")); - })); - return new List(); - } - - int count = BaseRegex.GetIntJson(ref html, "count"); - totalCount = count; - pageCount = Math.Ceiling(1.0 * count / pageSize).ParseToInt(); - pageCount = Math.Max(pageCount, 1); - - var jArr = JObject.Parse(html)["data"]; - if (jArr.Count() == 0) - return list; - var sProd = JsonHelper.SerializeObject(jArr); - - try - { - list = JsonHelper.DeserializeJsonToList(sProd).OrderBy(x => Randomx.GetId(999999)).ToList(); - return list; - } - catch (Exception ex) - { - return new List(); - } - } - - /// - /// 随机添加黄总厂商商品(或其他指定分组产品,由服务端控制) - /// - /// - /// - /// - /// - public List GetRandomCompanyProductList(out int totalCount, string groupName = "黄总数据包", int page = 1, int pageSize = 200) - { - var lstShopId = dgvShop.Rows.Cast().Where(row - => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); - - List list = new List(); - int pageCount = 1; - totalCount = 0; - - var url = BaseClass.BuildObjString("product/get_pdd_product_list_random"); - var data = ""; - Invoke(new Action(() => - { - data = UserLogin.GetSignaturex() + - "&page=" + 1 + - "&page_size=" + pageSize; - data += "&in_groups=" + groupName; - })); - var 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")) - html = GetHtml.PostUtf8(url, data); - if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) - { - Invoke(new Action(() => - { - BaseMsgForm.ShowError("获取商品失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg")); - })); - return new List(); - } - - int count = BaseRegex.GetIntJson(ref html, "count"); - totalCount = count; - pageCount = Math.Ceiling(1.0 * count / pageSize).ParseToInt(); - pageCount = Math.Max(pageCount, 1); - - var jArr = JObject.Parse(html)["data"]; - if (jArr.Count() == 0) - return list; - var sProd = JsonHelper.SerializeObject(jArr); - - try - { - list = JsonHelper.DeserializeJsonToList(sProd).OrderBy(x => Randomx.GetId(999999)).ToList(); - return list; - } - catch (Exception ex) - { - return new List(); - } - } - - public string GetAiImg(string imgUrl, string imgWord) - { - string image_url = imgUrl; - string word = imgWord; - string secret = "sadhjufhe15c4fbvFBvcvds+5sdfds@#%$xsc"; - string time = BaseClass.DateTimeToTimestampSeconds(DateTime.Now).ToString(); - string code = BaseClass.GetMd5(secret + time).ToLower(); - - try - { - //string url = "http://ai-bs.jiaotian.vip:" + Randomx.GetId(20010, 20021) + "/index.php?obj=public/image"; - //http://svn.jiaotian.vip:20010-20020/index.php?obj=public/image - string url = "http://svn.jiaotian.vip:" + Randomx.GetId(20010, 20021) + "/index.php?obj=public/image"; - string data = "time=" + time + "&code=" + code + "&image_url=" + image_url + "&word=" + word; - string html = GetHtml.PostUtf8(url, data, "", 120); - if (!string.IsNullOrEmpty(html) && !html.Contains("error")) - { - return html; - } - else - { - return "生成Ai图片错误 " + html; - } - } - catch (Exception ex) - { - return "生成Ai图片错误 " + ex.Message; - } - } - - private void btnClearUpload_Click(object sender, EventArgs e) - { - if (BaseMsgForm.ShowConfirm("确定清空待上传商品吗?清空后不可恢复!").DialogResult == DialogResult.Cancel) - return; - - this.lstTemuDBProductSelect.Clear(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); - lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; - } - - private void lblNewAddPrice_Click(object sender, EventArgs e) - { - var ucPrice = new UcAddPrice(); - if (IsSetFontScaleNone) - { - Font of = ucPrice.Font; - Font nf = new Font(of.FontFamily, (of.Size * 96.0 / FormDpi).ParseToFloat(), of.Style, of.Unit, of.GdiCharSet, of.Bold); - ucPrice.Font = nf; - } - ucPrice.PriceChange += ucAddPrice_PriceChange; - this.fPnlPriceRule.Controls.Add(ucPrice); - ucPrice.lblSinglePriceAdd.Visible = false; - ucPrice.txtSinglePriceAdd.Visible = false; - } - - private void ucAddPrice_PriceChange(object obj) - { - List priceRuleLst = new List(); - foreach (var ucItem in fPnlPriceRule.Controls) - { - var ucPrice = ucItem as UcAddPrice; - if (ucPrice != null) - { - priceRuleLst.Add(new AddPriceRule() - { - AddMorePrice = ucPrice.PriceAddMore, - AddPriceTimes = ucPrice.PriceAddTimes, - LessThanPrice = ucPrice.PriceEnd, - MoreThanPrice = ucPrice.PriceStart, - SinglePriceAdd = ucPrice.SinglePriceAdd, - }); - } - } - this.lstAddPriceRule.Clear(); - this.lstAddPriceRule.AddRange(priceRuleLst); - - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_add_price_rules", lstAddPriceRule); - } - - private void txtAddPrice_TextChanged(object sender, EventArgs e) - { - if (IsFormLoad) - { - defaultAddPriceRule.AddPriceTimes = txtAddTimes.Text.Trim().ParseToDecimal(); - defaultAddPriceRule.AddMorePrice = txtAddMorePrice.Text.Trim().ParseToDecimal(); - defaultAddPriceRule.SinglePriceAdd = txtSinglePriceAdd.Text.Trim().ParseToDecimal(); - defaultAddPriceRule.StockNum = txtStockNum.Text.Trim().ParseToInt(); - defaultAddPriceRule.ShippingPriceTimes = txtShippingPriceTimes.Text.Trim().ParseToDecimal(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_default_add_price_rule", defaultAddPriceRule); - } - } - - private void chkStepAddPrice_CheckedChanged(object sender, EventArgs e) - { - defaultAddPriceRule.IsStepAddPrice = this.chkStepAddPrice.Checked; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_default_add_price_rule", defaultAddPriceRule); - } - - private void btnClearDgv_Click(object sender, EventArgs e) - { - //this.dgvSelectProduct.Rows.Clear(); - Task.Run(() => - { - var rows = this.dgvSelectProduct.Rows.Cast().ToList(); //Cast后Rows做foreach循环时仍会夹花跳过,所以要ToList转一个新的数组。 - foreach (var row in rows) - { - Invoke(new Action(() => - { - if (row.Cells["colCheck"].Value.ParseToBool() == true) - { - var draft_id = row.Cells["colDraftId"].Value.ParseToString(); - var add_time = row.Cells["colAddTime"].Value.ParseToString().ParseToDateTime(); - upload_draft_product_lst.RemoveAll(p => p.draft_id.ParseToString() == draft_id && p.add_time.ToString("yyyyMMddHHmmss") == add_time.ToString("yyyyMMddHHmmss")); - - this.dgvSelectProduct.Rows.Remove(row); - } - })); - } - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_select_upload_draft_products", upload_draft_product_lst); - }); - } - - private void chkAddMorePriceFirst_CheckedChanged(object sender, EventArgs e) - { - if (IsFormLoad) - { - defaultAddPriceRule.AddMorePriceFirst = chkAddMorePriceFirst.Checked; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_default_add_price_rule", defaultAddPriceRule); - } - } - - private void lblGoodsCount_Click(object sender, EventArgs e) - { - //PDDDBProdListForm f = new PDDDBProdListForm(); - //f.Width = 1366; - //f.Height = 768; - //f.ShowMaximizeBox = true; - //f.ShowDialog(); - } - - private void lblWaitToUp_Click(object sender, EventArgs e) - { - PDDDBProdUploadSelectCacheForm selectCacheForm = new PDDDBProdUploadSelectCacheForm(lstTemuDBProductSelect); - selectCacheForm.ShowDialog(); - - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); - lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; - } - - private void btnClearFilter_Click(object sender, EventArgs e) - { - txtIdFilter.Text = ""; - txtExtCodeFilter.Text = ""; - txtSearchGoodsName.Text = ""; - cmbGroupFilter.Text = ""; - cmbCateFilter1.Text = ""; - cmbWxSafe.Text = "安全+未校验"; - cmbSourceType.Text = "厂商直采"; - cmbHot.Text = "普通商品"; - chkSkipQualification.Checked = false; - cmbHot_TextChanged(null, null); - chkFilterViewUv.Checked = false; - numFilterViewUv.Value = 200; - - int prodCount; - pbSelectProd.Visible = true; - Task.Run(() => - { - GetRandomProductList(out prodCount, 1, 1); - Invoke(new Action(() => - { - pbSelectProd.Visible = false; - lblGoodsCount.Text = "产品库 " + prodCount + " 件"; - })); - }); - } - - private void 并发上传_Click(object sender, EventArgs e) - { - var draftIdLst = dgvSelectProduct.Rows.Cast().Where(row - => row.Cells["colCheck"]?.Value.ParseToBool() == true).Select(r => r.Cells["colDraftId"]?.Value.ToString()).ToList(); - - var lst = upload_draft_product_lst.Select(p => p.wxDraftProduct).ToList(); - - var upLst = lst.Where(l => draftIdLst.Contains(l.product.productKey.productId)).ToList(); - DateTime startTime = DateTime.Now; - Task.Run(() => - { - List tLst = new List(); - foreach (var prodParam in upLst) - { - var row = this.dgvSelectProduct.Rows.Cast().FirstOrDefault(r => r.Cells["colDraftId"].Value.ParseToString() == prodParam.product.productKey.productId); - if (row == null) - continue; - var shop = GlobalConfig.ValidShopLoginList.FirstOrDefault(s => s.ShopId == row.Cells["colSupplierId"].Value.ParseToString()); - if (shop == null) - continue; - var t = Task.Run(() => - { - UploadSameTime(shop, prodParam, row.Cells["colOpResult"]); - }); - tLst.Add(t); - } - Task.WaitAll(tLst.ToArray()); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_select_upload_draft_products", upload_draft_product_lst); - var duration = DateTime.Now - startTime; - Invoke(new Action(() => { BaseMsgForm.ShowInfo("并发上传完成,耗时:" + duration.TotalSeconds + " 秒"); })); - }); - } - - //public ConcurrentList upload_draft_products = new ConcurrentList(); - public ConcurrentList upload_draft_product_lst = new ConcurrentList(); - void UploadSameTime(ShopLoginInfo shop, WXUploadProductParam upProdParam, DataGridViewCell cell) - { - - var uploadProdRst = WXUpload.upProductV2(shop, upProdParam); - int retryTimes = 0; - while (!uploadProdRst.Contains("\"code\":0") && !uploadProdRst.Contains("\"success\":true")) - { - retryTimes++; - uploadProdRst = WXUpload.upProductV2(shop, upProdParam); - if (retryTimes >= 5) - break; - if (uploadProdRst.Contains("今日提审次数已用尽,请明日再试")) - break; - } - if (!uploadProdRst.Contains("\"code\":0") && !uploadProdRst.Contains("\"success\":true")) - { - var error = BaseRegex.GetStringJson(ref uploadProdRst, "msg"); - if (string.IsNullOrEmpty(error)) - error = uploadProdRst; - - if (cell != null) - { - Invoke(new Action(() => - { - cell.Value = "商品上传失败 " + error; - })); - } - } - else - { - if (cell != null) - { - upload_draft_product_lst.RemoveAll(p => p.wxDraftProduct == upProdParam); - Invoke(new Action(() => - { - cell.Value = "商品已上传,重试次数 " + retryTimes; - })); - } - - var dgvShopRow = dgvShop.Rows.Cast().FirstOrDefault(row => row.Cells["colShopId"]?.Value.ParseToString() == shop.ShopId); - if (dgvShopRow != null) - { - var day = DateTime.Now.ToString("yyyyMMdd").ParseToInt(); - if (!GlobalConfig.dicWxShopUploadInfo.ContainsKey(shop.ShopId)) - GlobalConfig.dicWxShopUploadInfo[shop.ShopId] = new WxShopUploadInfo(); - if (!GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.ContainsKey(day)) - GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day] = 0; - GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day] += 1; - // 删除45天前的记录 - var removeKeys = GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.Keys.Where(s => s < DateTime.Now.AddDays(-45).ToString("yyyyMMdd").ParseToInt()); - foreach (var key in removeKeys) - { - GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.Remove(key); - } - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_shop_upload_info", GlobalConfig.dicWxShopUploadInfo); - - Invoke(new Action(() => - { - dgvShopRow.Cells["colUploadCount"].Value = GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day]; - })); - } - } - } - - private void txtPreDays_TextChanged(object sender, EventArgs e) - { - wxUploadRule.PreSaleDays = txtPreDays.Text.Trim().ParseToInt(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void txtReplaceText_TextChanged(object sender, EventArgs e) - { - wxUploadRule.FilterWords = txtReplaceText.Text.Trim(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void txtMinPrice_TextChanged(object sender, EventArgs e) - { - wxUploadRule.SkuMinPrice = txtMinPrice.Text.Trim().ParseToInt(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void txtMaxPrice_TextChanged(object sender, EventArgs e) - { - wxUploadRule.SkuMaxPrice = txtMaxPrice.Text.Trim().ParseToInt(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void txtWaitSeconds_TextChanged(object sender, EventArgs e) - { - wxUploadRule.WaitSeconds = txtWaitSeconds.Text.Trim().ParseToInt(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void chkHighestPriceSku_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.OnlyHighestPriceSku = chkHighestPriceSku.Checked; - if (chkHighestPriceSku.Checked) - chkLowestPriceSku.Checked = false; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - private void chkLowestPriceSku_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.OnlyLowestPriceSku = chkLowestPriceSku.Checked; - if (chkLowestPriceSku.Checked) - chkHighestPriceSku.Checked = false; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void chkSameSpecPriceUp_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.SameSpecSamePriceUp = chkSameSpecPriceUp.Checked; - if (chkSameSpecPriceUp.Checked) - chkSameSpecPriceDown.Checked = false; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - private void chkSameSpecPriceDown_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.SameSpecSamePriceDown = chkSameSpecPriceDown.Checked; - if (chkSameSpecPriceDown.Checked) - chkSameSpecPriceUp.Checked = false; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void chkSkipUploaded_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.SkipUploaded = chkSkipUploaded.Checked; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void chkUpDraft_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.UpDraft = chkUpDraft.Checked; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void chkPreSale_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.IsPreSale = chkPreSale.Checked; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void btnRefreshNum_Click(object sender, EventArgs e) - { - - } - - private void cmbGroupFilter_SelectedIndexChanged(object sender, EventArgs e) - { - if (cmbGroupFilter.Text == "我的商品" && cmbSourceType.Text != "多多商品" && cmbSourceType.Text != "1688商品" && cmbSourceType.Text != "微信商品") - { - cmbSourceType.Text = ""; - } - } - - private void cmbSourceType_SelectedIndexChanged(object sender, EventArgs e) - { - //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "1688厂家" && cmbSourceType.Text != "微信店采" && cmbSourceType.Text != "微信小店") - // fillPddCate(); - //else - // fillWxCate(); - - if (cmbSourceType.Text != "厂商直采"/* && cmbSourceType.Text != "1688厂家"*/) - { - cmbJstInitSet.Text = ""; - } - else - { - cmbJstInitSet.Text = "是"; - } - } - - private void cmbCateFilter1_SelectedIndexChanged(object sender, EventArgs e) - { - //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "微信店采") - // return; - - //cmbCateFilter2.Text = ""; - //cmbCateFilter2.Items.Clear(); - //var cate1 = GlobalConfig.WxCatList.FirstOrDefault(c => c.level == 1 && c.name == cmbCateFilter1.Text.Trim()); - //var cates2 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate1?.cat_id).ToList(); - //foreach (var cate2 in cates2) - //{ - // cmbCateFilter2.Items.Add(cate2.name); - //} - } - - private void cmbCateFilter2_SelectedIndexChanged(object sender, EventArgs e) - { - //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "微信店采") - // return; - - //cmbCateFilter3.Text = ""; - //cmbCateFilter3.Items.Clear(); - //var cate1 = GlobalConfig.WxCatList.FirstOrDefault(c => c.level == 1 && c.name == cmbCateFilter1.Text.Trim()); - //var cates2 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate1?.cat_id).ToList(); - //var cate2 = cates2.FirstOrDefault(c => c.level == 2 && c.name == cmbCateFilter2.Text.Trim()); - //var cates3 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate2?.cat_id).ToList(); - //foreach (var cate3 in cates3) - //{ - // cmbCateFilter3.Items.Add(cate3.name); - //} - } - - private void cmbCateFilter3_SelectedIndexChanged(object sender, EventArgs e) - { - //var cate1 = GlobalConfig.WxCatList.FirstOrDefault(c => c.level == 1 && c.name == cmbCateFilter1.Text.Trim()); - //var cates2 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate1?.cat_id).ToList(); - //var cate2 = cates2.FirstOrDefault(c => c.level == 2 && c.name == cmbCateFilter2.Text.Trim()); - //var cates3 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate2?.cat_id).ToList(); - //var cate3 = cates3.FirstOrDefault(c => c.level == 3 && c.name == cmbCateFilter3.Text.Trim()); - } - - private void cmbCateFilter1_TextChanged(object sender, EventArgs e) - { - //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "1688厂家" && cmbSourceType.Text != "微信店采" && cmbSourceType.Text != "微信小店") - if (btnSwitchCatType.Text != "W") - return; - - cmbCateFilter2.Text = ""; - cmbCateFilter2.Items.Clear(); - cmbCateFilter3.Text = ""; - cmbCateFilter3.Items.Clear(); - var selectCate1 = GlobalConfig.WxCatList - .Where(c => c.level == 1 && (cmbCateFilter1.Text.Trim() == cmbCateFilter1.DefaultText || (";" + cmbCateFilter1.Text.Trim() + ";") - .Contains(";" + c.name + ";"))).ToList(); - var cates2 = GlobalConfig.WxCatList.Where(c => selectCate1.Any(c1 => c.f_cat_id == c1.cat_id)).ToList(); - //foreach (var cate2 in cates2) - //{ - // cmbCat2.Items.Add(cate2.name); - //} - cmbCateFilter2.Items.AddRange(cates2.Select(c => c.name).ToArray()); - } - - private void cmbCateFilter2_TextChanged(object sender, EventArgs e) - { - //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "1688厂家" && cmbSourceType.Text != "微信店采" && cmbSourceType.Text != "微信小店") - if (btnSwitchCatType.Text != "W") - return; - - cmbCateFilter3.Text = ""; - cmbCateFilter3.Items.Clear(); - var selectCate1 = GlobalConfig.WxCatList - .Where(c => c.level == 1 && (cmbCateFilter1.Text.Trim() == cmbCateFilter1.DefaultText || (";" + cmbCateFilter1.Text.Trim() + ";") - .Contains(";" + c.name + ";"))).ToList(); - var cates2 = GlobalConfig.WxCatList.Where(c => selectCate1.Any(c1 => c.f_cat_id == c1.cat_id)).ToList(); - var selectCate2 = cates2 - .Where(c => c.level == 2 && (cmbCateFilter2.Text.Trim() == cmbCateFilter1.DefaultText || (";" + cmbCateFilter2.Text.Trim() + ";") - .Contains(";" + c.name + ";"))).ToList(); - var cates3 = GlobalConfig.WxCatList.Where(c => selectCate2.Any(c2 => c.f_cat_id == c2.cat_id)).ToList(); - //foreach (var cate3 in cates3) - //{ - // cmbCat3.Items.Add(cate3.name); - //} - cmbCateFilter3.Items.AddRange(cates3.Select(c => c.name).ToArray()); - } - - private void cmbCateFilter3_TextChanged(object sender, EventArgs e) - { - //var cate1 = GlobalConfig.WxCatList.FirstOrDefault(c => c.level == 1 && c.name == cmbCat1.Text.Trim()); - //var cates2 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate1?.cat_id).ToList(); - //var cate2 = cates2.FirstOrDefault(c => c.level == 2 && c.name == cmbCat1.Text.Trim()); - //var cates3 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate2?.cat_id).ToList(); - //var cate3 = cates3.FirstOrDefault(c => c.level == 3 && c.name == cmbCat1.Text.Trim()); - } - - - private void btnFilterBound_Click(object sender, EventArgs e) - { - var boundMax = txtFilterBoundMax.Text.Trim().ParseToInt(); - var boundMin = txtFilterBoundMin.Text.Trim().ParseToInt(); - var cates = GlobalConfig.WxCatBoundList.Where(b => b.cat_bound <= boundMax && b.cat_bound >= boundMin); - lstTemuDBProductSelect.RemoveAll(p => !cates.Any(c => c.leaf_id.ParseToString() == p.wx_cat_leaf)); - - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); - lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; - } - - 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 txtTitleHeadWord_TextChanged(object sender, EventArgs e) - { - wxUploadRule.TitleHeadWords = txtTitleHeadWord.Text.Trim(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void chkSaveBound_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.IsSaveBound = chkSaveBound.Checked; - if (chkSaveBound.Checked) - { - wxUploadRule.FilterBoundMinSave = txtFilterBoundMin.Text.ParseToInt(); - wxUploadRule.FilterBoundMaxSave = txtFilterBoundMax.Text.ParseToInt(); - } - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void txtFilterBoundMin_TextChanged(object sender, EventArgs e) - { - if (wxUploadRule.IsSaveBound) - { - wxUploadRule.FilterBoundMinSave = txtFilterBoundMin.Text.ParseToInt(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - } - private void txtFilterBoundMax_TextChanged(object sender, EventArgs e) - { - if (wxUploadRule.IsSaveBound) - { - wxUploadRule.FilterBoundMaxSave = txtFilterBoundMax.Text.ParseToInt(); - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - } - - private void chkAiShotTitle_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.IsAiShortTitle = chkAiShortTitle.Checked; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void chkUseWXComplateProd_CheckedChanged(object sender, EventArgs e) - { - wxUploadRule.IsUseWXComplateProd = chkUseWXComplateProd.Checked; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - - private void btnProdDb_Click(object sender, EventArgs e) - { - WXSelectDBProdListForm.Instance.lstTemuDBProductSelect = this.lstTemuDBProductSelect; - WXSelectDBProdListForm.Instance.cmbSourceType.Items.Clear(); - WXSelectDBProdListForm.Instance.cmbSourceType.Items.AddRange(this.cmbSourceType.Items.Cast().ToArray()); - WXSelectDBProdListForm.Instance.SaveComplete -= dbProdList_SaveComplete; - WXSelectDBProdListForm.Instance.SaveComplete += dbProdList_SaveComplete; - WXSelectDBProdListForm.Instance.Show(); - WXSelectDBProdListForm.Instance.BringToFront(); - } - - public void dbProdList_SaveComplete(object obj) - { - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); - Invoke(new Action(() => - { - lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; - })); - } - - private void cmbHot_TextChanged(object sender, EventArgs e) - { - if (cmbHot.Text == "爆款数据") - { - cmbSourceType.Text = ""; - cmbJstInitSet.Text = ""; - } - else - { - cmbSourceType.Text = "厂商直采"; - cmbJstInitSet.Text = "是"; - // 商品采集用户无货源选择权限只能随机自己的商品 - if ((BaseClass.UserAuthority.Contains("商品采集") || BaseClass.ParentAuthority.Contains("商品采集")) && - !BaseClass.UserAuthority.Contains("货源选择") && BaseClass.SaLevel == 0) - { - cmbSourceType.Text = "多多商品,1688商品,微信商品"; - cmbJstInitSet.Text = ""; - } - } - } - - private void btnLoginAssistant_Click(object sender, EventArgs e) - { - WXSaleAssistantForm assistantForm = new WXSaleAssistantForm(); - assistantForm.OpenType = "login"; - assistantForm.InitUrl = "https://store.weixin.qq.com/talent/home"; - assistantForm.ShowDialog(); - lstWxSaleAssistantCookie = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_sale_assistant_cookies"); - if (lstWxSaleAssistantCookie == null) - lstWxSaleAssistantCookie = new List(); - } - - private void txtFissionTitle_TextChanged(object sender, EventArgs e) - { - if (this.IsFormLoad) - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_prod_fission_title", txtFissionTitle.Text); - lblFissionTitleCount.Text = "标题数:" + txtFissionTitle.Text.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).ToList().Count(); - } - - private void btnSwitchCatType_Click(object sender, EventArgs e) - { - if (btnSwitchCatType.Text == "W") - { - btnSwitchCatType.Text = "P"; - fillPddCate(); - } - else - { - btnSwitchCatType.Text = "W"; - fillWxCate(); - } - } - - private void chkSkipReplaceText_CheckedChanged(object sender, EventArgs e) - { - if (this.IsFormLoad) - { - wxUploadRule.IsSkipHasFilterWordsProd = chkSkipReplaceText.Checked; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - } - - private void chkRemoveSpecialChar_CheckedChanged(object sender, EventArgs e) - { - - } - - private void chkIsSubmitSuccess_CheckedChanged(object sender, EventArgs e) - { - - } - - private void chkUseShanghaiReturnOrderAddress_CheckedChanged(object sender, EventArgs e) - { - if (!IsFormLoad) return; - - wxUploadRule.IsUseShanghaiReturnOrderAddress = chkUseShanghaiReturnOrderAddress.Checked; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); - } - } - - public class WXUpload - { - public static string searchProduct(ShopLoginInfo shop, string extCode, string extCode2 = "") - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/searchProduct?" + - "token=&lang=zh_CN&pageSize=20&productStatus[]=-1&productSource=[1,16,32]&searchSource=1&useNew=true&pageNum=1&status[]=5&spuCode=" + extCode; - if (!string.IsNullOrEmpty(extCode2)) - url += "," + extCode2; - string refere = "https://store.weixin.qq.com/shop/goods/list?currentTab=PRODUCT_STATUS_ON"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, refere); - return result; - } - - public static string searchProductWithSpuId(ShopLoginInfo shop, string spuId) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/searchProduct?" + - "token=&lang=zh_CN&pageSize=20&productStatus[]=-1&productSource=[1,16,32]&searchSource=1&useNew=true&pageNum=1&status[]=-1&spuId=" + spuId; - string refere = "https://store.weixin.qq.com/shop/goods/list"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, refere); - return result; - } - - public static string searchProductWithTitle(ShopLoginInfo shop, string urlEncodeTitle) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/searchProduct?" + - "token=&lang=zh_CN&pageSize=20&productStatus[]=-1&productSource=[1,16,32]&searchSource=1&useNew=true&pageNum=1&status[]=-1&title=" + urlEncodeTitle; - string refere = "https://store.weixin.qq.com/shop/goods/list"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, refere); - return result; - } - - public static string getUploadTempImgAuth(ShopLoginInfo shop, int uploadScene = 3) - { - string url = "https://store.weixin.qq.com/shop-faas/mmecchannelspicture/cgi/getUploadTempImgAuth?token=&lang=zh_CN&uploadScene=" + uploadScene; - string refere = "https://store.weixin.qq.com/shop/goods/entry"; - //{"code":0,"disK":"538c14e950da7b678ce9f5a12658c8acddd09e4b","disT":1767870926,"ext":"23aa0ecfb792a","url":"https://westore.video.qq.com/adtimageupload"} - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, refere); - return result; - } - - public static string adtimageupload(ShopLoginInfo shop, string imgBase64, string dis_k, long dis_t, string ext) - { - string url = "https://westorealpha.video.qq.com/adtimageupload"; - string referer = "https://store.weixin.qq.com/"; - string body = imgBase64; - var result = WXHttpResponseBLL.WeiXinImgPostResponse(shop, url, body, dis_k, dis_t, ext, referer); - return result; - } - - public static string getProductClassify(ShopLoginInfo shop, string goodsName, List goodImgUrlsLst) - { - string boundaryLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; - string boundaryStr = "----WebKitFormBoundary"; - for (int i = 0; i < 16; i++) - { - boundaryStr += boundaryLetters[Randomx.GetId(boundaryLetters.Length)]; - } - - string url = "https://store.weixin.qq.com/shop-faas/cgi/common/productClassify?from=B&title=" + GetHtml.UrlEncodeUtf8(goodsName) + "&token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - - string body = @"--" + boundaryStr + @" + for (int i = 0; i < ctrlLst.Count - 2; i += 2) + { + if (ctrlLst[i].Visible == false) + { + for (int j = ctrlLst.Count - 2; j > i; j -= 2) + { + ctrlLst[j].Parent = ucGroupBoxEx4; + ctrlLst[j].Location = new Point(ctrlLst[j - 2].Location.X + ctrlLst[j - 2].Width - ctrlLst[j].Width, ctrlLst[j - 2].Location.Y); + if (ctrlLst[j] is CheckBox) // 额外减去一个像素 + ctrlLst[j].Location = new Point(ctrlLst[j].Location.X - 1, ctrlLst[j].Location.Y); + ctrlLst[j + 1].Location = new Point(ctrlLst[j].Location.X + ctrlLst[j].Width - 3, ctrlLst[j - 1].Location.Y); + ctrlLst[j + 1].Width = ctrlLst[j - 1].Width; + ctrlLst[j + 1].BringToFront(); + } + } + } + if (cmbNotes.Visible == false) + { + txtSearchGoodsName.Width = 229; + } + if (chkWXComplateProd.Visible == false) + { + chkRandomFissionProduct.Location = new Point(chkRandomFissionProduct.Location.X + 54, chkRandomFissionProduct.Location.Y); + txtRandomFissionProductCount.Location = new Point(txtRandomFissionProductCount.Location.X + 54, txtRandomFissionProductCount.Location.Y); + } + + IsFormLoad = true; + } + + private void btnRefreshAuthor_Click(object sender, EventArgs e) + { + updateAuthor(true); + } + + /// + /// 升级授权 + /// + /// 今日取过的也取 + private void updateAuthor(bool idRefreshTodayHasGet = false) + { + this.pbLoadingShop.Visible = true; + Task.Run(() => + { + // 店铺Id + var updateIds = dgvShop.Rows.Cast().Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); + var selectIds = dgvShop.Rows.Cast().Where(row + => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); + if (idRefreshTodayHasGet == true) + updateIds = selectIds; + + List tList = new List(); + if (idRefreshTodayHasGet) + GlobalConfig.lstWxShopAuthInfo.RemoveAll(s => updateIds.Contains(s.ShopId)); + foreach (var shop in GlobalConfig.ValidShopLoginList.Where(s => updateIds.Contains(s.ShopId))) + { + Invoke(new Action(() => { BindShop(shop, selectIds, ""); })); + var t = Task.Run(() => + { + try + { + if (shop.LoginStatus != "登录成功") + { + Invoke(new Action(() => { BindShop(shop, selectIds, "店铺掉线"); })); + return; + } + + var authInfo = GlobalConfig.lstWxShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shop.ShopId); + if (idRefreshTodayHasGet || authInfo == null || authInfo?.UpdateTime.Date != DateTime.Now.Date) + { + GlobalConfig.lstWxShopAuthInfo.RemoveAll(sa => sa.ShopId == shop.ShopId); + var rst = WXUpload.GetApiServiceList(shop); + if (!rst.Contains("\"code\":0")) + { + WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); + if (shop.LoginStatus != "登录成功") + { + Invoke(new Action(() => { BindShop(shop, selectIds, "店铺掉线"); })); + return; + } + + GlobalConfig.lstWxShopAuthInfo.Add(new AuthInfo() { ShopId = shop.ShopId, UpdateTime = DateTime.Now, ExpiresTime = DateTime.Now }); + Invoke(new Action(() => { BindShop(shop, selectIds, "授权查询失败"); })); + return; + } + + foreach (var itemObj in JsonHelper.JObjectParse(rst)["itemList"]) + { + // 找到了指定服务 + if (itemObj["serviceName"].ParseToString() == "店统领供应链-商品管理") + { + var expiresTick = itemObj["expireTime"].ParseToLong(); + var WxShopAuthInfo = new AuthInfo() { ShopId = shop.ShopId, UpdateTime = DateTime.Now, ExpiresTime = BaseClass.StampToDateTime(expiresTick.ParseToInt()) }; + if (WxShopAuthInfo.ExpiresTime > DateTime.Now) + { + GlobalConfig.lstWxShopAuthInfo.Add(WxShopAuthInfo); + Invoke(new Action(() => { BindShop(shop, selectIds, "已查询"); })); + return; + } + } + if (itemObj["serviceName"].ParseToString() == "东内部" || itemObj["serviceName"].ParseToString() == "29ERP") + { + var expiresTick = itemObj["expireTime"].ParseToLong(); + var WxShopAuthInfo = new AuthInfo() { ShopId = shop.ShopId, UpdateTime = DateTime.Now, ExpiresTime = BaseClass.StampToDateTime(expiresTick.ParseToInt()) }; + if (WxShopAuthInfo.ExpiresTime > DateTime.Now) + { + GlobalConfig.lstWxShopAuthInfo.Add(WxShopAuthInfo); + Invoke(new Action(() => { BindShop(shop, selectIds, "已查询"); })); + return; + } + } + } + // 没找到指定服务 + GlobalConfig.lstWxShopAuthInfo.Add(new AuthInfo() { ShopId = shop.ShopId, UpdateTime = DateTime.Now, ExpiresTime = DateTime.Now }); + Invoke(new Action(() => { BindShop(shop, selectIds, "已查询"); })); + } + } + catch (Exception ex) + { + } + }); + tList.Add(t); + while (tList.Where(ta => !ta.IsFaulted && !ta.IsCompleted).Count() >= 20) { Thread.Sleep(100); } + } + while (tList.Where(ta => !ta.IsFaulted && !ta.IsCompleted).Count() >= 1) { Thread.Sleep(100); } + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_shop_auth_list", GlobalConfig.lstWxShopAuthInfo); + Invoke(new Action(() => { pbLoadingShop.Visible = false; })); + }); + } + + 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.ValidShopLoginList.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; + RefreshDbProdGroupAndCate(); + RefreshShopLogin(); + } + + private void UserSelectDbProductForm_VisibleChanged(object sender, EventArgs e) + { + if (Visible == true) + { + RefreshShopLogin(); + updateAuthor(); + RefreshDbProdGroupAndCate(); + + if (!isInit) + { + Task.Run(() => + { + foreach (var shop in GlobalConfig.ValidShopLoginList) + { + //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 RefreshDbProdGroupAndCate() + { + Task.Run(() => + { + // 同时刷新下商品分组 + //string addUserName = BaseClass.UserAuthority.Contains("商品采集") ? ("admin," + BaseClass.UserName) : "admin"; + //if (BaseClass.GroupId != 3) + // addUserName = BaseClass.ParentAuthority.Contains("商品采集") ? ("admin," + BaseClass.ParentUserName) : "admin"; + //PDDDBProdListForm.GetPDDProductGroup(cmbGroupFilter, sourceType, "", addUserName); // 同时刷新下商品分组 + PDDDBProdListForm.GetPDDProductGroup(new List { cmbGroupFilter, }, "", "", "admin"); + if (BaseClass.UserAuthority.Contains("商品采集") || BaseClass.ParentAuthority.Contains("商品采集")) + { + Invoke(new Action(() => + { + //cmbGroupFilter.Items.Remove("用户" + mainUserName); + cmbGroupFilter.Items.Remove("--------"); + cmbGroupFilter.Items.Remove("我的商品"); + cmbGroupFilter.Items.Insert(0, "--------"); + cmbGroupFilter.Items.Insert(0, "我的商品"); + })); + } + GetPddProductCate(); + Invoke(new Action(() => + { + this.btnSwitchCatType.Text = "P"; + btnSwitchCatType_Click(null, null); + pbLoadingShop.Visible = false; + })); + }); + } + + /// + /// 获取商品所有类目 + /// + void GetPddProductCate() + { + var pddMainCats = GlobalConfig.PddCatList.Where(c => c.level == 1); + var mainCatsText = string.Join(",", pddMainCats.Select(c => c.cat_name)) + "," + string.Join(",", pddMainCats.Select(c => c.cat_id)); + + + + var url = BaseClass.BuildObjString("product/get_pdd_product_cates"); + var data = UserLogin.GetSignaturex(); + var 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")) + { + BaseMsgForm.ShowError("商品类目获取失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg")); + } + else + { + pdd_product_cates = BaseRegex.GetStringJson(ref html, "data"); + } + + //Invoke(new Action(() => + //{ + // if (cmbSourceType.Text.Trim() != "厂商直采" && cmbSourceType.Text.Trim() != "微信店采" && cmbSourceType.Text.Trim() != "微信小店") + // { + // fillPddCate(); + // } + // else + // { + // fillWxCate(); + // } + //})); + } + + void fillPddCate() + { + cmbCateFilter1.Items.Clear(); + cmbCateFilter2.Items.Clear(); + cmbCateFilter3.Items.Clear(); + cmbCateFilter1.Text = ""; + cmbCateFilter2.Text = ""; + cmbCateFilter3.Text = ""; + foreach (var item in pdd_product_cates.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)) + { + cmbCateFilter1.Items.Add(item); + } + cmbCateFilter1.Items.Add(""); + } + + void fillWxCate() + { + cmbCateFilter1.Items.Clear(); + cmbCateFilter2.Items.Clear(); + cmbCateFilter3.Items.Clear(); + cmbCateFilter1.Text = ""; + cmbCateFilter2.Text = ""; + cmbCateFilter3.Text = ""; + foreach (var cate in GlobalConfig.WxCatList.Where(c => c.level == 1).ToList()) + { + cmbCateFilter1.Items.Add(cate.name); + } + } + + 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.ValidShopLoginList.Any(s => s.ShopId == row.Cells["colShopId"]?.Value?.ToString())).ToList(); + // 更新被删除的店铺列表 + foreach (var row in dgvRowList) + { + dgvShop.Rows.Remove(row); + } + // 绑定其他店铺(含新导入的店铺) + foreach (ShopLoginInfo shopEntity in GlobalConfig.ValidShopLoginList) + { + if (!string.IsNullOrEmpty(shopEntity.ShopId)) + BindShop(shopEntity, selectIds); + } + cmbFilterShopNotes.Items.Clear(); + foreach (var note in GlobalConfig.ValidShopLoginList.Select(s => s.Notes).Where(s => !s.IsNullOrEmpty()).Distinct()) + { + cmbFilterShopNotes.Items.Add(note); + } + cmbFilterShopGroup.Items.Clear(); + foreach (var note in GlobalConfig.ValidShopLoginList.Select(s => s.GroupName).Where(s => !s.IsNullOrEmpty()).Distinct()) + { + cmbFilterShopGroup.Items.Add(note); + } + } + + 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["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; + var row = dgvShop.Rows[e.RowIndex]; + 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.ValidShopLoginList.FirstOrDefault(s => s.ShopId == shopId.ToString()); + if (shop == null) + { + BaseMsgForm.ShowError("店铺不存在或已过期"); + return; + } + 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.InitUrl = "https://store.weixin.qq.com/shop/servicemarket/detail?serviceId=4431685489938137094"; + 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; + var row = dgvShop.Rows[e.RowIndex]; + var headerText = dgvSelectProduct.Columns[e.ColumnIndex].HeaderText; + var dbId = dgvSelectProduct.Rows[e.RowIndex].Cells["colSelectId"].Value.ParseToString(); + var dbProduct = lstTemuDBProductSelect.FirstOrDefault(p => p.id.ToString() == dbId); + var shopId = dgvSelectProduct.Rows[e.RowIndex].Cells["colSupplierId"].Value.ParseToString(); + var draftId = dgvSelectProduct.Rows[e.RowIndex].Cells["colDraftId"].Value.ParseToString(); + var shop = GlobalConfig.ValidShopLoginList.FirstOrDefault(s => s.ShopId == shopId); + if (shop == null && !string.IsNullOrEmpty(headerText)) + { + BaseMsgForm.ShowError("店铺不存在或已过期"); + return; + } + 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); + //shopLoginForm.prodUserSelectForm = this; + shopLoginForm.openType = EnumOpenType.manage; + shopLoginForm.WindowState = FormWindowState.Maximized; + shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/home"; + shopLoginForm.Show(); + } + break; + case "上传商品Id": + //if (!string.IsNullOrEmpty(draftId) && shop != null) + //{ + // ShopLoginForm shopLoginForm = new ShopLoginForm(shop); + // shopLoginForm.InitUrl = "https://seller.kuajingmaihuo.com/goods/product-create/product-edit?productDraftId=" + + // draftId + "&from=productDraftList"; + // shopLoginForm.openType = EnumOpenType.manage; + // shopLoginForm.WindowState = FormWindowState.Maximized; + // shopLoginForm.ShowDialog(); + //} + 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; + } + } + + private void btnUpload_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; + } + + if (lstTemuDBProductSelect.Count() > 0) + { + if (WXShopLoginForm.shopLoginInstance != null && WXShopLoginForm.shopLoginInstance.IsDisposed != true) + WXShopLoginForm.shopLoginInstance.Dispose(); + + this.btnUpload.Enabled = false; + cancellationTokenSource = new CancellationTokenSource(); + Task.Run(() => + { + if (GlobalConfig.GlobalSettings.IsWxUseSoftwareDefaultAddress == true && !IsWxNotUseSoftwareDefaultAddressOnce && + lstTemuDBProductSelect.Any(p => p.product_get_type_text != "厂商直采" && p.product_get_type_text != "1688厂家")) + { + if (shopIdLst.Any(a => !GlobalConfig.WXShopDefaultAddressList.Any(aa => aa.shop_id == a))) + WXShopDefaultAddressListForm.GetShopDefaultAddress(); + var addressLst = GlobalConfig.WXShopDefaultAddressList.Where(s => shopIdLst.Contains(s.shop_id)).ToList(); + foreach (var add in addressLst) + { + if (!add.isFullAddress) + { + string msg = "未设置店铺售后地址!\r\n" + + "\r\n部分商品无默认售后地址信息,需要设置店铺售后地址,"; + if (BaseClass.GroupId == 3) + msg += "\r\n将自动跳转 店铺管理-店铺地址管理 界面设置,"; + else + msg += "\r\n请使用主账号进行设置,"; + msg += "\r\n或者点击 取消 按钮,本次使用店铺后台默认地址。\r\n" + + "\r\n可在系统设置选项卡更改配置永久使用店铺后台地址。\r\n\r\n"; + var rst = BaseMsgForm.ShowConfirm(msg, "注意", FormLevel.LARGE, true); + if (rst.DialogResult == DialogResult.OK) + { + if (BaseClass.GroupId == 3) + Invoke(new Action(() => + { + btnUpload.Enabled = true; + MainForm.instance.pnlShop_Click(MainForm.instance.pnlShop, null); + WXShopForm.instance.ClickShopAddress(); + })); + return; + } + else + { + IsWxNotUseSoftwareDefaultAddressOnce = true; + break; + } + } + } + } + + AddProductArr(shopIdLst); + Invoke(new Action(() => + { + this.btnUpload.Enabled = true; + })); + }, cancellationTokenSource.Token); + } + else + { + BaseMsgForm.ShowError("请选择要上传的商品!"); + } + } + + void AddProductArr(List shopIdLst) + { + Invoke(new Action(() => + { + this.pbLoading.Visible = true; + this.statusBar.lblTaskStatus.Text = "正在上传" + "...".Substring(0, DateTime.Now.Second % 4); + this.statusBar.pgbTaskProgress.Maximum = lstTemuDBProductSelect.Count; + this.statusBar.UpdateProgressBar(0); + })); + + // 随机厂商商品 + var url = BaseClass.BuildObjString("product/get_random_company_product_config"); + var data = UserLogin.GetSignaturex(); + var html = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) + html = GetHtml.PostUtf8(url, data); + chkRandomCompanyProd.Checked = BaseRegex.GetStringJson(ref html, "is_on") == "1"; + int randomComProdInterval = Math.Max(1, BaseRegex.GetIntJson(ref html, "product_interval")); + string randomComProdGroup = BaseRegex.GetStringJson(ref html, "product_group"); + int waitCompanyProdCnt = 0; + ConcurrentList CompanyProdLst = new ConcurrentList(); + + ConcurrentList currentShopList = new ConcurrentList(); + while (lstTemuDBProductSelect.Count > 0) + { + if (cancellationTokenSource.IsCancellationRequested) + break; + + shopIdLst = dgvShop.Rows.Cast().Where(row => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); + if (shopIdLst.Count <= 0) + { + Invoke(new Action(() => + { + this.statusBar.lblTaskStatus.Text = "请至少勾选一个店铺"; + })); + Thread.Sleep(500); + continue; + } + var randomShopLst = new ConcurrentList(); + randomShopLst.AddRange(GlobalConfig.ValidShopLoginList.Where(s => shopIdLst.Contains(s.ShopId) && s.LoginStatus == "登录成功")); + if (randomShopLst.Count <= 0) + { + Invoke(new Action(() => + { + this.statusBar.lblTaskStatus.Text = "所有店铺都已掉线,请登录店铺"; + })); + Thread.Sleep(500); + continue; + } + if (currentShopList.Count >= 20) // 最多20店同传 + { + Thread.Sleep(500); + continue; + } + + var randomShop = randomShopLst.Where(s => !currentShopList.Contains(s)).ToList().OrderBy(x => Randomx.GetId(999999)).FirstOrDefault(); + if (randomShop == null) + { + Thread.Sleep(500); + continue; + } + currentShopList.Add(randomShop); + + if (cancellationTokenSource.IsCancellationRequested) + break; + + // 每次挑选列表第一件商品 + var selectProd = lstTemuDBProductSelect.FirstOrDefault(); + selectProd.shop_id = randomShop.ShopId; + selectProd.shop_account = randomShop.ShopAccount; + + // 每若干个个商品插一件黄总商品包或其他组商品 + waitCompanyProdCnt++; + if (chkRandomCompanyProd.Checked && waitCompanyProdCnt > randomComProdInterval) + { + waitCompanyProdCnt = 0; + if (CompanyProdLst.Count == 0) + { + int dbCompanyProdCount; + var dbComProdLst = GetRandomCompanyProductList(out dbCompanyProdCount, randomComProdGroup); + foreach (var comProd in dbComProdLst) + { + var comSelectProd = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(comProd)); + comSelectProd.out_product_Id = comProd.id.ToString(); + comSelectProd.id = 1; + if (CompanyProdLst.Count > 0) + comSelectProd.id = CompanyProdLst.Max(p => p.id).ParseToInt() + 1; + CompanyProdLst.Add(comSelectProd); + } + } + selectProd = CompanyProdLst.FirstOrDefault(); + selectProd.shop_id = randomShop.ShopId; + selectProd.shop_account = randomShop.ShopAccount; + CompanyProdLst.Remove(selectProd); + } + else + { + lstTemuDBProductSelect.Remove(selectProd); + } + + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); + Invoke(new Action(() => + { + lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; + })); + + Invoke(new Action(() => + { + this.statusBar.lblTaskStatus.Text = "正在上传" + "...".Substring(0, DateTime.Now.Second % 4); + this.statusBar.pgbTaskProgress.Maximum = lstTemuDBProductSelect.Count + this.statusBar.pgbTaskProgress.Value + 1; + this.statusBar.UpdateProgressBar(this.statusBar.pgbTaskProgress.Value + 1); + })); + + if (selectProd == null) + { + Invoke(new Action(() => + { + BaseMsgForm.ShowError("商品为空,将为您跳过该商品!"); + })); + currentShopList.Remove(randomShop); + continue; + } + + // 过滤标题 + var lstTitleReplaceText = new List(); + if (!txtReplaceText.Text.Trim().IsNullOrEmpty()) + lstTitleReplaceText.AddRange(txtReplaceText.Text.Trim().Split(new string[] { ",", ",", " ", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries)); + // 过滤标题内指定词语 + foreach (var txt in lstTitleReplaceText) + { + selectProd.product_name = selectProd.product_name.Replace(txt, ""); + } + + Invoke(new Action(() => + { + int rowIndex = 0; + this.dgvSelectProduct.Rows.Insert(rowIndex, + true, + selectProd.id, + selectProd.shop_id, + selectProd.shop_account, + "登录", + "进店", + BaseClass.SaLevel > 0 ? selectProd.spu_id : selectProd.spu_id.ParseToString().GetHashCode().ParseToString().Trim('-'), + selectProd.skc_id, + selectProd.main_img, + DataGridViewExtension.defaultBitmap, + "", + null, + selectProd.product_name, // 用户端显示商品原名 + selectProd.cat_name, + BaseClass.SaLevel > 0 ? selectProd.ext_code : selectProd.ext_code.ParseToString().GetHashCode().ParseToString().Trim('-'), + selectProd.status, + selectProd.draft_id, + selectProd.notes, + (selectProd.user_notes + " 编辑").Trim(), + "删除", + "", + ""); + + dgvSelectProduct.Rows[rowIndex].Height = 60; + + int maxRowCount = 10000; + while (dgvSelectProduct.Rows.Count > maxRowCount) + { + dgvSelectProduct.Rows.RemoveAt(maxRowCount); + } + })); + + Invoke(new Action(() => + { + this.pbLoading.Visible = false; + })); + + Task.Run(() => + { + DateTime startTime = DateTime.Now; + for (int j = 0; j < 1; j++) + { + var shop = GlobalConfig.ValidShopLoginList.FirstOrDefault(s => s.ShopId == selectProd.shop_id); + if (shop == null) + continue; + + var row = dgvSelectProduct.Rows.Cast().FirstOrDefault(r => + r.Cells["colSelectId"]?.Value.ToString() == selectProd.id.ToString()); + double duration = 0; + if (row == null) + { + Invoke(new Action(() => + { + BaseMsgForm.ShowError("商品已被清除,将为您跳过该商品!"); + })); + continue; + } + + KJDDBProduct kjdDbProd = selectProd.kjdDbProduct; + string errStr = ""; + if (kjdDbProd == null) + kjdDbProd = GetProductDetail(selectProd.out_product_Id.ToString(), out errStr, true, true); + if (kjdDbProd == null || kjdDbProd.id == 0) + { + if (kjdDbProd?.id == 0) + { + selectProd.status = "已清除"; + } + + Invoke(new Action(() => + { + if (row.Index >= 0) + { + row.Cells["colOpResult"].Value = "选品数据库商品已被清除"; + if (kjdDbProd?.id == 0) + row.Cells["colStatus"].Value = "已清除"; + } + })); + continue; + } + + var result = ""; + try + { + WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); + if (shop.LoginStatus != "登录成功") + { + Invoke(new Action(() => + { + if (row.Index >= 0) + { + row.Cells["colOpResult"].Value = "店铺掉线"; + } + })); + continue; + } + + if (cancellationTokenSource.IsCancellationRequested) + break; + + //将商品上传 + KJDDBProduct kjdDbProdTmp = null; + try + { + kjdDbProdTmp = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(kjdDbProd)); + } + catch (Exception ex) + { + result = "{\"success\":false,\"status\":\"未上传\",\"errMsg\":\"商品初始化失败:" + ex.Message + "\"}"; + goto endUploadProduct; + } + + result = UploadProduct(shop, kjdDbProdTmp, selectProd, row.Cells["colOpResult"], startTime); + if (result.Contains("今日提审次数已用尽,请明日再试") || result.Contains("如需上架请先缴纳足额保证金") || result.Contains("在架商品数已达到上限") || + result.Contains("提审次数已达上限") || result.Contains("拥金上货失败:需要开通优选联盟") || result.Contains("本店铺近期提审失败比例较高,已被限")) + { + shop.upLimitRetryCount++; + if (shop.upLimitRetryCount >= 3) + { + shop.upLimitRetryCount = 0; + + var shopRow = dgvShop.Rows.Cast().FirstOrDefault(r => r.Cells["colShopId"].Value.ParseToString() == shop.ShopId); + if (shopRow != null) + Invoke(new Action(() => { shopRow.Cells["colSelect"].Value = false; })); + } + } + else + { + shop.upLimitRetryCount = Math.Max(0, shop.upLimitRetryCount - 1); + } + // 图片重复的,修改图片缓存为空再传一次 + 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); + } + + if (!result.Contains("success")) + { + WXShopListForm.Instance.CheckShopLogin(new ShopLoginInfo[] { shop }, false); + } + endUploadProduct:; + } + catch (Exception ex) + { + result = "{\"success\":false,\"status\":\"未上传\",\"errMsg\":\"内部错误:" + ex.Message + " " + ex.InnerException?.Message + "\"}"; + } + 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(); })); + if (waitTime > 0) + Thread.Sleep(Randomx.GetId(waitTime * 1000, (waitTime + 2) * 1000)); + + selectProd.status = BaseRegex.GetStringJson(ref result, "status"); + if (string.IsNullOrWhiteSpace(selectProd.status)) + selectProd.status = "待上传"; + var productDraftId = BaseRegex.GetStringJson(ref result, "draftId"); + + var timeSpan = DateTime.Now - startTime; + duration = timeSpan.TotalSeconds; + // 至少3秒才完成一件商品 + while (duration < 3) + { + Thread.Sleep(1000); + timeSpan = DateTime.Now - startTime; + duration = timeSpan.TotalSeconds; + } + + var error = BaseRegex.GetStringJson(ref result, "errMsg"); + error = GetHtml.UrlDecode(error); + // 上传失败 + if (!result.Contains("\"success\":true") && !result.Contains("上传成功")) + { + if (string.IsNullOrWhiteSpace(error)) + error = result; + Invoke(new Action(() => + { + if (row.Index >= 0) + { + row.Cells["colDraftId"].Value = productDraftId; // 草稿箱id + row.Cells["colOpResult"].Value = error + " " + duration.ParseToInt() + "秒"; + } + })); + } + // 上传成功/上传到草稿箱 + else + { + Invoke(new Action(() => + { + if (row.Index >= 0) + { + row.Cells["colDraftId"].Value = productDraftId; // 草稿箱id + row.Cells["colAddTime"].Value = DateTime.Now.ToString("yy-MM-dd HH:mm:ss"); + row.Cells["colOpResult"].Value = (selectProd.status == "已上传" ? "已成功上传" : "已上传 注意:") + (" " + error).TrimEnd(' ') + " " + duration.ParseToInt() + "秒"; + row.Cells["colMsg"].Value = selectProd.status; + } + })); + } + } + + currentShopList.Remove(randomShop); + }); + } + + for (int i = 0; i < 300 && currentShopList.Count > 0; i++) + { + Thread.Sleep(1000); + if (cancellationTokenSource.IsCancellationRequested) + break; + } + Invoke(new Action(() => + { + if (cancellationTokenSource.IsCancellationRequested) + BaseMsgForm.ShowInfo("上传停止!"); + else + BaseMsgForm.ShowInfo("上传完成!"); + })); + + Invoke(new Action(() => + { + this.pbLoading.Visible = false; + if (cancellationTokenSource.IsCancellationRequested) + this.statusBar.lblTaskStatus.Text = "上传停止"; + else + this.statusBar.lblTaskStatus.Text = "上传完成"; + //this.statusBar.UpdateProgressBar(lstTemuDBProductSelect.Count); + })); + } + + /// + /// + /// + /// + /// + /// 校验违规商品 + /// 校验微信禁售商品 + /// + public static KJDDBProduct GetProductDetail(string prodDbId, out string errMsg, bool noViolationProduct = false, bool noBanWx = false) + { + errMsg = ""; + + if (string.IsNullOrEmpty(prodDbId)) + { + errMsg = "产品编号为空"; + return new KJDDBProduct(); + } + + List list = new List(); + + var url = BaseClass.BuildObjString("product/get_pdd_product_detail_list"); + var data = UserLogin.GetSignaturex() + "&search_db_ids=" + prodDbId; + if (noViolationProduct) + data += "&wx_safe_status=安全商品,未校验"; + if (noBanWx) + data += "&ban_wx=0"; + if (BaseClass.SaLevel > 0 || BaseClass.UserAuthority.Contains("爆款数据") || BaseClass.UserAuthority.Contains("学员数据") || BaseClass.ParentAuthority.Contains("学员数据")) + data += "&special_prod_type=普通商品,爆款数据"; + + var 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")) + html = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) + { + return null; + } + + var jArr = JObject.Parse(html)["data"]; + if (jArr.Count() == 0) + return null; + var sProd = JsonHelper.SerializeObject(jArr); + + try + { + list = JsonHelper.DeserializeJsonToList(sProd); + var item = list.FirstOrDefault(); + if (item == null) + item = new KJDDBProduct(); + return item; + } + catch (Exception ex) + { + return null; + } + } + + public static WXGetEditProductInfoLite GetProductWXComplate(string secret_spu_id, out string errMsg) + { + errMsg = ""; + + if (string.IsNullOrEmpty(secret_spu_id)) + { + errMsg = "产品编码为空"; + return null; + } + + List list = new List(); + + var url = BaseClass.BuildObjString("product/get_pdd_prod_wx_complate_list"); + var data = UserLogin.GetSignaturex() + "&search_secret_spu_ids=" + secret_spu_id; + + var 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")) + html = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) + { + errMsg = BaseRegex.GetStringJson(ref html, "msg"); + if (errMsg.IsNullOrEmpty()) + errMsg = html; + errMsg = "取回采数据失败 " + errMsg; + return null; + } + + var jArr = JObject.Parse(html)["data"]; + if (jArr.Count() == 0) + { + errMsg = "产品不存在"; + return null; + } + var sProd = JsonHelper.SerializeObject(jArr); + + try + { + var item = jArr.FirstOrDefault()["wx_edit_prod_json"]; + if (item == null) + return null; + + var editProd = JsonHelper.DeserializeJsonToObject(((JValue)item).Value.ParseToString()); + return editProd; + } + catch (Exception ex) + { + errMsg = "回采数据转换失败 " + ex.Message; + return null; + } + } + + string UploadProduct(ShopLoginInfo shop, KJDDBProduct dbProd, TemuDBProductSelect selectProd, DataGridViewCell cell, DateTime startTime) + { + #region 初始化上传商品对象 + // 生成初始化上传商品对象 + var upProdInitParam = new WXUploadProductInitParam(); + // 生成上传商品对象 + var upProdParam = new WXUploadProductParam(); + #endregion + + Thread.Sleep(Randomx.GetId(100, 300)); + if (shop == null || string.IsNullOrEmpty(shop.ShopId) || shop.LoginStatus != "登录成功") + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"店铺为空或未登录!\"}"; + } + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在初始化上传"; + })); + } + + #region 裂变标题 + if (BaseClass.UserAuthority.Contains("裂变调试") && chkFissionGoodsName.Checked) + { + bool isFinish = false; + Invoke(new Action(() => + { + var titles = txtFissionTitle.Text.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); + if (titles.Count == 0) + { + cancellationTokenSource.Cancel(); + if (cell != null) + cell.Value = "裂变标题数量不足,将暂停上传"; + BaseMsgForm.ShowError("裂变标题数量不足,将暂停上传"); + isFinish = true; + } + selectProd.product_name = titles[0]; + selectProd.is_fission_title = true; + titles.RemoveAt(0); + txtFissionTitle.Text = string.Join("\r\n", titles); + cell.Value = "标题裂变成功,更改为:" + selectProd.product_name; + })); + if (isFinish) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"裂变标题数量不足,将暂停上传\"}"; + } + } + #endregion + + #region 跳过已上传商品,默认按商品货号,裂变商品按标题。 + if (chkSkipUploaded.Checked) + { + // 裂变按标题名称 + if (selectProd.is_fission_title) + { + var searchRst = WXUpload.searchProductWithTitle(shop, GetHtml.UrlEncodeUtf8(selectProd?.product_name)); + if (!searchRst.Contains("\"code\":0") && !searchRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref searchRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = searchRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"已存在商品查询错误 " + error + "\"}"; + } + try + { + var num = JObject.Parse(searchRst)["totalNum"].ParseToInt(); + if (num > 0) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品已存在,选择跳过\"}"; + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"已存在商品查询错误 " + ex.Message + "\"}"; + } + } + // 非裂变商品按商品Id + else + { + var searchExtCode = dbProd.ext_code; + if (searchExtCode.ParseToString().Length < 10) + searchExtCode = "EC1" + dbProd.spu_id + "A"; + if (dbProd.sku_secret_json != null && dbProd.sku_secret_json.Contains("goodsId")) + { + var sku_secret_json = dbProd.sku_secret_json; + searchExtCode = BaseRegex.GetStringJson(ref sku_secret_json, "goodsId"); + } + var searchRst = WXUpload.searchProduct(shop, searchExtCode); + if (!searchRst.Contains("\"code\":0") && !searchRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref searchRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = searchRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"已存在商品查询错误 " + error + "\"}"; + } + try + { + var num = JObject.Parse(searchRst)["totalNum"].ParseToInt(); + if (num > 0) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品已存在,选择跳过\"}"; + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"已存在商品查询错误 " + ex.Message + "\"}"; + } + } + } + #endregion + + #region 处理佣金上传 + int commissionRate = 0; + int minCommissionRate = 0; + int maxCommissionRate = 0; + int commissionRateChange = 0; + int? fromCommissionRate = 0; + if (BaseClass.UserAuthority.Contains("佣金上货") && chkCommission.Checked) + { + if (dbProd.special_prod_type != "爆款数据" && dbProd.product_get_type_text != "微信小店") + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:仅爆款微信小店数据支持佣金上传!\"}"; + + var rst = WXUpload.GetAndUpdateWebStatus(shop); + if (!rst.Contains("\"isOpenLeague\":true")) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:需要开通优选联盟!\"}"; + } + + var url = BaseClass.BuildObjString("product/wx_get_commission_rate"); + var date = UserLogin.GetSignaturex(); + date += "&spu_ids=" + dbProd.spu_id; + + var prodCommissionRst = GetHtml.PostUtf8(url, date); + if (!prodCommissionRst.Contains("\"code\":200")) + { + var errMsg = BaseRegex.GetStringJsonByRegs(ref prodCommissionRst, prodCommissionRst, "msg"); + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:" + errMsg + "\"}"; + } + fromCommissionRate = BaseRegex.GetStringJson(ref prodCommissionRst, "commission_rate").ParseToNullableInt(); + if (fromCommissionRate == null) + fromCommissionRate = -1; + if (prodCommissionRst.Contains("\"data\":[]") || BaseRegex.GetStringJson(ref prodCommissionRst, "mdy_time").ParseToString().ParseToDateTime() < DateTime.Now.AddDays(-30)) + { + var assistantShop = new ShopLoginInfo(); + assistantShop.Cookies = JsonHelper.SerializeObject(lstWxSaleAssistantCookie); + var result = WxGetAssistant.wxGetAssistant(assistantShop, dbProd.spu_id); + Thread.Sleep(Randomx.GetId(500, 1500)); + if (result.Contains("mcn magic invalid")) + { + Invoke(new Action(() => + { + BaseMsgForm.ShowError("拥金上货失败:请先登录上货助手"); + btnLoginAssistant_Click(null, null); + })); + assistantShop.Cookies = JsonHelper.SerializeObject(lstWxSaleAssistantCookie); + result = WxGetAssistant.wxGetAssistant(assistantShop, dbProd.spu_id); + if (result.Contains("mcn magic invalid")) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:请先登录上货助手\"}"; + } + fromCommissionRate = BaseRegex.GetStringJson(ref result, "commissionRate").ParseToNullableInt(); + var prodName = BaseRegex.GetStringJson(ref result, "name"); + if (fromCommissionRate == null) + fromCommissionRate = -1; + if (prodName.IsNullOrEmpty()) + prodName = dbProd.product_name; + //if (fromCommissionRate != null && !string.IsNullOrEmpty(prodName)) + { + url = BaseClass.BuildObjString("product/wx_add_mdy_commission_rate"); + date = UserLogin.GetSignaturex(); + date += "&spu_id=" + dbProd.spu_id; + date += "&commission_rate=" + fromCommissionRate; + date += "&product_name=" + prodName; + var addCommissionRateRst = GetHtml.PostUtf8(url, date); + } + } + Invoke(new Action(() => + { + minCommissionRate = this.txtMinUpCommission.Text.Trim().ParseToInt() * 10000; + maxCommissionRate = this.txtMaxUpCommission.Text.Trim().ParseToInt() * 10000; + commissionRateChange = this.txtCommissionChangeValue.Text.Trim().ParseToInt() * 10000; + if (cmbCommissionAddOrReduce.Text != "增加") + commissionRateChange = -commissionRateChange; + commissionRate = fromCommissionRate.ParseToInt() + commissionRateChange; + })); + if (fromCommissionRate < minCommissionRate || fromCommissionRate > maxCommissionRate) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"拥金上货失败:原商品佣金比例 " + fromCommissionRate * 0.0001 + "% 超过设置的佣金范围!\"}"; + } + } + #endregion + + #region 将聚水潭产品数据格式进行转换成pdd格式统一上传,匹配加密的spuCode和skuCoke 微信小店的货号spuCode和外部商品编号outProductId/out_product_id对应加密的聚水潭goodsId + if (dbProd.product_get_type_text == "厂商直采") + { + if (dbProd.sku_secret_json.IsNullOrEmpty() || !dbProd.sku_secret_json.Contains("goodsId")) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询格式错误\"}"; + } + if (dbProd.wx_cat_leaf.IsNullOrZero() || dbProd.send_to_out_server != 1 || dbProd.distribution_set != 1) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询校验错误\"}"; + } + + string convertRst = ""; + var pInfo = new PDDProdFormConverter().JstPddProdToPddConvert(out convertRst, dbProd); + if (!string.IsNullOrEmpty(convertRst)) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; + } + #endregion + + #region 微信店采原始格式还原 + WXGetEditProductInfoLite wxEditProdInfo = null; + if (dbProd.product_get_type_text == "微信店采") + { + try + { + wxEditProdInfo = JsonHelper.DeserializeJsonToObject(dbProd.product_json); + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"微信商品格式获取失败" + ex.Message + "\"}"; + } + } + #endregion + + #region 微信店采格式转换 + if (dbProd.product_get_type_text == "微信店采") + { + string convertRst = ""; + var pInfo = new PDDProdFormConverter().WXProdToPddConvert(out convertRst, dbProd); + if (!string.IsNullOrEmpty(convertRst)) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; + } + #endregion + + #region 微信回采转换 + if (BaseClass.UserAuthority.ParseToString().Contains("微信回采") && chkUseWXComplateProd.Checked && dbProd.has_wx_format == "1") + { + string errMsg = ""; + wxEditProdInfo = GetProductWXComplate(dbProd.secret_spu_id, out errMsg); + + if (wxEditProdInfo == null) + { + Invoke(new Action(() => + { + cell.Value = errMsg; + })); + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + errMsg + "\"}"; + } + } + #endregion + + #region 微信小店app + if (dbProd.product_get_type_text == "微信小店") + { + string convertRst = ""; + var pInfo = new PDDProdFormConverter().WXClientToPddConvert(out convertRst, dbProd); + if (!string.IsNullOrEmpty(convertRst)) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; + } + #endregion + + #region 1688格式转换 + if (dbProd.product_get_type_text == "1688厂家") + { + string convertRst = ""; + var pInfo = new PDDProdFormConverter()._1688ClientToPddConvert(out convertRst, dbProd); + if (!string.IsNullOrEmpty(convertRst)) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; + } + if (dbProd.product_get_type_text == "1688外部数据") + { + string convertRst = ""; + var pInfo = new PDDProdFormConverter()._1688OutToPddConvert(out convertRst, dbProd); + if (!string.IsNullOrEmpty(convertRst)) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品查询错误 " + convertRst + "\"}"; + } + #endregion + + #region 将产品数据初始化成微信小店支持的参数 + JObject prodJObj = new JObject(); + try + { + prodJObj = JObject.Parse(dbProd.product_json); + + var lstTitleReplaceText = new List(); + if (!txtReplaceText.Text.Trim().IsNullOrEmpty()) + lstTitleReplaceText.AddRange(txtReplaceText.Text.Trim().Split(new string[] { ",", ",", " ", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries)); + // 过滤标题敏感词 + if (lstTitleReplaceText.Count > 0) + { + if (chkSkipReplaceText.Checked) + { + if (lstTitleReplaceText.Any(t => selectProd.product_name.Contains(t))) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; + if (lstTitleReplaceText.Any(t => dbProd.product_name.Contains(t))) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; + + var goods_name = prodJObj["detail"]["goods_name"].ParseToString(); + if (lstTitleReplaceText.Any(t => goods_name.Contains(t))) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; + var tiny_name = prodJObj["detail"]["tiny_name"].ParseToString(); + if (lstTitleReplaceText.Any(t => tiny_name.Contains(t))) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; + var goods_desc = prodJObj["detail"]["goods_desc"].ParseToString(); + if (lstTitleReplaceText.Any(t => goods_desc.Contains(t))) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; + var share_desc = prodJObj["detail"]["share_desc"].ParseToString(); + if (lstTitleReplaceText.Any(t => share_desc.Contains(t))) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"命中敏感词\"}"; + } + else + { + foreach (var txt in lstTitleReplaceText) + { + dbProd.product_name = dbProd.product_name.Replace(txt, ""); + selectProd.product_name = selectProd.product_name.Replace(txt, ""); + } + + var goods_name = prodJObj["detail"]["goods_name"].ParseToString(); + foreach (var txt in lstTitleReplaceText) + { + goods_name = goods_name.Replace(txt, ""); + } + prodJObj["detail"]["goods_name"] = goods_name; + + var tiny_name = prodJObj["detail"]["tiny_name"].ParseToString(); + foreach (var txt in lstTitleReplaceText) + { + tiny_name = tiny_name.Replace(txt, ""); + } + prodJObj["detail"]["tiny_name"] = tiny_name; + + var goods_desc = prodJObj["detail"]["goods_desc"].ParseToString(); + foreach (var txt in lstTitleReplaceText) + { + goods_desc = goods_desc.Replace(txt, ""); + } + prodJObj["detail"]["goods_desc"] = goods_desc; + + var share_desc = prodJObj["detail"]["share_desc"].ParseToString(); + foreach (var txt in lstTitleReplaceText) + { + share_desc = share_desc.Replace(txt, ""); + } + prodJObj["detail"]["share_desc"] = share_desc; + } + } + // 过滤标题特殊字符 + if (chkRemoveSpecialChar.Checked) + { + var chLst = new List { ']', '】', ')', ')', '}', }; + foreach (var ch in chLst) + { + if (dbProd.product_name.Contains(ch) && dbProd.product_name.IndexOf(ch) < dbProd.product_name.Length / 2 && dbProd.product_name.Length > 10) + dbProd.product_name = dbProd.product_name.Substring(dbProd.product_name.IndexOf(ch)).Trim(ch); + + if (selectProd.product_name.Contains(ch) && selectProd.product_name.IndexOf(ch) < selectProd.product_name.Length / 2 && selectProd.product_name.Length > 10) + selectProd.product_name = selectProd.product_name.Substring(selectProd.product_name.IndexOf(ch)).Trim(ch); + + var goods_name = prodJObj["detail"]["goods_name"].ParseToString(); + if (goods_name.Contains(ch) && goods_name.IndexOf(ch) < goods_name.Length / 2 && goods_name.Length > 10) + prodJObj["detail"]["goods_name"] = goods_name.Substring(goods_name.IndexOf(ch)).Trim(ch); + } + + } + // 替换货号 + if (!string.IsNullOrEmpty(dbProd.ext_code)) + prodJObj["detail"]["out_goods_sn"] = dbProd.ext_code; + // 替换编辑过的sku + if (!string.IsNullOrEmpty(dbProd.sku_edit_json)) + prodJObj["detail"]["sku"] = JArray.Parse(JsonHelper.SerializeObject(JsonHelper.DeserializeJsonToList(dbProd.sku_edit_json))); + // 过滤sku敏感词 + if (lstTitleReplaceText.Count > 0) + { + var skuJArr = prodJObj["detail"]["sku"] as JArray; + try + { + foreach (var skuJObj in skuJArr) + { + var specJArr = skuJObj["spec"] as JArray; + for (int i = 0; i < specJArr.Count; i++) + { + foreach (var txt in lstTitleReplaceText) + { + specJArr[i]["spec_name"] = specJArr[i]["spec_name"].ParseToString().Replace(txt, ""); + } + } + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; + } + } + // 同颜色规格向上浮动同价格 + if (chkSameSpecPriceUp.Checked) + { + var priceTextLst = dbProd.price_text.Split('-'); + if (priceTextLst.Length != 2 || priceTextLst[0] != priceTextLst[1]) + { + Dictionary specPriceDic = new Dictionary(); + Dictionary specMultiPriceDic = new Dictionary(); + var skuJArr = prodJObj["detail"]["sku"] as JArray; + try + { + // 计算主spec的最高价 + foreach (var skuJObj in skuJArr) + { + var specJArr = skuJObj["spec"] as JArray; + if (!specPriceDic.ContainsKey(specJArr[0]["spec_name"].ParseToString()) || skuJObj["price"].ParseToInt() > specPriceDic[specJArr[0]["spec_name"].ParseToString()]) + { + specPriceDic[specJArr[0]["spec_name"].ParseToString()] = skuJObj["price"].ParseToInt(); + } + if (!specMultiPriceDic.ContainsKey(specJArr[0]["spec_name"].ParseToString()) || skuJObj["multi_price"].ParseToInt() > specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()]) + { + specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()] = skuJObj["multi_price"].ParseToInt(); + } + } + // 统一按最高价设置 + foreach (var skuJObj in skuJArr) + { + var specJArr = skuJObj["spec"] as JArray; + skuJObj["price"] = specPriceDic[specJArr[0]["spec_name"].ParseToString()]; + skuJObj["multi_price"] = specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()]; + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; + } + } + } + // 同颜色规格向下浮动同价格 + if (chkSameSpecPriceDown.Checked) + { + var priceTextLst = dbProd.price_text.Split('-'); + if (priceTextLst.Length != 2 || priceTextLst[0] != priceTextLst[1]) + { + Dictionary specPriceDic = new Dictionary(); + Dictionary specMultiPriceDic = new Dictionary(); + var skuJArr = prodJObj["detail"]["sku"] as JArray; + try + { + // 计算主spec的最低价 + foreach (var skuJObj in skuJArr) + { + var specJArr = skuJObj["spec"] as JArray; + if (!specPriceDic.ContainsKey(specJArr[0]["spec_name"].ParseToString()) || skuJObj["price"].ParseToInt() < specPriceDic[specJArr[0]["spec_name"].ParseToString()]) + { + specPriceDic[specJArr[0]["spec_name"].ParseToString()] = skuJObj["price"].ParseToInt(); + } + if (!specMultiPriceDic.ContainsKey(specJArr[0]["spec_name"].ParseToString()) || skuJObj["multi_price"].ParseToInt() < specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()]) + { + specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()] = skuJObj["multi_price"].ParseToInt(); + } + } + // 统一按最低价设置 + foreach (var skuJObj in skuJArr) + { + var specJArr = skuJObj["spec"] as JArray; + skuJObj["price"] = specPriceDic[specJArr[0]["spec_name"].ParseToString()]; + skuJObj["multi_price"] = specMultiPriceDic[specJArr[0]["spec_name"].ParseToString()]; + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; + } + } + } + // 只保留最高价 + if (chkHighestPriceSku.Checked) + { + int price = 0; + var skuJArr = prodJObj["detail"]["sku"] as JArray; + try + { + // 计算主spec的最高价 + foreach (var skuJObj in skuJArr) + { + if (price < skuJObj["multi_price"].ParseToInt()) + price = skuJObj["multi_price"].ParseToInt(); + } + + var product_json_tmp = JsonHelper.SerializeObject(prodJObj); + + // 移除第一组所有sku + skuJArr.RemoveAll(); + + // 序列化第二组,从组中挑选符合价格条件的sku往第一组内填写 + var prodJObj2 = JObject.Parse(product_json_tmp); + var skuJArr2 = prodJObj2["detail"]["sku"] as JArray; + foreach (var skuJObj2 in skuJArr2) + { + if (skuJObj2["multi_price"].ParseToInt() >= price) + skuJArr.Add(skuJObj2); + } + if (skuJArr.Count == 0) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品sku差价不满足上货条件,跳过\"}"; + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; + } + } + // 只保留最低价 + if (chkLowestPriceSku.Checked) + { + int price = 99999999; + var skuJArr = prodJObj["detail"]["sku"] as JArray; + try + { + // 计算主spec的最低价 + foreach (var skuJObj in skuJArr) + { + if (price > skuJObj["multi_price"].ParseToInt()) + price = skuJObj["multi_price"].ParseToInt(); + } + + var product_json_tmp = JsonHelper.SerializeObject(prodJObj); + + // 移除第一组所有sku + skuJArr.RemoveAll(); + + // 序列化第二组,从组中挑选符合价格条件的sku往第一组内填写 + var prodJObj2 = JObject.Parse(product_json_tmp); + var skuJArr2 = prodJObj2["detail"]["sku"] as JArray; + foreach (var skuJObj2 in skuJArr2) + { + if (skuJObj2["multi_price"].ParseToInt() <= price) + skuJArr.Add(skuJObj2); + } + if (skuJArr.Count == 0) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品sku差价不满足上货条件,跳过\"}"; + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; + } + } + // 过滤低价sku,如果所有sku都不达标,跳过商品 + if (!string.IsNullOrEmpty(txtMinPrice.Text)) + { + var product_json_tmp = JsonHelper.SerializeObject(prodJObj); + + // 移除第一组所有sku + var skuJArr = prodJObj["detail"]["sku"] as JArray; + skuJArr.RemoveAll(); + + // 序列化第二组,从组中挑选符合价格条件的sku往第一组内填写 + var prodJObj2 = JObject.Parse(product_json_tmp); + var skuJArr2 = prodJObj2["detail"]["sku"] as JArray; + foreach (var skuJObj2 in skuJArr2) + { + var limitMinPrice = this.txtMinPrice.Text.Trim().ParseToDecimal() * 100; + // 供应商价加价10%(最低1元)赚取差价 先加价后过滤,过滤条件也要相应增加10% + //if (dbProd.product_get_type_text == "厂商直采") + // limitPrice += Math.Max(100m, limitPrice * 0.1m); + if (skuJObj2["multi_price"].ParseToInt() >= limitMinPrice) + skuJArr.Add(skuJObj2); + } + if (skuJArr.Count == 0) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品sku价格不满足上货条件,跳过\"}"; + } + } + // 过滤高价sku,如果所有sku都不达标,跳过商品 + if (!string.IsNullOrEmpty(txtMaxPrice.Text)) + { + var product_json_tmp = JsonHelper.SerializeObject(prodJObj); + + // 移除第一组所有sku + var skuJArr = prodJObj["detail"]["sku"] as JArray; + skuJArr.RemoveAll(); + + // 序列化第二组,从组中挑选符合价格条件的sku往第一组内填写 + var prodJObj2 = JObject.Parse(product_json_tmp); + var skuJArr2 = prodJObj2["detail"]["sku"] as JArray; + foreach (var skuJObj2 in skuJArr2) + { + var limitMaxPrice = this.txtMaxPrice.Text.Trim().ParseToDecimal() * 100; + // 供应商价加价10%(最低1元)赚取差价 先加价后过滤,过滤条件也要相应增加10% + //if (dbProd.product_get_type_text == "厂商直采") + // limitPrice += Math.Max(100m, limitPrice * 0.1m); + if (skuJObj2["multi_price"].ParseToInt() <= limitMaxPrice) + skuJArr.Add(skuJObj2); + } + if (skuJArr.Count == 0) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品sku价格不满足上货条件,跳过\"}"; + } + } + + dbProd.product_json = JsonHelper.SerializeObject(prodJObj); + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"商品数据初始化失败" + ex.Message + "\"}"; + } + #endregion + + #region 图片盗链映射生成字典(如果有) + bool isChangeImgDic = false; + Dictionary wxImgMapDic = new Dictionary(); + if (!string.IsNullOrEmpty(dbProd.wx_img_map_json)) + { + try + { + wxImgMapDic = JsonHelper.DeserializeJsonToObject>(dbProd.wx_img_map_json); + } + catch + { + isChangeImgDic = true; + wxImgMapDic = new Dictionary(); + } + } + #endregion + + #region 提取源商品详情,根据需要生成sku货号 + var prodInfo = JsonHelper.DeserializeJsonToObject(dbProd.product_json); + + // 如果没有货号或有相同货号无法区分sku,自定义货号 + if (dbProd.product_get_type_text != "厂商直采") + { + if (prodInfo.detail.sku.Any(s => s.out_sku_sn.IsNullOrEmpty()) || + prodInfo.detail.sku.Select(s => s.out_sku_sn).ToList().Count > prodInfo.detail.sku.Select(s => s.out_sku_sn).Distinct().ToList().Count) + { + foreach (var sku in prodInfo.detail.sku) + { + sku.out_sku_sn = string.Join(";", sku.spec.Select(s => s.spec_name)); + sku.out_sku_sn = "EC1" + Math.Abs(BaseClass.GetLong(sku.out_sku_sn)) + "A"; + } + } + } + #endregion + + #region 上传视频 + if (prodInfo.detail.galleries.Any(a => a.type == 6)) + { + List videos = prodInfo.detail.galleries.Where(a => a.type == 6).ToList(); + //下载视频保存 + foreach (var item in videos) + { + Invoke(new Action(() => + { + cell.Value = "开始下载视频"; + })); + byte[] files; + bool d_ret = GetHtml.DownloadFile(item.url, out files); + if (d_ret == false) + { + Invoke(new Action(() => + { + cell.Value = "视频下载失败"; + })); + return JsonConvert.SerializeObject(new + { + success = false, + draftId = 0, + status = "未上传", + errMsg = "视频下载失败" + }); + } + Invoke(new Action(() => + { + cell.Value = "开始上传视频"; + })); + var uploader = new WXVideoUploader(); + var video = uploader.Upload(shop, selectProd.id.ToString(), files); + upProdParam.product.info.headVideoInfo.Add(new + { + videoUrl = video.DownloadUrl, + videoHeadImg = video.VideoImgUrl, + videoLen = video.VideoDuration, + videoSize = 0, + videoSource = 0, + videoFormat = 0, + playableVideoUrl = video.DownloadUrl + }); + } + } + //prodInfo.detail.galleries.RemoveAll(g => g.type == 6); // 视频暂时移除,以后再视情况加上 + #endregion + + #region 主图不够详情图补充 + int mainImgCount = (prodInfo?.detail?.galleries?.Where(g => g.type == 1).Count()).ParseToInt(); + if (mainImgCount > 0 && mainImgCount < 3) + { + var gallery1 = prodInfo?.detail?.galleries?.Where(g => g.type == 2).FirstOrDefault(); + // 先补一张 + if (gallery1 != null) + { + prodInfo.detail.galleries.Add(new gallery_item() + { + type = 1, + url = gallery1.url, + width = gallery1.width, + height = gallery1.height, + }); + } + // 如果补了只有两张再补一张 + if (mainImgCount == 1 && (prodInfo?.detail?.galleries?.Where(g => g.type == 1).Count()).ParseToInt() > 1) + { + var gallery2 = prodInfo?.detail?.galleries?[1]; + if (gallery2 != null) + { + prodInfo.detail.galleries.Add(new gallery_item() + { + type = 1, + url = gallery2.url, + width = gallery2.width, + height = gallery2.height, + }); + } + } + } + if ((prodInfo?.detail?.galleries?.Where(g => g.type == 1).Count()).ParseToInt() < 3) + { + Invoke(new Action(() => + { + cell.Value = "主图数量少于三张"; + })); + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"主图数量少于三张\"}"; + } + #endregion + + #region 过滤重复图片 无论是否打码 + bool needAddRandomBlock = false; + bool wantAddRandomBlock = chkImgRandomBlock.Checked && (/*upProdParam.product.info.category.FirstOrDefault()?.name == "图书" ||*/ + prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸" || dbProd.main_cat_name == "图书" || dbProd.main_cat_name == "书籍/杂志/报纸"); + { + List galls = new List(); + foreach (var gall in prodInfo.detail.galleries.Where(g => g.type == 1).ToList()) + { + 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).ToList()) + { + 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); + int repeatSn = 0; + while (prodInfo.detail.galleries.Where(g => g.type == 1).Count() > 0 && prodInfo.detail.galleries.Where(g => g.type == 1).Count() < 3) + { + repeatSn++; + var gallOld = prodInfo.detail.galleries.LastOrDefault(g => g.type == 1); + var gallNew = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(gallOld)); + // 如果有 替换掉之前附加的后缀 + for (int i = 0; i < 10; i++) + { + gallNew.url = gallNew.url.Replace("?re_sn1=" + i, ""); + gallNew.url = gallNew.url.Replace("?re_sn1=" + i, ""); + } + if (gallNew.url.Contains("?")) + gallNew.url += "&re_sn1=" + repeatSn; + else + gallNew.url += "?re_sn1=" + repeatSn; + prodInfo.detail.galleries.Add(gallNew); + needAddRandomBlock = true; + } + if (prodInfo.detail.galleries.Where(g => g.type == 1).Count() > 0 && prodInfo.detail.galleries.Where(g => g.type == 2).Count() <= 0) + { + var gallOld = prodInfo.detail.galleries.FirstOrDefault(g => g.type == 1); + var gallNew = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(gallOld)); + if (gallNew.url.Contains("?")) + gallNew.url += "&re_sn2=" + 1; + else + gallNew.url += "?re_sn2=" + 1; + gallNew.type = 2; + prodInfo.detail.galleries.Add(gallNew); + needAddRandomBlock = true; + } + } + #endregion + + + + #region 获取店铺 Api Token + // 获取店铺的accessToken + WXShopTokenInfo token = lstWXShopTokenInfo.FirstOrDefault(t => t.shopId == shop.ShopId); + if (token == null) + token = new WXShopTokenInfo(); + if (token.isExpire || string.IsNullOrEmpty(token.accessToken)) + { + AuthInfo auth = GlobalConfig.lstWxShopAuthInfo.FirstOrDefault(sa => sa.ShopId == shop.ShopId); + //if (auth != null && auth.ExpiresTime > DateTime.Now.AddMinutes(5)) + { + token = new WxApiBLL().GetShopWxToken(shop); + + if (!string.IsNullOrEmpty(token.accessToken)) + { + lstWXShopTokenInfo.RemoveAll(t => t.shopId == shop.ShopId); + lstWXShopTokenInfo.Add(token); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_shop_token_list", lstWXShopTokenInfo); + } + } + } + // 如果店铺token不可用,随机获取一个上传图片的accessToken + if (token == null || token.isExpire || string.IsNullOrEmpty(token.accessToken)) + token = new WxApiBLL().GetRandomWxToken(); + #endregion + + #region 设置标题 + string prodTitle = selectProd.product_name; + if (prodTitle.IsNullOrEmpty()) + prodTitle = dbProd.product_name.IsNullOrEmpty() ? prodInfo.detail.goods_name : dbProd.product_name; + + upProdInitParam.product.info.title = prodTitle; + upProdParam.product.info.title = prodTitle; + upProdParam.sessionInfo.sessionId = upProdInitParam.product.sessionId; + #endregion + + #region 设置货号 + var extCode = dbProd.ext_code.IsNullOrEmpty() ? prodInfo.detail.out_goods_sn : dbProd.ext_code; + if (extCode.IsNullOrEmpty() || extCode.Length <= 10) + { + //extCode = "EC" + Randomx.GetId(1000).ToString().PadLeft(3, '0') + dbProd.spu_id + "C"; + 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 上传主图 + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成主图并识别商品"; + })); + } + Thread.Sleep(Randomx.GetId(100, 300)); + var mainGalleries = prodInfo.detail.galleries.Where(g => g.type == 1).Take(9).ToList(); + foreach (var gallery_item in mainGalleries) // 9张主图 + { + try + { + if (dbProd.product_get_type_text == "微信店采") + { + upProdInitParam.product.info.headImg.Add(gallery_item.url); + upProdParam.product.info.headImg.Add(gallery_item.url); + continue; + } + + // 获取缓存盗链 主图 + 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; + } + + if (needAddRandomBlock || wantAddRandomBlock || gallery_item.url.Contains("wst.wxapp.tc.qq.com")) + { + // 如果想打码或者需要打码,就走差异化详情图,不走api直传 + } + else + { + // 使用接口链接传主图 + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + upDate += "&post_data=" + GetHtml.UrlEncodeUtf8("{\"img_url\":\"" + gallery_item.url.Replace("https://", "http://") + "\"}"); + + var sTime = DateTime.Now; + var upDateRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成主图并识别商品 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 20 && upDateRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + upDateRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref upDateRst, "img_url"); + if (upDateRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) + { + upProdInitParam.product.info.headImg.Add(upImgUrl); + upProdParam.product.info.headImg.Add(upImgUrl); + wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl; + isChangeImgDic = true; + continue; + } + else + { + } + } + } + catch + { + } + + // api上传图片文件 主图 + if (1 == 1) + { + try + { + string errMsg = ""; + var imgBase64 = GetImgBase64ForApi(out errMsg, gallery_item.url, needAddRandomBlock, wantAddRandomBlock, 800, 800); + if (!string.IsNullOrEmpty(errMsg)) + { + return errMsg; + } + + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + //upDate += "&is_file=true"; + //if (needAddRandomBlock || wantAddRandomBlock) + // upDate += "&random_code=true"; + upDate += "&img_url=" + gallery_item.url; + upDate += "&img_base64=" + imgBase64; + + var sTime = DateTime.Now; + var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在上传主图文件并识别商品 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); + if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) + { + upProdInitParam.product.info.headImg.Add(upImgUrl); + upProdParam.product.info.headImg.Add(upImgUrl); + wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl; + isChangeImgDic = true; + continue; + } + else + { + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改主图失败 " + ex.Message + "\"}"; + } + } + + // 模拟上传图片 + if (1 == 1) + { + var upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); + for (int i = 0; i < 10 && upImgAuthRst.Contains("LogicError"); i++) + { + Invoke(new Action(() => + { + cell.Value = "图片提报失败,正在重试。" + (i + 1); + })); + Thread.Sleep(Randomx.GetId(3000, 6000)); + upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); + } + if (!upImgAuthRst.Contains("\"code\":0")) + { + var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = upImgAuthRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"申请上传主图失败 " + GetHtml.UrlEncodeUtf8(error) + "\"}"; + } + string disK = BaseRegex.GetStringJson(ref upImgAuthRst, "disK"); + long disT = BaseRegex.GetLongJson(ref upImgAuthRst, "disT"); + string ext = BaseRegex.GetStringJson(ref upImgAuthRst, "ext"); + string imgBase64 = ""; + + //------------------------------------------------------------------------------------------------------------------------------------- + //生成主图base64字符串 + string getImgError; + var image = GetHtml.GetUrlImg(gallery_item.url.Replace("https://", "http://"), out getImgError); + var imageBg = new Bitmap(800, 800); + if (!string.IsNullOrEmpty(getImgError) || image == null) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"初始化主图上传失败\"}"; + } + try + { + using (Graphics g = Graphics.FromImage(imageBg)) + { + g.DrawImage(image, new Rectangle(0, 0, imageBg.Width, imageBg.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); + if (needAddRandomBlock || wantAddRandomBlock) + { + g.FillRectangle(new SolidBrush(Color.FromArgb(Randomx.GetId(256), Randomx.GetId(256), Randomx.GetId(256))), + new Rectangle(Randomx.GetId(imageBg.Width - 30), Randomx.GetId(imageBg.Height - 30), 30, 30)); + } + } + using (MemoryStream memoryStream = new MemoryStream()) + { + imageBg.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); + byte[] imageBytes = memoryStream.ToArray(); + imgBase64 = Convert.ToBase64String(imageBytes); + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改主图失败 " + ex.Message + "\"}"; + } + + //------------------------------------------------------------------------------------------------------------------------------------- + //上传主图获取路径 + var upImgRst = WXUpload.adtimageupload(shop, imgBase64, disK, disT, ext).ParseToString(); + var location = BaseRegex.GetStringJson(ref upImgRst, "Location"); + if (string.IsNullOrEmpty(location)) + { + var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = upImgAuthRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"主图上传失败 " + error + "\"}"; + } + upProdInitParam.product.info.headImg.Add(location); + upProdParam.product.info.headImg.Add(location); + //wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = location; + //isChangeImgDic = true; + Thread.Sleep(Randomx.GetId(10, 50)); + } + } + #endregion + + #region 保存缓存盗链图片 + if (isChangeImgDic) + { + var url = BaseClass.BuildObjString("product/mdy_pdd_product"); + var data = ""; + Invoke(new Action(() => + { + data = UserLogin.GetSignaturex(); + data += "&spu_id=" + dbProd.spu_id; + data += "&wx_img_map_json=" + JsonHelper.SerializeObject(wxImgMapDic); + })); + var 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")) + html = GetHtml.PostUtf8(url, data); + isChangeImgDic = false; + } + #endregion + + #region 识别类目 + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成类目属性"; + })); + } + List aiCateIdLst = new List(); + // 聚水潭商品已识别类目使用类目缓存 + if (dbProd.product_get_type_text == "厂商直采" && dbProd.wx_cat_leaf == null) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"该商品类目信息不完整\"}"; + } + // 微信商品使用类目缓存 + if (!dbProd.wx_cat_leaf.IsNullOrZero()) + { + if (dbProd.wx_cat_3 == 7370) + dbProd.wx_cat_3 = 547591; + if (dbProd.wx_cat_leaf == 7370) + dbProd.wx_cat_leaf = 547591; + + if (!dbProd.wx_cat_1.IsNullOrZero()) + aiCateIdLst.Add(dbProd.wx_cat_1.ParseToLong()); + if (!dbProd.wx_cat_2.IsNullOrZero()) + aiCateIdLst.Add(dbProd.wx_cat_2.ParseToLong()); + if (!dbProd.wx_cat_3.IsNullOrZero()) + aiCateIdLst.Add(dbProd.wx_cat_3.ParseToLong()); + if (!dbProd.wx_cat_leaf.IsNullOrZero()) + aiCateIdLst.Add(dbProd.wx_cat_leaf.ParseToLong()); + aiCateIdLst = aiCateIdLst.Distinct().ToList(); + } + else + { + //------------------------------------------------------------------------------------------------------------------------------------- + // ai识别类目暂存主图位置 + int imgId = 0; + string tempImgPath = Path.GetTempPath().Trim('\\') + "\\" + Randomx.GetWordWithNumber(8).ToLower(); + List tempImgFullPathLst = new List(); + //------------------------------------------------------------------------------------------------------------------------------------- + // 生成ai识别类目所需图片 + var aiGalleries = prodInfo.detail.galleries.Where(g => g.type == 1).Take(3).ToList(); + foreach (var gallery_item in aiGalleries) // 9张主图 + { + string getImgError; + var image = GetHtml.GetUrlImg(gallery_item.url.Replace("https://", "http://"), out getImgError); + var imageBg = new Bitmap(800, 800); + if (!string.IsNullOrEmpty(getImgError) || image == null) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"初始化主图上传失败\"}"; + } + using (Graphics g = Graphics.FromImage(imageBg)) + { + g.DrawImage(image, new Rectangle(0, 0, imageBg.Width, imageBg.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); + } + + // 取前三张图片保存到系统temp路径,配合商品标题获取商品类目 + if (imgId <= 3) + { + if (!Directory.Exists(tempImgPath)) + Directory.CreateDirectory(tempImgPath); + string imgFullPath = tempImgPath + "\\图片" + imgId + ".jpg"; + tempImgFullPathLst.Add(imgFullPath); + if (imgId == 1) + image.Save(imgFullPath, System.Drawing.Imaging.ImageFormat.Jpeg); + else + { + // 只需要传一张真实图像即可 + int fileSize = Randomx.GetId(1024, 10240); + using (BinaryWriter writer = new BinaryWriter(File.Create(imgFullPath))) + { + for (int i = 0; i < fileSize; i++) + { + writer.Write((byte)Randomx.GetId(256)); // 生成0到255之间的随机字节 + } + } + } + } + } + Thread.Sleep(Randomx.GetId(100, 300)); + //------------------------------------------------------------------------------------------------------------------------------------- + // 根据Ai分类,获取类目信息 + //{"code":0,"predInfo":{"firstCatRes":[{"catId":10000111,"catName":"服饰内衣","level":1},{"catId":10000111,"catName":"服饰内衣","level":1},{"catId":10000111,"catName":"服饰内衣","level":1}],"secondCatRes":[{"catId":10000113,"catName":"女装","level":2},{"catId":10000113,"catName":"女装","level":2},{"catId":10000113,"catName":"女装","level":2}],"thirdCatRes":[{"catId":547705,"catName":"牛仔裤","level":3,"modelVersion":""},{"catId":547704,"catName":"加绒裤","level":3,"modelVersion":"商品标题含'加绒加厚、保暖'等关键词,这表示裤子具备加绒保暖功能。主图展示了加绒内衬,也符合【服饰内衣:女装:裤子:加绒裤】类目特征。"},{"catId":547701,"catName":"休闲裤","level":3,"modelVersion":""}],"singleSecondCatRes":[],"singleFirstCatRes":[],"isSupportedCate":1},"aiCategoryList":[{"id":547705,"paths":[{"id":"10000111","name":"服饰内衣","sonIdList":["10000397","10000115","10000112","10000113","10000114"],"fId":"0","level":1,"leaf":false},{"id":"10000113","name":"女装","sonIdList":["546810","546811","530041","547706","6090","6089","6088","6087","6083","6076","6073","6070","6065","6063","6058","10000672","10000671","10000670","10000669","10000668","10000667","10000666","10000665","10000664","10000663","10000662","10000661","10000660","10000659","10000658","10000657","10000656","10000655"],"fId":"10000111","level":2,"leaf":false},{"id":"10000672","name":"裤子","sonIdList":["547699","547700","547701","547702","547703","547704","547705"],"fId":"10000113","level":3,"leaf":false},{"id":"547705","name":"牛仔裤","fId":"10000672","level":4,"leaf":true,"state":0,"hasTrialCategory":false,"isTrialCategory":false,"isLocalLife":false}],"depositAmount":0,"catAuth":true,"limitSubjectTypes":[]},{"id":547704,"paths":[{"id":"10000111","name":"服饰内衣","sonIdList":["10000397","10000115","10000112","10000113","10000114"],"fId":"0","level":1,"leaf":false},{"id":"10000113","name":"女装","sonIdList":["546810","546811","530041","547706","6090","6089","6088","6087","6083","6076","6073","6070","6065","6063","6058","10000672","10000671","10000670","10000669","10000668","10000667","10000666","10000665","10000664","10000663","10000662","10000661","10000660","10000659","10000658","10000657","10000656","10000655"],"fId":"10000111","level":2,"leaf":false},{"id":"10000672","name":"裤子","sonIdList":["547699","547700","547701","547702","547703","547704","547705"],"fId":"10000113","level":3,"leaf":false},{"id":"547704","name":"加绒裤","fId":"10000672","level":4,"leaf":true,"state":0,"hasTrialCategory":false,"isTrialCategory":false,"isLocalLife":false}],"depositAmount":0,"catAuth":true,"limitSubjectTypes":[]},{"id":547701,"paths":[{"id":"10000111","name":"服饰内衣","sonIdList":["10000397","10000115","10000112","10000113","10000114"],"fId":"0","level":1,"leaf":false},{"id":"10000113","name":"女装","sonIdList":["546810","546811","530041","547706","6090","6089","6088","6087","6083","6076","6073","6070","6065","6063","6058","10000672","10000671","10000670","10000669","10000668","10000667","10000666","10000665","10000664","10000663","10000662","10000661","10000660","10000659","10000658","10000657","10000656","10000655"],"fId":"10000111","level":2,"leaf":false},{"id":"10000672","name":"裤子","sonIdList":["547699","547700","547701","547702","547703","547704","547705"],"fId":"10000113","level":3,"leaf":false},{"id":"547701","name":"休闲裤","fId":"10000672","level":4,"leaf":true,"state":0,"hasTrialCategory":false,"isTrialCategory":false,"isLocalLife":false}],"depositAmount":0,"catAuth":true,"limitSubjectTypes":[]}],"version":"ProductClsRAG","noQualificationCatIds":[547705,547704,547701],"depositCatInfos":[{"catId":547705,"amountToPay":0,"error":false},{"catId":547704,"amountToPay":0,"error":false},{"catId":547701,"amountToPay":0,"error":false}],"visionCallMethod":"ProductClsRAG"} + var productClassifyRst = WXUpload.getProductClassify(shop, upProdInitParam.product.info.title, tempImgFullPathLst); + if (!productClassifyRst.Contains("\"code\":0")) + { + var error = BaseRegex.GetStringJson(ref productClassifyRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = productClassifyRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"获取类目失败 " + error + "\"}"; + } + WXGetProdCateInfo cateInfo = new WXGetProdCateInfo(); + try + { + cateInfo = JsonHelper.DeserializeJsonToObject(productClassifyRst); + foreach (var catePath in cateInfo.aiCategoryList.FirstOrDefault().paths) + { + aiCateIdLst.Add(catePath.id.ParseToLong()); + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + "根据图片获取类目失败 " + ex.Message + "\"}"; + } + } + #endregion + + #region 生成类目模板 + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成类目模板"; + })); + } + + if (aiCateIdLst.LastOrDefault() == 7370) + { + aiCateIdLst.RemoveAt(aiCateIdLst.Count - 1); + aiCateIdLst.Add(547591); + } + + string getCateRst = WXUpload.getCategoryOnShelf(shop, aiCateIdLst); + if (!getCateRst.Contains("\"code\":0")) + { + var error = BaseRegex.GetStringJson(ref getCateRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = getCateRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"获取类目模板失败" + error + "\"}"; + } + + JObject jCateRst = JObject.Parse(getCateRst); + upProdParam.product.info.category = JsonHelper.DeserializeJsonToList(JsonHelper.SerializeObject(jCateRst["category"])); + // 这里用了ai获取类目,如下填写 + upProdParam.product.info.recommendCategory = new recommendCategoryParam() + { + isAccepted = true, + categoryNames = new List(), + recommendSource = "ai", + interfaceName = "ProductClsRAG", + useNewInterface = 1, + }; + foreach (var cateParam in upProdParam.product.info.category) + { + upProdParam.product.info.recommendCategory.categoryNames.Add(cateParam.name); + } + + // 获取叶子类目id + + long leafCatId = (upProdParam.product.info.category.LastOrDefault()?.catId).ParseToLong(); //哲学经典著作 + var bound = GlobalConfig.WxCatBoundList.FirstOrDefault(b => b.leaf_id == leafCatId); + if (leafCatId == 547591) + bound = GlobalConfig.WxCatBoundList.FirstOrDefault(b => b.leaf_id == 7370); + if (bound == null) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"获取类目保证金失败\"}"; + var maxBount = txtFilterBoundMax.Text.Trim().ParseToInt(); + var minBount = txtFilterBoundMin.Text.Trim().ParseToInt(); + if (bound.cat_bound < minBount || bound.cat_bound > maxBount) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目保证金(" + bound.cat_bound + ")超过过滤限制(" + minBount + "-" + maxBount + ")\"}"; + + // 定向类目需指定品牌Id + var spBrandId = ""; + var spBrandName = ""; + if (leafCatId == 547591) + { + // 先写死 + //spBrandId = 10914219.ToString(); + + var rst = WXUpload.getMixBrand(shop, leafCatId.ToString()); + Invoke(new Action(() => { spBrandName = cmbSpBrandName.Text.Trim(); })); + + if (!string.IsNullOrEmpty(spBrandName) && rst.Contains("\"code\":0")) + { + var jObj = JsonHelper.JObjectParse(rst); + foreach (var jItem in jObj["mixBrandList"]) // bizuinBrandList mixBrandList + { + if (jItem["chName"].ParseToString() == spBrandName) + spBrandId = jItem["brandId"].ParseToString(); + } + } + + if (spBrandId.IsNullOrEmpty()) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"定向类目绑定品牌失败\"}"; + } + + // 国表定向类目 + upProdParam.product.info.brandId = spBrandId.ParseToLong(); + } + else + { + + // 检测是否有类目上传权限 + var cateUpCheckRst = WXUpload.batchCheckCategoryRelation(shop, leafCatId); + //"{\"code\":0,\"list\":[{\"category_id\":\"1427\",\"result\":0,\"no_auth_reason_type\":0}]}" + //"{\"code\":0,\"list\":[{\"category_id\":\"7486\",\"result\":0,\"no_auth_reason_type\":0}]}" + if (!cateUpCheckRst.Contains("\"code\":0") && !cateUpCheckRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref cateUpCheckRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = cateUpCheckRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目校验错误 " + error + "\"}"; + } + if (!cateUpCheckRst.Contains("\"result\":1")) + { + if (aiCateIdLst.FirstOrDefault() == 10000215) + { + //@"{""categoryInfo"":{""categories"":[{""id"":10000215},{""id"":10000222},{""id"":7483}],""categoryDeposit"":""1000.00"",""isNewApplyCat"":true,""licenseGroupList"":[{""licenseGroupId"":""1"",""license"":{""licenseId"":""4"",""cosIdList"":[""1771897594802-oM5657FQAaKYlf2uP300NBgx9HYY-0581""],""licenseFieldList"":[{""key"":""audit_license_registration_no"",""value"":""YB23509020049441""},{""key"":""search_url"",""value"":""""}],""isReuse"":true}}],""ruleVersion"":5234,""certificate"":[]},""brandIdList"":[],""leafCategoryId"":7483,""reuse"":0,""applyType"":""normalApply""}"; + var getCatDataRst = WXUpload.getSingleCategoryData(shop, leafCatId, aiCateIdLst); + if (!getCatDataRst.Contains("\"code\":0") && !getCatDataRst.Contains("\"success\":true")) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请失败 查询类目资质文件失败" + "\"}"; + } + + WXCateAuthParam wxCateAuthParam = new WXCateAuthParam(); + wxCateAuthParam.leafCategoryId = leafCatId; + wxCateAuthParam.categoryInfo.categoryDeposit = bound.cat_bound.ToString("0.00"); + wxCateAuthParam.categoryInfo.ruleVersion = BaseRegex.GetIntJson(ref getCatDataRst, "ruleVersion"); + foreach (var cateId in aiCateIdLst) + { + wxCateAuthParam.categoryInfo.categories.Add(new WXCateId() { id = cateId }); + } + try + { + if (!JsonHelper.JObjectParse(getCatDataRst)["reuseApplyData"].IsJTokenNullOrEmpty()) + { + var jlicenseGroupList = JsonHelper.JObjectParse(getCatDataRst)["reuseApplyData"]["catInfo"]["licenseGroupList"]; + var licenseGroupListStr = JsonHelper.SerializeObject(jlicenseGroupList); + wxCateAuthParam.categoryInfo.licenseGroupList = JsonHelper.DeserializeJsonToList(licenseGroupListStr); + } + else + { + var licenseGroup = new licenseGroup(); + wxCateAuthParam.categoryInfo.licenseGroupList.Add(licenseGroup); + licenseGroup.license.licenseId = "4"; + var cosIdList = "[" + BaseRegex.GetMatchRegexString(ref getCatDataRst, "\"cosIdList\":\\[([\\s\\S]*?)\\]") + "]"; + licenseGroup.license.cosIdList = JsonHelper.DeserializeJsonToList(cosIdList); + var licenseFieldList = "[" + BaseRegex.GetMatchRegexString(ref getCatDataRst, "\"licenseFieldList\":\\[([\\s\\S]*?)\\]") + "]"; + licenseGroup.license.licenseFieldList = JsonHelper.DeserializeJsonToList(licenseFieldList); + } + var authCateRst = WXUpload.wxCateAuth(shop, aiCateIdLst, wxCateAuthParam); + if (!authCateRst.Contains("\"code\":0") && !authCateRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref authCateRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = BaseRegex.GetStringJson(ref authCateRst, "errmsg"); + if (string.IsNullOrEmpty(error)) + error = authCateRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请失败 " + error + "\"}"; + } + Thread.Sleep(Randomx.GetId(5000, 7000)); + cateUpCheckRst = WXUpload.batchCheckCategoryRelation(shop, leafCatId); + if (!cateUpCheckRst.Contains("\"code\":0") && !cateUpCheckRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref cateUpCheckRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = cateUpCheckRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请校验错误 " + error + "\"}"; + } + if (!cateUpCheckRst.Contains("\"result\":1")) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请审核中 请稍后再试\"}"; + } + catch + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请失败 复用资质文件失败,请重新提交资质文件" + "\"}"; + } + //return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请失败 请手动申请资质类目" + "\"}"; + } + else + { + Thread.Sleep(Randomx.GetId(1000, 2000)); + var cateAuthorRst = WXUpload.addFinderCategoryV2(shop, leafCatId); + if (!cateAuthorRst.Contains("\"code\":0") && !cateAuthorRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref cateAuthorRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = BaseRegex.GetStringJson(ref cateAuthorRst, "errmsg"); + if (string.IsNullOrEmpty(error)) + error = cateAuthorRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"类目申请错误 " + error + "\"}"; + } + } + } + } + + #endregion + + #region ai短标题 // ai获取短标题 + if (wxUploadRule.IsAiShortTitle || chkAiImage.Checked) + { + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成短标题"; + })); + } + + WXGetShortTitleParam titleParam = new WXGetShortTitleParam() + { + categories = new List(), + headImgUrls = upProdParam.product.info.headImg, + productTitle = upProdParam.product.info.title, + }; + foreach (var cate in upProdParam.product.info.category) + { + titleParam.categories.Add(new categorieParam() { catId = cate.catId, catName = cate.name }); + } + var shortTitleRst = WXUpload.genProductShortTitle(shop, titleParam); + if (!shortTitleRst.Contains("\"code\":0") && !shortTitleRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref shortTitleRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = shortTitleRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"短标题获取失败 " + error + "\"}"; + } + upProdParam.product.info.shortTitle = BaseRegex.GetStringJson(ref shortTitleRst, "shortTitle"); + upProdParam.product.info.aiGenShortTitle = upProdParam.product.info.shortTitle; + upProdParam.product.info.title = upProdParam.product.info.shortTitle + upProdParam.product.info.title; + } + #endregion + + #region 标题前缀,加在最前面 + if (!string.IsNullOrWhiteSpace(wxUploadRule.TitleHeadWords)) + upProdParam.product.info.title = wxUploadRule.TitleHeadWords + upProdParam.product.info.title; + #endregion + + #region 售后信息 + + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在选取售后属性"; + })); + } + + // 非上海仓退货 + if (!chkUseShanghaiReturnOrderAddress.Checked) + { + var afterSaleAddress = ""; + var afterSaleDetail = ""; + // 厂商直采获取售后地址用于处理售后单 + if (dbProd.product_get_type_text == "厂商直采") + { + + var urlAfterSale = BaseClass.BuildObjString("product/wx_get_after_sale"); + var dataAfterSale = Work.UserLogin.GetSignaturex(); + if (!string.IsNullOrEmpty(dbProd.real_coid)) + dataAfterSale += "&coid=" + dbProd.skc_id + "->" + dbProd.real_coid; + else + dataAfterSale += "&coid=" + dbProd.skc_id; + var htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); + if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) + htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); + if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) + { + + } + else + { + if (htmlAfterSale.Contains("\"data\":\"\"")) + { + } + else + { + try + { + afterSaleAddress = JsonHelper.SerializeObject(JsonHelper.JObjectParse(htmlAfterSale)["data"]); + } + catch + { + + } + } + } + + //{"address_id":null,"user_name":"退货","postal_code":null,"province_name":"广东省","city_name":"揭阳市","county_name":"榕城区","street_name":"东兴街道","detail_info":"建阳路万泰华庭二期对面眼镜","tel_number":"13024622251","number":"10431013","name":"麦多多供应链"} + //{"address_id":null,"user_name":"退货","postal_code":null,"province_name":"广东省","city_name":"揭阳市","county_name":"榕城区","street_name":"东兴街道","detail_info":"建阳路万泰华庭二期对面眼镜","tel_number":"13024622251","number":"10431013","name":"麦多多供应链"} + if (string.IsNullOrEmpty(afterSaleAddress)) + { + // 获取推单售后地址 + var urlAfter = BaseClass.BuildObjString("product/e57_after_sale"); + var dataAfter = Work.UserLogin.GetSignaturex() + "&coid=" + dbProd.skc_id; + var afterRst = GetHtml.PostUtf8(urlAfter, dataAfter); + try + { + afterSaleAddress = JsonHelper.SerializeObject(JsonHelper.JObjectParse(afterRst)["data"]); + if (afterRst.Contains("\"code\":0") && !string.IsNullOrEmpty(afterSaleAddress)) + { + urlAfterSale = BaseClass.BuildObjString("product/wx_add_mdy_after_sale"); + dataAfterSale = Work.UserLogin.GetSignaturex() + + "&coid=" + dbProd.skc_id + + "&after_sale_json=" + afterSaleAddress; + htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); + if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) + htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); + } + } + catch (Exception ex) + { + } + } + + if (string.IsNullOrEmpty(afterSaleAddress)) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址信息获取失败\"}"; + } + } + + // 官方库1688厂家数据必须有退货地址才能上传,用户自采数据使用店铺或默认退货地址 26.5.29 + // 官方库暂时也放开限制可以随意传 26.5.31 + else if (dbProd.product_get_type_text == "1688厂家" && dbProd.add_user_name == "admin" && 1 == 2) + { + var urlAfterSale = BaseClass.BuildObjString("product/wx_get_after_sale"); + var dataAfterSale = Work.UserLogin.GetSignaturex(); + dataAfterSale += "&coid=" + dbProd.from_shop_id; + var htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); + if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) + htmlAfterSale = GetHtml.PostUtf8(urlAfterSale, dataAfterSale); + if (string.IsNullOrEmpty(htmlAfterSale) || !htmlAfterSale.Contains("\"code\":200")) + { + + } + else + { + if (htmlAfterSale.Contains("\"data\":\"\"")) + { + } + else + { + try + { + afterSaleAddress = JsonHelper.SerializeObject(JsonHelper.JObjectParse(htmlAfterSale)["data"]); + } + catch + { + + } + } + } + + if (string.IsNullOrEmpty(afterSaleAddress)) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址信息获取失败\"}"; + } + } + + else if (GlobalConfig.GlobalSettings.IsWxUseSoftwareDefaultAddress == true && !IsWxNotUseSoftwareDefaultAddressOnce) + { + if (GlobalConfig.WXShopDefaultAddressList.Any(a => a.shop_id == shop.ShopId)) + WXShopDefaultAddressListForm.GetShopDefaultAddress(new List() { shop }); + var address = GlobalConfig.WXShopDefaultAddressList.First(a => a.shop_id == shop.ShopId); + if (!address.isFullAddress) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"店铺地址信息获取失败\"}"; + afterSaleAddress = JsonHelper.SerializeObject(address); + } + + if (!string.IsNullOrEmpty(afterSaleAddress)) + { + afterSaleDetail = BaseRegex.GetStringJson(ref afterSaleAddress, "detail_info"); + if (string.IsNullOrEmpty(afterSaleDetail)) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址详细信息获取失败\"}"; + } + } + + var addressRst = WXUpload.getAddress(shop, afterSaleDetail); + if (!addressRst.Contains("\"code\":0") && !addressRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref addressRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = addressRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址获取失败 " + error + "\"}"; + } + if (addressRst.Contains("\"totalNum\":0") && !string.IsNullOrEmpty(afterSaleDetail)) + { + string provinceName = BaseRegex.GetStringJson(ref afterSaleAddress, "province_name"); + string cityName = BaseRegex.GetStringJson(ref afterSaleAddress, "city_name"); + string countyName = BaseRegex.GetStringJson(ref afterSaleAddress, "county_name"); + string detailInfo = afterSaleDetail; + string userName = BaseRegex.GetStringJson(ref afterSaleAddress, "user_name"); + string telNumber = BaseRegex.GetStringJson(ref afterSaleAddress, "tel_number"); + var addAddRst = WXUpload.addAddress(shop, provinceName, cityName, countyName, detailInfo, userName, telNumber); + + Thread.Sleep(Randomx.GetId(500, 1000)); + + addressRst = WXUpload.getAddress(shop, afterSaleDetail); + if (!addressRst.Contains("\"code\":0") && !addressRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref addressRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = addressRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址获取失败 " + error + "\"}"; + } + } + + if (addressRst.Contains("\"totalNum\":0")) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"售后地址获取失败\"}"; + } + + upProdParam.product.info.afterSaleInfo = new afterSaleInfoParam(); + upProdParam.product.info.afterSaleInfo.afterSaleAddressId = BaseRegex.GetStringJson(ref addressRst, "addressId"); + } + // 上海仓退货 + else + { + try + { + string addressId = ""; + string setAddressRst = WXProdNoCheckEditHelper.SetShanghaiReturnOrderAddress(shop); + if (setAddressRst.Contains("\"success\":true")) + { + addressId = WXProdNoCheckEditHelper.dicShopAddressId[shop.ShopId]; + } + else + { + var errmsg = BaseRegex.GetStringJson(ref setAddressRst, "msg"); + if (string.IsNullOrWhiteSpace(errmsg)) + errmsg = setAddressRst; + WXProdNoCheckEditHelper.dicShopAddressId.Remove(shop.ShopId); + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"退货地址指定失败:" + errmsg + "\"}"; + } + + upProdParam.product.info.afterSaleInfo = new afterSaleInfoParam(); + upProdParam.product.info.afterSaleInfo.afterSaleAddressId = addressId; + } + catch (Exception ex) + { + WXProdNoCheckEditHelper.dicShopAddressId.Remove(shop.ShopId); + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"退货地址指定失败:" + ex.Message + "\"}"; + } + } + #endregion + + // 厂商直采获取推单运费模板 + #region 获取推单运费模板,计算运费加价。 + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在选取运费模板"; + })); + } + + var shippingTemplateJson = ""; + var shipPrice = 0; + + if (dbProd.product_get_type_text == "厂商直采") + { + var urlShipping = BaseClass.BuildObjString("product/wx_get_shipping_template"); + var dataShipping = Work.UserLogin.GetSignaturex() + + "&coid=" + dbProd.skc_id; + var htmlShipping = GetHtml.PostUtf8(urlShipping, dataShipping); + if (string.IsNullOrEmpty(htmlShipping) || !htmlShipping.Contains("\"code\":200")) + htmlShipping = GetHtml.PostUtf8(urlShipping, dataShipping); + if (string.IsNullOrEmpty(htmlShipping) || !htmlShipping.Contains("\"code\":200")) + { + } + else + { + if (htmlShipping.Contains("\"data\":\"\"")) + { + } + else + { + try + { + shippingTemplateJson = JsonHelper.SerializeObject(JsonHelper.JObjectParse(htmlShipping)["data"]); + } + catch + { + + } + } + } + + if (string.IsNullOrEmpty(shippingTemplateJson)) + { + // 获取运费模板 + var urlShip = BaseClass.BuildObjString("product/e57_get_freight_template"); + var dataShip = Work.UserLogin.GetSignaturex() + "&coid=" + dbProd.skc_id; + var shipRst = GetHtml.PostUtf8(urlShip, dataShip); + if (string.IsNullOrEmpty(shipRst) || !shipRst.Contains("\"code\":0")) + shipRst = GetHtml.PostUtf8(urlShipping, dataShipping); + if (!shipRst.Contains("\"code\":0")) + { + var errMsg = BaseRegex.GetStringJson(ref shipRst, "msg"); + if (string.IsNullOrEmpty(errMsg)) + errMsg = shipRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 " + errMsg + "\"}"; + } + try + { + //[{"id":"204","warehouseNum":"15016108","freightType":0,"provinces":"香港特别行政区,台湾省,澳门特别行政区","freightPrice":9999900,"createBy":"vmslin","createTime":"2026-01-30T16:45:03+08:00","updateBy":"vmslin","updateTime":"2026-01-30T16:45:03+08:00"},{"id":"205","warehouseNum":"15016108","freightType":3,"provinces":"海南省,新疆维吾尔自治区,西藏自治区,内蒙古自治区","freightPrice":1530,"createBy":"vmslin","createTime":"2026-01-30T16:45:51+08:00","updateBy":"vmslin","updateTime":"2026-01-30T16:45:51+08:00"},{"id":"206","warehouseNum":"15016108","freightType":1,"provinces":"北京市,上海市","freightPrice":410,"createBy":"vmslin","createTime":"2026-01-30T16:46:04+08:00","updateBy":"vmslin","updateTime":"2026-01-30T16:46:04+08:00"},{"id":"207","warehouseNum":"15016108","freightType":1,"provinces":"安徽省,重庆市,福建省,广东省,甘肃省,广西壮族自治区,贵州省,河北省,湖北省,黑龙江省,河南省,湖南省,吉林省,江苏省,江西省,辽宁省,宁夏回族自治区,青海省,四川省,山东省,山西省,陕西省,天津市,云南省,浙江省","freightPrice":310,"createBy":"vmslin","createTime":"2026-01-30T16:46:17+08:00","updateBy":"vmslin","updateTime":"2026-01-30T16:46:17+08:00"}] + shippingTemplateJson = JsonHelper.SerializeObject(JsonHelper.JObjectParse(shipRst)["data"]); + if (shipRst.Contains("\"code\":0") && !string.IsNullOrEmpty(shippingTemplateJson)) + { + urlShipping = BaseClass.BuildObjString("product/wx_add_mdy_shipping_template"); + dataShipping = Work.UserLogin.GetSignaturex() + + "&coid=" + dbProd.skc_id + + "&shipping_template_json=" + shippingTemplateJson; + htmlShipping = GetHtml.PostUtf8(urlShipping, dataShipping); + if (string.IsNullOrEmpty(htmlShipping) || !htmlShipping.Contains("\"code\":200")) + htmlShipping = GetHtml.PostUtf8(urlShipping, dataShipping); + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板解析失败 " + ex.Message + "\"}"; + } + } + + if (!string.IsNullOrEmpty(shippingTemplateJson)) + { + try + { + int count = 0; + var shipObjs = JArray.Parse(shippingTemplateJson); + foreach (var shipObj in shipObjs) + { + var provincesStr = shipObj["provinces"].ParseToString(); + if (provincesStr.Split(',').Length > count) + { + count = provincesStr.Split(',').Length; + shipPrice = shipObj["freightPrice"].ParseToInt(); + } + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 " + ex.Message + "\"}"; + } + } + if (shipPrice <= 0) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 未获取到\"}"; + } + } + #endregion + + #region 获取店铺运费模板 + var expressRst = WXUpload.getFreightTemplate(shop); + if (!expressRst.Contains("\"code\":0") && !expressRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref expressRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = expressRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 " + error + "\"}"; + } + try + { + var addressArr = JsonHelper.JObjectParse(expressRst)["freightTemplateList"]; + foreach (var addressObj in addressArr) + { + var addressStr = JsonHelper.SerializeObject(addressObj); + if (addressObj["isDefault"].ParseToInt() == 1) + { + string templateId = addressObj["templateId"].ParseToString(); + upProdParam.product.info.expressInfo = new expressInfoParam(); + upProdParam.product.info.expressInfo.templateId = templateId; // BaseRegex.GetStringJson(ref expressRst, "templateId"); + break; + } + } + if (upProdParam.product.info.expressInfo == null) + { + upProdParam.product.info.expressInfo = new expressInfoParam(); + upProdParam.product.info.expressInfo.templateId = BaseRegex.GetStringJson(ref expressRst, "templateId"); + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"运费模板获取失败 " + ex.Message + "\"}"; + } + #endregion + + #region 详情图 + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成商品详情"; + })); + } + Thread.Sleep(Randomx.GetId(100, 300)); + upProdParam.product.info.detail = new productDetailParam(); // 详情图 + var detailGalleries = prodInfo.detail.galleries.Where(g => g.type == 2).ToList(); + if (detailGalleries.Count == 0) + detailGalleries.Add(new gallery_item() { type = 2, url = prodInfo.detail.galleries.FirstOrDefault(g => g.type == 1)?.url }); + + foreach (var gallery_item in detailGalleries) + { + try + { + if (dbProd.product_get_type_text == "微信店采") + { + upProdParam.product.info.detail.detailImg.Add(gallery_item.url); + continue; + } + + // 获取缓存盗链 详情图 + if (wxImgMapDic.ContainsKey(BaseClass.GetMd5(gallery_item.url))) + { + upProdParam.product.info.detail.detailImg.Add(wxImgMapDic[BaseClass.GetMd5(gallery_item.url)]); + continue; + } + + if (needAddRandomBlock || wantAddRandomBlock || gallery_item.url.Contains("wst.wxapp.tc.qq.com")) + { + // 如果想打码或者需要打码,就走差异化详情图,不走api直传 + } + else + { + // 使用接口链接传详情图 + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + upDate += "&post_data=" + GetHtml.UrlEncodeUtf8("{\"img_url\":\"" + gallery_item.url.Replace("https://", "http://") + "\"}"); + + var sTime = DateTime.Now; + var upDateRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成商品详情图 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 20 && upDateRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + upDateRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref upDateRst, "img_url"); + if (upDateRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) + { + upProdParam.product.info.detail.detailImg.Add(upImgUrl); + wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl; + isChangeImgDic = true; + continue; + } + else + { + } + } + } + catch (Exception ex) + { + } + + // api上传图片文件 详情图 + if (1 == 1) + { + try + { + string errMsg = ""; + var imgBase64 = GetImgBase64ForApi(out errMsg, gallery_item.url, needAddRandomBlock, wantAddRandomBlock); + if (!string.IsNullOrEmpty(errMsg)) + { + return errMsg; + } + + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + //upDate += "&is_file=true"; + //if (needAddRandomBlock || wantAddRandomBlock) + // upDate += "&random_code=true"; + upDate += "&img_url=" + gallery_item.url; + upDate += "&img_base64=" + imgBase64; + + var sTime = DateTime.Now; + var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在上传商品详情图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); + if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) + { + upProdParam.product.info.detail.detailImg.Add(upImgUrl); + wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl; + isChangeImgDic = true; + continue; + } + else + { + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改详情图失败 " + ex.Message + "\"}"; + } + } + + // 模拟上传图片 + bool randomDrawBlock = false; + if (needAddRandomBlock || wantAddRandomBlock) + randomDrawBlock = true; + var locationStr = UploadImg(shop, gallery_item.url, cell, randomDrawBlock); + if (!locationStr.Contains("\"success\":true")) + return locationStr; + var location = BaseRegex.GetStringJson(ref locationStr, "Location"); + upProdParam.product.info.detail.detailImg.Add(location); + //wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = location; + //isChangeImgDic = true; + Thread.Sleep(Randomx.GetId(10, 50)); + } + #endregion + + #region 保存缓存盗链图片 + if (isChangeImgDic) + { + var url = BaseClass.BuildObjString("product/mdy_pdd_product"); + var data = ""; + Invoke(new Action(() => + { + data = UserLogin.GetSignaturex(); + data += "&spu_id=" + dbProd.spu_id; + data += "&wx_img_map_json=" + JsonHelper.SerializeObject(wxImgMapDic); + })); + var 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")) + html = GetHtml.PostUtf8(url, data); + isChangeImgDic = false; + } + #endregion + + WXUploadProductInfoRecommendParam recommendParamRst = new WXUploadProductInfoRecommendParam(); + if (chkUseRecommand.Checked) + { + WXUploadProductInfoRecommendParam recommendParam = new WXUploadProductInfoRecommendParam(); + //recommendParam.productId = upProdParam.product.productKey.productId; + recommendParam.predictTypeList = new List() { 5, 4, 2 }; + recommendParam.productInfo = new RecommendProductInfoParam(); + recommendParam.productInfo.title = upProdParam.product.info.title; + recommendParam.productInfo.headImg = new List(); + recommendParam.productInfo.headImg.AddRange(upProdParam.product.info.headImg); + recommendParam.productInfo.brandId = upProdParam.product.info.brandId.ParseToString(); + recommendParam.productInfo.category = JsonHelper.DeserializeJsonToList(JsonHelper.SerializeObject(upProdParam.product.info.category)); + recommendParam.productInfo.detail = new productDetailParam(); //JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(upProdParam.product.info.detail)); + var recommendRst = WXUpload.generalProductInfoRecommend(shop, recommendParam); + if (recommendRst.Contains("\"code\":0")) + { + recommendParamRst = JsonHelper.DeserializeJsonToObject(recommendRst); + } + } + if (recommendParamRst.productInfo == null) + recommendParamRst.productInfo = new RecommendProductInfoParam(); + if (recommendParamRst.productInfo.param == null) + recommendParamRst.productInfo.param = new List(); + + #region 匹配产品属性 + //真丝、蚕丝、香云纱、羊绒、羊毛、羊羔毛、羽绒、皮草 + upProdParam.product.info.param = new List(); // 商品属性值 + var productAttr = upProdParam.product.info.category.LastOrDefault().catInfo.productAttr; + + // 直接转换微信回采 + if (BaseClass.UserAuthority.ParseToString().Contains("微信回采") && chkUseWXComplateProd.Checked && dbProd.has_wx_format == "1" && wxEditProdInfo != null) + { + foreach (var wxEditPropParam in wxEditProdInfo.product.info.param) + { + var wxPropParam = new wxPropParam(); + upProdParam.product.info.param.Add(wxPropParam); + foreach (var wxEditCategoryParam in wxEditPropParam.categorys) + { + var wxCategoryParam = new categoryPropParam() + { + catType = wxEditCategoryParam.catType, + name = wxEditCategoryParam.name, + catInfo = new catInfoParam() + { + inputType = wxEditCategoryParam.catInfo.inputType, + isRequired = wxEditCategoryParam.catInfo.isRequired, + isCustomize = wxEditCategoryParam.catInfo.isCustomize, + } + }; + wxPropParam.categorys.Add(wxCategoryParam); + } + } + } + // 直接转换微信店采 + else if (dbProd.product_get_type_text == "微信店采") + { + foreach (var wxEditPropParam in wxEditProdInfo.product.info.param) + { + var wxPropParam = new wxPropParam(); + upProdParam.product.info.param.Add(wxPropParam); + foreach (var wxEditCategoryParam in wxEditPropParam.categorys) + { + // 修改书名 + if (wxEditPropParam.categorys.FirstOrDefault().name == "书名" && wxEditCategoryParam == wxEditPropParam.categorys.LastOrDefault()) + { + wxEditCategoryParam.name = prodTitle; + } + var wxCategoryParam = new categoryPropParam() + { + catType = wxEditCategoryParam.catType, + name = wxEditCategoryParam.name, + catInfo = new catInfoParam() + { + inputType = wxEditCategoryParam?.catInfo?.inputType, + isRequired = wxEditCategoryParam?.catInfo?.isRequired, + isCustomize = wxEditCategoryParam?.catInfo?.isCustomize, + } + }; + wxPropParam.categorys.Add(wxCategoryParam); + } + } + } + else + { + foreach (var propInfo in prodInfo.property.goods_properties) + { + if (propInfo.name == "容量") + { + + } + if (propInfo.name == "格数") + { + + } + if (propInfo.values.Count == 0) + continue; + + + var attr = productAttr.attr.FirstOrDefault(r => r.name == propInfo.name); + if (attr == null) + attr = productAttr.attr.FirstOrDefault(r => r.name.Replace("填充材料", "填充材质") == propInfo.name || + r.name.Replace("材质", "材质种类") == propInfo.name); + // 材质 产品名称 适用年龄 面料 生产企业名称 CCC证书编号 尺寸(长) 尺寸(宽) 尺寸(高) 物品(含配件)清单 型号 产品名称 + if (propInfo.name == "生产日期" && propInfo.values.Count > 0) + { + propInfo.values.FirstOrDefault().value = DateTime.Now.Date.AddDays(-15).ToString("yyyy-MM-dd"); + propInfo.values.FirstOrDefault().raw_value = propInfo.values.FirstOrDefault().value; + } + if (attr == null) + { + if (propInfo.name.Contains("面料俗称")) + { + attr = productAttr.attr.FirstOrDefault(r => r.name == "面料材质"); + } + if (propInfo.name.Contains("适用年龄")) + { + attr = productAttr.attr.FirstOrDefault(r => r.name == "适用年龄" || r.name == "适用年龄段"); + } + if (propInfo.name.Contains("填充物")) + { + attr = productAttr.attr.FirstOrDefault(r => r.name == "填充物种类" || r.name == "填充物"); + } + + // 书籍类目属性匹配 + if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") + { + if (propInfo.name == "出版社名称") + attr = productAttr.attr.FirstOrDefault(r => r.name == "出版社名称"); + else if ((propInfo.name == "ISBN编号" || propInfo.name == "书号") && !prodInfo.property.goods_properties.Any(p => p.name == "ISBN版号/CN刊号")) + attr = productAttr.attr.FirstOrDefault(r => r.name == "ISBN版号/CN刊号"); + else if (propInfo.name == "书名") + attr = productAttr.attr.FirstOrDefault(r => r.name == "书名"); + else if (propInfo.name == "定价") + attr = productAttr.attr.FirstOrDefault(r => r.name == "定价"); + else if (propInfo.name == "作者") + attr = productAttr.attr.FirstOrDefault(r => r.name == "作者"); + else if (propInfo.name == "出版时间") + attr = productAttr.attr.FirstOrDefault(r => r.name == "出版时间"); + else if (propInfo.name == "版次") + attr = productAttr.attr.FirstOrDefault(r => r.name == "版次"); + else if (propInfo.name == "装帧类型") + attr = productAttr.attr.FirstOrDefault(r => r.name == "包装"); + else if (propInfo.name == "包册数") + attr = productAttr.attr.FirstOrDefault(r => r.name == "图书册数"); + } + if (upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料") + { + if (propInfo.name == "厂名") + attr = productAttr.attr.FirstOrDefault(r => r.name == "生产企业名称"); + else if (propInfo.name == "食品生产许可证编号") + attr = productAttr.attr.FirstOrDefault(r => r.name == "食品生产许可证编号"); + else if (propInfo.name == "产品标准号") + attr = productAttr.attr.FirstOrDefault(r => r.name == "产品标准号"); + else if (propInfo.name == "保质期") + attr = productAttr.attr.FirstOrDefault(r => r.name == "保质期"); + else if (propInfo.name == "生产日期") + { + attr = productAttr.attr.FirstOrDefault(r => r.name == "生产日期"); + } + else if (propInfo.name == "产品重量") + { + attr = productAttr.attr.FirstOrDefault(r => r.name == "单件净含量"); + if (attr == null) + attr = productAttr.attr.FirstOrDefault(r => r.name == "净含量"); + } + else if (propInfo.name == "包装方式") + attr = productAttr.attr.FirstOrDefault(r => r.name == "包装方式"); + //else if (propInfo.name == "配料表") + // attr = productAttr.attr.FirstOrDefault(r => r.name == "配料表"); + //else if (propInfo.name == "联系方式") + // attr = productAttr.attr.FirstOrDefault(r => r.name == "联系方式"); + else if (propInfo.name == "厂址") + attr = productAttr.attr.FirstOrDefault(r => r.name == "地址"); + else if (propInfo.name == "储藏方法") + attr = productAttr.attr.FirstOrDefault(r => r.name == "贮存条件"); + } + } + if (attr == null) + { + continue; + } + var attrValueLst = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).ToList(); + var attrValue = attrValueLst.FirstOrDefault(v => v == propInfo.values.FirstOrDefault()?.value); + if (attrValue.IsNullOrEmpty()) + attrValue = attrValueLst.FirstOrDefault(v => v.Replace("高硼硅玻璃", "耐热玻璃(高硼硅)") == propInfo.values.FirstOrDefault()?.value); + if (propInfo.name == "保质期") + { + attrValue = "30 天"; + if (propInfo.values.Count > 0) + { + if (propInfo.values.FirstOrDefault().value.Contains("年") || propInfo.values.FirstOrDefault().value.Contains("月") + || propInfo.values.FirstOrDefault().value.Contains("日") || propInfo.values.FirstOrDefault().value.Contains("天") + || propInfo.values.FirstOrDefault().value.Contains("见包装")) + { + attrValue = propInfo.values.FirstOrDefault().value; + } + if (attrValue.Contains("天") && attrValue.Replace("天", "").ParseToInt() < 30) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"食品保质期小于30天,跳过上传\"}"; + } + } + } + + if (propInfo.name == "产品重量") + { + attrValue = "10g"; + if (propInfo.values.FirstOrDefault().value.Contains("g") || propInfo.values.FirstOrDefault().value.Contains("kg")) + attrValue = propInfo.values.FirstOrDefault().value; + } + if (propInfo.name == "风格" && attrValue == null) + { + attrValue = attrValueLst.FirstOrDefault(v => v == propInfo.values.FirstOrDefault().value + "风"); + } + if (attr.type == "string") + { + attrValue = propInfo.values.FirstOrDefault()?.value; + } + //书籍属性处理 + if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") + { + // 修改书名 作者 + if (attr.name == "书名" /*&& dbProd.product_get_type_text == "微信小店"*/) + { + attrValue = prodTitle; + } + if (attr.name == "作者" && attrValue == "无") + { + attrValue = new List() { "赵老师", "钱老师", "孙老师", "李老师", "周老师", "吴老师", "郑老师", "王老师", "张老师", "孙老师", "刘老师" }.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); + attrValue = "无"; + } + + if (attrValue.IsNullOrEmpty() && attr.type == "integer_unit" && (propInfo.values.FirstOrDefault()?.value).IsNumber()) + { + attrValue = propInfo.values.FirstOrDefault()?.value + " " + attr.value.Split(';').FirstOrDefault(); + } + if (attrValue.IsNullOrEmpty() && attr.name == "包装") + { + if (propInfo.values.FirstOrDefault()?.value == "平装-胶订") + attrValue = "平装"; + } + } + // 强制改为国产 + { + if (attrValueLst.Contains("国产")) + attrValue = "国产"; + else if (attr.name == "是否进口") + { + attrValue = "非进口"; + if (attr.value == "是;否") + attrValue = "否"; + } + else if (attr.name == "商品产地") + { + attrValue = "中国大陆"; + } + else if (attr.name == "产地") + { + if (attr.type == "select_one") + { + //北京;天津;上海;重庆;河北石家庄;河北唐山;河北秦皇岛;河北邯郸;河北邢台;河北保定;河北张家口;河北承德;河北沧州;河北廊坊;河北衡水;山西太原;山西大同;山西阳泉;山西长治;山西晋城;山西朔州;山西晋中;山西运城;山西忻州;山西临汾;山西吕梁;内蒙古呼和浩特;内蒙古包头;内蒙古乌海;内蒙古赤峰;内蒙古通辽;内蒙古鄂尔多斯;内蒙古呼伦贝尔;内蒙古巴彦淖尔;内蒙古乌兰察布;内蒙古兴安;内蒙古锡林郭勒;内蒙古阿拉善;辽宁沈阳;辽宁大连;辽宁鞍山;辽宁抚顺;辽宁本溪;辽宁丹东;辽宁锦州;辽宁营口;辽宁阜新;辽宁辽阳;辽宁盘锦;辽宁铁岭;辽宁朝阳;辽宁葫芦岛;吉林长春;吉林吉林;吉林四平;吉林辽源;吉林通化;吉林白山;吉林松原;吉林白城;吉林延边;黑龙江哈尔滨;黑龙江齐齐哈尔;黑龙江鸡西;黑龙江鹤岗;黑龙江双鸭山;黑龙江大庆;黑龙江伊春;黑龙江佳木斯;黑龙江七台河;黑龙江牡丹江;黑龙江黑河;黑龙江绥化;黑龙江大兴安岭;江苏南京;江苏无锡;江苏徐州;江苏常州;江苏苏州;江苏南通;江苏连云港;江苏淮安;江苏盐城;江苏扬州;江苏镇江;江苏泰州;江苏宿迁;浙江杭州;浙江宁波;浙江温州;浙江嘉兴;浙江湖州;浙江绍兴;浙江金华;浙江衢州;浙江舟山;浙江台州;浙江丽水;安徽合肥;安徽芜湖;安徽蚌埠;安徽淮南;安徽马鞍山;安徽淮北;安徽铜陵;安徽安庆;安徽黄山;安徽滁州;安徽阜阳;安徽宿州;安徽六安;安徽亳州;安徽池州;安徽宣城;福建福州;福建厦门;福建莆田;福建三明;福建泉州;福建漳州;福建南平;福建龙岩;福建宁德;江西南昌;江西景德镇;江西萍乡;江西九江;江西新余;江西鹰潭;江西赣州;江西吉安;江西宜春;江西抚州;江西上饶;山东济南;山东青岛;山东淄博;山东枣庄;山东东营;山东烟台;山东潍坊;山东济宁;山东泰安;山东威海;山东日照;山东临沂;山东德州;山东聊城;山东滨州;山东菏泽;河南郑州;河南开封;河南洛阳;河南平顶山;河南安阳;河南鹤壁;河南新乡;河南焦作;河南濮阳;河南许昌;河南漯河;河南三门峡;河南南阳;河南商丘;河南信阳;河南周口;河南驻马店;河南济源;湖北武汉;湖北黄石;湖北十堰;湖北宜昌;湖北襄阳;湖北鄂州;湖北荆门;湖北孝感;湖北荆州;湖北黄冈;湖北咸宁;湖北随州;湖北恩施;湖北仙桃;湖北潜江;湖北天门;湖北神农架;湖南长沙;湖南株洲;湖南湘潭;湖南衡阳;湖南邵阳;湖南岳阳;湖南常德;湖南张家界;湖南益阳;湖南郴州;湖南永州;湖南怀化;湖南娄底;湖南湘西;广东广州;广东韶关;广东深圳;广东珠海;广东汕头;广东佛山;广东江门;广东湛江;广东茂名;广东肇庆;广东惠州;广东梅州;广东汕尾;广东河源;广东阳江;广东清远;广东东莞;广东中山;广东潮州;广东揭阳;广东云浮;广西南宁;广西柳州;广西桂林;广西梧州;广西北海;广西防城港;广西钦州;广西贵港;广西玉林;广西百色;广西贺州;广西河池;广西来宾;广西崇左;海南海口;海南三亚;海南三沙;海南儋州;海南五指山;海南琼海;海南文昌;海南万宁;海南东方;海南定安;海南屯昌;海南澄迈;海南临高;海南白沙;海南昌江;海南乐东;海南陵水;海南保亭;海南琼中;四川成都;四川自贡;四川攀枝花;四川泸州;四川德阳;四川绵阳;四川广元;四川遂宁;四川内江;四川乐山;四川南充;四川眉山;四川宜宾;四川广安;四川达州;四川雅安;四川巴中;四川资阳;四川阿坝;四川甘孜;四川凉山;贵州贵阳;贵州六盘水;贵州遵义;贵州安顺;贵州毕节;贵州铜仁;贵州黔西南;贵州黔东南;贵州黔南;云南昆明;云南曲靖;云南玉溪;云南保山;云南昭通;云南丽江;云南普洱;云南临沧;云南楚雄;云南红河;云南文山;云南西双版纳;云南大理;云南德宏;云南怒江;云南迪庆;西藏拉萨;西藏日喀则;西藏昌都;西藏林芝;西藏山南;西藏那曲;西藏阿里;陕西西安;陕西铜川;陕西宝鸡;陕西咸阳;陕西渭南;陕西延安;陕西汉中;陕西榆林;陕西安康;陕西商洛;甘肃兰州;甘肃嘉峪关;甘肃金昌;甘肃白银;甘肃天水;甘肃武威;甘肃张掖;甘肃平凉;甘肃酒泉;甘肃庆阳;甘肃定西;甘肃陇南;甘肃临夏;甘肃甘南;青海西宁;青海海东;青海海北;青海黄南;青海海南;青海果洛;青海玉树;青海海西;宁夏银川;宁夏石嘴山;宁夏吴忠;宁夏固原;宁夏中卫;新疆乌鲁木齐;新疆克拉玛依;新疆吐鲁番;新疆哈密;新疆昌吉;新疆博尔塔拉;新疆巴音郭楞;新疆阿克苏;新疆克孜勒苏;新疆喀什;新疆和田;新疆伊犁;新疆塔城;新疆阿勒泰;新疆石河子;新疆阿拉尔;新疆图木舒克;新疆五家渠;新疆北屯;新疆铁门关;新疆双河;新疆可克达拉;新疆昆玉;新疆胡杨河;新疆新星;新疆白杨 + //北京;天津;上海;重庆;河北;山西;内蒙古;辽宁;吉林;黑龙江;江苏;浙江;安徽;福建;江西;山东;河南;湖北;湖南;广东;广西;海南;四川;贵州;云南;西藏;陕西;甘肃;青海;宁夏;新疆 + var values = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).OrderBy(x => Guid.NewGuid()).ToList(); + if (values.Contains("中国大陆")) + attrValue = "中国大陆"; + else + { + var value = values.FirstOrDefault(v => prodTitle.ParseToString().Contains(v)); + if (value == null) + value = values.FirstOrDefault(v => prodTitle.ParseToString().Contains(string.Join("", v.Take(2)))); + if (value == null) + value = values.FirstOrDefault(v => "北京;天津;上海;重庆;河北;山西;内蒙古;辽宁;吉林;黑龙江;江苏;浙江;安徽;福建;江西;山东;河南;湖北;湖南;广东;广西;海南;四川;贵州;云南;西藏;陕西;甘肃;青海;宁夏;新疆".Contains(string.Join("", v.Take(2)))); + attrValue = value; + } + } + else + { + attrValue = "中国大陆"; + } + } + } + // 强制非收藏品 + { + if (attrValueLst.Contains("是否具有拍卖/收藏价值")) + { + attrValue = "不具有"; + } + if (attrValueLst.Contains("是否批量生产(孤品)")) + { + attrValue = "批量生产"; + } + } + if (attrValue.IsNullOrEmpty() && attr.isRequired == true) + { + if (attrValueLst.Contains("其他")) + attrValue = "其他"; + else if (attrValueLst.Contains("常规")) + attrValue = "常规"; + else if (attrValueLst.Contains("通用")) + attrValue = "通用"; + else if (attr.value.Contains("绒丝;羽毛;白鸭绒;白鹅绒;灰鸭绒;灰鹅绒;鸭毛片;鹅毛片")) + { + attrValue = "绒丝"; + } + //else if (attrValueLst.Any(v => v.Contains("%"))) + //{ + // attrValue = attrValueLst.FirstOrDefault(); + //} + else + attrValue = attrValueLst.Where(v => !"真丝、蚕丝、香云纱、羊绒、羊毛、羊羔绒、羊羔毛、羽绒、皮草".Contains(v)).OrderBy(x => Guid.NewGuid()).FirstOrDefault(); + } + if (attrValue.IsNullOrEmpty()) + { + if (attrValueLst.Contains("其他")) + attrValue = "其他"; + else if (attrValueLst.Contains("通用")) + attrValue = "通用"; + } + if (attrValue.IsNullOrEmpty() && attr.type == "string") + { + attrValue = propInfo.values.FirstOrDefault()?.value; + } + if (attr.type == "decimal4_unit" || attr.type == "integer_unit") + { + if (attr.value == "%") + attrValue = "1 %"; + else if (attr.value == "g;kg") + attrValue = "50 g"; + else if (attr.value == "g") + attrValue = "10 g"; + else if (attr.value == "kg") + attrValue = "1 kg"; + //else if (attr.value == "g;kg;ml;L") + // attrValue = "100 g"; + else if (attr.value == "cm") + { + var propValue = propInfo.values.FirstOrDefault()?.value; + var match = BaseRegex.GetMatchRegexString(ref propValue, @"([\d]{1,4})cm"); + if (!string.IsNullOrEmpty(match)) + { + attrValue = match + " cm"; + } + } + else if (attr.value == "mm") + { + var propValue = propInfo.values.FirstOrDefault()?.value; + var match = BaseRegex.GetMatchRegexString(ref propValue, @"([\d]{1,4})mm"); + if (!string.IsNullOrEmpty(match)) + { + attrValue = match + " mm"; + } + } + else if (attr.value.Contains("岁以上") && attr.value.Contains("个月以上")) + { + attrValue = "7 岁以上"; + if (propInfo.values.FirstOrDefault().value.Contains("岁以上") || propInfo.values.FirstOrDefault().value.Contains("个月以上")) + attrValue = propInfo.values.FirstOrDefault().value; + if (propInfo.values.FirstOrDefault().value.Contains("岁")) + { + var propValue = propInfo.values.FirstOrDefault().value; + var match = BaseRegex.GetMatchRegexString(ref propValue, @"([\d]{1,3})"); + if (!string.IsNullOrEmpty(match)) + { + attrValue = match + " 岁以上"; + } + } + else if (propInfo.values.FirstOrDefault().value.Contains("月")) + { + var propValue = propInfo.values.FirstOrDefault().value; + var match = BaseRegex.GetMatchRegexString(ref propValue, @"([\d]{1,3})"); + if (!string.IsNullOrEmpty(match)) + { + attrValue = match + " 个月以上"; + } + } + } + else if (attr.value == "个") + { + if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith("个")) + { + attrValue = propInfo.values.FirstOrDefault()?.value; + if (attrValue.TrimEnd('个').ParseToInt() == 0) + attrValue = BaseRegex.GetMatchMaxRegexString(ref attrValue, "(\\d{1,6})") + (attrValue.Contains("只") ? " 只" : " 个"); + if (attrValue.TrimEnd('个').ParseToInt() == 0) + attrValue = "1 个"; + } + else + attrValue = "1 个"; + } + else if (attr.value == "只;个") + { + if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith("只") || (propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith("个")) + { + attrValue = propInfo.values.FirstOrDefault()?.value; + if (attrValue.TrimEnd('只', '个').ParseToInt() == 0) + attrValue = BaseRegex.GetMatchMaxRegexString(ref attrValue, "(\\d{1,6})") + (attrValue.Contains("只") ? " 只" : " 个"); + if (attrValue.TrimEnd('只', '个').ParseToInt() == 0) + attrValue = "1 个"; + } + else + attrValue = "1 个"; + } + else if (attr.value == "ml") + { + if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith(attr.value)) + attrValue = propInfo.values.FirstOrDefault()?.value.TrimStart('-', ' '); + else + attrValue = "100 ml"; + } + else if (attr.value == "L") + { + if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith(attr.value)) + { + attrValue = propInfo.values.FirstOrDefault()?.value; + if (attrValue.TrimEnd('L').ParseToInt() == 0) + attrValue = BaseRegex.GetMatchMaxRegexString(ref attrValue, "(\\d{1,6})") + " L"; + if (attrValue.TrimEnd('L').ParseToInt() == 0) + attrValue = "1 L"; + } + else + attrValue = "1 L"; + } + else if (attr.value == "g;kg;ml;L") + { + var propInfoValue = (propInfo.values.FirstOrDefault()?.value).ParseToString(); + if (propInfoValue.EndsWith("g") || propInfoValue.EndsWith("kg") || propInfoValue.EndsWith("ml") || propInfoValue.EndsWith("L")) + attrValue = propInfo.values.FirstOrDefault()?.value; + else + attrValue = "100 g"; + } + else if (attr.value == "日;月;年") + { + var propInfoValue = (propInfo.values.FirstOrDefault()?.value).ParseToString(); + if (propInfoValue.EndsWith("日") || propInfoValue.EndsWith("月") || propInfoValue.EndsWith("年")) + attrValue = propInfo.values.FirstOrDefault()?.value + propInfoValue.LastOrDefault(); + else + attrValue = "30 日"; + } + else if (attr.value.ParseToString().Length > 0 && !attr.value.ParseToString().Contains(";")) + { + if ((propInfo.values.FirstOrDefault()?.value).ParseToString().EndsWith(attr.value)) + { + attrValue = propInfo.values.FirstOrDefault()?.value; + if (attrValue.Substring(0, attrValue.Length - attr.value.Length - 1).ParseToInt() == 0) + attrValue = BaseRegex.GetMatchMaxRegexString(ref attrValue, "(\\d{1,6})") + " " + attr.value; + if (attrValue.Substring(0, attrValue.Length - attr.value.Length - 1).ParseToInt() == 0) + attrValue = "1 " + attr.value; + } + else + attrValue = "1 " + attr.value; + } + else + { + var param = recommendParamRst.productInfo.param.FirstOrDefault(p => p.categorys?.FirstOrDefault()?.name == attr.name); + if (param != null && param.categorys.Count == 2) + { + attrValue = param.categorys[1].name; + if (attrValue.Contains("磅") && attrValue.Replace("磅", "").ParseToDecimal() > 0) + { + if ((";" + attr.value + ";").Contains(";g;")) + attrValue = (attrValue.Replace("磅", "").ParseToDecimal() * 454).ParseToInt() + "g"; + else if ((";" + attr.value + ";").Contains(";kg;")) + attrValue = (attrValue.Replace("磅", "").ParseToDecimal() * 0.454m).ParseToDecimal() + "kg"; + } + } + else + { + attrValue = propInfo.values.FirstOrDefault()?.value.ParseToString(); + var units = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); + foreach (var unit in units) + { + var val = attrValue.Replace(unit, "").Trim(); + if (attr.type == "decimal4_unit" && val.ParseToDecimal() != 0m) + { + attrValue = val + " " + unit; + break; + } + if (attr.type == "integer_unit" && val.ParseToInt() != 0) + { + attrValue = val + " " + unit; + break; + } + } + } + } + } + + if (string.IsNullOrEmpty(attrValue)) + continue; + + var wxPropParam = new wxPropParam(); + upProdParam.product.info.param.Add(wxPropParam); + var wxCategoryParam1 = new categoryPropParam() + { + catType = 7, + name = attr.name, + catInfo = new catInfoParam() { inputType = attr.normalRelease.ruleType, isRequired = attr.isRequired == true ? 1 : 0, isCustomize = 0 } + }; + var wxCategoryParam2 = new categoryPropParam() + { + catType = 7, + name = attrValue, + catInfo = new catInfoParam() { inputType = attr.normalRelease.ruleType, isRequired = attr.isRequired == true ? 1 : 0, isCustomize = 0 } + }; + wxPropParam.categorys.Add(wxCategoryParam1); + wxPropParam.categorys.Add(wxCategoryParam2); + } + } + foreach (var wxPropParam in upProdParam.product.info.param) + { + if (wxPropParam.categorys.Count > 0 && + wxPropParam.categorys.FirstOrDefault().name == "作者" && (wxPropParam.categorys.LastOrDefault().name == "无" || + wxPropParam.categorys.LastOrDefault().name == "-" || wxPropParam.categorys.LastOrDefault().name == "/")) + { + wxPropParam.categorys.LastOrDefault().name = upProdParam.product.info.param.FirstOrDefault(p => p.categorys.FirstOrDefault()?.name == "出版社名称").categorys.LastOrDefault()?.name; + } + } + + foreach (var attr in productAttr.attr) + { + if (attr.isRequired != true) + continue; + // 已填写内没有但是必填属性 + if (upProdParam.product.info.param.Any(p => p.categorys.FirstOrDefault()?.name == attr.name)) + continue; + + var attrValueLst = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).ToList(); + string attrValue = ""; + if (attrValue.IsNullOrEmpty() && attr.isRequired == true) + { + if (attrValueLst.Contains("其他")) + attrValue = "其他"; + else if (attrValueLst.Contains("常规")) + attrValue = "常规"; + else if (attrValueLst.Contains("通用")) + attrValue = "通用"; + else if (attrValueLst.Contains("国产")) + attrValue = "国产"; + else if (attr.value.Contains("绒丝;羽毛;白鸭绒;白鹅绒;灰鸭绒;灰鹅绒;鸭毛片;鹅毛片")) + { + attrValue = "绒丝"; + } + else if (attr.name == "是否进口") + { + attrValue = "非进口"; + if (attr.value == "是;否") + attrValue = "否"; + } + else if (attr.name == "商品产地") + { + attrValue = "中国大陆"; + } + else if (attr.name == "产地") + { + if (attr.type == "select_one") + { + //北京;天津;上海;重庆;河北石家庄;河北唐山;河北秦皇岛;河北邯郸;河北邢台;河北保定;河北张家口;河北承德;河北沧州;河北廊坊;河北衡水;山西太原;山西大同;山西阳泉;山西长治;山西晋城;山西朔州;山西晋中;山西运城;山西忻州;山西临汾;山西吕梁;内蒙古呼和浩特;内蒙古包头;内蒙古乌海;内蒙古赤峰;内蒙古通辽;内蒙古鄂尔多斯;内蒙古呼伦贝尔;内蒙古巴彦淖尔;内蒙古乌兰察布;内蒙古兴安;内蒙古锡林郭勒;内蒙古阿拉善;辽宁沈阳;辽宁大连;辽宁鞍山;辽宁抚顺;辽宁本溪;辽宁丹东;辽宁锦州;辽宁营口;辽宁阜新;辽宁辽阳;辽宁盘锦;辽宁铁岭;辽宁朝阳;辽宁葫芦岛;吉林长春;吉林吉林;吉林四平;吉林辽源;吉林通化;吉林白山;吉林松原;吉林白城;吉林延边;黑龙江哈尔滨;黑龙江齐齐哈尔;黑龙江鸡西;黑龙江鹤岗;黑龙江双鸭山;黑龙江大庆;黑龙江伊春;黑龙江佳木斯;黑龙江七台河;黑龙江牡丹江;黑龙江黑河;黑龙江绥化;黑龙江大兴安岭;江苏南京;江苏无锡;江苏徐州;江苏常州;江苏苏州;江苏南通;江苏连云港;江苏淮安;江苏盐城;江苏扬州;江苏镇江;江苏泰州;江苏宿迁;浙江杭州;浙江宁波;浙江温州;浙江嘉兴;浙江湖州;浙江绍兴;浙江金华;浙江衢州;浙江舟山;浙江台州;浙江丽水;安徽合肥;安徽芜湖;安徽蚌埠;安徽淮南;安徽马鞍山;安徽淮北;安徽铜陵;安徽安庆;安徽黄山;安徽滁州;安徽阜阳;安徽宿州;安徽六安;安徽亳州;安徽池州;安徽宣城;福建福州;福建厦门;福建莆田;福建三明;福建泉州;福建漳州;福建南平;福建龙岩;福建宁德;江西南昌;江西景德镇;江西萍乡;江西九江;江西新余;江西鹰潭;江西赣州;江西吉安;江西宜春;江西抚州;江西上饶;山东济南;山东青岛;山东淄博;山东枣庄;山东东营;山东烟台;山东潍坊;山东济宁;山东泰安;山东威海;山东日照;山东临沂;山东德州;山东聊城;山东滨州;山东菏泽;河南郑州;河南开封;河南洛阳;河南平顶山;河南安阳;河南鹤壁;河南新乡;河南焦作;河南濮阳;河南许昌;河南漯河;河南三门峡;河南南阳;河南商丘;河南信阳;河南周口;河南驻马店;河南济源;湖北武汉;湖北黄石;湖北十堰;湖北宜昌;湖北襄阳;湖北鄂州;湖北荆门;湖北孝感;湖北荆州;湖北黄冈;湖北咸宁;湖北随州;湖北恩施;湖北仙桃;湖北潜江;湖北天门;湖北神农架;湖南长沙;湖南株洲;湖南湘潭;湖南衡阳;湖南邵阳;湖南岳阳;湖南常德;湖南张家界;湖南益阳;湖南郴州;湖南永州;湖南怀化;湖南娄底;湖南湘西;广东广州;广东韶关;广东深圳;广东珠海;广东汕头;广东佛山;广东江门;广东湛江;广东茂名;广东肇庆;广东惠州;广东梅州;广东汕尾;广东河源;广东阳江;广东清远;广东东莞;广东中山;广东潮州;广东揭阳;广东云浮;广西南宁;广西柳州;广西桂林;广西梧州;广西北海;广西防城港;广西钦州;广西贵港;广西玉林;广西百色;广西贺州;广西河池;广西来宾;广西崇左;海南海口;海南三亚;海南三沙;海南儋州;海南五指山;海南琼海;海南文昌;海南万宁;海南东方;海南定安;海南屯昌;海南澄迈;海南临高;海南白沙;海南昌江;海南乐东;海南陵水;海南保亭;海南琼中;四川成都;四川自贡;四川攀枝花;四川泸州;四川德阳;四川绵阳;四川广元;四川遂宁;四川内江;四川乐山;四川南充;四川眉山;四川宜宾;四川广安;四川达州;四川雅安;四川巴中;四川资阳;四川阿坝;四川甘孜;四川凉山;贵州贵阳;贵州六盘水;贵州遵义;贵州安顺;贵州毕节;贵州铜仁;贵州黔西南;贵州黔东南;贵州黔南;云南昆明;云南曲靖;云南玉溪;云南保山;云南昭通;云南丽江;云南普洱;云南临沧;云南楚雄;云南红河;云南文山;云南西双版纳;云南大理;云南德宏;云南怒江;云南迪庆;西藏拉萨;西藏日喀则;西藏昌都;西藏林芝;西藏山南;西藏那曲;西藏阿里;陕西西安;陕西铜川;陕西宝鸡;陕西咸阳;陕西渭南;陕西延安;陕西汉中;陕西榆林;陕西安康;陕西商洛;甘肃兰州;甘肃嘉峪关;甘肃金昌;甘肃白银;甘肃天水;甘肃武威;甘肃张掖;甘肃平凉;甘肃酒泉;甘肃庆阳;甘肃定西;甘肃陇南;甘肃临夏;甘肃甘南;青海西宁;青海海东;青海海北;青海黄南;青海海南;青海果洛;青海玉树;青海海西;宁夏银川;宁夏石嘴山;宁夏吴忠;宁夏固原;宁夏中卫;新疆乌鲁木齐;新疆克拉玛依;新疆吐鲁番;新疆哈密;新疆昌吉;新疆博尔塔拉;新疆巴音郭楞;新疆阿克苏;新疆克孜勒苏;新疆喀什;新疆和田;新疆伊犁;新疆塔城;新疆阿勒泰;新疆石河子;新疆阿拉尔;新疆图木舒克;新疆五家渠;新疆北屯;新疆铁门关;新疆双河;新疆可克达拉;新疆昆玉;新疆胡杨河;新疆新星;新疆白杨 + //北京;天津;上海;重庆;河北;山西;内蒙古;辽宁;吉林;黑龙江;江苏;浙江;安徽;福建;江西;山东;河南;湖北;湖南;广东;广西;海南;四川;贵州;云南;西藏;陕西;甘肃;青海;宁夏;新疆 + var values = attr.value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).OrderBy(x => Guid.NewGuid()).ToList(); + if (values.Contains("中国大陆")) + attrValue = "中国大陆"; + else + { + var value = values.FirstOrDefault(v => prodTitle.ParseToString().Contains(v)); + if (value == null) + value = values.FirstOrDefault(v => prodTitle.ParseToString().Contains(string.Join("", v.Take(2)))); + if (value == null) + value = values.FirstOrDefault(v => "北京;天津;上海;重庆;河北;山西;内蒙古;辽宁;吉林;黑龙江;江苏;浙江;安徽;福建;江西;山东;河南;湖北;湖南;广东;广西;海南;四川;贵州;云南;西藏;陕西;甘肃;青海;宁夏;新疆".Contains(string.Join("", v.Take(2)))); + attrValue = value; + } + } + else + { + attrValue = "中国大陆"; + } + } + else if (attr.name == "是否具有拍卖/收藏价值") + { + attrValue = "不具有"; + } + else if (attr.name == "是否批量生产(孤品)") + { + attrValue = "批量生产"; + } + //else if (attrValueLst.Any(v => v.Contains("%"))) + //{ + // attrValue = attrValueLst.FirstOrDefault(); + //} + else if (!(attr.type == "decimal4_unit" || attr.type == "integer_unit")) + attrValue = attrValueLst.Where(v => !"真丝、蚕丝、香云纱、羊绒、羊毛、羊羔绒、羊羔毛、羽绒、皮草".Contains(v)).OrderBy(x => Guid.NewGuid()).FirstOrDefault(); + + //书籍属性处理 + if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") + { + //if (attr.name == "ISBN版号/CN刊号") + // attrValue = "9787922575016"; + if (attr.name == "书名") + attrValue = prodTitle; + if (attr.name == "是否为单一书号丛书") + attrValue = "是"; + if (attr.name == "图书册数") + attrValue = "1 册"; + if (attr.name == "出版社名称") + attrValue = new List() { "技术出版社", "文化出版社", "美术出版社" }[Randomx.GetId(3)]; + if (attr.name == "作者") + { + attrValue = new List() { "赵老师", "钱老师", "孙老师", "李老师", "周老师", "吴老师", "郑老师", "王老师", "张老师", "孙老师", "刘老师" }.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); + attrValue = "无"; + } + if (attr.name == "包装") + attrValue = "平装"; + if (attr.name == "出版时间") + attrValue = DateTime.Now.AddMonths(0 - Randomx.GetId(3, 7)).ToString("yyyy-MM"); + } + if (upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料") + { + if (attr.name == "食品名称") + attrValue = prodTitle; + if (attr.name == "生产企业名称") + attrValue = "见包装"; + if (attr.name == "食品生产许可证编号") + { + attrValue = "SC10241162100670"; + attrValue = "见包装"; + } + if (attr.name == "产品标准号") + { + attrValue = "GB 2726"; + attrValue = "见包装"; + } + if (attr.name == "生产日期") + attrValue = DateTime.Now.Date.AddDays(-15).ToString("yyyy-MM-dd"); + if (attr.name == "净含量") + attrValue = "见包装"; + if (attr.name == "单件净含量") + { + attrValue = "见包装"; + } + if (attr.name == "包装方式") + attrValue = "袋装"; + if (attr.name == "配料表") + attrValue = "水"; + if (attr.name == "联系方式") + attrValue = "无"; + if (attr.name == "地址") + attrValue = "见包装"; + if (attr.name == "贮存条件") + attrValue = "常温"; + + //if (attr.name == "保质期") + //{ + // if (chkDefaultBestBefore.Checked == false) + // return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"食品属性不含保质期,跳过上传\"}"; + // if (txtDefaultBestBefore.Text.ParseToInt() < 15) + // return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"食品默认保质期设置小于15天,跳过上传\"}"; + // attrValue = txtDefaultBestBefore.Text.ParseToInt() + " 天"; + //} + } + + if (attr.name == "保质期") + { + if (chkDefaultBestBefore.Checked == false) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"属性不含保质期,跳过上传\"}"; + if (txtDefaultBestBefore.Text.ParseToInt() < 3) + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"默认保质期设置小于3天,跳过上传\"}"; + attrValue = txtDefaultBestBefore.Text.ParseToInt() + " 天"; + } + } + if (attrValue.IsNullOrEmpty() && attr.type == "string") + { + attrValue = "其他"; + } + if ((attrValue.IsNullOrEmpty() || attrValue == "见包装" || attrValue == "%") && (attr.type == "decimal4_unit" || attr.type == "integer_unit")) + { + // 走系统推荐 + var param = recommendParamRst.productInfo.param.FirstOrDefault(p => p.categorys?.FirstOrDefault()?.name == attr.name); + if (param != null && param.categorys.Count == 2) + { + attrValue = param.categorys[1].name; + if (attrValue.Contains("磅") && attrValue.Replace("磅", "").ParseToDecimal() > 0) + { + if ((";" + attr.value + ";").Contains(";g;")) + attrValue = (attrValue.Replace("磅", "").ParseToDecimal() * 454).ParseToInt() + "g"; + else if ((";" + attr.value + ";").Contains(";kg;")) + attrValue = (attrValue.Replace("磅", "").ParseToDecimal() * 0.454m).ParseToDecimal() + "kg"; + } + } + else if (attr.value == "%") + attrValue = "1 %"; + else if (attr.value == "g;kg") + attrValue = "50 g"; + else if (attr.value == "g") + attrValue = "10 g"; + else if (attr.value == "kg") + attrValue = "1 kg"; + else if (attr.value == "g;kg;ml;L") + attrValue = "100 g"; + else if (attr.value == "cm") + attrValue = "20 cm"; + else if (attr.value == "mm") + attrValue = "20 mm"; + else if (attr.value == "毫米(mm);厘米(cm);米(m)") + attrValue = "20 毫米(mm)"; + else if (attr.value.Contains("岁以上") && attr.value.Contains("个月以上")) + attrValue = "7 岁以上"; + else if (attr.value == "只;个") + attrValue = "1 个"; + else if (attr.value == "个") + attrValue = "1 个"; + else if (attr.value == "ml") + attrValue = "100 ml"; + else if (attr.value == "L") + attrValue = "1 L"; + else if (attr.value == "日;月;年") + attrValue = "30 日"; + } + + var wxPropParam = new wxPropParam(); + upProdParam.product.info.param.Add(wxPropParam); + var wxCategoryParam1 = new categoryPropParam() + { + catType = 7, + name = attr.name, + catInfo = new catInfoParam() { inputType = attr.normalRelease.ruleType, isRequired = attr.isRequired == true ? 1 : 0, isCustomize = 0 } + }; + var wxCategoryParam2 = new categoryPropParam() + { + catType = 7, + name = attrValue, + catInfo = new catInfoParam() { inputType = attr.normalRelease.ruleType, isRequired = attr.isRequired == true ? 1 : 0, isCustomize = 0 } + }; + wxPropParam.categorys.Add(wxCategoryParam1); + wxPropParam.categorys.Add(wxCategoryParam2); + } + if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") + { + foreach (var param in upProdParam.product.info.param.ToList()) + { + if (param.categorys.FirstOrDefault()?.name == "作者" && param.categorys.LastOrDefault()?.name == "无") + { + param.categorys.LastOrDefault().name = upProdParam.product.info.param.FirstOrDefault(p => p.categorys.FirstOrDefault()?.name == "出版社名称")?.categorys?.LastOrDefault()?.name; + if (param.categorys.LastOrDefault().name.IsNullOrEmpty()) + param.categorys.LastOrDefault().name = "无"; + break; + } + } + } + #endregion + + #region sku规格属性 + + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成sku"; + })); + } + Thread.Sleep(Randomx.GetId(100, 300)); + + upProdParam.product.info.productSaleAttrs = new List(); + if (prodInfo.detail.sku == null) + prodInfo.detail.sku = new List(); + if (prodInfo.detail.sku.Count == 0) + prodInfo.detail.sku.Add(new sku_item() { spec = new List() }); + if (prodInfo.detail.sku.FirstOrDefault().spec == null) + prodInfo.detail.sku.FirstOrDefault().spec = new List(); + if (prodInfo.detail.sku.FirstOrDefault().spec.Count == 0) + prodInfo.detail.sku.FirstOrDefault().spec.Add(new spec_item() { parent_name = "规格", spec_name = "默认" }); + if (prodInfo.detail.sku.FirstOrDefault().thumb_url.IsNullOrEmpty()) + prodInfo.detail.sku.FirstOrDefault().thumb_url = prodInfo.detail.galleries.FirstOrDefault(g => g.type == 1)?.url; + + // 处理系统指定的规格名称 + //if ((upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料") && + // (selectProd.cat_name == "坚果炒货" || selectProd.cat_name == "果干")) + //{ + // if (!prodInfo.detail.sku.FirstOrDefault().spec.Any(s => s.parent_name == "规格/净含量")) + // { + // foreach (var sku in prodInfo.detail.sku) + // { + // sku.spec.FirstOrDefault().parent_name = "规格/净含量"; + // } + // } + //} + ////else if ((upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料")) + ////{ + //// if (!prodInfo.detail.sku.FirstOrDefault().spec.Any(s => s.parent_name == "规格")) + //// { + //// foreach (var sku in prodInfo.detail.sku) + //// { + //// sku.spec.FirstOrDefault().parent_name = "规格"; + //// } + //// } + ////} + // 坚果炒货类,系统返回的试规格/净含量但是要求填规格 + if ((upProdParam.product.info?.category?.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail?.cats?.FirstOrDefault() == "食品饮料") && + (upProdParam.product.info?.category?.LastOrDefault()?.name == "坚果炒货" || upProdParam.product.info?.category?.LastOrDefault()?.name == "果干")) + { + if (!prodInfo.detail.sku.FirstOrDefault().spec.Any(s => s.parent_name == "规格")) + { + foreach (var sku in prodInfo.detail.sku) + { + sku.spec.FirstOrDefault().parent_name = "规格"; + } + } + } + else + { + var leafCat = upProdParam.product.info.category.LastOrDefault(); + if (leafCat?.catInfo?.saleAttr?.attr != null) + { + foreach (var att in leafCat.catInfo.saleAttr.attr) + { + //decimal4_unit //g;kg;斤 + if (att.isRequired == true) + { + // 规格属性名放在第二个规格上 + if (att.normalRelease.ruleType == 2 && prodInfo.detail.sku.FirstOrDefault()?.spec.Count == 2) + { + foreach (var sku in prodInfo.detail.sku) + { + // 如果有指定规格属性名称就不再设置 + if (!sku.spec.Any(sp => sp.parent_name == att.name)) + { + sku.spec[1].parent_name = att.name; + } + // 如果不在指定位置上,交换位置 + else if (sku.spec[0].parent_name == att.name) + { + var specTmp = sku.spec[0]; + sku.spec[0] = sku.spec[1]; + sku.spec[1] = specTmp; + } + if (att.type == "decimal4_unit") + { + if (att.value == "g;kg;斤") + { + var specName = ""; + foreach (var unit in att.value.Split(';').Reverse().ToList()) + { + Match specMatch = Regex.Match(sku.spec[1].spec_name.Replace(" ", "").Replace("-", "负号"), @"\d+(.\d+)?" + unit); + //Match specMatch = Regex.Match(sku.spec[1].spec_name.Replace(" ", ""), @"((0{1}.\d{1,4})|([1-9]\d{1}.\d{1,4})|([1-9]+\d)|0)" + unit); + if (specMatch.Success) + { + specName = specMatch.Value.Replace(unit, "")/*.ParseToDecimal().ParseToInt()*/ + " " + unit; + break; + } + } + if (string.IsNullOrEmpty(specName)) + specName = Randomx.GetId(10, 500) + " g"; + sku.spec[1].spec_name = specName; + } + } + } + } + // 规格属性名放在第一个规格上 + else + { + foreach (var sku in prodInfo.detail.sku) + { + // 如果有指定规格属性名称就不再设置 + if (!sku.spec.Any(sp => sp.parent_name == att.name)) + { + sku.spec[0].parent_name = att.name; + } + // 如果不在指定位置上,交换位置 + else if (sku.spec.Count > 1 && sku.spec[1].parent_name == att.name) + { + var specTmp = sku.spec[0]; + sku.spec[0] = sku.spec[1]; + sku.spec[1] = specTmp; + } + if (att.type == "decimal4_unit") + { + if (att.value == "g;kg;斤") + { + var specName = ""; + foreach (var unit in att.value.Split(';').Reverse().ToList()) + { + Match specMatch = Regex.Match(sku.spec[0].spec_name.Replace(" ", "").Replace("-", "负号"), @"\d+(.\d+)?" + unit); + //Match specMatch = Regex.Match(sku.spec[0].spec_name.Replace(" ", ""), @"((0{1}.\d{1,4})|([1-9]\d{1}.\d{1,4})|([1-9]+\d)|0)" + unit); + if (specMatch.Success) + { + specName = specMatch.Value.Replace(unit, "")/*.ParseToDecimal().ParseToInt()*/ + " " + unit; + break; + } + } + if (string.IsNullOrEmpty(specName)) + specName = Randomx.GetId(10, 500) + " g"; + sku.spec[0].spec_name = specName; + } + } + } + } + } + } + } + } + + if (prodInfo.detail.sku.FirstOrDefault()?.spec?.Count > 0) + { + productSaleAttrParam attrParam = new productSaleAttrParam() + { + key = prodInfo.detail.sku.FirstOrDefault()?.spec[0].parent_name, + hasImg = true, + items = new List() + }; + upProdParam.product.info.productSaleAttrs.Add(attrParam); + foreach (var sku in prodInfo.detail.sku) + { + var spec = sku.spec[0]; + if (!attrParam.items.Any(it => it.value == spec.spec_name) && !string.IsNullOrEmpty(sku.thumb_url)) + { + if (dbProd.product_get_type_text == "微信店采") + { + attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = sku.thumb_url, }); + continue; + } + + // 获取缓存盗链 sku图 + if (wxImgMapDic.ContainsKey(BaseClass.GetMd5(sku.thumb_url))) + { + attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = wxImgMapDic[BaseClass.GetMd5(sku.thumb_url)], }); + continue; + } + // 使用接口链接传sku图 + if (1 == 1 && !sku.thumb_url.Contains("wst.wxapp.tc.qq.com")) + { + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + upDate += "&post_data=" + GetHtml.UrlEncodeUtf8("{\"img_url\":\"" + sku.thumb_url.Replace("https://", "http://") + "\"}"); + + var sTime = DateTime.Now; + var upDateRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成sku " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 20 && upDateRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + upDateRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref upDateRst, "img_url"); + if (upDateRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) + { + attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = upImgUrl, }); + wxImgMapDic[BaseClass.GetMd5(sku.thumb_url)] = upImgUrl; + isChangeImgDic = true; + continue; // 传图成功跳过模拟上传 + } + else + { + } + } + + // api上传图片文件 sku图 + if (1 == 1) + { + try + { + string errMsg = ""; + var imgBase64 = GetImgBase64ForApi(out errMsg, sku.thumb_url, false, false); + if (!string.IsNullOrEmpty(errMsg)) + { + return errMsg; + } + + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + //upDate += "&is_file=true"; + //if (needAddRandomBlock || wantAddRandomBlock) + // upDate += "&random_code=true"; + upDate += "&img_url=" + sku.thumb_url; + upDate += "&img_base64=" + imgBase64; + + var sTime = DateTime.Now; + var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在上传商品sku图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); + if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) + { + attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = upImgUrl, }); + wxImgMapDic[BaseClass.GetMd5(sku.thumb_url)] = upImgUrl; + isChangeImgDic = true; + continue; + } + else + { + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改详情图失败 " + ex.Message + "\"}"; + } + } + + // 上传sku图 + var locationStr = UploadImg(shop, sku.thumb_url, cell); + if (!locationStr.Contains("\"success\":true")) + return locationStr; + var location = BaseRegex.GetStringJson(ref locationStr, "Location"); + attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name, imgUrl = location, }); + Thread.Sleep(Randomx.GetId(10, 50)); + + //wxImgMapDic[BaseClass.GetMd5(sku.thumb_url)] = location; + //isChangeImgDic = true; + } + } + } + if (prodInfo.detail.sku.FirstOrDefault()?.spec?.Count > 1) + { + productSaleAttrParam attrParam = new productSaleAttrParam() + { + key = prodInfo.detail.sku.FirstOrDefault()?.spec[1].parent_name, + hasImg = false, + items = new List() + }; + upProdParam.product.info.productSaleAttrs.Add(attrParam); + foreach (var sku in prodInfo.detail.sku) + { + var spec = sku.spec[1]; + if (!attrParam.items.Any(it => it.value == spec.spec_name)) + attrParam.items.Add(new productSaleAttrItemParam() { value = spec.spec_name }); + } + } + #endregion + + #region 保存缓存盗链图片 + if (isChangeImgDic) + { + var url = BaseClass.BuildObjString("product/mdy_pdd_product"); + var data = ""; + Invoke(new Action(() => + { + data = UserLogin.GetSignaturex(); + data += "&spu_id=" + dbProd.spu_id; + data += "&wx_img_map_json=" + JsonHelper.SerializeObject(wxImgMapDic); + })); + var 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")) + html = GetHtml.PostUtf8(url, data); + isChangeImgDic = false; + } + #endregion + + #region sku信息 + upProdParam.product.productSkus = new List(); + int skuIndex = 0; + int id = 3; + long catId = 200000000003; + long fCatId = 200000000003; + long valueCatId = (17 + Randomx.GetNumber(11)).ParseToLong(); + Dictionary dicSpecParentNameId = new Dictionary(); + Dictionary dicSpecParentNameCatId = new Dictionary(); + Dictionary dicSpecNamefCatId = new Dictionary(); + Dictionary dicSpecNameCatId = new Dictionary(); + foreach (var skuInfo in prodInfo.detail.sku) + { + foreach (var spec in skuInfo.spec) + { + if (!dicSpecParentNameId.Keys.Contains(spec.parent_name)) + { + dicSpecParentNameId[spec.parent_name] = id++; + dicSpecParentNameCatId[spec.parent_name] = catId++; + } + if (!dicSpecNamefCatId.Keys.Contains(spec.spec_name)) + { + dicSpecNamefCatId[spec.spec_name] = fCatId++; + dicSpecNameCatId[spec.spec_name] = valueCatId++; + } + } + } + if (dbProd.product_get_type_text == "厂商直采" && !prodInfo.detail.sku.Any(s => s.quantity.ParseToInt() > 0)) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"源商品库存为0\"}"; + } + foreach (var skuInfo in prodInfo.detail.sku) + { + productSkuParam skuParam = new productSkuParam(); + upProdParam.product.productSkus.Add(skuParam); + for (int i = skuInfo.spec.Count - 1; i >= 0; i--) + { + var specInfo = skuInfo.spec[i]; + skuParam.__skuKey = specInfo.parent_name + "." + specInfo.spec_name + "_"; + skuParam.__skuKey += specInfo.spec_name; + } + skuParam.__skuKey.TrimEnd('_'); + skuParam.index = skuIndex++; + skuParam.productSkuInfo = new productSkuInfoParam(); + // 加价 + skuParam.productSkuInfo.salePrice = (skuInfo.multi_price * defaultAddPriceRule.AddPriceTimes + defaultAddPriceRule.AddMorePrice * 100).ParseToInt(); + if (defaultAddPriceRule.AddMorePriceFirst) + skuParam.productSkuInfo.salePrice = ((skuInfo.multi_price + defaultAddPriceRule.AddMorePrice * 100) * defaultAddPriceRule.AddPriceTimes).ParseToInt(); + // 阶梯式加价,如果命中则按阶梯式加价进行 + if (defaultAddPriceRule.IsStepAddPrice) + { + foreach (var addPrice in lstAddPriceRule) + { + if (skuInfo.multi_price > addPrice.MoreThanPrice * 100 && skuInfo.multi_price <= addPrice.LessThanPrice * 100) + { + if (defaultAddPriceRule.AddMorePriceFirst) // 先加后乘 + skuParam.productSkuInfo.salePrice = ((skuInfo.multi_price + addPrice.AddMorePrice * 100) * addPrice.AddPriceTimes).ParseToInt(); + else + skuParam.productSkuInfo.salePrice = (skuInfo.multi_price * addPrice.AddPriceTimes + addPrice.AddMorePrice * 100).ParseToInt(); + break; + } + } + } + // 聚水潭上微信小店,加运费(其他平台shipPrice默认为0) + skuParam.productSkuInfo.salePrice += (shipPrice * defaultAddPriceRule.ShippingPriceTimes).ParseToInt(); + // 商品裂变随机增加价格 + if (selectProd.is_fission_title && chkFissionRandomPriceChange.Checked) + { + Invoke(new Action(() => + { + var fissionRandomPrice = Randomx.GetId((txtFissionRandomPriceChange.Text.ParseToDecimal() * 100).ParseToInt() + 1); + skuParam.productSkuInfo.salePrice += fissionRandomPrice; + })); + } + // sku图 + skuParam.productSkuInfo.thumbImg = upProdParam.product.info.productSaleAttrs[0].items.FirstOrDefault(a => a.value == skuInfo.spec[0].spec_name)?.imgUrl; + if (dbProd.special_prod_type == "爆款数据") + { + if (!skuInfo.out_sku_sn.StartsWith("BS")) // Best-seller 爆款 + skuInfo.out_sku_sn = "BS" + skuInfo.out_sku_sn; + } + 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 }; + // 厂商直采上家库存为0则按0上架 + if (dbProd.product_get_type_text == "厂商直采" && skuInfo.quantity.IsNullOrZero()) + skuParam.productSkuInfo.stockInfo.stockNum = 0; + skuParam.productSkuInfo.saleParam = new List(); + foreach (var specInfo in skuInfo.spec) + { + saleParamParam saleParam = new saleParamParam(); + skuParam.productSkuInfo.saleParam.Add(saleParam); + saleParam.categorys = new List(); + + // specKey + categoryKeyParam skuCateKeyParam = new categoryKeyParam(); + saleParam.categorys.Add(skuCateKeyParam); + skuCateKeyParam.isCustomize = true; + skuCateKeyParam.isMainSale = true; + skuCateKeyParam.name = specInfo.parent_name; + skuCateKeyParam.id = dicSpecParentNameId[specInfo.parent_name].ParseToInt(); // 3; + skuCateKeyParam.catId = dicSpecParentNameCatId[specInfo.parent_name]; + skuCateKeyParam.label = "自定义规格"; + skuCateKeyParam.catInfo = new skuCatInfoParam() { isCustomize = 1 }; + skuCateKeyParam.catType = 8; + + // specValue + categoryValueParam skuCateValueParam = new categoryValueParam(); + saleParam.categorys.Add(skuCateValueParam); + skuCateValueParam.fCatId = dicSpecNamefCatId[specInfo.spec_name]; + skuCateValueParam.catId = dicSpecNameCatId[specInfo.spec_name]; + skuCateValueParam.name = specInfo.spec_name; + skuCateValueParam.skuNameValue = specInfo.spec_name; + skuCateValueParam.desc = ""; + skuCateValueParam.catInfo = new categoryValueCatInfo() { editByUser = 1 }; + skuCateValueParam.thumbImg = ""; + var specIndex = skuInfo.spec.IndexOf(specInfo); + skuCateValueParam.priority = prodInfo.detail.sku.Select(s => s.spec[specIndex].spec_name).Distinct().ToList().IndexOf(specInfo.spec_name); + skuCateValueParam.selected = false; + } + skuParam.productSkuInfo.skuDeliverInfo = new skuDeliverInfoParam(); + skuParam.productSkuInfo.stockDiff = new stockDiffParam() { diffType = 1, num = defaultAddPriceRule.StockNum }; + // 厂商直采上家库存为0则按0上架 + if (dbProd.product_get_type_text == "厂商直采" && skuInfo.quantity.IsNullOrZero()) + skuParam.productSkuInfo.stockDiff.num = 0; + skuParam.status = 5; + } + #endregion + + #region 预售信息 + if (chkPreSale.Checked) + { + upProdParam.product.deliverInfo = new productDeliverInfoParam(); + upProdParam.product.deliverInfo.deliverType = 1; + int preSaleDays = Math.Max(3, wxUploadRule.PreSaleDays); + preSaleDays = Math.Min(45, preSaleDays); + upProdParam.product.deliverInfo.skuDeliverInfo = new skuDeliverInfoParam() + { + stockType = 1, + fullPaymentPresaleDeliveryTime = preSaleDays.ParseToString() + }; + } + #endregion + + #region 佣金信息,需要权限 + if (BaseClass.UserAuthority.Contains("佣金上货") && chkCommission.Checked) + { + upProdParam.product.info.leagueItemInfo = new leagueItemInfoParam(); + upProdParam.product.info.leagueItemInfo.itemSwitch = 1; + upProdParam.product.info.leagueItemInfo.itemRatio = commissionRate; + upProdParam.product.info.leagueItemInfo.headSupplierPublicItemSwitch = 1; + upProdParam.product.info.leagueItemInfo.headSupplierPublicItemServiceRatio = commissionRate; + } + #endregion + + #region 资质信息 + // 微信回采直接复制 + if (BaseClass.UserAuthority.ParseToString().Contains("微信回采") && chkUseWXComplateProd.Checked && dbProd.has_wx_format == "1" && wxEditProdInfo != null) + { + upProdParam.product.info.qualificationList.Clear(); + if (wxEditProdInfo.product?.info?.qualificationList?.Count > 0) + { + foreach (var editQualification in wxEditProdInfo.product.info.qualificationList) + { + upProdParam.product.info.qualificationList.Add(new qualificationParam() + { + qualificationId = editQualification.qualificationId, + qualificationUrl = editQualification.qualificationUrl, + }); + } + } + + if (upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") + { + if (wxEditProdInfo.product.info.brandId.ParseToLong() > 0) + DefaultAdultBrandId = wxEditProdInfo.product.info.brandId; + if (wxEditProdInfo.product.info.brandId.ParseToLong() > 0) + upProdParam.product.info.brandId = wxEditProdInfo.product.info.brandId.ParseToLong(); + } + } + // 微信店采直接复制 + //else if (dbProd.product_get_type_text == "微信店采" && upProdParam.product.info.category.FirstOrDefault()?.name != "图书" && + // upProdParam.product.info.category.FirstOrDefault()?.name != "食品饮料") + else if (dbProd.product_get_type_text == "微信店采" && + upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") + { + upProdParam.product.info.qualificationList.Clear(); + if (wxEditProdInfo.product?.info?.qualificationList?.Count > 0) + { + foreach (var editQualification in wxEditProdInfo.product.info.qualificationList) + { + upProdParam.product.info.qualificationList.Add(new qualificationParam() + { + qualificationId = editQualification.qualificationId, + qualificationUrl = editQualification.qualificationUrl, + }); + } + } + + if (upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") + { + if (wxEditProdInfo.product.info.brandId.ParseToLong() > 0) + DefaultAdultBrandId = wxEditProdInfo.product.info.brandId; + if (wxEditProdInfo.product.info.brandId.ParseToLong() > 0) + upProdParam.product.info.brandId = wxEditProdInfo.product.info.brandId.ParseToLong(); + } + } + else + { + #region 标签图 书籍类生成书籍图片 + //qualificationList + if (upProdParam.product.info.category.FirstOrDefault()?.name == "图书" || prodInfo.detail.cats.FirstOrDefault() == "书籍/杂志/报纸") + { + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成图书专有信息"; + })); + } + + if (lstQulificationImage.Count == 0) + { + var pageCount = 1; + var seconds = 0m; + lstQulificationImage = AdminForms.WXAdminQualificationImageForm.AdminGetServerQualificationImageLst(out pageCount, out seconds, "图书"); + } + var qulificationImage = lstQulificationImage.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); + if (qulificationImage != null) + { + if (qulificationImage.img_base64.IsNullOrEmpty()) + { + var pageCount = 1; + var seconds = 0m; + qulificationImage.img_base64 = AdminForms.WXAdminQualificationImageForm.AdminGetServerQualificationImageLst(out pageCount, out seconds, "图书", qulificationImage.img_md5) + .FirstOrDefault()?.img_base64; + } + } + + //string publisher = "出版社名称:" + new List() { "技术出版社", "文化出版社", "美术出版社" }[Randomx.GetId(3)]; + ////string isbn = "ISBN:"; + //string isbn = "ISBN/CN刊号:"; + ////string bookName = "书名:"; + //string bookName = "图书名称:"; + //string bookPrice = "定价:" + upProdParam.product.productSkus.Max(s => s.productSkuInfo.salePrice) * 0.01; + //string author = "作者:王老师"; + //string publishTime = "出版时间:" + DateTime.Now.AddMonths(-3).ToString("yyyy年MM月dd日"); + //string edition = "版次:1"; + //string binding = "装帧:平装"; + + //foreach (var propParam in upProdParam.product.info.param) + //{ + // if (propParam.categorys[0].name.Contains("出版社名称")) + // publisher = "出版社名称:" + propParam.categorys[1].name; + // else if (propParam.categorys[0].name.Contains("ISBN版号/CN刊号")) + // { + // //isbn = "ISBN:" + propParam.categorys[1].name; + // isbn = "ISBN/CN刊号:" + propParam.categorys[1].name; + // if (propParam.categorys[1].name.Length == 13) + // { + // var isbnStr = propParam.categorys[1].name; + // isbn = "ISBN/CN刊号:" + isbnStr[0] + isbnStr[1] + isbnStr[2] + "-" + isbnStr[3] + "-" + isbnStr[4] + isbnStr[5] + isbnStr[6] + isbnStr[7] + "-" + isbnStr[8] + isbnStr[9] + isbnStr[10] + isbnStr[11] + "-" + isbnStr[12]; + // } + // } + // else if (propParam.categorys[0].name.Contains("书名")) + // { + // //bookName = "书名:" + propParam.categorys[1].name; + // bookName = "图书名称:" + propParam.categorys[1].name; + // } + // else if (propParam.categorys[0].name.Contains("定价")) + // { + // //bookPrice = "定价:" + propParam.categorys[1].name; + // propParam.categorys[1].name = bookPrice; + // } + // else if (propParam.categorys[0].name.Contains("作者")) + // author = "作者:" + propParam.categorys[1].name; + // else if (propParam.categorys[0].name.Contains("出版时间")) + // publishTime = "出版时间:" + propParam.categorys[1].name; + // else if (propParam.categorys[0].name.Contains("版次")) + // edition = "版次:" + propParam.categorys[1].name; + // else if (propParam.categorys[0].name.Contains("包装")) + // binding = "装帧:" + propParam.categorys[1].name; + //} + + //var bookStr = publisher + "\r\n" + "\r\n" + + // isbn + "\r\n" + "\r\n" + + // bookName + "\r\n" + "\r\n" + + // bookPrice + "\r\n" + "\r\n" + + // author + "\r\n" + "\r\n" + + // publishTime + "\r\n" + "\r\n" + + // edition + "\r\n" + "\r\n" + + // binding; + + //int imgW = 800; int imgH = 800; int textImgH = 0; + //string getImgError; + //var img_url = upProdParam.product.info.headImg[0]; + //if (!img_url.Contains("wst.wxapp.tc.qq.com") && !img_url.Contains("mmecimage.cn")) + // img_url = img_url.Replace("https://", "http://"); + //var imageMain = GetHtml.GetUrlImg(img_url, out getImgError); + //if (imageMain == null) + // imageMain = new Bitmap(800, 800); + //using (Bitmap bitmap = new Bitmap(1, 1)) // 尺寸不重要,只是为了使用Graphics对象 + //using (Graphics g = Graphics.FromImage(bitmap)) // 获取Graphics对象 + //{ + // // 定义字体 + // Font font = new Font("微软雅黑", 16, FontStyle.Regular); + // g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + // // 定义要测量的字符串 + // string text = bookStr; + // // 测量字符串大小 + // SizeF size = g.MeasureString(text, font, imgW - 120); + // // 输出高度信息 + // //Console.WriteLine("Text Height: " + size.Height); + // textImgH = size.Height.ParseToInt() + 180; + //} + + ////var bookImg = new Bitmap(imgW, imgH); + ////using (Graphics g = Graphics.FromImage(bookImg)) + ////{ + //// g.Clear(Color.White); + //// //Font font = new Font("宋体", 15, FontStyle.Bold); + //// //Font font = new Font("微软雅黑", 15, FontStyle.Regular); + //// Font font = new Font("微软雅黑", 16, FontStyle.Regular); + //// //Font font = new Font("宋体", 17, FontStyle.Bold); + //// Brush textBrush = Brushes.Black; + //// g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + //// RectangleF rectF = new RectangleF(60, 80, imgW - 120, imgH - 180); + //// g.DrawString(bookStr, font, textBrush, rectF); + ////} + + //// 绘制一张带主图的商品详情页 + //var bookImg = new Bitmap(imgW, imgH + textImgH); + //using (Graphics g = Graphics.FromImage(bookImg)) + //{ + // g.Clear(Color.FromArgb(248, 239, 244)); + + // g.DrawImage(imageMain, new Rectangle(0, 0, imgW, imgH), 0, 0, imageMain.Width, imageMain.Height, GraphicsUnit.Pixel); + + // //Font font = new Font("宋体", 15, FontStyle.Bold); + // //Font font = new Font("微软雅黑", 15, FontStyle.Regular); + // Font font = new Font("微软雅黑", 18, FontStyle.Regular); + // //Font font = new Font("宋体", 17, FontStyle.Bold); + // Brush textBrush = Brushes.Black; + // g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + // RectangleF rectF = new RectangleF(60, imgH + 80, imgW - 120, textImgH - 180); + // g.DrawString(bookStr, font, textBrush, rectF); + //} + + + string publisher = "出版发行:" + new List() { "技术出版社", "文化出版社", "美术出版社" }[Randomx.GetId(3)]; + //string isbn = "ISBN:"; + string isbn = "ISBN/CN刊号:"; + //string bookName = "书名:"; + string bookName = "图书名称:"; + string bookPrice = "定  价:" + upProdParam.product.productSkus.Max(s => s.productSkuInfo.salePrice) * 0.01; + string author = "作  者:王老师"; + string publishTime = "出版时间:" + DateTime.Now.AddMonths(-3).ToString("yyyy年MM月dd日"); + string edition = "版  次:1"; + string binding = "装  帧:平装"; + + foreach (var propParam in upProdParam.product.info.param) + { + if (propParam.categorys[0].name.Contains("出版社名称")) + publisher = "出版发行:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("ISBN版号/CN刊号")) + { + //isbn = "ISBN:" + propParam.categorys[1].name; + isbn = "ISBN/CN刊号:" + propParam.categorys[1].name; + if (propParam.categorys[1].name.Length == 13) + { + var isbnStr = propParam.categorys[1].name; + isbn = "ISBN/CN刊号:" + isbnStr[0] + isbnStr[1] + isbnStr[2] + "-" + isbnStr[3] + "-" + isbnStr[4] + isbnStr[5] + isbnStr[6] + isbnStr[7] + "-" + isbnStr[8] + isbnStr[9] + isbnStr[10] + isbnStr[11] + "-" + isbnStr[12]; + } + } + else if (propParam.categorys[0].name.Contains("书名")) + { + //bookName = "书名:" + propParam.categorys[1].name; + bookName = "图书名称:" + propParam.categorys[1].name; + } + else if (propParam.categorys[0].name.Contains("定价")) + { + //bookPrice = "定价:" + propParam.categorys[1].name; + propParam.categorys[1].name = bookPrice; + } + else if (propParam.categorys[0].name.Contains("作者")) + { + if (propParam.categorys[1].name != "/") + author = "作  者:" + propParam.categorys[1].name; + else + author = ""; + } + else if (propParam.categorys[0].name.Contains("出版时间")) + publishTime = "出版时间:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("版次")) + edition = "版  次:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("包装")) + binding = "装  帧:" + propParam.categorys[1].name; + } + if (author.IsNullOrEmpty()) + author = "作  者:" + publisher.Replace("出版发行:", ""); + + var bookStr = publisher + "\r\n" + "\r\n" + + isbn + "\r\n" + "\r\n" + + bookName + "\r\n" + "\r\n" + + bookPrice + "\r\n" + "\r\n" + + author + "\r\n" + "\r\n" + + publishTime + "\r\n" + "\r\n" + + edition + "\r\n" + "\r\n" + + binding; + + int imgW = 800; int imgH = 800; int textImgH = 0; + string getImgError; + var img_url = upProdParam.product.info.headImg[0]; + if (!img_url.Contains("wst.wxapp.tc.qq.com") && !img_url.Contains("mmecimage.cn")) + img_url = img_url.Replace("https://", "http://"); + var imageMain = GetHtml.GetUrlImg(img_url, out getImgError); + if (imageMain == null) + imageMain = new Bitmap(800, 800); + using (Bitmap bitmap = new Bitmap(1, 1)) // 尺寸不重要,只是为了使用Graphics对象 + using (Graphics g = Graphics.FromImage(bitmap)) // 获取Graphics对象 + { + // 定义字体 + Font font = new Font("微软雅黑", 16, FontStyle.Regular); + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + // 定义要测量的字符串 + string text = bookStr; + // 测量字符串大小 + SizeF size = g.MeasureString(text, font, imgW - 120); + // 输出高度信息 + //Console.WriteLine("Text Height: " + size.Height); + textImgH = size.Height.ParseToInt() + 180; + } + + + var bookImg = TemuKJD.Properties.Resources.empty_book_900_1200; + if (!string.IsNullOrEmpty(qulificationImage?.img_base64)) + { + // 使用服务端随即图 + try + { + bookImg = Base64ChangeImgUrl.Base64ToImage(qulificationImage.img_base64); + } + catch (Exception ex) + { + } + } + imgH = bookImg.Height; + imgW = bookImg.Width; + using (Graphics g = Graphics.FromImage(bookImg)) + { + Brush textBrush = Brushes.Black; + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + + float txtTop = 240, txtBottom = 240, txtLeft = 280, txtRight = 270; + if (qulificationImage.txt_margin.ParseToString().Split(',').Select(m => m.ParseToInt()).ToList() is List marginValueList && marginValueList.Count == 4) + { + txtLeft = marginValueList[0] + 10 - Randomx.GetId(21); + txtTop = marginValueList[1] + 10 - Randomx.GetId(21); + txtRight = marginValueList[2] + 10 - Randomx.GetId(21); + txtBottom = marginValueList[3] + 10 - Randomx.GetId(21); + } + int txtWidth = (int)imgW - (int)txtLeft - (int)txtRight; // 370; + + // 书名 + Font font = new Font("宋体", 22, FontStyle.Bold); + RectangleF rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop - 80); + g.DrawString(bookName.Replace("图书名称:", ""), font, textBrush, rectF); + // 测量文本的高度 决定接下来文字绘制位置 + var textSize = g.MeasureString(bookName.Replace("图书名称:", ""), font, txtWidth); + txtTop += 20 + textSize.Height; + + font = new Font("宋体", 15, FontStyle.Bold); + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop - 80); + g.DrawString(author.Replace("作  者:", "").TrimEnd('著', ' ') + " 著", font, textBrush, rectF); + // 测量文本的高度 + textSize = g.MeasureString(author.Replace("作  者:", "").TrimEnd('著', ' ') + " 著", font, txtWidth); + txtTop += 20 + textSize.Height; + + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop - 80); + g.DrawString(publisher.Replace("出版发行:", ""), font, textBrush, rectF); + // 测量文本的高度 + textSize = g.MeasureString(publisher.Replace("出版发行:", ""), font, txtWidth); + txtTop += 20 + textSize.Height; + + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop - 80); + g.DrawString(isbn.Replace("ISBN/CN刊号:", "ISBN "), font, textBrush, rectF); + // 测量文本的高度 + textSize = g.MeasureString(isbn.Replace("ISBN/CN刊号:", "ISBN "), font, txtWidth); + txtTop += 20 + textSize.Height; + + // 以下从下往上写 + txtTop = imgH - txtBottom; + // 测量文本的高度 + textSize = g.MeasureString(binding, font, txtWidth); + txtTop -= (10 + textSize.Height); + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); + g.DrawString(binding, font, textBrush, rectF); + + // 测量文本的高度 + textSize = g.MeasureString(edition, font, txtWidth); + txtTop -= (10 + textSize.Height); + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); + g.DrawString(edition, font, textBrush, rectF); + + // 测量文本的高度 + textSize = g.MeasureString(publishTime, font, txtWidth); + txtTop -= (10 + textSize.Height); + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); + g.DrawString(publishTime, font, textBrush, rectF); + + // 测量文本的高度 + textSize = g.MeasureString(author, font, txtWidth); + txtTop -= (10 + textSize.Height); + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); + g.DrawString(author, font, textBrush, rectF); + + // 测量文本的高度 + textSize = g.MeasureString(bookPrice + "元", font, txtWidth); + txtTop -= (10 + textSize.Height); + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); + g.DrawString(bookPrice + "元", font, textBrush, rectF); + + // 测量文本的高度 + textSize = g.MeasureString(bookName, font, txtWidth); + txtTop -= (10 + textSize.Height); + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); + g.DrawString(bookName, font, textBrush, rectF); + + // 测量文本的高度 + textSize = g.MeasureString(isbn.Replace("ISBN/CN刊号:", "书  号:ISBN "), font, txtWidth); + textSize = g.MeasureString(isbn.Replace("ISBN/CN刊号:", "书  号:"), font, txtWidth); + txtTop -= (10 + textSize.Height); + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); + g.DrawString(isbn.Replace("ISBN/CN刊号:", "书  号: "), font, textBrush, rectF); + + // 测量文本的高度 + textSize = g.MeasureString(publisher, font, txtWidth); + txtTop -= (10 + textSize.Height); + rectF = new RectangleF(txtLeft, txtTop, txtWidth, imgH - txtTop); + g.DrawString(publisher, font, textBrush, rectF); + + } + + + Thread.Sleep(Randomx.GetId(500, 800)); + var locationStr = UploadImg(shop, bookImg, cell); + if (!locationStr.Contains("\"success\":true")) + return locationStr; + var location = BaseRegex.GetStringJson(ref locationStr, "Location"); + upProdParam.product.info.qualificationList.Add(new qualificationParam() { qualificationId = "1111485", qualificationUrl = new List() { location }, }); + + #region 将资质图作为主图的最后一张。 + using (MemoryStream memoryStream = new MemoryStream()) + { + bookImg.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); + byte[] imageBytes = memoryStream.ToArray(); + var imgBase64 = Convert.ToBase64String(imageBytes); + + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + //upDate += "&is_file=true"; + //if (needAddRandomBlock || wantAddRandomBlock) + // upDate += "&random_code=true"; + upDate += "&img_url=" + location; + upDate += "&img_base64=" + imgBase64; + + var sTime = DateTime.Now; + var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在上传资质图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); + upProdParam.product.info.headImg = upProdParam.product.info.headImg.Take(8).ToList(); + upProdParam.product.info.headImg.Add(upImgUrl); + } + #endregion + } + #endregion + + #region 标签图 食品类生成食品图片 + //qualificationList + if (upProdParam.product.info.category.FirstOrDefault()?.name == "食品饮料" || prodInfo.detail.cats.FirstOrDefault() == "食品饮料") + { + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成食品饮料专有信息"; + })); + } + + + string foodName = "食品名称:" + prodTitle; + string companyName = "生产商名称:中国地区食品厂"; + string SCID = "食品生产许可证编号:SC10241162100670"; + string GBID = "产品标准号:GB 2726"; + string ExpDate = "保质期:30天"; + string MakeDate = "生产日期:" + DateTime.Now.AddDays(-15).ToString("yyyy-MM-dd"); + string NetContent = "净含量:见包装"; + string Pack = "包装方式:袋装"; + string inList = "配料表:水"; + string contact = "联系方式:无"; + string address = "地址:见包装"; + string Storage = "贮存条件:常温"; + + foreach (var propParam in upProdParam.product.info.param) + { + if (propParam.categorys[0].name.Contains("食品名称") && !propParam.categorys[1].name.Contains("见包装") && !propParam.categorys[1].name.Contains("见外包装")) + foodName = "食品名称:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("生产企业名称") && !propParam.categorys[1].name.Contains("见包装") && !propParam.categorys[1].name.Contains("见外包装")) + companyName = "生产商名称:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("食品生产许可证编号") && !propParam.categorys[1].name.Contains("见包装") && !propParam.categorys[1].name.Contains("见外包装")) + SCID = "食品生产许可证编号:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("产品标准号") && !propParam.categorys[1].name.Contains("见包装") && !propParam.categorys[1].name.Contains("见外包装")) + GBID = "产品标准号:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("保质期")) + ExpDate = "保质期:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("生产日期")) + MakeDate = "生产日期:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("净含量")) + NetContent = "净含量:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("包装方式")) + Pack = "包装方式:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("配料表")) + inList = "配料表:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("联系方式")) + contact = "联系方式:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("地址")) + address = "地址:" + propParam.categorys[1].name; + else if (propParam.categorys[0].name.Contains("贮存条件")) + Storage = "贮存条件:" + propParam.categorys[1].name; + } + + var bookStr = foodName + "\r\n" + "\r\n"; + bookStr += companyName + "\r\n" + "\r\n"; + bookStr += SCID + "\r\n" + "\r\n"; + bookStr += GBID + "\r\n" + "\r\n"; + bookStr += ExpDate + "\r\n" + "\r\n"; + bookStr += MakeDate + "\r\n" + "\r\n"; + bookStr += NetContent + "\r\n" + "\r\n"; + bookStr += Pack + "\r\n" + "\r\n"; + bookStr += inList + "\r\n" + "\r\n"; + bookStr += contact + "\r\n" + "\r\n"; + bookStr += address + "\r\n" + "\r\n"; + bookStr += Storage + "\r\n" + "\r\n"; + + int width = 800; + int height = 1000; + var bookImg = new Bitmap(width, height); + using (Graphics g = Graphics.FromImage(bookImg)) + { + g.Clear(Color.Gray); + + Brush borderBrush = Brushes.Gray; + Brush contentBrush = Brushes.White; + g.FillRectangle(contentBrush, new RectangleF(8, 8, width - 16, height - 16)); + g.FillRectangle(borderBrush, new RectangleF(18, 18, width - 36, height - 36)); + g.FillRectangle(contentBrush, new RectangleF(22, 22, width - 44, height - 44)); + g.FillRectangle(borderBrush, new RectangleF(40, 140, width - 80, 4)); + + SizeF textSize; + { + Font font = new Font("微软雅黑", 30, FontStyle.Regular); + Brush textBrush = Brushes.DarkRed; + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + // 测量文本的宽度 + textSize = g.MeasureString("商 品 标 签", font); + float x = (width - textSize.Width) / 2; + + RectangleF rectF = new RectangleF(x, 50, width - x, height - 200); + g.DrawString("商 品 标 签", font, textBrush, rectF); + } + + { + //Font font = new Font("宋体", 15, FontStyle.Bold); + Font font = new Font("微软雅黑", 15, FontStyle.Regular); + Brush textBrush = Brushes.Black; + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + RectangleF rectF = new RectangleF(80, 120 + textSize.Height, width - 160, height - 80 - 120 - textSize.Height); + g.DrawString(bookStr, font, textBrush, rectF); + } + } + + Thread.Sleep(Randomx.GetId(500, 800)); + var locationStr = UploadImg(shop, bookImg, cell); + if (!locationStr.Contains("\"success\":true")) + return locationStr; + var location = BaseRegex.GetStringJson(ref locationStr, "Location"); + upProdParam.product.info.qualificationList.Add(new qualificationParam() { qualificationId = "50000057", qualificationUrl = new List() { location }, }); + } + #endregion + + #region 标签图 成人用品 + //qualificationList + if (upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") + { + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成成人用品专有信息"; + })); + } + + string prodName = "产品名称:" + + (upProdParam.product.info.category.Count > 2 ? upProdParam.product.info.category[2].name : upProdParam.product.info.category.LastOrDefault()?.name); + string company = "生产企业:浙江邦臣医药有限公司"; + string address = "制造商地址:浙江省金华市婺城区神丽路1399号6号厂房"; + string model = "产品型号:见包装"; + string material = "材质:其他"; + string user = "适用人群:18岁以上成年人"; + + foreach (var propParam in upProdParam.product.info.param) + { + //if (propParam.categorys[0].name.Contains("产品名称")) + // prodName = "产品名称:" + propParam.categorys[1].name; + } + + var bookStr = prodName + "\r\n" + "\r\n" + + company + "\r\n" + "\r\n" + + address + "\r\n" + "\r\n" + + model + "\r\n" + "\r\n" + + material + "\r\n" + "\r\n" + + user; + + var bookImg = new Bitmap(800, 800); + using (Graphics g = Graphics.FromImage(bookImg)) + { + g.Clear(Color.White); + //Font font = new Font("宋体", 15, FontStyle.Bold); + Font font = new Font("微软雅黑", 15, FontStyle.Regular); + Brush textBrush = Brushes.Black; + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + RectangleF rectF = new RectangleF(80, 80, 800 - 80, 800 - 80); + g.DrawString(bookStr, font, textBrush, rectF); + } + + Thread.Sleep(Randomx.GetId(500, 800)); + var locationStr = UploadImg(shop, bookImg, cell); + if (!locationStr.Contains("\"success\":true")) + return locationStr; + var location = BaseRegex.GetStringJson(ref locationStr, "Location"); + upProdParam.product.info.qualificationList.Add(new qualificationParam() { qualificationId = "50000089", qualificationUrl = new List() { location }, }); + } + + if (upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") + { + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在生成成人用品专有信息"; + })); + } + + string prodName = (upProdParam.product.info.category.Count > 2 ? upProdParam.product.info.category[2].name : upProdParam.product.info.category.LastOrDefault()?.name); + + var baseImg = TemuKJD.Properties.Resources.qingqu; + var newImg = new Bitmap(baseImg.Width, baseImg.Height); + using (Graphics g = Graphics.FromImage(newImg)) + { + //g.Clear(Color.White); + g.DrawImage(baseImg, new Rectangle(0, 0, newImg.Width, newImg.Height), 0, 0, baseImg.Width, baseImg.Height, GraphicsUnit.Pixel); + + g.FillRectangle(Brushes.White, 860.ParseToInt(), (1024 - 4).ParseToInt(), 500, 120); + + //Font font = new Font("宋体", txtSize.Text.Trim().ParseToInt(), FontStyle.Bold); + Font font = new Font("宋体", 44.ParseToInt(), FontStyle.Regular); + //Font font = new Font("微软雅黑", 15, FontStyle.Regular); + Brush textBrush = Brushes.Black; + textBrush = new SolidBrush(Color.FromArgb(0, 0, 0)); + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; + RectangleF rectF = new RectangleF(860, 1024, baseImg.Width - 80, baseImg.Height - 80); + if (!string.IsNullOrWhiteSpace(prodName.Trim())) + g.DrawString(prodName.Trim(), font, textBrush, rectF); + } + + Thread.Sleep(Randomx.GetId(500, 800)); + var locationStr = UploadImg(shop, newImg, cell); + if (!locationStr.Contains("\"success\":true")) + return locationStr; + var location = BaseRegex.GetStringJson(ref locationStr, "Location"); + upProdParam.product.info.qualificationList.Add(new qualificationParam() { qualificationId = "50000115", qualificationUrl = new List() { location }, }); + } + #endregion + } + #endregion + + #region AI生成图片,用于商品裂变 + if (chkAiImage.Checked) + { + int imgCount = 1; + Invoke(new Action(() => + { + if (cell != null) + cell.Value = "正在Ai生图"; + imgCount = txtAiImgCount.Text.Trim().ParseToInt(); + if (imgCount == 0) + imgCount = 1; + })); + + List tList = new List(); + List errStrLst = new List(); + for (int n = 0; n < upProdParam.product.info.headImg.Count && n < imgCount; n++) + { + while (tList.Count >= 10) + { + Thread.Sleep(500); + tList.RemoveAll(t => t.IsCanceled || t.IsFaulted || t.IsCompleted); + } + var tt = Task.Run(() => + { + var imgUrl = GetAiImg(upProdParam.product.info.headImg[n], upProdParam.product.info.shortTitle); + if (imgUrl.StartsWith("生成Ai图片错误")) + { + errStrLst.Add(imgUrl); + return; + //return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + imgUrl + "\"}"; + } + + // api上传图片文件 Ai主图 + if (1 == 1) + { + try + { + string errMsg = ""; + //var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, needAddRandomBlock, wantAddRandomBlock, 800, 800); + var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, false, false, 800, 800); + if (!string.IsNullOrEmpty(errMsg)) + { + errStrLst.Add(errMsg); + return; + //return errMsg; + } + + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + //upDate += "&is_file=true"; + //if (needAddRandomBlock || wantAddRandomBlock) + // upDate += "&random_code=true"; + upDate += "&img_url=" + imgUrl; + upDate += "&img_base64=" + imgBase64; + + var sTime = DateTime.Now; + var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在上传Ai主图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); + if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) + { + upProdParam.product.info.headImg[n] = upImgUrl; + //if (n == 0) + // upProdParam.product.info.detail.detailImg.Insert(0, upImgUrl); + } + else + { + string upImgErrMsg = BaseRegex.GetStringJsonByRegs(ref apiUpImgFileRst, apiUpImgFileRst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); + errStrLst.Add("上传Ai图失败 " + upImgErrMsg); + return; + //return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"上传Ai图失败 " + upImgErrMsg + "\"}"; + } + } + catch (Exception ex) + { + errStrLst.Add("上传Ai图失败 " + ex.Message); + return; + //return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"上传Ai图失败 " + ex.Message + "\"}"; + } + } + }); + tList.Add(tt); + } + while (tList.Count > 0) + { + Thread.Sleep(500); + tList.RemoveAll(t => t.IsCanceled || t.IsFaulted || t.IsCompleted); + } + // 错误超过一定数量直接报错返回 + if (errStrLst.Count > 0 && errStrLst.Count >= imgCount / 3) + { + return string.Join(",", errStrLst); + } + } + #endregion + + #region 添加图片随机外框,用于商品裂变 + if (selectProd.is_fission_title && chkRandomImgBorder.Checked) + { + // selectProd.isFission + int mainCount = 9; + int detailCount = 1; + Invoke(new Action(() => + { + mainCount = txtMainBorderImgCount.Text.Trim().ParseToInt(); + detailCount = txtDetailBorderImgCount.Text.Trim().ParseToInt(); + })); + // api上传图片文件 边框主图 + if (1 == 1) + { + if (chkRandomMainImgOrder.Checked) + upProdParam.product.info.headImg = upProdParam.product.info.headImg.OrderBy(x => Guid.NewGuid()).Take(100).ToList(); + for (int n = 0; n < upProdParam.product.info.headImg.Count && n < mainCount; n++) + { + var imgUrl = upProdParam.product.info.headImg[n]; + try + { + string errMsg = ""; + //var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, needAddRandomBlock, wantAddRandomBlock, 800, 800); + var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, false, false, 800, 800, true); + if (!string.IsNullOrEmpty(errMsg)) + { + return errMsg; + } + + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + //upDate += "&is_file=true"; + //if (needAddRandomBlock || wantAddRandomBlock) + // upDate += "&random_code=true"; + upDate += "&img_url=" + imgUrl; + upDate += "&img_base64=" + imgBase64; + + var sTime = DateTime.Now; + var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在优化主图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); + if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) + { + upProdParam.product.info.headImg[n] = upImgUrl; + } + else + { + string upImgErrMsg = BaseRegex.GetStringJsonByRegs(ref apiUpImgFileRst, apiUpImgFileRst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"优化主图失败 " + upImgErrMsg + "\"}"; + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"优化主图失败 " + ex.Message + "\"}"; + } + } + } + // api上传图片文件 边框详情图 + if (1 == 1) + { + if (chkRandomDetailImgOrder.Checked) + upProdParam.product.info.detail.detailImg = upProdParam.product.info.detail.detailImg.OrderBy(x => Guid.NewGuid()).Take(100).ToList(); + for (int n = 0; n < upProdParam.product.info.detail.detailImg.Count && n < detailCount; n++) + { + var imgUrl = upProdParam.product.info.detail.detailImg[n]; + try + { + string errMsg = ""; + //var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, needAddRandomBlock, wantAddRandomBlock, 800, 800); + var imgBase64 = GetImgBase64ForApi(out errMsg, imgUrl, false, false, 800, 800, true); + if (!string.IsNullOrEmpty(errMsg)) + { + return errMsg; + } + + var urlImg = BaseClass.BuildPDDObjString("product/wx_api_upload_image"); + var upDate = UserLogin.GetSignaturex(); + upDate += "&token=" + token.accessToken; + //upDate += "&is_file=true"; + //if (needAddRandomBlock || wantAddRandomBlock) + // upDate += "&random_code=true"; + upDate += "&img_url=" + imgUrl; + upDate += "&img_base64=" + imgBase64; + + var sTime = DateTime.Now; + var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在优化详情图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt(); + })); + } + + for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++) + { + token.mdyTime = DateTime.Now.AddDays(-100); + token = new WxApiBLL().GetRandomWxToken(); + apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate); + } + var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url"); + if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl)) + { + upProdParam.product.info.detail.detailImg[n] = upImgUrl; + } + else + { + string upImgErrMsg = BaseRegex.GetStringJsonByRegs(ref apiUpImgFileRst, apiUpImgFileRst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"优化详情图失败 " + upImgErrMsg + "\"}"; + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"优化详情图失败 " + ex.Message + "\"}"; + } + } + } + } + #endregion + + // 直接使用微信回采情趣商品品牌 + if (BaseClass.UserAuthority.ParseToString().Contains("微信回采") && chkUseWXComplateProd.Checked && + upProdParam.product.info.category.FirstOrDefault()?.name == "成人用品" && upProdParam.product.info.category[1].name != "情趣内衣") + { + if (DefaultAdultBrandId.ParseToLong() > 0) + upProdParam.product.info.brandId = DefaultAdultBrandId.ParseToLong(); + } + // 情趣内衣等类目禁止设置运费险 + if (upProdParam.product.info.category[1].name == "情趣内衣" || + upProdParam.product.info.category[1].name == "水果") + { + upProdParam.product.info.extraService.freightInsurance = 0; + } + // 假1赔3 + if (upProdParam.product.info.category[0].name == "珠宝首饰" || upProdParam.product.info.category[1].name == "时尚饰品") + { + upProdParam.product.info.extraService.fakeOnePayFour = 1; + } + // 坏损包退 damageGuarantee + if (upProdParam.product.info.category[0].name == "生鲜" || upProdParam.product.info.category[0].name == "酒类" || + upProdParam.product.info.category[0].name == "食品饮料" || upProdParam.product.info.category[0].name == "保健食品/膳食营养补充食品" || + (upProdParam.product.info.category[0].name == "农资园艺" && upProdParam.product.info.category[1].name == "花卉绿植")) + { + upProdParam.product.info.extraService.damageGuarantee = 1; + } + // 生鲜不支持换货,关闭 + if (upProdParam.product.info.category[0].name == "生鲜") + { + upProdParam.product.info.extraService.exchangeSupport = 0; + } + + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "正在提交商品"; + })); + } + Thread.Sleep(Randomx.GetId(1000, 2000)); + + var uploadDraftRst = WXUpload.uploadProductDraft(shop, upProdParam); + if (!uploadDraftRst.Contains("\"code\":0") && !uploadDraftRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref uploadDraftRst, "msg"); + if (string.IsNullOrEmpty(error)) + { + if (uploadDraftRst.Contains("\"errcode\":9401043")) + error = "sku价格异常,请检查加价比例"; + else + error = uploadDraftRst; + } + var draftId = BaseRegex.GetStringJson(ref uploadDraftRst, "productId").ParseToLong(); + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"草稿保存失败 " + GetHtml.UrlEncodeUtf8(error) + "\"}"; + } + if (cell != null) + { + Invoke(new Action(() => + { + var timeSpan = DateTime.Now - startTime; + var duration = timeSpan.TotalSeconds; + cell.Value = "商品已保存草稿,正在提交上架" + " " + duration.ParseToInt() + "秒"; + })); + } + + #region 保存缓存盗链图片 + if (isChangeImgDic) + { + var url = BaseClass.BuildObjString("product/mdy_pdd_product"); + var data = ""; + Invoke(new Action(() => + { + data = UserLogin.GetSignaturex(); + data += "&spu_id=" + dbProd.spu_id; + data += "&wx_img_map_json=" + JsonHelper.SerializeObject(wxImgMapDic); + })); + var 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")) + html = GetHtml.PostUtf8(url, data); + isChangeImgDic = false; + } + #endregion + + upProdParam.product.productKey.productId = BaseRegex.GetLongJson(ref uploadDraftRst, "productId").ParseToString(); + + var commissionRstStr = ""; + if (chkUpDraft.Checked && BaseClass.UserAuthority.Contains("佣金上货") && chkCommission.Checked) + { + var rst = WXUpload.addLeagueItemForUpdatingProduct(shop, 1, commissionRate, 1, commissionRate, upProdParam.product.productKey.productId.ParseToLong()); + if (!rst.Contains("\"code\":0")) + { + var error = BaseRegex.GetStringJsonByRegs(ref rst, rst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); + commissionRstStr = "设置佣金比例失败 " + rst; + } + } + + if (chkUpDraft.Checked) + { + selectProd.wxDraftProduct = upProdParam; + selectProd.draft_id = upProdParam.product.productKey.productId; + 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); + + return "{\"success\":true,\"draftId\":" + upProdParam.product.productKey.productId + ",\"status\":\"草稿箱\",\"errMsg\":\"指定上传到草稿箱" + commissionRstStr + "\"}"; + } + + // 提交商品上架 + if (!chkTestNoAuditUpload.Checked) + { + var uploadProdRst = WXUpload.upProductV2(shop, upProdParam); + //{"success":true,"retcode":209006,"errcode":209006,"productId":10001226244322,"productKey":{"productId":"10001226244322"}} // 提审成功 + //{"success":true,"retcode":0,"errcode":0,"productId":10001226095876,"productKey":{"productId":"10001226095876"}} // 未能提审 + if (!uploadProdRst.Contains("\"code\":0") && !uploadProdRst.Contains("\"success\":true")) + { + 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 + "\"}"; + } + if (upProdParam.product.productKey.productId.IsNullOrEmpty()) + upProdParam.product.productKey.productId = BaseRegex.GetLongJson(ref uploadProdRst, "productId").ParseToString(); + + if (BaseClass.UserAuthority.Contains("佣金上货") && chkCommission.Checked) + { + var rst = WXUpload.addLeagueItemForUpdatingProduct(shop, 1, commissionRate, 1, commissionRate, upProdParam.product.productKey.productId.ParseToLong(), 1); + if (!rst.Contains("\"code\":0")) + { + var error = BaseRegex.GetStringJsonByRegs(ref rst, rst, "msg", "errMsg", "errorMsg", "err_msg", "error_msg"); + commissionRstStr = "设置佣金比例失败 " + rst; + } + } + if (chkIsSubmitSuccess.Checked) + { + Thread.Sleep(Randomx.GetId(2000, 3001)); + var uploadCheckRst = WXUpload.SearchProductUpload(shop, upProdParam.product.productKey.productId); + if (uploadCheckRst.Contains("\"productList\":[]") || uploadCheckRst.Contains("\"totalNum\":0")) + { + return "{\"success\":false,\"draftId\":" + upProdParam.product.productKey.productId + ",\"status\":\"草稿箱\",\"errMsg\":\"上架提审失败 请检查是否在架商品数已达到上限或店铺受到其他限制\"}"; + } + } + } + else + { + #region 尝试免审接口提交 未成功 作废 + var getEditProd = WXUpload.getEditProductV2(shop, upProdParam.product.productKey.productId); + //getEditProd = getEditProd.Replace("8388275713", "33333333"); + //getEditProd = getEditProd.Replace("33333333", "8387633147"); + + string productJson = ""; + try + { + // 获取免审编辑回传数据 + JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + var prodStr = JsonConvert.SerializeObject(upProdParam, jsonSetting); + JObject jObj = JsonHelper.JObjectParse(prodStr); + + JObject jObjTmp = JsonHelper.JObjectParse(getEditProd); + jObj["product"] = jObjTmp["product"]; + + //productJson = productJson.Replace("999", "1005"); + jObj["product"]["status"] = 1; //默认为5 + foreach (var sku in jObj["product"]["productSkus"]) + { + sku["productSkuInfo"]["stockInfo"]["stockNum"] = "1000"; + sku["productSkuInfo"]["stockInfo"]["totalNum"] = "1000"; + //sku["productSkuInfo"]["realStockInfo"]["stockNum"] = "1000"; + //sku["productSkuInfo"]["realStockInfo"]["totalNum"] = "1000"; + + var realStockInfo = new realStockInfoParam() { stockNum = 999, totalNum = 999 }; + sku["productSkuInfo"]["realStockInfo"] = JsonHelper.JObjectParse(JsonHelper.SerializeObject(realStockInfo)); + } + productJson = JsonHelper.SerializeObject(jObj); + + // 提交上架 + //var uploadProdRst = WXUpload.upProductJObjectV2(shop, productJson); + } + catch (Exception ex) + { + } + + string submitJson = "{\"name\":\"goods/" + upProdParam.product.productKey.productId + "/" + DateTime.Now.ToString("yyyy-MM-dd") + "/" + + BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now) + "/submit.json\"}"; + var initFileName = BaseRegex.GetStringJson(ref submitJson, "name"); + DateTime tickTime = DateTime.Now.AddSeconds(0 - Randomx.GetId(10, 30)); + int time1 = BaseClass.DateTimeToTimestampSeconds(tickTime) - Randomx.GetId(80, 150); + int time2 = BaseClass.DateTimeToTimestampSeconds(tickTime); + + var uploadPartRst = WXUpload.initUploadPart(shop, submitJson, upProdParam.product.productKey.productId, time1, time2); + string uploadPartId = BaseRegex.GetStringJson(ref uploadPartRst, "uploadId"); + + //upProdParam.product.status = 5; + //upProdParam.product.editStatus = 0; + //upProdParam.product.auditReason = ""; + //upProdParam.product.info.skuIdList = new skuIdListParam(); + //upProdParam.product.info.skuList = new skuListParam(); + //upProdParam.product.info.skuList.skuInfo = new List(); + //var listingAuditFreeRst = WXUpload.listingAuditFree(shop, upProdParam, upProdParam.product.productKey.productId, time1, time2); + // 提交免审修改(实际生效接口) + var listingAuditFreeRst = WXUpload.listingAuditFree(shop, productJson, upProdParam.product.productKey.productId, time1, time2); + + string tempBlobPath = Path.GetTempPath().Trim('\\') + "\\" + Randomx.GetWordWithNumber(8).ToLower(); + if (!Directory.Exists(tempBlobPath)) + Directory.CreateDirectory(tempBlobPath); + string blobFullPath = tempBlobPath + "\\blob"; // C:\Users\Administrator\AppData\Local\Temp\3mer3k21\blob + using (StreamWriter sw = new StreamWriter(blobFullPath)) + { + //skuParam.productSkuInfo.realStockInfo = new realStockInfoParam() { stockNum = 1005, totalNum = 1005 }; + + + var jObj = JsonHelper.JObjectParse(productJson); + foreach (JObject skuObj in jObj["product"]["productSkus"]) + { + skuObj["productSkuInfo"]["stockInfo"]["stockNum"] = 1005; + + var realStockInfo = new realStockInfoParam() { stockNum = 999, totalNum = 999 }; + skuObj["productSkuInfo"]["realStockInfo"] = JsonHelper.JObjectParse(JsonHelper.SerializeObject(realStockInfo)); + } + + JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + foreach (var sku in upProdParam.product.productSkus) + { + sku.productSkuInfo.stockInfo.stockNum = 1005; + } + var prodStr = JsonConvert.SerializeObject(upProdParam, jsonSetting); + prodStr = JsonHelper.SerializeObject(jObj["product"]); + sw.Write(prodStr); + } + uploadPartRst = WXUpload.uploadPartBinary(shop, initFileName, blobFullPath, uploadPartId, upProdParam.product.productKey.productId, time1, time2); + //{"code":0,"etag":"18e3f73046378472219641ef181d3232"} + //C:\Users\Administrator\AppData\Local\Temp\9uaeiplr\blob + + var eTag = BaseRegex.GetStringJson(ref uploadPartRst, "etag"); + string rstParmStr = @"{""name"":""" + initFileName + @""",""uploadId"":""" + uploadPartId + @""",""etagList"":[""" + eTag + @"""],""partSeqList"":[1]}"; + var complateRst = WXUpload.completeUploadPart(shop, rstParmStr, upProdParam.product.productKey.productId, time1, time2); + + #endregion + } + + if (cell != null) + { + Invoke(new Action(() => + { + var timeSpan = DateTime.Now - startTime; + var duration = timeSpan.TotalSeconds; + cell.Value = "商品已上传" + " " + duration.ParseToInt() + "秒"; + })); + } + + // 已传的商品保存为安全商品 + if (dbProd.wx_safe_status == "未校验") + { + var url = BaseClass.BuildObjString("product/mdy_pdd_product"); + var data = ""; + Invoke(new Action(() => + { + data = UserLogin.GetSignaturex(); + data += "&spu_id=" + dbProd.spu_id; + data += "&wx_safe_status=安全商品"; + })); + var 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")) + html = GetHtml.PostUtf8(url, data); + } + if (!string.IsNullOrEmpty(dbProd.secret_spu_id)) + { + //add_secret_spu_id_shop_id_map //测试id "2017522348787531778" FC4C8B7F3C6E4B029AD2A12D4D323B41 // 老函数已作废 + var url = BaseClass.BuildObjString("product/wx_add_secret_id_up_map"); + var data = ""; + Invoke(new Action(() => + { + data = UserLogin.GetSignaturex(); + data += "&up_secret_spu_id=" + dbProd.secret_spu_id; + data += "&up_spu_id=" + dbProd.spu_id; + data += "&shop_id=" + shop.ShopId; + data += "&index=" + Math.Abs(dbProd.secret_spu_id.GetHashCode()) % 1024; + data += "&price_max=" + upProdParam.product.productSkus.Max(s => s.productSkuInfo.salePrice); + data += "&price_min=" + upProdParam.product.productSkus.Min(s => s.productSkuInfo.salePrice); + })); + var 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")) + html = GetHtml.PostUtf8(url, data); + } + + //colUploadCount + var dgvShopRow = dgvShop.Rows.Cast().FirstOrDefault(row => row.Cells["colShopId"]?.Value.ParseToString() == shop.ShopId); + if (dgvShopRow != null) + { + var day = DateTime.Now.ToString("yyyyMMdd").ParseToInt(); + if (!GlobalConfig.dicWxShopUploadInfo.ContainsKey(shop.ShopId)) + GlobalConfig.dicWxShopUploadInfo[shop.ShopId] = new WxShopUploadInfo(); + if (!GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.ContainsKey(day)) + GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day] = 0; + GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day] += 1; + // 删除45天前的记录 + var removeKeys = GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.Keys.Where(s => s < DateTime.Now.AddDays(-45).ToString("yyyyMMdd").ParseToInt()).ToList(); + foreach (var key in removeKeys) + { + GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.Remove(key); + } + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_shop_upload_info", GlobalConfig.dicWxShopUploadInfo); + + Invoke(new Action(() => + { + dgvShopRow.Cells["colUploadCount"].Value = GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day]; + })); + } + + return "{\"success\":true,\"draftId\":" + upProdParam.product.productKey.productId + ",\"status\":\"已上传\",\"msg\":\"上传成功" + commissionRstStr + "\"}"; + } + + + public static string GetImgBase64ForApi(out string errorMsg, string img_url, bool needAddRandomBlock, bool wantAddRandomBlock, int imgWidth = 0, int imgHeight = 0, bool wantAddRandomBorder = false) + { + errorMsg = ""; + string imgBase64 = ""; + //------------------------------------------------------------------------------------------------------------------------------------- + //生成主图base64字符串 + string getImgError; + if (!img_url.Contains("wst.wxapp.tc.qq.com") && !img_url.Contains("mmecimage.cn")) + img_url = img_url.Replace("https://", "http://"); + var image = GetHtml.GetUrlImg(img_url, out getImgError); + if (image == null) + image = new Bitmap(800, 800); + if (imgWidth == 0 || imgHeight == 0) + { + imgWidth = image.Width; + imgHeight = image.Height; + } + var imageBg = new Bitmap(imgWidth, imgHeight); + if (image == null || !string.IsNullOrEmpty(getImgError)) + { + errorMsg = "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"初始化图片上传失败 " + getImgError + "\"}"; + return ""; + } + try + { + using (Graphics g = Graphics.FromImage(imageBg)) + { + g.DrawImage(image, new Rectangle(0, 0, imageBg.Width, imageBg.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); + if (needAddRandomBlock || wantAddRandomBlock) + { + g.FillRectangle(new SolidBrush(Color.FromArgb(Randomx.GetId(256), Randomx.GetId(256), Randomx.GetId(256))), + new Rectangle(Randomx.GetId(imageBg.Width - 30), Randomx.GetId(imageBg.Height - 30), 30, 30)); + } + if (wantAddRandomBorder) + { + var borderColor = Color.FromArgb(Randomx.GetId(256), Randomx.GetId(256), Randomx.GetId(256)); + g.FillRectangle(new SolidBrush(borderColor), new Rectangle(0, 0, imageBg.Width, 20)); + g.FillRectangle(new SolidBrush(borderColor), new Rectangle(0, imageBg.Height - 20, imageBg.Width, 20)); + g.FillRectangle(new SolidBrush(borderColor), new Rectangle(0, 0, 20, imageBg.Height)); + g.FillRectangle(new SolidBrush(borderColor), new Rectangle(imageBg.Width - 20, 0, 20, imageBg.Height)); + } + } + using (MemoryStream memoryStream = new MemoryStream()) + { + imageBg.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); + byte[] imageBytes = memoryStream.ToArray(); + imgBase64 = Convert.ToBase64String(imageBytes); + return imgBase64; + } + } + catch (Exception ex) + { + errorMsg = "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"修改图片失败 " + ex.Message + "\"}"; + return ""; + } + } + + public string UploadImg(ShopLoginInfo shop, string img_url, DataGridViewCell cell = null, bool randomBlock = false) + { + string getImgError; + var image = GetHtml.GetUrlImg(img_url.Replace("https://", "http://"), out getImgError); + if (image == null) + image = new Bitmap(800, 800); + var imageBg = new Bitmap(image.Width, image.Height); + if (!string.IsNullOrEmpty(getImgError) || image == null) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"初始化图片上传失败\"}"; + } + try + { + using (Graphics g = Graphics.FromImage(imageBg)) + { + g.DrawImage(image, new Rectangle(0, 0, imageBg.Width, imageBg.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); + if (randomBlock) + g.FillRectangle(new SolidBrush(Color.FromArgb(Randomx.GetId(256), Randomx.GetId(256), Randomx.GetId(256))), + new Rectangle(Randomx.GetId(imageBg.Width - 30), Randomx.GetId(imageBg.Height - 30), 30, 30)); + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + "修改图片失败 " + ex.Message + "\"}"; + } + return UploadImg(shop, imageBg, cell); + } + + + public string UploadImg(ShopLoginInfo shop, Bitmap img, DataGridViewCell cell = null) + { + var upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); + for (int i = 0; i < 20 && upImgAuthRst.Contains("LogicError"); i++) + { + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "图片提报失败,正在重试。" + (i + 1); + })); + } + Thread.Sleep(Randomx.GetId(3000, 6000)); + upImgAuthRst = WXUpload.getUploadTempImgAuth(shop); + } + if (!upImgAuthRst.Contains("\"code\":0")) + { + var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = upImgAuthRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"申请上传图片失败 " + GetHtml.UrlEncodeUtf8(error) + "\"}"; + } + string disK = BaseRegex.GetStringJson(ref upImgAuthRst, "disK"); + long disT = BaseRegex.GetLongJson(ref upImgAuthRst, "disT"); + string ext = BaseRegex.GetStringJson(ref upImgAuthRst, "ext"); + string imgBase64 = ""; + + //------------------------------------------------------------------------------------------------------------------------------------- + //生成图片base64字符串 + try + { + using (MemoryStream memoryStream = new MemoryStream()) + { + img.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); + byte[] imageBytes = memoryStream.ToArray(); + imgBase64 = Convert.ToBase64String(imageBytes); + } + } + catch (Exception ex) + { + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"" + "修改图片失败 " + ex.Message + "\"}"; + } + + //------------------------------------------------------------------------------------------------------------------------------------- + //上传图片,获取图片路径 + var upImgRst = WXUpload.adtimageupload(shop, imgBase64, disK, disT, ext).ParseToString(); + var location = BaseRegex.GetStringJson(ref upImgRst, "Location"); + if (string.IsNullOrEmpty(location)) + { + var error = BaseRegex.GetStringJson(ref upImgAuthRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = upImgAuthRst; + return "{\"success\":false,\"draftId\":0,\"status\":\"未上传\",\"errMsg\":\"图片上传失败 " + error + "\"}"; + } + return "{\"success\":true,\"location\":\"" + location + "\"}"; + } + + private void btnStop_Click(object sender, EventArgs e) + { + if (this.cancellationTokenSource != null) + this.cancellationTokenSource.Cancel(); + } + + CancellationTokenSource getProdTokenSource = null; + private void pbSelectProd_Click(object sender, EventArgs e) + { + if (getProdTokenSource != null) + getProdTokenSource.Cancel(); + } + private void btnRandomAdd_Click(object sender, EventArgs e) + { + btnRandomAdd.Enabled = false; + Task.Run(() => + { + Thread.Sleep(5000); + Invoke(new Action(() => + { + btnRandomAdd.Enabled = true; + })); + }); + + if (BaseClass.UserAuthority.Contains("裂变调试") && chkFissionGoodsName.Checked) + { + Invoke(new Action(() => + { + var titles = txtFissionTitle.Text.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); + txtAddCount.Text = "" + titles.Count; + if (titles.Count == 0) + { + BaseMsgForm.ShowError("裂变标题数量不足"); + return; + } + + //this.lstTemuDBProductSelect.Clear(); + //NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); + //lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; + })); + } + + pbSelectProd.Visible = true; + int addCount = txtAddCount.Text.Trim().ParseToInt(); + if (getProdTokenSource != null) + getProdTokenSource.Cancel(); + getProdTokenSource = new CancellationTokenSource(); + Task.Run(() => + { + List prodLst = new List(); + int index = 0; + int pageSize = 50; + int prodCount = 99999999; + while (addCount > 0) + { + if (getProdTokenSource.IsCancellationRequested) + break; + + index++; + // 如果产品数量在0到50之间,说明数据库商品数量不足,无需再重复筛选,直接随机打乱 + if (prodLst.Count == 0 || prodCount > pageSize) + { + if (prodCount != 99999999) + { + //不重复筛选 + prodLst = GetRandomProductList(out prodCount, 1, Math.Min(pageSize, addCount), true, prodCount); + } + else + { + prodLst = GetRandomProductList(out prodCount, 1, Math.Min(pageSize, addCount)); + } + //Thread.Sleep(Randomx.GetId(50, 100)); + Thread.Sleep(Randomx.GetId(250, 500)); + } + else + { + prodLst = prodLst.OrderBy(x => Guid.NewGuid()).ToList(); + Thread.Sleep(Randomx.GetId(10, 30)); + } + Invoke(new Action(() => + { + lblGoodsCount.Text = "产品库 " + prodCount + " 件"; + })); + if (prodLst.Count == 0) // 等于0要么库里没数据要么出错了,跳出 + break; + foreach (var prod in prodLst) + { + var productNameLst = new List() { prod.product_name }; + if (chkRandomFissionProduct.Checked) + { + Invoke(new Action(() => + { + var titleCount = txtRandomFissionProductCount.Text.Trim().ParseToInt(); + if (prod.fission_words.ParseToString().Length > 20 && titleCount > 0) + { + productNameLst = prod.fission_words.Replace("fission_goods_names:", "") + .Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).OrderBy(x => Guid.NewGuid()).Distinct().Take(titleCount) + .ToList(); + } + })); + } + foreach (var productName in productNameLst) + { + var selectProd = JsonHelper.DeserializeJsonToObject(JsonHelper.SerializeObject(prod)); + selectProd.product_name = productName; + if (chkRandomFissionProduct.Checked) + selectProd.is_fission_title = true; + selectProd.out_product_Id = prod.id.ToString(); + selectProd.id = 1; + if (lstTemuDBProductSelect.Count > 0) + selectProd.id = lstTemuDBProductSelect.Max(p => p.id) + 1; + this.lstTemuDBProductSelect.Add(selectProd); + + addCount--; + if (addCount <= 0) + break; + } + + Invoke(new Action(() => + { + lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; + })); + //addCount--; + if (addCount <= 0) + break; + } + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); + } + + Invoke(new Action(() => + { + pbSelectProd.Visible = false; + })); + }, getProdTokenSource.Token); + } + + public List GetRandomProductList(out int totalCount, int page = 1, int pageSize = 50, bool isNotCount = false, int totalProdCount = 0) + { + var lstShopId = dgvShop.Rows.Cast().Where(row + => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); + + List list = new List(); + int pageCount = 1; + totalCount = 0; + + var url = BaseClass.BuildObjString("product/get_pdd_product_list_random"); + var data = ""; + Invoke(new Action(() => + { + data = UserLogin.GetSignaturex() + + "&page=" + 1 + + "&page_size=" + pageSize; + if (isNotCount) + { + data += "&is_not_count=" + true; + data += "&prod_count=" + totalProdCount; + } + data += "&ban_wx=0"; + + //data += "&in_ext_codes=" + txtExtCodeFilter.Text; + data += "&in_spu_ids=" + txtIdFilter.Text; + + string serach_group = cmbGroupFilter.Text.Trim(); + if (BaseClass.UserAuthority.Contains("商品采集") || BaseClass.ParentAuthority.Contains("商品采集")) + { + if (BaseClass.GroupId == 3) + serach_group = cmbGroupFilter.Text.Trim().Replace("我的商品", "用户" + BaseClass.UserName); + else + serach_group = cmbGroupFilter.Text.Trim().Replace("我的商品", "用户" + BaseClass.ParentUserName); + } + data += "&in_groups=" + serach_group; + + data += "&in_notes=" + cmbNotes.Text.Trim(); + + data += "&product_name=" + txtSearchGoodsName.Text.Trim(); + + // 商品采集权限可以随机管理员或自己采集的商品 + string addUserName = BaseClass.UserAuthority.Contains("商品采集") ? ("admin," + BaseClass.UserName) : "admin"; + if (BaseClass.GroupId != 3) + addUserName = BaseClass.ParentAuthority.Contains("商品采集") ? ("admin," + BaseClass.ParentUserName) : "admin"; + + // 采集用户如果没有爆款数据或货源选择权限,则只能随机自己采集的商品 + if ((BaseClass.UserAuthority.Contains("商品采集") || BaseClass.UserAuthority.Contains("商品采集")) && + cmbHot.Text != "爆款数据" && !BaseClass.UserAuthority.Contains("货源选择")) + data += "&add_user_name=" + (BaseClass.GroupId == 3 ? BaseClass.UserName : BaseClass.ParentUserName); + + // 防止手输查询学员数据 + if (!BaseClass.UserAuthority.Contains("学员数据") && !BaseClass.ParentAuthority.Contains("学员数据") && cmbSourceType.Text.Contains("学员数据")) + { + cmbSourceType.Text = cmbSourceType.Text.Replace("学员数据", ""); + } + // 如果指定只有自己采集的商品,则只会随机自己采集的商品 + else if ((cmbSourceType.Text.Trim().Contains("多多商品") || cmbSourceType.Text.Trim().Contains("1688商品") || cmbSourceType.Text.Trim().Contains("微信商品")) && + cmbSourceType.Text.Trim().Replace("多多商品", "").Replace("1688商品", "").Replace("微信商品", "").Trim(',').IsNullOrEmpty()) + data += "&add_user_name=" + (BaseClass.GroupId == 3 ? BaseClass.UserName : BaseClass.ParentUserName); + else + data += "&add_user_name=" + addUserName; + + if (!string.IsNullOrWhiteSpace(cmbSourceType.Text.Trim())) + { + // 采集来源判断 + data += "&product_get_type=" + cmbSourceType.Text.Trim().Replace("已采集数据", "1688外部数据") + .Replace("多多商品", "机会商品,多多外部数据").Replace("1688商品", "1688厂家,1688外部数据").Replace("微信商品", "微信店采"); + } + + + + if (btnSwitchCatType.Text == "P") + data += "&in_cates=" + (cmbCateFilter1.Text == "全部" ? "" : cmbCateFilter1.Text); + else + { + var selectCate1 = GlobalConfig.WxCatList.Where(c => c.level == 1 && (";" + cmbCateFilter1.Text.Trim() + ";").Contains(";" + c.name + ";")).ToList(); + var cates2 = GlobalConfig.WxCatList.Where(c => selectCate1.Any(c1 => c.f_cat_id == c1.cat_id)).ToList(); + var selectCate2 = cates2.Where(c => c.level == 2 && (";" + cmbCateFilter2.Text.Trim() + ";").Contains(";" + c.name + ";")).ToList(); + var cates3 = GlobalConfig.WxCatList.Where(c => selectCate2.Any(c2 => c.f_cat_id == c2.cat_id)).ToList(); + var selectCate3 = cates3.Where(c => c.level == 3 && (";" + cmbCateFilter3.Text.Trim() + ";").Contains(";" + c.name + ";")).ToList(); + + if (selectCate1?.Count == 0 && chkSkipQualification.Checked) + { + // 厂商直采普通店铺不要随特殊商品 + data += "&wx_cat_1=" + string.Join(",", GlobalConfig.WxCatList.Where(c => c.level == 1 && !(c.name == "图书" || c.name == "食品饮料" || c.name == "成人用品")) + .Select(c => c.cat_id)); + } + + if (!string.IsNullOrEmpty(cmbCateFilter1.Text) && selectCate1?.Count > 0) + data += "&wx_cat_1=" + string.Join(",", selectCate1.Select(c => c.cat_id).ToList()); + if (!string.IsNullOrEmpty(cmbCateFilter2.Text) && selectCate2?.Count > 0) + data += "&wx_cat_2=" + string.Join(",", selectCate2.Select(c => c.cat_id).ToList()); + if (!string.IsNullOrEmpty(cmbCateFilter3.Text) && selectCate3?.Count > 0) + data += "&wx_cat_3=" + string.Join(",", selectCate3.Select(c => c.cat_id).ToList()); + } + + // 爆款数据商品 + // 不为空搜内容 + if (!string.IsNullOrWhiteSpace(cmbHot.Text.Trim())) + data += "&special_prod_type=" + cmbHot.Text; + // 为空按照权限搜 + else if (BaseClass.SaLevel > 0 || BaseClass.UserAuthority.Contains("爆款数据")) + data += "&special_prod_type=爆款数据,普通商品"; + else + data += "&special_prod_type=普通商品"; + + // 聚水潭商品处理条件校验 + data += "&is_supplier_prod_ok=" + cmbJstInitSet.Text.Trim(); + + // 微信安全商品检测 + data += "&wx_safe_status=" + cmbWxSafe.Text.Trim().Replace("安全+未校验", "安全商品,未校验"); + + // 7天爆款数据 + if (chkSevenDays.Checked) + data += "&add_days_less=21"; + + // 回采数据 + if (chkWXComplateProd.Checked) + data += "&has_wx_format=1"; + + // 标题裂变 + if (chkRandomFissionProduct.Checked) + data += "&fission_words=fission_goods_names:"; + + if (chkFilterViewUv.Checked) + data += "&min_view_uv=" + numFilterViewUv.Value; + })); + var 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")) + // html = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) + { + Invoke(new Action(() => + { + BaseMsgForm.ShowError("获取商品失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg")); + })); + return new List(); + } + + int count = BaseRegex.GetIntJson(ref html, "count"); + totalCount = count; + pageCount = Math.Ceiling(1.0 * count / pageSize).ParseToInt(); + pageCount = Math.Max(pageCount, 1); + + var jArr = JObject.Parse(html)["data"]; + if (jArr.Count() == 0) + return list; + var sProd = JsonHelper.SerializeObject(jArr); + + try + { + list = JsonHelper.DeserializeJsonToList(sProd).OrderBy(x => Randomx.GetId(999999)).ToList(); + return list; + } + catch (Exception ex) + { + return new List(); + } + } + + /// + /// 随机添加黄总厂商商品(或其他指定分组产品,由服务端控制) + /// + /// + /// + /// + /// + public List GetRandomCompanyProductList(out int totalCount, string groupName = "黄总数据包", int page = 1, int pageSize = 200) + { + var lstShopId = dgvShop.Rows.Cast().Where(row + => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["colShopId"]?.Value.ToString()).ToList(); + + List list = new List(); + int pageCount = 1; + totalCount = 0; + + var url = BaseClass.BuildObjString("product/get_pdd_product_list_random"); + var data = ""; + Invoke(new Action(() => + { + data = UserLogin.GetSignaturex() + + "&page=" + 1 + + "&page_size=" + pageSize; + data += "&in_groups=" + groupName; + })); + var 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")) + html = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) + { + Invoke(new Action(() => + { + BaseMsgForm.ShowError("获取商品失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg")); + })); + return new List(); + } + + int count = BaseRegex.GetIntJson(ref html, "count"); + totalCount = count; + pageCount = Math.Ceiling(1.0 * count / pageSize).ParseToInt(); + pageCount = Math.Max(pageCount, 1); + + var jArr = JObject.Parse(html)["data"]; + if (jArr.Count() == 0) + return list; + var sProd = JsonHelper.SerializeObject(jArr); + + try + { + list = JsonHelper.DeserializeJsonToList(sProd).OrderBy(x => Randomx.GetId(999999)).ToList(); + return list; + } + catch (Exception ex) + { + return new List(); + } + } + + public string GetAiImg(string imgUrl, string imgWord) + { + string image_url = imgUrl; + string word = imgWord; + string secret = "sadhjufhe15c4fbvFBvcvds+5sdfds@#%$xsc"; + string time = BaseClass.DateTimeToTimestampSeconds(DateTime.Now).ToString(); + string code = BaseClass.GetMd5(secret + time).ToLower(); + + try + { + //string url = "http://ai-bs.jiaotian.vip:" + Randomx.GetId(20010, 20021) + "/index.php?obj=public/image"; + //http://svn.jiaotian.vip:20010-20020/index.php?obj=public/image + string url = "http://svn.jiaotian.vip:" + Randomx.GetId(20010, 20021) + "/index.php?obj=public/image"; + string data = "time=" + time + "&code=" + code + "&image_url=" + image_url + "&word=" + word; + string html = GetHtml.PostUtf8(url, data, "", 120); + if (!string.IsNullOrEmpty(html) && !html.Contains("error")) + { + return html; + } + else + { + return "生成Ai图片错误 " + html; + } + } + catch (Exception ex) + { + return "生成Ai图片错误 " + ex.Message; + } + } + + private void btnClearUpload_Click(object sender, EventArgs e) + { + if (BaseMsgForm.ShowConfirm("确定清空待上传商品吗?清空后不可恢复!").DialogResult == DialogResult.Cancel) + return; + + this.lstTemuDBProductSelect.Clear(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); + lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; + } + + private void lblNewAddPrice_Click(object sender, EventArgs e) + { + var ucPrice = new UcAddPrice(); + if (IsSetFontScaleNone) + { + Font of = ucPrice.Font; + Font nf = new Font(of.FontFamily, (of.Size * 96.0 / FormDpi).ParseToFloat(), of.Style, of.Unit, of.GdiCharSet, of.Bold); + ucPrice.Font = nf; + } + ucPrice.PriceChange += ucAddPrice_PriceChange; + this.fPnlPriceRule.Controls.Add(ucPrice); + ucPrice.lblSinglePriceAdd.Visible = false; + ucPrice.txtSinglePriceAdd.Visible = false; + } + + private void ucAddPrice_PriceChange(object obj) + { + List priceRuleLst = new List(); + foreach (var ucItem in fPnlPriceRule.Controls) + { + var ucPrice = ucItem as UcAddPrice; + if (ucPrice != null) + { + priceRuleLst.Add(new AddPriceRule() + { + AddMorePrice = ucPrice.PriceAddMore, + AddPriceTimes = ucPrice.PriceAddTimes, + LessThanPrice = ucPrice.PriceEnd, + MoreThanPrice = ucPrice.PriceStart, + SinglePriceAdd = ucPrice.SinglePriceAdd, + }); + } + } + this.lstAddPriceRule.Clear(); + this.lstAddPriceRule.AddRange(priceRuleLst); + + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_add_price_rules", lstAddPriceRule); + } + + private void txtAddPrice_TextChanged(object sender, EventArgs e) + { + if (IsFormLoad) + { + defaultAddPriceRule.AddPriceTimes = txtAddTimes.Text.Trim().ParseToDecimal(); + defaultAddPriceRule.AddMorePrice = txtAddMorePrice.Text.Trim().ParseToDecimal(); + defaultAddPriceRule.SinglePriceAdd = txtSinglePriceAdd.Text.Trim().ParseToDecimal(); + defaultAddPriceRule.StockNum = txtStockNum.Text.Trim().ParseToInt(); + defaultAddPriceRule.ShippingPriceTimes = txtShippingPriceTimes.Text.Trim().ParseToDecimal(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_default_add_price_rule", defaultAddPriceRule); + } + } + + private void chkStepAddPrice_CheckedChanged(object sender, EventArgs e) + { + defaultAddPriceRule.IsStepAddPrice = this.chkStepAddPrice.Checked; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_default_add_price_rule", defaultAddPriceRule); + } + + private void btnClearDgv_Click(object sender, EventArgs e) + { + //this.dgvSelectProduct.Rows.Clear(); + Task.Run(() => + { + var rows = this.dgvSelectProduct.Rows.Cast().ToList(); //Cast后Rows做foreach循环时仍会夹花跳过,所以要ToList转一个新的数组。 + foreach (var row in rows) + { + Invoke(new Action(() => + { + if (row.Cells["colCheck"].Value.ParseToBool() == true) + { + var draft_id = row.Cells["colDraftId"].Value.ParseToString(); + var add_time = row.Cells["colAddTime"].Value.ParseToString().ParseToDateTime(); + upload_draft_product_lst.RemoveAll(p => p.draft_id.ParseToString() == draft_id && p.add_time.ToString("yyyyMMddHHmmss") == add_time.ToString("yyyyMMddHHmmss")); + + this.dgvSelectProduct.Rows.Remove(row); + } + })); + } + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_select_upload_draft_products", upload_draft_product_lst); + }); + } + + private void chkAddMorePriceFirst_CheckedChanged(object sender, EventArgs e) + { + if (IsFormLoad) + { + defaultAddPriceRule.AddMorePriceFirst = chkAddMorePriceFirst.Checked; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_default_add_price_rule", defaultAddPriceRule); + } + } + + private void lblGoodsCount_Click(object sender, EventArgs e) + { + //PDDDBProdListForm f = new PDDDBProdListForm(); + //f.Width = 1366; + //f.Height = 768; + //f.ShowMaximizeBox = true; + //f.ShowDialog(); + } + + private void lblWaitToUp_Click(object sender, EventArgs e) + { + PDDDBProdUploadSelectCacheForm selectCacheForm = new PDDDBProdUploadSelectCacheForm(lstTemuDBProductSelect); + selectCacheForm.ShowDialog(); + + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); + lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; + } + + private void btnClearFilter_Click(object sender, EventArgs e) + { + txtIdFilter.Text = ""; + txtExtCodeFilter.Text = ""; + txtSearchGoodsName.Text = ""; + cmbGroupFilter.Text = ""; + cmbCateFilter1.Text = ""; + cmbWxSafe.Text = "安全+未校验"; + cmbSourceType.Text = "厂商直采"; + cmbHot.Text = "普通商品"; + chkSkipQualification.Checked = false; + cmbHot_TextChanged(null, null); + chkFilterViewUv.Checked = false; + numFilterViewUv.Value = 200; + + int prodCount; + pbSelectProd.Visible = true; + Task.Run(() => + { + GetRandomProductList(out prodCount, 1, 1); + Invoke(new Action(() => + { + pbSelectProd.Visible = false; + lblGoodsCount.Text = "产品库 " + prodCount + " 件"; + })); + }); + } + + private void 并发上传_Click(object sender, EventArgs e) + { + var draftIdLst = dgvSelectProduct.Rows.Cast().Where(row + => row.Cells["colCheck"]?.Value.ParseToBool() == true).Select(r => r.Cells["colDraftId"]?.Value.ToString()).ToList(); + + var lst = upload_draft_product_lst.Select(p => p.wxDraftProduct).ToList(); + + var upLst = lst.Where(l => draftIdLst.Contains(l.product.productKey.productId)).ToList(); + DateTime startTime = DateTime.Now; + Task.Run(() => + { + List tLst = new List(); + foreach (var prodParam in upLst) + { + var row = this.dgvSelectProduct.Rows.Cast().FirstOrDefault(r => r.Cells["colDraftId"].Value.ParseToString() == prodParam.product.productKey.productId); + if (row == null) + continue; + var shop = GlobalConfig.ValidShopLoginList.FirstOrDefault(s => s.ShopId == row.Cells["colSupplierId"].Value.ParseToString()); + if (shop == null) + continue; + var t = Task.Run(() => + { + UploadSameTime(shop, prodParam, row.Cells["colOpResult"]); + }); + tLst.Add(t); + } + Task.WaitAll(tLst.ToArray()); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_select_upload_draft_products", upload_draft_product_lst); + var duration = DateTime.Now - startTime; + Invoke(new Action(() => { BaseMsgForm.ShowInfo("并发上传完成,耗时:" + duration.TotalSeconds + " 秒"); })); + }); + } + + //public ConcurrentList upload_draft_products = new ConcurrentList(); + public ConcurrentList upload_draft_product_lst = new ConcurrentList(); + void UploadSameTime(ShopLoginInfo shop, WXUploadProductParam upProdParam, DataGridViewCell cell) + { + + var uploadProdRst = WXUpload.upProductV2(shop, upProdParam); + int retryTimes = 0; + while (!uploadProdRst.Contains("\"code\":0") && !uploadProdRst.Contains("\"success\":true")) + { + retryTimes++; + uploadProdRst = WXUpload.upProductV2(shop, upProdParam); + if (retryTimes >= 5) + break; + if (uploadProdRst.Contains("今日提审次数已用尽,请明日再试")) + break; + } + if (!uploadProdRst.Contains("\"code\":0") && !uploadProdRst.Contains("\"success\":true")) + { + var error = BaseRegex.GetStringJson(ref uploadProdRst, "msg"); + if (string.IsNullOrEmpty(error)) + error = uploadProdRst; + + if (cell != null) + { + Invoke(new Action(() => + { + cell.Value = "商品上传失败 " + error; + })); + } + } + else + { + if (cell != null) + { + upload_draft_product_lst.RemoveAll(p => p.wxDraftProduct == upProdParam); + Invoke(new Action(() => + { + cell.Value = "商品已上传,重试次数 " + retryTimes; + })); + } + + var dgvShopRow = dgvShop.Rows.Cast().FirstOrDefault(row => row.Cells["colShopId"]?.Value.ParseToString() == shop.ShopId); + if (dgvShopRow != null) + { + var day = DateTime.Now.ToString("yyyyMMdd").ParseToInt(); + if (!GlobalConfig.dicWxShopUploadInfo.ContainsKey(shop.ShopId)) + GlobalConfig.dicWxShopUploadInfo[shop.ShopId] = new WxShopUploadInfo(); + if (!GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.ContainsKey(day)) + GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day] = 0; + GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day] += 1; + // 删除45天前的记录 + var removeKeys = GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.Keys.Where(s => s < DateTime.Now.AddDays(-45).ToString("yyyyMMdd").ParseToInt()); + foreach (var key in removeKeys) + { + GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount.Remove(key); + } + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_shop_upload_info", GlobalConfig.dicWxShopUploadInfo); + + Invoke(new Action(() => + { + dgvShopRow.Cells["colUploadCount"].Value = GlobalConfig.dicWxShopUploadInfo[shop.ShopId].DicDayUploadCount[day]; + })); + } + } + } + + private void txtPreDays_TextChanged(object sender, EventArgs e) + { + wxUploadRule.PreSaleDays = txtPreDays.Text.Trim().ParseToInt(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void txtReplaceText_TextChanged(object sender, EventArgs e) + { + wxUploadRule.FilterWords = txtReplaceText.Text.Trim(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void txtMinPrice_TextChanged(object sender, EventArgs e) + { + wxUploadRule.SkuMinPrice = txtMinPrice.Text.Trim().ParseToInt(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void txtMaxPrice_TextChanged(object sender, EventArgs e) + { + wxUploadRule.SkuMaxPrice = txtMaxPrice.Text.Trim().ParseToInt(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void txtWaitSeconds_TextChanged(object sender, EventArgs e) + { + wxUploadRule.WaitSeconds = txtWaitSeconds.Text.Trim().ParseToInt(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void chkHighestPriceSku_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.OnlyHighestPriceSku = chkHighestPriceSku.Checked; + if (chkHighestPriceSku.Checked) + chkLowestPriceSku.Checked = false; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + private void chkLowestPriceSku_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.OnlyLowestPriceSku = chkLowestPriceSku.Checked; + if (chkLowestPriceSku.Checked) + chkHighestPriceSku.Checked = false; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void chkSameSpecPriceUp_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.SameSpecSamePriceUp = chkSameSpecPriceUp.Checked; + if (chkSameSpecPriceUp.Checked) + chkSameSpecPriceDown.Checked = false; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + private void chkSameSpecPriceDown_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.SameSpecSamePriceDown = chkSameSpecPriceDown.Checked; + if (chkSameSpecPriceDown.Checked) + chkSameSpecPriceUp.Checked = false; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void chkSkipUploaded_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.SkipUploaded = chkSkipUploaded.Checked; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void chkUpDraft_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.UpDraft = chkUpDraft.Checked; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void chkPreSale_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.IsPreSale = chkPreSale.Checked; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void btnRefreshNum_Click(object sender, EventArgs e) + { + + } + + private void cmbGroupFilter_SelectedIndexChanged(object sender, EventArgs e) + { + if (cmbGroupFilter.Text == "我的商品" && cmbSourceType.Text != "多多商品" && cmbSourceType.Text != "1688商品" && cmbSourceType.Text != "微信商品") + { + cmbSourceType.Text = ""; + } + } + + private void cmbSourceType_SelectedIndexChanged(object sender, EventArgs e) + { + //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "1688厂家" && cmbSourceType.Text != "微信店采" && cmbSourceType.Text != "微信小店") + // fillPddCate(); + //else + // fillWxCate(); + + if (cmbSourceType.Text != "厂商直采"/* && cmbSourceType.Text != "1688厂家"*/) + { + cmbJstInitSet.Text = ""; + } + else + { + cmbJstInitSet.Text = "是"; + } + } + + private void cmbCateFilter1_SelectedIndexChanged(object sender, EventArgs e) + { + //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "微信店采") + // return; + + //cmbCateFilter2.Text = ""; + //cmbCateFilter2.Items.Clear(); + //var cate1 = GlobalConfig.WxCatList.FirstOrDefault(c => c.level == 1 && c.name == cmbCateFilter1.Text.Trim()); + //var cates2 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate1?.cat_id).ToList(); + //foreach (var cate2 in cates2) + //{ + // cmbCateFilter2.Items.Add(cate2.name); + //} + } + + private void cmbCateFilter2_SelectedIndexChanged(object sender, EventArgs e) + { + //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "微信店采") + // return; + + //cmbCateFilter3.Text = ""; + //cmbCateFilter3.Items.Clear(); + //var cate1 = GlobalConfig.WxCatList.FirstOrDefault(c => c.level == 1 && c.name == cmbCateFilter1.Text.Trim()); + //var cates2 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate1?.cat_id).ToList(); + //var cate2 = cates2.FirstOrDefault(c => c.level == 2 && c.name == cmbCateFilter2.Text.Trim()); + //var cates3 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate2?.cat_id).ToList(); + //foreach (var cate3 in cates3) + //{ + // cmbCateFilter3.Items.Add(cate3.name); + //} + } + + private void cmbCateFilter3_SelectedIndexChanged(object sender, EventArgs e) + { + //var cate1 = GlobalConfig.WxCatList.FirstOrDefault(c => c.level == 1 && c.name == cmbCateFilter1.Text.Trim()); + //var cates2 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate1?.cat_id).ToList(); + //var cate2 = cates2.FirstOrDefault(c => c.level == 2 && c.name == cmbCateFilter2.Text.Trim()); + //var cates3 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate2?.cat_id).ToList(); + //var cate3 = cates3.FirstOrDefault(c => c.level == 3 && c.name == cmbCateFilter3.Text.Trim()); + } + + private void cmbCateFilter1_TextChanged(object sender, EventArgs e) + { + //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "1688厂家" && cmbSourceType.Text != "微信店采" && cmbSourceType.Text != "微信小店") + if (btnSwitchCatType.Text != "W") + return; + + cmbCateFilter2.Text = ""; + cmbCateFilter2.Items.Clear(); + cmbCateFilter3.Text = ""; + cmbCateFilter3.Items.Clear(); + var selectCate1 = GlobalConfig.WxCatList + .Where(c => c.level == 1 && (cmbCateFilter1.Text.Trim() == cmbCateFilter1.DefaultText || (";" + cmbCateFilter1.Text.Trim() + ";") + .Contains(";" + c.name + ";"))).ToList(); + var cates2 = GlobalConfig.WxCatList.Where(c => selectCate1.Any(c1 => c.f_cat_id == c1.cat_id)).ToList(); + //foreach (var cate2 in cates2) + //{ + // cmbCat2.Items.Add(cate2.name); + //} + cmbCateFilter2.Items.AddRange(cates2.Select(c => c.name).ToArray()); + } + + private void cmbCateFilter2_TextChanged(object sender, EventArgs e) + { + //if (cmbSourceType.Text != "厂商直采" && cmbSourceType.Text != "1688厂家" && cmbSourceType.Text != "微信店采" && cmbSourceType.Text != "微信小店") + if (btnSwitchCatType.Text != "W") + return; + + cmbCateFilter3.Text = ""; + cmbCateFilter3.Items.Clear(); + var selectCate1 = GlobalConfig.WxCatList + .Where(c => c.level == 1 && (cmbCateFilter1.Text.Trim() == cmbCateFilter1.DefaultText || (";" + cmbCateFilter1.Text.Trim() + ";") + .Contains(";" + c.name + ";"))).ToList(); + var cates2 = GlobalConfig.WxCatList.Where(c => selectCate1.Any(c1 => c.f_cat_id == c1.cat_id)).ToList(); + var selectCate2 = cates2 + .Where(c => c.level == 2 && (cmbCateFilter2.Text.Trim() == cmbCateFilter1.DefaultText || (";" + cmbCateFilter2.Text.Trim() + ";") + .Contains(";" + c.name + ";"))).ToList(); + var cates3 = GlobalConfig.WxCatList.Where(c => selectCate2.Any(c2 => c.f_cat_id == c2.cat_id)).ToList(); + //foreach (var cate3 in cates3) + //{ + // cmbCat3.Items.Add(cate3.name); + //} + cmbCateFilter3.Items.AddRange(cates3.Select(c => c.name).ToArray()); + } + + private void cmbCateFilter3_TextChanged(object sender, EventArgs e) + { + //var cate1 = GlobalConfig.WxCatList.FirstOrDefault(c => c.level == 1 && c.name == cmbCat1.Text.Trim()); + //var cates2 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate1?.cat_id).ToList(); + //var cate2 = cates2.FirstOrDefault(c => c.level == 2 && c.name == cmbCat1.Text.Trim()); + //var cates3 = GlobalConfig.WxCatList.Where(c => c.f_cat_id == cate2?.cat_id).ToList(); + //var cate3 = cates3.FirstOrDefault(c => c.level == 3 && c.name == cmbCat1.Text.Trim()); + } + + + private void btnFilterBound_Click(object sender, EventArgs e) + { + var boundMax = txtFilterBoundMax.Text.Trim().ParseToInt(); + var boundMin = txtFilterBoundMin.Text.Trim().ParseToInt(); + var cates = GlobalConfig.WxCatBoundList.Where(b => b.cat_bound <= boundMax && b.cat_bound >= boundMin); + lstTemuDBProductSelect.RemoveAll(p => !cates.Any(c => c.leaf_id.ParseToString() == p.wx_cat_leaf)); + + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); + lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; + } + + 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 txtTitleHeadWord_TextChanged(object sender, EventArgs e) + { + wxUploadRule.TitleHeadWords = txtTitleHeadWord.Text.Trim(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void chkSaveBound_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.IsSaveBound = chkSaveBound.Checked; + if (chkSaveBound.Checked) + { + wxUploadRule.FilterBoundMinSave = txtFilterBoundMin.Text.ParseToInt(); + wxUploadRule.FilterBoundMaxSave = txtFilterBoundMax.Text.ParseToInt(); + } + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void txtFilterBoundMin_TextChanged(object sender, EventArgs e) + { + if (wxUploadRule.IsSaveBound) + { + wxUploadRule.FilterBoundMinSave = txtFilterBoundMin.Text.ParseToInt(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + } + private void txtFilterBoundMax_TextChanged(object sender, EventArgs e) + { + if (wxUploadRule.IsSaveBound) + { + wxUploadRule.FilterBoundMaxSave = txtFilterBoundMax.Text.ParseToInt(); + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + } + + private void chkAiShotTitle_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.IsAiShortTitle = chkAiShortTitle.Checked; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void chkUseWXComplateProd_CheckedChanged(object sender, EventArgs e) + { + wxUploadRule.IsUseWXComplateProd = chkUseWXComplateProd.Checked; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + + private void btnProdDb_Click(object sender, EventArgs e) + { + WXSelectDBProdListForm.Instance.lstTemuDBProductSelect = this.lstTemuDBProductSelect; + WXSelectDBProdListForm.Instance.cmbSourceType.Items.Clear(); + WXSelectDBProdListForm.Instance.cmbSourceType.Items.AddRange(this.cmbSourceType.Items.Cast().ToArray()); + WXSelectDBProdListForm.Instance.SaveComplete -= dbProdList_SaveComplete; + WXSelectDBProdListForm.Instance.SaveComplete += dbProdList_SaveComplete; + WXSelectDBProdListForm.Instance.Show(); + WXSelectDBProdListForm.Instance.BringToFront(); + } + + public void dbProdList_SaveComplete(object obj) + { + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_db_prod_upload_list", this.lstTemuDBProductSelect); + Invoke(new Action(() => + { + lblWaitToUp.Text = "待上传 " + lstTemuDBProductSelect.Count + " 件"; + })); + } + + private void cmbHot_TextChanged(object sender, EventArgs e) + { + if (cmbHot.Text == "爆款数据") + { + cmbSourceType.Text = ""; + cmbJstInitSet.Text = ""; + } + else + { + cmbSourceType.Text = "厂商直采"; + cmbJstInitSet.Text = "是"; + // 商品采集用户无货源选择权限只能随机自己的商品 + if ((BaseClass.UserAuthority.Contains("商品采集") || BaseClass.ParentAuthority.Contains("商品采集")) && + !BaseClass.UserAuthority.Contains("货源选择") && BaseClass.SaLevel == 0) + { + cmbSourceType.Text = "多多商品,1688商品,微信商品"; + cmbJstInitSet.Text = ""; + } + } + } + + private void btnLoginAssistant_Click(object sender, EventArgs e) + { + WXSaleAssistantForm assistantForm = new WXSaleAssistantForm(); + assistantForm.OpenType = "login"; + assistantForm.InitUrl = "https://store.weixin.qq.com/talent/home"; + assistantForm.ShowDialog(); + lstWxSaleAssistantCookie = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("wx_sale_assistant_cookies"); + if (lstWxSaleAssistantCookie == null) + lstWxSaleAssistantCookie = new List(); + } + + private void txtFissionTitle_TextChanged(object sender, EventArgs e) + { + if (this.IsFormLoad) + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_prod_fission_title", txtFissionTitle.Text); + lblFissionTitleCount.Text = "标题数:" + txtFissionTitle.Text.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).ToList().Count(); + } + + private void btnSwitchCatType_Click(object sender, EventArgs e) + { + if (btnSwitchCatType.Text == "W") + { + btnSwitchCatType.Text = "P"; + fillPddCate(); + } + else + { + btnSwitchCatType.Text = "W"; + fillWxCate(); + } + } + + private void chkSkipReplaceText_CheckedChanged(object sender, EventArgs e) + { + if (this.IsFormLoad) + { + wxUploadRule.IsSkipHasFilterWordsProd = chkSkipReplaceText.Checked; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + } + + private void chkRemoveSpecialChar_CheckedChanged(object sender, EventArgs e) + { + + } + + private void chkIsSubmitSuccess_CheckedChanged(object sender, EventArgs e) + { + + } + + private void chkUseShanghaiReturnOrderAddress_CheckedChanged(object sender, EventArgs e) + { + if (!IsFormLoad) return; + + wxUploadRule.IsUseShanghaiReturnOrderAddress = chkUseShanghaiReturnOrderAddress.Checked; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_upload_rule", wxUploadRule); + } + } + + public class WXUpload + { + public static string searchProduct(ShopLoginInfo shop, string extCode, string extCode2 = "") + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/searchProduct?" + + "token=&lang=zh_CN&pageSize=20&productStatus[]=-1&productSource=[1,16,32]&searchSource=1&useNew=true&pageNum=1&status[]=5&spuCode=" + extCode; + if (!string.IsNullOrEmpty(extCode2)) + url += "," + extCode2; + string refere = "https://store.weixin.qq.com/shop/goods/list?currentTab=PRODUCT_STATUS_ON"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, refere); + return result; + } + + public static string searchProductWithSpuId(ShopLoginInfo shop, string spuId) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/searchProduct?" + + "token=&lang=zh_CN&pageSize=20&productStatus[]=-1&productSource=[1,16,32]&searchSource=1&useNew=true&pageNum=1&status[]=-1&spuId=" + spuId; + string refere = "https://store.weixin.qq.com/shop/goods/list"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, refere); + return result; + } + + public static string searchProductWithTitle(ShopLoginInfo shop, string urlEncodeTitle) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/searchProduct?" + + "token=&lang=zh_CN&pageSize=20&productStatus[]=-1&productSource=[1,16,32]&searchSource=1&useNew=true&pageNum=1&status[]=-1&title=" + urlEncodeTitle; + string refere = "https://store.weixin.qq.com/shop/goods/list"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, refere); + return result; + } + + public static string getUploadTempImgAuth(ShopLoginInfo shop, int uploadScene = 3) + { + string url = "https://store.weixin.qq.com/shop-faas/mmecchannelspicture/cgi/getUploadTempImgAuth?token=&lang=zh_CN&uploadScene=" + uploadScene; + string refere = "https://store.weixin.qq.com/shop/goods/entry"; + //{"code":0,"disK":"538c14e950da7b678ce9f5a12658c8acddd09e4b","disT":1767870926,"ext":"23aa0ecfb792a","url":"https://westore.video.qq.com/adtimageupload"} + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, refere); + return result; + } + + public static string adtimageupload(ShopLoginInfo shop, string imgBase64, string dis_k, long dis_t, string ext) + { + string url = "https://westorealpha.video.qq.com/adtimageupload"; + string referer = "https://store.weixin.qq.com/"; + string body = imgBase64; + var result = WXHttpResponseBLL.WeiXinImgPostResponse(shop, url, body, dis_k, dis_t, ext, referer); + return result; + } + + public static string getProductClassify(ShopLoginInfo shop, string goodsName, List goodImgUrlsLst) + { + string boundaryLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + string boundaryStr = "----WebKitFormBoundary"; + for (int i = 0; i < 16; i++) + { + boundaryStr += boundaryLetters[Randomx.GetId(boundaryLetters.Length)]; + } + + string url = "https://store.weixin.qq.com/shop-faas/cgi/common/productClassify?from=B&title=" + GetHtml.UrlEncodeUtf8(goodsName) + "&token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + + string body = @"--" + boundaryStr + @" "; - foreach (var imgFullPath in goodImgUrlsLst) - { - string fileName = imgFullPath.Split('\\').LastOrDefault(); - body += @"Content-Disposition: form-data; name=""file""; filename=""" + fileName + @""" + foreach (var imgFullPath in goodImgUrlsLst) + { + string fileName = imgFullPath.Split('\\').LastOrDefault(); + body += @"Content-Disposition: form-data; name=""file""; filename=""" + fileName + @""" Content-Type: image/jpeg " + imgFullPath + @" --" + boundaryStr; - } - body += @"-- + } + body += @"-- "; - var result = WXHttpResponseBLL.WeiXinUploadResponse(shop, url, body, boundaryStr, referer); - return result; - } + var result = WXHttpResponseBLL.WeiXinUploadResponse(shop, url, body, boundaryStr, referer); + return result; + } - public static string getCategoryOnShelf(ShopLoginInfo shop, List catIdLst, string brandId = "2100000000") - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/product/getCategoryOnShelfV2?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - string body = @"{""catIdList"":[" + string.Join(",", catIdLst) + @"],""brandId"":" + brandId + "}"; - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string getCategoryOnShelf(ShopLoginInfo shop, List catIdLst, string brandId = "2100000000") + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/product/getCategoryOnShelfV2?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + string body = @"{""catIdList"":[" + string.Join(",", catIdLst) + @"],""brandId"":" + brandId + "}"; + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string getMixBrand(ShopLoginInfo shop, string catId = "547591") - { - //{"code":0,"brandRequire":1,"bizuinBrandList":[{"brandId":"10914219","chName":"名圣","enName":"","classificationNo":"14","tradeMarkSymbol":1,"registerDetails":{"registrant":"广州哇晓商贸有限责任公司","registerNo":"88879184","startTime":"1786254874","endTime":"2098915200","isPermanent":false},"applicationDetails":{},"grantType":2,"grantDetails":{"grantCertifications":["1786181562555-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-1512"],"grantLevel":"1","startTime":"0","endTime":"1820332800","isPermanent":false,"brandOwnerType":2},"status":3,"createTime":"1786254883","updateTime":"1786359925","auditInfo":{"auditId":"11736892187","auditStatus":3,"auditTimestamp":1786359925,"submitTimestamp":1786254882},"version":1,"outsideShopType":0,"outsideShopNikename":"","isNewApply":1,"specialQualification":["1786181592374-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-3202"],"innerBrand":{"id":"10914219","name":"名圣","cnName":"名圣","enName":"","group":0,"certificateNumber":"88879184","status":0,"disableScene":0,"brandStoreName":"","brandLevel":1,"remark":"","brandLevelAuditStatus":2,"brandLevelAuditId":"11839403256"}},{"brandId":"10796790","chName":"嘉飞","enName":"","classificationNo":"21","tradeMarkSymbol":1,"registerDetails":{"registrant":"佛山曜叶科技有限公司","registerNo":"32799300","startTime":"1786019090","endTime":"1870732800","isPermanent":false},"applicationDetails":{},"grantType":2,"grantDetails":{"grantCertifications":["1786010853000-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-6420"],"grantLevel":"10001","startTime":"0","endTime":"1798560000","isPermanent":false,"brandOwnerType":2},"status":3,"createTime":"1786010877","updateTime":"1786019115","auditInfo":{"auditId":"11582110870","auditStatus":3,"auditTimestamp":1786019115,"submitTimestamp":1786019104},"version":3,"outsideShopType":0,"outsideShopNikename":"","isNewApply":0,"specialQualification":["1786010862808-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-7538"],"innerBrand":{"id":"10796790","name":"嘉飞","cnName":"嘉飞","enName":"","group":0,"certificateNumber":"32799300","status":0,"disableScene":0,"brandStoreName":"","brandLevel":1,"remark":"","brandLevelAuditStatus":2,"brandLevelAuditId":"8194702850"}}],"mixBrandList":[{"brandId":"10914219","chName":"名圣","enName":"","classificationNo":"14","tradeMarkSymbol":1,"registerDetails":{"registrant":"广州哇晓商贸有限责任公司","registerNo":"88879184","startTime":"1786254874","endTime":"2098915200","isPermanent":false},"applicationDetails":{},"grantType":2,"grantDetails":{"grantCertifications":["1786181562555-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-1512"],"grantLevel":"1","startTime":"0","endTime":"1820332800","isPermanent":false,"brandOwnerType":2},"status":3,"createTime":"1786254883","updateTime":"1786359925","auditInfo":{"auditId":"11736892187","auditStatus":3,"auditTimestamp":1786359925,"submitTimestamp":1786254882},"version":1,"outsideShopType":0,"outsideShopNikename":"","isNewApply":1,"specialQualification":["1786181592374-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-3202"],"innerBrand":{"id":"10914219","name":"名圣","cnName":"名圣","enName":"","group":0,"certificateNumber":"88879184","status":0,"disableScene":0,"brandStoreName":"","brandLevel":1,"remark":"","brandLevelAuditStatus":2,"brandLevelAuditId":"11839403256"}}],"categoryType":1} - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/getMixBrand?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - string body = @"{""categoryId"":""" + catId + @"""}"; - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string getMixBrand(ShopLoginInfo shop, string catId = "547591") + { + //{"code":0,"brandRequire":1,"bizuinBrandList":[{"brandId":"10914219","chName":"名圣","enName":"","classificationNo":"14","tradeMarkSymbol":1,"registerDetails":{"registrant":"广州哇晓商贸有限责任公司","registerNo":"88879184","startTime":"1786254874","endTime":"2098915200","isPermanent":false},"applicationDetails":{},"grantType":2,"grantDetails":{"grantCertifications":["1786181562555-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-1512"],"grantLevel":"1","startTime":"0","endTime":"1820332800","isPermanent":false,"brandOwnerType":2},"status":3,"createTime":"1786254883","updateTime":"1786359925","auditInfo":{"auditId":"11736892187","auditStatus":3,"auditTimestamp":1786359925,"submitTimestamp":1786254882},"version":1,"outsideShopType":0,"outsideShopNikename":"","isNewApply":1,"specialQualification":["1786181592374-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-3202"],"innerBrand":{"id":"10914219","name":"名圣","cnName":"名圣","enName":"","group":0,"certificateNumber":"88879184","status":0,"disableScene":0,"brandStoreName":"","brandLevel":1,"remark":"","brandLevelAuditStatus":2,"brandLevelAuditId":"11839403256"}},{"brandId":"10796790","chName":"嘉飞","enName":"","classificationNo":"21","tradeMarkSymbol":1,"registerDetails":{"registrant":"佛山曜叶科技有限公司","registerNo":"32799300","startTime":"1786019090","endTime":"1870732800","isPermanent":false},"applicationDetails":{},"grantType":2,"grantDetails":{"grantCertifications":["1786010853000-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-6420"],"grantLevel":"10001","startTime":"0","endTime":"1798560000","isPermanent":false,"brandOwnerType":2},"status":3,"createTime":"1786010877","updateTime":"1786019115","auditInfo":{"auditId":"11582110870","auditStatus":3,"auditTimestamp":1786019115,"submitTimestamp":1786019104},"version":3,"outsideShopType":0,"outsideShopNikename":"","isNewApply":0,"specialQualification":["1786010862808-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-7538"],"innerBrand":{"id":"10796790","name":"嘉飞","cnName":"嘉飞","enName":"","group":0,"certificateNumber":"32799300","status":0,"disableScene":0,"brandStoreName":"","brandLevel":1,"remark":"","brandLevelAuditStatus":2,"brandLevelAuditId":"8194702850"}}],"mixBrandList":[{"brandId":"10914219","chName":"名圣","enName":"","classificationNo":"14","tradeMarkSymbol":1,"registerDetails":{"registrant":"广州哇晓商贸有限责任公司","registerNo":"88879184","startTime":"1786254874","endTime":"2098915200","isPermanent":false},"applicationDetails":{},"grantType":2,"grantDetails":{"grantCertifications":["1786181562555-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-1512"],"grantLevel":"1","startTime":"0","endTime":"1820332800","isPermanent":false,"brandOwnerType":2},"status":3,"createTime":"1786254883","updateTime":"1786359925","auditInfo":{"auditId":"11736892187","auditStatus":3,"auditTimestamp":1786359925,"submitTimestamp":1786254882},"version":1,"outsideShopType":0,"outsideShopNikename":"","isNewApply":1,"specialQualification":["1786181592374-oRVwX2XGcQYT_YI7RbfnMdcXF3Cs-3202"],"innerBrand":{"id":"10914219","name":"名圣","cnName":"名圣","enName":"","group":0,"certificateNumber":"88879184","status":0,"disableScene":0,"brandStoreName":"","brandLevel":1,"remark":"","brandLevelAuditStatus":2,"brandLevelAuditId":"11839403256"}}],"categoryType":1} + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/getMixBrand?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + string body = @"{""categoryId"":""" + catId + @"""}"; + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string batchCheckCategoryRelation(ShopLoginInfo shop, long catId) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/product/batchCheckCategoryRelation?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - string body = @"{""categoryIdList"":[" + catId + "]}"; - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string batchCheckCategoryRelation(ShopLoginInfo shop, long catId) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/product/batchCheckCategoryRelation?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + string body = @"{""categoryIdList"":[" + catId + "]}"; + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string addFinderCategoryV2(ShopLoginInfo shop, long catId) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/addFinderCategoryV2?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - string body = @"{""categoryInfo"":{""categories"":[{""id"":""" + catId + @"""}]},""brandIdList"":[],""leafCategoryId"":""" + catId + @""",""reuse"":0,""applyType"":1}"; - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - //{"categoryInfo":{"categories":[{"id":10000257},{"id":10000245},{"id":112888}],"categoryDeposit":"10000.00","isNewApplyCat":true,"licenseGroupList":[{"licenseGroupId":"17","license":{"licenseId":"5","cosIdList":["1768635607165-orc0V2WjFHdNvjNnk967_g14awFw-7487"],"licenseFieldList":[{"key":"audit_license_no","value":"新出发皖字第1027号"},{"key":"audit_license_validty_period","value":"2029-04-30"}],"isReuse":true}}],"ruleVersion":5234,"certificate":[]},"brandIdList":[],"leafCategoryId":112888,"reuse":0,"applyType":"normalApply"} - //{"code":0,"baseResp":{"errcode":0,"errmsg":"ok"},"auditId":"8362856529"} - //string body = @"{""categoryInfo"":{""categories"":[{""id"":10000257},{""id"":10000245},{""id"":112888}],""categoryDeposit"":""10000.00"",""isNewApplyCat"":true,""licenseGroupList"":[{""licenseGroupId"":""17"",""license"":{""licenseId"":""5"",""cosIdList"":[""1768635607165-orc0V2WjFHdNvjNnk967_g14awFw-7487""],""licenseFieldList"":[{""key"":""audit_license_no"",""value"":""新出发皖字第1027号""},{""key"":""audit_license_validty_period"",""value"":""2029-04-30""}],""isReuse"":true}}],""ruleVersion"":5234,""certificate"":[]},""brandIdList"":[],""leafCategoryId"":112888,""reuse"":0,""applyType"":""normalApply""}"; - // request.Referer = "https://store.weixin.qq.com/shop/brandAndCat/category/apply?defaultCategoryIds=%5B%2210000257%22%2C%2210000245%22%2C%22112888%22%5D&source=goods&type=apply"; + public static string addFinderCategoryV2(ShopLoginInfo shop, long catId) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/addFinderCategoryV2?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + string body = @"{""categoryInfo"":{""categories"":[{""id"":""" + catId + @"""}]},""brandIdList"":[],""leafCategoryId"":""" + catId + @""",""reuse"":0,""applyType"":1}"; + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + //{"categoryInfo":{"categories":[{"id":10000257},{"id":10000245},{"id":112888}],"categoryDeposit":"10000.00","isNewApplyCat":true,"licenseGroupList":[{"licenseGroupId":"17","license":{"licenseId":"5","cosIdList":["1768635607165-orc0V2WjFHdNvjNnk967_g14awFw-7487"],"licenseFieldList":[{"key":"audit_license_no","value":"新出发皖字第1027号"},{"key":"audit_license_validty_period","value":"2029-04-30"}],"isReuse":true}}],"ruleVersion":5234,"certificate":[]},"brandIdList":[],"leafCategoryId":112888,"reuse":0,"applyType":"normalApply"} + //{"code":0,"baseResp":{"errcode":0,"errmsg":"ok"},"auditId":"8362856529"} + //string body = @"{""categoryInfo"":{""categories"":[{""id"":10000257},{""id"":10000245},{""id"":112888}],""categoryDeposit"":""10000.00"",""isNewApplyCat"":true,""licenseGroupList"":[{""licenseGroupId"":""17"",""license"":{""licenseId"":""5"",""cosIdList"":[""1768635607165-orc0V2WjFHdNvjNnk967_g14awFw-7487""],""licenseFieldList"":[{""key"":""audit_license_no"",""value"":""新出发皖字第1027号""},{""key"":""audit_license_validty_period"",""value"":""2029-04-30""}],""isReuse"":true}}],""ruleVersion"":5234,""certificate"":[]},""brandIdList"":[],""leafCategoryId"":112888,""reuse"":0,""applyType"":""normalApply""}"; + // request.Referer = "https://store.weixin.qq.com/shop/brandAndCat/category/apply?defaultCategoryIds=%5B%2210000257%22%2C%2210000245%22%2C%22112888%22%5D&source=goods&type=apply"; - return result; - } + return result; + } - /// - /// 申请资质类目前获取类目信息 - /// - /// - /// - /// - public static string getSingleCategoryData(ShopLoginInfo shop, long catId, List catIdLst) - { - var catIds = "[\"" + string.Join("\",\"", catIdLst) + "\"]"; - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/getSingleCategoryData?token=&lang=zh_CN&categoryId=" + catId; - string referer = "https://store.weixin.qq.com/shop/brandAndCat/category/apply?defaultCategoryIds=" + GetHtml.UrlEncodeUtf8(catIds) + "&source=goods&type=apply"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); + /// + /// 申请资质类目前获取类目信息 + /// + /// + /// + /// + public static string getSingleCategoryData(ShopLoginInfo shop, long catId, List catIdLst) + { + var catIds = "[\"" + string.Join("\",\"", catIdLst) + "\"]"; + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/getSingleCategoryData?token=&lang=zh_CN&categoryId=" + catId; + string referer = "https://store.weixin.qq.com/shop/brandAndCat/category/apply?defaultCategoryIds=" + GetHtml.UrlEncodeUtf8(catIds) + "&source=goods&type=apply"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); - return result; - } + return result; + } - public static string wxCateAuth(ShopLoginInfo shop, List catIdLst, WXCateAuthParam wxCateAuthParam) - { - var catIds = "[\"" + string.Join("\",\"", catIdLst) + "\"]"; - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/addFinderCategoryV2?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/brandAndCat/category/apply?defaultCategoryIds=" + GetHtml.UrlEncodeUtf8(catIds) + "&source=goods&type=apply"; - string data = JsonHelper.SerializeObject(wxCateAuthParam); - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, data, referer); - return result; - } + public static string wxCateAuth(ShopLoginInfo shop, List catIdLst, WXCateAuthParam wxCateAuthParam) + { + var catIds = "[\"" + string.Join("\",\"", catIdLst) + "\"]"; + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradecategory/cgi/addFinderCategoryV2?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/brandAndCat/category/apply?defaultCategoryIds=" + GetHtml.UrlEncodeUtf8(catIds) + "&source=goods&type=apply"; + string data = JsonHelper.SerializeObject(wxCateAuthParam); + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, data, referer); + return result; + } - public static string genProductShortTitle(ShopLoginInfo shop, WXGetShortTitleParam getShortTitleParam) - { - string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/common/cgi/goods/genProductShortTitle?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - string body = JsonHelper.SerializeObject(getShortTitleParam); - //{"productTitle":"妈妈老年中年阔脚裤冬季秋季时尚牛仔裤","headImgUrls":["https://wst.wxapp.tc.qq.com/160/20304/snscosdownload/SH/reserved/6xykWLEnztKEVU0iahAM7HQ28puCia87zPkvSbFT8Fcia99g2ZNWRdy8licxD6qwsqV4bCicoxwQF9e6jh3qwibgzxuA?token=x5Y29zUxcibCe0pFyoSA8zb1aYVKnIBLkQ8ZUXMcwEq3qYHsko3TDzv2rsL2AfJPd&idx=1&expire=1768211170","https://wst.wxapp.tc.qq.com/160/20304/snscosdownload/SH/reserved/6xykWLEnztKEVU0iahAM7Hbwaw1AboTKxjGsLhJgVreuYNxwyQxrk9RtvCv3XsXSnic9WfBFMAIZYpNgYkWd7VDQ?token=x5Y29zUxcibCe0pFyoSA8zb1aYVKnIBLk4qWUsS2WZiaCjXhZLj0D6PYyddX71qNiat&idx=1&expire=1768211170","https://wst.wxapp.tc.qq.com/160/20304/snscosdownload/SH/reserved/6xykWLEnztKEVU0iahAM7HTa1Ej2xJpy6Ej84arVO7A3vxIDD1XP6ZRVw43OficKLXPcXPUvDNmc8A4lMHCgbic3A?token=x5Y29zUxcibCe0pFyoSA8zb1aYVKnIBLkhejArCiaiaLIEKtvOicA5chibIj1tfELV0Mm&idx=1&expire=1768211170"],"categories":[{"catId":"10000111","catName":"服饰内衣"},{"catId":"10000113","catName":"女装"},{"catId":"10000672","catName":"裤子"},{"catId":"547705","catName":"牛仔裤"}]} - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string genProductShortTitle(ShopLoginInfo shop, WXGetShortTitleParam getShortTitleParam) + { + string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/common/cgi/goods/genProductShortTitle?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + string body = JsonHelper.SerializeObject(getShortTitleParam); + //{"productTitle":"妈妈老年中年阔脚裤冬季秋季时尚牛仔裤","headImgUrls":["https://wst.wxapp.tc.qq.com/160/20304/snscosdownload/SH/reserved/6xykWLEnztKEVU0iahAM7HQ28puCia87zPkvSbFT8Fcia99g2ZNWRdy8licxD6qwsqV4bCicoxwQF9e6jh3qwibgzxuA?token=x5Y29zUxcibCe0pFyoSA8zb1aYVKnIBLkQ8ZUXMcwEq3qYHsko3TDzv2rsL2AfJPd&idx=1&expire=1768211170","https://wst.wxapp.tc.qq.com/160/20304/snscosdownload/SH/reserved/6xykWLEnztKEVU0iahAM7Hbwaw1AboTKxjGsLhJgVreuYNxwyQxrk9RtvCv3XsXSnic9WfBFMAIZYpNgYkWd7VDQ?token=x5Y29zUxcibCe0pFyoSA8zb1aYVKnIBLk4qWUsS2WZiaCjXhZLj0D6PYyddX71qNiat&idx=1&expire=1768211170","https://wst.wxapp.tc.qq.com/160/20304/snscosdownload/SH/reserved/6xykWLEnztKEVU0iahAM7HTa1Ej2xJpy6Ej84arVO7A3vxIDD1XP6ZRVw43OficKLXPcXPUvDNmc8A4lMHCgbic3A?token=x5Y29zUxcibCe0pFyoSA8zb1aYVKnIBLkhejArCiaiaLIEKtvOicA5chibIj1tfELV0Mm&idx=1&expire=1768211170"],"categories":[{"catId":"10000111","catName":"服饰内衣"},{"catId":"10000113","catName":"女装"},{"catId":"10000672","catName":"裤子"},{"catId":"547705","catName":"牛仔裤"}]} + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string getFreightTemplate(ShopLoginInfo shop) - { - string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/express/cgi/goods/getFreightTemplate?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); - return result; - } + public static string getFreightTemplate(ShopLoginInfo shop) + { + string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/express/cgi/goods/getFreightTemplate?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); + return result; + } - /// - /// 取售后地址 - /// - /// - /// - public static string getAddress(ShopLoginInfo shop, string searchText = "") - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeexpress/cgi/getAddress?token=&lang=zh_CN"; - if (!string.IsNullOrEmpty(searchText)) - url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeexpress/cgi/getAddress?searchStr=" + GetHtml.UrlEncodeUtf8(searchText) + "&token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); - return result; - } + /// + /// 取售后地址 + /// + /// + /// + public static string getAddress(ShopLoginInfo shop, string searchText = "") + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeexpress/cgi/getAddress?token=&lang=zh_CN"; + if (!string.IsNullOrEmpty(searchText)) + url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeexpress/cgi/getAddress?searchStr=" + GetHtml.UrlEncodeUtf8(searchText) + "&token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); + return result; + } - public static string getAddressById(ShopLoginInfo shop, string AddressId) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeexpress/cgi/getAddress?offset=0&limit=20&includeBlock=1&addressId=" + AddressId + - "&token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/address/expressAddressMgmt"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); - return result; - } + public static string getAddressById(ShopLoginInfo shop, string AddressId) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeexpress/cgi/getAddress?offset=0&limit=20&includeBlock=1&addressId=" + AddressId + + "&token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/address/expressAddressMgmt"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); + return result; + } - public static string uploadProductDraft(ShopLoginInfo shop, WXUploadProductParam prodParam) - { - string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/common/cgi/goods/uploadProductDraft?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - prodParam.type = 1; - var prodStr = JsonConvert.SerializeObject(prodParam, jsonSetting); - JObject jObj = new JObject(); - jObj.Add("data", prodStr); - string body = JsonHelper.SerializeObject(jObj); - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string uploadProductDraft(ShopLoginInfo shop, WXUploadProductParam prodParam) + { + string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/common/cgi/goods/uploadProductDraft?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + prodParam.type = 1; + var prodStr = JsonConvert.SerializeObject(prodParam, jsonSetting); + JObject jObj = new JObject(); + jObj.Add("data", prodStr); + string body = JsonHelper.SerializeObject(jObj); + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string upProductV2(ShopLoginInfo shop, WXUploadProductParam prodParam) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/upProductV2?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - var prodStr = JsonConvert.SerializeObject(prodParam, jsonSetting); - JObject jObj = new JObject(); - jObj.Add("data", prodStr); - string body = JsonHelper.SerializeObject(jObj); - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string upProductV2(ShopLoginInfo shop, WXUploadProductParam prodParam) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/upProductV2?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + var prodStr = JsonConvert.SerializeObject(prodParam, jsonSetting); + JObject jObj = new JObject(); + jObj.Add("data", prodStr); + string body = JsonHelper.SerializeObject(jObj); + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string checkProductUpload(ShopLoginInfo shop, string productId) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/checkUploadProductDraftStatus?token=&lang=zh_CN&productKey=%7B%22productId%22:" + - productId + "%7D&preview=false"; - string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + productId + "&isUpdateAuditFree=0&source=list_edit&continueEditInfo=" + - "{%22isEditingContinued%22:false,%22lastEditDraftTime%22:0,%22listingTime%22:0}"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); - return result; - } + public static string checkProductUpload(ShopLoginInfo shop, string productId) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/checkUploadProductDraftStatus?token=&lang=zh_CN&productKey=%7B%22productId%22:" + + productId + "%7D&preview=false"; + string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + productId + "&isUpdateAuditFree=0&source=list_edit&continueEditInfo=" + + "{%22isEditingContinued%22:false,%22lastEditDraftTime%22:0,%22listingTime%22:0}"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); + return result; + } - public static string SearchProductUpload(ShopLoginInfo shop, string productId) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/searchProduct?token=&lang=zh_CN&pageSize=20&productStatus[]=-1" + - "&productSource=[1,16,32]&searchSource=1&useNew=true&fromProductManager=1&pageNum=1&status[]=2&spuId=" + productId; - string referer = "https://store.weixin.qq.com/shop/goods/list?currentTab=PRODUCT_STATUS_EDIT"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); - return result; - } + public static string SearchProductUpload(ShopLoginInfo shop, string productId) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/searchProduct?token=&lang=zh_CN&pageSize=20&productStatus[]=-1" + + "&productSource=[1,16,32]&searchSource=1&useNew=true&fromProductManager=1&pageNum=1&status[]=2&spuId=" + productId; + string referer = "https://store.weixin.qq.com/shop/goods/list?currentTab=PRODUCT_STATUS_EDIT"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); + return result; + } - public static string upProductJObjectV2(ShopLoginInfo shop, string prodStr) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/upProductV2?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry"; - //JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - //var prodStr = JsonConvert.SerializeObject(prodParam, jsonSetting); - JObject jObj = new JObject(); - jObj.Add("data", prodStr); - string body = JsonHelper.SerializeObject(jObj); - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string upProductJObjectV2(ShopLoginInfo shop, string prodStr) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/upProductV2?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry"; + //JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + //var prodStr = JsonConvert.SerializeObject(prodParam, jsonSetting); + JObject jObj = new JObject(); + jObj.Add("data", prodStr); + string body = JsonHelper.SerializeObject(jObj); + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - /// - /// 尝试免审 失败 - /// - /// - /// - /// - public static string getEditProductV2(ShopLoginInfo shop, string productId) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/getEditProductV2?token=&lang=zh_CN&productKey=%7B%22productId%22:" + - productId + "%7D&needRealStock=true&preview=false&release=false"; - //url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/getEditProductV2?token=&lang=zh_CN&productKey=%7B%22productId%22:" + - // productId + "%7D&needRealStock=true&preview=false&release=true"; - string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + productId + "&isUpdateAuditFree=0&source=list_edit&continueEditInfo={%22isEditingContinued%22:false,%22lastEditDraftTime%22:0,%22listingTime%22:0}"; - //referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + productId + "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo={%22isEditingContinued%22:true,%22lastEditDraftTime%22:0,%22listingTime%22:0}"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); - return result; - } + /// + /// 尝试免审 失败 + /// + /// + /// + /// + public static string getEditProductV2(ShopLoginInfo shop, string productId) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/getEditProductV2?token=&lang=zh_CN&productKey=%7B%22productId%22:" + + productId + "%7D&needRealStock=true&preview=false&release=false"; + //url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/getEditProductV2?token=&lang=zh_CN&productKey=%7B%22productId%22:" + + // productId + "%7D&needRealStock=true&preview=false&release=true"; + string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + productId + "&isUpdateAuditFree=0&source=list_edit&continueEditInfo={%22isEditingContinued%22:false,%22lastEditDraftTime%22:0,%22listingTime%22:0}"; + //referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + productId + "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo={%22isEditingContinued%22:true,%22lastEditDraftTime%22:0,%22listingTime%22:0}"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); + return result; + } - public static string initUploadPart(ShopLoginInfo shop, string submitJson, string prodId, int time1, int time2) - { - string url = "https://store.weixin.qq.com/shop-faas/mmecnodefiletransfer/filecos/initUploadPart?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + - "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + - "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + - "%22listingTime%22:" + time2 + "}"; - string body = submitJson; //@"{""name"":""goods/10000456038253/2026-01-20/1768887306422/submit.json""}"; - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string initUploadPart(ShopLoginInfo shop, string submitJson, string prodId, int time1, int time2) + { + string url = "https://store.weixin.qq.com/shop-faas/mmecnodefiletransfer/filecos/initUploadPart?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + + "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + + "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + + "%22listingTime%22:" + time2 + "}"; + string body = submitJson; //@"{""name"":""goods/10000456038253/2026-01-20/1768887306422/submit.json""}"; + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string listingAuditFree(ShopLoginInfo shop, WXUploadProductParam prodParam, string prodId, int time1, int time2) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/listingAuditFree?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + - "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + - "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + - "%22listingTime%22:" + time2 + "}"; - JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - var prodStr = JsonConvert.SerializeObject(prodParam, jsonSetting); - JObject jObj = new JObject(); - jObj.Add("data", prodStr); - string body = JsonHelper.SerializeObject(jObj); - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string listingAuditFree(ShopLoginInfo shop, WXUploadProductParam prodParam, string prodId, int time1, int time2) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/listingAuditFree?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + + "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + + "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + + "%22listingTime%22:" + time2 + "}"; + JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + var prodStr = JsonConvert.SerializeObject(prodParam, jsonSetting); + JObject jObj = new JObject(); + jObj.Add("data", prodStr); + string body = JsonHelper.SerializeObject(jObj); + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string listingAuditFree(ShopLoginInfo shop, string prodStr, string prodId, int time1, int time2) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/listingAuditFree?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + - "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + - "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + - "%22listingTime%22:" + time2 + "}"; - JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - JObject jObj = new JObject(); - jObj.Add("data", prodStr); - string body = JsonHelper.SerializeObject(jObj); - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string listingAuditFree(ShopLoginInfo shop, string prodStr, string prodId, int time1, int time2) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeproductcore/cgi/goods/listingAuditFree?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + + "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + + "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + + "%22listingTime%22:" + time2 + "}"; + JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + JObject jObj = new JObject(); + jObj.Add("data", prodStr); + string body = JsonHelper.SerializeObject(jObj); + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string uploadPartBinary(ShopLoginInfo shop, string initFileName, string blobPath, string uploadId, string prodId, int time1, int time2) - { - string boundaryLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; - string boundaryStr = "----WebKitFormBoundary"; - for (int i = 0; i < 16; i++) - { - boundaryStr += boundaryLetters[Randomx.GetId(boundaryLetters.Length)]; - } + public static string uploadPartBinary(ShopLoginInfo shop, string initFileName, string blobPath, string uploadId, string prodId, int time1, int time2) + { + string boundaryLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + string boundaryStr = "----WebKitFormBoundary"; + for (int i = 0; i < 16; i++) + { + boundaryStr += boundaryLetters[Randomx.GetId(boundaryLetters.Length)]; + } - string url = "https://store.weixin.qq.com/shop-faas/mmecnodefiletransfer/filecos/uploadPartBinary?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + - "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + - "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + - "%22listingTime%22:" + time2 + "}"; - string body = @"--" + boundaryStr + @" + string url = "https://store.weixin.qq.com/shop-faas/mmecnodefiletransfer/filecos/uploadPartBinary?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + + "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + + "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + + "%22listingTime%22:" + time2 + "}"; + string body = @"--" + boundaryStr + @" Content-Disposition: form-data; name=""name"" " + initFileName + @" @@ -7462,163 +7508,163 @@ Content-Type: application/octet-stream " + blobPath + @" --" + boundaryStr + @"-- "; - var result = WXHttpResponseBLL.WeiXinUploadResponse(shop, url, body, boundaryStr, referer); - return result; - } + var result = WXHttpResponseBLL.WeiXinUploadResponse(shop, url, body, boundaryStr, referer); + return result; + } - public static string completeUploadPart(ShopLoginInfo shop, string completeJson, string prodId, int time1, int time2) - { - string url = "https://store.weixin.qq.com/shop-faas/mmecnodefiletransfer/filecos/completeUploadPart?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + - "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + - "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + - "%22listingTime%22:" + time2 + "}"; - string body = completeJson; //{"name":"goods/10000466857488/2026-01-20/1768907711117/submit.json","uploadId":"176890774759894589c6096cab2210e0793688fb68b482b766a0387c8667d3280a36385109","etagList":["ade9671ce546efb4cb209f5aa7e5d597"],"partSeqList":[1]} - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string completeUploadPart(ShopLoginInfo shop, string completeJson, string prodId, int time1, int time2) + { + string url = "https://store.weixin.qq.com/shop-faas/mmecnodefiletransfer/filecos/completeUploadPart?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + prodId + + "&isUpdateAuditFree=1&source=list_audit_free&continueEditInfo=" + + "{%22isEditingContinued%22:true,%22lastEditDraftTime%22:" + time1 + "," + + "%22listingTime%22:" + time2 + "}"; + string body = completeJson; //{"name":"goods/10000466857488/2026-01-20/1768907711117/submit.json","uploadId":"176890774759894589c6096cab2210e0793688fb68b482b766a0387c8667d3280a36385109","etagList":["ade9671ce546efb4cb209f5aa7e5d597"],"partSeqList":[1]} + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - /// - /// 添加售后地址 - /// - public static string addAddress(ShopLoginInfo shop, string provinceName, string cityName, string countyName, - string detailInfo, string userName, string telNumber) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeexpress/address/addAddress?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/address/expressAddressMgmt"; - string address = "{\"addressInfo\":{\"provinceName\":\"" + provinceName + - "\",\"cityName\":\"" + cityName + "\",\"countyName\":\"" + countyName + - "\",\"detailInfo\":\"" + detailInfo + "\",\"userName\":\"" + userName + - "\",\"telNumber\":\"" + telNumber + "\",\"location\":{}},\"defaultSend\":0,\"defaultRecv\":0}"; + /// + /// 添加售后地址 + /// + public static string addAddress(ShopLoginInfo shop, string provinceName, string cityName, string countyName, + string detailInfo, string userName, string telNumber) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeexpress/address/addAddress?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/address/expressAddressMgmt"; + string address = "{\"addressInfo\":{\"provinceName\":\"" + provinceName + + "\",\"cityName\":\"" + cityName + "\",\"countyName\":\"" + countyName + + "\",\"detailInfo\":\"" + detailInfo + "\",\"userName\":\"" + userName + + "\",\"telNumber\":\"" + telNumber + "\",\"location\":{}},\"defaultSend\":0,\"defaultRecv\":0}"; - JObject obj = new JObject(); - obj["data"] = address; - string body = JsonHelper.SerializeObject(obj); - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + JObject obj = new JObject(); + obj["data"] = address; + string body = JsonHelper.SerializeObject(obj); + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - /// - /// 获取服务接口到期时间 - /// - /// - /// - public static string GetApiServiceList(ShopLoginInfo shop) - { + /// + /// 获取服务接口到期时间 + /// + /// + /// + public static string GetApiServiceList(ShopLoginInfo shop) + { - string url = "https://store.weixin.qq.com/shop-faas/mmecnodeservicemarket/service/GetMyServiceList?offset=0&limit=20&status=2&token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/servicemarket/myServices?status=2"; - var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); - return result; - } + string url = "https://store.weixin.qq.com/shop-faas/mmecnodeservicemarket/service/GetMyServiceList?offset=0&limit=20&status=2&token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/servicemarket/myServices?status=2"; + var result = WXHttpResponseBLL.WeiXinGetResponse(shop, url, referer); + return result; + } - /// - /// 店铺首页获取参数,包括是否开通优选联盟 - /// - /// - /// - public static string GetAndUpdateWebStatus(ShopLoginInfo shop) - { - string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradehome/home/getAndUpdateWebStatus?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/home"; - string body = @"{""timeQuery"":{""startMs"":" + BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now.Date.AddDays(-1)) + - @",""endMs"":" + BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now.Date.AddSeconds(-1)) + @"}}"; - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + /// + /// 店铺首页获取参数,包括是否开通优选联盟 + /// + /// + /// + public static string GetAndUpdateWebStatus(ShopLoginInfo shop) + { + string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradehome/home/getAndUpdateWebStatus?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/home"; + string body = @"{""timeQuery"":{""startMs"":" + BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now.Date.AddDays(-1)) + + @",""endMs"":" + BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now.Date.AddSeconds(-1)) + @"}}"; + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string addLeagueItemForUpdatingProduct(ShopLoginInfo shop, int itemSwitch, int itemRatio, int headSupplierItemSwitch, int HeadSupplierItemRatio, long prodId, int updType = 2) - { - string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/common/cgi/goods/addLeagueItemForUpdatingProduct?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/home"; - string body = @"{""itemSwitch"":" + itemSwitch + @",""itemRatio"":" + itemRatio + @",""headSupplierPublicItemSwitch"":" + headSupplierItemSwitch + - @",""headSupplierPublicItemServiceRatio"":" + HeadSupplierItemRatio + @",""productId"":" + prodId + @",""scene"":2,""updType"":" + updType + @"}"; - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } + public static string addLeagueItemForUpdatingProduct(ShopLoginInfo shop, int itemSwitch, int itemRatio, int headSupplierItemSwitch, int HeadSupplierItemRatio, long prodId, int updType = 2) + { + string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/common/cgi/goods/addLeagueItemForUpdatingProduct?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/home"; + string body = @"{""itemSwitch"":" + itemSwitch + @",""itemRatio"":" + itemRatio + @",""headSupplierPublicItemSwitch"":" + headSupplierItemSwitch + + @",""headSupplierPublicItemServiceRatio"":" + HeadSupplierItemRatio + @",""productId"":" + prodId + @",""scene"":2,""updType"":" + updType + @"}"; + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } - public static string generalProductInfoRecommend(ShopLoginInfo shop, WXUploadProductInfoRecommendParam recommendParam) - { - string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/aiRecommendCompat/cgi/goods/generalProductInfoRecommend?token=&lang=zh_CN"; - string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + recommendParam.productId + "&isUpdateAuditFree=0&source=list_edit&continueEditInfo={%22isEditingContinued%22:false,%22lastEditDraftTime%22:0,%22listingTime%22:0}"; - JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - string body = JsonConvert.SerializeObject(recommendParam, jsonSetting); - var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); - return result; - } - } + public static string generalProductInfoRecommend(ShopLoginInfo shop, WXUploadProductInfoRecommendParam recommendParam) + { + string url = "https://store.weixin.qq.com/shop-faas/mmecnodeproductupload/aiRecommendCompat/cgi/goods/generalProductInfoRecommend?token=&lang=zh_CN"; + string referer = "https://store.weixin.qq.com/shop/goods/entry?productId=" + recommendParam.productId + "&isUpdateAuditFree=0&source=list_edit&continueEditInfo={%22isEditingContinued%22:false,%22lastEditDraftTime%22:0,%22listingTime%22:0}"; + JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + string body = JsonConvert.SerializeObject(recommendParam, jsonSetting); + var result = WXHttpResponseBLL.WeiXinPostResponse(shop, url, body, referer); + return result; + } + } - public class AddPriceRule - { - /// - /// 加价金额区间大于 不包含 - /// - public decimal MoreThanPrice { get; set; } - /// - /// 加价金额区间小于 包含 - /// - public decimal LessThanPrice { get; set; } - /// - /// 加价倍数 - /// - public decimal AddPriceTimes { get; set; } = 2m; - /// - /// 额外加价金额 - /// - public decimal AddMorePrice { get; set; } = 10m; - /// - /// 单买加价 - /// - public decimal SinglePriceAdd { get; set; } = 1m; - /// - /// 先加后乘 - /// - public bool AddMorePriceFirst { get; set; } = false; - /// - /// 上货库存量设置 - /// - public int StockNum { get; set; } = 999; - public bool IsStepAddPrice { get; set; } = false; - /// - /// 运费倍率 - /// - public decimal ShippingPriceTimes { get; set; } = 1.0m; - } + public class AddPriceRule + { + /// + /// 加价金额区间大于 不包含 + /// + public decimal MoreThanPrice { get; set; } + /// + /// 加价金额区间小于 包含 + /// + public decimal LessThanPrice { get; set; } + /// + /// 加价倍数 + /// + public decimal AddPriceTimes { get; set; } = 2m; + /// + /// 额外加价金额 + /// + public decimal AddMorePrice { get; set; } = 10m; + /// + /// 单买加价 + /// + public decimal SinglePriceAdd { get; set; } = 1m; + /// + /// 先加后乘 + /// + public bool AddMorePriceFirst { get; set; } = false; + /// + /// 上货库存量设置 + /// + public int StockNum { get; set; } = 999; + public bool IsStepAddPrice { get; set; } = false; + /// + /// 运费倍率 + /// + public decimal ShippingPriceTimes { get; set; } = 1.0m; + } - public class WXUploadRule - { - public int PreSaleDays { get; set; } = 5; + public class WXUploadRule + { + public int PreSaleDays { get; set; } = 5; - public string FilterWords { get; set; } = "顶级,之王,二手,亏本,冲量,白菜价,跳楼价,xx,xxx,最大,最小,低价,降价,成本,赔钱,甩卖,真丝,蚕丝,香云纱,羊绒,羊毛,羊羔绒,羊羔毛,羽绒,皮草"; - public bool IsSkipHasFilterWordsProd { get; set; } = false; + public string FilterWords { get; set; } = "顶级,之王,二手,亏本,冲量,白菜价,跳楼价,xx,xxx,最大,最小,低价,降价,成本,赔钱,甩卖,真丝,蚕丝,香云纱,羊绒,羊毛,羊羔绒,羊羔毛,羽绒,皮草"; + public bool IsSkipHasFilterWordsProd { get; set; } = false; - public int SkuMinPrice { get; set; } = 10; - public int SkuMaxPrice { get; set; } = 9999; + public int SkuMinPrice { get; set; } = 10; + public int SkuMaxPrice { get; set; } = 9999; - public int WaitSeconds { get; set; } = 10; + public int WaitSeconds { get; set; } = 10; - public bool OnlyHighestPriceSku { get; set; } = false; - public bool OnlyLowestPriceSku { get; set; } = false; - public bool SameSpecSamePriceUp { get; set; } = false; - public bool SameSpecSamePriceDown { get; set; } = false; - public bool SkipUploaded { get; set; } = true; - public bool UpDraft { get; set; } = false; - public bool IsPreSale { get; set; } = false; - public string TitleHeadWords { get; set; } = ""; + public bool OnlyHighestPriceSku { get; set; } = false; + public bool OnlyLowestPriceSku { get; set; } = false; + public bool SameSpecSamePriceUp { get; set; } = false; + public bool SameSpecSamePriceDown { get; set; } = false; + public bool SkipUploaded { get; set; } = true; + public bool UpDraft { get; set; } = false; + public bool IsPreSale { get; set; } = false; + public string TitleHeadWords { get; set; } = ""; - public bool IsSaveBound { get; set; } = false; - public int FilterBoundMinSave { get; set; } = 1000; - public int FilterBoundMaxSave { get; set; } = 1000; - public bool IsAiShortTitle { get; set; } = false; - public bool IsUseWXComplateProd { get; set; } + public bool IsSaveBound { get; set; } = false; + public int FilterBoundMinSave { get; set; } = 1000; + public int FilterBoundMaxSave { get; set; } = 1000; + public bool IsAiShortTitle { get; set; } = false; + public bool IsUseWXComplateProd { get; set; } - /// - /// 上海仓退货 - /// - public bool IsUseShanghaiReturnOrderAddress { get; set; } = false; - } + /// + /// 上海仓退货 + /// + public bool IsUseShanghaiReturnOrderAddress { get; set; } = false; + } }