Beispiel #1
0
        public async Task Handle(SettlementPriceMessageEvent @event)
        {
            if (@event == null)
            {
                throw new ArgumentNullException(nameof(SettlementPriceMessageEvent));
            }
            //根据event内容分析出各种费项与计价单位
            //获取计价单位
            var priceUnit = GetPriceUnit(@event.Calculates.FirstOrDefault());
            //分析各种费项结果,并生成各种费项类
            var prices = AnalyzeFeesAndSetTransportFees(@event.Fees);
            //开始计算费用
            var priceHandler = new PriceHandler(prices, priceUnit, @event.Goods);

            priceHandler.Handle();
            if (priceHandler != null && priceHandler.PriceValue > 0)
            {
                //根据operationid取相关任务
                var task = await _taskRepository.FindByOperationAsync(@event.OperationID);

                if (task == null)
                {
                    throw new SettlementDomainException(@event.OperationID + "下的运输任务不存在");
                }
                if (task.Payable == null)
                {
                    throw new SettlementDomainException(@event.OperationID + "运输下的应付没有被初始化");
                }
                task.Payable.ExChangeStatus(PayableStatusEnum.Todo);
                task.Payable.SetPrice(priceHandler.PriceValue);
                //应付子集
                foreach (var item in prices)
                {
                    PayableItem pi = new PayableItem
                    {
                        Amount       = item.Value,
                        CostCode     = item.Code,
                        CostName     = item.Name,
                        CostType     = item.Id,
                        PayableBasis = PayableBasisEnum.Contract
                    };
                    task.Payable.AddItem(pi);
                }
                await _taskRepository.UpdateAsync(task);

                //这里可以继续发送FinishPriceEvent事件
            }
            await _taskRepository.UnitOfWork.SaveChangesAsync();
        }
Beispiel #2
0
        public async Task CalculatePrice(SettlementPriceMessageEvent evt)
        {
            if (evt == null)
            {
                throw new ArgumentNullException(nameof(SettlementPriceMessageEvent));
            }
            if (evt.Calculates.Count == 0)
            {
                throw new ArgumentException("指派操作为:" + evt.OperationID + "的报价不存在");
            }
            if (evt.Fees.Count == 0)
            {
                throw new ArgumentException("指派操作为:" + evt.OperationID + "的费项不存在");
            }
            //根据event内容分析出各种费项与计价单位
            //获取计价单位
            var priceUnit = GetPriceUnit(evt.Calculates.FirstOrDefault());
            //分析各种费项结果,并生成各种费项类
            var prices = AnalyzeFeesAndSetTransportFees(evt.Fees);
            //开始计算费用
            var priceHandler = new PriceHandler(prices, priceUnit, evt.Goods);

            priceHandler.Handle();
            if (priceHandler != null && priceHandler.PriceValue > 0)
            {
                //根据operationid取相关任务
                var task = await _taskRepository.FindByOperationAsync(evt.OperationID);

                if (task == null)
                {
                    throw new SettlementDomainException(evt.OperationID + "下的运输任务不存在");
                }
                if (task.Payable == null)
                {
                    throw new SettlementDomainException(evt.OperationID + "运输下的应付没有被初始化");
                }
                task.Payable.ExChangeStatus(PayableStatusEnum.Todo);
                task.Payable.SetPrice(priceHandler.PriceValue);
                //取送货类
                var sendPrice = prices.Where(p => p.GetType() == typeof(SendGoodsPrice)).Where(p => p.Value > 0).Cast <SendGoodsPrice>().FirstOrDefault();
                if (sendPrice != null)
                {
                    task.Payable.AddItem(new PayableItem
                    {
                        Amount       = sendPrice.SumPrice,
                        UnitPrice    = sendPrice.Value,
                        CostCode     = sendPrice.Code,
                        CostName     = sendPrice.Name,
                        CostType     = sendPrice.Id,
                        LowestPrice  = sendPrice.LowestPrice,
                        Unit         = sendPrice.Unit,
                        Number       = sendPrice.Number,
                        PayableBasis = PayableBasisEnum.Contract,
                        Note         = sendPrice.Remark
                    });
                }
                prices.Where(p => p.GetType() != typeof(LowestPrice))
                .Where(p => p.GetType() != typeof(SendGoodsPrice))
                .Where(p => p.GetType() != typeof(FreePickWeightOrVolumePrice))
                .Where(p => p.GetType() != typeof(FreeSendWeightOrVolumePrice))
                .Where(p => p.Value > 0)
                .ForEach(item =>
                {
                    PayableItem pi = new PayableItem
                    {
                        Amount       = item.SumPrice,
                        UnitPrice    = item.Value,
                        CostCode     = item.Code,
                        CostName     = item.Name,
                        CostType     = item.Id,
                        LowestPrice  = item.LowestPrice,
                        Unit         = item.Unit,
                        Number       = item.Number,
                        PayableBasis = PayableBasisEnum.Contract
                    };
                    if (item.GetType() == typeof(PickGoodsPrice))
                    {
                        pi.Note = (item as PickGoodsPrice).Remark;
                    }
                    task.Payable.AddItem(pi);
                });
                await _taskRepository.UpdateAsync(task);

                //这里可以继续发送FinishPriceEvent领域事件
                var finishSettlementEvent = new FinishSettlementEvent();
                var settlementPayable     = new SettlementPayable
                {
                    Amount             = task.Payable.Amount,
                    OperationId        = evt.OperationID,
                    SettlementUnit     = task.Payable.SettlementUnit,
                    SettlementUnitCode = task.Payable.SettlementUnitCode,
                    PayableItems       = _mapper.Map <List <SettlementPayableItem> >(task.Payable.Details)
                };
                finishSettlementEvent.SetPayable(settlementPayable);
                task.AddDomainEvent(finishSettlementEvent);
                await _taskRepository.UnitOfWork.SaveEntitiesAsync();
            }
        }