public virtual bool IsVSPOItemPriceLimited(int soSysNo, int productSysNo, int purchaseQty) { decimal price = 0m; SOInfo getCurrentSOInfo = SOBizInteract.GetSOInfo(soSysNo); if (null != getCurrentSOInfo) { SOItemInfo item = getCurrentSOInfo.Items.SingleOrDefault(x => x.ProductSysNo == productSysNo); if (null != item) { if (item.Price.HasValue) { price = item.Price.Value; } if (price >= 2000 && purchaseQty >= 3) { return(true); } if (purchaseQty * price >= 15000) { return(true); } return(false); } else { return(false); } } else { return(false); } }
/// <summary> /// 获取促销结果 /// </summary> /// <param name="origComboList"></param> /// <param name="soInfo"></param> /// <param name="soItemList"></param> /// <param name="promotionInfoList"></param> protected virtual void GetPromotionListForSO(List <ComboInfo> origComboList, SOInfo soInfo, ref List <SOItemInfo> soItemList, ref List <SOPromotionInfo> promotionInfoList) { //1.取当前订单商品有效的Combo List <ComboInfo> validComboList = GetValidComboList(origComboList, soItemList); if (validComboList.Count == 0) { return; } //2.按照这些可以参与活动的Combo列表,得到所有的折扣列表: 遵循最大Combo折扣优先原则,而不是客户最大折扣优先原则 List <ComboApplyInstance> comboApplyList = new List <ComboApplyInstance>(); foreach (ComboInfo combo in validComboList) { ComboApplyInstance comboApply = new ComboApplyInstance(); ComboInfo comboClone = SerializationUtility.DeepClone <ComboInfo>(combo); comboApply.ComboSysNo = comboClone.SysNo.Value; //获取当前Combo在订单中最多可以存在多少套: 取订单中满足该Combo商品中最小数量 int maxCount = int.MaxValue; foreach (ComboItem comboItem in comboClone.Items) { SOItemInfo soItem = soItemList.Find(f => f.ProductSysNo == comboItem.ProductSysNo); int curCount = soItem.Quantity.Value / comboItem.Quantity.Value; if (curCount < maxCount) { maxCount = curCount; } } comboApply.Qty = maxCount; decimal totalDiscount = 0.00m; foreach (ComboItem comboItem in comboClone.Items) { totalDiscount += Math.Round(comboItem.Discount.Value * comboItem.Quantity.Value * maxCount, 2); } //取Combo Total Discount的绝对值 comboApply.TotalDiscount = Math.Abs(totalDiscount); comboApplyList.Add(comboApply); } //3.得到折扣从大到小排序的列表 var comboApplySortList = from p in comboApplyList orderby p.TotalDiscount descending select p; //4.取最大折扣的Combo ComboApplyInstance maxDiscountComboApply = comboApplySortList.First(); ComboInfo curCombo = validComboList.Find(f => f.SysNo.Value == maxDiscountComboApply.ComboSysNo); SOPromotionInfo promotionInfo = GetPromotionInfoForCurrentCombo(curCombo, maxDiscountComboApply, ref soItemList, promotionInfoList.Count + 1, soInfo.SysNo); if (promotionInfo != null) { promotionInfoList.Add(promotionInfo); } //5.轮询调用剩下的订单商品 GetPromotionListForSO(validComboList, soInfo, ref soItemList, ref promotionInfoList); }
//判断三级类别,品牌,商品ID条件满足 private bool IsCategoryBrandMatch(SaleDiscountRule data, SOItemInfo soItem) { bool isItemMatch = true; //满足的条件数 int matchedConditionCount = 3; if (data.C3SysNo > 0 && soItem.C3SysNo > 0) { isItemMatch = isItemMatch && (data.C3SysNo == soItem.C3SysNo); } else { matchedConditionCount--; } if (data.BrandSysNo > 0 && soItem.BrandSysNo > 0) { isItemMatch = isItemMatch && (data.BrandSysNo == soItem.BrandSysNo); } else { matchedConditionCount--; } if (data.ProductSysNo > 0 && data.ProductGroupSysNo > 0) { int soItemProductGroupSysNo = 0; //需要注意组商品概念 isItemMatch = isItemMatch && (data.ProductSysNo == soItem.ProductSysNo || data.ProductGroupSysNo == soItemProductGroupSysNo); } else { matchedConditionCount--; } return(isItemMatch && matchedConditionCount > 0); }
/// <summary> /// 修改团购商品价格 /// </summary> public void UpdateGroupBuyProduct(SOItemInfo product) { DataCommand command = DataCommandManager.GetDataCommand("SO_Update_GroupBuySOItemPrice"); command.SetParameterValue(product); command.ExecuteNonQuery(); }
public void PriceChangedSendMail(SOInfo soInfo) { try { List <SOInternalMemoInfo> memoList = ObjectFactory <SOInternalMemoProcessor> .Instance.GetBySOSysNo(soInfo.SysNo.Value); List <int> productSysNoList = (from item in soInfo.Items select item.ProductSysNo.Value).ToList(); List <ECCentral.BizEntity.IM.ProductInfo> productList = ExternalDomainBroker.GetProductInfoListByProductSysNoList(productSysNoList); if (productList != null) { DataTable dtMemo = new DataTable(); dtMemo.Columns.AddRange(new DataColumn[] { new DataColumn("LogTime"), new DataColumn("Content"), new DataColumn("Note") }); productList.ForEach(p => { SOItemInfo item = soInfo.Items.Find(i => i.ProductSysNo.Value == p.SysNo); if (item != null) { KeyValueVariables keyValueVariables = new KeyValueVariables(); KeyTableVariables keyTableVariables = new KeyTableVariables(); string pmEmailAddress = p.ProductBasicInfo.ProductManager.UserInfo.EmailAddress; StringBuilder mailBody = new StringBuilder(); keyValueVariables.Add("SOSysNo", soInfo.SysNo.Value); keyValueVariables.Add("ProductID", item.ProductID); keyValueVariables.Add("ProductName", item.ProductName); keyValueVariables.Add("Quantity", item.Quantity); keyValueVariables.Add("Weight", item.Weight); keyValueVariables.Add("Price", item.Price); keyValueVariables.Add("GainAveragePoint", item.GainAveragePoint); keyValueVariables.Add("PromotionAmount", item.PromotionAmount); keyValueVariables.Add("Warranty", item.Warranty); if (memoList != null && memoList.Count > 0 && dtMemo.Rows.Count == 0) { foreach (SOInternalMemoInfo internalMemo in memoList) { DataRow dr = dtMemo.NewRow(); dr["LogTime"] = internalMemo.LogTime.HasValue ? internalMemo.LogTime.Value.ToString(SOConst.DateTimeFormat) : String.Empty; dr["Content"] = internalMemo.Content; dr["Note"] = internalMemo.Note; dtMemo.Rows.Add(dr); } } keyValueVariables.Add("MemoListDisplay", dtMemo.Rows.Count > 0); keyTableVariables.Add("MemoList", dtMemo); ExternalDomainBroker.SendInternalEmail("SO_Product_PriceChanged", keyValueVariables, keyTableVariables); } }); } } catch (Exception ex) { ExceptionHelper.HandleException(ex); } }
private List <SOItemInfo> SetItems() { // SELECT TOP 1 //pp.AcountPrice AS Price //,si.ProductSysNo //,si.Quantity //,si.BriefName //,si.WarehouseNumber //,W.StockName as WarehouseName //,P.Category3SysNo AS C3SysNo //,CASE WHEN si.ProductType<>4 THEN P.ProductID ELSE '' END AS ProductID //FROM ipp3.dbo.SO_Master sm WITH(nolock) //INNER JOIN ipp3.dbo.SO_Item si WITH(nolock) //ON sm.SysNo=si.SOSysNo //INNER JOIN OverseaContentManagement.dbo.V_CM_ItemBasicInfo P WITH(nolock) //on P.SysNo=si.ProductSysNo //INNER JOIN OverseaInventoryManagement.dbo.V_INM_Stock W WITH(nolock) //on W.SysNo = si.WarehouseNumber //INNER JOIN OverseaContentManagement.dbo.Unicom_ContractPhone_ContractB_Price pp WITH(nolock) //ON si.ProductSysNo=pp.PhoneProductSysno //WHERE //sm.SysNo=@SOSysNO //AND sm.OrderDate>=pp.StartDate //AND sm.OrderDate<pp.EndDate //上面是取得订单商品的SQL #warning 创建联通合约机补偿单,取得订单商品未实现 SOItemInfo phoneItem = null; if (phoneItem == null) { return(null); } List <SOItemInfo> itemList = new List <SOItemInfo>(); SOItemInfo item = new SOItemInfo(); item.ProductSysNo = phoneItem.ProductSysNo; item.StockSysNo = phoneItem.StockSysNo; //item.StockName = phoneItem.StockName; //item.ProductID = //item.C1SysNo = //item.C2SysNo = item.C3SysNo = phoneItem.C3SysNo; item.ProductID = phoneItem.ProductID; //item.Cost = //item.Weight =0; item.PromotionAmount = 0; //item.OnlineQty = item.OriginalPrice = phoneItem.Price; item.PriceType = SOProductPriceType.Normal; item.Price = phoneItem.Price; item.ProductName = phoneItem.ProductName; item.Quantity = phoneItem.Quantity; itemList.Add(item); return(itemList); }
/// <summary> /// 接收退货 /// </summary> /// <param name="rmaRequestSysNo">退换货申请单编号</param> /// <param name="userSysNo">操作人用户</param> /// <returns></returns> public static RMARequestInfo Receive(int rmaRequestSysNo, LoginUser operateUser) { RMARequestInfo request = LoadWithRequestSysNo(rmaRequestSysNo, operateUser.SellerSysNo); if (request == null) { throw new BusinessException(L("未找到编号为【{0}】的退换货申请单", rmaRequestSysNo)); } if (request.Status != RMARequestStatus.Origin) { throw new BusinessException(L("不能接收非“待处理”状态的申请单")); } if (request.Registers == null || request.Registers.Count <= 0) { throw new BusinessException(L("没有需要退换货的商品")); } //TODO: 虚拟仓库编码 request.ReceiveWarehouse = "90"; request.RecvTime = DateTime.Now; request.RecvUserSysNo = operateUser.UserSysNo; request.RecvUserName = operateUser.UserDisplayName; //收货后状态变成“处理中”,这个时候可以进行退货或退款操作 request.Status = RMARequestStatus.Handling; bool isWithin7Days = false; if (request.CustomerSendTime.HasValue) { isWithin7Days = request.CustomerSendTime.Value.AddDays(-7) < DateTime.Now; } List <SOItemInfo> soItems = SOService.GetSOItemInfoList(request.SOSysNo.Value); SOItemInfo soItem = null; foreach (var reg in request.Registers) { reg.OwnBy = RMAOwnBy.Customer; reg.Location = RMALocation.Self; reg.LocationWarehouse = request.ReceiveWarehouse; reg.IsWithin7Days = isWithin7Days; reg.Status = request.Status; soItem = soItems.Find(x => x.ProductSysNo == reg.ProductSysNo.Value && x.ProductType == reg.SoItemType.Value); if (soItem == null) { throw new BusinessException(L("订单中不存在申请退换货的商品:{0}【1】", reg.ProductName, reg.ProductID)); } reg.Cost = soItem.Cost; } ; UpdateWithRegisters(request); return(request); }
public virtual VirtualStockPurchaseOrderInfo LoadVirtualPurchaseInfoBySOItemSysNo(int soSysNo, int productSysNo) { int soItemSysNo = 0; string productID = string.Empty; string productName = string.Empty; int pmUserSysNo = 0; SOInfo getCurrentSOInfo = SOBizInteract.GetSOInfo(soSysNo); if (null != getCurrentSOInfo) { SOItemInfo item = getCurrentSOInfo.Items.SingleOrDefault(x => x.ProductSysNo == productSysNo); if (null != item) { ProductInfo getProductInfo = IMBizInteract.GetProductInfo(item.ProductSysNo.Value); soItemSysNo = item.SysNo.Value; productID = item.ProductID; productName = item.ProductName; pmUserSysNo = getProductInfo.ProductBasicInfo.ProductManager.SysNo.Value; } else { throw new BizException("订单明细号错误!"); } } else { throw new BizException("订单明细号错误!"); } VirtualStockPurchaseOrderInfo memoInfo = null; int isExist = SOBizInteract.GetGeneratedSOVirtualCount(soItemSysNo); if (isExist > 0) { memoInfo = VSPurchaseOrderDA.GetMemoInfoFromVirtualRequest(soItemSysNo); } int needPurchaseQty = VSPurchaseOrderDA.CalcVSPOQuantity(soItemSysNo); VirtualStockPurchaseOrderInfo returnEntity = new VirtualStockPurchaseOrderInfo() { PMMemo = (memoInfo == null ? string.Empty : memoInfo.PMMemo), CSMemo = (memoInfo == null ? string.Empty : memoInfo.CSMemo), SOSysNo = getCurrentSOInfo.SysNo.Value, ProductID = productID, ProductName = productName, ProductSysNo = productSysNo, PMUserSysNo = pmUserSysNo, PurchaseQty = isExist > 0 ? isExist : needPurchaseQty, SOItemSysNo = soItemSysNo, SOVirtualCount = isExist }; return(returnEntity); }
//判断单品规则是否满足 private int IsSingleMatch(SaleDiscountRule data, SOItemInfo soItem, decimal discountAmt) { int matchedTimes = 0; if (data.RuleType == SaleDiscountRuleType.AmountRule) { decimal itemAmt = soItem.Quantity.Value * soItem.Price.Value - discountAmt; matchedTimes = CalcTimesByAmt(data, itemAmt); } else { matchedTimes = CalcTimesByQty(data, soItem.Quantity.Value); } return(matchedTimes); }
private decimal GetItemDiscount(SOItemInfo item, List <SOPromotionInfo> alreadyApplyPromoList) { //计算商品已有折扣 decimal discountAmt = 0; foreach (var p in alreadyApplyPromoList) { foreach (var d in p.SOPromotionDetails) { if (d.MasterProductSysNo == item.ProductSysNo) { if (d.DiscountAmount.HasValue) { discountAmt += d.DiscountAmount.Value; } } } } return(discountAmt); }
private static int?GetSoItemQty(int productSysNo, SOProductType soItemType, int soSysNo) { var items = ObjectFactory <ISOBizInteract> .Instance.GetSOItemList(soSysNo); SOItemInfo item = null; if (soItemType == SOProductType.ExtendWarranty) { item = items.FirstOrDefault(p => p.MasterProductSysNo == productSysNo.ToString() && p.ProductType == SOProductType.ExtendWarranty); } else { item = items.FirstOrDefault(p => p.ProductSysNo == productSysNo && p.ProductType == soItemType); } if (item != null) { return(item.Quantity.Value); } return(default(int?)); }
/// <summary> /// 积分方面的赠送处理 /// </summary> /// <param name="promotionInfo"></param> /// <param name="soInfo"></param> /// <param name="canPromotionSOItemList"></param> /// <param name="rule"></param> protected void CalcPointRule(SOPromotionInfo promotionInfo, SOInfo soInfo, List <SOItemInfo> canPromotionSOItemList, PSPointScoreRule rule) { if (!rule.PointScore.HasValue) { return; } int canSendPoint = rule.PointScore.Value; //开始分摊积分 decimal sumAmount = 0.00m; //能够参与活动的商品总金额 foreach (SOItemInfo item in canPromotionSOItemList) { sumAmount += Math.Round(item.OriginalPrice.Value * ((decimal)item.Quantity.Value), 2); } int allocatedPoint = 0; for (int i = 0; i < promotionInfo.SOPromotionDetails.Count; i++) { SOPromotionDetailInfo detail = promotionInfo.SOPromotionDetails[i]; if (i < promotionInfo.SOPromotionDetails.Count - 1) { SOItemInfo item = soInfo.Items.Find(f => f.ProductSysNo == detail.MasterProductSysNo); int currentPoint = Convert.ToInt32(canSendPoint * (item.OriginalPrice.Value * item.Quantity.Value / sumAmount)); detail.GainPoint = currentPoint; allocatedPoint += currentPoint; } else { detail.GainPoint = canSendPoint - allocatedPoint; } } }
private SOPromotionDetailInfo CalcSingleDiscount(SaleDiscountRule data, SOItemInfo item, int matchedTimes) { decimal saleDiscountAmount = data.DiscountAmount * matchedTimes; return(GeneratePromoDetailInfo(item.ProductSysNo.Value, item.Quantity.Value, saleDiscountAmount)); }
private string ozzShip = AppSettingManager.GetSetting("RMA", "PushShipTypeName"); // 上门取件物流 "OZZO奥硕物流"; /// <summary> /// 创建申请单 /// </summary> /// <param name="request">申请单信息</param> /// <returns>申请单信息</returns> public virtual RMARequestInfo Create(RMARequestInfo request) { request.VerifyForCreate(); if (request.ShipViaCode.Trim() == ozzShip) { //奥硕上门地点判断 //ValidOZZOFetchToHome(request); } var refundItems = ObjectFactory <IRefundDA> .Instance.GetMasterByOrderSysNo(request.SOSysNo.Value); if (refundItems != null) { refundItems.ForEach(p => { if (p.Status == RMARefundStatus.Refunded && p.RefundReason.HasValue && p.RefundReason == 2) { throw new BizException(ResouceManager.GetMessageString("RMA.Request", "ExsitsNotCreateRequest")); } }); } SOInfo so = ExternalDomainBroker.GetSOInfo(request.SOSysNo.Value); if (so.BaseInfo.Status.Value != SOStatus.OutStock && so.BaseInfo.Status.Value != SOStatus.Shipping && so.BaseInfo.Status != SOStatus.Complete && so.BaseInfo.Status != SOStatus.Reported) { throw new BizException(ResouceManager.GetMessageString("RMA.Request", "OutStockNotCreateRequest")); } if (so.BaseInfo.SOType == SOType.ElectronicCard || so.BaseInfo.SOType == SOType.PhysicalCard) { throw new BizException(ResouceManager.GetMessageString("RMA.Request", "GiftCardNoRMA")); } if (so.BaseInfo.PayTypeSysNo == 203) { throw new BizException(ResouceManager.GetMessageString("RMA.Request", "RedeemGiftCertificatesNoRMA")); } if (so.BaseInfo.PayTypeSysNo.HasValue) { int t; if (int.TryParse(AppSettingManager.GetSetting(SOConst.DomainName, "GiftVoucher_PayTypeSysNo"), out t)) { if (so.BaseInfo.PayTypeSysNo.Value == t) { throw new BizException(ResouceManager.GetMessageString("RMA.Request", "GiftCertificatesNoRMA")); } } } CustomerContactInfo customerContactInfoEntity = GetCustomerContactInfo(request); BizEntity.Invoice.DeliveryType shipType = BizEntity.Invoice.DeliveryType.SELF; InvoiceType?invoceType = InvoiceType.SELF; StockType? stockType = StockType.SELF; int merchantSysNo = 1; if (so != null) { shipType = so.ShippingInfo.ShippingType; invoceType = so.InvoiceInfo.InvoiceType; stockType = so.ShippingInfo.StockType; merchantSysNo = so.BaseInfo.Merchant.MerchantID ?? 0; } using (TransactionScope tran = new TransactionScope()) { request.SysNo = CreateSysNo(); request.RequestID = GenerateId(request.SysNo.Value); //创建申请单初始状态为【待审核】 add by norton 2012.11.21 request.Status = RMARequestStatus.WaitingAudit; request.IsSubmit = true; request.ShippingType = shipType; request.InvoiceType = invoceType; request.StockType = stockType; request.MerchantSysNo = merchantSysNo; requestDA.Create(request); customerContactInfoEntity.RMARequestSysNo = request.SysNo; customerContactInfoEntity.ReceiveCellPhone = so.ReceiverInfo.MobilePhone; customerContactInfoEntity.ReceiveZip = so.ReceiverInfo.Zip; ObjectFactory <CustomerContactProcessor> .Instance.Create(customerContactInfoEntity); request.Registers.ForEach(register => { register.SysNo = registerDA.CreateSysNo(); register.BasicInfo.Status = RMARequestStatus.Origin; register.BasicInfo.OwnBy = RMAOwnBy.Origin; register.BasicInfo.Location = RMALocation.Origin; register.BasicInfo.IsWithin7Days = false; register.CheckInfo.IsRecommendRefund = false; register.RevertInfo.NewProductStatus = RMANewProductStatus.Origin; register.BasicInfo.NextHandler = RMANextHandler.RMA; register.CompanyCode = request.CompanyCode; SOItemInfo item = so.Items.FirstOrDefault(p => p.ProductSysNo == register.BasicInfo.ProductSysNo.Value); register.BasicInfo.ShippedWarehouse = item.StockSysNo.ToString(); register.VerifyCreate(); registerDA.Create(register); registerDA.InsertRequestItem(request.SysNo.Value, register.SysNo.Value); //创建成功后,发送邮件 //if (request.VerifyForSendCreateEmail()) //{ // var customer = ExternalDomainBroker.GetCustomerInfo(request.CustomerSysNo.Value); // SendCreateEmail(customer.BasicInfo.Email, request.RequestID); //} }); tran.Complete(); } ExternalDomainBroker.CreateOperationLog("RMA_Request_Create", BizLogType.RMA_Request_Create, request.SysNo.Value, request.CompanyCode); return(request); }
public List <SOPriceMasterInfo> SplitSO() { bool isCombine = CurrentSO.ShippingInfo.IsCombine.HasValue ? CurrentSO.ShippingInfo.IsCombine.Value : false; decimal currenSOInvocieAmount = SOCommon.CalculateInvoiceAmount(CurrentSO.BaseInfo.CashPay, CurrentSO.BaseInfo.PremiumAmount.Value, CurrentSO.BaseInfo.ShipPrice.Value, CurrentSO.BaseInfo.PayPrice.Value, CurrentSO.BaseInfo.PromotionAmount.Value, CurrentSO.BaseInfo.GiftCardPay.Value, CurrentSO.BaseInfo.PayWhenReceived.Value); decimal currenSOReceivableAmount = CurrentSO.BaseInfo.ReceivableAmount; List <SOPriceMasterInfo> soPriceList = new List <SOPriceMasterInfo>(); if (CurrentSO.Items == null || CurrentSO.Items.Count == 0) { return(soPriceList);//BackOrder订单存在0 item的情况 } //排序的目的是为了最后一个商品的价格是最大的,不会因为减去折扣失败,导致重新计算 List <SOItemInfo> soItemList = CurrentSO.Items.OrderBy(item => item.Price) .Select(item => item) .ToList(); SOItemInfo soLastSOItem = soItemList.Last(); SOItemInfo soLastSOItemNoExtend = soItemList.Where(item => (item.ProductType != SOProductType.ExtendWarranty && item.ProductType != SOProductType.Coupon)).Last(); //拆分逻辑 decimal itemSumValue = CurrentSO.Items.Sum(x => x.Price.Value * x.Quantity.Value) + CurrentSO.BaseInfo.PromotionAmount.Value; //计算Item总重量,因为延保和优惠券Weight为0,这里不用排除 decimal totalWeight = CurrentSO.Items.Sum(x => x.Weight.Value * x.Quantity.Value); decimal residual_CashPay = CurrentSO.BaseInfo.CashPay; decimal residual_PayPrice = CurrentSO.BaseInfo.PayPrice.Value; decimal residual_PointPay = CurrentSO.BaseInfo.PointPayAmount.Value; decimal residual_PremiumAmt = CurrentSO.BaseInfo.PremiumAmount.Value; decimal residual_PrepayAmt = CurrentSO.BaseInfo.PrepayAmount.Value; decimal residual_ShippingCharge = CurrentSO.BaseInfo.ShipPrice.Value; decimal residual_GiftCardPay = CurrentSO.BaseInfo.GiftCardPay.Value; //找到所有优惠券 List <SOPriceItemInfo> couponProductPriceInfoList = new List <SOPriceItemInfo>(); //找到所有延保 List <SOPriceItemInfo> extendWarrentyProductPriceInfoList = new List <SOPriceItemInfo>(); soItemList.ForEach(item => { SOPriceItemInfo priceItem = new SOPriceItemInfo(); decimal itemRate = (item.Price.Value * item.Quantity.Value + item.PromotionAmount.Value) / (itemSumValue <= 0 ? 1 : itemSumValue); decimal itemRateForShippingCharge = item.Weight.Value * item.Quantity.Value / (totalWeight <= 0 ? 1 : totalWeight); priceItem.MasterProductSysNo = item.MasterProductSysNo; priceItem.PromotionAmount = item.PromotionAmount; priceItem.Price = item.Price; priceItem.OriginalPrice = item.OriginalPrice; priceItem.ProductSysNo = item.ProductSysNo; priceItem.ProductType = item.ProductType; priceItem.Quantity = item.Quantity; priceItem.CouponAmount = item.CouponAmount; priceItem.GainPoint = item.GainPoint; priceItem.MasterSysNo = 0;//暂时放仓库编号,作为分仓的中间变量 //对非优惠券项进行分摊 if (item.ProductType != SOProductType.Coupon) { if (item != soLastSOItem) { priceItem.PayPrice = UtilityHelper.ToMoney(CurrentSO.BaseInfo.PayPrice.Value * itemRate); residual_PayPrice -= priceItem.PayPrice.Value; priceItem.PointPayAmount = UtilityHelper.ToMoney(CurrentSO.BaseInfo.PointPayAmount.Value * itemRate); residual_PointPay -= priceItem.PointPayAmount.Value; priceItem.PremiumAmount = UtilityHelper.ToMoney(CurrentSO.BaseInfo.PremiumAmount.Value * itemRate); residual_PremiumAmt -= priceItem.PremiumAmount.Value; } else { priceItem.PayPrice = UtilityHelper.ToMoney(residual_PayPrice); priceItem.PointPayAmount = UtilityHelper.ToMoney(residual_PointPay); priceItem.PremiumAmount = UtilityHelper.ToMoney(residual_PremiumAmt); } if (item != soLastSOItemNoExtend) { priceItem.ShipPrice = UtilityHelper.ToMoney(CurrentSO.BaseInfo.ShipPrice.Value * itemRateForShippingCharge); residual_ShippingCharge -= priceItem.ShipPrice.Value; } else { priceItem.ShipPrice = UtilityHelper.ToMoney(residual_ShippingCharge); } //计算现金支付 priceItem.CashPay = UtilityHelper.ToMoney(CalculateSOPriceItemCashPay(priceItem)); decimal priceRate_Prepay = (priceItem.CashPay.Value + priceItem.PayPrice.Value + priceItem.ShipPrice.Value + priceItem.PromotionAmount.Value + priceItem.PremiumAmount.Value) / (CurrentSO.BaseInfo.SOTotalAmount <= 0 ? 1 : CurrentSO.BaseInfo.SOTotalAmount); if (item != soLastSOItem) { priceItem.PrepayAmount = UtilityHelper.ToMoney(CurrentSO.BaseInfo.PrepayAmount.Value * priceRate_Prepay); residual_PrepayAmt -= priceItem.PrepayAmount.Value; priceItem.GiftCardPay = UtilityHelper.ToMoney(CurrentSO.BaseInfo.GiftCardPay.Value * priceRate_Prepay); residual_GiftCardPay -= priceItem.GiftCardPay.Value; } else { priceItem.PrepayAmount = UtilityHelper.ToMoney(residual_PrepayAmt); priceItem.GiftCardPay = UtilityHelper.ToMoney(residual_GiftCardPay); } priceItem.ExtendPrice = priceItem.OriginalPrice * priceItem.Quantity; priceItem.InvoiceAmount = item.OriginalPrice * item.Quantity; } // 根据仓库编号将订单商品价格信息分组 switch (item.ProductType.Value) { case SOProductType.Product: case SOProductType.Gift: case SOProductType.Award: case SOProductType.Accessory: case SOProductType.SelfGift: { SOPriceMasterInfo soPriceInfo = soPriceList.Find((p) => { return(p.StockSysNo == item.StockSysNo); }); if (soPriceInfo == null) { soPriceInfo = new SOPriceMasterInfo(); soPriceInfo.StockSysNo = item.StockSysNo; soPriceList.Add(soPriceInfo); } soPriceInfo.Items.Add(priceItem); break; } case SOProductType.Coupon: couponProductPriceInfoList.Add(priceItem); break; case SOProductType.ExtendWarranty: extendWarrentyProductPriceInfoList.Add(priceItem); break; } }); int i = 0; foreach (SOPriceMasterInfo soPriceInfo in soPriceList) { i++; //添加优惠券到每个分仓 soPriceInfo.Items.AddRange(couponProductPriceInfoList); //延保跟随主商品 extendWarrentyProductPriceInfoList.ForEach(item => { if (soPriceInfo.Items.Exists(o => o.ProductSysNo == int.Parse(item.MasterProductSysNo))) { soPriceInfo.Items.Add(item); } }); soPriceInfo.CashPay = soPriceInfo.Items.Sum(item => item.CashPay); soPriceInfo.PromotionAmount = soPriceInfo.Items.Sum(item => item.PromotionAmount); soPriceInfo.PayPrice = soPriceInfo.Items.Sum(item => item.PayPrice); soPriceInfo.PointPayAmount = soPriceInfo.Items.Sum(item => item.PointPayAmount); soPriceInfo.PremiumAmount = soPriceInfo.Items.Sum(item => item.PremiumAmount); soPriceInfo.PrepayAmount = soPriceInfo.Items.Sum(item => item.PrepayAmount); soPriceInfo.CouponAmount = soPriceInfo.Items.Sum(item => item.CouponAmount); soPriceInfo.ShipPrice = soPriceInfo.Items.Sum(item => item.ShipPrice); soPriceInfo.GainPoint = soPriceInfo.Items.Sum(item => item.GainPoint); soPriceInfo.GiftCardPay = soPriceInfo.Items.Sum(item => item.GiftCardPay); soPriceInfo.SOAmount = UtilityHelper.ToMoney(soPriceInfo.Items .Where(item => item.ProductType == SOProductType.Product || item.ProductType == SOProductType.ExtendWarranty) .Sum(item => item.OriginalPrice.Value * item.Quantity.Value)); decimal substactAmt = 0; //模式4,发票金额为0 if (CurrentSO.InvoiceInfo.InvoiceType == InvoiceType.MET && CurrentSO.ShippingInfo.StockType == StockType.SELF && CurrentSO.ShippingInfo.ShippingType == ECCentral.BizEntity.Invoice.DeliveryType.SELF) { foreach (SOPriceItemInfo subItem in soPriceInfo.Items) { substactAmt += subItem.Price.Value * subItem.Quantity.Value; subItem.InvoiceAmount = 0; } } //商家仓储,商家开票 if (CurrentSO.ShippingInfo.StockType == StockType.MET && CurrentSO.InvoiceInfo.InvoiceType == InvoiceType.MET) { foreach (SOPriceItemInfo subItem in soPriceInfo.Items) { substactAmt += subItem.Price.Value * subItem.Quantity.Value; subItem.InvoiceAmount = 0; } } //代收代付的商品需减去InvocieAmt currenSOInvocieAmount -= substactAmt; if (i == soPriceList.Count) { soPriceInfo.InvoiceAmount = CalculateInvoiceAmount(soPriceInfo, CurrentSO.BaseInfo.PayWhenReceived.Value, isCombine) - substactAmt; currenSOInvocieAmount -= soPriceInfo.InvoiceAmount.Value; soPriceInfo.ReceivableAmount = CalculateReceivableAmount(soPriceInfo, CurrentSO.BaseInfo.PayWhenReceived.Value, isCombine); currenSOReceivableAmount -= soPriceInfo.ReceivableAmount.Value; } else { soPriceInfo.InvoiceAmount = currenSOInvocieAmount; soPriceInfo.ReceivableAmount = currenSOReceivableAmount; } soPriceInfo.InvoiceAmount = soPriceInfo.InvoiceAmount < 0 ? 0 : soPriceInfo.InvoiceAmount; soPriceInfo.SOSysNo = SOSysNo; soPriceInfo.Status = SOPriceStatus.Original; } TransactionOptions options = new TransactionOptions(); options.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) { //初始化数据,如果存在则删除 SOPriceDA.DeleteSOPriceBySOSysNo(SOSysNo); foreach (SOPriceMasterInfo priceInfo in soPriceList) { SOPriceDA.InsertSOPrice(priceInfo, CurrentSO.CompanyCode); foreach (SOPriceItemInfo priceItem in priceInfo.Items) { priceItem.MasterSysNo = priceInfo.SysNo; SOPriceDA.InsertSOPriceItem(priceItem, SOSysNo, CurrentSO.CompanyCode); } } scope.Complete(); } return(soPriceList); }
/// <summary> /// 更新团购订单 /// </summary> /// <param name="CurrentSO"></param> /// <returns></returns> public void Update() { ValidationSOEntity(); ValidationGroupBuyingRules(); SOItemInfo groupBuyProduct = CurrentSO.Items.Find(item => item.ProductSysNo == ProductSysNo); if (groupBuyProduct == null) { return; } //可能有赠品,但是只会有一个主商品 int groupBuySysNo = groupBuyProduct.ReferenceSysNo.Value; GroupBuyingInfo gbInfo = ExternalDomainBroker.GetGroupBuyInfoBySysNo(groupBuySysNo); decimal dealPrice = gbInfo.GBPrice.HasValue ? gbInfo.GBPrice.Value : -1; if (dealPrice < 0) { throw new BizException(ResourceHelper.Get("SO_Audit_GroupNotDealPrice", CurrentSO.SysNo)); } if (groupBuyProduct != null && dealPrice < groupBuyProduct.Price) { SOInfo newSOInfo = new SOInfo(); //newSOInfo.SOItemList = SerializeHelper.DeepClone(soInfo.SOItemList); List <SOItemInfo> otherItems = CurrentSO.Items.FindAll(x => x.ProductSysNo != ProductSysNo); decimal oldSOAmt = 0.0m; if (otherItems != null && otherItems.Count > 0) { oldSOAmt = otherItems.Sum(x => x.OriginalPrice.Value * x.Quantity.Value); } decimal newSOAmt = oldSOAmt; if (groupBuyProduct.ProductType == SOProductType.Product) { groupBuyProduct.Price = dealPrice; groupBuyProduct.OriginalPrice = dealPrice; groupBuyProduct.SettlementStatus = SettlementStatus.Success; //团购订单不能用优惠卷 newSOAmt += dealPrice * groupBuyProduct.Quantity.Value; } int refundPoint = 0; decimal refundPrepay = 0.0m; decimal refundGiftCard = 0.0m; decimal difference = CurrentSO.BaseInfo.SOAmount.Value - newSOAmt; decimal newPrepayAmt = CurrentSO.BaseInfo.PrepayAmount.Value; decimal newGiftCardPay = CurrentSO.BaseInfo.GiftCardPay.Value; decimal newPremiumAmt = CurrentSO.BaseInfo.PremiumAmount.Value; int newPointPay = CurrentSO.BaseInfo.PointPay.Value; decimal newCashPay = newSOAmt - Math.Abs(CurrentSO.BaseInfo.PointPayAmount.Value); ECCentral.BizEntity.Common.ShippingType shippingType = ExternalDomainBroker.GetShippingTypeBySysNo(CurrentSO.ShippingInfo.ShipTypeSysNo.Value); if (CurrentSO.BaseInfo.IsPremium.Value) { if (shippingType != null && newSOAmt > shippingType.PremiumBase) { newPremiumAmt = UtilityHelper.ToMoney(newSOAmt * shippingType.PremiumRate.Value); } } decimal pointToMoneyRatio = ExternalDomainBroker.GetPointToMoneyRatio(); #region 退款逻辑 //退款优先级:1.先退现金支付(注意:不在这里退还),2.退余额支付,3.退礼品卡支付,4.退积分支付 // 1. 需退还的:余额支付金额,退礼支付品金额,积分支付金额的总合 decimal refundPayAmount = CurrentSO.BaseInfo.PrepayAmount.Value + CurrentSO.BaseInfo.GiftCardPay.Value + CurrentSO.BaseInfo.PointPayAmount.Value - (newSOAmt + newPremiumAmt + CurrentSO.BaseInfo.ShipPrice.Value); // 2. 如果使用余额支付,退到余额 if (refundPayAmount > 0) { refundPrepay = refundPayAmount > CurrentSO.BaseInfo.PrepayAmount ? CurrentSO.BaseInfo.PrepayAmount.Value : refundPayAmount; newPrepayAmt = CurrentSO.BaseInfo.PrepayAmount.Value - refundPrepay; refundPayAmount = refundPayAmount - refundPrepay; // 3. 如果使用礼品卡支付,退到礼品卡 if (refundPayAmount > 0) { refundGiftCard = refundPayAmount > CurrentSO.BaseInfo.GiftCardPay ? CurrentSO.BaseInfo.GiftCardPay.Value : refundPayAmount; newGiftCardPay = CurrentSO.BaseInfo.GiftCardPay.Value - refundGiftCard; refundPayAmount = refundPayAmount - refundGiftCard; // 4. 如果使用积分支付,退积分 if (refundPayAmount > 0) { decimal refundPointAmount = refundPayAmount > CurrentSO.BaseInfo.PointPayAmount ? CurrentSO.BaseInfo.PointPayAmount.Value : refundPayAmount; refundPayAmount = refundPayAmount - refundPointAmount; decimal newPontPayAmount = CurrentSO.BaseInfo.PointPayAmount.Value - refundPointAmount; newPointPay = (int)(newPontPayAmount * pointToMoneyRatio); refundPoint = (int)(refundPointAmount * pointToMoneyRatio); newCashPay = newSOAmt - newPontPayAmount; } } } #endregion ECCentral.BizEntity.Common.PayType payType = ExternalDomainBroker.GetPayTypeBySysNo(CurrentSO.BaseInfo.PayTypeSysNo.Value); decimal newPayPrice = Math.Max(UtilityHelper.ToMoney(payType.PayRate.Value * (newCashPay + CurrentSO.BaseInfo.ShipPrice.Value + newPremiumAmt - newPrepayAmt - newGiftCardPay)), 0M); CurrentSO.BaseInfo.SOAmount = newSOAmt; CurrentSO.BaseInfo.PremiumAmount = newPremiumAmt; CurrentSO.BaseInfo.PayPrice = newPayPrice; CurrentSO.BaseInfo.GiftCardPay = newGiftCardPay; CurrentSO.BaseInfo.PointPay = newPointPay; CurrentSO.BaseInfo.PointPayAmount = CurrentSO.BaseInfo.PointPay.Value / pointToMoneyRatio; CurrentSO.BaseInfo.PrepayAmount = newPrepayAmt; TransactionOptions options = new TransactionOptions(); options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) { SODA.UpdateGroupBuySOAmount(CurrentSO.BaseInfo); SODA.UpdateGroupBuyProduct(groupBuyProduct); if (refundPrepay > 0) { ExternalDomainBroker.AdjustPrePay(new BizEntity.Customer.CustomerPrepayLog { AdjustAmount = refundPrepay, CustomerSysNo = CurrentSO.BaseInfo.CustomerSysNo, Note = "Update SO For GroupBuying", PrepayType = ECCentral.BizEntity.Customer.PrepayType.SOPay, SOSysNo = CurrentSO.SysNo, }); } if (refundGiftCard > 0) { ExternalDomainBroker.GiftCardVoidForSOUpdate(newGiftCardPay, CurrentSO.SOGiftCardList, CurrentSO.CompanyCode); } if (refundPoint > 0) { ExternalDomainBroker.AdjustPoint(new BizEntity.Customer.AdjustPointRequest { CustomerSysNo = CurrentSO.BaseInfo.CustomerSysNo, Memo = "Update Group Buying SO", OperationType = ECCentral.BizEntity.Customer.AdjustPointOperationType.AddOrReduce, Point = refundPoint, PointType = (int)ECCentral.BizEntity.Customer.AdjustPointType.UpdateSO, SOSysNo = CurrentSO.SysNo, Source = SOConst.DomainName }); } scope.Complete(); } } WriteLog(BizEntity.Common.BizLogType.Sale_SO_Update, "IPP更改团购订单"); }
/// <summary> /// 批量处理文件中的商品信息,并且返回处理后的结果 /// </summary> /// <param name="fileContent"></param> /// <returns></returns> public List <SOItemInfo> BatchDealItemFromFile(byte[] fileContent) { List <SOItemInfo> items = null; try { //格式验证,处理 var workBook = new HSSFWorkbook(new MemoryStream(fileContent)); var sheet = workBook.GetSheetAt(0); var rows = sheet.GetRowEnumerator(); //过滤两行 rows.MoveNext(); rows.MoveNext(); if (!rows.MoveNext()) { BizExceptionHelper.Throw("Res_SO_NoMoveNext"); } items = new List <SOItemInfo>(); do { var item = new SOItemInfo(); Row row = (Row)rows.Current; //商品Item Cell cell = row.GetCell(0); if (cell == null || cell.CellType == CellType.BLANK) { //略过 continue; } if (string.IsNullOrEmpty(cell.StringCellValue) || cell.StringCellValue.Trim().Length == 0) { BizExceptionHelper.Throw("Res_SO_ProductIDIsNullOrEmpty"); } item.ProductID = cell.StringCellValue.Trim(); //商品价格 cell = row.GetCell(1); if (cell != null && cell.CellType != CellType.BLANK) { if (cell.CellType == CellType.NUMERIC) { decimal price = 0.0m; if (decimal.TryParse(cell.NumericCellValue.ToString(), out price)) { item.Price_End = price; } else { BizExceptionHelper.Throw("Res_SO_ProductIDNoPrice", item.ProductID); } if (price < 0) { BizExceptionHelper.Throw("Res_SO_ProductIDNoPriceOne", item.ProductID); } } else { BizExceptionHelper.Throw("Res_SO_ProductIDNoPrice", item.ProductID); } } //商品数量 cell = row.GetCell(2); if (cell != null && cell.CellType == CellType.NUMERIC) { int qty = 0; if (int.TryParse(cell.NumericCellValue.ToString(), out qty)) { item.Quantity = qty; } else { BizExceptionHelper.Throw("Res_SO_ProductIDNoQuantity", item.ProductID); } if (qty <= 0) { BizExceptionHelper.Throw("Res_SO_ProductIDNoQuantityOne", item.ProductID); } } else { BizExceptionHelper.Throw("Res_SO_ProductIDNoQuantityTwo", item.ProductID); } //价格补偿原因 cell = row.GetCell(3); if (cell != null) { item.AdjustPriceReason = cell.StringCellValue; } else { item.AdjustPriceReason = "系统批量上传"; } items.Add(item); } while (rows.MoveNext()); int maxCount = 1000; if (items.Count > maxCount) { BizExceptionHelper.Throw("Res_SO_ProductMaxItem", maxCount.ToString()); } if (items.Count == 0) { BizExceptionHelper.Throw("Res_SO_NoMoveNext"); } #region 效性验证 //不能有重复的 var groups = items.GroupBy(p => p.ProductID); foreach (var group in groups) { if (group.Count() > 1) { BizExceptionHelper.Throw("Res_SO_ProductIDDuplicateData", group.Key); } } #endregion } catch (Exception ex) { BizExceptionHelper.Throw(ex.Message); } return(items); }
/// <summary> /// 填充调用与外Domain相关的字段 /// </summary> /// <param name="soList"></param> protected void FillSOInfo(List <SOInfo> soList) { if (soList != null && soList.Count > 0) { List <SOItemInfo> soItemList = new List <SOItemInfo>(); List <int> productSysNoList = new List <int>(); List <int> customerSysNoList = new List <int>(); List <SOItemInfo> exItemList = new List <SOItemInfo>(); soList.ForEach(soInfo => { //取得订单使用的礼品卡记录 soInfo.SOGiftCardList = ExternalDomainBroker.GetSOGiftCardBySOSysNo(soInfo.SysNo.Value); if (!customerSysNoList.Exists(no => no == soInfo.BaseInfo.CustomerSysNo.Value)) { customerSysNoList.Add(soInfo.BaseInfo.CustomerSysNo.Value); } soInfo.Items.ForEach(item => { item.ProductID = string.Empty; switch (item.ProductType.Value) { case SOProductType.Coupon: item.ProductID = item.ProductSysNo.ToString(); soItemList.Add(item); break; case SOProductType.ExtendWarranty: exItemList.Add(item); break; default: { soItemList.Add(item); if (!productSysNoList.Exists(sysNo => sysNo == item.ProductSysNo)) { productSysNoList.Add(item.ProductSysNo.Value); } break; } } }); }); List <CustomerBasicInfo> customerList = ExternalDomainBroker.GetCustomerBasicInfo(customerSysNoList); if (customerList != null) { customerList.ForEach(c => { SOInfo soInfo = soList.Find(so => so.BaseInfo.CustomerSysNo == c.CustomerSysNo); if (soInfo != null) { soInfo.BaseInfo.CustomerID = c.CustomerID; soInfo.BaseInfo.CustomerName = c.CustomerName; } }); } if (productSysNoList.Count > 0) { List <ECCentral.BizEntity.IM.ProductInfo> productList = ExternalDomainBroker.GetProductInfoListByProductSysNoList(productSysNoList); if (productList != null) { productList.ForEach(product => { List <SOItemInfo> itemList = soItemList.FindAll(item => { return(item.ProductType != SOProductType.Coupon && item.ProductType != SOProductType.ExtendWarranty && item.ProductSysNo == product.SysNo); }); foreach (SOItemInfo item in itemList) { item.ProductID = product.ProductID; } }); exItemList.ForEach(ei => { int mpNo = int.TryParse(ei.MasterProductSysNo, out mpNo) ? mpNo : int.MinValue; SOItemInfo mp = soItemList.Find(i => i.ProductSysNo == mpNo); if (mp != null) { ei.ProductID = mp.ProductID + "E"; } }); } } } }
/// <summary> /// 计算商品最终售价 /// 原则:取最优客户价格 /// </summary> /// <param name="soInfo"></param> public virtual void CalculateItemPrice(SOInfo soInfo) { //礼品卡订单不获取价格 if (soInfo.BaseInfo.SOType == SOType.ElectronicCard || soInfo.BaseInfo.SOType == SOType.PhysicalCard) { soInfo.Items.ForEach(item => { item.GainAveragePoint = 0; item.PayType = ProductPayType.MoneyOnly; }); return; } //获取商品价格信息 List <int> itemSysNos = soInfo.Items.Where(item => item.ProductType == SOProductType.Accessory || item.ProductType == SOProductType.Award || item.ProductType == SOProductType.Gift || item.ProductType == SOProductType.Product || item.ProductType == SOProductType.SelfGift) .Select <SOItemInfo, int>(item => item.ProductSysNo.Value).ToList <int>(); List <ProductInfo> productInfoList = ExternalDomainBroker.GetProductInfoListByProductSysNoList(itemSysNos); if (productInfoList != null && productInfoList.Count > 0) { foreach (var item in soInfo.Items) { //普通商品处理逻辑 if (item.ProductType == SOProductType.Product) { ProductPriceInfo priceInfo = null; ProductInfo productInfoTemp = productInfoList.Find(x => x.SysNo == item.ProductSysNo); if (productInfoTemp != null) { priceInfo = productInfoTemp.ProductPriceInfo; } if (priceInfo != null) { item.CostPrice = priceInfo.UnitCost; item.PayType = priceInfo.PayType;//Vantal Update 属性名称修改 item.GainAveragePoint = priceInfo.Point; item.OriginalPrice = priceInfo.CurrentPrice; CustomerRank customerRank = ExternalDomainBroker.GetCustomerRank(soInfo.BaseInfo.CustomerSysNo.Value); #warning 批发与手动修改价格逻辑需要再处理, 更新订单逻辑也需要考虑 decimal tempWholeSalePrice = 0.00M; decimal tempMemberPrice = 0.00M; //如果商品支持批发价,商品售价取最优批发价格 if (priceInfo.ProductWholeSalePriceInfo != null && priceInfo.ProductWholeSalePriceInfo.Count > 0) { //取最优批发价 priceInfo.ProductWholeSalePriceInfo.OrderBy(l => l.Level) .ToList() .ForEach(w => { if (item.Quantity >= w.Qty) { tempWholeSalePrice = w.Price.Value; } }); } //优先使用会员价 priceInfo.ProductRankPrice.OrderBy(r => r.Rank) .ToList() .ForEach(r => { if (r.Status.HasValue && r.Status == ProductRankPriceStatus.Active && customerRank >= r.Rank) { tempMemberPrice = r.RankPrice.Value; } }); if (tempWholeSalePrice != 0) { item.OriginalPrice = Math.Min(tempWholeSalePrice, item.OriginalPrice.Value); item.PriceType = SOProductPriceType.WholeSale; } if (tempMemberPrice != 0) { if (tempMemberPrice <= tempWholeSalePrice) { item.OriginalPrice = Math.Min(tempMemberPrice, item.OriginalPrice.Value); item.PriceType = SOProductPriceType.Member; } } if (item.PriceType == SOProductPriceType.WholeSale) { //批发无积分 item.GainAveragePoint = 0; } if (m_isManualPrice) { //重新计算Discount if (item.Price_End > 0) { item.AdjustPrice = item.OriginalPrice.Value - item.Price_End; //初始化调价 item.Price_End = 0; } item.OriginalPrice = item.OriginalPrice - item.AdjustPrice; } //更新状态购物车的单件商品没有修改数量按原始价格计算 if (IsUpdate) { var originalItem = OriginalSOInfo.Items.Find(oitem => oitem.ProductSysNo == item.ProductSysNo); if (originalItem != null && item.Quantity == originalItem.Quantity) { //如果手动改价 if (item.AdjustPrice != originalItem.AdjustPrice) { item.OriginalPrice = (originalItem.OriginalPrice ?? 0) + originalItem.AdjustPrice - item.AdjustPrice; //continue; } } } item.Price = item.OriginalPrice; } } //优惠券和延保不赠积分 else if (item.ProductType == SOProductType.Coupon) { item.GainAveragePoint = 0; item.PayType = ProductPayType.All; } else if (item.ProductType == SOProductType.ExtendWarranty) { item.OriginalPrice = item.Price; item.GainAveragePoint = 0; item.PayType = ProductPayType.All; //数量 var masterProduct = soInfo.Items.First(p => p.ProductSysNo.ToString() == item.MasterProductSysNo); item.Quantity = masterProduct.Quantity; } //是赠品,附件,奖品则价格为0, 积分为0 else { ProductPriceInfo priceInfo = null; ProductInfo productInfoTemp = productInfoList.Find(x => x.SysNo == item.ProductSysNo); if (productInfoTemp != null) { priceInfo = productInfoTemp.ProductPriceInfo; } if (priceInfo != null) { item.CostPrice = priceInfo.UnitCost; } item.OriginalPrice = 0; item.Price = 0; item.PayType = ProductPayType.All; } } } if (m_isManualPrice) { if (IsUpdate) { foreach (var item in soInfo.Items) { SOItemInfo oldSOItem = OriginalSOInfo.Items.Find(oldItem => oldItem.ProductSysNo == item.ProductSysNo); if (oldSOItem != null) { if (!(item.PromotionAmount == 0 && string.IsNullOrEmpty(item.AdjustPriceReason)) && !(item.Price_End != item.Price)) { item.OriginalPrice = item.OriginalPrice + oldSOItem.PromotionAmount - item.PromotionAmount; } } item.Price = item.OriginalPrice; } } else if (soInfo.BaseInfo.SOType == SOType.Gift) { //赠品订单做补偿时使用 soInfo.Items.ForEach(item => { item.PromotionAmount = item.OriginalPrice; item.AdjustPriceReason = "赠品订单自动调整"; item.OriginalPrice = 0; item.Price = 0; }); } } }
/// <summary> /// 将3层结构OrderInfo中的所有商品转换为平面结构的SOItem列表 /// </summary> /// <param name="orderInfo"></param> /// <param name="isIncludeGiftAndAttachment">是否要包含赠品和附件</param> /// <param name="isIncludePlusPriceProduct">是否要包含加购商品</param> /// <returns></returns> internal static List <SOItemInfo> ConvertToSOItemList(OrderInfo orderInfo, bool isIncludeGiftAndAttachment, bool isIncludePlusPriceProduct = false) { List <SOItemInfo> soItemList = new List <SOItemInfo>(); //合并Shopping商品组中的商品 foreach (OrderItemGroup orderItemGroup in orderInfo.OrderItemGroupList) { foreach (OrderProductItem orderProductItem in orderItemGroup.ProductItemList) { SOItemInfo soItem = soItemList.Find(f => f.ProductSysNo == orderProductItem.ProductSysNo); if (soItem == null) { soItem = new SOItemInfo(); soItem.ProductName = orderProductItem.ProductName; soItem.ProductSysNo = orderProductItem.ProductSysNo; soItem.ProductID = orderProductItem.ProductID; soItem.Quantity = orderProductItem.UnitQuantity * orderItemGroup.Quantity; soItemList.Add(soItem); } else { soItem.Quantity += orderProductItem.UnitQuantity * orderItemGroup.Quantity; } } } if (isIncludeGiftAndAttachment) { //合并订单中的赠品 if (orderInfo.GiftItemList != null) { foreach (OrderGiftItem item in orderInfo.GiftItemList) { if (item.ProductSysNo > 0 && item.ParentCount > 0 && item.UnitQuantity > 0) { SOItemInfo soItem = soItemList.Find(f => f.ProductSysNo == item.ProductSysNo); if (soItem == null) { soItem = new SOItemInfo(); soItem.ProductName = item.ProductName; soItem.ProductSysNo = item.ProductSysNo; soItem.ProductID = item.ProductID; soItem.Quantity = item.UnitQuantity * item.ParentCount; soItemList.Add(soItem); } else { soItem.Quantity += item.UnitQuantity * item.ParentCount; } } } } //合并订单中的赠品 if (orderInfo.GiftItemList != null) { foreach (OrderAttachment item in orderInfo.AttachmentItemList) { if (item.ProductSysNo > 0 && item.ParentCount > 0 && item.UnitQuantity > 0) { SOItemInfo soItem = soItemList.Find(f => f.ProductSysNo == item.ProductSysNo); if (soItem == null) { soItem = new SOItemInfo(); soItem.ProductName = item.ProductName; soItem.ProductSysNo = item.ProductSysNo; soItem.ProductID = item.ProductID; soItem.Quantity = item.UnitQuantity * item.ParentCount; soItemList.Add(soItem); } else { soItem.Quantity += item.UnitQuantity * item.ParentCount; } } } } } if (isIncludePlusPriceProduct) { //合并订单中的加购商品 if (orderInfo.PlusPriceItemList != null) { foreach (OrderGiftItem item in orderInfo.PlusPriceItemList) { if (item.ProductSysNo > 0 && item.UnitQuantity > 0) { SOItemInfo soItem = soItemList.Find(f => f.ProductSysNo == item.ProductSysNo); if (soItem == null) { soItem = new SOItemInfo(); soItem.ProductName = item.ProductName; soItem.ProductSysNo = item.ProductSysNo; soItem.ProductID = item.ProductID; soItem.Quantity = item.UnitQuantity * item.ParentCount; soItemList.Add(soItem); } else { soItem.Quantity += item.UnitQuantity * item.ParentCount; } } } } } return(soItemList); }
//处理同时购买 private void ProcessMultiGift(ref OrderInfo order, List <SaleGiftInfo> saleGiftList) { List <SOItemInfo> soItemList = InternalHelper.ConvertToSOItemList(order, false); foreach (SaleGiftInfo saleGift in saleGiftList) { if (saleGift.SaleGiftType != ECommerce.Enums.SaleGiftType.Multiple) { continue; } //先判断订单是否满足这个同时购买的活动 bool isCludeMulti = true; int maxMultiCount = 0; foreach (GiftSaleRule saleruleCheck in saleGift.GiftSaleRuleList) { SOItemInfo soItem = soItemList.Find(f => f.ProductSysNo == saleruleCheck.RelProductSysNo); if (soItem == null) { isCludeMulti = false; break; } int qty = soItem.Quantity / saleruleCheck.RelMinQty; //不满足条件,直接跳出 if (qty <= 0) { isCludeMulti = false; break; } if (maxMultiCount == 0) { maxMultiCount = qty; } if (qty < maxMultiCount) { maxMultiCount = qty; } } //如果满足同时购买 if (isCludeMulti && maxMultiCount > 0) { //先在order中加上赠品 foreach (GiftItem giftItem in saleGift.GiftItemList) { OrderGiftItem orderGiftItem = new OrderGiftItem() { ActivityNo = saleGift.SysNo.Value, ActivityName = saleGift.PromotionName, IsGiftPool = saleGift.IsGiftPool, IsSelect = false, ParentCount = maxMultiCount,//giftItem.UnitQuantity * ParentPackageNo = 0, ParentProductSysNo = 0, ProductID = giftItem.ProductID, ProductName = giftItem.ProductName, DefaultImage = giftItem.DefaultImage, ProductSysNo = giftItem.ProductSysNo, SaleGiftType = saleGift.SaleGiftType, UnitQuantity = saleGift.IsGiftPool ? 1 : giftItem.UnitQuantity, PoolLimitCount = saleGift.IsGiftPool && saleGift.ItemGiftCount.HasValue && saleGift.ItemGiftCount.Value > 0 ? saleGift.ItemGiftCount.Value : 1, UnitSalePrice = giftItem.PlusPrice, UnitCostPrice = giftItem.UnitCost, MerchantSysNo = giftItem.MerchantSysNo, Weight = giftItem.Weight, UnitRewardedPoint = giftItem.UnitRewardedPoint, }; orderGiftItem["Warranty"] = giftItem.Warranty; order.GiftItemList.Add(orderGiftItem); } //移除order中符合当前同时购买的主商品或减数量,这样下一个同时购买的活动就不会重复使用满足上一个同时购买活动的主商品了 foreach (GiftSaleRule saleRule in saleGift.GiftSaleRuleList) { SOItemInfo soItem = soItemList.Find(f => f.ProductSysNo == saleRule.RelProductSysNo); soItem.Quantity = soItem.Quantity - maxMultiCount * saleRule.RelMinQty; if (soItem.Quantity == 0) { soItemList.Remove(soItem); } } } } }
internal static void CreateInvoice(SOInfo soInfo) { int soSysNo = soInfo.SysNo.Value; List <SOPriceMasterInfo> soPriceList = ObjectFactory <ISOPriceDA> .Instance.GetSOPriceBySOSysNo(soSysNo); if (soPriceList != null) { soPriceList.RemoveAll(priceInfo => { return(priceInfo.Status == SOPriceStatus.Deactivate); }); } if (soPriceList == null || soPriceList.Count < 1) { ObjectFactory <SOSendMessageProcessor> .Instance.ElectronicSOPriceNotExists(soInfo); BizExceptionHelper.Throw("SO_CreateInvoice_PriceInfoIsNull"); } List <ECCentral.BizEntity.Invoice.InvoiceMasterInfo> invoiceList = ExternalDomainBroker.GetSOInvoiceMaster(soSysNo); if (invoiceList == null || invoiceList.Count < 1) { SOItemInfo couponItem = soInfo.Items.Find(item => item.ProductType == SOProductType.Coupon); int? couponCodeSysNo = couponItem == null ? null : couponItem.ProductSysNo; SOPriceMasterInfo priceInfo = soPriceList[0]; BizEntity.Invoice.InvoiceInfo invoiceInfo = new BizEntity.Invoice.InvoiceInfo(); invoiceInfo.InvoiceTransactionInfoList = new List <BizEntity.Invoice.InvoiceTransactionInfo>(); invoiceInfo.MasterInfo = new BizEntity.Invoice.InvoiceMasterInfo { CustomerID = soInfo.BaseInfo.CustomerID, CustomerSysNo = soInfo.BaseInfo.CustomerSysNo, SONumber = soSysNo, InvoiceDate = priceInfo.InDate, InvoiceAmt = priceInfo.InvoiceAmount, PayTypeSysNo = soInfo.BaseInfo.PayTypeSysNo, PayTypeName = "", RMANumber = 0, OriginalInvoiceNumber = 0, InvoiceMemo = null, ShippingCharge = priceInfo.ShipPrice, StockSysNo = priceInfo.StockSysNo, OrderDate = soInfo.BaseInfo.CreateTime, DeliveryDate = soInfo.ShippingInfo.DeliveryDate, SalesManSysNo = soInfo.BaseInfo.SalesManSysNo, IsWholeSale = soInfo.BaseInfo.IsWholeSale, IsPremium = soInfo.BaseInfo.IsPremium, PremiumAmt = priceInfo.PremiumAmount, ShipTypeSysNo = soInfo.ShippingInfo.ShipTypeSysNo, ExtraAmt = priceInfo.PayPrice, SOAmt = priceInfo.SOAmount, DiscountAmt = priceInfo.PromotionAmount, GainPoint = priceInfo.GainPoint, PointPaid = -priceInfo.PointPayAmount, PrepayAmt = -priceInfo.PrepayAmount, PromotionAmt = priceInfo.CouponAmount, ReceiveAreaSysNo = soInfo.ReceiverInfo.AreaSysNo, ReceiveContact = soInfo.ReceiverInfo.Name, ReceiveAddress = soInfo.ReceiverInfo.Address, ReceiveCellPhone = soInfo.ReceiverInfo.MobilePhone, ReceivePhone = soInfo.ReceiverInfo.Phone, ReceiveZip = soInfo.ReceiverInfo.Zip, ReceiveName = soInfo.InvoiceInfo.Header, GiftCardPayAmt = -priceInfo.GiftCardPay, InvoiceNo = null, InvoiceType = soInfo.InvoiceInfo.InvoiceType, MerchantSysNo = soInfo.Merchant.SysNo, CompanyCode = soInfo.CompanyCode, PromotionCustomerSysNo = soInfo.BaseInfo.CustomerSysNo, PromotionCodeSysNo = couponCodeSysNo, IsUseChequesPay = false,//soInfo.BaseInfo.IsUseChequesPay, CashPaid = priceInfo.CashPay, }; priceInfo.Items.ForEach(item => { SOItemInfo soItem = soInfo.Items.Find(i => { return(i.ProductSysNo == item.ProductSysNo && i.ProductType == item.ProductType); }); string itemCode = soItem == null ? String.Empty : soItem.ProductID; switch (item.ProductType.Value) { case SOProductType.Coupon: itemCode = String.Format("Promot-{0}", item.ProductSysNo); break; case SOProductType.ExtendWarranty: itemCode = String.Format("{0}E", itemCode); break; } invoiceInfo.InvoiceTransactionInfoList.Add(new BizEntity.Invoice.InvoiceTransactionInfo { ItemCode = itemCode, PrintDescription = item.ProductType.Value.ToEnumDesc(), ItemType = item.ProductType, UnitPrice = item.Price, Quantity = item.Quantity, ExtendPrice = item.Price * item.Quantity, ReferenceSONumber = soSysNo, Weight = soItem.Weight, GainPoint = soItem.GainAveragePoint, PayType = soItem.PayType, PremiumAmt = item.PremiumAmount, ShippingCharge = item.ShipPrice, ExtraAmt = item.PayPrice, CashPaid = item.CashPay, PointPaid = item.PointPayAmount, DiscountAmt = item.PromotionAmount, PrepayAmt = -item.PrepayAmount, Warranty = soItem.Warranty, BriefName = soItem.ProductName, OriginalPrice = soItem.OriginalPrice, PromotionDiscount = item.CouponAmount, MasterProductSysNo = soItem.MasterProductSysNo, UnitCost = soItem.CostPrice, CompanyCode = soInfo.CompanyCode, GiftCardPayAmt = -item.GiftCardPay, UnitCostWithoutTax = soItem.NoTaxCostPrice, ProductSysNo = soItem.ProductSysNo, PriceType = soItem.PriceType, ItemDescription = item.ProductType.Value.ToEnumDesc(), }); }); ExternalDomainBroker.CreateInvoice(invoiceInfo); } }
/// <summary> /// 金额方面的折扣处理:目前价格方面的折扣与总金额方面的折扣不可并存 /// </summary> /// <param name="promotionInfo"></param> /// <param name="soInfo"></param> /// <param name="canPromotionSOItemList"></param> protected void CalcAmountRule(SOPromotionInfo promotionInfo, SOInfo soInfo, List <SOItemInfo> canPromotionSOItemList, CouponsInfo couponsInfo) { PSOrderAmountDiscountRule ruleAmount = couponsInfo.OrderAmountDiscountRule; List <PSPriceDiscountRule> rulePriceList = couponsInfo.PriceDiscountRule; decimal sumAllItemPriceAmount = 0.00m; //能够参与活动的商品总金额,所有商品原价乘以数量的总金额 decimal sumAllOrderItemAmount = 0.00m; //所有订单商品的商品总金额,用于计算优惠券平摊金额 decimal saleRulePromotionAmount = 0.00m; //除去优惠券后,其它优惠金额总额 decimal soItemAmount = soInfo.BaseInfo.SOAmount.Value; //订单商品实际总金额,已经扣去了Combo等折扣 decimal?orderMaxDiscount = null; //本活动中设置的每单折扣上限 decimal calcDiscountAmount = 0.00m; //计算出来的折扣 foreach (SOItemInfo item in canPromotionSOItemList) { sumAllItemPriceAmount += Math.Round(item.OriginalPrice.Value * ((decimal)item.Quantity.Value), 2); } foreach (var item in soInfo.Items) { if (item.ProductType.Value == SOProductType.Product || item.ProductType.Value == SOProductType.ExtendWarranty) { sumAllOrderItemAmount += item.OriginalPrice.Value * ((decimal)item.Quantity.Value); saleRulePromotionAmount += item.PromotionAmount ?? 0.00M; } } #region 计算总金额方面的折扣 if (ruleAmount != null && ruleAmount.OrderAmountDiscountRank != null && ruleAmount.OrderAmountDiscountRank.Count > 0) { calcDiscountAmount = 0.00m; orderMaxDiscount = ruleAmount.OrderMaxDiscount; if (ruleAmount.OrderAmountDiscountRank != null && ruleAmount.OrderAmountDiscountRank.Count > 0) { //首先确认取折扣信息时,根据限定金额Amount倒序 var ruleAmountDiscountRankNew = from p in ruleAmount.OrderAmountDiscountRank orderby p.OrderMinAmount descending select p; foreach (OrderAmountDiscountRank rank in ruleAmountDiscountRankNew) { decimal minAmount = rank.OrderMinAmount.HasValue ? rank.OrderMinAmount.Value : 0.00m; if (couponsInfo.ProductRangeType == CouponsProductRangeType.AllProducts && sumAllItemPriceAmount < minAmount) { //普通订单商品(SOItemInfo.ProductType==SOProductType.Product的商品)的总金额与限定金额值比较,跳过不满足条件价格条件。 continue; } if (soItemAmount >= minAmount) { if (rank.DiscountType.Value == PSDiscountTypeForOrderAmount.OrderAmountPercentage) { calcDiscountAmount = Math.Round(soItemAmount * rank.DiscountValue.Value, 2); } if (rank.DiscountType.Value == PSDiscountTypeForOrderAmount.OrderAmountDiscount) { calcDiscountAmount = Math.Round(rank.DiscountValue.Value, 2); } break; } } } } #endregion #region 计算商品价格方面的折扣 if (rulePriceList != null && rulePriceList.Count > 0) { calcDiscountAmount = 0.00m; List <PSPriceDiscountRule> discountList = rulePriceList.FindAll(f => f.DiscountType == PSDiscountTypeForProductPrice.ProductPriceDiscount); List <PSPriceDiscountRule> finalList = rulePriceList.FindAll(f => f.DiscountType == PSDiscountTypeForProductPrice.ProductPriceFinal); //如果商品价格是直接折扣 if (discountList != null && discountList.Count > 0) { var discountListNew = from p in discountList orderby p.MinQty descending select p; foreach (SOItemInfo item in canPromotionSOItemList) { foreach (PSPriceDiscountRule prule in discountListNew) { int minQty = prule.MinQty.HasValue ? prule.MinQty.Value : 1; if (item.Quantity >= minQty) { calcDiscountAmount += Math.Round(prule.DiscountValue.Value * item.Quantity.Value, 2); break; } } } } //如果是最终售价 if (finalList != null && finalList.Count > 0) { var finalListNew = from p in finalList orderby p.MinQty descending select p; foreach (SOItemInfo item in canPromotionSOItemList) { foreach (PSPriceDiscountRule prule in finalListNew) { int minQty = prule.MinQty.HasValue ? prule.MinQty.Value : 1; if (item.Quantity >= minQty) { //当单个商品 最终售价大于商品售价时 if (prule.DiscountValue.Value >= item.Price.Value) { calcDiscountAmount += 0.00m; } else { calcDiscountAmount += Math.Round((item.Price.Value - prule.DiscountValue.Value) * item.Quantity.Value, 2); } break; } } } } } #endregion #region 得到真正最终可以折扣的金额 decimal canDiscountAmount = calcDiscountAmount; if (orderMaxDiscount.HasValue) { if (calcDiscountAmount <= orderMaxDiscount.Value) { canDiscountAmount = calcDiscountAmount; } else { canDiscountAmount = Math.Round(orderMaxDiscount.Value, 2); } } promotionInfo.DiscountAmount = Math.Abs(canDiscountAmount); #endregion #region 开始分摊折扣金额 if (promotionInfo.DiscountAmount == 0.00m) { return; } //最后一个Item要特殊处理,要用总折扣减去前边所有item的折扣合 decimal allocatedDiscount = 0.00m; decimal actualAllItemPriceAmount = sumAllOrderItemAmount + saleRulePromotionAmount; if (actualAllItemPriceAmount != 0) { for (int i = 0; i < promotionInfo.SOPromotionDetails.Count; i++) { SOPromotionDetailInfo detail = promotionInfo.SOPromotionDetails[i]; SOItemInfo item = soInfo.Items.Find(f => f.ProductSysNo == detail.MasterProductSysNo); //除去套餐优惠金额 decimal pTotal = item.OriginalPrice.Value * item.Quantity.Value + item.PromotionAmount ?? 0; if (i < promotionInfo.SOPromotionDetails.Count - 1) { //decimal currentDiscount=decimal.Floor((canDiscountAmount * (pTotal / sumAllItemPriceAmount)) * 100) / 100; decimal currentDiscount = canDiscountAmount * (pTotal / actualAllItemPriceAmount); //只保留小数点后两位,Bug:89610 currentDiscount = Math.Abs(currentDiscount); currentDiscount = Math.Min(currentDiscount, pTotal); detail.DiscountAmount = currentDiscount; allocatedDiscount += currentDiscount; } else { detail.DiscountAmount = Math.Abs(canDiscountAmount - allocatedDiscount); detail.DiscountAmount = Math.Min(detail.DiscountAmount.Value, pTotal); } } } #endregion }