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"]); } }); } }
/// <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)); } }