示例#1
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"]);
                    }
                });
            }
        }