public IHttpActionResult ShipOrder([FromBody] GuidModel model)
        {
            var cmd   = new ShipOrder(model.OrderId);
            var order = _commandDispatcher.ExecuteCommand <OrderAggregate>(cmd);

            return(Ok(OrderModel.FromAggregate(order)));
        }
Exemple #2
0
        public IAggregate Handle(ShipOrder command)
        {
            var order = _domainRepository.GetById <Order>(command.Id);

            order.ShipOrder();
            return(order);
        }
Exemple #3
0
        public virtual void OrderShip(ShipOrder order, bool append = false)
        {
            if (append)
            {
                // Can't append orders after a Patrol/Build!
                if (CurrentOrder != null &&
                    (CurrentOrder is PatrolOrder ||
                     CurrentOrder is BuildOrder ||
                     (Orders.Count > 0 && (Orders.Last() is PatrolOrder || Orders.Last() is BuildOrder))))
                {
                    return;
                }

                // Don't add an order that is already complete (dock replaced)
                if (!order.OrderComplete)
                {
                    Orders.Add(order);
                }
            }
            else
            {
                if (CurrentOrder != null)
                {
                    CurrentOrder.Cancel(this);
                }

                if (!order.OrderComplete)
                {
                    Orders.Clear();
                    CurrentOrder = order;
                }
            }
        }
Exemple #4
0
        public async Task ShipOrder_Success()
        {
            //adhere
            var initialInventory = ProductStockpileShop.Inventory.DeepCopy();

            //arrange
            var command = new ShipOrder
            {
                Id          = OrderReadyForShipment.Id,
                InitiatorId = GlobalAdmin.Id
            };
            var handler = new ShipOrderHandler(EntityRepository, OrderService, InventoryService, EventTransmitter);

            //act
            await handler.HandleAsync(command);

            //assert
            var orderAmount   = OrderReadyForShipment.ItemsProduced.Of(Product1InteriorDoor).Amount;
            var inventoryDiff = initialInventory.Of(Product1InteriorDoor).Amount
                                - ProductStockpileShop.Inventory.Of(Product1InteriorDoor).Amount;

            Assert.That(orderAmount, Is.EqualTo(inventoryDiff));

            Assert.That(RecordedEventCount <OrderShipped>(), Is.EqualTo(1));
            Assert.That(RecordedEventCount <DomainEvent <Order> >(), Is.EqualTo(1));

            //annul
            ProductStockpileShop.Inventory = initialInventory;
        }
Exemple #5
0
 public virtual void InsertOrder(ShipOrder order)
 {
     if (CurrentOrder != null)
     {
         Orders.Insert(0, CurrentOrder);
     }
     CurrentOrder = order;
 }
        internal void Ship(ShipOrder cmd)
        {
            if (State != OrderState.ReadyForShipping)
            {
                throw new InvalidOrderStateException(cmd.AggregateId, $"State should be {OrderState.ReadyForShipping} but is {State}");
            }

            RaiseEvent(new OrderShipped(cmd.AggregateId));
        }
Exemple #7
0
 public async Task PutOrderShippedAsync(Guid id)
 {
     var command = new ShipOrder
     {
         Id          = id,
         InitiatorId = Guid.NewGuid()
     };
     await _commandInvoker.Execute(command);
 }
Exemple #8
0
        public override void OrderShip(ShipOrder order, bool append = false)
        {
            if (Building)
            {
                return;
            }

            base.OrderShip(order, append);
        }
Exemple #9
0
    public Task Handle(ShipOrder message, IMessageHandlerContext context)
    {
        log.Info($"Order Shipped. OrderId {message.OrderId}");
        Data.OrderId = message.OrderId;

        log.Info("Order will complete in 5 seconds");
        var timeoutData = new CompleteOrder();

        return(RequestTimeout(context, TimeSpan.FromSeconds(5), timeoutData));
    }
