Esempio n. 1
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>
        /// 为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);
        }
Esempio n. 3
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);
        }
Esempio n. 4
0
 void ContractPhoneSOSpliter_SubSOAssign(SOInfo subSOInfo)
 {
     if (CurrentSO.SIMCardAndContractPhoneInfo != null)
     {
         subSOInfo.SIMCardAndContractPhoneInfo         = SerializationUtility.DeepClone(CurrentSO.SIMCardAndContractPhoneInfo);
         subSOInfo.SIMCardAndContractPhoneInfo.SOSysNo = subSOInfo.SysNo;
     }
 }
Esempio n. 5
0
        public void Test_Invoice_NetPayEntityClone()
        {
            var now = DateTime.Now;

            NetPayInfo netpayInfo = new NetPayInfo();

            netpayInfo.ApproveTime       = now;
            netpayInfo.ApproveUserSysNo  = 1;
            netpayInfo.ChannelID         = "channel";
            netpayInfo.CompanyCode       = "8601";
            netpayInfo.ExternalKey       = "externalkey";
            netpayInfo.GiftCardPayAmt    = 1000;
            netpayInfo.MasterSoSysNo     = 100000;
            netpayInfo.Note              = "note";
            netpayInfo.OrderAmt          = 1000;
            netpayInfo.PayAmount         = 1000;
            netpayInfo.PayTypeSysNo      = 1;
            netpayInfo.PointPay          = 1000;
            netpayInfo.PrePayAmt         = 1000;
            netpayInfo.RelatedSoSysNo    = 100000;
            netpayInfo.ReviewedTime      = now;
            netpayInfo.ReviewedUserSysNo = 1;
            netpayInfo.SOSysNo           = 100000;
            netpayInfo.Source            = NetPaySource.Bank;
            netpayInfo.Status            = NetPayStatus.Abandon;
            netpayInfo.SysNo             = 1000;

            var cloneNetPayInfo = SerializationUtility.DeepClone <NetPayInfo>(netpayInfo);

            Assert.AreEqual(now, cloneNetPayInfo.ApproveTime);
            Assert.AreEqual(1, cloneNetPayInfo.ApproveUserSysNo);
            Assert.AreEqual("channel", cloneNetPayInfo.ChannelID);
            Assert.AreEqual("8601", cloneNetPayInfo.CompanyCode);
            Assert.AreEqual("externalkey", cloneNetPayInfo.ExternalKey);
            Assert.AreEqual(1000, cloneNetPayInfo.GiftCardPayAmt);
            Assert.AreEqual(100000, cloneNetPayInfo.MasterSoSysNo);
            Assert.AreEqual("note", cloneNetPayInfo.Note);
            Assert.AreEqual(1000, cloneNetPayInfo.OrderAmt);
            Assert.AreEqual(1000, cloneNetPayInfo.PayAmount);
            Assert.AreEqual(1, cloneNetPayInfo.PayTypeSysNo);
            Assert.AreEqual(1000, cloneNetPayInfo.PointPay);
            Assert.AreEqual(1000, cloneNetPayInfo.PrePayAmt);
            Assert.AreEqual(100000, cloneNetPayInfo.RelatedSoSysNo);
            Assert.AreEqual(now, cloneNetPayInfo.ReviewedTime);
            Assert.AreEqual(1, cloneNetPayInfo.ReviewedUserSysNo);
            Assert.AreEqual(100000, cloneNetPayInfo.SOSysNo);
            Assert.AreEqual(NetPaySource.Bank, cloneNetPayInfo.Source);
            Assert.AreEqual(NetPayStatus.Abandon, cloneNetPayInfo.Status);
            Assert.AreEqual(1000, cloneNetPayInfo.SysNo);
        }
Esempio n. 6
0
        public void DeepCloneTest()
        {
            var user1 = new User(0, "AAA");
            var user2 = new User(1, "BBB");
            var users = new List <User> {
                user1, user2
            };
            var userCollection = new UserCollection(users);

            var cloned = SerializationUtility.DeepClone(userCollection);

            Assert.AreEqual(userCollection, cloned);
            Assert.AreNotSame(userCollection, cloned);
            Assert.AreNotSame(userCollection.Users, cloned.Users);
        }
Esempio n. 7
0
        public static List <PayTypeInfo> GetAllPayTypeList()
        {
            string cacheKey = "Payment_GetAllPayTypeList";

            if (HttpRuntime.Cache[cacheKey] != null)
            {
                return((List <PayTypeInfo>)HttpRuntime.Cache[cacheKey]);
            }
            List <PayTypeInfo> payTypeList = PaymentDA.GetAllPayTypeList();

            var cachedPayTypeList = SerializationUtility.DeepClone(payTypeList);

            HttpRuntime.Cache.Insert(cacheKey, cachedPayTypeList, null, DateTime.Now.AddSeconds(CacheTime.Longest), Cache.NoSlidingExpiration);

            return(payTypeList);
        }
