示例#1
0
        public void Calculate(ref OrderInfo order)
        {
            GetAllSaleGift(ref order);

            #region 给赠品赋税率,运输方式等
            List <int> giftSysNoList = order.GiftItemList.Select(x => x.ProductSysNo).Distinct().ToList <int>();
            List <ProductEntryInfo> allProductEntryInfoList = PipelineDA.GetProductEntryInfo(giftSysNoList);
            foreach (OrderGiftItem giftItem in order.GiftItemList)
            {
                ProductEntryInfo entryInfo = allProductEntryInfoList.Find(f => f.ProductSysNo == giftItem.ProductSysNo);
                if (entryInfo != null)
                {
                    giftItem["ProductStoreType"] = (int)entryInfo.ProductStoreType;
                    //giftItem["TariffRate"] = entryInfo.TariffRate;
                }
                else
                {
                    giftItem["ProductStoreType"] = (int)ProductStoreType.Narmal;
                    // giftItem["TariffRate"] = 0;
                }
            }
            #endregion

            //加价购和赠品都属于赠品,都按赠品获取,之后按销售价格区分拆开
            order.PlusPriceItemList = order.GiftItemList.FindAll(m => m.UnitSalePrice > 0m);
            order.GiftItemList      = order.GiftItemList.FindAll(m => m.UnitSalePrice == 0m);

            PrcessorCustomerSelectGift(ref order);
            PrcessorCustomerSelectPlusPrice(ref order);
        }
示例#2
0
        public bool Validate(OrderInfo order, out string errorMsg)
        {
            if (order.CouponCodeSysNo.HasValue && order.CouponCodeSysNo > 0)
            {
                if (order.SubOrderList == null || order.SubOrderList.Count <= 0)
                {
                    if (order.SOType == (int)SOType.GroupBuy)
                    {
                        errorMsg = LanguageHelper.GetText("团购订单不能使用优惠券", order.LanguageCode);
                        return(false);
                    }
                }
                else if (order.SubOrderList.Any(x => x.Value.SOType == (int)SOType.GroupBuy))
                {
                    errorMsg = LanguageHelper.GetText("团购订单不能使用优惠券", order.LanguageCode);
                    return(false);
                }

                int quantity = PipelineDA.GetCouponCodeUseQuantity(order.CouponCodeSysNo.Value);
                if (quantity == 0)
                {
                    errorMsg = LanguageHelper.GetText("优惠券数量不足", order.LanguageCode);
                    return(false);
                }

                quantity = PipelineDA.CouponSaleRulesExUserQuantity(order.CouponCodeSysNo.Value);
                if (quantity == 0)
                {
                    errorMsg = LanguageHelper.GetText("优惠券数量不足", order.LanguageCode);
                    return(false);
                }
            }
            errorMsg = null;
            return(true);
        }
示例#3
0
        private bool InnerValidate(OrderInfo order, out string errorMsg)
        {
            bool checkCustomerPass = true;

            if (order.Customer == null)
            {
                checkCustomerPass = false;
            }
            else
            {
                bool customerExist = PipelineDA.IsExistCustomer(order.Customer.SysNo);

                if (!customerExist)
                {
                    checkCustomerPass = false;
                }
            }

            if (!checkCustomerPass)
            {
                errorMsg = "您尚未登录或当前用户不存在,请您重新登录后再试";
            }
            else
            {
                errorMsg = null;
            }

            return(checkCustomerPass);
        }
示例#4
0
 public void Persist(OrderInfo order)
 {
     foreach (var subOrder in order.SubOrderList.Values)
     {
         PipelineDA.CreateSOItemGrossProfit(subOrder);
     }
 }
示例#5
0
        public void Persist(OrderInfo order)
        {
            if (order.GiftCardList == null || order.GiftCardList.Count <= 0)
            {
                return;
            }

            foreach (GiftCardInfo giftCardInfo in order.GiftCardList)
            {
                //更新礼品卡信息
                PipelineDA.UpdateGiftCardInfo(giftCardInfo);
            }

            foreach (var kvs in order.SubOrderList)
            {
                OrderInfo subPreOrderInfo = kvs.Value;

                XDocument xDoc = new XDocument(
                    new XElement("Message",
                                 new XElement("Header"
                                              , new XElement("Action", "SOConsume")
                                              , new XElement("Version", "V1")
                                              , new XElement("NameSpace", "http://soa.ECommerce.com/CustomerProfile")
                                              , new XElement("From", "EC")
                                              , new XElement("CurrencySysNo", order["CurrencySysNo"])
                                              , new XElement("Language", "zh-CN")
                                              , new XElement("CompanyCode", "8601")
                                              , new XElement("StoreCompanyCode", "8601")
                                              ),
                                 new XElement("Body"
                                              , new XElement("Memo", "")
                                              , new XElement("EditUser", "WebSite")
                                              )
                                 ));

                int priority = 1;
                foreach (GiftCardInfo giftCardInfo in subPreOrderInfo.GiftCardList)
                {
                    giftCardInfo["SOSysNo"]       = subPreOrderInfo.ID;
                    giftCardInfo["CustomerSysNo"] = subPreOrderInfo.Customer.SysNo;
                    giftCardInfo["CurrencySysNo"] = subPreOrderInfo["CurrencySysNo"];

                    //创建礼品卡使用日志
                    PipelineDA.CreateGiftCardRedeemLog(giftCardInfo);

                    XElement giftCardElement = new XElement("GiftCard");
                    giftCardElement.Add(new XElement("Code", giftCardInfo.Code.Trim()));
                    giftCardElement.Add(new XElement("Priority", priority++));
                    giftCardElement.Add(new XElement("UseAmount", giftCardInfo.UseAmount));
                    giftCardElement.Add(new XElement("CustomerSysno", subPreOrderInfo.Customer.SysNo));
                    giftCardElement.Add(new XElement("ReferenceSOSysNo", subPreOrderInfo.ID));

                    xDoc.Root.Element("Body").Add(giftCardElement);
                }

                //创建礼品卡操作记录
                string xDocMsg = xDoc.ToString();
                PipelineDA.CreateGiftCardOperateLog(xDocMsg);
            }
        }
示例#6
0
        public static FreeShippingConfig GetConfig()
        {
            var config = new FreeShippingConfig();

            config.Rules = PipelineDA.GetFreeShippingConfig();

            return(config);
        }
 public void Persist(OrderInfo order)
 {
     foreach (var subOrder in order.SubOrderList.Values)
     {
         //订单创建实名认证信息
         PipelineDA.CreateSOAuthentication(subOrder);
     }
 }
示例#8
0
        public bool Validate(OrderInfo order, out string errorMsg)
        {
            bool checkResult = PipelineDA.CheckCustomerOrderFrequency(order.Customer.SysNo, TimeSpan.FromMinutes(1));

            if (!checkResult)
            {
                errorMsg = "请不要在1分钟之内重复下单,请到帐户中心查看您的订单。";
                return(checkResult);
            }
            errorMsg = "";
            return(checkResult);
        }
示例#9
0
        /// <summary>
        /// 检查总库存
        /// </summary>
        /// <param name="allOrderItemList"></param>
        /// <param name="errorMsg"></param>
        /// <returns></returns>
        private bool ValidateInventory(List <OrderItem> allOrderItemList, out string errorMsg)
        {
            List <OrderItem> shortageOfStockItemList = new List <OrderItem>();

            if (allOrderItemList != null && allOrderItemList.Count > 0)
            {
                List <int> allOrderItemSysNoList = allOrderItemList.Select(x => x.ProductSysNo).ToList();

                List <ProductSalesInfo> allOrderItemSalesInfoList = PipelineDA.GetProductSalesInfoBySysNoList(allOrderItemSysNoList);

                if (allOrderItemSalesInfoList != null)
                {
                    foreach (var orderItem in allOrderItemList)
                    {
                        var salesInfo = allOrderItemSalesInfoList.Find(x => x.ProductSysNo == orderItem.ProductSysNo);
                        if (salesInfo == null)
                        {
                            shortageOfStockItemList.Add(orderItem);
                        }
                        else
                        {
                            if (salesInfo.OnlineQty < orderItem.UnitQuantity)
                            {
                                shortageOfStockItemList.Add(orderItem);
                            }
                        }
                    }
                }
                else
                {
                    shortageOfStockItemList.AddRange(allOrderItemList);
                }
            }

            StringBuilder msgBuilder = new StringBuilder();

            shortageOfStockItemList.Select(x => string.Format("商品【{0}】库存不足!", x.ProductName))
            .ToList()
            .ForEach(msg =>
            {
                msgBuilder.AppendLine(msg);
            });

            errorMsg = msgBuilder.ToString();

            if (!string.IsNullOrEmpty(errorMsg))
            {
                return(false);
            }

            errorMsg = null;
            return(true);
        }
示例#10
0
        /// <summary>
        /// 计算关税
        /// </summary>
        /// <param name="order"></param>
        private void CalculateTrariffAmount(OrderInfo order, Dictionary <string, List <OrderItem> > dicSubOrderItem)
        {
            OrderInfo subOrderInfo;
            List <ProductEntryInfo> allProductEntryInfoList = null;

            List <int> allItemSysNoList = dicSubOrderItem.SelectMany(kvs => kvs.Value.Select(item => item.ProductSysNo))
                                          .Distinct()
                                          .ToList();

            if (allItemSysNoList.Count > 0)
            {
                allProductEntryInfoList = PipelineDA.GetProductEntryInfo(allItemSysNoList);
            }

            decimal totalTrariffAmountSum    = 0m;
            decimal subOrderTrariffAmountSum = 0m;

            if (allProductEntryInfoList != null && allProductEntryInfoList.Count > 0)
            {
                foreach (var kvs in order.SubOrderList)
                {
                    subOrderInfo             = kvs.Value;
                    subOrderTrariffAmountSum = 0m;

                    //循环计算子单中每个item的关税
                    foreach (var item in dicSubOrderItem[kvs.Key])
                    {
                        CalculateOrderItemTrariffAmount(item, order, subOrderInfo, allProductEntryInfoList);

                        subOrderTrariffAmountSum += item.UnitTaxFee * item.UnitQuantity;
                    }

                    //单笔订单关税金额小于50元的免征关税
                    if (subOrderTrariffAmountSum <= 50m)
                    {
                        subOrderTrariffAmountSum = 0m;
                        dicSubOrderItem[kvs.Key].ForEach(item =>
                        {
                            //满足关税免征条件,给出免征提示,并记录下原始关税计算金额
                            item["Tariff-Free-Flag"] = "1";
                            item.UnitTaxFee          = 0m;
                        });
                    }
                    kvs.Value.TaxAmount    = subOrderTrariffAmountSum;
                    totalTrariffAmountSum += subOrderTrariffAmountSum;
                }
            }

            order.TaxAmount = totalTrariffAmountSum;
        }
        /// <summary>
        /// 计算手续费
        /// </summary>
        /// <param name="order"></param>
        private void CalculateCommissionAmount(OrderInfo order)
        {
            //先计算子单的手续费
            PayTypeInfo payTypeInfo = PipelineDA.GetPayTypeBySysNo(order.PayTypeID);

            order.PayTypeName = payTypeInfo.PayTypeName;

            foreach (KeyValuePair <string, OrderInfo> sub in order.SubOrderList)
            {
                sub.Value.CommissionAmount = decimal.Round(payTypeInfo.PayRate * sub.Value.CashPayAmount, 2, MidpointRounding.AwayFromZero);
                sub.Value.PayTypeName      = payTypeInfo.PayTypeName;
            }

            order.CommissionAmount = order.SubOrderList.Sum(subOrder => subOrder.Value.CommissionAmount);
        }
