Exemple #1
0
 private decimal GetTotalMoney(SOInfo entity)
 {
     return(entity.BaseInfo.SOAmount.Value
            + entity.BaseInfo.ShipPrice.Value
            + entity.BaseInfo.PayPrice.Value
            + entity.BaseInfo.PremiumAmount.Value);
 }
Exemple #2
0
        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);
        }
Exemple #3
0
        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;
            }
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        //收银完成
        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();
        }
Exemple #6
0
        /// <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;
            }
        }
Exemple #7
0
        /// <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);
     }
 }
Exemple #9
0
        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);
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        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 }
                });
            }
        }
Exemple #12
0
        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);
     }
 }
Exemple #15
0
        /// <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;
            }
        }
Exemple #16
0
        ///// 计算积分返回
        /// <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);//用点数支付的是负值,所以这块用+
        }
Exemple #17
0
        /// <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;
        }
Exemple #18
0
        //获取配送时间点
        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));
        }
Exemple #19
0
        /// <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;
                        }
                    }
                }
            }
        }
Exemple #20
0
        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);
        }
Exemple #21
0
 //销售规则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);
 }
Exemple #22
0
        /// <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);
        }
Exemple #24
0
        /// <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);
        }
Exemple #25
0
        /// <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);
        }
Exemple #26
0
        /// <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);
            }
        }
Exemple #27
0
        /// <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);
        }
Exemple #28
0
        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));
        }
Exemple #29
0
        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);
            }
        }