Esempio n. 8
0
        public void Test_Invoice_PostPayEntityClone()
        {
            var now = DateTime.Now;

            PostPayInfo postpayInfo = new PostPayInfo();

            postpayInfo.ChannelID        = "channel";
            postpayInfo.CompanyCode      = "8601";
            postpayInfo.ConfirmedSOSysNo = 100000;
            postpayInfo.GiftCardPay      = 1000;
            postpayInfo.MasterSoSysNo    = 100000;
            postpayInfo.Note             = "note";
            postpayInfo.OrderAmt         = 1000;
            postpayInfo.PayAmount        = 1000;
            postpayInfo.PayTypeSysNo     = 1000;
            postpayInfo.PointPay         = 1000;
            postpayInfo.PrepayAmt        = 1000;
            postpayInfo.RemainAmt        = 1000;
            postpayInfo.SOSysNo          = 100000;
            postpayInfo.Status           = PostPayStatus.Yes;
            postpayInfo.SysNo            = 1000;

            var clonePostPayInfo = SerializationUtility.DeepClone <PostPayInfo>(postpayInfo);

            Assert.AreEqual("channel", clonePostPayInfo.ChannelID);
            Assert.AreEqual("8601", clonePostPayInfo.CompanyCode);
            Assert.AreEqual(100000, clonePostPayInfo.ConfirmedSOSysNo);
            Assert.AreEqual(1000, clonePostPayInfo.GiftCardPay);
            Assert.AreEqual(100000, clonePostPayInfo.MasterSoSysNo);
            Assert.AreEqual("note", clonePostPayInfo.Note);
            Assert.AreEqual(1000, clonePostPayInfo.OrderAmt);
            Assert.AreEqual(1000, clonePostPayInfo.PayAmount);
            Assert.AreEqual(1000, clonePostPayInfo.PayTypeSysNo);
            Assert.AreEqual(1000, clonePostPayInfo.PointPay);
            Assert.AreEqual(1000, clonePostPayInfo.PrepayAmt);
            Assert.AreEqual(1000, clonePostPayInfo.RemainAmt);
            Assert.AreEqual(100000, clonePostPayInfo.SOSysNo);
            Assert.AreEqual(PostPayStatus.Yes, clonePostPayInfo.Status);
            Assert.AreEqual(1000, clonePostPayInfo.SysNo);
        }
Esempio n. 9
0
        /// <summary>
        /// 保存单个子订单
        /// </summary>
        /// <param name="subSOInfo"></param>
        protected virtual void SaveSubSO(SOInfo subSOInfo)
        {
            if (IsAutoSplit)
            {
                subSOInfo.StatusChangeInfoList = SerializationUtility.DeepClone(CurrentSO.StatusChangeInfoList);
            }

            //保存订单主信息
            SODA.InsertSOMainInfo(subSOInfo);

            //邮政自提
            if (IsPostShip)
            {
                subSOInfo.ShippingInfo.PostInfo.SOSysNo = subSOInfo.SysNo;
                SODA.InsertChinaPost(subSOInfo.ShippingInfo.PostInfo);
            }
            //添加增值税发票信息
            if (subSOInfo.InvoiceInfo != null && subSOInfo.InvoiceInfo.IsVAT.Value && subSOInfo.InvoiceInfo.VATInvoiceInfo != null)
            {
                SODA.UpdateSOVATInvoice(subSOInfo.InvoiceInfo.VATInvoiceInfo);
            }

            SODA.InsertSOItemInfo(subSOInfo);

            SODA.InsertSOCheckShippingInfo(subSOInfo);
            //处理赠品信息 2011-8-29
            foreach (SOPromotionInfo promotionInfo in subSOInfo.SOPromotions)
            {
                SODA.InsertSOPromotionInfo(promotionInfo, subSOInfo.CompanyCode);
            }

            //处理毛利分配信息
            foreach (ItemGrossProfitInfo gross in subSOInfo.ItemGrossProfitList)
            {
                SODA.InsertSOItemGossProfit(gross);
            }
        }
