コード例 #1
0
 public List <DispatchDetails> GetOrderDispatches(int orderId)
 {
     if (UserHelper.IsAuthorize(new List <int> {
         (int)UserType.SuperAdmin, (int)UserType.Admin, (int)UserType.Client
     }))
     {
         try
         {
             List <DispatchDetails>  result = new List <DispatchDetails>();
             List <Orders_Positions> listOfOrdersPositions = _context.Orders_Positions.Where(o => o.Order_id == orderId && o.Deleted_At == null).ToList();
             Delivery delivery = _context.Deliveries.FirstOrDefault(d => d.Order_Id == orderId && d.Deleted_At == null);
             List <Deliveries_Dispatches> listOfDeliveryDispatches = _context.Deliveries_Dispatches.Where(d => d.Delivery_Id == delivery.Id && d.Deleted_At == null).ToList();
             foreach (var deliveryDispatch in listOfDeliveryDispatches)
             {
                 Dispatch         dispatch         = _context.Dispatches.FirstOrDefault(d => d.Id == deliveryDispatch.Dispatch_Id && d.Deleted_At == null);
                 DispatchDetails  dispatchDetails  = new DispatchDetails();
                 CarrierDispatch  carrierDispatch  = new CarrierDispatch();
                 ReceiverDispatch receiverDispatch = new ReceiverDispatch();
                 List <OrderPositionsDispatchInfo> listOfOrderPositionsDispatchInfo = new List <OrderPositionsDispatchInfo>();
                 List <Dispatches_Positions>       listOfDispatchPositions          = new List <Dispatches_Positions>();
                 foreach (var item in listOfOrdersPositions)
                 {
                     var dispatchPosition = _context.Dispatches_Positions.FirstOrDefault(d => d.Order_Position_Id == item.Id && d.Dispatch_Id == dispatch.Id && d.Deleted_At == null);
                     if (dispatchPosition != null)
                     {
                         var     dispatchesPositionsForOrderPosition = _context.Dispatches_Positions.Where(d => d.Order_Position_Id == item.Id && EntityFunctions.DiffSeconds(d.Created_At, dispatchPosition.Created_At) < 0 && d.Deleted_At == null).OrderBy(d => d.Created_At).ToList();
                         int?    dispatchedAmount = dispatchesPositionsForOrderPosition.Sum(d => d.Amount);
                         decimal?dispatchedWeight = dispatchesPositionsForOrderPosition.Sum(d => d.Weight_Gross);
                         OrderPositionsDispatchInfo orderPositionsDispatchInfo = new OrderPositionsDispatchInfo();
                         orderPositionsDispatchInfo.Id                     = item.Id;
                         orderPositionsDispatchInfo.Name                   = item.Name;
                         orderPositionsDispatchInfo.Amount                 = item.Amount;
                         orderPositionsDispatchInfo.Amount_Received        = item.Amount_Received;
                         orderPositionsDispatchInfo.Amount_Before_Dispatch = item.Amount_Received - dispatchedAmount;
                         orderPositionsDispatchInfo.Amount_Dispatch        = dispatchPosition.Amount;
                         orderPositionsDispatchInfo.Amount_After_Dispatch  = orderPositionsDispatchInfo.Amount_Before_Dispatch - orderPositionsDispatchInfo.Amount_Dispatch;
                         orderPositionsDispatchInfo.Weight_Gross           = item.Weight_Gross;
                         orderPositionsDispatchInfo.Weight_Gross_Received  = item.Weight_Gross_Received;
                         orderPositionsDispatchInfo.Weight_Before_Dispatch = item.Weight_Gross_Received - dispatchedWeight;
                         orderPositionsDispatchInfo.Weight_Dispatch        = dispatchPosition.Weight_Gross;
                         orderPositionsDispatchInfo.Weight_After_Dispatch  = orderPositionsDispatchInfo.Weight_Before_Dispatch - orderPositionsDispatchInfo.Weight_Dispatch;
                         listOfOrderPositionsDispatchInfo.Add(orderPositionsDispatchInfo);
                     }
                 }
                 carrierDispatch.Carrier_Name           = dispatch.Carrier_Name;
                 carrierDispatch.Carrier_Email          = dispatch.Carrier_Email;
                 carrierDispatch.Carrier_Address        = dispatch.Carrier_Address;
                 carrierDispatch.Carrier_PrefixVat_Id   = dispatch.Carrier_PrefixVat_Id;
                 carrierDispatch.Carrier_VAT_Id         = dispatch.Carrier_VAT_Id;
                 carrierDispatch.Carrier_PhoneNumber    = dispatch.Carrier_PhoneNumber;
                 receiverDispatch.Receiver_Name         = dispatch.Receiver_Name;
                 receiverDispatch.Receiver_Email        = dispatch.Receiver_Email;
                 receiverDispatch.Receiver_Address      = dispatch.Receiver_Address;
                 receiverDispatch.Receiver_PrefixVat_Id = dispatch.Receiver_PrefixVat_Id;
                 receiverDispatch.Receiver_VAT_Id       = dispatch.Receiver_VAT_Id;
                 receiverDispatch.Receiver_PhoneNumber  = dispatch.Receiver_PhoneNumber;
                 dispatchDetails.Id = dispatch.Id;
                 dispatchDetails.Dispatch_Number      = dispatch.Dispatch_Number;
                 dispatchDetails.Creation_Date        = dispatch.Creation_Date == null ? string.Empty : ((DateTime)(dispatch.Creation_Date)).ToString("dd-MM-yyyy");
                 dispatchDetails.Car_Id               = dispatch.Car_Id;
                 dispatchDetails.Carrier              = carrierDispatch;
                 dispatchDetails.Receiver             = receiverDispatch;
                 dispatchDetails.ListOfOrderPositions = listOfOrderPositionsDispatchInfo;
                 result.Add(dispatchDetails);
             }
             return(result);
         }
         catch (Exception ex)
         {
             throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message));
         }
     }
     else
     {
         throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "User don't have acces to this method"));
     }
 }
