示例#1
0
        /// <summary>计算采购单为采购中(分配采购公司)
        /// </summary>
        /// <param name="purchasingId">采购单Id</param>
        public void PurchaseInProcess(Guid purchasingId)
        {
            //获取采购单信息
            var purchasingInfo = _purchasing.GetPurchasingById(purchasingId);
            //获取此采购单供应商绑定我方公司
            var filialeIds = _companyCussent.GetCompanyBindingFiliale(purchasingInfo.CompanyID);
            //获取供应商信息(是否必开票)
            var cinfo = _companyCussent.GetCompanyCussent(purchasingInfo.CompanyID);

            //获取当前采购单供应商当前年月分配的具体采购额度(含剩余额度)
            var dateTime = DateTime.Now;
            IList <ProcurementTicketLimitInfo> ptlList = _procurementTicketLimitDal.GetProcurementTicketLimitDetailByCompanyId(purchasingInfo.CompanyID, dateTime.Year, dateTime.Month);

            //获取采购单商品分组金额集合
            var goodsAmountList = _purchasing.GetGoodsAmountList(purchasingInfo.PurchasingID);
            //采购单商品总金额
            var goodsSumAmount = goodsAmountList.Sum(ent => ent.AmountPrice);
            //采购单分组商品集合
            IList <PurchasingGoodsSplitInfo> purchasingGoodsSplitList = new List <PurchasingGoodsSplitInfo>();

            // 1.该采购单供应商没有绑定我方公司,则获取任意一总公司作为采购公司
            if (filialeIds.Count == 0)
            {
                var filialeId = FilialeManager.GetHeadList().First(ent => ent.Name.Contains("可得")).ID;
                _purchasing.PurchasingUpdate(purchasingInfo.PurchasingID, filialeId, false);
                return;
            }
            // 1.未设置采购额度但已绑定我方公司(获取其中一家公司采购)
            if (ptlList.Count == 0 && filialeIds.Count > 0)
            {
                _purchasing.PurchasingUpdate(purchasingInfo.PurchasingID, filialeIds[0], false);
                return;
            }
            //1.只绑定一个采购公司
            if (filialeIds.Count == 1 && ptlList.Count == 1)
            {
                if (cinfo.IsNeedInvoices)
                {
                    _purchasing.PurchasingUpdate(purchasingInfo.PurchasingID, filialeIds[0], true);
                }
                else
                {
                    var item = ptlList[0];
                    _purchasing.PurchasingUpdate(purchasingInfo.PurchasingID, filialeIds[0], goodsSumAmount <= item.SurplusLimit);
                }
                return;
            }

            //采购公司ID
            IList <Guid> filialeIdGuids = new List <Guid>();

            foreach (var item in ptlList)
            {
                if (item.SurplusLimit > 0 || cinfo.IsNeedInvoices)
                {
                    var info = new PurchasingGoodsSplitInfo
                    {
                        FilialeId               = item.FilialeId,
                        PurchasingLimit         = item.SurplusLimit,
                        TotalPurchasingLimit    = item.TakerTicketLimit,
                        IsElseFilialeId         = false,
                        PurchasingGoodsItemList = new List <PurchasingGoodsItemInfo>()
                    };
                    purchasingGoodsSplitList.Add(info);
                }
                if (item.SurplusLimit < goodsSumAmount)
                {
                    filialeIdGuids.Add(item.FilialeId);
                }
            }
            //所有采购公司剩余额度全部满足当前采购单,此采购单分配给剩余比例最大的采购公司
            if (filialeIdGuids.Count == 0)
            {
                var maxItem = ptlList.OrderByDescending(ent => ent.SurplusProportion).ThenBy(ent => ent.SurplusLimit).ToList()[0];
                _purchasing.PurchasingUpdate(purchasingInfo.PurchasingID, maxItem.FilialeId, true);
                return;
            }
            //如果剩余额度某家不满足当前采购单金额,此采购单分配给剩余比例最大且满足此采购单金额的采购公司
            foreach (var item in ptlList.OrderByDescending(ent => ent.SurplusProportion).ThenBy(ent => ent.SurplusLimit).Where(item => item.SurplusLimit >= goodsSumAmount))
            {
                _purchasing.PurchasingUpdate(purchasingInfo.PurchasingID, item.FilialeId, true);
                return;
            }
            //所有采购公司不满足当前采购单
            if (filialeIdGuids.Count == ptlList.Count)
            {
                //如果采购单商品只有1个
                if (goodsAmountList.Count == 1)
                {
                    var item = ptlList.OrderByDescending(ent => ent.SurplusProportion).First();
                    _purchasing.PurchasingUpdate(purchasingInfo.PurchasingID, item.FilialeId, cinfo.IsNeedInvoices);
                    return;
                }
                //循环采购商品从大到小
                foreach (var gInfo in goodsAmountList.OrderByDescending(ent => ent.AmountPrice))
                {
                    //获取满足当前商品的采购公司,并将此商品添加到此采购公司
                    var tempgInfo = gInfo;
                    var item      = purchasingGoodsSplitList.Where(ent => ent.SurplusPurchasingLimit >= tempgInfo.AmountPrice).OrderBy(ent => ent.SurplusPurchasingLimit);
                    if (item.Any())
                    {
                        var temp = item.First();
                        var info = new PurchasingGoodsItemInfo
                        {
                            TotalGoodsAmount = gInfo.AmountPrice,
                            IsOut            = true,
                            GoodsCode        = gInfo.GoodsCode
                        };
                        temp.PurchasingGoodsItemList.Add(info);
                    }
                    else
                    {
                        //如果是必开票
                        if (cinfo.IsNeedInvoices)
                        {
                            var item1 = purchasingGoodsSplitList.OrderByDescending(ent => ent.TotalPurchasingLimit).First();
                            var info1 = new PurchasingGoodsItemInfo
                            {
                                TotalGoodsAmount = gInfo.AmountPrice,
                                IsOut            = true,
                                GoodsCode        = gInfo.GoodsCode
                            };
                            item1.PurchasingGoodsItemList.Add(info1);
                        }
                        else //非必开票
                        {
                            //var item1 = purchasingGoodsSplitList.FirstOrDefault(ent => ent.IsElseFilialeId);
                            //if (item1 != null)
                            //{
                            //    var info1 = new PurchasingGoodsItemInfo
                            //    {
                            //        TotalGoodsAmount = gInfo.AmountPrice,
                            //        IsOut = true, //cinfo.IsNeedInvoices
                            //        GoodsCode = gInfo.GoodsCode
                            //    };
                            //    item1.PurchasingGoodsItemList.Add(info1);
                            //}
                            //else
                            //{

                            //}
                            //添加一条其他公司的记录
                            var info1 = new PurchasingGoodsItemInfo
                            {
                                TotalGoodsAmount = gInfo.AmountPrice,
                                IsOut            = false,
                                GoodsCode        = gInfo.GoodsCode
                            };
                            IList <PurchasingGoodsItemInfo> items = new List <PurchasingGoodsItemInfo>();
                            items.Add(info1);
                            //获取最大额度的采购公司
                            var maxItem = ptlList.OrderByDescending(ent => ent.TakerTicketLimit).First();
                            purchasingGoodsSplitList.Add(new PurchasingGoodsSplitInfo
                            {
                                FilialeId               = maxItem.FilialeId,
                                TotalPurchasingLimit    = maxItem.TakerTicketLimit,
                                PurchasingLimit         = maxItem.SurplusLimit,
                                IsElseFilialeId         = true,
                                PurchasingGoodsItemList = items
                            });
                        }
                    }
                }
                SplitPurchasing(purchasingId, purchasingGoodsSplitList);
            }
        }