Esempio n. 10
0
        /// <summary>
        /// 子订单促销活动分摊
        /// </summary>
        /// <param name="masterSOInfo"></param>
        /// <param name="subSOInfo"></param>
        private void AssignSubSOPromotion(SOInfo subSOInfo)
        {
            #region 拆分订单的促销活动.
            //拆分订单的促销活动.
            if (CurrentSO.SOPromotions != null && CurrentSO.SOPromotions.Count > 0)
            {
                CurrentSO.SOPromotions.ForEach(promotion =>
                {
                    SOPromotionInfo promotionInfo = SerializationUtility.DeepClone(promotion);

                    promotionInfo.SOSysNo = subSOInfo.SysNo;
                    switch (promotion.PromotionType)
                    {
                    case SOPromotionType.Combo:
                        break;

                    case SOPromotionType.Coupon:
                        if (promotionInfo.SOPromotionDetails != null && promotionInfo.SOPromotionDetails.Count > 0)
                        {
                            //移出主商品不在子订单中的促销明细
                            promotionInfo.SOPromotionDetails.RemoveAll(d =>
                            {
                                return(!subSOInfo.Items.Exists(subSOItem =>
                                {
                                    return subSOItem.ProductSysNo == d.MasterProductSysNo;
                                }));
                            });
                            //计算子订单的总折扣
                            promotionInfo.DiscountAmount = promotionInfo.SOPromotionDetails.Sum <SOPromotionDetailInfo>(d => d.DiscountAmount);
                        }
                        if (promotionInfo.DiscountAmount == 0)
                        {
                            promotionInfo = null;
                        }
                        break;

                    case SOPromotionType.SelfGift:
                        //子订单中是否包含有赠品,没有就将促销设置为null.
                        if (!promotionInfo.GiftList.Exists(g =>
                        {
                            return(subSOInfo.Items.Exists(item =>
                            {
                                return item.ProductType == SOProductType.SelfGift && g.ProductSysNo == item.ProductSysNo;
                            }));
                        }))
                        {
                            promotionInfo = null;
                        }
                        break;

                    case SOPromotionType.VendorGift:
                    case SOPromotionType.Accessory:
                        //子订单是否包含附件或厂商赠品,如果没有就设置为null
                        if (promotionInfo.SOPromotionDetails != null && promotionInfo.GiftList.Count > 0)
                        {
                            //移出不在子订单中的附件
                            promotionInfo.GiftList.RemoveAll(g =>
                            {
                                return(!subSOInfo.Items.Exists(subSOItem =>
                                {
                                    return promotion.PromotionType == SOPromotionType.Accessory ?
                                    (subSOItem.ProductSysNo == g.ProductSysNo && subSOItem.ProductType == SOProductType.Accessory) :
                                    (subSOItem.ProductSysNo == g.ProductSysNo && subSOItem.ProductType == SOProductType.Gift);
                                }));
                            });
                            ////移出附件不在子订单中的附件明细
                            //if (promotionInfo.GiftList.Count < 1)
                            //{
                            //    promotionInfo.SOPromotionDetails.RemoveAll(d =>
                            //    {
                            //        d.GiftList.RemoveAll(dg =>
                            //        {
                            //            return !promotionInfo.GiftList.Exists(g =>
                            //            {
                            //                return g.ProductSysNo == dg.ProductSysNo;
                            //            });
                            //        });
                            //        return d.GiftList.Count == 0;
                            //    });
                            //}
                        }
                        if (promotionInfo.GiftList.Count == 0)
                        {
                            promotionInfo = null;
                        }
                        break;
                    }
                    if (promotionInfo != null)
                    {
                        subSOInfo.SOPromotions.Add(promotionInfo);
                    }
                });
            }
            #endregion
        }