示例#12
0
        public bool Validate(OrderInfo order, out string errorMsg)
        {
            bool pass = true;

            //先检查订单上的配送地址
            if (order.Contact.AddressAreaID <= 0)
            {
                errorMsg = "请先保存收货人信息!";
                return(false);
            }

            List <ShipTypeInfo> allShipTypeList = PipelineDA.GetAllShippingTypeList();

            //先检查主单
            pass = InnerValidate(order, allShipTypeList, true, out errorMsg);

            if (!pass)
            {
                return(pass);
            }

            //检查拆分后的子单
            if (order.SubOrderList != null && order.SubOrderList.Count > 0)
            {
                OrderInfo subOrder = null;
                foreach (var kvs in order.SubOrderList)
                {
                    subOrder = kvs.Value;
                    pass     = InnerValidate(subOrder, allShipTypeList, false, out errorMsg);
                    if (!pass)
                    {
                        return(pass);
                    }
                }
            }
            //因配送区域删除,所以去掉对商品配送区域的判断
            //errorMsg = CheckShippingType(order);
            if (!string.IsNullOrWhiteSpace(errorMsg))
            {
                return(false);
            }

            errorMsg = null;
            return(true);
        }
示例#13
0
        public void Persist(OrderInfo order)
        {
            // 检查是否来自CMP
            if (!IsFromCMP())
            {
                return;
            }

            // 解析CMP代码
            AnalyseCMPCode();

            // 保存广告跟踪数据
            foreach (var subOrder in order.SubOrderList.Values)
            {
                BuildAdvEffectMonitorInfo(subOrder);
                PipelineDA.CreateAdvEffectMonitor(advEffectMonitor);
            }
        }
        public void Persist(OrderInfo order)
        {
            foreach (var subOrder in order.SubOrderList.Values)
            {
                //创建订单捆绑销售规则
                var dicountDetailGroups = subOrder.DiscountDetailList.Where(x => x.DiscountType == 1 && x.DiscountActivityNo > 0)
                                          .GroupBy(
                    k => new { SaleRuleSysNo = k.DiscountActivityNo, SaleRuleName = k.DiscountActivityName },
                    v => v
                    );

                DTOInfo       dtoInfo  = null;
                StringBuilder note     = new StringBuilder();
                decimal       discount = 0m;
                foreach (var theGroup in dicountDetailGroups)
                {
                    dtoInfo  = new DTOInfo();
                    discount = 0m;
                    note.Clear();
                    foreach (var item in theGroup)
                    {
                        discount += item.UnitDiscount * item.Quantity;
                        note.AppendFormat("{0},{1},{2};", item.Quantity, item.ProductSysNo, (-1) * item.UnitDiscount);
                    }
                    dtoInfo["SOSysNo"]       = subOrder.ID;
                    dtoInfo["SaleRuleSysNo"] = theGroup.Key.SaleRuleSysNo;
                    dtoInfo["SaleRuleName"]  = theGroup.Key.SaleRuleName;
                    dtoInfo["Discount"]      = (-1m) * discount;
                    dtoInfo["Times"]         = 1; //拆单的时候,套餐的折扣信息已经合并,Discount字段记录的即是总折扣
                    dtoInfo["Note"]          = note.ToString();
                    PipelineDA.CreateSalesRuleInfo(dtoInfo);
                }

                //更新优惠券信息
                if (subOrder.CouponCodeSysNo.HasValue && subOrder.CouponCodeSysNo > 0)
                {
                    PipelineDA.CreateSONewPromotionLog(subOrder);
                }
                if (subOrder.MerchantCouponCodeSysNo.HasValue && subOrder.MerchantCouponCodeSysNo > 0)
                {
                    PipelineDA.CreateSONewMerchantPromotionLog(subOrder);
                }
            }
        }
示例#15
0
        public void Persist(OrderInfo order)
        {
            int soSysNo = PipelineDA.GenerateSOSysNo();

            foreach (var subOrder in order.SubOrderList.Values)
            {
                if (subOrder.OrderItemGroupList.Count > 0 &&
                    subOrder.OrderItemGroupList[0].ProductItemList.Count > 0)
                {
                    int quantity = subOrder.OrderItemGroupList[0].Quantity * subOrder.OrderItemGroupList[0].ProductItemList[0].UnitQuantity;
                    while (quantity > 0)
                    {
                        subOrder.ID = soSysNo;
                        PipelineDA.CreateGroupBuyingTicket(subOrder);
                        quantity--;
                    }
                }
            }
        }
示例#16
0
        /// <summary>
        /// 检查是否有不支持的配送区域
        /// </summary>
        /// <param name="order"></param>
        /// <returns></returns>
        private string CheckShippingType(OrderInfo order)
        {
            string shippingErrorMsg = "";

            foreach (var kvs in order.SubOrderList)
            {
                OrderInfo subOrderInfo = kvs.Value;

                List <ProductShippingPrice> ProductSysNoList = PipelineDA.Pipeline_GetAllProductRestrictedAreaByAreaSysNo(subOrderInfo.Contact.AddressAreaID);
                if (ProductSysNoList == null || ProductSysNoList.Count <= 0)
                {
                    shippingErrorMsg = "订单无法配送到您选择的送货区域,请重新选择!";
                    break;
                }
                else
                {
                    List <int> ProductSysNo = new List <int>();
                    foreach (OrderItemGroup ItemGroup in subOrderInfo.OrderItemGroupList)
                    {
                        foreach (OrderProductItem ProductItem in ItemGroup.ProductItemList)
                        {
                            if (!ProductSysNoList.Exists(p => p.ProductSysNo == ProductItem.ProductSysNo))
                            {
                                shippingErrorMsg = "商品(" + ProductItem.ProductName + ")无法配送到您选择的送货区域,请重新选择!";
                                break;
                            }
                        }
                    }
                }

                if (!PipelineDA.Pipeline_ExistsShipTypeAreaPrice(int.Parse(subOrderInfo.ShipTypeID), subOrderInfo.Contact.AddressAreaID))
                {
                    shippingErrorMsg += "该收货地区配置有误,请重新选择!";
                    break;
                }
            }

            if (!string.IsNullOrWhiteSpace(shippingErrorMsg))
            {
                return(shippingErrorMsg);
            }
            return("");
        }
示例#17
0
        private bool InnerValidate(OrderInfo order, out string errorMsg)
        {
            if (string.IsNullOrEmpty(order.PayTypeID))
            {
                errorMsg = "请选择一种支付方式";
                return(false);
            }

            PayTypeInfo payTypeInfo = PipelineDA.GetPayTypeBySysNo(order.PayTypeID);

            if (payTypeInfo == null)
            {
                errorMsg = "不支持您选择的支付方式,请重新选择";
                return(false);
            }

            errorMsg = null;
            return(true);
        }
示例#18
0
        private WarehouseAllocateResponse GetWarehouseAllocateResponse(WarehouseAllocateRequest request)
        {
            WarehouseAllocateResponse response = PipelineDA.AllocateWarehouse(request);

            if (response.AllocateItemInventoryInfoList != null)
            {
                List <AllocatedItemInventoryInfo> allocatedItemInventoryInfoResult = new List <AllocatedItemInventoryInfo>();

                foreach (AllocateItemInfo productInfo in request.ProductList)
                {
                    List <AllocatedItemInventoryInfo> thisItemAllocateInventoryList = response.AllocateItemInventoryInfoList.FindAll(item =>
                    {
                        return(productInfo.ProductID == item.ProductID);
                    });

                    if (thisItemAllocateInventoryList != null && thisItemAllocateInventoryList.Count > 0)
                    {
                        //删除库存不足的仓库,不做并单发货,不存在前台自动移仓单
                        thisItemAllocateInventoryList.RemoveAll(item =>
                        {
                            return((item.StockAvailableQty + item.StockConsignQty + item.StockVirtualQty) < productInfo.Quantity);
                        });

                        //筛选出最佳出库仓库
                        if (thisItemAllocateInventoryList.Count > 0)
                        {
                            FilterAllocatedItemInventoryInfo(productInfo, thisItemAllocateInventoryList);

                            allocatedItemInventoryInfoResult.AddRange(thisItemAllocateInventoryList);
                        }
                    }
                }
                response.AllocateItemInventoryInfoList = allocatedItemInventoryInfoResult;

                if (response.AllocateItemInventoryInfoList.Count == 0)
                {
                    response.AllocateResult = -1;
                }
            }

            return(response);
        }
示例#19
0
        public void Initialize(ref OrderInfo order)
        {
            order.BindingGiftCardList = PipelineDA.GetCustomerBindingGiftCardInfoList(order.Customer.SysNo);
            if (order.BindingGiftCardList != null)
            {
                //礼品卡按到期时间从近到远排列,引导用户优先使用快到期的礼品卡
                order.BindingGiftCardList.Sort((giftCard1, giftCard2) =>
                {
                    var diffDate1 = giftCard1.ValidEndDate.Subtract(DateTime.Today);
                    var diffDate2 = giftCard2.ValidEndDate.Subtract(DateTime.Today);

                    return(diffDate1.CompareTo(diffDate2));
                });

                foreach (var giftCardInfo in order.BindingGiftCardList)
                {
                    giftCardInfo["ActAvailableAmount"] = giftCardInfo.AvailableAmount;
                }
            }
        }
示例#20
0
        /// <summary>
        /// 取得每单最大限制金额,默认指定HK的最大限制金额为800,JP的最大限制金额为1000
        /// 可以通过web.config的配置项“MaxPerOrderAmount”进行改写
        /// </summary>
        /// <returns></returns>
        private Dictionary <string, decimal> GetMaxPerOrderAmountConfig()
        {
            List <string> allStockCountryCode   = PipelineDA.GetAllStockCountryCode();
            Dictionary <string, decimal> config = allStockCountryCode.ToDictionary(k => k, v => decimal.MaxValue);

            string maxPerOrderAmountConfig = ConstValue.MaxPerOrderAmount;

            if (!string.IsNullOrWhiteSpace(maxPerOrderAmountConfig))
            {
                string[] parts = maxPerOrderAmountConfig.Split(new char[] { '|', ';' }, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < parts.Length; i = i + 2)
                {
                    string  key = parts[i];
                    decimal maxPerOrderAmt;
                    if (config.ContainsKey(key) && decimal.TryParse(parts[i + 1], out maxPerOrderAmt))
                    {
                        config[key] = maxPerOrderAmt;
                    }
                }
            }
            return(config);
        }