Exemple #10
0
        public void Handle(ShipOrder message)
        {
            var shippingSvc = new Shipping.ShippingServiceClient();

            bool success = shippingSvc.ProcessOrderForShipping(Data.OrderId);

            UpdateOrderSuccess(success);

            MarkAsComplete();
        }
        public void Handle_ShipOrderArrived_TimeoutShouldBeSet()
        {
            Test.Initialize();

            var shipOrder = new ShipOrder {
                Order = 1
            };

            Test.Saga <BookShipmentPolicy>()
            .ExpectTimeoutToBeSetIn <FedExTimeout>((state, span) => span == TimeSpan.FromSeconds(5))
            .When(saga => saga.Handle(shipOrder));
        }
        public void Handle_ShipOrderArrived_SendToFedEx()
        {
            Test.Initialize();

            var shipOrder = new ShipOrder {
                Order = 1
            };

            Test.Saga <BookShipmentPolicy>()
            .ExpectSend <ShipWithFedEx>(m => m.Order == shipOrder.Order)
            .When(saga => saga.Handle(shipOrder));
        }
        public async Task Handle(ShipOrder message, IMessageHandlerContext context)
        {
            log.Info($"ShipOrderWorkflow for Order #{Data.OrderId} - Trying Maple first.");

            // Execute order to ship with Maple
            await context.Send(new ShipWithMaple()
            {
                OrderId = Data.OrderId
            });

            // Add timeout to escalate if Maple did not ship in time.
            await RequestTimeout(context, TimeSpan.FromSeconds(20), new ShippingEscalation());
        }
        public ActionResult Index()
        {
            List <Order>     OrderLists     = new List <Order>();
            List <ShipOrder> ShipOrderLists = new List <ShipOrder>();
            DataTable        tableReader    = new DataTable();

            using (SqlConnection conn = new SqlConnection(strConnString))
            {
                conn.Open();

                SqlCommand    scom  = new SqlCommand("SELECT * FROM [dbo].[Table]", conn);
                SqlDataReader sread = scom.ExecuteReader();

                tableReader.Load(sread);

                for (int i = 0; i < tableReader.Rows.Count; i++)
                {
                    Order order = new Order();
                    order.Id     = tableReader.Rows[i]["Id"].ToString();
                    order.Item   = tableReader.Rows[i]["Item"].ToString();
                    order.Price  = Convert.ToInt32(tableReader.Rows[i]["Price"]);
                    order.Cost   = Convert.ToInt32(tableReader.Rows[i]["Cost"]);
                    order.Status = tableReader.Rows[i]["Status"].ToString();
                    OrderLists.Add(order);
                }

                tableReader.Reset();

                scom.CommandText = "SELECT * FROM [dbo].[ShippingOrder]";
                sread            = scom.ExecuteReader();
                tableReader.Load(sread);

                for (int i = 0; i < tableReader.Rows.Count; i++)
                {
                    ShipOrder shiporder = new ShipOrder();
                    shiporder.Id              = tableReader.Rows[i]["Id"].ToString();
                    shiporder.OrderId         = tableReader.Rows[i]["OrderId"].ToString();
                    shiporder.Status          = tableReader.Rows[i]["Status"].ToString();
                    shiporder.CreatedDateTime = tableReader.Rows[i]["CreatedDateTime"].ToString();

                    ShipOrderLists.Add(shiporder);
                }

                conn.Close();
            }

            ViewBag.orders     = OrderLists;
            ViewBag.shiporders = ShipOrderLists;

            return(View());
        }
        public void Handle_FedExTimesOut_SendToUps()
        {
            Test.Initialize();

            var fedExTimeout = new FedExTimeout();
            var shipOrder    = new ShipOrder {
                Order = 1
            };

            Test.Saga <BookShipmentPolicy>()
            .When(policy => policy.Handle(shipOrder))
            .ExpectSend <ShipWithUps>(m => m.Order == shipOrder.Order)
            .When(saga => saga.Timeout(fedExTimeout));
        }
    public Task Handle(StartOrder message, IMessageHandlerContext context)
    {
        Data.OrderId          = message.OrderId;
        Data.OrderDescription = $"The saga for order {message.OrderId}";

        log.Info($"Received StartOrder message {Data.OrderId}. Starting Saga");

        var shipOrder = new ShipOrder
        {
            OrderId = message.OrderId
        };

        return(context.SendLocal(shipOrder));
    }
        public ActionResult Dispatch(DispatchRequest tranasctiondetail)
        {
            var model = this.ImsService.GetPayPalTransaction(tranasctiondetail.ID);

            tranasctiondetail.ShiptoName        = model.PayerAddressName;
            tranasctiondetail.ShipToStreet      = model.PayerAddressStreet1;
            tranasctiondetail.ShipToStreet2     = model.PayerAddressStreet2;
            tranasctiondetail.ShiptoCity        = model.PayerCityName;
            tranasctiondetail.ShipToState       = model.PayerStateOrProvince;
            tranasctiondetail.ShipToCountryName = model.PayerCountryName;
            tranasctiondetail.ShipToZip         = model.PayerPostalCode;
            ShipOrder order = this.ImsService.AddDispatchOrder(tranasctiondetail, model);

            return(Json(order, JsonRequestBehavior.AllowGet));
        }
Exemple #18
0
        public Task Handle(ShipOrder message, IMessageHandlerContext context)
        {
            Log.Info($"Received ShipOrder command for Order with Id {message.OrderId}.");
            Log.Info($"Attempting to ship Order with Id {Data.OrderId} with FanCourier.");

            Data.OrderId = message.OrderId;
            Data.Status  = ShippingStatus.ShippingWithFanCourier;

            context.Send(new ShipWithFanCourierRequest {
                CorrelationId = Data.OrderId
            });

            RequestTimeout(context, shipmentSla, new DidNotReceiveAResponseFromFanCourierTimeout());

            return(Task.CompletedTask);
        }
Exemple #19
0
        public async Task <IActionResult> OnPostAsync(int shipId, int orderId)
        {
            if (shipId == 0 || orderId == 0)
            {
                return(NotFound());
            }

            ShipOrder = await _context.ShipOrder.FindAsync(shipId, orderId);

            if (ShipOrder != null)
            {
                _context.ShipOrder.Remove(ShipOrder);
                await _context.SaveChangesAsync();
            }

            return(RedirectToPage("./Index"));
        }
        public async Task <IActionResult> OnGetAsync(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            ShipOrder = await _context.ShipOrder
                        .Include(s => s.Order)
                        .Include(s => s.Ship).FirstOrDefaultAsync(m => m.ShipId == id);

            if (ShipOrder == null)
            {
                return(NotFound());
            }
            return(Page());
        }