Esempio n. 11
0
        /// <summary>
        /// 分摊子订单
        /// </summary>
        /// <param name="subSOList"></param>
        private void CalculateSubSO(List <SOInfo> subSOList)
        {
            // 按金额升序排列,保证分摊的最后订单的金额最大,减少分摊误差。
            subSOList.Sort((o1, o2) => { return(o1.BaseInfo.SOAmount.Value.CompareTo(o2.BaseInfo.SOAmount.Value)); });

            decimal masterSOTotalPrice  = CurrentSO.BaseInfo.PromotionAmount.Value; //计算金额基数
            decimal masterSOTotalWeight = 0;                                        //计算重量基数

            CurrentSO.Items.ForEach(item =>
            {
                masterSOTotalPrice  += item.Quantity.Value * item.OriginalPrice.Value;
                masterSOTotalWeight += item.Quantity.Value * item.Weight.Value;
            });
            #region 分摊主的费用到子订单

            int     t_PointPay       = CurrentSO.BaseInfo.PointPay.Value;
            decimal t_ShipPrice      = CurrentSO.BaseInfo.ShipPrice.Value;
            decimal t_PayPrice       = CurrentSO.BaseInfo.PayPrice.Value;
            decimal t_PremiumAmt     = CurrentSO.BaseInfo.PremiumAmount.Value;
            decimal t_PrepayAmt      = CurrentSO.BaseInfo.PrepayAmount.Value;
            decimal t_PromotionValue = CurrentSO.BaseInfo.CouponAmount.Value;
            decimal t_GiftCardPay    = CurrentSO.BaseInfo.GiftCardPay.Value;

            decimal?t_OriginShipPrice = CurrentSO.ShippingInfo.OriginShipPrice ?? 0;
            decimal?t_PackageFee      = CurrentSO.ShippingInfo.PackageFee ?? 0;
            decimal?t_RegisteredFee   = CurrentSO.ShippingInfo.RegisteredFee ?? 0;
            decimal?t_ShippingFee     = CurrentSO.ShippingInfo.ShippingFee ?? 0;
            decimal?t_Weight3PL       = CurrentSO.ShippingInfo.Weight3PL ?? 0;
            decimal?t_WeightSO        = CurrentSO.ShippingInfo.Weight ?? 0;

            int subSOIndex = 0;
            foreach (SOInfo soInfo in subSOList)
            {
                bool    isLastSubSO     = ++subSOIndex == subSOList.Count;
                decimal subSOWeight     = 0; //订单总重量
                decimal subSOTotalPrice = 0; //订单去优惠券折扣后的总价

                soInfo.BaseInfo.PromotionAmount = 0;
                soInfo.BaseInfo.GainPoint       = 0;
                soInfo.BaseInfo.CouponAmount    = 0;

                soInfo.Items.ForEach(item =>
                {
                    item.SOSysNo = soInfo.SysNo;
                    soInfo.BaseInfo.PromotionAmount += item.PromotionAmount.Value; //计算销售规则拆扣
                    soInfo.BaseInfo.GainPoint       += item.GainPoint;             //计算获得的积分
                    soInfo.BaseInfo.CouponAmount    += item.CouponAmount;          //计算优惠券折扣

                    subSOWeight += item.Weight.Value * item.Quantity.Value;
                    //价格引用Price,而不是OriginalPrice,因为总价中不包含优惠券折扣。
                    subSOTotalPrice += item.Quantity.Value * item.Price.Value + item.PromotionAmount.Value;
                });

                soInfo.ShippingInfo.Weight = subSOWeight;

                #region 分摊订单费用
                decimal weightRate = subSOWeight / (masterSOTotalWeight <= 0 ? 1 : masterSOTotalWeight);   //重量分摊比例
                decimal priceRate  = subSOTotalPrice / (masterSOTotalPrice <= 0 ? 1 : masterSOTotalPrice); //金额分摊比例

                if (!isLastSubSO)                                                                          //  不是最后一个子订单
                {
                    //根据重量来分摊运费
                    soInfo.BaseInfo.ShipPrice = UtilityHelper.ToMoney(CurrentSO.BaseInfo.ShipPrice.Value * weightRate);
                    t_ShipPrice -= soInfo.BaseInfo.ShipPrice.Value;

                    //根据价格来分摊积分支付
                    soInfo.BaseInfo.PointPay = (int)(Math.Round(CurrentSO.BaseInfo.PointPay.Value * priceRate));
                    t_PointPay -= soInfo.BaseInfo.PointPay.Value;
                    soInfo.BaseInfo.PointPayAmount = Convert.ToDecimal(soInfo.BaseInfo.PointPay) / ExternalDomainBroker.GetPointToMoneyRatio(); //计算积分支付

                    //根据价格来分摊手续费
                    soInfo.BaseInfo.PayPrice = UtilityHelper.ToMoney(CurrentSO.BaseInfo.PayPrice.Value * priceRate);
                    t_PayPrice -= soInfo.BaseInfo.PayPrice.Value;

                    //根据价格来分摊积保价费
                    soInfo.BaseInfo.PremiumAmount = UtilityHelper.ToMoney(CurrentSO.BaseInfo.PremiumAmount.Value * priceRate);
                    t_PremiumAmt -= soInfo.BaseInfo.PremiumAmount.Value;


                    //余额支付的分摊比例
                    decimal priceRate_Prepay = soInfo.BaseInfo.SOTotalAmount / (CurrentSO.BaseInfo.SOTotalAmount <= 0 ? 1 : CurrentSO.BaseInfo.SOTotalAmount);
                    //根据商品总价分摊余额支付
                    soInfo.BaseInfo.PrepayAmount = UtilityHelper.ToMoney(CurrentSO.BaseInfo.PrepayAmount.Value * priceRate_Prepay);//分摊余额支付
                    t_PrepayAmt -= soInfo.BaseInfo.PrepayAmount.Value;
                    //根据商品总价分摊礼品卡支付
                    soInfo.BaseInfo.GiftCardPay = UtilityHelper.ToMoney(CurrentSO.BaseInfo.GiftCardPay.Value * priceRate_Prepay);//分摊礼品支付
                    t_GiftCardPay -= soInfo.BaseInfo.GiftCardPay.Value;
                }
                else //  最后一个子订单
                {
                    soInfo.BaseInfo.ShipPrice      = UtilityHelper.ToMoney(t_ShipPrice);
                    soInfo.BaseInfo.PointPay       = t_PointPay;
                    soInfo.BaseInfo.PointPayAmount = Convert.ToDecimal(soInfo.BaseInfo.PointPay) / ExternalDomainBroker.GetPointToMoneyRatio(); //计算积分支付
                    soInfo.BaseInfo.PayPrice       = UtilityHelper.ToMoney(t_PayPrice);
                    soInfo.BaseInfo.PremiumAmount  = UtilityHelper.ToMoney(t_PremiumAmt);

                    //余额支付的分摊比例
                    decimal priceRate_Prepay = soInfo.BaseInfo.SOTotalAmount / (CurrentSO.BaseInfo.SOTotalAmount <= 0 ? 1 : CurrentSO.BaseInfo.SOTotalAmount);
                    soInfo.BaseInfo.PrepayAmount = UtilityHelper.ToMoney(t_PrepayAmt);
                    soInfo.BaseInfo.GiftCardPay  = UtilityHelper.ToMoney(t_GiftCardPay);
                }

                if (CurrentSO.SOGiftCardList.Count > 0)
                {
                    decimal itemGiftCardPay = soInfo.BaseInfo.GiftCardPay.Value;
                    foreach (ECCentral.BizEntity.IM.GiftCardRedeemLog giftCard in CurrentSO.SOGiftCardList)
                    {
                        if (itemGiftCardPay <= 0)
                        {
                            break;
                        }
                        if (giftCard.Amount <= 0)
                        {
                            continue;
                        }
                        if (giftCard.Amount >= itemGiftCardPay)
                        {
                            giftCard.Amount -= itemGiftCardPay;
                            soInfo.SOGiftCardList.Add(new ECCentral.BizEntity.IM.GiftCardRedeemLog
                            {
                                Code   = giftCard.Code,
                                Amount = itemGiftCardPay
                            });
                            itemGiftCardPay = 0;
                            break;
                        }
                        else
                        {
                            itemGiftCardPay -= giftCard.Amount.Value;
                            soInfo.SOGiftCardList.Add(new ECCentral.BizEntity.IM.GiftCardRedeemLog
                            {
                                Code   = giftCard.Code,
                                Amount = giftCard.Amount
                            });
                            giftCard.Amount = 0;
                        }
                        if (itemGiftCardPay == 0M)
                        {
                            break;
                        }
                    }
                }


                if (IsAutoSplit)
                {
                    soInfo.BaseInfo.Status = SOStatus.WaitingOutStock;//拆分后子单为待出库状态
                }
                else
                {
                    soInfo.BaseInfo.Status = SOStatus.Origin;//拆分后子单为待审核状态
                }
                //拆单后需要重新计算每个子单是否是大件
                soInfo.BaseInfo.IsLarge = SOCommon.ValidateIsLarge(soInfo.ShippingInfo.Weight.Value); // 是否大件商品

                if (!isLastSubSO)
                {
                    soInfo.ShippingInfo.OriginShipPrice = UtilityHelper.ToMoney((CurrentSO.ShippingInfo.OriginShipPrice ?? 0) * weightRate);
                    t_OriginShipPrice -= soInfo.ShippingInfo.OriginShipPrice;

                    soInfo.ShippingInfo.PackageFee = UtilityHelper.ToMoney((CurrentSO.ShippingInfo.PackageFee ?? 0) * weightRate);
                    t_PackageFee -= soInfo.ShippingInfo.PackageFee;

                    soInfo.ShippingInfo.RegisteredFee = UtilityHelper.ToMoney((CurrentSO.ShippingInfo.RegisteredFee ?? 0) * weightRate);
                    t_RegisteredFee -= soInfo.ShippingInfo.RegisteredFee;

                    soInfo.ShippingInfo.ShippingFee = UtilityHelper.ToMoney((CurrentSO.ShippingInfo.ShippingFee ?? 0) * weightRate);
                    t_ShippingFee -= soInfo.ShippingInfo.ShippingFee;

                    soInfo.ShippingInfo.Weight3PL = (int)((CurrentSO.ShippingInfo.Weight3PL ?? 0) * weightRate);
                    t_Weight3PL -= soInfo.ShippingInfo.Weight3PL;

                    soInfo.ShippingInfo.Weight = (int)((CurrentSO.ShippingInfo.Weight ?? 0) * weightRate);
                    t_WeightSO -= soInfo.ShippingInfo.Weight;
                }
                else
                {
                    soInfo.ShippingInfo.OriginShipPrice = t_OriginShipPrice;
                    soInfo.ShippingInfo.PackageFee      = t_PackageFee;
                    soInfo.ShippingInfo.RegisteredFee   = t_RegisteredFee;
                    soInfo.ShippingInfo.ShippingFee     = t_ShippingFee;
                    soInfo.ShippingInfo.Weight3PL       = t_Weight3PL;
                    soInfo.ShippingInfo.Weight          = t_WeightSO;
                }
                #endregion

                AssignSubSOPromotion(soInfo);
                AssignSubSOInvoice(soInfo);
                if (SubSOAssign != null)
                {
                    SubSOAssign(soInfo);
                }

                List <ItemGrossProfitInfo> gorsses = new List <ItemGrossProfitInfo>();
                foreach (ItemGrossProfitInfo gross in CurrentSO.ItemGrossProfitList)
                {
                    foreach (SOItemInfo item in soInfo.Items)
                    {
                        if (gross.ProductSysNo == item.ProductSysNo)
                        {
                            ItemGrossProfitInfo subgross = SerializationUtility.DeepClone(gross);
                            subgross.SOSysNo = soInfo.SysNo.Value;
                            soInfo.ItemGrossProfitList.Add(subgross);
                        }
                    }
                }
            }
            #endregion
        }