示例#21
0
        public void Persist(OrderInfo order)
        {
            foreach (var kvs in order.SubOrderList)
            {
                var subOrder = kvs.Value;
                //记录订单支付日志
                PipelineDA.UpdateFinanceNetPayForPrepay(subOrder);

                //记录订单创建日志 OrderKey:查找拆单在某步发生的日志
                subOrder.IPAddress = HttpContext.Current.Request.UserHostAddress;
                subOrder["Note"]   = string.Format("OrderKey:{0}, Customer#:{1}, RecvSysNo:{2}, Items:({3}), RecvAddress:{4}, ShipType:{5}, PayType:{6}", kvs.Key, subOrder.Customer.SysNo, subOrder.Contact.AddressAreaID, subOrder["Note"], subOrder.Contact.AddressDetail, subOrder.ShipTypeID, subOrder.PayTypeID);
                //免运费日志
                if (subOrder.HasProperty("FreeShippingChargeLog"))
                {
                    subOrder["Note"] = string.Format("{0}, {1}", subOrder["Note"], subOrder["FreeShippingChargeLog"]);
                }
                PipelineDA.UpdateSalesOrderLog(subOrder, 0);

                subOrder["Note"] = "订单已提交";
                PipelineDA.UpdateSalesOrderLog(subOrder, 200);
            }
        }
        private void InnerCalculate(KeyValuePair <string, OrderInfo> preSubOrderKVS, List <FreeShippingItemConfig> rules)
        {
            bool isMatchFreeShippingCharge = false;

            ECommerce.Entity.Area contactAddressInfo = null;

            OrderInfo preSubOrderInfo       = preSubOrderKVS.Value;
            OrderInfo clonedPreSubOrderInfo = (OrderInfo)preSubOrderInfo.Clone();
            //原运费
            decimal ShippingPrice = preSubOrderInfo.ShippingAmount;
            //有效的免运费规则
            string matchedRule = null;

            foreach (var rule in rules)
            {
                // 1. 检查是否满足金额条件限制
                isMatchFreeShippingCharge = OrderAmtMatchedContext.GetContext(rule).IsMatched(preSubOrderInfo, rule);

                #region 2. 检查是否满足支付类型条件限制(旧逻辑现在不用)

                /*
                 * if (isMatchFreeShippingCharge && !string.IsNullOrWhiteSpace(rule.PayTypeSettingValue))
                 * {
                 *  isMatchFreeShippingCharge = false;
                 *
                 *  string[] setValues = rule.PayTypeSettingValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                 *  for (int i = 0; i < setValues.Length; i++)
                 *  {
                 *      if (setValues[i].Trim() == preSubOrderInfo.PayTypeID)
                 *      {
                 *          isMatchFreeShippingCharge = true;
                 *          break;
                 *      }
                 *  }
                 * }*/
                #endregion

                // 3. 检查是否满足配送区域条件限制
                if (isMatchFreeShippingCharge && !string.IsNullOrWhiteSpace(rule.ShipAreaSettingValue))
                {
                    isMatchFreeShippingCharge = false;
                    contactAddressInfo        = ECommerce.DataAccess.Common.CommonDA.GetAreaBySysNo(preSubOrderInfo.Contact.AddressAreaID);
                    if (contactAddressInfo != null && contactAddressInfo.ProvinceSysNo != null)
                    {
                        string[] setValues = rule.ShipAreaSettingValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                        for (int i = 0; i < setValues.Length; i++)
                        {
                            if (setValues[i].Trim() == contactAddressInfo.ProvinceSysNo.ToString())
                            {
                                isMatchFreeShippingCharge = true;
                                break;
                            }
                        }
                    }
                }

                //商品免运费数量
                int ProductFreeNumber = 0;
                #region 排除免运费的商品
                if (isMatchFreeShippingCharge && rule.ProductSettingValue != null && rule.ProductSettingValue.Count > 0)
                {
                    isMatchFreeShippingCharge = false;
                    if (clonedPreSubOrderInfo.OrderItemGroupList != null)
                    {
                        foreach (var itemGroup in clonedPreSubOrderInfo.OrderItemGroupList)
                        {
                            if (itemGroup.ProductItemList != null)
                            {
                                for (int i = itemGroup.ProductItemList.Count - 1; i >= 0; i--)
                                {
                                    if (rule.ProductSettingValue.Exists(productSysNo => itemGroup.ProductItemList[i].ProductSysNo == productSysNo))
                                    {
                                        isMatchFreeShippingCharge = true;
                                        itemGroup.ProductItemList.RemoveAt(i);
                                        ProductFreeNumber++;
                                    }
                                }
                            }
                        }
                    }
                    if (clonedPreSubOrderInfo.GiftItemList != null)
                    {
                        for (int i = clonedPreSubOrderInfo.GiftItemList.Count - 1; i >= 0; i--)
                        {
                            if (rule.ProductSettingValue.Exists(productSysNo => clonedPreSubOrderInfo.GiftItemList[i].ProductSysNo == productSysNo))
                            {
                                clonedPreSubOrderInfo.GiftItemList.RemoveAt(i);
                                ProductFreeNumber++;
                            }
                        }
                    }
                    if (clonedPreSubOrderInfo.AttachmentItemList != null)
                    {
                        for (int i = clonedPreSubOrderInfo.AttachmentItemList.Count - 1; i >= 0; i--)
                        {
                            if (rule.ProductSettingValue.Exists(productSysNo => clonedPreSubOrderInfo.AttachmentItemList[i].ProductSysNo == productSysNo))
                            {
                                clonedPreSubOrderInfo.AttachmentItemList.RemoveAt(i);
                                ProductFreeNumber++;
                            }
                        }
                    }
                }
                #endregion
                if (ProductFreeNumber > 0)
                {
                    matchedRule += rule.ToXmlString() + ";";
                }

                /*
                 * //对同时满足门槛金额限制、支付类型限制、配送区域限制的子单重新计算运费(旧逻辑现在不用)
                 * if (isMatchFreeShippingCharge)
                 * {
                 *  CalcShippingAmount(preSubOrderKVS, rule);
                 *  //break;   //旧逻辑
                 * }
                 */
            }


            //排除免运费商品后,子单中还剩下部分商品,计算这部分商品的运费作为本单运费
            //fixbug: 在没有收货地址的情况下,如果订单满足免运费条件,此时ShippingFeeQueryInfo对象的AreaId=0,计算运费的sp进入某个特定分支后会报错
            if (clonedPreSubOrderInfo.TotalItemCount > 0 && preSubOrderInfo.Contact.AddressAreaID > 0)
            //if (ProductFreeNumber <= 0 && preSubOrderInfo.Contact.AddressAreaID > 0 && clonedPreSubOrderInfo.TotalItemCount > 0)
            {
                List <ShippingFeeQueryInfo> qryList = new List <ShippingFeeQueryInfo>();
                ShippingFeeQueryInfo        qry     = new ShippingFeeQueryInfo();
                qry.TransID           = preSubOrderKVS.Key;
                qry.SoAmount          = clonedPreSubOrderInfo.TotalProductAmount;
                qry.SoTotalWeight     = clonedPreSubOrderInfo.TotalWeight;
                qry.SOSingleMaxWeight = clonedPreSubOrderInfo.MaxWeight;
                qry.AreaId            = preSubOrderInfo.Contact.AddressAreaID;
                qry.CustomerSysNo     = preSubOrderInfo.Customer.SysNo;
                qry.IsUseDiscount     = 0;
                qry.SubShipTypeList   = preSubOrderInfo.ShipTypeID.ToString();
                qry.SellType          = Convert.ToInt32(preSubOrderInfo["SellerType"]);
                qry.MerchantSysNo     = Convert.ToInt32(preSubOrderKVS.Key.Split('|')[0]);
                qry.ShipTypeId        = 0;
                qryList.Add(qry);

                List <ShippingInfo> shipFeeList = PipelineDA.GetAllShippingFee(qryList);

                ShippingInfo curShippingInfo = shipFeeList.Find(x => x.TransID == preSubOrderKVS.Key && x.ShippingTypeID.ToString() == preSubOrderInfo.ShipTypeID);
                if (curShippingInfo != null)
                {
                    preSubOrderInfo.ShippingAmount = curShippingInfo.ShippingPrice; //+curShippingInfo.ShippingPackageFee;
                }
            }
            else
            {
                //排除免运费商品后,子单中商品数量为0,免本单运费
                preSubOrderInfo.ShippingAmount = 0m;
            }
            if (!string.IsNullOrWhiteSpace(matchedRule))
            {
                preSubOrderInfo["FreeShippingChargeLog"] = string.Format("符合免运费规则:{0}\r\n,原运费为:{1:F2}元,减免后运费为:{2:F2}元",
                                                                         matchedRule.ToXmlString(), ShippingPrice, preSubOrderInfo.ShippingAmount);
            }
        }
