コード例 #1
0
ファイル: SenderLogic.cs プロジェクト: JoeNeu/parcel-tracker
        public DTO.NewParcelInfo SubmitParcelIntoBL(Parcel parcel)
        {
            try
            {
                var validator   = new ParcelValidation();
                var checkParcel = validator.Validate(parcel);

                if (!checkParcel.IsValid)
                {
                    throw new BLException("BL: Parcel Validation failed");
                }

                //check if parcel.trackingId is set -> only happens if it is from a Logistic Partner
                if (parcel.TrackingId == null || _sqlRepoParcel.GetByTrackingID(parcel.TrackingId) != null)
                {
                    //generate new trackingId until it is a unique
                    do
                    {
                        parcel.TrackingId = GenerateTrackingId();
                    } while (_sqlRepoParcel.GetByTrackingID(parcel.TrackingId) != null);
                }
                //Set State to InTransport
                parcel.State = Parcel.StateEnum.InTransportEnum;

                //Encode Sender and Receipient into a Location

                Location recLocation  = _agent.EncodeGeocodeAsync(GenerateAddress(parcel.Receipient));
                Location sendLocation = _agent.EncodeGeocodeAsync(GenerateAddress(parcel.Sender));

                //Find responsible Truck for Sender - START
                //currently only for austria -> NO Transferwarehouse

                var        senderTruck = _mapper.Map <Truck>(_sqlRepoHop.GetTruckByLocation(sendLocation));
                HopArrival firstHop    = new HopArrival()
                {
                    Code     = senderTruck.Code,
                    DateTime = DateTime.Now
                };
                parcel.VisitedHops.Add(firstHop);

                //Find responsible Truck for Recipient - FINISH
                var recTruck = _mapper.Map <Truck>(_sqlRepoHop.GetTruckByLocation(recLocation));

                //Calculate Route

                var rcptHopList   = GetRouteToRoot(recTruck);
                var senderHopList = GetRouteToRoot(senderTruck);

                //var intersect = rcptHopList.Intersect(senderHopList,EqualityComparerFactory.Create<WarehouseNextHops>((a) => a.HopACode.GetHashCode(), (a, b) =))
                bool found        = false;
                Hop  intersection = null;
                foreach (var senderStep in senderHopList)
                {
                    if (found == false)
                    {
                        foreach (var step in rcptHopList)
                        {
                            if (senderStep.Code == step.Code)
                            {
                                intersection = senderStep;
                                found        = true;
                                break;
                            }
                        }
                    }
                }
                //Get path to intersection
                var rcptJourney   = rcptHopList.TakeWhile(p => p.Code != intersection.Code).ToList();
                var senderJourney = senderHopList.TakeWhile(p => p.Code != intersection.Code).ToList();
                senderJourney.Add(intersection);
                //reverse rcptJourney
                rcptJourney.Reverse();
                senderJourney.AddRange(rcptJourney);
                senderJourney.Add(recTruck);
                foreach (var step in senderJourney)
                {
                    HopArrival futureHop = new HopArrival()
                    {
                        Code     = step.Code,
                        DateTime = DateTime.Now
                    };
                    parcel.FutureHops.Add(futureHop);
                }


                var parcelDAL = _mapper.Map <DAL.Parcel>(parcel);
                _sqlRepoParcel.Create(parcelDAL);

                var NPInfoMapped         = _mapper.Map <DTO.NewParcelInfo>(parcel);
                DTO.NewParcelInfo NPInfo = (DTO.NewParcelInfo)NPInfoMapped;

                return(NPInfo);
            }
            catch (DAL.DALException exc)
            {
                _logger.LogError(exc.ToString());
                throw new BLException($"{exc.GetType()} Exception in {System.Reflection.MethodBase.GetCurrentMethod().Name}", exc);
            }
            catch (Exception exc)
            {
                _logger.LogError(exc.ToString());
                throw new BLException($"{exc.GetType()} Exception in {System.Reflection.MethodBase.GetCurrentMethod().Name}", exc);
            }
        }