Esempio n. 12
0
        /// <summary>
        /// 拆分当前订单
        /// </summary>
        private void SplitCurrentSO()
        {
            #region 拆分订单
            List <SOItemInfo> couponList         = new List <SOItemInfo>(); //订单使用的优惠券
            List <SOItemInfo> extendWarrentyList = new List <SOItemInfo>(); //订单的所有延保
            List <int>        stockSysNoList     = new List <int>();
            CurrentSO.Items.ForEach(item =>
            {
                switch (item.ProductType.Value)
                {
                case SOProductType.Product:
                case SOProductType.Gift:
                case SOProductType.Award:
                case SOProductType.Accessory:
                case SOProductType.SelfGift:
                    {
                        if (!stockSysNoList.Exists(stockSysNo => { return(stockSysNo == item.StockSysNo && item.StockSysNo != null); }))
                        {
                            stockSysNoList.Add(item.StockSysNo.Value);
                        }
                        break;
                    }

                case SOProductType.Coupon:
                    couponList.Add(item);
                    break;

                case SOProductType.ExtendWarranty:
                    extendWarrentyList.Add(item);
                    break;
                }
            });

            if (stockSysNoList.Count < 2)
            {
                BizExceptionHelper.Throw("SO_Split_NotSplit");
                return;
            }

            foreach (int stockSysNo in stockSysNoList)
            {
                SOInfo soInfo = CreateSubSO();

                //取得子订单的商品
                soInfo.Items = SerializationUtility.DeepClone <List <SOItemInfo> >(CurrentSO.Items.FindAll(item => item.StockSysNo == stockSysNo));

                //修改ItemsExtenstion
                if (soInfo.Items != null && soInfo.Items.Count > 0)
                {
                    foreach (var item in soInfo.Items)
                    {
                        if (item.ItemExtList != null && item.ItemExtList.Count > 0)
                        {
                            item.ItemExtList.ForEach(x => { x.SOSysNo = soInfo.SysNo.Value; });
                        }
                    }
                }


                //添加优惠券到每个仓库
                if (couponList != null && couponList.Count > 0)
                {
                    soInfo.Items.AddRange(SerializationUtility.DeepClone(couponList));
                }

                //延保跟随主商品
                extendWarrentyList.ForEach(item =>
                {
                    if (soInfo.Items.Exists(o => o.ProductSysNo == int.Parse(item.MasterProductSysNo)))
                    {
                        soInfo.Items.Add(SerializationUtility.DeepClone <SOItemInfo>(item));
                    }
                });

                //计算总金额
                soInfo.BaseInfo.SOAmount = UtilityHelper.ToMoney(soInfo.Items.Sum <SOItemInfo>(item =>
                {
                    if (item.ProductType == SOProductType.Product || item.ProductType == SOProductType.ExtendWarranty)
                    {
                        return(item.OriginalPrice.Value * item.Quantity.Value);
                    }
                    return(0);
                }));
                //soInfo.ShippingInfo.DeliveryFrequency = SetDeliveryType(soInfo);//设置订单的配置频率
                SetSOCCheckShippingSettlementStatus(soInfo);
                SubSOList.Add(soInfo);
            }
            #endregion
        }
        /// <summary>
        /// 加载代销结算单详细
        /// </summary>
        /// <param name="settlementSysNo"></param>
        /// <returns></returns>
        public virtual CollectionPaymentInfo Create(CollectionPaymentInfo entity)
        {
            //去除已经删除的Item(SysNo=-1) 次方法已经在Portal加过了,此处只为以防万一了
            entity.SettleItems = (from tItem in entity.SettleItems
                                  where tItem.SettleSysNo != -1
                                  select tItem).ToList();

            string OperationIP             = string.Empty;
            string OperationUserUniqueName = string.Empty;

            VerifyCreate(entity);
            VerifySettleItems(entity, SettlementVerifyType.CREATE);
            VerifyProductPMSysNo(entity);
            //VerityOverConsignRuleQuantity(entity);

            //entity.CreateUserSysNo = SystemUserHelper.GetUserSystemNumber(BusinessContext.Current.OperationUserFullName,
            //        BusinessContext.Current.OperationUserSourceDirectoryKey, BusinessContext.Current.OperationUserLoginName,
            //        BusinessContext.Current.CompanyCode);
            entity.CreateUserSysNo = entity.CurrentUserSysNo;;
            entity.CreateTime      = DateTime.Now;
            entity.Status          = POCollectionPaymentSettleStatus.Origin;

            //修改代销转财务记录的状态
            foreach (var item in entity.SettleItems)
            {
                item.ConsignToAccLogInfo.ConsignToAccStatus = ConsignToAccountLogStatus.ManualCreated;
                //item.
            }
            //用于收集操作过的结算单
            List <CollectionPaymentInfo> settleEntityList = new List <CollectionPaymentInfo>();

            //计算返点,返点总额将会平均分配到以下结算单,当返点总额大于单个结算单的返点额,那单个结算单返点将和计算单总额相等
            //剩余返点额将在下个结算单中使用
            decimal totalUsingReturnPoint = entity.UsingReturnPoint ?? 0;

            using (TransactionScope scope = new TransactionScope())
            {
                //按照仓库的不同自动分结算单
                var stockSysNoList = entity.SettleItems.Select(p => p.ConsignToAccLogInfo.StockSysNo).Distinct();

                foreach (int?stockSysNo in stockSysNoList)
                {
                    //需要深度赋值新的类
                    var newEntity = SerializationUtility.DeepClone <CollectionPaymentInfo>(entity);

                    newEntity.SourceStockInfo.SysNo = stockSysNo;
                    var tempSettleList = new List <CollectionPaymentItem>();
                    tempSettleList.AddRange(newEntity.SettleItems.Where(p => p.ConsignToAccLogInfo.StockSysNo == stockSysNo));
                    //计算总结算数
                    newEntity.TotalAmt = tempSettleList.Sum(p => p.Cost * p.ConsignToAccLogInfo.ProductQuantity.Value);


                    newEntity.SettleItems = tempSettleList;

                    //判断规则数量是否还有剩余


                    newEntity    = CollectionPaymentDA.Create(newEntity);
                    entity.SysNo = newEntity.SysNo;
                    //将操作完成的收集在临时列表中
                    settleEntityList.Add(newEntity);
                }
                //更新代销转财务记录状态
                settleEntityList.ForEach(x =>
                {
                    UpdateConsignToAccLogStatus(x);
                });

                //发送ESB消息
                EventPublisher.Publish <CollectionPaymentCreateMessage>(new CollectionPaymentCreateMessage()
                {
                    CurrentUserSysNo = ServiceContext.Current.UserSysNo,
                    SysNo            = entity.SysNo.Value
                });

                scope.Complete();
            }

            foreach (var newEntity in settleEntityList)
            {
                //执行其它操作
                newEntity.OperationIP             = OperationIP;
                newEntity.OperationUserSysNumber  = entity.CreateUserSysNo;
                newEntity.OperationUserUniqueName = OperationUserUniqueName;
                //CommonService.WriteLog<CollectionPaymentEntity>(newEntity, " Create VendorSettle ", newEntity.SysNo.Value.ToString(), (int)LogType.CollectionPayment_Create);
                VendorInfo vendor = VendorDA.LoadVendorInfo(newEntity.VendorInfo.SysNo.Value);
                if (vendor.VendorFinanceInfo.IsAutoAudit != null && vendor.VendorFinanceInfo.IsAutoAudit == true)
                {
                    try
                    {
                        Audit(newEntity);
                    }
                    catch (Exception ex)
                    {
                        //MailService.SendMail(ConfigurationManager.AppSettings["VendorSettleFrom"], ConfigurationManager.AppSettings["VendorSettleTo"], "代销结算单自动审核", newEntity.SysNo.ToString() + ":" + ex.ErrorDescription);
                    }

                    //自动结算
                    entity = Settle(newEntity);
                }
            }
            return(entity);
        }