示例#23
0
        public void Persist(OrderInfo order)
        {
            //更新平台优惠券使用次数
            if (order.CouponCodeSysNo.HasValue && order.CouponCodeSysNo > 0)
            {
                PipelineDA.UpdateCouponCodeQuantity(order.CouponCodeSysNo.Value);
                PipelineDA.UpdateSaleRulesExQuantity(order.CouponCodeSysNo.Value);
            }
            //更新店铺优惠券使用次数
            if (order.SubOrderList != null && order.SubOrderList.Count > 0)
            {
                List <int> merchantCouponCodeSysNoList = new List <int>();
                foreach (var subOrder in order.SubOrderList.Values)
                {
                    if (subOrder.MerchantCouponCodeSysNo.HasValue && subOrder.MerchantCouponCodeSysNo > 0 &&
                        !merchantCouponCodeSysNoList.Exists(m => m == subOrder.MerchantCouponCodeSysNo.Value))
                    {
                        merchantCouponCodeSysNoList.Add(subOrder.MerchantCouponCodeSysNo.Value);
                    }
                }
                foreach (int couponCodeSysNo in merchantCouponCodeSysNoList)
                {
                    PipelineDA.UpdateCouponCodeQuantity(couponCodeSysNo);
                    PipelineDA.UpdateSaleRulesExQuantity(couponCodeSysNo);
                }
            }

            //生成购物车编号
            order.ShoppingCartID = PipelineDA.GenerateSOSysNo().ToString();

            foreach (var subOrder in order.SubOrderList.Values)
            {
                subOrder.ID             = PipelineDA.GenerateSOSysNo();
                subOrder.ShoppingCartID = order.ShoppingCartID;
                subOrder.InDate         = DateTime.Now;
                subOrder["Note"]        = string.Empty;//订单日志
                subOrder["IsUsePrepay"] = (subOrder.BalancePayAmount > 0m) ? 1 : 0;

                PipelineDA.CreateShoppingCart(subOrder); //Create SO ShoppingCart
                PipelineDA.CreateSOMaster(subOrder);     //Create SOMaster

                #region SO Item
                List <OrderItem> subOrderItemList = new List <OrderItem>();
                subOrder.OrderItemGroupList.ForEach(orderGroup =>
                {
                    orderGroup.ProductItemList.ForEach(proItem =>
                    {
                        proItem["SpecialActivityType"] = proItem.SpecialActivityType;
                        proItem["SOSysNo"]             = subOrder.ID;
                        proItem["GiftSysNo"]           = null;
                        proItem["ProductType"]         = (int)SOItemType.ForSale;
                        proItem["MasterProductCode"]   = null;
                        proItem["Quantity"]            = proItem.UnitQuantity;
                        proItem["Point"]       = proItem.UnitRewardedPoint;
                        proItem["DiscountAmt"] = (decimal)proItem["UnitDiscountAmt"];
                        //总优惠券均摊金额,正数
                        proItem["PromotionDiscount"] = (decimal)proItem["UnitCouponAmt"];
                        //平台优惠券均摊金额,正数
                        proItem["PlatPromotionDiscount"] = (decimal)proItem["UnitCouponAmt"] - (proItem["MerchantUnitCouponAmt"] == null ? 0m : (decimal)proItem["MerchantUnitCouponAmt"]);
                        proItem["Price"] = proItem.UnitSalePrice - (decimal)proItem["UnitCouponAmt"];    //-(decimal)proItem["UnitDiscountAmt"];
                        subOrderItemList.Add(proItem);
                    });
                });

                subOrder.AttachmentItemList.ForEach(proItem =>
                {
                    proItem["SpecialActivityType"] = 0;
                    proItem["SOSysNo"]             = subOrder.ID;
                    proItem["GiftSysNo"]           = null;
                    proItem["ProductType"]         = (int)SOItemType.HiddenGift;
                    proItem["MasterProductCode"]   = null;
                    proItem["Quantity"]            = proItem.UnitQuantity;
                    proItem["Price"]             = 0;
                    proItem["Point"]             = proItem.UnitRewardedPoint;
                    proItem["DiscountAmt"]       = decimal.Zero;
                    proItem["PromotionDiscount"] = 0;
                    subOrderItemList.Add(proItem);
                });

                subOrder.GiftItemList.ForEach(proItem =>
                {
                    proItem["SpecialActivityType"] = 0;
                    proItem["SOSysNo"]             = subOrder.ID;
                    proItem["GiftSysNo"]           = proItem.ActivityNo;
                    proItem["ProductType"]         = (int)SOItemType.Gift;
                    proItem["MasterProductCode"]   = null;
                    proItem["Quantity"]            = proItem.UnitQuantity;
                    proItem["Price"]             = 0;
                    proItem["Point"]             = proItem.UnitRewardedPoint;
                    proItem["DiscountAmt"]       = decimal.Zero;
                    proItem["PromotionDiscount"] = 0;
                    if (proItem.SaleGiftType == SaleGiftType.Vendor)
                    {
                        proItem["ProductType"] = (int)SOItemType.Gift;
                    }
                    else
                    {
                        proItem["ProductType"] = SOItemType.ActivityGift;    //新蛋赠品(除厂商赠品外以前统一为新的赠品)
                    }
                    subOrderItemList.Add(proItem);
                });

                //平台
                if (subOrder.CouponCodeSysNo.HasValue && subOrder.CouponCodeSysNo > 0)
                {
                    OrderProductItem item = new OrderProductItem();
                    item["SOSysNo"]           = subOrder.ID;
                    item.ProductSysNo         = subOrder.CouponCodeSysNo.Value;
                    item.ProductName          = string.Format("【平台优惠券】{0}({1})", subOrder.CouponName, subOrder.CouponCode);
                    item["GiftSysNo"]         = null;
                    item["ProductType"]       = (int)SOItemType.Promotion; //优惠券
                    item["MasterProductCode"] = null;
                    item.Weight               = 0;
                    item["Quantity"]          = 1;
                    item["ProductType"]       = SOItemType.Promotion;
                    item["Price"]             = decimal.Zero;
                    item.UnitCostPrice        = decimal.Zero;
                    item["Point"]             = 0;
                    item["DiscountAmt"]       = decimal.Zero;
                    item["UnitDiscountAmt"]   = 0m;
                    item["PromotionDiscount"] = 0;
                    item.UnitSalePrice        = (-1) * (subOrder.CouponAmount - subOrder.MerchantCouponAmount);
                    item.WarehouseNumber      = 0;
                    item.WarehouseName        = string.Empty;

                    //item["TariffCode"] = null;//关税代码
                    // item["TariffRate"] = null;//单个关税
                    // item["EntryRecord"] = null;//报关编号
                    item["ProductStoreType"] = null;    //储存运输方式

                    subOrderItemList.Add(item);
                }
                //商家
                if (subOrder.MerchantCouponCodeSysNo.HasValue && subOrder.MerchantCouponCodeSysNo > 0)
                {
                    OrderProductItem item = new OrderProductItem();
                    item["SOSysNo"]           = subOrder.ID;
                    item.ProductSysNo         = subOrder.MerchantCouponCodeSysNo.Value;
                    item.ProductName          = string.Format("【商家优惠券】{0}({1})", subOrder.MerchantCouponName, subOrder.MerchantCouponCode);
                    item["GiftSysNo"]         = null;
                    item["ProductType"]       = (int)SOItemType.Promotion; //优惠券
                    item["MasterProductCode"] = null;
                    item.Weight               = 0;
                    item["Quantity"]          = 1;
                    item["ProductType"]       = SOItemType.Promotion;
                    item["Price"]             = decimal.Zero;
                    item.UnitCostPrice        = decimal.Zero;
                    item["Point"]             = 0;
                    item["DiscountAmt"]       = decimal.Zero;
                    item["UnitDiscountAmt"]   = 0m;
                    item["PromotionDiscount"] = 0;
                    item.UnitSalePrice        = (-1) * subOrder.MerchantCouponAmount;
                    item.WarehouseNumber      = 0;
                    item.WarehouseName        = string.Empty;

                    //item["TariffCode"] = null;//关税代码
                    //item["TariffRate"] = null;//单个关税
                    //item["EntryRecord"] = null;//报关编号
                    item["ProductStoreType"] = null;    //储存运输方式

                    subOrderItemList.Add(item);
                }
                #endregion

                subOrderItemList.ForEach(item =>
                {
                    //货币、当时汇率
                    item["CurrencySysNo"] = order["CurrencySysNo"];
                    item["ExchangeRate"]  = order["ExchangeRate"];

                    var productType = (int)item["ProductType"];
                    if (productType == 0 || productType == 1 || productType == 2 || productType == 5 || productType == 6)
                    {
                        var GiftSysNo           = item["GiftSysNo"];                //赠品
                        var SpecialActivityType = (int)item["SpecialActivityType"]; // 1=团购商品;2=抢购商品;3-虚拟团购商品
                        var DiscountAmt         = (decimal)item["DiscountAmt"];     //捆绑的折扣
                        if (ConstValue.PaymentInventory)
                        {
                            #region
                            ////赠品
                            //if (GiftSysNo != null)
                            //{
                            //    //create soitem
                            //    PipelineDA.CreateSOItem(item);
                            //    //so item log
                            //    subOrder["Note"] += string.Format("SysNo:{0}, Qty:{1}, Price:{2};", item.ProductSysNo, item["Quantity"], item["Price"]);
                            //}
                            ////团购
                            //else if (SpecialActivityType != 0 && SpecialActivityType == 1)
                            //{
                            //    //create soitem
                            //    PipelineDA.CreateSOItem(item);
                            //    //so item log
                            //    subOrder["Note"] += string.Format("SysNo:{0}, Qty:{1}, Price:{2};", item.ProductSysNo, item["Quantity"], item["Price"]);
                            //}
                            #endregion
                            //限时促销
                            if (SpecialActivityType != 0 && SpecialActivityType == 2 && PipelineDA.CheckCountDownByProductSysNo(item.ProductSysNo))
                            {
                                //create soitem
                                PipelineDA.CreateSOItem(item);
                                //so item log
                                subOrder["Note"] += string.Format("SysNo:{0}, Qty:{1}, Price:{2};", item.ProductSysNo, item["Quantity"], item["Price"]);
                            }
                            else
                            {
                                //扣减订单商品库存
                                int inventoryType = PipelineDA.GetInventoryType(item);
                                var rowCount      = PipelineDA.UpdateInventory(item);
                                if (rowCount != 1 && inventoryType != 1 && inventoryType != 3 && inventoryType != 5)
                                {
                                    ECommerce.Utility.Logger.WriteLog("inventory: qty is not enough", "SOPipeline.CreateSOBasicPersister");
                                    throw new BusinessException(string.Format("商品【{0}】库存不足", item.ProductName));
                                }
                                rowCount = PipelineDA.UpdateInventoryStock(item);
                                if (rowCount != 1 && inventoryType != 1 && inventoryType != 3 && inventoryType != 5)
                                {
                                    ECommerce.Utility.Logger.WriteLog("inventory_stock: qty is not enough", "SOPipeline.CreateSOBasicPersister");
                                    throw new BusinessException(string.Format("商品【{0}】库存不足", item.ProductName));
                                }

                                //create soitem
                                PipelineDA.CreateSOItem(item);

                                //so item log
                                subOrder["Note"] += string.Format("SysNo:{0}, Qty:{1}, Price:{2};", item.ProductSysNo, item["Quantity"], item["Price"]);
                            }
                            #region 所有促销活动都开启支付完成后扣减库存
                            ////正常品
                            //if (GiftSysNo == null && SpecialActivityType == 0 && !PipelineDA.CheckGiftSaleListByProductSysNo(item.ProductSysNo) && DiscountAmt == 0)
                            //{
                            //    //扣减订单商品库存
                            //    int inventoryType = PipelineDA.GetInventoryType(item);
                            //    var rowCount = PipelineDA.UpdateInventory(item);
                            //    if (rowCount != 1 && inventoryType != 1 && inventoryType != 3 && inventoryType != 5)
                            //    {
                            //        ECommerce.Utility.Logger.WriteLog("inventory: qty is not enough", "SOPipeline.CreateSOBasicPersister");
                            //        throw new BusinessException(string.Format("商品【{0}】库存不足", item.ProductName));
                            //    }
                            //    rowCount = PipelineDA.UpdateInventoryStock(item);
                            //    if (rowCount != 1 && inventoryType != 1 && inventoryType != 3 && inventoryType != 5)
                            //    {
                            //        ECommerce.Utility.Logger.WriteLog("inventory_stock: qty is not enough", "SOPipeline.CreateSOBasicPersister");
                            //        throw new BusinessException(string.Format("商品【{0}】库存不足", item.ProductName));
                            //    }

                            //    //create soitem
                            //    PipelineDA.CreateSOItem(item);

                            //    //so item log
                            //    subOrder["Note"] += string.Format("SysNo:{0}, Qty:{1}, Price:{2};", item.ProductSysNo, item["Quantity"], item["Price"]);
                            //}
                            ////赠品,团购,限时促销,捆绑商品
                            //else
                            //{
                            //    //create soitem
                            //    PipelineDA.CreateSOItem(item);

                            //    //so item log
                            //    subOrder["Note"] += string.Format("SysNo:{0}, Qty:{1}, Price:{2};", item.ProductSysNo, item["Quantity"], item["Price"]);
                            //}
                            #endregion
                        }
                        else
                        {
                            //扣减订单商品库存
                            int inventoryType = PipelineDA.GetInventoryType(item);
                            var rowCount      = PipelineDA.UpdateInventory(item);
                            if (rowCount != 1 && inventoryType != 1 && inventoryType != 3 && inventoryType != 5)
                            {
                                ECommerce.Utility.Logger.WriteLog("inventory: qty is not enough", "SOPipeline.CreateSOBasicPersister");
                                throw new BusinessException(string.Format("商品【{0}】库存不足", item.ProductName));
                            }
                            rowCount = PipelineDA.UpdateInventoryStock(item);
                            if (rowCount != 1 && inventoryType != 1 && inventoryType != 3 && inventoryType != 5)
                            {
                                ECommerce.Utility.Logger.WriteLog("inventory_stock: qty is not enough", "SOPipeline.CreateSOBasicPersister");
                                throw new BusinessException(string.Format("商品【{0}】库存不足", item.ProductName));
                            }

                            //create soitem
                            PipelineDA.CreateSOItem(item);

                            //so item log
                            subOrder["Note"] += string.Format("SysNo:{0}, Qty:{1}, Price:{2};", item.ProductSysNo, item["Quantity"], item["Price"]);
                        }
                    }
                    else if (productType == 3)
                    {
                        //create soitem
                        PipelineDA.CreateSOItem(item);

                        subOrder["Note"] += string.Format("PromotionSysNo:{0}, Qty:{1}, Price:{2};", item.ProductSysNo, item["Quantity"], item["Price"]);
                    }
                });
            }
        }
