private decimal GetTotalMoney(SOInfo entity) { return(entity.BaseInfo.SOAmount.Value + entity.BaseInfo.ShipPrice.Value + entity.BaseInfo.PayPrice.Value + entity.BaseInfo.PremiumAmount.Value); }
public virtual CustomerContactInfo LoadByRequestSysNo(int sysNo) { CustomerContactInfo entity = null; entity = da.Load(sysNo); if (entity == null) { RMARequestInfo request = ObjectFactory <IRequestDA> .Instance.LoadBySysNo(sysNo); if (request != null) { entity = new CustomerContactInfo(); entity.ReceiveAddress = request.Address; entity.ReceiveAreaSysNo = request.AreaSysNo; entity.ReceiveContact = request.Contact; entity.ReceiveName = request.Contact; entity.ReceivePhone = request.Phone; if (request.SOSysNo.HasValue) { SOInfo so = ExternalDomainBroker.GetSOInfo(request.SOSysNo.Value); if (so != null) { entity.ReceiveCellPhone = so.ReceiverInfo.MobilePhone; entity.ReceiveZip = so.ReceiverInfo.Zip; } } } } return(entity); }
void SIMSOSpliter_SubSOAssign(SOInfo subSOInfo) { //子单是否是SIM卡订单 bool isSIMSO = false; string[] simCardProductsPre = ExternalDomainBroker.Config_SIMCardItemList_Pre(CurrentSO.CompanyCode); string[] simCardProductsAft = ExternalDomainBroker.Config_SIMCardItemList_Aft(CurrentSO.CompanyCode); string[] simCardProducts = new string[simCardProductsPre.Length + simCardProductsAft.Length]; simCardProductsPre.CopyTo(simCardProducts, 0); simCardProductsAft.CopyTo(simCardProducts, simCardProductsPre.Length); if (simCardProducts != null && simCardProducts.Length > 0) { foreach (SOItemInfo soItem in subSOInfo.Items) { if (simCardProducts.Contains(soItem.ProductSysNo.ToString())) { isSIMSO = true; } } } if (isSIMSO) { subSOInfo.BaseInfo.SOType = SOType.SIM; subSOInfo.SIMCardAndContractPhoneInfo = CurrentSO.SIMCardAndContractPhoneInfo; subSOInfo.SIMCardAndContractPhoneInfo.SOSysNo = subSOInfo.SysNo; } else { subSOInfo.BaseInfo.SOType = SOType.General; } }
/// <summary> /// 订单出库后 普票改增票 /// </summary> /// <param name="entity"></param> public void SetSOVATInvoiveWhenSOOutStock(SOInfo entity) { SOInfo OriginalSOInfo = ObjectFactory <SOProcessor> .Instance.GetSOBySOSysNo(entity.SysNo.Value); SODA.UpdateSOVATInvoice(entity.InvoiceInfo.VATInvoiceInfo); ECCentral.BizEntity.SO.SOInvoiceChangeLogInfo invoiceChanageLog = new SOInvoiceChangeLogInfo(); invoiceChanageLog.SOSysNo = entity.BaseInfo.SysNo.Value; invoiceChanageLog.StockSysNo = entity.Items[0].StockSysNo > 0 ? entity.Items[0].StockSysNo.Value : 0; invoiceChanageLog.ChangeTime = DateTime.Now; invoiceChanageLog.CompanyCode = entity.BaseInfo.CompanyCode; invoiceChanageLog.UserSysNo = ServiceContext.Current.UserSysNo; if (OriginalSOInfo != null && OriginalSOInfo.InvoiceInfo != null && OriginalSOInfo.InvoiceInfo.IsVAT == true) { invoiceChanageLog.ChangeType = InvoiceChangeType.VATChange; invoiceChanageLog.Note = string.Format(ResouceManager.GetMessageString("SO.SOInfo", "Res_SO_VATInvoice_ChangeInfo") , entity.InvoiceInfo.VATInvoiceInfo.SysNo , entity.InvoiceInfo.VATInvoiceInfo.CompanyName , entity.InvoiceInfo.VATInvoiceInfo.TaxNumber , entity.InvoiceInfo.VATInvoiceInfo.BankAccount); } else { invoiceChanageLog.ChangeType = InvoiceChangeType.GeneralToVAT; invoiceChanageLog.Note = ResourceHelper.Get("Res_SO_InvoiceTOVAT_Change", entity.InvoiceInfo.VATInvoiceInfo.SysNo); } ObjectFactory <ISOLogDA> .Instance.InsertSOInvoiceChangeLogInfo(invoiceChanageLog); }
//收银完成 private void Balance(SOInfo SOInfo, List <F2FPayItem> F2FPayItems) { var F2FPayInfo = new F2FPayInfo { F2FPay = new F2FPay { Remark = string.IsNullOrWhiteSpace(inpPayFormRemark.Text.Trim()) ? null : inpPayFormRemark.Text.Trim(), }, F2FPayItems = F2FPayItems, }; F2FPayInfo = Ziri.BLL.Pay.SetF2FPay(F2FPayInfo, out string Message); if (Message != null) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "PaidMessage" , string.Format("<script> swal('{0}', '', '{1}'); document.getElementById('btnListPayModal').click(); </script>", Message, AlertType.error)); return; } //设置订单支付状态 Ziri.BLL.OMS.SalesOrder.SetPayInfo(SOInfo.SalesOrder.ID, new SOPayInfo { PayID = F2FPayInfo.F2FPay.ID, }, true, out Message); if (Message != null) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "PaidMessage" , string.Format("<script> swal('{0}', '', '{1}'); document.getElementById('btnListPayModal').click(); </script>", Message, AlertType.error)); return; } //刷新列表 ListBind(); }
/// <summary> /// 计算关税 /// </summary> /// <param name="soInfo"></param> private void CalculateTariffAmt(SOInfo soInfo) { //获取商品价格信息 var soItems = soInfo.Items.Where(item => item.ProductType == SOProductType.Accessory || item.ProductType == SOProductType.Award || item.ProductType == SOProductType.Gift || item.ProductType == SOProductType.Product || item.ProductType == SOProductType.SelfGift); List <int> itemSysNos = soItems.Select <SOItemInfo, int>(item => item.ProductSysNo.Value).ToList <int>(); //<商品编号,关税> //List<KeyValuePair<int, decimal>> productTaxList = ExternalDomainBroker.GetProductTax(itemSysNos); foreach (SOItemInfo soItem in soItems) { //soItem.TariffAmount = (((soItem.OriginalPrice - soItem.CouponAverageDiscount)* soItem.Quantity.Value) + soItem.PromotionAmount) * soItem.TariffRate ; //soItem.TariffAmount = (soItem.OriginalPrice - soItem.CouponAverageDiscount + (soItem.PromotionAmount / soItem.Quantity.Value)) * soItem.TariffRate;//扣除优惠算关税 soItem.TariffAmount = (soItem.OriginalPrice + (soItem.PromotionAmount / soItem.Quantity.Value)) * soItem.TariffRate; soItem.TariffAmount = decimal.Round(soItem.TariffAmount.Value, 2, MidpointRounding.AwayFromZero); } soInfo.BaseInfo.TariffAmount = soInfo.Items.Sum(item => item.TariffAmount.GetValueOrDefault() * item.Quantity.GetValueOrDefault()); //一票货物的关税税额在人民币50元以下的免税。 if (soInfo.BaseInfo.TariffAmount <= 50m) { foreach (SOItemInfo soItem in soItems) { soItem.TariffAmount = 0m; } soInfo.BaseInfo.TariffAmount = 0m; } }
/// <summary> /// 根据订单系统编号取得订单信息 /// </summary> /// <param name="soSysNo">订单系统编号</param> /// <returns>订单信息</returns> public virtual SOInfo GetSOBySOSysNo(int soSysNo) { SOInfo soInfo = SODA.GetSOBySOSysNo(soSysNo); if (soInfo != null) { List <SOInfo> soList = new List <SOInfo>(); soList.Add(soInfo); FillSOInfo(soList); SetInventoryQuantity(soInfo); SetItemsStockName(soInfo.Items); //SetItemsSHDSysNo(soInfo.Items); SetItemOutStockInfo(soInfo); soInfo.BaseInfo.CustomerPoint = ExternalDomainBroker.GetCustomerValidPoint(soInfo.BaseInfo.CustomerSysNo.Value); List <string> numberList = SODA.TrackingNumberBySoSysno(soSysNo); if (numberList != null && numberList.Count > 0) { soInfo.ShippingInfo.TrackingNumberStr = numberList.Join(","); } } return(soInfo); }
private bool IsOrginIncome(SOInfo item, DateTime?fromDateTime, DateTime?toDateTime) { if (!item.ShippingInfo.OutTime.HasValue) { return(false); } if (item.ShippingInfo.OutTime.Value >= fromDateTime) { if (toDateTime.HasValue) { if (item.ShippingInfo.OutTime.Value <= toDateTime.Value) { return(true); } else { return(false); } } else { return(true); } } else { return(false); } }
public void CheckAndGivingPromotionCodeForSO() { AutorunManager.Startup(null); //SOInfo soInfo = new SOProcessor().CheckAndGivingPromotionCodeForSO(130008136); //soInfo.Merchant = new BizEntity.Common.Merchant() { SysNo = 1 }; SOInfo soInfo = new SOInfo() { SysNo = 130004413, Merchant = new BizEntity.Common.Merchant() { SysNo = 2062 }, BaseInfo = new SOBaseInfo() { CreateTime = new DateTime(2014, 11, 27, 18, 0, 0), CustomerSysNo = 92, SOAmount = 200, }, Items = new List <SOItemInfo>() { new SOItemInfo() { ProductID = "AO_11049_966_0002", ProductSysNo = 98914 }, }, }; new BizInteractAppService().CheckAndGivingPromotionCodeForSO(soInfo); AutorunManager.Shutdown(null); }
private void SuccessfulGroupBuyProcess(GroupBuyingInfo gbInfo) { List <SOItemInfo> GroupBuyItemList = SODA.GetGroupBuySOItemByGroupBuySysNo(gbInfo.SysNo.Value); SOProcessor soProcessor = ObjectFactory <SOProcessor> .Instance; foreach (SOItemInfo groupBuyItem in GroupBuyItemList) { //更新订单 try { //修改团购商品价格 SOInfo soInfo = SODA.GetSOBySOSysNo(groupBuyItem.SOSysNo.Value); soProcessor.ProcessSO(new SOAction.SOCommandInfo { Command = SOAction.SOCommand.Job, SOInfo = soInfo, Parameter = new object[] { groupBuyItem.ProductSysNo } }); } catch (Exception ex) { SODA.UpdateGroupBuySOAndItemSettlementStatus(groupBuyItem.SOSysNo.Value, groupBuyItem.ProductSysNo.Value, SettlementStatus.Fail); ExceptionHelper.HandleException(ex); continue; } } ExternalDomainBroker.UpdateGroupBuySettlementStatus(gbInfo.SysNo.Value, GroupBuyingSettlementStatus.Yes); }
private void OutStock(string ssbMessage) { SOShippedEntity shippedInfo = ECCentral.Service.Utility.SerializationUtility.XmlDeserialize <SOShippedEntity>(ssbMessage); if (shippedInfo == null || shippedInfo.Node == null || shippedInfo.Node.RequestRoot == null || shippedInfo.Node.RequestRoot.Body == null || shippedInfo.Node.RequestRoot.Body.ShipOrderMsg == null || shippedInfo.Node.RequestRoot.Body.ShipOrderMsg.SalesOrder == null) { return; } SOProcessor processor = ObjectFactory <SOProcessor> .Instance; foreach (SalesOrderInfo soMsg in shippedInfo.Node.RequestRoot.Body.ShipOrderMsg.SalesOrder) { SOInfo soInfo = processor.GetSOBySOSysNo(soMsg.SONumber); soMsg.InUser = shippedInfo.Node.RequestRoot.Body.ShipOrderMsg.InUser; soMsg.CompanyCode = shippedInfo.Node.RequestRoot.MessageHead.CompanyCode; processor.ProcessSO(new SOAction.SOCommandInfo { SOInfo = soInfo, Command = SOAction.SOCommand.OutStock, Parameter = new object[] { soMsg } }); } }
public void CancelReceiveSR(SRInfo oParam) { TransactionOptions options = new TransactionOptions(); options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; options.Timeout = TransactionManager.DefaultTimeout; using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) { //更新订单状态 Hashtable ht = new Hashtable(); ht.Add("SysNo", oParam.SOSysNo); ht.Add("Status", (int)AppEnum.SOStatus.OutStock); SaleManager.GetInstance().UpdateSOMaster(ht); SOInfo soInfo = SaleManager.GetInstance().LoadSO(oParam.SOSysNo); //更新SOItemReturnQty foreach (SRItemInfo sritem in oParam.ItemHash.Values) { foreach (SOItemInfo item in soInfo.ItemHash.Values) { if (item.ProductSysNo == sritem.ProductSysNo) { SaleManager.GetInstance().UpdateSOItemReturnQty(oParam.SOSysNo, item.ProductSysNo, 0); } } } //更新退货单 this.UpdateSRMaster(oParam); scope.Complete(); } }
/// <summary> /// 检查规则-货到付款 /// </summary> /// <param name="entity"></param> private void CheckCODSO(SOInfo entity, CustomerInfo custom) { m_auditUserSysNoTemp = 800; //注意这里一定要是这个用户,Alan说有一个邮件专门根据这个用户来给货到付款的客户发短信 #region 根据订单的客户等级及订单金额判断是否能够通过自动审核 if (m_auditSwitch.IsCheckOrderAmt) { CustomerRankAmt currentRank = null; switch (custom.Rank) { case CustomerRank.Ferrum: case CustomerRank.Copper: case CustomerRank.Silver: currentRank = m_customerRankAmtList.Find(x => { return(x.CustomerRank == 3); }); break; case CustomerRank.Golden: case CustomerRank.Diamond: case CustomerRank.Crown: case CustomerRank.Supremacy: currentRank = m_customerRankAmtList.Find(x => { return(x.CustomerRank == 4); }); break; default: break; } if (currentRank != null && entity.BaseInfo.SOAmount > currentRank.AmtLimit) { ThrowException(entity, "订单金额超出了此客户等级对应的订单金额上线-不能通过自动审核"); } } #endregion }
/// <summary> /// 获取SOItems /// </summary> /// <param name="entity">订单对象</param> private static void LoadItems(SOInfo entity) { if (entity.Items == null || entity.Items.Count == 0) { entity.Items = ObjectFactory <SOProcessor> .Instance.GetSOItemsBySOSysNo(entity.SysNo.Value); } }
/// <summary> /// 计算余额支付 /// </summary> /// <param name="soInfo"></param> public virtual void CalculatePrePay(SOInfo soInfo) { if (!soInfo.BaseInfo.IsUsePrePay.Value) { soInfo.BaseInfo.PrepayAmount = null; return; } #warning 需要再考虑修改订单 //获取客户可用余额 decimal validPrePay = ExternalDomainBroker.GetCustomerInfo(soInfo.BaseInfo.CustomerSysNo.Value).ValidPrepayAmt.Value; if (this.IsUpdate) { validPrePay += this.OriginalSOInfo.BaseInfo.PrepayAmount.Value; } //可供余额支付的订单金额 decimal needPayAmt = soInfo.BaseInfo.CashPay + soInfo.BaseInfo.ShipPrice.Value + soInfo.BaseInfo.PremiumAmount.Value + soInfo.BaseInfo.PromotionAmount.Value + soInfo.BaseInfo.TariffAmount.Value - soInfo.BaseInfo.GiftCardPay.Value; //取"可供支付金额"与"客户可用余额"中较小值做为实际余额支付金额 soInfo.BaseInfo.PrepayAmount = Math.Min(validPrePay, needPayAmt); if (soInfo.BaseInfo.PrepayAmount == 0) { soInfo.BaseInfo.PrepayAmount = null; } }
///// 计算积分返回 /// <summary> /// 计算积分返回 /// </summary> /// <param name="soInfo">订单信息</param> /// <param name="pointPay">已支付的积分款</param> /// <returns>应退积分</returns> private int GetReturnPoint(SOInfo soInfo, decimal pointPay) { pointPay = pointPay * ExternalDomainBroker.GetPointToMoneyRatio(); int usedPoint = Convert.ToInt32(pointPay); return(soInfo.BaseInfo.PointPay.Value + usedPoint);//用点数支付的是负值,所以这块用+ }
/// <summary> /// 计算保价费 /// </summary> /// <param name="soInfo"></param> public virtual void CalculatePrimiumAmt(SOInfo soInfo) { //如果是电子卡,值为0 if (soInfo.BaseInfo.SOType == SOType.ElectronicCard) { soInfo.BaseInfo.PremiumAmount = 0; return; } ShippingType st = ExternalDomainBroker.GetShippingTypeBySysNo(soInfo.ShippingInfo.ShipTypeSysNo.Value); if (soInfo.BaseInfo.IsPremium.Value && st != null) { if (soInfo.ShippingInfo != null && soInfo.BaseInfo.SOAmount > 0 && soInfo.BaseInfo.SOAmount > st.PremiumBase) { soInfo.BaseInfo.PremiumAmount = decimal.Round((soInfo.BaseInfo.SOAmount.Value * st.PremiumRate.Value), 2); if (soInfo.BaseInfo.PremiumAmount == 0) { soInfo.BaseInfo.PremiumAmount = null; } return; } } soInfo.BaseInfo.PremiumAmount = null; }
//获取配送时间点 internal static List <TimeSpan> GetDeliveryTimePointBySO(SOInfo so) { //获取自动审单检查项信息 var csTBOrderCheckMasterList = ExternalDomainBroker.GetCSTBOrderCheckMasterList(so.CompanyCode); //获取自动审单检查项具体的明细项信息 var csTBOrderCheckItemList = new List <OrderCheckItem>(); csTBOrderCheckMasterList.ForEach(p => { csTBOrderCheckItemList.AddRange(p.OrderCheckItemList); }); var csItem = csTBOrderCheckItemList.Find(x => { return((x.ReferenceType == "DT11" || x.ReferenceType == "DT12") //&& x.Status == OrderCheckStatus.Invalid && x.ReferenceContent.Contains(so.ShippingInfo.ShipTypeSysNo.ToString())); }); if (csItem == null) { return(new List <TimeSpan>()); } return(ParseTimeSpot(csItem.Description)); }
/// <summary> /// 设置商品库存(可用 、Online) /// </summary> /// <param name="soList"></param> protected void SetInventoryQuantity(SOInfo soInfo) { List <Int32> productSysNoList = new List <int>(); foreach (var item in soInfo.Items) { productSysNoList.Add(item.ProductSysNo.Value); } List <ProductInventoryInfo> pInventoryInfoList = ExternalDomainBroker.GetProductTotalInventoryInfoByProductList(productSysNoList); if (pInventoryInfoList != null && pInventoryInfoList.Count > 0) { foreach (var item in soInfo.Items) { //延保重新设置 if (item.ProductType == SOProductType.ExtendWarranty) { continue; } foreach (var itemInventory in pInventoryInfoList) { if (item.ProductSysNo == itemInventory.ProductSysNo) { item.AvailableQty = itemInventory.AvailableQty; item.OnlineQty = (itemInventory.AvailableQty + itemInventory.ConsignQty + itemInventory.VirtualQty); break; } } } } }
public SOInfo GetSoDetail(int SOSysNo, string sysAccount) { SOInfo soInfo = ExternalDomainBroker.GetSOInfo(SOSysNo); if (soInfo != null) { switch (sysAccount) { case "PM-价保积分": if (!((soInfo.ShippingInfo.StockType == StockType.SELF && soInfo.ShippingInfo.ShippingType == BizEntity.Invoice.DeliveryType.SELF && soInfo.InvoiceInfo.InvoiceType == InvoiceType.SELF || (soInfo.ShippingInfo.StockType == StockType.MET && soInfo.ShippingInfo.ShippingType == BizEntity.Invoice.DeliveryType.SELF && soInfo.InvoiceInfo.InvoiceType == InvoiceType.SELF || (soInfo.ShippingInfo.StockType == StockType.MET && soInfo.ShippingInfo.ShippingType == BizEntity.Invoice.DeliveryType.MET && soInfo.InvoiceInfo.InvoiceType == InvoiceType.SELF))))) { throw new BizException(ResouceManager.GetMessageString("Customer.CustomerPointsAddRequest", "CanNotOpreateByCurrentUser")); } break; case "Seller-Depreciation": if (!((soInfo.ShippingInfo.StockType == StockType.MET && soInfo.ShippingInfo.ShippingType == BizEntity.Invoice.DeliveryType.SELF && soInfo.InvoiceInfo.InvoiceType == InvoiceType.MET) || soInfo.ShippingInfo.StockType == StockType.MET && soInfo.ShippingInfo.ShippingType == BizEntity.Invoice.DeliveryType.MET && soInfo.InvoiceInfo.InvoiceType == InvoiceType.MET)) { throw new BizException(ResouceManager.GetMessageString("Customer.CustomerPointsAddRequest", "CanNotOpreateByCurrentUser")); } break; } } return(soInfo); }
//销售规则Check public static bool CheckSaleRule(SOInfo soEntity, SOInfo newSO) { // 有问题 覆盖其他Promotion soEntity.SOPromotions = ExternalDomainBroker.CalculateSOPromotion(soEntity); if (soEntity != null && soEntity.SOPromotions != null && soEntity.SOPromotions.Count > 0) { foreach (SOPromotionInfo soPromotion in soEntity.SOPromotions) { if (soPromotion == null || soPromotion.SOPromotionDetails == null) { continue; } //if (销售规则有效?) //{ //比较 int count = 0;//用于比较的计数 foreach (SOItemInfo item in newSO.Items) { if (soPromotion.SOPromotionDetails.Exists(x => x.MasterProductSysNo == item.ProductSysNo)) { count++; } } if (count > 0 && count < soPromotion.SOPromotionDetails.Count) { return(false); } //} } } return(true); }
/// <summary> /// 为SO提供计算当前订单能能享受的所有促销活动结果 /// </summary> /// <param name="soInfo">订单信息</param> /// <returns></returns> public virtual List <SOPromotionInfo> CalculateSOPromotion(SOInfo soInfo, List <SOPromotionInfo> alreadyApplyPromoList) { List <SOPromotionInfo> promotionInfoList = new List <SOPromotionInfo>(); //只有零售才享受Combo if (soInfo.BaseInfo.IsWholeSale.HasValue && soInfo.BaseInfo.IsWholeSale.Value) { return(promotionInfoList); } //1.取得所有的有效状态,并且主商品在SO中存在的Combo List List <int> soItemSysNoList = new List <int>(); //SO Item中所有购买的主商品 List <SOItemInfo> soItemList = new List <SOItemInfo>(); foreach (SOItemInfo soItem in soInfo.Items) { if (soItem.ProductType.Value == SOProductType.Product) { soItemSysNoList.Add(soItem.ProductSysNo.Value); soItemList.Add(soItem); } } if (soItemSysNoList.Count == 0) { return(promotionInfoList); } List <ComboInfo> comboList = _da.GetComboListForCurrentSO(soItemSysNoList); GetPromotionListForSO(comboList, soInfo, ref soItemList, ref promotionInfoList); return(promotionInfoList); }
/// <summary> /// 为SO提供计算当前订单能能享受的所有促销活动结果 /// </summary> /// <param name="soInfo">订单信息</param> /// <param name="isModifyCoupons"></param> /// <returns></returns> public virtual List <SOPromotionInfo> CalculateSOPromotion(SOInfo soInfo, bool isModifyCoupons) { /* TODO: * (1)根据SOInfo中的Master和Items的信息,判断当前能够参加哪些促销活动并将相应的促销活动信息Load出来:团购、限时和赠品的活动不做处理 * (2)按照促销活动相互间的优先、排重关系,确定能够使用哪些促销活动:先做Combo,然后得到订单中商品实际总金额;再做优惠券 * (3)调用各促销活动中的计算方法,返回各促销活动的计算结果 * (4) 汇总所有促销活动的计算结果 * */ SOInfo soInfoClone = SerializationUtility.DeepClone <SOInfo>(soInfo); List <SOPromotionInfo> promotionList = new List <SOPromotionInfo>(); List <SOPromotionInfo> comboPromotionList = ObjectFactory <ComboProcessor> .Instance.CalculateSOPromotion(soInfoClone, promotionList); //得到Combo中所有的折扣 decimal allComboTotalDiscount = comboPromotionList.Sum(f => f.DiscountAmount.Value); promotionList.AddRange(comboPromotionList); //应用销售立减 soInfoClone = SerializationUtility.DeepClone <SOInfo>(soInfo); var saleDiscountPromoInfoList = ObjectFactory <SaleDiscountRuleProcessor> .Instance.CalculateSOPromotion(soInfoClone, promotionList); decimal totalSaleDiscountAmount = saleDiscountPromoInfoList.Sum(s => s.DiscountAmount.Value); promotionList.AddRange(saleDiscountPromoInfoList); //再次Clone,供Coupon计算使用 soInfoClone = SerializationUtility.DeepClone <SOInfo>(soInfo); soInfoClone.BaseInfo.SOAmount = soInfoClone.BaseInfo.SOAmount.Value + allComboTotalDiscount + totalSaleDiscountAmount; List <SOPromotionInfo> couponPromotionList = ObjectFactory <CouponsProcessor> .Instance.CalculateSOPromotion(soInfoClone, isModifyCoupons); promotionList.AddRange(couponPromotionList); return(promotionList); }
/// <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); }
/// <summary> /// 查询订单 /// </summary> /// <returns></returns> public static List <SOInfo> QuerySO() { DataCommand cmd = DataCommandManager.GetDataCommand("QuerySO"); List <SOInfo> list = new List <SOInfo>(); DataSet ds = cmd.ExecuteDataSet(); foreach (DataRow dr in ds.Tables[0].Rows) { SOInfo soInfo = DataMapper.GetEntity <SOInfo>(dr); if (soInfo.OrderItems == null) { soInfo.OrderItems = new List <SOItemInfo>(); } foreach (DataRow itemDR in ds.Tables[1].Rows) { int soSysNo = 0; int.TryParse(itemDR["SOSysNo"].ToString(), out soSysNo); if (soSysNo == soInfo.SysNo) { soInfo.OrderItems.Add(DataMapper.GetEntity <SOItemInfo>(itemDR)); } } list.Add(soInfo); } return(list); }
/// <summary> /// 创建代销转财务记录 /// </summary> /// <param name="header">common info</param> /// <param name="soInfo">so entity</param> private void CreateConsigenToAccInfo(SOInfo soInfo) { if (soInfo.ShippingInfo.StockType == ECCentral.BizEntity.Invoice.StockType.MET && soInfo.InvoiceInfo.InvoiceType == ECCentral.BizEntity.Invoice.InvoiceType.SELF) { List <ConsignToAcctLogInfo> consignToAcclist = new List <ConsignToAcctLogInfo>(); List <SOItemInfo> soItemList = soInfo.Items; int?vendorSysno = soInfo.Merchant.MerchantID; soItemList = soItemList.Where(item => item.ProductType == SOProductType.Product || item.ProductType == SOProductType.Gift || item.ProductType == SOProductType.Award || item.ProductType == SOProductType.Accessory || item.ProductType == SOProductType.SelfGift).ToList(); //todo:代收或代销?需确认 soItemList.ForEach(item => { consignToAcclist.Add(new ConsignToAcctLogInfo { CreateCost = item.NoTaxCostPrice, OrderSysNo = soInfo.BaseInfo.SysNo, Point = item.GainPoint, ProductSysNo = item.ProductSysNo, ProductQuantity = item.Quantity, SalePrice = item.Price, StockSysNo = item.StockSysNo, VendorSysNo = vendorSysno, OutStockTime = DateTime.Now, CompanyCode = soInfo.CompanyCode }); }); ExternalDomainBroker.BatchCreateConsignToAcctLogsInventory(consignToAcclist); } }
/// <summary> /// 为SO提供计算当前订单能能享受的所有促销活动结果 /// </summary> /// <param name="soInfo">订单信息</param> /// <returns></returns> public virtual List <SOPromotionInfo> CalculateSOPromotion(SOInfo soInfo, List <SOPromotionInfo> alreadyApplyPromoList) { //只有零售才享受销售立减 if (soInfo.BaseInfo.IsWholeSale.HasValue && soInfo.BaseInfo.IsWholeSale.Value) { return(new List <SOPromotionInfo>(0)); } List <SOItemInfo> soItemList = new List <SOItemInfo>(); foreach (SOItemInfo soItem in soInfo.Items) { if (soItem.ProductType.Value == SOProductType.Product) { var product = ExternalDomainBroker.GetSimpleProductInfo(soItem.ProductSysNo.Value); soItem.C3SysNo = product.ProductBasicInfo.ProductCategoryInfo.SysNo ?? 0; soItem.BrandSysNo = product.ProductBasicInfo.ProductBrandInfo.SysNo ?? 0; soItem.ProductGroupSysNo = product.ProductGroupSysno; soItemList.Add(soItem); } } if (soItemList.Count == 0) { return(new List <SOPromotionInfo>(0)); } var promotionInfoList = SaleDiscountRuleCalculator.Instance.CalcSaleDiscountRule(soItemList, soInfo.SysNo ?? 0, alreadyApplyPromoList); return(promotionInfoList); }
public static bool SendSMSForSO(int soSysNo, SMSType smsType) { SOInfo soInfo = SOService.GetSOInfo(soSysNo); CustomerBasicInfo customerInfo = CustomerService.GetCustomerInfo(soInfo.CustomerSysNo); string customerLanguageCode = customerInfo.LanguageCode; var sms = CommonDA.GetShipTypeSMSInfo(soInfo.ShipType.ShipTypeSysNo, smsType, null); var smsContent = sms.SMSContent; if (string.IsNullOrEmpty(smsContent)) { return(false); } string mobilePhone = string.Empty; if (!string.IsNullOrEmpty(soInfo.ReceiveCellPhone)) { mobilePhone = soInfo.ReceiveCellPhone; } else { mobilePhone = soInfo.ReceivePhone; } if (smsContent.IndexOf("SO#") != -1) { smsContent = smsContent.Replace("SO#", soInfo.SOSysNo.ToString()); } else { return(false); } return(SendSMS(mobilePhone, smsContent, SMSPriority.Normal)); }
private SOInfo CreateSubSO() { SOInfo subSOInfo = new SOInfo(); subSOInfo.BaseInfo = SerializationUtility.DeepClone <SOBaseInfo>(CurrentSO.BaseInfo); subSOInfo.ClientInfo = SerializationUtility.DeepClone <SOClientInfo>(CurrentSO.ClientInfo); subSOInfo.FPInfo = SerializationUtility.DeepClone <SOFPInfo>(CurrentSO.FPInfo); //添加增值税发票信息到每个仓库 subSOInfo.InvoiceInfo = SerializationUtility.DeepClone <SOInvoiceInfo>(CurrentSO.InvoiceInfo); subSOInfo.ReceiverInfo = SerializationUtility.DeepClone <SOReceiverInfo>(CurrentSO.ReceiverInfo); subSOInfo.ShippingInfo = SerializationUtility.DeepClone <SOShippingInfo>(CurrentSO.ShippingInfo); subSOInfo.CompanyCode = CurrentSO.BaseInfo.CompanyCode; subSOInfo.Merchant = CurrentSO.Merchant; subSOInfo.WebChannel = CurrentSO.WebChannel; //提前生成子单号 int subSOSysNo = SODA.NewSOSysNo(); subSOInfo.SysNo = subSOSysNo; subSOInfo.BaseInfo.SOID = subSOSysNo.ToString(); subSOInfo.BaseInfo.CreateTime = DateTime.Now; subSOInfo.BaseInfo.SplitType = SOSplitType.SubSO; subSOInfo.BaseInfo.SOSplitMaster = SOSysNo; subSOInfo.ShippingInfo.IsCombine = null; return(subSOInfo); }
/// <summary> /// 发送增票SMS短信 /// </summary> /// <param name="soInfo">SO 信息</param> public void SendVATSMS(SOInfo soInfo) { try { if (soInfo.InvoiceInfo.IsVAT.Value) { int stockSysNo = soInfo.Items[0].StockSysNo.Value; string mobilePhone = string.Empty; if (!string.IsNullOrEmpty(soInfo.ReceiverInfo.MobilePhone)) { mobilePhone = soInfo.ReceiverInfo.MobilePhone; } else { mobilePhone = soInfo.ReceiverInfo.Phone; } ECCentral.BizEntity.Customer.CustomerBasicInfo customerInfo = GetCustomerBaseInfo(soInfo.BaseInfo.CustomerSysNo.Value); string customerLanguageCode = customerInfo.FavoriteLanguageCode; string smsContent = ObjectFactory <ECCentral.Service.IBizInteract.ICustomerBizInteract> .Instance.GetSMSContent(soInfo.WebChannel == null?null : soInfo.WebChannel.ChannelID, customerLanguageCode, soInfo.ShippingInfo.ShipTypeSysNo.Value, BizEntity.Customer.SMSType.OrderOutBound); if (!AppSettingHelper.NEG_NotVAT_StockSysNoList.Exists(no => no == stockSysNo)) { //发送短信 smsContent = ResourceHelper.Get("NEG_SMS_SO_VATSend"); ExternalDomainBroker.SendSMS(mobilePhone, smsContent, BizEntity.Common.SMSPriority.Normal); } } } catch (Exception ex) { ExceptionHelper.HandleException(ex); } }