Esempio n. 14
0
        public void UpdateAdjustQuantityOfSTB(List <InventoryBatchDetailsInfo> model, int inputDocumentNumber, string inputType, string inputAction)
        {
            if (model == null || model.Count == 0)
            {
                AbandonSTBInfo(inputDocumentNumber, inputType, inputAction);
            }
            else
            {
                //获取数据库重更新前的数量
                List <InventoryBatchDetailsInfo> originalInventoryBatchDetailsInfolist = ObjectFactory <IInventoryAdjustDA> .Instance.GetBatchDetailsInfoEntityListByNumber(Convert.ToInt32(inputDocumentNumber));

                List <int> deleteItemSysNoList = new List <int>();
                List <InventoryBatchDetailsInfo> deleteBatchInfoList = new List <InventoryBatchDetailsInfo>();
                if (originalInventoryBatchDetailsInfolist != null)
                {
                    originalInventoryBatchDetailsInfolist.ForEach(p =>
                    {
                        if (model != null)
                        {
                            var count = model.Where(k => k.ProductSysNo == p.ProductSysNo).Count();
                            if (count == 0)
                            {
                                deleteItemSysNoList.Add(p.ProductSysNo);
                            }
                        }
                        var c = model.Where(k => k.ProductSysNo == p.ProductSysNo && k.BatchNumber == p.BatchNumber && k.StockSysNo == p.StockSysNo).Count();
                        if (c == 0)
                        {
                            var clone      = SerializationUtility.DeepClone <InventoryBatchDetailsInfo>(p);
                            clone.Quantity = 0;
                            deleteBatchInfoList.Add(clone);
                        }
                    });
                }
                //把需要删除的批次加入

                model.AddRange(deleteBatchInfoList);

                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0, 5, 0)))
                {
                    //损益单 调整需要 特殊处理
                    if (inputType.Equals("Adjust") && inputAction.Equals("Create"))//损益单创建  输入正值 不调占用库存
                    {
                        InnerAdjustMethod(model, inputDocumentNumber, deleteItemSysNoList, "AD", "Create", originalInventoryBatchDetailsInfolist);
                    }
                    else if (inputType.Equals("Lend") && inputAction.Equals("Create"))//借货单创建  更新
                    {
                        InnerLendMethod(model, inputDocumentNumber, deleteItemSysNoList, "LD", "Create", originalInventoryBatchDetailsInfolist);
                    }
                    else if (inputType.Equals("Lend") && inputAction.Equals("Return"))//借货单归还  更新实际库存
                    {
                        //更新 ST_Batch Quantity 和ReturnQty
                        ObjectFactory <IInventoryAdjustDA> .Instance.UpdateSTBInfo(model, inputDocumentNumber, "LD", "Return");

                        //拼XML 调用TankSP调整 实际库存
                        InnerReturndMethod(model, inputDocumentNumber, inputType, inputAction);
                        //发送SSB 到仓库
                        ObjectFactory <LendRequestProcessor> .Instance.ReturnSendSSBToWMS(inputDocumentNumber, model[0].StockSysNo.ToString(), model, null, "借货单归还向仓库发送SSB");
                    }
                    else if (inputType.Equals("Convert") && inputAction.Equals("Create"))//转换单创建  目标商品不调占用库存
                    {
                        List <InventoryBatchDetailsInfo> OriginalSourceInventoryBatchDetailsInfolist = new List <InventoryBatchDetailsInfo>();
                        if (originalInventoryBatchDetailsInfolist != null && originalInventoryBatchDetailsInfolist.Count > 0)
                        {
                            OriginalSourceInventoryBatchDetailsInfolist = originalInventoryBatchDetailsInfolist.FindAll(x => { return(x.ReturnQty == 0); });
                        }

                        //找到源商品中被删除的商品
                        deleteItemSysNoList.Clear();
                        deleteBatchInfoList.Clear();
                        if (originalInventoryBatchDetailsInfolist != null)
                        {
                            var originSourceBatchDetailsInfoList = originalInventoryBatchDetailsInfolist.Where(p => p.ReturnQty == 0).ToList();
                            originSourceBatchDetailsInfoList.ForEach(p =>
                            {
                                if (model != null)
                                {
                                    var count = model.Where(k => k.ProductSysNo == p.ProductSysNo).Count();
                                    if (count == 0)
                                    {
                                        deleteItemSysNoList.Add(p.ProductSysNo);
                                    }
                                    var c = model.Where(k => k.ProductSysNo == p.ProductSysNo && k.BatchNumber == p.BatchNumber && k.StockSysNo == p.StockSysNo).Count();
                                    if (c == 0)
                                    {
                                        var clone      = SerializationUtility.DeepClone <InventoryBatchDetailsInfo>(p);
                                        clone.Quantity = 0;
                                        deleteBatchInfoList.Add(p);
                                    }
                                }
                            });
                        }
                        model.AddRange(deleteBatchInfoList);
                        InnerConvertMethod(model, inputDocumentNumber, deleteItemSysNoList, "TR", "Create", OriginalSourceInventoryBatchDetailsInfolist);
                    }
                    else if (inputType.Equals("Convert") && inputAction.Equals("Target"))//转换单创建  目标商品不调占用库存
                    {
                        //找到目标商品中被删除的商品
                        deleteItemSysNoList.Clear();
                        deleteBatchInfoList.Clear();
                        if (originalInventoryBatchDetailsInfolist != null)
                        {
                            var originTargetBatchDetailsInfoList = originalInventoryBatchDetailsInfolist.Where(p => p.ReturnQty != 0).ToList();
                            originTargetBatchDetailsInfoList.ForEach(p =>
                            {
                                if (model != null)
                                {
                                    var count = model.Where(k => k.ProductSysNo == p.ProductSysNo).Count();
                                    if (count == 0)
                                    {
                                        deleteItemSysNoList.Add(p.ProductSysNo);
                                    }
                                    var c = model.Where(k => k.ProductSysNo == p.ProductSysNo && k.BatchNumber == p.BatchNumber && k.StockSysNo == p.StockSysNo).Count();
                                    if (c == 0)
                                    {
                                        var clone      = SerializationUtility.DeepClone <InventoryBatchDetailsInfo>(p);
                                        clone.Quantity = 0;
                                        deleteBatchInfoList.Add(p);
                                    }
                                }
                            });
                        }

                        model.AddRange(deleteBatchInfoList);

                        if (deleteItemSysNoList.Count > 0)
                        {
                            foreach (var item in deleteItemSysNoList)
                            {
                                ObjectFactory <IInventoryAdjustDA> .Instance.DeleteBatchItemOfSTB(item, inputDocumentNumber);
                            }
                        }
                        ObjectFactory <IInventoryAdjustDA> .Instance.TargetUpdateSTBInfo(model, inputDocumentNumber, "TR");
                    }
                    scope.Complete();
                }
            }
        }