示例#24
0
        public void Persist(OrderInfo order)
        {
            //更新当前收货地址为用户的默认收货地址
            PipelineDA.SetCustomerShippingAddressAsDefault(order.Contact.ID, order.Customer.SysNo);

            foreach (var subOrder in order.SubOrderList.Values)
            {
                //更新用户积分信息
                if (subOrder.PointPayAmount > 0m)
                {
                    subOrder["Memo"] = "创建订单扣减积分";
                    var msgResult = PipelineDA.UpdatePointForCustomer(subOrder);
                    if (String.IsNullOrWhiteSpace(msgResult) || !msgResult.Trim().Equals("1000099"))
                    {
                        ECommerce.Utility.Logger.WriteLog("Update point of customer failed,ErrorCode:" + msgResult, "SOPipeline.NeweggSpecialPersister");
                        throw new BusinessException("用户积分不足");
                    }
                }

                //更新用户余额
                if (subOrder.BalancePayAmount > 0m)
                {
                    PipelineDA.UpdateCustomerPrepayBasic(subOrder);
                }

                //更新用户扩展信息
                PipelineDA.UpdateCustomerExtend(subOrder);

                //订单发货仓库
                //subOrder["LocalWHSysNo"] = subOrder.OrderItemGroupList.FirstOrDefault().ProductItemList.FirstOrDefault().WarehouseNumber;
                subOrder["LocalWHSysNo"] = subOrder["WarehouseNumber"];

                //订单运费检查
                PipelineDA.UpdateSOCheckShipping(subOrder);

                //创建订单扩展信息
                PipelineDA.CreateSOMasterExtension(subOrder);

                //创建订单商品扩展信息
                if (subOrder.OrderItemGroupList != null)
                {
                    //只记录团购商品信息,用于job后台结算
                    subOrder.OrderItemGroupList.ForEach(g =>
                    {
                        if (g.ProductItemList != null)
                        {
                            g.ProductItemList.Where(x => x.SpecialActivityType == 1)
                            .ToList()
                            .ForEach(item =>
                            {
                                item["SOSysNo"]           = subOrder.ID;
                                item["ItemExtensionType"] = "G";
                                PipelineDA.CreateSOItemExtension(item);
                            });
                        }
                    });
                }

                //新赠品规则
                subOrder.AttachmentItemList.ForEach(item =>
                {
                    item["SOSysNo"] = subOrder.ID;
                    PipelineDA.CreateSOItemAttachmentAccessory(item); //创建订单所有附件
                });

                List <DTOInfo> orderGiftMasterList = new List <DTOInfo>();
                subOrder.GiftItemList.ForEach(item =>
                {
                    DTOInfo dtoInfo = orderGiftMasterList.Find(f => (int)f["ActivityNo"] == item.ActivityNo);
                    if (dtoInfo == null)
                    {
                        dtoInfo                 = new DTOInfo();
                        dtoInfo["SOSysNo"]      = subOrder.ID;
                        dtoInfo["ActivityNo"]   = item.ActivityNo;
                        dtoInfo["SaleGiftType"] = item.SaleGiftType;
                        dtoInfo["Count"]        = item.UnitQuantity;
                        dtoInfo["Order"]        = 0;
                        orderGiftMasterList.Add(dtoInfo);
                    }
                    else
                    {
                        dtoInfo["Count"] = (int)dtoInfo["Count"] + item.UnitQuantity;
                        dtoInfo["Order"] = (int)dtoInfo["Order"] + 1;
                    }

                    PipelineDA.CreateSOItemGiftAccessory(item); //创建订单所有赠品
                    PipelineDA.CreateSOGiftItem(item);          //促销活动订单赠品列表
                });

                foreach (DTOInfo dtoInfo in orderGiftMasterList)
                {
                    PipelineDA.CreateSOGiftMaster(dtoInfo);//促销活动订单赠送
                }
            }
        }
示例#25
0
 /// <summary>
 /// 获取商家仓库的所有配送方式
 /// </summary>
 /// <param name="sellerSysNo">商家编号</param>
 /// <returns></returns>
 public static List <ShipTypeInfo> Checkout_GetStockShippingType(int sellerSysNo)
 {
     return(PipelineDA.Checkout_GetStockShippingType(sellerSysNo));
 }
示例#26
0
        public void Calculate(ref OrderInfo orderInfo)
        {
            Dictionary <string, OrderInfo> subOrderInfoList = new Dictionary <string, OrderInfo>();

            #region 【 将加够商品合并至主商品 】

            foreach (var plusPriceItem in orderInfo.PlusPriceItemList)
            {
                if (plusPriceItem.IsSelect)
                {
                    orderInfo.OrderItemGroupList.Add(PlusPriceConvertToProduct(plusPriceItem, orderInfo.Customer.SysNo));
                }
            }

            #endregion

            #region 【 先处理主商品 】

            List <OrderProductItem> masterItemList = new List <OrderProductItem>();

            if (orderInfo.OrderItemGroupList != null)
            {
                foreach (var itemGroup in orderInfo.OrderItemGroupList)
                {
                    if (itemGroup.ProductItemList != null)
                    {
                        itemGroup.ProductItemList.ForEach(masterItem =>
                        {
                            //将主商品拆分到最细粒度,即一个商品一个OrderProductItem
                            for (int i = 0; i < masterItem.UnitQuantity * itemGroup.Quantity; i++)
                            {
                                OrderProductItem cloneItem = (OrderProductItem)masterItem.Clone();
                                cloneItem.UnitQuantity     = 1;
                                //设置商品上的套餐号和套餐类型,很别扭,先这样吧,下个项目再修改 at 【2014-08-08 13:25:43】
                                cloneItem["PackageNo"]   = itemGroup.PackageNo;
                                cloneItem["PackageType"] = itemGroup.PackageType;
                                masterItemList.Add(cloneItem);
                            }
                        });
                    }
                }
            }

            //先初步按照 供应商+仓库+存储运输方式 拆分
            Dictionary <string, List <OrderProductItem> > dicMasterItemPreSplitResult = GetMainItemSplitResult(masterItemList);

            Dictionary <string, List <OrderProductItem> > dicSubOrderMasterItemResult = new Dictionary <string, List <OrderProductItem> >();

            //取得每单最大限制金额
            Dictionary <string, decimal> maxPerOrderAmountConfig = GetMaxPerOrderAmountConfig();

            foreach (var kvs in dicMasterItemPreSplitResult)
            {
                kvs.Value.Sort((item1, item2) =>
                {
                    return((item1.TotalSalePrice).CompareTo(item2.TotalSalePrice));
                });

                //单个订单金额拆分规则
                string warehouseCountryCode = string.IsNullOrEmpty(kvs.Value[0].WarehouseCountryCode) ? string.Empty :
                                              kvs.Value[0].WarehouseCountryCode;

                decimal maxPerOrderAmount = decimal.MaxValue;
                if (maxPerOrderAmountConfig.ContainsKey(warehouseCountryCode.ToUpper().Trim()))
                {
                    maxPerOrderAmount = maxPerOrderAmountConfig[warehouseCountryCode.ToUpper().Trim()];
                }

                decimal shoppingItemPriceSum = 0;
                string  thisKey = string.Empty;
                List <OrderProductItem> thisGroupMasterItemList = new List <OrderProductItem>();

                //根据每单最大购买金额进行一次拆单
                foreach (OrderProductItem masterItem in kvs.Value)
                {
                    decimal currentItemAmtSum = masterItem.TotalSalePrice;
                    //判断当前订单金额是否大于出库地区每单最大金额
                    if (shoppingItemPriceSum + currentItemAmtSum > maxPerOrderAmount)
                    {
                        //如果大于出库地区每单最大金额,并且主商品分组为空的话,那么当前单商品金额就已经超出
                        //最大购买金额,单商品自成一单
                        if (thisGroupMasterItemList.Count <= 0)
                        {
                            shoppingItemPriceSum = masterItem.TotalSalePrice;
                            thisGroupMasterItemList.Add(masterItem);

                            //根据订单金额重新计算一次key值
                            thisKey = GetSubOrderKey(kvs.Key, shoppingItemPriceSum, dicSubOrderMasterItemResult);
                            dicSubOrderMasterItemResult[thisKey] = thisGroupMasterItemList;

                            shoppingItemPriceSum    = currentItemAmtSum;
                            thisGroupMasterItemList = new List <OrderProductItem>();
                        }
                        else
                        {
                            //主商品分组合并组成一个子单,清空之前的主商品分组,并且将当前主商品加入到分组中
                            //根据订单金额重新计算一次key值
                            thisKey = GetSubOrderKey(kvs.Key, shoppingItemPriceSum, dicSubOrderMasterItemResult);
                            dicSubOrderMasterItemResult[thisKey] = thisGroupMasterItemList;

                            shoppingItemPriceSum    = currentItemAmtSum;
                            thisGroupMasterItemList = new List <OrderProductItem>()
                            {
                                masterItem
                            };
                        }
                    }
                    else
                    {
                        //金额没有超过最大购买金额,将当前主商品加入到分组中
                        shoppingItemPriceSum += masterItem.TotalSalePrice;
                        thisGroupMasterItemList.Add(masterItem);
                    }
                }
                //处理剩下的主商品分组,这些主商品组成一个子单
                if (thisGroupMasterItemList.Count > 0)
                {
                    thisKey = GetSubOrderKey(kvs.Key, shoppingItemPriceSum, dicSubOrderMasterItemResult);
                    dicSubOrderMasterItemResult[thisKey] = thisGroupMasterItemList;
                }
            }

            foreach (var kvs in dicSubOrderMasterItemResult)
            {
                OrderInfo subOrderInfo = (OrderInfo)orderInfo.Clone();
                //设置订单的默认出库仓
                subOrderInfo["WarehouseNumber"]      = kvs.Value.FirstOrDefault().WarehouseNumber;
                subOrderInfo["WarehouseName"]        = kvs.Value.FirstOrDefault().WarehouseName;
                subOrderInfo["WarehouseCountryCode"] = kvs.Value.FirstOrDefault().WarehouseCountryCode;
                subOrderInfo["MerchantSysNo"]        = kvs.Value.FirstOrDefault().MerchantSysNo;
                subOrderInfo["StoreType"]            = kvs.Value.FirstOrDefault()["ProductStoreType"];

                subOrderInfo.OrderItemGroupList = new List <OrderItemGroup>();
                subOrderInfo.GiftItemList       = new List <OrderGiftItem>();
                subOrderInfo.AttachmentItemList = new List <OrderAttachment>();

                OrderItemGroup itemGroup = new OrderItemGroup();
                //商品在拆单后,购买行为上的分组失去意义,设置组上的购买数量为1,商品的上UnitQuantity及时真实的商品购买数量
                itemGroup.Quantity        = 1;
                itemGroup.ProductItemList = new List <OrderProductItem>();

                kvs.Value.ForEach(masterItem =>
                {
                    //itemGroup.ProductItemList.Add(masterItem);
                    //由于前面将主商品拆分到最细,这里需要将主商品合并
                    if (!itemGroup.ProductItemList.Exists(x =>
                    {
                        if (x.ProductSysNo == masterItem.ProductSysNo)
                        {
                            x.UnitQuantity += masterItem.UnitQuantity;
                            return(true);
                        }
                        return(false);
                    }))
                    {
                        itemGroup.ProductItemList.Add(masterItem);
                    }
                });
                subOrderInfo.OrderItemGroupList.Add(itemGroup);

                subOrderInfoList.Add(kvs.Key, subOrderInfo);
            }

            #endregion

            #region 【 处理赠品和附件 】

            List <OrderItem> giftAndAccessoryList = new List <OrderItem>();

            if (orderInfo.GiftItemList != null)
            {
                orderInfo.GiftItemList.ForEach(gift =>
                {
                    if (!giftAndAccessoryList.Exists(g =>
                    {
                        OrderGiftItem giftItem = (OrderGiftItem)g;
                        //赠品合并增加一个赠品活动编号维度,客户端考虑对相同商品编号的赠品合并
                        if (giftItem.ProductSysNo == gift.ProductSysNo &&
                            giftItem.ActivityNo == gift.ActivityNo)
                        {
                            g.UnitQuantity += gift.UnitQuantity * gift.ParentCount;
                            return(true);
                        }
                        return(false);
                    }))
                    {
                        OrderGiftItem cloneGift = (OrderGiftItem)gift.Clone();
                        cloneGift.UnitQuantity  = gift.UnitQuantity * gift.ParentCount;
                        //合并后赠品的组数量失去意义,设置赠品的组购买数量为1
                        cloneGift.ParentCount = 1;
                        giftAndAccessoryList.Add(cloneGift);
                    }
                });
            }

            if (orderInfo.AttachmentItemList != null)
            {
                orderInfo.AttachmentItemList.ForEach(attachment =>
                {
                    if (!giftAndAccessoryList.Exists(a =>
                    {
                        if (a.ProductSysNo == attachment.ProductSysNo)
                        {
                            a.UnitQuantity += attachment.UnitQuantity * attachment.ParentCount;
                            return(true);
                        }
                        return(false);
                    }))
                    {
                        OrderAttachment cloneAttachment = (OrderAttachment)attachment.Clone();
                        cloneAttachment.UnitQuantity    = attachment.UnitQuantity * attachment.ParentCount;
                        //合并后附件的组数量失去意义,设置附件的组购买数量为1
                        cloneAttachment.ParentCount = 1;
                        giftAndAccessoryList.Add(cloneAttachment);
                    }
                });
            }

            Dictionary <string, List <OrderItem> > dicGiftAndAccessorySplitResult = GetItemSplitResult(giftAndAccessoryList);

            //赠品和附件不会影响订单金额,将按照商家+仓库+存储运输方式拆好的单和前面主商品拆好的单进行合并
            foreach (var kvs in dicGiftAndAccessorySplitResult)
            {
                OrderInfo theSubOrderInfo = null;
                //赠品(附件)在新的子单中
                bool giftOrAccessoryInNewSubOrder = false;

                foreach (string thisKey in subOrderInfoList.Keys)
                {
                    //thisKey:vendorSysno|warehouseNumber|storeType|amt-1....n
                    string prefixKey = thisKey.Substring(0, thisKey.LastIndexOf('|'));
                    prefixKey = prefixKey.Substring(0, prefixKey.LastIndexOf('|'));

                    //kvs.Key: vendorSysno|warehouseNumber|storeType
                    string newKey = kvs.Key.Substring(0, kvs.Key.LastIndexOf('|'));
                    if (newKey.ToUpper().Trim() == prefixKey.ToUpper().Trim())
                    {
                        theSubOrderInfo = subOrderInfoList[thisKey];
                        break;
                    }
                }

                if (theSubOrderInfo == null)
                {
                    giftOrAccessoryInNewSubOrder = true;
                    theSubOrderInfo = (OrderInfo)orderInfo.Clone();
                    //设置订单的默认出库仓
                    theSubOrderInfo["WarehouseNumber"]      = kvs.Value.FirstOrDefault().WarehouseNumber;
                    theSubOrderInfo["WarehouseName"]        = kvs.Value.FirstOrDefault().WarehouseName;
                    theSubOrderInfo["WarehouseCountryCode"] = kvs.Value.FirstOrDefault().WarehouseCountryCode;
                    theSubOrderInfo["MerchantSysNo"]        = kvs.Value.FirstOrDefault().MerchantSysNo;
                    theSubOrderInfo["StoreType"]            = kvs.Value.FirstOrDefault()["ProductStoreType"];

                    theSubOrderInfo.OrderItemGroupList = new List <OrderItemGroup>();
                    theSubOrderInfo.GiftItemList       = new List <OrderGiftItem>();
                    theSubOrderInfo.AttachmentItemList = new List <OrderAttachment>();

                    subOrderInfoList.Add(kvs.Key, theSubOrderInfo);
                }

                foreach (var orderItem in kvs.Value)
                {
                    if (orderItem is OrderGiftItem)
                    {
                        OrderGiftItem giftItem = orderItem as OrderGiftItem;
                        //Modified by PoseidonTong at [2014-08-11 12:33:01]
                        //赠品在和主商品同仓的前提下,优先和关联的主商品拆在同一个订单
                        if (!giftOrAccessoryInNewSubOrder && giftItem.ParentProductSysNo > 0)
                        {
                            var giftMasterProductSubOrderInfos = subOrderInfoList.Select(_ => _.Value)
                                                                 .Where(x => x.OrderItemGroupList != null &&
                                                                        x.OrderItemGroupList.Exists(y =>
                                                                                                    y.ProductItemList != null &&
                                                                                                    y.ProductItemList.Exists(p => p.ProductSysNo == giftItem.ParentProductSysNo)
                                                                                                    ));

                            if (giftMasterProductSubOrderInfos.Count() > 0)
                            {
                                //取满足条件的第一个子单,考虑同一个主商品由于金额
                                //限制拆分成了多个子单的情况,这里将赠品放到第一个主单中
                                giftMasterProductSubOrderInfos.First().GiftItemList.Add(giftItem);
                                continue;
                            }
                        }
                        theSubOrderInfo.GiftItemList.Add(giftItem);
                    }
                    else if (orderItem is OrderAttachment)
                    {
                        OrderAttachment attrItem = orderItem as OrderAttachment;
                        //Modified by PoseidonTong at [2014-08-11 12:33:01]
                        //附件在和主商品同仓的前提下,优先和关联的主商品拆在同一个订单
                        if (!giftOrAccessoryInNewSubOrder && attrItem.ParentProductSysNo > 0)
                        {
                            var attMasterProductSubOrderInfos = subOrderInfoList.Select(_ => _.Value)
                                                                .Where(x => x.OrderItemGroupList != null &&
                                                                       x.OrderItemGroupList.Exists(y =>
                                                                                                   y.ProductItemList != null &&
                                                                                                   y.ProductItemList.Exists(p => p.ProductSysNo == attrItem.ParentProductSysNo)
                                                                                                   ));

                            if (attMasterProductSubOrderInfos.Count() > 0)
                            {
                                //取满足条件的第一个子单,考虑同一个主商品由于金额
                                //限制拆分成了多个子单的情况,这里将附件放到第一个主单中
                                attMasterProductSubOrderInfos.First().AttachmentItemList.Add(attrItem);
                                continue;
                            }
                        }
                        theSubOrderInfo.AttachmentItemList.Add(attrItem);
                    }
                }
            }

            #endregion

            #region 【 设置子单类型和商家模式 】

            foreach (var kvs in subOrderInfoList)
            {
                OrderInfo subOrderInfo = kvs.Value;
                #region 设置商家模式
                ECommerce.Entity.Product.VendorInfo vendorInfo = PipelineDA.GetVendorInfo((int)subOrderInfo["MerchantSysNo"]);
                subOrderInfo["ShippingType"] = vendorInfo.ShippingType;
                subOrderInfo["StockType"]    = vendorInfo.StockType;
                subOrderInfo["InvoiceType"]  = vendorInfo.InvoiceType;
                subOrderInfo["SellerType"]   = vendorInfo.SellerType;
                subOrderInfo["VendorName"]   = vendorInfo.VendorName;
                #endregion

                #region 设置子单类型
                subOrderInfo.SOType = (int)SOType.Normal;
                ////团购商品不能和普通商品混合下单,所以只要订单中有团购商品,那么订单一定就是团购订单
                //if (subOrderInfo.OrderItemGroupList != null)
                //{
                //    if (subOrderInfo.OrderItemGroupList.Exists(itemGroup =>
                //    {
                //        if (itemGroup.ProductItemList != null)
                //        {
                //            return itemGroup.ProductItemList.Exists(product =>
                //            {
                //                if (product.SpecialActivityType == 1 || product.SpecialActivityType == 3)
                //                {
                //                    //记录下团购编号
                //                    subOrderInfo["ReferenceSysNo"] = product.SpecialActivitySysNo;
                //                    return true;
                //                }
                //                return false;
                //            });
                //        }
                //        return false;
                //    }))
                //    {
                //        subOrderInfo.SOType = (int)SOType.GroupBuy;
                //    }
                //    else
                //    {
                //        subOrderInfo.SOType = (int)SOType.Normal;
                //    }
                //}
                //else
                //{
                //    subOrderInfo.SOType = (int)SOType.Normal;
                //}
                #endregion
            }

            #endregion

            orderInfo.SubOrderList = subOrderInfoList;
        }