コード例 #2
0
ファイル: Plane.cs プロジェクト: ellseworth/test_carrier
    private void Update()
    {
        CarrierDispatch carrier          = flight.carrier;
        Color           debugTargetColor = Color.green;

        switch (_state)
        {
        //стандарьный режим разведки
        case 0:
            GetStartLandingPoint();
            debugTargetColor = Color.green;
            //определяем и оцениваем оставшееся время разведки
            float restTime = flight.scoutTime - (Time.time - _startTime);
            if (restTime <= 0)
            {
                _state++;
                break;
            }
            //определяем по приоритетм цель, к которой нужно лететь
            _target = Target ?? _target ?? GetNextScoutPoint();
            //определяем достижимость цели с корректировкой по скорости
            //если цель назначена диспетчерской, ее нельзя отменить
            float linearSpd = LinearSpeed;
            if (!CanBeReached(_target.Value, ref linearSpd) && Target == null)
            {
                _target = null;
            }
            LinearSpeed = linearSpd;
            break;

        //режим ожидания очереди на посадку
        case 1:
            debugTargetColor = Color.yellow;
            //запрашиваем у диспетчерской свое место в очереди на посадку
            Vector3?prepairLandingPoint = carrier.RequestLanding(this);
            //если места нет, значит можно сажать
            if (prepairLandingPoint == null)
            {
                _state++;
                break;
            }
            //находясь в очереди, желательно по-прежнему избегать столкновений, поэтому слушаем диспетчерскую
            _target = Target ?? prepairLandingPoint;
            //определяем достижимость цели с корректировкой по скорости
            linearSpd = LinearSpeed;
            CanBeReached(_target.Value, ref linearSpd);
            LinearSpeed = linearSpd;
            break;

        //режим посадки
        case 2:
            debugTargetColor = Color.red;
            //если находимся в точке посадки, с допустимым направлением - считай сели
            if (IsInPoint(carrier.Position, 0) && Vector3.Angle(Direction, carrier.Direction) < 30)
            {
                if (Returned != null)
                {
                    Returned(this);
                }
                Destroy(gameObject);
                break;
            }
            //следуем к точке на траектории посадки
            _target   = GetStartLandingPoint();
            linearSpd = LinearSpeed;
            //определяем достижимость цели с корректировкой по скорости
            CanBeReached(_target.Value, ref linearSpd);
            LinearSpeed = linearSpd;
            break;
        }

        //логика движения к цели===========================
        //поворот к цели
        if (_target.HasValue)
        {
            Vector3    toTarget         = _target.Value - Position;
            Quaternion toTargetRotation =
                toTarget == Vector3.zero ? Quaternion.identity : Quaternion.LookRotation(toTarget);

            //сохранеие текущей угловой скорости для пользования ей другими компонентами
            //по довороту до цели определяем знак угловой скорости
            Quaternion fromToRotation = Quaternion.FromToRotation(Direction, toTarget);
            if (fromToRotation.eulerAngles.y == 0)
            {
                AngularSpeed = 0;
            }
            else if (fromToRotation.eulerAngles.y < 0)
            {
                AngularSpeed = -_angularSpeed;
            }
            else
            {
                AngularSpeed = _angularSpeed;
            }

            //собственно, поворот к цели
            transform.rotation = Quaternion.RotateTowards(
                transform.rotation,
                toTargetRotation,
                _angularSpeed * Time.deltaTime
                );

            if (_debug)
            {
                Debug.DrawLine(Position, _target.Value, debugTargetColor);
            }
        }

        //движение вперед
        float   deltaPos      = LinearSpeed * Time.deltaTime;
        Vector3 deltaPosition = Direction * deltaPos;

        if (deltaPosition != Vector3.zero)
        {
            Position += deltaPosition;
        }
        //сбросить цель, ели она достигнута
        if (_target.HasValue && IsInPoint(_target.Value, deltaPos))
        {
            _target = null;
        }
    }
