Example #1
0
        public string CreateSettlement(string customerCode, string[] inStorageIDs)
        {
            var listInStorageInfo = _inStorageInfoRepository.GetList(p => inStorageIDs.Contains(p.InStorageID) && p.CustomerCode == customerCode && !p.InStorageOrSettlementRelationals.Any() && (p.PaymentTypeID == 3 || p.PaymentTypeID == 4));

            if (!listInStorageInfo.Any())
            {
                throw new BusinessLogicException("该客户下没有未生成结算单的入仓单");
            }

            //获取结算单号
            string settlementNumber = SequenceNumberService.GetSequenceNumber(PrefixCode.SettlementID);

            List <ReceivingExpensesEditExt> listReceivingExpenses = new List <ReceivingExpensesEditExt>();
            List <WayBillInfo> listWayBillInfo = new List <WayBillInfo>();

            foreach (InStorageInfo inStorageInfo in listInStorageInfo)
            {
                _inStorageOrSettlementRelationalRepository.Add(new InStorageOrSettlementRelational()
                {
                    InStorageID      = inStorageInfo.InStorageID,
                    SettlementNumber = settlementNumber,
                });


                foreach (WayBillInfo wayBillInfo in inStorageInfo.WayBillInfos)
                {
                    listWayBillInfo.Add(wayBillInfo);
                    listReceivingExpenses.Add(_receivingExpensRepository.GetReceivingExpensesEditEx(wayBillInfo.WayBillNumber));
                }
            }

            var customer             = _customerRepository.GetFiltered(c => c.CustomerCode == customerCode).FirstOrDefault();
            var customerManagerInfos = _customerManagerInfoRepository.GetFiltered(c => c.Name == customer.CustomerManager).FirstOrDefault();

            SettlementInfo settlementInfo = new SettlementInfo()
            {
                SettlementNumber  = settlementNumber,
                CustomerCode      = customerCode,
                TotalNumber       = listInStorageInfo.Select(s => s.TotalQty.Value).Sum(),
                TotalWeight       = listInStorageInfo.Select(s => s.PhysicalTotalWeight).Sum(),
                TotalSettleWeight = listInStorageInfo.Select(s => s.TotalWeight.Value).Sum(),
                TotalFee          = listReceivingExpenses.Select(s => s.TotalFeeOriginal.Value).Sum(),
                Status            = 1,
                SalesMan          = customer.CustomerManager,
                SalesManTel       = customerManagerInfos == null?"":(customerManagerInfos.Tel ?? customerManagerInfos.Mobile),
                CreatedBy         = _workContext.User.UserUame,
                CreatedOn         = DateTime.Now,
                LastUpdatedBy     = _workContext.User.UserUame,
                LastUpdatedOn     = DateTime.Now,
            };

            _settlementInfoRepository.Add(settlementInfo);

            var query =
                from w in listWayBillInfo
                join r in listReceivingExpenses on w.WayBillNumber equals r.WayBillNumber
                group w by w.InShippingMethodID;

            var listSettlementDetailsInfo = from q in query
                                            select
                                            new SettlementDetailsInfo
            {
                SettlementNumber   = settlementNumber,
                ShippingMethodID   = q.Key,
                ShippingMethodName = q.Select(w => w.InShippingMethodName).FirstOrDefault(),
                TotalNumber        = q.Count(),
                TotalWeight        = q.Select(w => w.Weight.Value).Sum(),
                TotalSettleWeight  = q.Select(w => w.SettleWeight.Value).Sum(),
                TotalFee           = listReceivingExpenses.Where(r => q.Select(w => w.WayBillNumber).Contains(r.WayBillNumber)).Select(r => r.TotalFeeOriginal.Value).Sum()
            };

            foreach (SettlementDetailsInfo settlementDetailsInfo in listSettlementDetailsInfo)
            {
                _settlementDetailsInfoRepository.Add(settlementDetailsInfo);
            }

            using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0, 5, 0)))
            {
                _settlementInfoRepository.UnitOfWork.Commit();
                _inStorageOrSettlementRelationalRepository.UnitOfWork.Commit();
                _settlementDetailsInfoRepository.UnitOfWork.Commit();

                transaction.Complete();

                return(settlementNumber);
            }
        }