850 lines
40 KiB
C#
850 lines
40 KiB
C#
using AllBase;
|
||
using AllBase.Model.Result;
|
||
using NaiBa.Util.Extension;
|
||
using Newtonsoft.Json;
|
||
using Newtonsoft.Json.Linq;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using Work.DouyinApiClass;
|
||
|
||
namespace Work.BLL.Upload
|
||
{
|
||
public class UploadPropertyBLL
|
||
{
|
||
/// <summary>
|
||
/// 是否模糊匹配属性选项
|
||
/// </summary>
|
||
public static bool IsFuzzyMatching = false;
|
||
|
||
public static string getCatePropertyInterface(string c3, ShopLoginInfo shop, ProductCollectBase pc)
|
||
{
|
||
//string url = "https://fxg.jinritemai.com/product/tproduct/formatTpl?category_leaf_id=" + c3;
|
||
//string htmlx = GetPostTaobaoHtml.UploadTaobao(url, "", true, shop.Cookies);
|
||
DouyinApi api = new DouyinApi(shop);
|
||
api.JsonData = new Dictionary<string, string>();
|
||
api.JsonData.Add("category_leaf_id", c3);
|
||
string result = api.GetCateProperty();
|
||
return result;
|
||
}
|
||
|
||
public CatePropertyResponseInfo getCatePropertyInterfaceV2(string c3, ShopLoginInfo shop)
|
||
{
|
||
DouyinApi api = new DouyinApi(shop);
|
||
api.JsonData = new Dictionary<string, string>();
|
||
api.JsonData.Add("category_leaf_id", c3);
|
||
string html = api.GetCatePropertyV2();
|
||
if (html.Contains("access_token已过期"))
|
||
{
|
||
shop.ApiAuthStatus = "未授权";
|
||
}
|
||
|
||
if (!html.Contains("\"required\""))
|
||
{
|
||
//return "";
|
||
}
|
||
|
||
CatePropertyResponseInfo cateProperyInfo;
|
||
try
|
||
{
|
||
cateProperyInfo = JsonConvert.DeserializeObject<CatePropertyResponseInfo>(html);
|
||
return cateProperyInfo;
|
||
}
|
||
catch
|
||
{
|
||
cateProperyInfo = new CatePropertyResponseInfo();
|
||
}
|
||
return cateProperyInfo;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据服务端返回的类目属性要求分析获取属性字段
|
||
/// </summary>
|
||
/// <param name="cateProperyInfo"></param>
|
||
/// <param name="shop"></param>
|
||
/// <param name="pcb"></param>
|
||
/// <returns></returns>
|
||
public string GetCatePropertyAnalysis(CatePropertyResponseInfo cateProperyInfo, ShopLoginInfo shop, ProductCollectBase pcb)
|
||
{
|
||
if (cateProperyInfo?.data?.data == null)
|
||
{
|
||
return "{}";
|
||
}
|
||
|
||
//if (property == null || !property.Contains("货号"))
|
||
// property = "货号|" + from_name + p.from_id.ToString() + "^" + property;
|
||
|
||
// 拆分拼多多属性中含 "/" 的集合属性,如 "key":"衣长/袖长","value":"常规款/短袖"
|
||
var props = pcb.Prop.Where(p => p.Key.Contains("/")).ToList();
|
||
foreach (var pr in props)
|
||
{
|
||
var prKeys = pr.Key.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
|
||
var prValues = pr.Value.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
|
||
if (prKeys.Length == prValues.Length)
|
||
{
|
||
for (int j = 0; j < prKeys.Length; j++)
|
||
{
|
||
pcb.Prop.Add(new KeyValueBase() { Key = prKeys[j], Value = prValues[j] });
|
||
}
|
||
pcb.Prop.Remove(pr);
|
||
}
|
||
}
|
||
|
||
Dictionary<string, List<product_format_new_item>> dicProp = new Dictionary<string, List<product_format_new_item>>();
|
||
string html = "";
|
||
|
||
for (int i = 0; i < cateProperyInfo.data.data.Count; i++)
|
||
{
|
||
string pName = "";
|
||
string pId = "0";
|
||
var douyinProp = cateProperyInfo.data.data[i];
|
||
|
||
var upProp = pcb.Prop.Find(pr => pr.Key == douyinProp.property_name);
|
||
if (upProp == null)
|
||
{
|
||
var upProps = pcb.Prop.Where(pr => UpProperty2DouyinPropertyNameConverter(pr.Key, douyinProp.property_name) == douyinProp.property_name).ToList();
|
||
upProp = upProps?.Find(pr => UpProperty2DouyinPropertyValueConverter(pr.Value, douyinProp.options).Count > 0);
|
||
if (upProp == null)
|
||
upProp = upProps?.FirstOrDefault();
|
||
}
|
||
|
||
var options = "";
|
||
if (douyinProp.options?.FirstOrDefault() != null)
|
||
options = string.Join(",", douyinProp.options?.Select(o => o.name));
|
||
var x = html;
|
||
|
||
#region 优先单独处理特殊属性
|
||
if (douyinProp.property_name == "品牌")
|
||
{
|
||
if (pcb.Prop.Any(pr => pr.Key == "品牌") && pcb.Prop.Any(pr => pr.Key == "品牌编号"))
|
||
pName = pcb.Prop.FirstOrDefault(pr => pr.Key == "品牌").Value;
|
||
else if (douyinProp.required)
|
||
pName = "无品牌";
|
||
|
||
if (!string.IsNullOrEmpty(pName))
|
||
{
|
||
html += "^品牌|" + pName;
|
||
}
|
||
goto GetNextProperty;
|
||
}
|
||
if (douyinProp.property_name == "型号")
|
||
{
|
||
if (!douyinProp.required && (upProp == null || upProp.Value?.Length < 4))
|
||
continue;
|
||
|
||
upProp = pcb.Prop.FirstOrDefault(pr => pr.Key == "型号" && pr.Value != "缺省");
|
||
if (upProp != null)
|
||
{
|
||
pName = upProp.Value;
|
||
}
|
||
else
|
||
{
|
||
pName = Randomx.GetWord(2) + "-" + Randomx.GetNumber(Randomx.GetId(3, 6));
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(pName))
|
||
{
|
||
var op = douyinProp.options.Find(o => o.name == pName);
|
||
if (op != null)
|
||
{
|
||
pId = op.value;
|
||
}
|
||
else if (douyinProp.diy_type == 1)
|
||
{
|
||
pName = "$diy$" + pName;
|
||
}
|
||
|
||
html += "^型号|" + pName;
|
||
}
|
||
goto GetNextProperty;
|
||
}
|
||
if (douyinProp.property_name == "适用型号" && douyinProp.required)
|
||
{
|
||
upProp = pcb.Prop.FirstOrDefault(pr => pr.Key.Contains("适用型号") && pr.Value != "缺省");
|
||
if (upProp != null)
|
||
pName = upProp.Value;
|
||
else
|
||
pName = Randomx.GetWord(Randomx.GetId(2, 5)) + "-" + Randomx.GetNumber(Randomx.GetId(3, 8));
|
||
|
||
if (!string.IsNullOrEmpty(pName))
|
||
{
|
||
html += "^适用型号|" + pName;
|
||
}
|
||
goto GetNextProperty;
|
||
}
|
||
if (douyinProp.property_name == "产地" && (upProp == null || douyinProp.options?.FirstOrDefault(o => o.name == upProp.Value) == null))
|
||
{
|
||
if (!douyinProp.required)
|
||
continue;
|
||
|
||
if (douyinProp.options.Count > 0)
|
||
{
|
||
var op = douyinProp.options.Find(o => o.name == "中国大陆");
|
||
if (op == null)
|
||
{
|
||
upProp = pcb.Prop.FirstOrDefault(p => p.Key.Contains("产地") && p.Key != "产地");
|
||
if (upProp != null)
|
||
op = douyinProp.options?.FirstOrDefault(o => o.name == upProp.Value);
|
||
}
|
||
if (op != null)
|
||
{
|
||
pId = op.value;
|
||
pName = op.name;
|
||
html += "^产地|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
}
|
||
if (douyinProp.property_name == "单果重量")
|
||
{
|
||
// 水果生鲜直接上传特例
|
||
if (douyinProp.required && (pcb.main_cat_name.Contains("水果") || pcb.main_cat_name.Contains("生鲜")))
|
||
{
|
||
pName = Randomx.GetId(1, 6) + "00";
|
||
html += "^单果重量|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
if (douyinProp.property_name == "单果重量(g)")
|
||
{
|
||
// 水果生鲜直接上传特例
|
||
if (douyinProp.required && (pcb.main_cat_name.Contains("水果") || pcb.main_cat_name.Contains("生鲜")))
|
||
{
|
||
if (html.Contains("单果重量|"))
|
||
pName = BaseRegex.GetMatchRegex(ref html, "单果重量|(\\d{1,10})")[1].Groups[0].ToString();
|
||
else
|
||
pName = Randomx.GetId(1, 6) + "00";
|
||
html += "^单果重量(g)|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
if (douyinProp.property_name == "包装方式")
|
||
{
|
||
// 水果生鲜直接上传特例
|
||
if (douyinProp.required && (pcb.main_cat_name.Contains("水果") || pcb.main_cat_name.Contains("生鲜")) && douyinProp.options.Any(o => o.name == "食用农产品"))
|
||
{
|
||
var op = douyinProp.options.Find(o => o.name == "食用农产品");
|
||
pId = op.value;
|
||
pName = "食用农产品";
|
||
html += "^包装方式|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
if (douyinProp.property_name == "品质认证")
|
||
{
|
||
// 水果生鲜、茶叶、食品保健直接上传特例(选无认证不用填认证证书)
|
||
if (douyinProp.required && (pcb.main_cat_name.Contains("水果") || pcb.main_cat_name.Contains("生鲜")
|
||
|| pcb.main_cat_name.Contains("茶") || pcb.main_cat_name.Contains("食品保健"))
|
||
&& douyinProp.options.Any(o => o.name == "无认证" || o.name == "无认证认证"))
|
||
{
|
||
var op = douyinProp.options.Find(o => o.name == "无认证" || o.name == "无认证认证");
|
||
pId = op.value;
|
||
pName = op.name;
|
||
html += "^品质认证|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
if (douyinProp.property_name == "贮存条件")
|
||
{
|
||
if (upProp == null)
|
||
upProp = pcb.Prop.Find(pr => pr.Key == "储藏方法");
|
||
PropertiesValuesBase op = null;
|
||
if (upProp != null)
|
||
op = douyinProp.options.FirstOrDefault(o => upProp.Value.Contains(o.name));
|
||
else
|
||
op = douyinProp.options.FirstOrDefault(o => o.name == "常温");
|
||
if (op == null)
|
||
op = douyinProp.options.FirstOrDefault();
|
||
if (op != null)
|
||
{
|
||
pId = op.value;
|
||
pName = op.name;
|
||
}
|
||
if (pName != null)
|
||
html += "^贮存条件|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
if (douyinProp.property_name == "食品生产许可证编号")
|
||
{
|
||
var qualify = pcb.qualifications?.FirstOrDefault(q => douyinProp.property_name.Contains(q.quality_name));
|
||
if (qualify != null)
|
||
{
|
||
pName = qualify.quality_number;
|
||
html += "^食品生产许可证编号|" + pName;
|
||
}
|
||
else if (!string.IsNullOrEmpty(upProp?.Value))
|
||
{
|
||
pName = upProp.Value;
|
||
html += "^食品生产许可证编号|" + pName;
|
||
}
|
||
goto GetNextProperty;
|
||
}
|
||
if (douyinProp.property_name.Contains("是否为有机食品"))
|
||
{
|
||
var op = douyinProp.options.FirstOrDefault(o => o.name == "否");
|
||
if (op == null)
|
||
op = douyinProp.options.LastOrDefault();
|
||
|
||
pId = op.value;
|
||
pName = op.name.Trim();
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
if (douyinProp.property_name == "是否有导购视频")
|
||
{
|
||
var op = douyinProp.options.FirstOrDefault(o => o.name == "否");
|
||
if (op == null)
|
||
continue;
|
||
|
||
pId = op.value;
|
||
pName = op.name.Trim();
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
if (douyinProp.property_name == "单件净含量")
|
||
{
|
||
if (upProp == null && douyinProp.type == "text")
|
||
{
|
||
upProp = pcb.Prop.FirstOrDefault(p => p.Key == "净含量");
|
||
}
|
||
}
|
||
if (douyinProp.property_name == "茶种类")
|
||
{
|
||
if (upProp == null)
|
||
{
|
||
var op = douyinProp.options.FirstOrDefault(o => pcb.name.Contains(o.name));
|
||
if (op == null)
|
||
continue;
|
||
|
||
pId = op.value;
|
||
pName = op.name.Trim();
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
if (douyinProp.property_name == "生产企业名称")
|
||
{
|
||
}
|
||
if (douyinProp.property_name == "糕点种类" && !douyinProp.required)
|
||
{
|
||
}
|
||
if (douyinProp.property_name == "特产品类" && !douyinProp.required)
|
||
{
|
||
}
|
||
if (douyinProp.property_name == "款式")
|
||
{
|
||
}
|
||
if (douyinProp.property_name == "包装方式")
|
||
{
|
||
if (douyinProp.required == true)
|
||
{
|
||
if (upProp == null && pcb.main_cat_name == "家纺家具家装")
|
||
{
|
||
if (douyinProp.options.Count > 0)
|
||
{
|
||
var op = douyinProp.options.LastOrDefault();
|
||
pId = op.value;
|
||
pName = op.name.Replace("/", "%2F");
|
||
html += "^包装方式|" + op.value; // 此处只能用value不能用name
|
||
}
|
||
goto GetNextProperty;
|
||
}
|
||
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 通用属性操作
|
||
if (upProp != null && upProp.Key == "消毒品卫生许可证编号" && !upProp.Value.Contains("消证字"))
|
||
{
|
||
string[] arr = { "粤卫消证字[2012]第1140号", "粤卫消证字[2020]-50-第0144号", "鄂卫消证字(2010)第(0020)号", "(苏)卫消证字(2014)第3210-0036号", "(津)卫消证字(2012)第0408号" };
|
||
upProp.Value = arr[Randomx.GetId(arr.Length)];
|
||
}
|
||
|
||
// 该属性不是必填时,上家总店商品详情没有此属性就跳过
|
||
if (upProp == null && !douyinProp.required)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
#region 处理面料、材质、含量属性
|
||
if (douyinProp.property_name.Contains("面料") ||
|
||
douyinProp.property_name.Contains("材质") ||
|
||
douyinProp.property_name.Contains("含量"))
|
||
{
|
||
// 如果上家没有对应属性,在避免违规的情况下,按照以下规则处理属性填写逻辑
|
||
if (upProp == null)
|
||
{
|
||
// 含量如果有多少多少以下,选多少多少以下
|
||
if (string.IsNullOrEmpty(pName) && douyinProp.property_name.Contains("含量") && douyinProp.options?.FirstOrDefault(o => o.name.Contains("以下")) != null)
|
||
{
|
||
var op = douyinProp.options?.FirstOrDefault(o => o.name.Contains("以下"));
|
||
pId = op.value;
|
||
pName = op.name;
|
||
}
|
||
if (!string.IsNullOrEmpty(pName))
|
||
{
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// 特殊处理成分含量
|
||
if (douyinProp.property_name.Contains("含量") && douyinProp.options?.FirstOrDefault() != null)
|
||
{
|
||
string upPropValue = BaseRegex.GetMatchRegexString(upProp.Value, @"([1-9]\d*\.?\d*)|(0\.\d*[1-9])%");
|
||
if (string.IsNullOrEmpty(upPropValue))
|
||
upPropValue = "0";
|
||
|
||
// 抖音成分含量里居然有不是数值单位的选项,如:棉、聚酯纤维等,将这些选项过滤出去
|
||
var opts = douyinProp.options.Where(o => BaseRegex.GetMatchRegexString(o.name, @"([\w\W]+?)%")?.ParseToDecimal() >= 0).ToList();
|
||
opts = opts.OrderBy(o => BaseRegex.GetMatchRegexString(o.name, @"([\w\W]+?)%")?.ParseToDecimal()).ToList();
|
||
foreach (var op in opts)
|
||
{
|
||
string propValue = BaseRegex.GetMatchRegexString(op.name, @"([\w\W]+?)%");
|
||
if (propValue?.ParseToDecimal() >= upPropValue.ParseToDecimal())
|
||
{
|
||
pId = op.value;
|
||
pName = op.name.Trim();
|
||
break;
|
||
}
|
||
else if (opts.Last(o => o.name != "100%") == op && op.name.Contains("以上") && upPropValue.ParseToDecimal() > propValue?.ParseToDecimal())
|
||
{
|
||
pId = op.value;
|
||
pName = op.name.Trim();
|
||
break;
|
||
}
|
||
}
|
||
if (pName == "")
|
||
{
|
||
var op = douyinProp.options.FirstOrDefault(o => o.name.Contains("以下"));
|
||
if (op == null)
|
||
op = douyinProp.options.FirstOrDefault(o => o.name.Contains("其他"));
|
||
if (op != null)
|
||
{
|
||
pId = op.value;
|
||
pName = op.name.Trim();
|
||
}
|
||
}
|
||
if (!string.IsNullOrEmpty(pName))
|
||
{
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
}
|
||
// 如果上家对应面料、材质、含量属性不存在且没有使用模糊匹配,则直接跳过该属性,不论是否必填
|
||
if ((upProp == null
|
||
|| UpProperty2DouyinPropertyValueConverter(upProp.Value, douyinProp.options).Count == 0)
|
||
&& !IsFuzzyMatching)
|
||
{
|
||
// 属性为字符型且上家不为空的直接填写上家值
|
||
if (string.IsNullOrEmpty(pName) && douyinProp.type == "text")
|
||
{
|
||
if (upProp != null)
|
||
pName = upProp.Value;
|
||
else if (douyinProp.property_name.Contains("材质"))
|
||
pName = "普通材质";
|
||
else if (douyinProp.property_name.Contains("净含量"))
|
||
pName = "<100";
|
||
else if (douyinProp.property_name.Contains("有效成分含量"))
|
||
pName = "<29%";
|
||
else
|
||
pName = "其他/Other";
|
||
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
|
||
// 支持自定义,填写其他
|
||
if (douyinProp.diy_type == 1)
|
||
{
|
||
if (upProp == null || upProp.Value == "其他")
|
||
pName = "$diy$其他/Other";
|
||
else
|
||
pName = "$diy$" + upProp.Value;
|
||
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
continue;
|
||
}
|
||
}
|
||
#region 模糊查找上家商品面料、材质、含量属性
|
||
if (douyinProp.property_name.Contains("面料") || douyinProp.property_name.Contains("材质"))
|
||
{
|
||
if (upProp == null)
|
||
upProp = pcb.Prop.Find(pr => pr.Key.Contains("面料") || pr.Key.Contains("材质"));
|
||
if (upProp == null)
|
||
{
|
||
var op = douyinProp.options?.Find(o => pcb.name.Contains(o.name));
|
||
if (op != null)
|
||
{
|
||
pId = op.value;
|
||
pName = op.name;
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
}
|
||
#endregion
|
||
#endregion
|
||
|
||
if (upProp == null && douyinProp.required && douyinProp.options?.FirstOrDefault() == null)
|
||
{
|
||
if (douyinProp.property_name == "备案/批准文号")
|
||
{
|
||
pName = "";
|
||
}
|
||
if (douyinProp.property_name == "CCC证书编号")
|
||
{
|
||
pName = "";
|
||
}
|
||
if (douyinProp.property_name == "吊牌价")
|
||
{
|
||
pName = (pcb.market_price == 0 ? pcb.price * 2 : pcb.market_price).ToString();
|
||
}
|
||
if (douyinProp.property_name == "保质期")
|
||
{
|
||
pName = "30";
|
||
}
|
||
if (douyinProp.property_name == "生产企业名称")
|
||
{
|
||
//pName = "工厂店"; //pvalue = "清风";
|
||
pName = shop.ShopAccount;
|
||
}
|
||
if (douyinProp.property_name == "上市年份季节")
|
||
{
|
||
pName = DateTime.Now.AddMonths(-3).Year.ToString();
|
||
}
|
||
if (douyinProp.property_name == "毛重") // todo: 这种没有如何处理
|
||
{
|
||
pName = "暂无数据";
|
||
}
|
||
if (douyinProp.property_name == "包装体积")
|
||
{
|
||
pName = "暂无数据";
|
||
}
|
||
//if (string.IsNullOrEmpty(pName))
|
||
// pName = "" + Randomx.GetId(1000, 9999);
|
||
|
||
if (!string.IsNullOrEmpty(pName))
|
||
{
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
|
||
// 上家属性不为空
|
||
if (upProp != null)
|
||
{
|
||
// 抖音类目属性为文本类型时
|
||
if (douyinProp.type == "text")
|
||
{
|
||
pName = upProp.Value;
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
// 抖音类目属性非文本类型且选项为空时
|
||
else if (douyinProp.options?.FirstOrDefault() == null)
|
||
{
|
||
pName = upProp.Value.ToString().Trim();
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
// 抖音类目属性列表数量大于0且与上家匹配时
|
||
else if (UpProperty2DouyinPropertyValueConverter(upProp.Value, douyinProp.options).Count > 0)
|
||
{
|
||
var ops = UpProperty2DouyinPropertyValueConverter(upProp.Value, douyinProp.options);
|
||
foreach (var op in ops)
|
||
{
|
||
pName += op.name + ",";
|
||
pId += op.value + ",";
|
||
}
|
||
pName = pName.Trim(',');
|
||
pId = pId.Trim(',');
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
// 模糊匹配时去找类似的选项
|
||
else if (douyinProp.required && IsFuzzyMatching &&
|
||
douyinProp.options?.FirstOrDefault(o => upProp.Value.Contains(o.name) && o.name.Length > upProp.Value.Length / 2M) != null)
|
||
{
|
||
var optionsTemp = douyinProp.options?.Where(o => upProp.Value.Contains(o.name) && o.name.Length > upProp.Value.Length / 2M).ToList();
|
||
if (optionsTemp.Count > 1)
|
||
optionsTemp = optionsTemp.Take(1).ToList();
|
||
foreach (var op in optionsTemp)
|
||
{
|
||
pId = op.value;
|
||
pName += op.name + ",";
|
||
if (douyinProp.type != "multi_select")
|
||
break;
|
||
}
|
||
pName = pName.Trim(',');
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
|
||
if (upProp == null && douyinProp.required)
|
||
{
|
||
if (douyinProp.options?.FirstOrDefault() != null)
|
||
{
|
||
var op = douyinProp.options.FirstOrDefault(o => o.name.Contains("其他") ||
|
||
o.name.Contains("不限") ||
|
||
o.name.Contains("默认") ||
|
||
o.name.Contains("通用") ||
|
||
o.name.Contains("中性") ||
|
||
o.name.Contains("缺省"));
|
||
if (op != null)
|
||
{
|
||
pName = op.name.ToString().Trim();
|
||
pId = op.value;
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 前面都未能成功匹配
|
||
if (pName == "" && douyinProp.required)
|
||
{
|
||
if (douyinProp.property_name == "测量功能")
|
||
{
|
||
var op = douyinProp.options?.Find(o => pcb.name.Contains(o.name));
|
||
}
|
||
if (douyinProp.property_name == "图案")
|
||
{
|
||
var op = douyinProp.options?.Find(o => pcb.name.Contains(o.name.Replace("图案", "")));
|
||
if (op != null)
|
||
{
|
||
pName = op.name.ToString().Trim();
|
||
pId = op.value;
|
||
goto GetNextProperty;
|
||
}
|
||
}
|
||
// 是否可以随意填写值
|
||
if (douyinProp.diy_type == 1)
|
||
{
|
||
if (upProp != null && upProp.Value != "其他" && upProp.Value != "其他/other")
|
||
pName = "$diy$" + upProp.Value;
|
||
else if (douyinProp.property_name == "适用年龄")
|
||
pName = "$diy$通用";
|
||
else if (douyinProp.property_name == "植物品种")
|
||
{
|
||
int subIndex = Randomx.GetId(15, 20);
|
||
var subText = pcb.name.Length > subIndex ? pcb.name.Substring(0, subIndex) : pcb.name;
|
||
pName = "$diy$" + subText;
|
||
}
|
||
else
|
||
pName = "$diy$其他/Other";
|
||
}
|
||
else
|
||
if (douyinProp.type == "text")
|
||
{
|
||
if (douyinProp.property_name == "产品名称")
|
||
pName = pcb.name;
|
||
if (douyinProp.property_name == "连接方式" || douyinProp.property_name == "兼容平台")
|
||
pName = "其他/Other";
|
||
else
|
||
pName = "通用";
|
||
}
|
||
else
|
||
if (douyinProp.options?.FirstOrDefault() != null)
|
||
{
|
||
if (upProp != null)
|
||
{
|
||
var ops = douyinProp.options.Where(o => ("," + upProp.Value + ",").Contains("," + o.name + ",")).ToList();
|
||
if (ops.Count > 0)
|
||
{
|
||
pName = pId = "";
|
||
foreach (var op in ops)
|
||
{
|
||
pName += op.name + ",";
|
||
pId += op.value + ",";
|
||
}
|
||
pName = pName.Trim(',');
|
||
pId = pId.Trim(',');
|
||
}
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(pName))
|
||
{
|
||
var op = douyinProp.options.Find(o => o.name == "正常规格");
|
||
if (op == null && douyinProp.property_name == "适用年龄")
|
||
{
|
||
op = douyinProp.options.Last(o => o.name.Contains("周岁"));
|
||
}
|
||
if (op == null)
|
||
op = douyinProp.options[Randomx.GetId(douyinProp.options.Count - 1)];
|
||
pName = op.name.ToString().Trim();
|
||
pId = op.value;
|
||
}
|
||
}
|
||
if (!string.IsNullOrEmpty(pName))
|
||
html += "^" + douyinProp.property_name + "|" + pName;
|
||
else
|
||
continue;
|
||
}
|
||
|
||
GetNextProperty:;
|
||
|
||
if (!string.IsNullOrEmpty(pName))
|
||
{
|
||
var pNames = pName.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
||
var pIds = pId.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
||
|
||
dicProp[douyinProp.property_id.ToString()] = new List<product_format_new_item>();
|
||
for (int j = 0; j < pIds.Length; j++)
|
||
{
|
||
var formatItem = new product_format_new_item
|
||
{
|
||
diy_type = pNames[j].StartsWith("$diy$") ? 1 : 0,
|
||
name = pNames[j].Replace("$diy$", ""),
|
||
value = pIds[j].ParseToLong()
|
||
};
|
||
dicProp[douyinProp.property_id.ToString()].Add(formatItem);
|
||
}
|
||
}
|
||
#endregion
|
||
}
|
||
var result = html.Replace("^^", "^").Trim('^').Replace("/", "\\/").Replace("$diy$", "");
|
||
//return result;
|
||
var resultNew = JsonHelper.SerializeObject(dicProp).Replace("\"", "\\\"");
|
||
return resultNew;
|
||
}
|
||
|
||
public string UpProperty2DouyinPropertyNameConverter(string upPropName, string douyinPropName)
|
||
{
|
||
if (dicPropNameConverter.Keys.Contains(upPropName))
|
||
{
|
||
if (("," + dicPropNameConverter[upPropName] + ",").Contains("," + douyinPropName + ","))
|
||
return douyinPropName;
|
||
}
|
||
return upPropName;
|
||
}
|
||
|
||
Dictionary<string, string> dicPropNameConverter { get; } = new Dictionary<string, string>() {
|
||
{ "主材质", "材质" },
|
||
{ "拍杆材质", "材质" },
|
||
{ "外壳材质", "材质" },
|
||
{ "材质种类", "材质" },
|
||
{ "面料分类", "材质" },
|
||
{ "材质成分", "面料材质,面料材质成分含量,材质"},
|
||
{ "面料", "面料材质" },
|
||
{ "面料俗称", "面料材质,材质" },
|
||
{ "材质", "面料材质,主材质" },
|
||
{ "被里材质", "被里材质" },
|
||
{ "被里面料俗称", "被里材质" },
|
||
{ "被里材质含量", "被里成分含量" },
|
||
{ "被面材质", "被面材质" },
|
||
{ "被面材质含量", "被面成分含量" },
|
||
{ "成分含量", "面料成分含量" },
|
||
{ "衣柜面料", "饰面材质" },
|
||
{ "饰面面料", "面料材质" },
|
||
{ "鞋面材质", "帮面材质,材质" },
|
||
{ "刷毛材质", "材质" },
|
||
{ "储藏方法", "贮存条件" },
|
||
{ "适用人群", "适用对象" },
|
||
{ "是否支持定制", "是否可定制" },
|
||
{ "清扫模式", "清洁类型" },
|
||
{ "3C认证证书编号", "CCC证书编号" },
|
||
{ "上市时节", "上市年份季节" },
|
||
{ "适用年龄段", "适用年龄" },
|
||
{ "产品类型", "鞋垫种类" },
|
||
{ "杯身材质", "材质" }, // 水杯 水杯女可爱大容量塑料杯可爱学生便携夏季大肚带吸管杯子男高颜值
|
||
{ "净含量", "有效成分含量" },
|
||
{ "续航时间", "电池使用时间"},
|
||
{ "防水级别", "防水等级" },
|
||
{ "绳材质", "材质" },
|
||
{ "内里材质", "填充物种类" },
|
||
};
|
||
|
||
public List<PropertiesValuesBase> UpProperty2DouyinPropertyValueConverter(string upPropName, List<PropertiesValuesBase> options)
|
||
{
|
||
if (options?.Find(o => o.name.ToLower() == upPropName.ToLower()) != null)
|
||
return options.Where(o => o.name.ToLower() == upPropName.ToLower()).ToList();
|
||
if (options?.Find(o => o.name.ToLower() == upPropName.ToLower() + "镶嵌") != null)
|
||
return options.Where(o => o.name.ToLower() == upPropName.ToLower() + "镶嵌").ToList();
|
||
if (dicPropValueConverter.Keys.Contains(upPropName.ToLower()))
|
||
{
|
||
var ops = options.Where(o => ("," + dicPropValueConverter[upPropName.ToLower()] + ",").Contains("," + o.name + ",")).ToList();
|
||
if (ops.Count > 0)
|
||
return ops;
|
||
}
|
||
if (upPropName.Contains("%"))
|
||
{
|
||
string[] strArr = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "." };
|
||
foreach (var item in strArr)
|
||
{
|
||
upPropName = upPropName.Replace(item, "");
|
||
}
|
||
var upPropNames = upPropName.Split(new string[] { "%" }, StringSplitOptions.RemoveEmptyEntries);
|
||
var upPropNameConverted = "";
|
||
foreach (var item in upPropNames)
|
||
{
|
||
if (dicPropValueConverter.Keys.Contains(item.ToLower().Trim()))
|
||
upPropNameConverted += dicPropValueConverter[item.ToLower().Trim()] + ",";
|
||
else
|
||
upPropNameConverted += item.ToLower().Trim() + ",";
|
||
}
|
||
var ops = options.Where(o => ("," + upPropNameConverted.ToLower() + ",").Contains("," + o.name + ",")).ToList();
|
||
|
||
if (ops.Count > 0)
|
||
return ops;
|
||
}
|
||
return new List<PropertiesValuesBase>();
|
||
}
|
||
|
||
Dictionary<string, string> dicPropValueConverter { get; } = new Dictionary<string, string>() {
|
||
{ "人造革", "聚酯纤维" },
|
||
{ "涤纶", "聚酯纤维" },
|
||
{ "丝绵", "聚酯纤维" },
|
||
{ "仿丝棉", "聚酯纤维" },
|
||
{ "涤纶(聚酯纤维)", "聚酯纤维,涤纶" },
|
||
{ "粘胶纤维(粘纤)", "粘胶纤维,粘纤" },
|
||
{ "聚酰胺纤维(锦纶)", "聚酰胺纤维,锦纶" },
|
||
{ "聚氨酯弹性纤维(氨纶),", "聚氨酯弹性纤维,氨纶" },
|
||
{ "记忆棉(聚氨酯)", "记忆棉,聚氨酯" },
|
||
{ "二层牛皮", "牛剖层皮革" },
|
||
{ "二层牛皮(除牛反绒)", "牛剖层皮革"},
|
||
{ "超纤皮", "牛剖层皮革" },
|
||
{ "pu", "聚氨酯,人造革" },
|
||
{ "吸口滚刷互换式", "滚刷吸口互换" },
|
||
{ "科技布", "涤纶" },
|
||
{ "毛毡" , "聚酯纤维" },
|
||
{ "人造纤维", "仿生纤维毛" },
|
||
{ "925银", "925银镶嵌" },
|
||
{ "绸缎", "丝绸" },
|
||
{ "棉布", "棉" },
|
||
{ "pvc", "PVC(聚氯乙烯)"},
|
||
{ "包芯丝", "尼龙,氨纶"},
|
||
{ "全碳素", "碳纤维" },
|
||
{ "棉麻", "棉,亚麻" },
|
||
{ "帆布", "纺织" },
|
||
{ "天丝(莱赛尔纤维)", "天丝,莱赛尔纤维" },
|
||
{ "天丝", "莱赛尔纤维" },
|
||
{ "eva", "EVA发泡胶" },
|
||
{ "蚕丝", "桑蚕丝" },
|
||
{ "弹力布", "纺织" },
|
||
{ "发泡橡胶", "橡胶发泡" },
|
||
{ "复合底", "橡胶+EVA" },
|
||
{ "冰丝", "粘胶纤维" },
|
||
{ "橡胶", "橡胶底" },
|
||
{ "丁腈", "NBR,nbr"},
|
||
{ "丁腈橡胶", "NBR,nbr"},
|
||
{ "棉", "纺织" },
|
||
};
|
||
}
|
||
|
||
public class product_format_new_item
|
||
{
|
||
public string name { get; set; }
|
||
public long value { get; set; }
|
||
public long diy_type { get; set; }
|
||
}
|
||
}
|