コード例 #3
0
ファイル: DispatchManager.cs プロジェクト: dawi1995/Warehouse
        public DispatchDetailsPDF GetDispatchDetails(int dispatchId)
        {
            DispatchDetailsPDF result = new DispatchDetailsPDF();
            List <OrderPositionsDispatchInfoPDF> listOfOrderPositionsDispatchInfoPDF = new List <OrderPositionsDispatchInfoPDF>();
            Dispatch       dispatch    = _context.Dispatches.FirstOrDefault(d => d.Id == dispatchId && d.Deleted_At == null);
            int            cmrId       = Convert.ToInt32(dispatch.CMR_Id);
            CMR_Dispatches cmrDispatch = _context.CMR_Dispatches.FirstOrDefault(c => c.Id == cmrId && c.Deleted_At == null);
            List <Dispatches_Positions> dispatchPositions = _context.Dispatches_Positions.Where(d => d.Dispatch_Id == dispatchId && d.Deleted_At == null).ToList();

            foreach (var item in dispatchPositions)
            {
                Orders_Positions orderPosition            = _context.Orders_Positions.FirstOrDefault(o => o.Id == item.Order_Position_Id && o.Deleted_At == null);
                Order            order                    = _context.Orders.FirstOrDefault(o => o.Id == orderPosition.Order_id && o.Deleted_At == null);
                OrderPositionsDispatchInfoPDF toAddToList = new OrderPositionsDispatchInfoPDF();
                int?     amountReceived                   = orderPosition.Amount_Received;
                decimal? weightReceived                   = orderPosition.Weight_Gross_Received;
                DateTime dateDispatch = dispatch.Created_At.Value.AddMilliseconds(-1);//bo znak mniejszośc działa jak <=
                List <Dispatches_Positions> listOfdispatchesPositionsForOrderPosition = _context.Dispatches_Positions.Where(d => d.Order_Position_Id == orderPosition.Id && d.Deleted_At == null && d.Created_At.Value < dateDispatch).ToList();
                int?    amountBeforeDispatch = amountReceived - listOfdispatchesPositionsForOrderPosition.Sum(d => d.Amount);
                decimal?weightBeforeDispatch = weightReceived - listOfdispatchesPositionsForOrderPosition.Sum(d => d.Weight_Gross);
                int?    amountDispatch       = item.Amount;
                decimal?weightDispatch       = item.Weight_Gross;
                toAddToList.Id                     = item.Id;
                toAddToList.ATB                    = order.ATB;
                toAddToList.Container_Id           = order.Container_Id;
                toAddToList.Name                   = orderPosition.Name;
                toAddToList.Amount_Received        = amountReceived;
                toAddToList.Weight_Gross_Received  = weightReceived;
                toAddToList.Amount_Before_Dispatch = amountBeforeDispatch;
                toAddToList.Weight_Before_Dispatch = weightBeforeDispatch;
                toAddToList.Amount_Dispatch        = amountDispatch;
                toAddToList.Weight_Dispatch        = weightDispatch;
                listOfOrderPositionsDispatchInfoPDF.Add(toAddToList);
            }

            CarrierDispatch carrierDispatch = new CarrierDispatch();

            carrierDispatch.Carrier_Address = dispatch.Carrier_Address;
            carrierDispatch.Carrier_Email   = dispatch.Carrier_Email;
            carrierDispatch.Carrier_Name    = dispatch.Carrier_Name;
            carrierDispatch.Carrier_VAT_Id  = dispatch.Carrier_VAT_Id;

            ReceiverDispatch receiverDispatch = new ReceiverDispatch();

            receiverDispatch.Receiver_Address = dispatch.Receiver_Address;
            receiverDispatch.Receiver_Email   = dispatch.Receiver_Email;
            receiverDispatch.Receiver_Name    = dispatch.Receiver_Name;
            receiverDispatch.Receiver_VAT_Id  = dispatch.Receiver_VAT_Id;

            SenderDispatch senderDispatch = new SenderDispatch();

            if (cmrDispatch != null)
            {
                senderDispatch.Sender_Address = cmrDispatch.Sender_Address;
                senderDispatch.Sender_Email   = cmrDispatch.Sender_Email;
                senderDispatch.Sender_Name    = cmrDispatch.Sender_Name;
                senderDispatch.Sender_VAT_Id  = cmrDispatch.Sender_VAT_Id;
            }

            result.Id = dispatch.Id;
            result.Dispatch_Number      = dispatch.Dispatch_Number;
            result.Creation_Date        = dispatch.Creation_Date == null ? string.Empty : dispatch.Creation_Date.Value.ToString("dd-MM-yyyy");
            result.Car_Id               = dispatch.Car_Id;
            result.Destination          = cmrDispatch == null ? string.Empty : cmrDispatch.Destination;
            result.Carrier              = carrierDispatch;
            result.Receiver             = receiverDispatch;
            result.Sender               = senderDispatch;
            result.Duty_Doc_Id          = dispatch.Duty_Doc_Id;
            result.ListOfOrderPositions = listOfOrderPositionsDispatchInfoPDF;

            return(result);
        }
