Пример #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"]);
                    }
                });
            }
        }
Пример #2
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));
            }
        }