Exemple #21
0
        public void When_ShipOrder_OrderShipped()
        {
            Given(InitialEvents);

            var command = new ShipOrder(id);

            command.Metadata.CausationId   = command.Metadata.CommandId;
            command.Metadata.CorrelationId = causationAndCorrelationId;

            When(command);

            var expectedEvent = new OrderShipped(id);

            expectedEvent.Metadata.CausationId   = command.Metadata.CommandId;
            expectedEvent.Metadata.CorrelationId = causationAndCorrelationId;
            expectedEvent.Metadata.ProcessId     = command.Metadata.ProcessId;

            Then(expectedEvent);
        }
        public async Task <IActionResult> OnGetAsync(int shipId, int orderId)
        {
            if (shipId == 0 || orderId == 0)
            {
                return(NotFound());
            }

            ShipOrder = await _context.ShipOrder
                        .Include(s => s.Order)
                        .Include(s => s.Ship).FirstOrDefaultAsync(m => m.ShipId == shipId);


            if (ShipOrder == null)
            {
                return(NotFound());
            }
            ViewData["OrderId"] = new SelectList(_context.Order, "Id", "Id");
            ViewData["ShipId"]  = new SelectList(_context.Ship, "Id", "Class");
            ViewData["Count"]   = new SelectList(_context.ShipOrder, "Count");
            return(Page());
        }
    public Task Handle(StartOrder message, IMessageHandlerContext context)
    {
        var orderDescription = $"The saga for order {message.OrderId}";

        Data.OrderDescription = orderDescription;
        log.Info($"Received StartOrder message {Data.OrderId}. Starting Saga");

        var shipOrder = new ShipOrder
        {
            OrderId = message.OrderId
        };

        log.Info("Order will complete in 5 seconds");
        var timeoutData = new CompleteOrder
        {
            OrderDescription = orderDescription
        };

        return(Task.WhenAll(
                   context.SendLocal(shipOrder),
                   RequestTimeout(context, TimeSpan.FromSeconds(5), timeoutData)));
    }
        public Task Handle(PlaceOrder message, IMessageHandlerContext context)
        {
            log.Info($"Received PlaceOrder, OrderId = {message.OrderId}");

            // This is normally where some business logic would occur

            // Uncomment to test throwing a systemic exception
            //throw new Exception("BOOM");

            // Uncomment to test throwing a transient exception
            //if (random.Next(0, 5) == 0)
            //{
            //    throw new Exception("Oops");
            //}

            var shipOrder = new ShipOrder
            {
                OrderId = message.OrderId
            };

            return(context.Send(shipOrder));
        }
Exemple #25
0
    public async Task Handle(StartOrder message, IMessageHandlerContext context)
    {
        var orderDescription = $"The saga for order {message.OrderId}";
        Data.OrderDescription = orderDescription;
        log.Info($"Received StartOrder message {Data.OrderId}. Starting Saga");

        var shipOrder = new ShipOrder
        {
            OrderId = message.OrderId
        };
        await context.SendLocal(shipOrder)
            .ConfigureAwait(false);

        log.Info("Order will complete in 5 seconds");
        var timeoutData = new CompleteOrder
        {
            OrderDescription = orderDescription
        };

        await RequestTimeout(context, TimeSpan.FromSeconds(5), timeoutData)
            .ConfigureAwait(false);
    }