コード例 #4
0
ファイル: Plane.cs プロジェクト: ellseworth/test_carrier
    //находит точку захода посадку
    //чем более "правильное" положение занимает самолет относительно корабля, тем точка ближе к месту посадки,
    //"доводя" таким образом самолет до нужного направления захода на палубу
    private Vector3 GetStartLandingPoint()
    {
        CarrierDispatch carrier = flight.carrier;

        //сначала рассчитываем время прогноза позиции корабля
        float toCarrierDistance       = Vector3.Distance(Position, carrier.Position);
        float toCarrierTime           = toCarrierDistance / _minSpeed;
        float toCarrierDirectionAngle = Vector3.Angle(carrier.Direction, Direction);
        float toCarrierDirectionTime  = toCarrierDirectionAngle / _angularSpeed;
        float forecastTime            = toCarrierTime + toCarrierDirectionTime;
        //на основе времени прогноза расчитываем направление и позуцию корабля
        Quaternion forecastRotation;
        Vector3    forecastCarrierPosition = AngularMath.Forecast(
            carrier.Position,
            carrier.Direction * -Mathf.Abs(carrier.LinearSpeed),
            carrier.AngularSpeed,
            forecastTime,
            out forecastRotation
            );

        //расчитываем величину доворота курса до прогнозируемой позиции корабля до прогнозируемого направления корабля,
        Vector3 forecastCarrierDirection  = forecastRotation * carrier.Direction;
        Vector3 toForecastCarrierPosition = forecastCarrierPosition - Position;
        //это даст понимание расположения самолета относительно корабля в его прогнозируемой позиции
        Vector3 fromToCarrierToForecastDirectionEuler =
            Quaternion.FromToRotation(toForecastCarrierPosition, forecastCarrierDirection).eulerAngles -
            new Vector3(0, 180, 0);

        //на основе предыдущего расчета, определяем, в какую сторону должен будет поворачивать самолет
        float signedAngSpeed = _angularSpeed;

        if (fromToCarrierToForecastDirectionEuler.y > 0)
        {
            signedAngSpeed = -signedAngSpeed;
        }
        //коррекция угловой скорости самолета на угловую скорость корабля
        if (carrier.LinearSpeed > 0)
        {
            signedAngSpeed += Mathf.Max(carrier.AngularSpeed, 0);
        }
        else if (carrier.LinearSpeed < 0)
        {
            signedAngSpeed -= Mathf.Min(carrier.AngularSpeed, 0);
        }

        float maneurRadius;
        //расчет центра маневра от прогнозирумых позиции и нарпавления корабля
        Vector3 maneurCenter = AngularMath.CircleCenter(
            forecastCarrierPosition,
            forecastCarrierDirection * LinearSpeed,
            signedAngSpeed,
            out maneurRadius
            );

        if (_debug)
        {
            Vector3    radius = Vector3.forward * maneurRadius;
            Quaternion oneGeg = Quaternion.AngleAxis(1, Vector3.up);
            for (int i = 0; i < 360; i++)
            {
                Vector3 debugPoint = maneurCenter + radius;
                Debug.DrawRay(debugPoint, Vector3.up, Color.white);
                radius = oneGeg * radius;
            }
        }

        //строим гопотенузу прямого треугольника для расчета касательной
        Vector3 toManeurCenter = maneurCenter - Position;
        //расчет длины касатльной от позиции самолета к траектории виража на посадку
        float distanceToTangentPoint = Mathf.Pow(toManeurCenter.magnitude, 2) - Mathf.Pow(maneurRadius, 2);

        //если длина касательной не положительна, то мы находимся внутри траектории виража,
        //надо отлетать от корабля, но можно поропбовать зайти на посадку
        if (distanceToTangentPoint <= 0)
        {
            return(carrier.Position);
        }
        distanceToTangentPoint = Mathf.Pow(distanceToTangentPoint, 0.5f);

        //строим основу для касательной от гипотенузы (центр виража - позиция самолета)
        Vector3 toManeurTangent = toManeurCenter.normalized * distanceToTangentPoint;
        //определяем угол между гипотенузой и касательной
        float toManeurTangentRotateSin   = maneurRadius / toManeurCenter.magnitude;
        float toManeurTangetnRotateAngle = Mathf.Asin(toManeurTangentRotateSin) * 180 / Mathf.PI;

        if (signedAngSpeed > 0)
        {
            toManeurTangetnRotateAngle = -toManeurTangetnRotateAngle;
        }
        //для поворота заготовки касательной
        Quaternion rotateToManeurTangent = Quaternion.AngleAxis(toManeurTangetnRotateAngle, Vector3.up);

        //построение касательной от позиции самолета к траектории входа на посадку
        toManeurTangent = rotateToManeurTangent * toManeurTangent;
        //определние точки входа в траекторию посадки
        return(Position + toManeurTangent);
    }