示例#27
0
        public bool Validate(OrderInfo order, out string errorMsg)
        {
            errorMsg = string.Empty;
            List <string> errorMsgList = new List <string>();

            #region [ 商品库存检查 ]
            if (!ValidateQuantity(order, out errorMsgList))
            {
                foreach (var item in errorMsgList)
                {
                    errorMsg += item + "<br />";
                }
                return(false);
            }
            #endregion

            foreach (OrderItemGroup itemGroup in order.OrderItemGroupList)
            {
                if (itemGroup.PackageChecked)
                {
                    if (itemGroup.PackageType == 1)
                    {
                        foreach (OrderProductItem item in itemGroup.ProductItemList)
                        {
                            #region 1.商品状态检查
                            if (!item["ProductStatus"].ToString().Equals(((int)ECommerce.Enums.ProductStatus.Show).ToString()))
                            {
                                errorMsg = LanguageHelper.GetText("商品【{0}】未上架!", order.LanguageCode);
                                errorMsg = string.Format(errorMsg, item["ProductTitle"]);
                                return(false);
                            }
                            #endregion

                            #region 2.商品库存检查
                            //if (itemGroup.Quantity * item.UnitQuantity > item.TotalInventory)
                            //{
                            //    errorMsg = LanguageHelper.GetText("商品【{0}】库存不足!", order.LanguageCode);
                            //    errorMsg = string.Format(errorMsg, item["ProductTitle"]);
                            //    return false;
                            //}
                            #endregion

                            #region 3.每单限购最小数量检查
                            int minCountPerOrder = 0;
                            int.TryParse(item["MinCountPerOrder"].ToString(), out minCountPerOrder);
                            if (itemGroup.Quantity * item.UnitQuantity < minCountPerOrder)
                            {
                                errorMsg = LanguageHelper.GetText("商品【{0}】每单限购数量{1}-{2}!", order.LanguageCode);
                                errorMsg = string.Format(errorMsg, item["ProductTitle"], item["MinCountPerOrder"], item["MaxCountPerOrder"]);
                                return(false);
                            }
                            #endregion

                            #region 4.每单限购最大数量检查
                            int maxCountPerOrder = 0;
                            int.TryParse(item["MaxCountPerOrder"].ToString(), out maxCountPerOrder);
                            if (itemGroup.Quantity * item.UnitQuantity > maxCountPerOrder)
                            {
                                errorMsg = LanguageHelper.GetText("商品【{0}】每单限购数量{1}-{2}!", order.LanguageCode);
                                errorMsg = string.Format(errorMsg, item["ProductTitle"], item["MinCountPerOrder"], item["MaxCountPerOrder"]);
                                return(false);
                            }
                            #endregion

                            List <OrderGiftItem> giftList = null;
                            if (order.GiftItemList != null && order.GiftItemList.Count > 0)
                            {
                                giftList = order.GiftItemList.FindAll(m
                                                                      => m.ParentPackageNo == itemGroup.PackageNo &&
                                                                      m.MerchantSysNo == item.MerchantSysNo &&
                                                                      m.ParentProductSysNo == item.ProductSysNo);
                            }
                            if (giftList == null)
                            {
                                giftList = new List <OrderGiftItem>();
                            }
                            //非赠品池赠品
                            var normalGiftList = giftList.FindAll(m => !m.IsGiftPool);
                            foreach (var gift in normalGiftList)
                            {
                                ProductSalesInfo giftSalesInfo = PipelineDA.GetProductSalesInfoBySysNo(gift.ProductSysNo);
                                gift.TotalInventory = giftSalesInfo.OnlineQty;
                                if (gift.UnitQuantity * gift.ParentCount > gift.TotalInventory)
                                {
                                    errorMsg = LanguageHelper.GetText("赠品【{0}】库存不足!", order.LanguageCode);
                                    errorMsg = string.Format(errorMsg, gift.ProductName);
                                    return(false);
                                }
                            }
                            //订单级别用户选择的赠品(包含非赠品池删除后保留的赠品和赠品池选择的赠品)
                            List <OrderGiftItem> orderGiftList = new List <OrderGiftItem>();
                            if (order.GiftItemList != null)
                            {
                                orderGiftList = order.GiftItemList.FindAll(m => m.ParentPackageNo.Equals(0) &&
                                                                           m.ParentProductSysNo.Equals(0) &&
                                                                           ((m.IsGiftPool && m.IsSelect) || !m.IsGiftPool));
                            }

                            var productList           = order.OrderItemGroupList.FindAll(m => m.MerchantSysNo == item.MerchantSysNo);
                            var merchantOrderGiftList = orderGiftList.FindAll(m => m.MerchantSysNo == item.MerchantSysNo);
                            if (merchantOrderGiftList != null && merchantOrderGiftList.Count > 0)
                            {
                                for (int index = 0; index < merchantOrderGiftList.Count; index++)
                                {
                                    var Gift          = merchantOrderGiftList[index];
                                    var itemGroupList = productList.FindAll(m => m.MerchantSysNo == merchantOrderGiftList[index].MerchantSysNo && m.PackageChecked);
                                    if (itemGroupList.Count > 0 && itemGroupList != null)
                                    {
                                        ProductSalesInfo giftSalesInfo = PipelineDA.GetProductSalesInfoBySysNo(merchantOrderGiftList[index].ProductSysNo);
                                        merchantOrderGiftList[index].TotalInventory = giftSalesInfo.OnlineQty;
                                        if (merchantOrderGiftList[index].UnitQuantity * merchantOrderGiftList[index].ParentCount > merchantOrderGiftList[index].TotalInventory)
                                        {
                                            errorMsg = LanguageHelper.GetText("赠品【{0}】库存不足!", order.LanguageCode);
                                            errorMsg = string.Format(errorMsg, merchantOrderGiftList[index].ProductName);
                                            return(false);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else if (itemGroup.PackageType == 0)
                    {
                        foreach (OrderProductItem item in itemGroup.ProductItemList)
                        {
                            if (item.ProductChecked)
                            {
                                #region 1.商品状态检查
                                if (!item["ProductStatus"].ToString().Equals(((int)ECommerce.Enums.ProductStatus.Show).ToString()))
                                {
                                    errorMsg = LanguageHelper.GetText("商品【{0}】未上架!", order.LanguageCode);
                                    errorMsg = string.Format(errorMsg, item["ProductTitle"]);
                                    return(false);
                                }
                                #endregion

                                #region 2.商品库存检查
                                //if (itemGroup.Quantity * item.UnitQuantity > item.TotalInventory)
                                //{
                                //    errorMsg = LanguageHelper.GetText("商品【{0}】库存不足!", order.LanguageCode);
                                //    errorMsg = string.Format(errorMsg, item["ProductTitle"]);
                                //    return false;
                                //}
                                #endregion

                                #region 3.每单限购最小数量检查
                                int minCountPerOrder = 0;
                                int.TryParse(item["MinCountPerOrder"].ToString(), out minCountPerOrder);
                                if (itemGroup.Quantity * item.UnitQuantity < minCountPerOrder)
                                {
                                    errorMsg = LanguageHelper.GetText("商品【{0}】每单限购数量{1}-{2}!", order.LanguageCode);
                                    errorMsg = string.Format(errorMsg, item["ProductTitle"], item["MinCountPerOrder"], item["MaxCountPerOrder"]);
                                    return(false);
                                }
                                #endregion

                                #region 4.每单限购最大数量检查
                                int maxCountPerOrder = 0;
                                int.TryParse(item["MaxCountPerOrder"].ToString(), out maxCountPerOrder);
                                if (itemGroup.Quantity * item.UnitQuantity > maxCountPerOrder)
                                {
                                    errorMsg = LanguageHelper.GetText("商品【{0}】每单限购数量{1}-{2}!", order.LanguageCode);
                                    errorMsg = string.Format(errorMsg, item["ProductTitle"], item["MinCountPerOrder"], item["MaxCountPerOrder"]);
                                    return(false);
                                }
                                #endregion


                                //赠品
                                List <OrderGiftItem> giftList = null;
                                if (order.GiftItemList != null && order.GiftItemList.Count > 0)
                                {
                                    giftList = order.GiftItemList.FindAll(m
                                                                          => m.ParentPackageNo == itemGroup.PackageNo &&
                                                                          m.MerchantSysNo == item.MerchantSysNo &&
                                                                          m.ParentProductSysNo == item.ProductSysNo);
                                }
                                if (giftList == null)
                                {
                                    giftList = new List <OrderGiftItem>();
                                }
                                //非赠品池赠品
                                var normalGiftList = giftList.FindAll(m => !m.IsGiftPool);
                                foreach (var gift in normalGiftList)
                                {
                                    ProductSalesInfo giftSalesInfo = PipelineDA.GetProductSalesInfoBySysNo(gift.ProductSysNo);
                                    gift.TotalInventory = giftSalesInfo.OnlineQty;
                                    if (gift.UnitQuantity * gift.ParentCount > gift.TotalInventory)
                                    {
                                        errorMsg = LanguageHelper.GetText("赠品【{0}】库存不足!", order.LanguageCode);
                                        errorMsg = string.Format(errorMsg, gift.ProductName);
                                        return(false);
                                    }
                                }

                                //订单级别用户选择的赠品(包含非赠品池删除后保留的赠品和赠品池选择的赠品)
                                List <OrderGiftItem> orderGiftList = new List <OrderGiftItem>();
                                if (order.GiftItemList != null)
                                {
                                    orderGiftList = order.GiftItemList.FindAll(m => m.ParentPackageNo.Equals(0) &&
                                                                               m.ParentProductSysNo.Equals(0) &&
                                                                               ((m.IsGiftPool && m.IsSelect) || !m.IsGiftPool));
                                }

                                var productList           = order.OrderItemGroupList.FindAll(m => m.MerchantSysNo == item.MerchantSysNo);
                                var merchantOrderGiftList = orderGiftList.FindAll(m => m.MerchantSysNo == item.MerchantSysNo);
                                if (merchantOrderGiftList != null && merchantOrderGiftList.Count > 0)
                                {
                                    for (int index = 0; index < merchantOrderGiftList.Count; index++)
                                    {
                                        var Gift          = merchantOrderGiftList[index];
                                        var itemGroupList = productList.FindAll(m => m.MerchantSysNo == merchantOrderGiftList[index].MerchantSysNo && m.PackageChecked);
                                        if (itemGroupList.Count > 0 && itemGroupList != null)
                                        {
                                            ProductSalesInfo giftSalesInfo = PipelineDA.GetProductSalesInfoBySysNo(merchantOrderGiftList[index].ProductSysNo);
                                            merchantOrderGiftList[index].TotalInventory = giftSalesInfo.OnlineQty;
                                            if (merchantOrderGiftList[index].UnitQuantity * merchantOrderGiftList[index].ParentCount > merchantOrderGiftList[index].TotalInventory)
                                            {
                                                errorMsg = LanguageHelper.GetText("赠品【{0}】库存不足!", order.LanguageCode);
                                                errorMsg = string.Format(errorMsg, merchantOrderGiftList[index].ProductName);
                                                return(false);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            #region 优惠促销库存检查

            if (order.AttachmentItemList != null)
            {
                foreach (OrderAttachment attachment in order.AttachmentItemList)
                {
                    ProductSalesInfo attachmentSalesInfo = PipelineDA.GetProductSalesInfoBySysNo(attachment.ProductSysNo);
                    attachment.TotalInventory = attachmentSalesInfo.OnlineQty;
                    if (attachment.UnitQuantity * attachment.ParentCount > attachment.TotalInventory)
                    {
                        errorMsg = LanguageHelper.GetText("附件【{0}】库存不足!", order.LanguageCode);
                        errorMsg = string.Format(errorMsg, attachment.ProductName);
                        return(false);
                    }
                }
            }
            if (order.GiftItemList != null)
            {
                foreach (OrderGiftItem gift in order.GiftItemList)
                {
                    if (gift.IsSelect)
                    {
                        ProductSalesInfo giftSalesInfo = PipelineDA.GetProductSalesInfoBySysNo(gift.ProductSysNo);
                        gift.TotalInventory = giftSalesInfo.OnlineQty;
                        if (gift.UnitQuantity * gift.ParentCount > gift.TotalInventory)
                        {
                            errorMsg = LanguageHelper.GetText("赠品【{0}】库存不足!", order.LanguageCode);
                            errorMsg = string.Format(errorMsg, gift.ProductName);
                            return(false);
                        }
                    }
                }
            }
            if (order.PlusPriceItemList != null)
            {
                foreach (OrderGiftItem gift in order.PlusPriceItemList)
                {
                    if (gift.IsSelect)
                    {
                        ProductSalesInfo giftSalesInfo = PipelineDA.GetProductSalesInfoBySysNo(gift.ProductSysNo);
                        gift.TotalInventory = giftSalesInfo.OnlineQty;
                        if (gift.UnitQuantity > gift.TotalInventory)
                        {
                            errorMsg = LanguageHelper.GetText("加购商品【{0}】库存不足!", order.LanguageCode);
                            errorMsg = string.Format(errorMsg, gift.ProductName);
                            return(false);
                        }
                    }
                }
            }

            #endregion

            errorMsg = null;
            return(true);
        }
示例#28
0
        /// <summary>
        /// 加够商品转换为主商品
        /// </summary>
        /// <param name="productSysNo">商品编号</param>
        /// <param name="customerSysNo">用户编号</param>
        /// <returns></returns>
        private OrderItemGroup PlusPriceConvertToProduct(OrderGiftItem plusPrice, int customerSysNo)
        {
            OrderItemGroup   result      = new OrderItemGroup();
            OrderProductItem productItem = new OrderProductItem();

            productItem.ProductSysNo = plusPrice.ProductSysNo;

            //商品基础信息
            ProductBasicInfo basicInfo = PipelineDA.GetProductBasicInfoBySysNo(productItem.ProductSysNo);
            //商品备案信息
            ProductEntryInfo entryInfo = PipelineDA.GetProductEntryInfoBySysNo(productItem.ProductSysNo);

            basicInfo.ProductEntryInfo      = entryInfo;
            productItem["ProductStoreType"] = (int)entryInfo.ProductStoreType;
            //商品备货时间
            productItem["LeadTimeDays"] = basicInfo.ProductEntryInfo.LeadTimeDays;

            //商品销售信息
            ProductSalesInfo salesInfo = PipelineDA.GetProductSalesInfoBySysNo(productItem.ProductSysNo);

            productItem.ProductID         = basicInfo.Code;
            productItem.ProductName       = basicInfo.ProductName;
            productItem.Weight            = basicInfo.Weight;
            productItem["ProductTitle"]   = basicInfo.ProductTitle;
            productItem.DefaultImage      = basicInfo.DefaultImage;
            productItem.UnitMarketPrice   = salesInfo.MarketPrice;
            productItem.UnitCostPrice     = salesInfo.UnitCostPrice;
            productItem.UnitSalePrice     = plusPrice.UnitSalePrice;
            productItem.UnitRewardedPoint = 0;
            //productItem["TariffRate"] = basicInfo.ProductEntryInfo.TariffRate;
            productItem.TotalInventory       = salesInfo.OnlineQty;
            productItem.MerchantSysNo        = basicInfo.VendorSysno;
            productItem.MerchantName         = basicInfo.VendorInfo.VendorName;
            result.MerchantSysNo             = basicInfo.VendorSysno;
            result.MerchantName              = basicInfo.VendorInfo.VendorName;
            productItem["ProductStatus"]     = (int)basicInfo.ProductStatus;
            productItem["Warranty"]          = basicInfo.Warranty;
            productItem.WarehouseNumber      = plusPrice.WarehouseNumber;
            productItem.WarehouseName        = plusPrice.WarehouseName;
            productItem.WarehouseCountryCode = plusPrice.WarehouseCountryCode;

            salesInfo.MinCountPerOrder = salesInfo.OnlineQty < productItem.UnitQuantity ? salesInfo.OnlineQty : productItem.UnitQuantity;
            salesInfo.MaxCountPerOrder = salesInfo.OnlineQty < productItem.UnitQuantity ? salesInfo.OnlineQty : productItem.UnitQuantity;

            productItem["MinCountPerOrder"] = productItem.UnitQuantity;
            productItem["MaxCountPerOrder"] = productItem.UnitQuantity;

            result.MinCountPerSO = productItem.UnitQuantity;
            result.MaxCountPerSO = productItem.UnitQuantity;
            result.MerchantSysNo = productItem.MerchantSysNo;
            result.MerchantName  = productItem.MerchantName;
            result.PackageNo     = 0;
            result.PackageType   = 0;
            result.Quantity      = 1;

            //商品分组属性
            List <ProductSplitGroupProperty> splitGroupProperty = PipelineDA.GetProductSplitGroupPropertyList(productItem.ProductSysNo);

            if (splitGroupProperty != null && splitGroupProperty.Count > 0)
            {
                productItem.SplitGroupPropertyDescList = new List <KeyValuePair <string, string> >();
                foreach (ProductSplitGroupProperty property in splitGroupProperty)
                {
                    productItem.SplitGroupPropertyDescList.Add(new KeyValuePair <string, string>(property.PropertyDescription, property.ValueDescription));
                }
            }
            result.ProductItemList = new List <OrderProductItem>();
            result.ProductItemList.Add(productItem);

            return(result);
        }
示例#29
0
 /// <summary>
 /// 根据配送地区编号和支付方式编号取得所有支持的配送方式列表
 /// </summary>
 /// <param name="addressAreaID">配送地区编号</param>
 /// <param name="paymentCategory">支付类别</param>
 /// <returns></returns>
 public static List <ShipTypeInfo> GetSupportedShipTypeList(int addressAreaID, PaymentCategory?paymentCategory)
 {
     return(PipelineDA.GetSupportedShipTypeList(addressAreaID, paymentCategory));
 }
示例#30
0
        /// <summary>
        /// 支付后台回调
        /// </summary>
        /// <param name="payTypeSysNo">支付方式系统编号</param>
        /// <param name="collection">POST数据集合</param>
        /// <returns></returns>
        public string PaymentCallback(int payTypeSysNo, NameValueCollection collection, out CallbackContext context)
        {
            context = new CallbackContext();
            try
            {
                #region [ 写系统Log ]

                ApplicationEventLog log = new ApplicationEventLog()
                {
                    Source           = "B2C site pay",
                    EventType        = 8,
                    HostName         = "B2C",
                    EventTitle       = "Pay callback",
                    EventMessage     = Charges.BuildStringFromNameValueCollection(collection),
                    LanguageCode     = ConstValue.LanguageCode,
                    CompanyCode      = ConstValue.CompanyCode,
                    StoreCompanyCode = ConstValue.StoreCompanyCode
                };
                CommonDA.CreateApplicationEventLog(log);

                #endregion

                context.PaymentModeId = payTypeSysNo;
                context.ResponseForm  = collection;

                Charges charge = Charges.GetInstance(context);
                context.SOSysNo = charge.GetSOSysNo(context);
                context.SOInfo  = ShoppingOrderDA.PayGetOrderInfoBySOSysNo(context.SOSysNo);
                charge.UpdateCallbackPayment(context);

                //如果为泰隆网关支付,写入积分消费记录
                //if (payTypeSysNo == 201)
                //{
                //    CreateUserBankPointRecord(context);
                //}


                if (charge.VerifySign(context))
                {
                    #region [ 检查返回的订单实际支付金额与订单需要支付的金额是否相等,否则不予处理 ]

                    if (context.SOInfo == null)
                    {
                        return(BuildPaymentCallbackReturnResult(payTypeSysNo, false));
                    }
                    if (!charge.GetPayAmount(context).ToString("F2").Equals(context.SOInfo.RealPayAmt.ToString("F2")))
                    {
                        ECommerce.Utility.Logger.WriteLog("订单实际支付金额与订单需要支付的金额不相等!", "PayCallback", "CheckPayAmount");
                        return(BuildPaymentCallbackReturnResult(payTypeSysNo, false));
                    }

                    #endregion

                    #region [ 检查NetPay是否存在并且状态为>=0,是则已支付过 ]

                    NetpayInfo netPayInfo = ShoppingOrderDA.GetCenterDBNetpayBySOSysNo(context.SOSysNo);
                    if (netPayInfo != null && netPayInfo.Status > (int)NetPayStatusType.Origin)
                    {
                        ECommerce.Utility.Logger.WriteLog("订单已经支付!", "PayCallback", "CheckNetPay");
                        return(BuildPaymentCallbackReturnResult(payTypeSysNo, true));
                    }
                    #endregion

                    if (charge.GetPayResult(context))
                    {
                        //支付成功
                        using (ITransaction scope = TransactionManager.Create())
                        {
                            #region 1.写Netpay
                            netPayInfo = new NetpayInfo()
                            {
                                SOSysNo          = context.SOSysNo,
                                PayTypeSysNo     = payTypeSysNo,
                                PayAmount        = context.SOInfo.RealPayAmt,
                                Source           = 0,
                                Status           = NetPayStatusType.Verified,
                                CompanyCode      = context.SOInfo.CompanyCode,
                                LanguageCode     = context.SOInfo.LanguageCode,
                                CurrencySysNo    = context.SOInfo.CurrencySysNo,
                                StoreCompanyCode = context.SOInfo.StoreCompanyCode,
                                OrderAmt         = (context.SOInfo.SoAmt
                                                    - Math.Abs((context.SOInfo.Amount.PointPay * 1.00m) / decimal.Parse(ConstValue.PointExhangeRate))
                                                    - Math.Abs(context.SOInfo.PromotionAmt)
                                                    + Math.Abs(context.SOInfo.Amount.PayPrice)
                                                    + Math.Abs(context.SOInfo.Amount.ShipPrice)
                                                    + Math.Abs(context.SOInfo.Amount.PremiumAmt)
                                                    - Math.Abs(context.SOInfo.Amount.DiscountAmt)
                                                    + Math.Abs(context.SOInfo.TariffAmt)
                                                    ),
                                PrePayAmt      = context.SOInfo.Amount.PrepayAmt,
                                PointPayAmt    = context.SOInfo.PointPay * 1.00m / decimal.Parse(ConstValue.PointExhangeRate),
                                GiftCardPayAmt = context.SOInfo.Amount.GiftCardPay,
                                SerialNumber   = charge.GetSerialNumber(context),
                                PayProcessTime = charge.GetPayProcessTime(context)
                            };
                            bool isTrue = ShoppingOrderDA.CreateNetpay(netPayInfo);
                            #endregion

                            if (!isTrue)
                            {
                                //解决前后台多次并发处理重复数据
                                ECommerce.Utility.Logger.WriteLog("订单已经支付!", "PayCallback", "CreateNetPay");
                                return(BuildPaymentCallbackReturnResult(payTypeSysNo, false));
                            }
                            if (ConstValue.PaymentInventory)
                            {
                                List <OrderItem> subOrderItemList = new List <OrderItem>();
                                context.SOInfo.SOItemList.ForEach(Item =>
                                {
                                    OrderProductItem opitem = new OrderProductItem();
                                    opitem["Quantity"]      = Item.Quantity;
                                    opitem.ProductSysNo     = int.Parse(Item.ProductID);
                                    opitem.ProductName      = Item.ProductName;
                                    opitem.WarehouseNumber  = int.Parse(Item.WarehouseNumber);
                                    subOrderItemList.Add(opitem);
                                });
                                subOrderItemList.ForEach(Item =>
                                {
                                    //限时促销
                                    if (PipelineDA.CheckCountDownByProductSysNo(Item.ProductSysNo))
                                    {
                                        //扣减订单商品库存
                                        int inventoryType = PipelineDA.GetInventoryType(Item);
                                        var rowCount      = PipelineDA.UpdateInventory(Item);
                                        if (rowCount != 1 && inventoryType != 1 && inventoryType != 3 && inventoryType != 5)
                                        {
                                            ECommerce.Utility.Logger.WriteLog("inventory: qty is not enough", "SOPipeline.CreateSOBasicPersister");
                                            throw new BusinessException(string.Format("商品【{0}】库存不足", Item.ProductName));
                                        }
                                        rowCount = PipelineDA.UpdateInventoryStock(Item);
                                        if (rowCount != 1 && inventoryType != 1 && inventoryType != 3 && inventoryType != 5)
                                        {
                                            ECommerce.Utility.Logger.WriteLog("inventory_stock: qty is not enough", "SOPipeline.CreateSOBasicPersister");
                                            throw new BusinessException(string.Format("商品【{0}】库存不足", Item.ProductName));
                                        }
                                    }
                                });
                            }


                            #region 2.发送支付成功邮件
                            //确认不需要发邮件
                            //CustomerInfo customer = CustomerDA.GetCustomerInfo(context.SOInfo.CustomerSysNo);
                            //if (!string.IsNullOrWhiteSpace(customer.Email))
                            //{
                            //    AsyncEmail email = new AsyncEmail();
                            //    email.MailAddress = customer.Email;
                            //    email.CustomerID = customer.CustomerID;
                            //    email.Status = (int)EmailStatus.NotSend;
                            //    string token = Guid.NewGuid().ToString("N");
                            //    email.ImgBaseUrl = ConfigurationManager.AppSettings["CDNWebDomain"].ToString();
                            //    email.SetNewTokenUrl = "/EmailVerifySucceed?token=" + token + "&sysno=" + customer.SysNo.ToString() + "&email=" + System.Web.HttpUtility.HtmlEncode(customer.Email);

                            //    string subject = string.Empty;
                            //    email.MailBody = MailHelper.GetMailTemplateBody("SalesOrderPaySuccessful", out subject);
                            //    email.MailSubject = subject.Replace("[SOSysNo]", context.SOInfo.SoSysNo.ToString());
                            //    //订单内容
                            //    email.MailBody = email.MailBody.Replace("[CustomerName]", customer.CustomerName);
                            //    email.MailBody = email.MailBody.Replace("[SOSysNo]", context.SOInfo.SoSysNo.ToString());
                            //    email.MailBody = email.MailBody.Replace("[PayAmount]", context.SOInfo.RealPayAmt.ToString("F2"));
                            //    email.MailBody = email.MailBody.Replace("[PayTypeName]", context.SOInfo.Payment.PayTypeName);
                            //    email.MailBody = email.MailBody.Replace("[OrderDate]", context.SOInfo.OrderDate.ToString());
                            //    email.MailBody = email.MailBody.Replace("[ReceiveName]", context.SOInfo.ReceiveName);
                            //    email.MailBody = email.MailBody.Replace("[SOMemo]", context.SOInfo.Memo);
                            //    email.MailBody = email.MailBody.Replace("[NowDate]", DateTime.Now.ToShortDateString());
                            //    EmailDA.SendEmail(email);
                            //}
                            #endregion

                            scope.Complete();
                        }

                        return(BuildPaymentCallbackReturnResult(payTypeSysNo, true));
                    }
                    else
                    {
                        ECommerce.Utility.Logger.WriteLog("返回支付失败", "PayCallback", "CheckPayResult");
                        return(BuildPaymentCallbackReturnResult(payTypeSysNo, false));
                    }
                }
                else
                {
                    //验签失败
                    return(BuildPaymentCallbackReturnResult(payTypeSysNo, false));
                }
            }
            catch (Exception ex)
            {
                //系统异常,写日志
                ECommerce.Utility.Logger.WriteLog(string.Format("系统异常,异常信息:{0}!", ex.ToString()), "PayCallback", "OnlinePayBgCallbackFailure");
                return(BuildPaymentCallbackReturnResult(payTypeSysNo, false));
            }
        }