Exemple #26
0
        public ActionResult Dispatch(FormCollection collection)
        {
            //int id =int.Parse(collection["ID"].ToString());
            //var model = this.ImsService.GetTransactionDetail(id);


            DispatchRequest tranasctiondetail = new DispatchRequest();

            this.TryUpdateModel <DispatchRequest>(tranasctiondetail);
            var model = this.ImsService.GetTransactionDetail(tranasctiondetail.ID);

            tranasctiondetail.ShiptoName        = model.ShiptoName;
            tranasctiondetail.ShipToStreet      = model.ShipToStreet;
            tranasctiondetail.ShipToStreet2     = model.ShipToStreet2;
            tranasctiondetail.ShiptoCity        = model.ShiptoCity;
            tranasctiondetail.ShipToState       = model.ShipToState;
            tranasctiondetail.ShipToCountryName = model.ShipToCountryName;
            tranasctiondetail.ShipToZip         = model.ShipToZip;
            ShipOrder order = this.ImsService.AddDispatchOrder(tranasctiondetail);

            return(Json(order, JsonRequestBehavior.AllowGet));
        }
    public void Handle(StartOrder message)
    {
        Data.OrderId = message.OrderId;
        var orderDescription = $"The saga for order {message.OrderId}";

        Data.OrderDescription = orderDescription;
        log.Info($"Received StartOrder message {Data.OrderId}. Starting Saga");

        var shipOrder = new ShipOrder
        {
            OrderId = message.OrderId
        };

        Bus.SendLocal(shipOrder);

        log.Info("Order will complete in 5 seconds");
        var timeoutData = new CompleteOrder
        {
            OrderDescription = orderDescription
        };

        RequestTimeout(TimeSpan.FromSeconds(5), timeoutData);
    }
    static async Task AsyncMain()
    {
        Console.Title = "Samples.ServiceControl.ASBAdapter.Sales";
        const string letters = "ABCDEFGHIJKLMNOPQRSTUVXYZ";
        var          random  = new Random();
        var          endpointConfiguration = new EndpointConfiguration("Samples.ServiceControl.ASBAdapter.Sales");

        var transport        = endpointConfiguration.UseTransport <AzureServiceBusTransport>();
        var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus.ConnectionString.1");

        if (string.IsNullOrWhiteSpace(connectionString))
        {
            throw new Exception("Could not read 'AzureServiceBus.ConnectionString.1' environment variable. Check sample prerequisites.");
        }
        var shippingConnectionString = Environment.GetEnvironmentVariable("AzureServiceBus.ConnectionString.2");

        if (string.IsNullOrWhiteSpace(shippingConnectionString))
        {
            throw new Exception("Could not read 'AzureServiceBus.ConnectionString.2' environment variable. Check sample prerequisites.");
        }
        transport.ConnectionString(connectionString);

        #region FeaturesUnsuportedBySC

        transport.UseNamespaceAliasesInsteadOfConnectionStrings();
        transport.DefaultNamespaceAlias("sales");
        var routing = transport.NamespaceRouting();
        routing.AddNamespace("shipping", shippingConnectionString);
        transport.UseForwardingTopology();
        transport.BrokeredMessageBodyType(SupportedBrokeredMessageBodyTypes.Stream);
        var composition = transport.Composition();
        composition.UseStrategy <HierarchyComposition>()
        .PathGenerator(path => "scadapter/");

        #endregion

        var recoverability = endpointConfiguration.Recoverability();

        #region NamespaceAlias

        recoverability.Failed(
            customizations: settings =>
        {
            settings.HeaderCustomization(
                customization: headers =>
            {
                headers[AdapterSpecificHeaders.OriginalNamespace] = "sales";
            });
        });

        #endregion

        endpointConfiguration.UsePersistence <InMemoryPersistence>();

        var chaos = new ChaosGenerator();
        endpointConfiguration.RegisterComponents(
            registration: components =>
        {
            components.ConfigureComponent(() => chaos, DependencyLifecycle.SingleInstance);
        });

        recoverability.Immediate(
            customizations: immediate =>
        {
            immediate.NumberOfRetries(0);
        });
        recoverability.Delayed(delayed => delayed.NumberOfRetries(0));
        recoverability.DisableLegacyRetriesSatellite();

        endpointConfiguration.SendFailedMessagesTo("error");
        endpointConfiguration.AuditProcessedMessagesTo("audit");
        endpointConfiguration.EnableInstallers();

        var endpointInstance = await Endpoint.Start(endpointConfiguration)
                               .ConfigureAwait(false);

        Console.WriteLine("Press enter to exit");
        Console.WriteLine("Press 'o' to generate order");
        Console.WriteLine("Press 'f' to toggle simulating of message processing failure");
        while (true)
        {
            var key = Console.ReadKey();
            Console.WriteLine();
            if (key.Key == ConsoleKey.Enter)
            {
                break;
            }
            var lowerInvariant = char.ToLowerInvariant(key.KeyChar);
            if (lowerInvariant == 'o')
            {
                var orderId   = new string(Enumerable.Range(0, 4).Select(x => letters[random.Next(letters.Length)]).ToArray());
                var shipOrder = new ShipOrder
                {
                    OrderId = orderId,
                    Value   = random.Next(100)
                };
                var sendOptions = new SendOptions();
                sendOptions.SetDestination("Samples.ServiceControl.ASBAdapter.Shipping@shipping");
                await endpointInstance.Send(shipOrder, sendOptions)
                .ConfigureAwait(false);
            }
            if (lowerInvariant == 'f')
            {
                chaos.IsFailing = !chaos.IsFailing;
                Console.WriteLine($"Failure simulation is now turned {(chaos.IsFailing ? "on" : "off")}");
                ConsoleHelper.ToggleTitle();
            }
        }
        await endpointInstance.Stop()
        .ConfigureAwait(false);
    }
