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")); } }
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; } }
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); }
//находит точку захода посадку //чем более "правильное" положение занимает самолет относительно корабля, тем точка ближе к месту посадки, //"доводя" таким образом самолет до нужного направления захода на палубу 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); }