/// <summary> /// 判断是否匹配 /// </summary> public bool IsMatched(ProductMatchParameters parameters, ProductMatchedData data) { // 获取规格的条件 // 格式 [ { PropertyId: ..., PropertyValueId: ... }, ... ] var exceptedProperties = data.Conditions.GetProperties(); if (exceptedProperties == null || !exceptedProperties.Any()) { return(true); // 没有指定条件 } // 判断参数中的规格值列表是否包含条件中的所有规格值 // 例如 参数 { 颜色: 黑色, 尺码: XXS, 款式: 2013 }, 条件 { 颜色: 黑色, 尺码: XXS }时匹配成功 // 参数的格式同上 var incomeProperties = parameters.GetProperties(); if (incomeProperties == null || !incomeProperties.Any()) { return(false); // 有指定条件,但参数中没有包含任何规格值 } var incomePropertiesMapping = new Dictionary <long, long?>(); foreach (var obj in incomeProperties) { incomePropertiesMapping[obj.PropertyId] = obj.PropertyValueId; } return(exceptedProperties.All(obj => { return incomePropertiesMapping.GetOrDefault(obj.PropertyId) == obj.PropertyValueId; })); }
/// <summary> /// 转换到数据库使用的集合 /// </summary> /// <param name="values">编辑后的商品匹配数据列表</param> /// <param name="product">商品</param> /// <returns></returns> public static ISet <ProductMatchedData> ToDatabaseSet( this List <ProductMatchedDataForEdit> values, Database.Product product) { if (values == null) { return(new HashSet <ProductMatchedData>()); } long matchOrder = 0; return(new HashSet <ProductMatchedData>(values.Select(v => { // 部分特殊字段需要手动设置字段中 var data = new ProductMatchedData() { Product = product, Conditions = v.Conditions, Affects = v.Affects, Price = v.Affects.GetOrDefault <decimal?>("Price"), PriceCurrency = v.Affects.GetOrDefault <string>("PriceCurrency"), Weight = v.Affects.GetOrDefault <decimal?>("Weight"), Stock = v.Affects.GetOrDefault <long?>("Stock"), MatchOrder = matchOrder++, Remark = v.Affects.GetOrDefault <string>("Remark") }; return data; }))); }
/// <summary> /// 判断是否匹配 /// </summary> public bool IsMatched(ProductMatchParameters parameters, ProductMatchedData data) { // 获取订购数量的条件 var orderCountGE = data.Conditions.GetOrderCountGE(); if (orderCountGE == null || orderCountGE <= 1) { return(true); // 没有指定条件 } // 判断订购数量是否大于条件中指定的数量 var orderCount = parameters.GetOrderCount(); return(orderCount >= orderCountGE.Value); }
/// <summary> /// 减少匹配数据中的库存 /// 有可能会减到负数但不会失败 /// </summary> /// <param name="matchedData">匹配数据</param> /// <param name="delta">减少值</param> public static void ReduceStock(this ProductMatchedData matchedData, long delta) { matchedData.Stock -= delta; matchedData.Affects["Stock"] = matchedData.Stock; }
/// <summary> /// 获取货币信息 /// 没有设置时返回默认货币信息 /// </summary> /// <param name="data">商品匹配数据</param> /// <returns></returns> public static ICurrency GetCurrency(this ProductMatchedData data) { var currencyManager = Application.Ioc.Resolve <CurrencyManager>(); return(currencyManager.GetCurrency(data.PriceCurrency) ?? currencyManager.GetDefaultCurrency()); }