Exemple #29
0
        private IEnumerable <PickDetailDto> PickPermanentItem(ApplicationDbContext context, ShipOrder shipOrderInDb, IEnumerable <PickInfo> objArray)
        {
            var permanentSKUsInDb = context.PermanentSKUs
                                    .Where(x => x.Status == Status.Active);
            var pickDetailList = new List <PickDetail>();

            foreach (var o in objArray)
            {
                var sku = permanentSKUsInDb.SingleOrDefault(x => x.Id == o.LocId);

                pickDetailList.Add(new PickDetail
                {
                    CartonRange   = "NA",
                    Container     = "NA",
                    PurchaseOrder = sku.PurchaseOrder,
                    Style         = sku.Style,
                    Color         = sku.Color,
                    CustomerCode  = "NA",
                    SizeBundle    = sku.Size,
                    PcsBundle     = "NA",
                    PcsPerCarton  = 0,
                    PickCtns      = 0,
                    PickPcs       = o.Pcs,
                    Location      = sku.Location,
                    PickDate      = DateTime.Now.ToString("MM/dd/yyyy"),
                    PermanentSKU  = sku,
                    ShipOrder     = shipOrderInDb
                });
            }

            context.PickDetails.AddRange(pickDetailList);
            context.SaveChanges();

            return(Mapper.Map <IEnumerable <PickDetail>, IEnumerable <PickDetailDto> >(pickDetailList));
        }
Exemple #30
0
 private void AssignShipToExploreItem(ShipItem ship, IShipExplorable item) {
     if (!item.IsExploringAllowedBy(Owner)) {
         D.Error("{0} attempting to assign {1} to illegally explore {2}.", DebugName, ship.DebugName, item.DebugName);
     }
     if (item.IsFullyExploredBy(Owner)) {
         D.Error("{0} attempting to assign {1} to explore {2} which is already explored.", DebugName, ship.DebugName, item.DebugName);
     }
     ShipOrder exploreOrder = new ShipOrder(ShipDirective.Explore, CurrentOrder.Source, toNotifyCmd: true, target: item);
     ship.CurrentOrder = exploreOrder;
 }
Exemple #31
0
 /// <summary>
 /// Handles the situation where the provided ship has either successfully explored the
 /// provided target in the system, or the exploration of the target failed because the
 /// target is dead. Returns <c>true</c> if a new exploration target was assigned to the
 /// ship, <c>false</c> otherwise. If the ship received no new assignment, it has been
 /// instructed to gather at a nearby assembly station.
 /// </summary>
 /// <param name="ship">The ship.</param>
 /// <param name="exploreTgt">The explore TGT.</param>
 /// <returns></returns>
 private bool HandleSystemTargetExploredOrDead(ShipItem ship, IShipExplorable exploreTgt) {
     _shipSystemExploreTgtAssignments.Remove(exploreTgt);
     bool isNowAssigned = AssignShipToExploreSystemTgt(ship);
     if (!isNowAssigned) {
         if (ship.IsHQ) {
             // no point in telling HQ to assume station, but with no more explore assignment, it should
             // return to the closest Assembly station so the other ships assume station there
             IFleetExplorable fleetExploreTgt = CurrentOrder.Target as IFleetExplorable;
             var closestLocalAssyStation = GameUtility.GetClosest(Position, fleetExploreTgt.LocalAssemblyStations);
             var speed = Speed.Standard;
             float standoffDistance = Constants.ZeroF;   // AssyStation can't be owned by anyone
             bool isFleetwideMove = false;
             ship.CurrentOrder = new ShipMoveOrder(OrderSource.CmdStaff, closestLocalAssyStation, speed, isFleetwideMove, standoffDistance);
         }
         else {
             ShipOrder assumeStationOrder = new ShipOrder(ShipDirective.AssumeStation, OrderSource.CmdStaff);
             ship.CurrentOrder = assumeStationOrder;
         }
     }
     return isNowAssigned;
 }
Exemple #32
0
    void AssumingFormation_EnterState() {
        LogEvent();

        D.Log(ShowDebugLog, "{0} issuing {1} order to all ships.", DebugName, ShipDirective.AssumeStation.GetValueName());
        var shipAssumeFormationOrder = new ShipOrder(ShipDirective.AssumeStation, CurrentOrder.Source, toNotifyCmd: true);
        Elements.ForAll(e => {
            var ship = e as ShipItem;
            ship.CurrentOrder = shipAssumeFormationOrder;
        });
    }
Exemple #33
0
 void Attacking_EnterState() {
     LogEvent();
     _attackTarget = CurrentOrder.Target as IMortalTarget;
     _attackTarget.onTargetDeathOneShot += OnTargetDeath;
     var shipAttackOrder = new ShipOrder(ShipDirective.Attack, OrderSource.UnitCommand, _attackTarget);
     Elements.ForAll(e => (e as ShipModel).CurrentOrder = shipAttackOrder);
 }
Exemple #34
0
    private void InitiateRepair(bool retainSuperiorsOrderOnRepairCompletion) {
        D.AssertNotEqual(ShipState.Repairing, CurrentState);
        D.Assert(!_debugSettings.DisableRepair);
        D.Assert(Data.Health < Constants.OneHundredPercent);

        //D.Log(ShowDebugLog, "{0} is investigating whether to Disengage or AssumeStation before Repairing.", DebugName);
        ShipOrder goToStationAndRepairOrder;
        if (IsThereNeedForAFormationStationChangeTo(WithdrawPurpose.Repair)) {
            // there is a need for a station change to repair
            D.AssertDefault((int)_fsmDisengagePurpose);
            _fsmDisengagePurpose = WithdrawPurpose.Repair;
            goToStationAndRepairOrder = new ShipOrder(ShipDirective.Disengage, OrderSource.Captain) {
                FollowonOrder = new ShipOrder(ShipDirective.Repair, OrderSource.Captain)
            };
        }
        else {
            // there is no need to change FormationStation because either ship is HQ or it is already assigned a reserve station
            goToStationAndRepairOrder = new ShipOrder(ShipDirective.AssumeStation, OrderSource.Captain) {
                FollowonOrder = new ShipOrder(ShipDirective.Repair, OrderSource.Captain)
            };
        }
        OverrideCurrentOrder(goToStationAndRepairOrder, retainSuperiorsOrderOnRepairCompletion);
    }