Esempio n. 15
0
        protected virtual void CalculateVendorGift(SOInfo soInfo)
        {
            //找出所有的GiftVendor的promotion
            if (soInfo.SOPromotions.Count > 0)
            {
                var vendorPromotions = soInfo.SOPromotions.FindAll(x => (x.PromotionType == SOPromotionType.VendorGift));
                if (vendorPromotions.Count > 0)
                {
                    List <SOItemInfo> itemsInSO = SerializationUtility.DeepClone <List <SOItemInfo> >(soInfo.Items);

                    //删除没有主商品和赠品的Promotion
                    for (int i = vendorPromotions.Count - 1; i >= 0; i--)
                    {
                        if (!itemsInSO.Exists(item => item.ProductSysNo == vendorPromotions[i].MasterList[0].ProductSysNo) ||
                            !itemsInSO.Exists(x => vendorPromotions[i].GiftList.Exists(y => y.ProductSysNo == x.ProductSysNo)))
                        {
                            soInfo.SOPromotions.Remove(vendorPromotions[i]);
                            vendorPromotions.RemoveAt(i);
                        }
                    }

                    //计算每个Promotion的最大赠品数量
                    foreach (var promotion in vendorPromotions)
                    {
                        promotion.SOSysNo = soInfo.SysNo;
                        //主商品
                        var master = itemsInSO.First(item => item.ProductSysNo == promotion.MasterList[0].ProductSysNo);
                        //次数
                        int times = master.Quantity.Value;

                        foreach (var giftInPromotion in promotion.GiftList)
                        {
                            //赠品的最大数量
                            int Ratio      = SOItemDA.GetRatioOfGift(master.ProductSysNo.Value, promotion.PromotionSysNo.Value, giftInPromotion.ProductSysNo);
                            int maxGiftQty = times * Ratio;

                            //找到SO里对应赠品
                            var giftInSO = itemsInSO.FirstOrDefault(x => x.ProductSysNo == giftInPromotion.ProductSysNo);

                            //跟新Promotional的实际赠品数量
                            int realQty = giftInSO == null ? 0 : giftInSO.Quantity >= maxGiftQty ? maxGiftQty : giftInSO.Quantity.Value;
                            giftInPromotion.Quantity = realQty;
                            //扣去被占用的数量
                            giftInSO.Quantity -= realQty;
                        }
                    }

                    //没有主商品的赠品
                    var noMasterGifts = itemsInSO.Where(item => item.Quantity > 0 && item.ProductType == SOProductType.Gift);

                    //移除这些赠品
                    foreach (var noMasterGift in noMasterGifts)
                    {
                        for (int i = soInfo.Items.Count - 1; i >= 0; i--)
                        {
                            if (soInfo.Items[i].ProductSysNo == noMasterGift.ProductSysNo)
                            {
                                int adjustQty = soInfo.Items[i].Quantity.Value - noMasterGift.Quantity.Value;

                                if (adjustQty > 0)
                                {
                                    soInfo.Items[i].Quantity = adjustQty;
                                }
                                else
                                {
                                    soInfo.Items.RemoveAt(i);
                                }
                            }
                        }
                    }
                }
            }
        }
Esempio n. 16
0
 public virtual T DeepClone()
 {
     return(SerializationUtility.DeepClone(this as T));
 }