/// <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;
            }));
        }
Example #2
0
        /// <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;
            })));
        }
Example #3
0
        /// <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);
        }
Example #4
0
 /// <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;
 }
Example #5
0
        /// <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());
        }