Exemple #35
0
    /// <summary>
    /// The Captain uses this method to issue orders.
    /// </summary>
    /// <param name="captainsOverrideOrder">The captains override order.</param>
    /// <param name="retainSuperiorsOrder">if set to <c>true</c> [retain superiors order].</param>
    private void OverrideCurrentOrder(ShipOrder captainsOverrideOrder, bool retainSuperiorsOrder) {
        D.AssertEqual(OrderSource.Captain, captainsOverrideOrder.Source, captainsOverrideOrder.ToString());
        D.AssertNull(captainsOverrideOrder.StandingOrder, captainsOverrideOrder.ToString());
        D.Assert(!captainsOverrideOrder.ToNotifyCmd, captainsOverrideOrder.ToString());

        ShipOrder standingOrder = null;
        if (retainSuperiorsOrder && CurrentOrder != null) {
            if (CurrentOrder.Source != OrderSource.Captain) {
                D.AssertNull(CurrentOrder.FollowonOrder, CurrentOrder.ToString());
                // the current order is from the Captain's superior so retain it
                standingOrder = CurrentOrder;
            }
            else {
                // the current order is from the Captain, so it or its FollowonOrder's standing order, if any, should be retained
                standingOrder = CurrentOrder.FollowonOrder != null ? CurrentOrder.FollowonOrder.StandingOrder : CurrentOrder.StandingOrder;
            }
        }
        // assign the standingOrder, if any, to the last order to be executed in the overrideOrder
        if (captainsOverrideOrder.FollowonOrder != null) {
            captainsOverrideOrder.FollowonOrder.StandingOrder = standingOrder;
        }
        else {
            captainsOverrideOrder.StandingOrder = standingOrder;
        }
        CurrentOrder = captainsOverrideOrder;
    }
Exemple #36
0
    IEnumerator ExecuteAttackOrder_EnterState() {
        LogEvent();

        IUnitAttackable unitAttackableTgt = _fsmTgt as IUnitAttackable;

        _apMoveSpeed = Speed.Full;
        _apMoveTgtStandoffDistance = CalcApMoveTgtStandoffDistance(unitAttackableTgt);

        Call(FleetState.Moving);
        yield return null;  // required so Return()s here

        if (_orderFailureCause != UnitItemOrderFailureCause.None) {
            switch (_orderFailureCause) {
                case UnitItemOrderFailureCause.UnitItemNeedsRepair:
                    // TODO Initiate Fleet Repair and communicate failure to boss?
                    break;
                case UnitItemOrderFailureCause.UnitItemDeath:
                    // TODO Communicate failure to boss?
                    break;
                case UnitItemOrderFailureCause.TgtRelationship:
                    // TODO Communicate failure to boss?
                    // No longer allowed to attack _fsmTgt
                    IssueAssumeFormationOrderFromCmdStaff();
                    break;
                case UnitItemOrderFailureCause.TgtUncatchable:
                    // TODO Communicate failure to boss?
                    IssueAssumeFormationOrderFromCmdStaff();
                    break;
                case UnitItemOrderFailureCause.TgtDeath:
                    // order was to Move to _fsmTgt (unitAttackableTgt) so tgtDeath is an order failure
                    IssueAssumeFormationOrderFromCmdStaff();
                    break;
                case UnitItemOrderFailureCause.None:
                default:
                    throw new NotImplementedException(ErrorMessages.UnanticipatedSwitchValue.Inject(_orderFailureCause));
            }
            yield return null;
        }

        // If there was a failure generated by Moving, resulting new Orders or Dead state should keep this point from being reached
        D.AssertDefault((int)_orderFailureCause, _orderFailureCause.GetValueName());

        // issue ship attack orders
        var shipAttackOrder = new ShipOrder(ShipDirective.Attack, CurrentOrder.Source, toNotifyCmd: true, target: unitAttackableTgt as IShipNavigable);
        Elements.ForAll(e => (e as ShipItem).CurrentOrder = shipAttackOrder);
    }
Exemple #37
0
 /// <summary>
 /// Kills all remaining elements of the Unit along with this Command. All Elements are ordered 
 /// to Scuttle (assume Dead state) which results in the Command assuming its own Dead state.
 /// </summary>
 private void ScuttleUnit() {
     var elementScuttleOrder = new ShipOrder(ShipDirective.Scuttle, OrderSource.CmdStaff);
     Elements.ForAll(e => (e as ShipItem).CurrentOrder = elementScuttleOrder);
 }
Exemple #38
0
        private IEnumerable <PickDetailDto> PickRegularItem(ApplicationDbContext context, ShipOrder shipOrderInDb, IEnumerable <PickInfo> objArray)
        {
            var regularItemsInDb = context.FCRegularLocationDetails
                                   .Where(x => x.AvailableCtns != 0 || x.AvailablePcs != 0);

            var pickDetailList = new List <PickDetail>();

            foreach (var o in objArray)
            {
                var pickDetailInList = pickDetailList.SingleOrDefault(x => x.Id == o.Id);
                var item             = regularItemsInDb.SingleOrDefault(x => x.Id == o.Id);

                item.AvailableCtns -= o.Ctns;
                item.PickingCtns   += o.Ctns;
                item.AvailablePcs  -= o.Pcs;
                item.PickingPcs    += o.Pcs;

                if (pickDetailInList == null)
                {
                    pickDetailList.Add(new PickDetail
                    {
                        Id                      = o.Id,
                        CartonRange             = item.CartonRange,
                        Container               = item.Container,
                        PurchaseOrder           = item.PurchaseOrder,
                        Style                   = item.Style,
                        Color                   = item.Color,
                        CustomerCode            = item.CustomerCode,
                        SizeBundle              = item.SizeBundle,
                        PcsBundle               = item.PcsBundle,
                        PcsPerCarton            = item.PcsPerCaron,
                        PickCtns                = o.Ctns,
                        PickPcs                 = o.Pcs,
                        Location                = item.Location,
                        PickDate                = DateTime.Now.ToString("MM/dd/yyyy"),
                        FCRegularLocationDetail = item,
                        ShipOrder               = shipOrderInDb
                    });
                }
                else
                {
                    pickDetailInList.PickPcs  += o.Pcs;
                    pickDetailInList.PickCtns += o.Ctns;
                }
            }

            context.PickDetails.AddRange(pickDetailList);
            context.SaveChanges();

            return(Mapper.Map <IEnumerable <PickDetail>, IEnumerable <PickDetailDto> >(pickDetailList));
        }
Exemple #39
0
 public void __IssueShipMovementOrders(INavigableTarget target, Speed speed) {
     var shipMoveToOrder = new ShipOrder(ShipDirective.Move, OrderSource.UnitCommand, target, speed);
     Elements.ForAll(e => (e as ShipModel).CurrentOrder = shipMoveToOrder);
 }
 private void OnContextMenuSelection() {
     int subMenuItemId = _ctxObject.selectedItem; // IMPROVE assumes all menu items have submenus
     ValueRange<int> orderKey = _subMenuOrderLookup.Keys.Single<ValueRange<int>>(subMenuItemIdRange => subMenuItemIdRange.ContainsValue(subMenuItemId));
     ShipDirective orderSelected = _subMenuOrderLookup[orderKey];
     IMortalTarget targetSelected = GetTargetSelected(orderSelected, subMenuItemId);
     D.Log("{0} selected order {1} and submenu item {2} from context menu.", Presenter.FullName, orderSelected.GetValueName(), targetSelected.FullName);
     ShipOrder order = new ShipOrder(orderSelected, OrderSource.User, targetSelected);
     Presenter.Model.CurrentOrder = order;
 }
Exemple #41
0
    IEnumerator ExecuteAttackOrder_EnterState() {
        LogEvent();

        TryBreakOrbit();

        IUnitAttackable unitAttackTgt = CurrentOrder.Target as IUnitAttackable;
        string unitAttackTgtName = unitAttackTgt.DebugName;
        if (!unitAttackTgt.IsOperational) {
            // if this occurs, it happened in the yield return null delay before EnterState execution
            D.Warn("{0} was killed before {1} could begin attack. Canceling Attack Order.", unitAttackTgtName, DebugName);
            CurrentState = ShipState.Idling;
            yield return null;
        }
        // Other unitAttackTgt condition changes (owner, relationship, infoAccess) handled by FleetCmd

        ShipCombatStance stance = Data.CombatStance;
        if (stance == ShipCombatStance.Disengage) {
            if (IsHQ) {
                D.Warn("{0} as HQ cannot have {1} of {2}. Changing to {3}.", DebugName, typeof(ShipCombatStance).Name,
                    ShipCombatStance.Disengage.GetValueName(), ShipCombatStance.Defensive.GetValueName());
                Data.CombatStance = ShipCombatStance.Defensive;
            }
            else {
                if (IsThereNeedForAFormationStationChangeTo(WithdrawPurpose.Disengage)) {
                    D.AssertDefault((int)_fsmDisengagePurpose);
                    _fsmDisengagePurpose = WithdrawPurpose.Disengage;
                    ShipOrder disengageOrder = new ShipOrder(ShipDirective.Disengage, OrderSource.Captain);
                    OverrideCurrentOrder(disengageOrder, retainSuperiorsOrder: false);
                }
                else {
                    D.Log(ShowDebugLog, "{0} is already {1}d as the current FormationStation meets that need. Canceling Attack Order.",
                        DebugName, ShipDirective.Disengage.GetValueName());
                    CurrentState = ShipState.Idling;
                }
                yield return null;
            }
        }

        if (stance == ShipCombatStance.Defensive) {
            D.Log(ShowDebugLog, "{0}'s {1} is {2}. Changing Attack order to AssumeStationAndEntrench.",
                DebugName, typeof(ShipCombatStance).Name, ShipCombatStance.Defensive.GetValueName());
            ShipOrder assumeStationAndEntrenchOrder = new ShipOrder(ShipDirective.AssumeStation, OrderSource.Captain) {
                FollowonOrder = new ShipOrder(ShipDirective.Entrench, OrderSource.Captain)
            };
            OverrideCurrentOrder(assumeStationAndEntrenchOrder, retainSuperiorsOrder: false);
            yield return null;
        }

        if (unitAttackTgt.IsColdWarAttackByAllowed(Owner)) {
            // we are not at war with the owner of this Unit as Owner must be accessible
            WeaponRangeMonitors.ForAll(wrm => wrm.ToEngageColdWarEnemies = true);
            // IMPROVE weapons will shoot at ANY ColdWar or War enemy in range, even innocent ColdWar bystanders
        }

        bool allowLogging = true;
        IShipAttackable primaryAttackTgt;
        while (unitAttackTgt.IsOperational) {
            if (TryPickPrimaryAttackTgt(unitAttackTgt, allowLogging, out primaryAttackTgt)) {
                D.Log(ShowDebugLog, "{0} picked {1} as primary attack target.", DebugName, primaryAttackTgt.DebugName);
                // target found within sensor range that it can and wants to attack
                _fsmTgt = primaryAttackTgt as IShipNavigable;

                Call(ShipState.Attacking);
                yield return null;  // reqd so Return()s here

                if (_orderFailureCause != UnitItemOrderFailureCause.None) {
                    Command.HandleOrderOutcome(CurrentOrder.Directive, this, isSuccess: false, target: primaryAttackTgt, failCause: _orderFailureCause);
                    switch (_orderFailureCause) {
                        case UnitItemOrderFailureCause.TgtUncatchable:
                            continue;   // pick another primary attack target
                        case UnitItemOrderFailureCause.UnitItemNeedsRepair:
                            InitiateRepair(retainSuperiorsOrderOnRepairCompletion: false);
                            break;
                        case UnitItemOrderFailureCause.UnitItemDeath:
                            // No Cmd notification reqd in this state. Dead state will follow
                            break;
                        case UnitItemOrderFailureCause.TgtDeath:
                        // Should not happen as Attacking does not generate a failure cause when target dies
                        case UnitItemOrderFailureCause.TgtRelationship:
                        case UnitItemOrderFailureCause.TgtUnreachable:
                        default:
                            throw new NotImplementedException(ErrorMessages.UnanticipatedSwitchValue.Inject(_orderFailureCause));
                    }
                    yield return null;
                }
                else {
                    D.Assert(!primaryAttackTgt.IsOperational);
                    Command.HandleOrderOutcome(CurrentOrder.Directive, this, isSuccess: true, target: primaryAttackTgt);
                }

                _fsmTgt = null;
                allowLogging = true;
            }
            else {
                // declined to pick first or subsequent primary target
                if (allowLogging) {
                    D.LogBold(ShowDebugLog, "{0} is staying put as it found no target it chooses to attack associated with UnitTarget {1}.",
                        DebugName, unitAttackTgt.DebugName);  // either no operational weapons or no targets in sensor range
                    allowLogging = false;
                }
            }
            yield return null;
        }
        if (IsInOrbit) {
            D.Error("{0} is in orbit around {1} after killing {2}.", DebugName, _itemBeingOrbited.DebugName, unitAttackTgtName);
        }
        CurrentState = ShipState.Idling;
    }
Exemple #42
0
 /// <summary>
 /// The Captain uses this method to issue orders.
 /// </summary>
 /// <param name="order">The order.</param>
 /// <param name="retainSuperiorsOrder">if set to <c>true</c> [retain superiors order].</param>
 /// <param name="target">The target.</param>
 /// <param name="speed">The speed.</param>
 private void OverrideCurrentOrder(ShipDirective order, bool retainSuperiorsOrder, INavigableTarget target = null, Speed speed = Speed.None) {
     // if the captain says to, and the current existing order is from his superior, then record it as a standing order
     ShipOrder standingOrder = null;
     if (retainSuperiorsOrder && CurrentOrder != null) {
         if (CurrentOrder.Source != OrderSource.ElementCaptain) {
             // the current order is from the Captain's superior so retain it
             standingOrder = CurrentOrder;
             if (IsHQElement) {
                 // the captain is overriding his superior on the flagship so declare an emergency   // HACK
                 Command.__OnHQElementEmergency();
             }
         }
         else if (CurrentOrder.StandingOrder != null) {
             // the current order is from the Captain, but there is a standing order in it so retain it
             standingOrder = CurrentOrder.StandingOrder;
         }
     }
     ShipOrder newOrder = new ShipOrder(order, OrderSource.ElementCaptain, target, speed) {
         StandingOrder = standingOrder
     };
     CurrentOrder = newOrder;
 }